diff --git a/BUILD.gn b/BUILD.gn
index 6791cf2..e0f531c 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1300,28 +1300,6 @@
   }
 }
 
-# Because of the source assignment filter, many targets end up over-filtering
-# their sources if the output directory contains a platform name. Assert that
-# this doesn't happen. http://crbug.com/548283
-template("assert_valid_out_dir") {
-  # List copied from //build/config/BUILDCONFIG.gn.
-  set_sources_assignment_filter([
-                                  "*\bandroid/*",
-                                  "*\bchromeos/*",
-                                  "*\bcocoa/*",
-                                  "*\bios/*",
-                                  "*\blinux/*",
-                                  "*\bmac/*",
-                                  "*\bposix/*",
-                                  "*\bwin/*",
-                                ])
-  not_needed([ "target_name" ])
-  sources = invoker.actual_sources
-  assert(
-      sources == invoker.actual_sources,
-      "Do not use a platform name in your output directory (found \"$root_build_dir\"). http://crbug.com/548283")
-}
-
 if (closure_compile) {
   group("webui_closure_compile") {
     testonly = true
@@ -1353,6 +1331,20 @@
   }
 }
 
-assert_valid_out_dir("_unused") {
-  actual_sources = [ "$root_build_dir/foo" ]
-}
+# Because of the source assignment filter, many targets end up over-filtering
+# their sources if the output directory contains a platform name. Assert that
+# this doesn't happen. http://crbug.com/548283
+assert(
+    filter_exclude([ "$root_build_dir/foo" ],
+                   # List copied from //build/config/BUILDCONFIG.gn.
+                   [
+                     "*\bandroid/*",
+                     "*\bchromeos/*",
+                     "*\bcocoa/*",
+                     "*\bios/*",
+                     "*\blinux/*",
+                     "*\bmac/*",
+                     "*\bposix/*",
+                     "*\bwin/*",
+                   ]) != [],
+    "Do not use a platform name in your output directory (found \"$root_build_dir\"). http://crbug.com/548283")
diff --git a/DEPS b/DEPS
index c4cabfb..d66b604 100644
--- a/DEPS
+++ b/DEPS
@@ -187,11 +187,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': '6963f58c7678be5c4ce9543724fa03081732400b',
+  'angle_revision': 'b1b6a171ee024e05d487e61f4200f83d1caf9224',
   # 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': '18daa81e3d3dd15936e201688d5914f7758d5cb0',
+  'swiftshader_revision': 'b8bae186cbec0e26de654603e401e691f87ab558',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -246,7 +246,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': '7219f4292e3e6178abd59852ccc0666a24cbbef3',
+  'devtools_frontend_revision': '4d806b9daa241aa3f21012dcfc5b11db58be3ea7',
   # 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.
@@ -863,7 +863,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '27402f3ffd344b31e04e3435e4ec820e1af3a276',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '8926292ad6bb0f18e892ba0635ec0d6ed3370313',
       'condition': 'checkout_linux',
   },
 
@@ -1239,7 +1239,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '8afa26ab1b1320e53d86cd3f39cec9cda8bf72fc',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '658be97b194052b6e2569541cfa7ae9d1764afb0',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1443,7 +1443,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '84ee597cdeae08bb26e578fc66a35bcf35f633f4',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '4b6ba7c207903cab654769160d626ab42b1b152a',
+    Var('webrtc_git') + '/src.git' + '@' + '86eb5d9703db177bfcb7c85617d4551f5f9b9490',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1518,7 +1518,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ebc56f2f561fa09172c7cf8c1bcb397e9675227a',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ef7ec269b5b5ef9d0d507e123dba3c204f6a69b2',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index 01a32a3..dd2127e 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -4,6 +4,7 @@
 
 import("//android_webview/variables.gni")
 import("//build/config/android/rules.gni")
+import("//build/config/python.gni")
 import("//device/vr/buildflags/buildflags.gni")
 import("//testing/test.gni")
 import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
@@ -20,37 +21,26 @@
 }
 
 if (public_android_sdk) {
-  group("webview_cts_tests") {
-    _py_files =
-        read_file("//android_webview/tools/run_cts.pydeps", "list lines")
+  python_library("webview_cts_tests") {
+    pydeps_file = "//android_webview/tools/run_cts.pydeps"
     deps = [ "//android_webview:system_webview_apk" ]
-
     data_deps = [
       "//build/android:logdog_wrapper_py",
       "//build/android:test_runner_py",
       "//testing/buildbot/filters:webview_cts_tests_filters",
     ]
-
-    # Filter out comments.
-    set_sources_assignment_filter([ "#*" ])
-    sources = _py_files
-
-    data = sources
-    data += [ "//android_webview/tools/cts_config/" ]
+    data = [ "//android_webview/tools/cts_config/" ]
   }
 
-  group("system_webview_wpt") {
+  python_library("system_webview_wpt") {
     testonly = true
+    pydeps_file = "//testing/scripts/run_android_wpt.pydeps"
     data_deps = [
       "//android_webview:system_webview_apk",
       "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk",
       "//chrome/test/chromedriver:chromedriver($host_toolchain)",
     ]
-    set_sources_assignment_filter([ "#*" ])
-    sources =
-        read_file("//testing/scripts/run_android_wpt.pydeps", "list lines")
-    data = sources
-    data += [ "//third_party/blink/web_tests/external/" ]
+    data = [ "//third_party/blink/web_tests/external/" ]
   }
 }
 
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
index d306475..a3602e2 100644
--- a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
+++ b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
@@ -62,13 +62,12 @@
 
 # permissions API (crbug.com/490120), presentation API (crbug.com/521319),
 # share API (crbug.com/765923), custom scheme handlers (crbug.com/589502),
-# media session API (crbug.com/925997), sms API (crbug.com/963653), and WebXr
-# API (crbug.com/1012899) are not supported in webview.
+# media session API (crbug.com/925997), and WebXr API (crbug.com/1012899)
+# are not supported in webview.
 interface Navigator
     getter mediaSession                # crbug.com/925997
     getter permissions                 # crbug.com/490120
     getter presentation                # crbug.com/521319
-    getter sms                         # crbug.com/963653
     getter xr                          # crbug.com/1012899
     method registerProtocolHandler     # crbug.com/589502
     method unregisterProtocolHandler   # crbug.com/589502
@@ -78,10 +77,6 @@
 interface MediaMetadata
 interface MediaSession
 
-# SMS API is disabled in Android WebView, (crbug.com/963653)
-interface SMS
-interface SMSReceiver
-
 # notifications not yet supported in webview, crbug.com/551446
 interface ServiceWorkerRegistration : EventTarget
     getter pushManager
diff --git a/ash/accelerators/accelerator_confirmation_dialog.cc b/ash/accelerators/accelerator_confirmation_dialog.cc
index 14310a1c..06441bc 100644
--- a/ash/accelerators/accelerator_confirmation_dialog.cc
+++ b/ash/accelerators/accelerator_confirmation_dialog.cc
@@ -28,10 +28,10 @@
     base::OnceClosure on_accept_callback,
     base::OnceClosure on_cancel_callback)
     : window_title_(l10n_util::GetStringUTF16(window_title_text_id)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ASH_CONTINUE_BUTTON));
-  DialogDelegate::set_accept_callback(std::move(on_accept_callback));
-  DialogDelegate::set_cancel_callback(std::move(on_cancel_callback));
+  DialogDelegate::SetAcceptCallback(std::move(on_accept_callback));
+  DialogDelegate::SetCancelCallback(std::move(on_cancel_callback));
 
   SetLayoutManager(std::make_unique<views::FillLayout>());
   SetBorder(views::CreateEmptyBorder(
diff --git a/ash/app_list/views/remove_query_confirmation_dialog.cc b/ash/app_list/views/remove_query_confirmation_dialog.cc
index 235c42c..3a9c3082 100644
--- a/ash/app_list/views/remove_query_confirmation_dialog.cc
+++ b/ash/app_list/views/remove_query_confirmation_dialog.cc
@@ -29,18 +29,18 @@
     : confirm_callback_(std::move(confirm_callback)),
       event_flags_(event_flags),
       contents_view_(contents_view) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_REMOVE_SUGGESTION_BUTTON_LABEL));
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    l10n_util::GetStringUTF16(IDS_APP_CANCEL));
 
   auto run_callback = [](RemoveQueryConfirmationDialog* dialog, bool accept) {
     std::move(dialog->confirm_callback_).Run(accept, dialog->event_flags_);
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(run_callback, base::Unretained(this), true));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(run_callback, base::Unretained(this), false));
 
   const views::LayoutProvider* provider = views::LayoutProvider::Get();
diff --git a/ash/display/display_change_dialog.cc b/ash/display/display_change_dialog.cc
index 1dcdf81..866f33f4c 100644
--- a/ash/display/display_change_dialog.cc
+++ b/ash/display/display_change_dialog.cc
@@ -41,12 +41,12 @@
           std::move(timeout_message_with_placeholder)),
       on_accept_callback_(std::move(on_accept_callback)),
       on_cancel_callback_(std::move(on_cancel_callback)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ASH_CONFIRM_BUTTON));
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &DisplayChangeDialog::OnConfirmButtonClicked, base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &DisplayChangeDialog::OnCancelButtonClicked, base::Unretained(this)));
 
   SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/ash/ime/ime_mode_indicator_view.cc b/ash/ime/ime_mode_indicator_view.cc
index 30d3ff3a..9b5405d9 100644
--- a/ash/ime/ime_mode_indicator_view.cc
+++ b/ash/ime/ime_mode_indicator_view.cc
@@ -49,7 +49,7 @@
 ImeModeIndicatorView::ImeModeIndicatorView(const gfx::Rect& cursor_bounds,
                                            const base::string16& label)
     : cursor_bounds_(cursor_bounds), label_view_(new views::Label(label)) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   SetCanActivate(false);
   set_accept_events(false);
   set_shadow(views::BubbleBorder::BIG_SHADOW);
diff --git a/ash/login/ui/public_account_warning_dialog.cc b/ash/login/ui/public_account_warning_dialog.cc
index 6957d2a..f27ee8ca 100644
--- a/ash/login/ui/public_account_warning_dialog.cc
+++ b/ash/login/ui/public_account_warning_dialog.cc
@@ -62,7 +62,7 @@
 PublicAccountWarningDialog::PublicAccountWarningDialog(
     base::WeakPtr<LoginExpandedPublicAccountView> controller)
     : controller_(controller) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kVertical, gfx::Insets(),
       kBetweenLabelPaddingDp));
diff --git a/ash/session/multiprofiles_intro_dialog.cc b/ash/session/multiprofiles_intro_dialog.cc
index 1d57fb4..d41216c 100644
--- a/ash/session/multiprofiles_intro_dialog.cc
+++ b/ash/session/multiprofiles_intro_dialog.cc
@@ -60,13 +60,13 @@
           l10n_util::GetStringUTF16(IDS_ASH_DIALOG_DONT_SHOW_AGAIN))),
       on_accept_(std::move(on_accept)) {
   never_show_again_checkbox_->SetChecked(true);
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       [](MultiprofilesIntroDialog* dialog) {
         std::move(dialog->on_accept_)
             .Run(true, dialog->never_show_again_checkbox_->GetChecked());
       },
       base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       [](MultiprofilesIntroDialog* dialog) {
         std::move(dialog->on_accept_).Run(false, false);
       },
diff --git a/ash/session/session_aborted_dialog.cc b/ash/session/session_aborted_dialog.cc
index bce1fdb5..21cad84 100644
--- a/ash/session/session_aborted_dialog.cc
+++ b/ash/session/session_aborted_dialog.cc
@@ -69,12 +69,12 @@
 }
 
 SessionAbortedDialog::SessionAbortedDialog() {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_ASH_MULTIPROFILES_SESSION_ABORT_BUTTON_LABEL));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       []() { Shell::Get()->session_controller()->RequestSignOut(); }));
 }
 
diff --git a/ash/session/teleport_warning_dialog.cc b/ash/session/teleport_warning_dialog.cc
index 33b14f3..d6a9874 100644
--- a/ash/session/teleport_warning_dialog.cc
+++ b/ash/session/teleport_warning_dialog.cc
@@ -30,13 +30,13 @@
           l10n_util::GetStringUTF16(IDS_ASH_DIALOG_DONT_SHOW_AGAIN))),
       on_accept_(std::move(callback)) {
   never_show_again_checkbox_->SetChecked(true);
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       [](TeleportWarningDialog* dialog) {
         std::move(dialog->on_accept_)
             .Run(true, dialog->never_show_again_checkbox_->GetChecked());
       },
       base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       [](TeleportWarningDialog* dialog) {
         std::move(dialog->on_accept_).Run(false, false);
       },
diff --git a/ash/shelf/contextual_nudge.cc b/ash/shelf/contextual_nudge.cc
index a989145..c836a17e 100644
--- a/ash/shelf/contextual_nudge.cc
+++ b/ash/shelf/contextual_nudge.cc
@@ -55,7 +55,7 @@
   SetCanActivate(false);
   set_adjust_if_offscreen(false);
   set_shadow(views::BubbleBorder::NO_ASSETS);
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   if (parent_window) {
     set_parent_window(parent_window);
diff --git a/ash/shelf/shelf_bubble.cc b/ash/shelf/shelf_bubble.cc
index 3c03621..a8e099f 100644
--- a/ash/shelf/shelf_bubble.cc
+++ b/ash/shelf/shelf_bubble.cc
@@ -36,7 +36,7 @@
           /* Don't pass the Shelf so the translucent color is always used. */
           nullptr,
           Shell::Get()->wallpaper_controller()) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   background_animator_.Init(ShelfBackgroundType::kDefaultBg);
   background_animator_.AddObserver(this);
 
diff --git a/ash/system/accessibility/accessibility_feature_disable_dialog.cc b/ash/system/accessibility/accessibility_feature_disable_dialog.cc
index ad58699..4a01201 100644
--- a/ash/system/accessibility/accessibility_feature_disable_dialog.cc
+++ b/ash/system/accessibility/accessibility_feature_disable_dialog.cc
@@ -27,10 +27,10 @@
     base::OnceClosure on_accept_callback,
     base::OnceClosure on_cancel_callback)
     : window_title_(l10n_util::GetStringUTF16(window_title_text_id)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_ASH_YES_BUTTON));
-  DialogDelegate::set_accept_callback(std::move(on_accept_callback));
-  DialogDelegate::set_cancel_callback(std::move(on_cancel_callback));
+  DialogDelegate::SetAcceptCallback(std::move(on_accept_callback));
+  DialogDelegate::SetCancelCallback(std::move(on_cancel_callback));
 
   SetLayoutManager(std::make_unique<views::FillLayout>());
   SetBorder(views::CreateEmptyBorder(
diff --git a/ash/system/network/network_state_list_detailed_view.cc b/ash/system/network/network_state_list_detailed_view.cc
index 5a19c3be..b01f534 100644
--- a/ash/system/network/network_state_list_detailed_view.cc
+++ b/ash/system/network/network_state_list_detailed_view.cc
@@ -110,7 +110,7 @@
              NetworkStateListDetailedView* detailed_view)
       : views::BubbleDialogDelegateView(anchor, views::BubbleBorder::TOP_RIGHT),
         detailed_view_(detailed_view) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
     set_margins(gfx::Insets(kBubbleMargin));
     SetArrow(views::BubbleBorder::NONE);
     set_shadow(views::BubbleBorder::NO_ASSETS);
diff --git a/ash/system/palette/palette_welcome_bubble.cc b/ash/system/palette/palette_welcome_bubble.cc
index cb3b622e..15d5752 100644
--- a/ash/system/palette/palette_welcome_bubble.cc
+++ b/ash/system/palette/palette_welcome_bubble.cc
@@ -36,7 +36,7 @@
  public:
   WelcomeBubbleView(views::View* anchor, views::BubbleBorder::Arrow arrow)
       : views::BubbleDialogDelegateView(anchor, arrow) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
     set_close_on_deactivate(true);
     SetCanActivate(false);
     set_accept_events(true);
diff --git a/ash/system/screen_security/screen_switch_check_controller.cc b/ash/system/screen_security/screen_switch_check_controller.cc
index 6698bd9..fab309d 100644
--- a/ash/system/screen_security/screen_switch_check_controller.cc
+++ b/ash/system/screen_security/screen_switch_check_controller.cc
@@ -26,12 +26,12 @@
     AddChildView(new views::MessageBoxView(views::MessageBoxView::InitParams(
         l10n_util::GetStringUTF16(IDS_DESKTOP_CASTING_ACTIVE_MESSAGE))));
     SetLayoutManager(std::make_unique<views::FillLayout>());
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_OK,
         l10n_util::GetStringUTF16(IDS_DESKTOP_CASTING_ACTIVE_CONTINUE));
-    DialogDelegate::set_accept_callback(base::BindOnce(
+    DialogDelegate::SetAcceptCallback(base::BindOnce(
         &CancelCastingDialog::OnDialogAccepted, base::Unretained(this)));
-    DialogDelegate::set_cancel_callback(base::BindOnce(
+    DialogDelegate::SetCancelCallback(base::BindOnce(
         &CancelCastingDialog::OnDialogCancelled, base::Unretained(this)));
   }
   ~CancelCastingDialog() override = default;
diff --git a/ash/system/session/logout_confirmation_dialog.cc b/ash/system/session/logout_confirmation_dialog.cc
index f29e2ba..e06f189 100644
--- a/ash/system/session/logout_confirmation_dialog.cc
+++ b/ash/system/session/logout_confirmation_dialog.cc
@@ -37,10 +37,10 @@
     LogoutConfirmationController* controller,
     base::TimeTicks logout_time)
     : controller_(controller), logout_time_(logout_time) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_ASH_LOGOUT_CONFIRMATION_BUTTON));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &LogoutConfirmationDialog::OnDialogAccepted, base::Unretained(this)));
 
   SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/ash/system/session/shutdown_confirmation_dialog.cc b/ash/system/session/shutdown_confirmation_dialog.cc
index 902eadd49..a3085c2 100644
--- a/ash/system/session/shutdown_confirmation_dialog.cc
+++ b/ash/system/session/shutdown_confirmation_dialog.cc
@@ -34,14 +34,14 @@
     base::OnceClosure on_accept_callback,
     base::OnceClosure on_cancel_callback)
     : window_title_(l10n_util::GetStringUTF16(window_title_text_id)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_ASH_SHUTDOWN_CONFIRMATION_OK_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_ASH_SHUTDOWN_CONFIRMATION_CANCEL_BUTTON));
-  DialogDelegate::set_accept_callback(std::move(on_accept_callback));
-  DialogDelegate::set_cancel_callback(std::move(on_cancel_callback));
+  DialogDelegate::SetAcceptCallback(std::move(on_accept_callback));
+  DialogDelegate::SetCancelCallback(std::move(on_cancel_callback));
   SetLayoutManager(std::make_unique<views::FillLayout>());
   SetBorder(views::CreateEmptyBorder(
       views::LayoutProvider::Get()->GetDialogInsetsForContentType(
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc
index 07ced94..48ea206 100644
--- a/ash/system/tray/tray_bubble_view.cc
+++ b/ash/system/tray/tray_bubble_view.cc
@@ -225,7 +225,7 @@
       owned_bubble_border_(bubble_border_),
       is_gesture_dragging_(false),
       mouse_actively_entered_(false) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DCHECK(delegate_);
   DCHECK(params_.parent_window);
   // anchor_widget() is computed by BubbleDialogDelegateView().
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 384ce89..16691065 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -344,6 +344,8 @@
     "memory/shared_memory_hooks.h",
     "memory/shared_memory_mapping.cc",
     "memory/shared_memory_mapping.h",
+    "memory/shared_memory_security_policy.cc",
+    "memory/shared_memory_security_policy.h",
     "memory/shared_memory_tracker.cc",
     "memory/shared_memory_tracker.h",
     "memory/singleton.h",
diff --git a/base/android/linker/BUILD.gn b/base/android/linker/BUILD.gn
index 5186f7c9..14efe73 100644
--- a/base/android/linker/BUILD.gn
+++ b/base/android/linker/BUILD.gn
@@ -32,6 +32,11 @@
   # Disable coverage to avoid linker issue.
   configs -= [ "//build/config/coverage:default_coverage" ]
 
+  # Disable orderfile instrumentation. Code in this target is in a different
+  # .so, cannot call unexported instrumentation functions from another one (link
+  # time error).
+  configs -= [ "//build/config/android:default_orderfile_instrumentation" ]
+
   # Avoid linking libc++ and support libraries, to avoid 100 kiB of
   # un-necessary code.
   no_default_deps = true
diff --git a/base/memory/platform_shared_memory_region.cc b/base/memory/platform_shared_memory_region.cc
index 45647925..944b12c 100644
--- a/base/memory/platform_shared_memory_region.cc
+++ b/base/memory/platform_shared_memory_region.cc
@@ -5,11 +5,21 @@
 #include "base/memory/platform_shared_memory_region.h"
 
 #include "base/memory/shared_memory_mapping.h"
+#include "base/memory/shared_memory_security_policy.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/numerics/checked_math.h"
 
 namespace base {
 namespace subtle {
 
+namespace {
+
+void RecordMappingWasBlockedHistogram(bool blocked) {
+  base::UmaHistogramBoolean("SharedMemory.MapBlockedForSecurity", blocked);
+}
+
+}  // namespace
+
 // static
 PlatformSharedMemoryRegion PlatformSharedMemoryRegion::CreateWritable(
     size_t size) {
@@ -49,10 +59,19 @@
     return false;
   }
 
+  if (!SharedMemorySecurityPolicy::AcquireReservationForMapping(size)) {
+    RecordMappingWasBlockedHistogram(/*blocked=*/true);
+    return false;
+  } else {
+    RecordMappingWasBlockedHistogram(/*blocked=*/false);
+  }
+
   bool success = MapAtInternal(offset, size, memory, mapped_size);
   if (success) {
     DCHECK_EQ(
         0U, reinterpret_cast<uintptr_t>(*memory) & (kMapMinimumAlignment - 1));
+  } else {
+    SharedMemorySecurityPolicy::ReleaseReservationForMapping(size);
   }
 
   return success;
diff --git a/base/memory/shared_memory_hooks.h b/base/memory/shared_memory_hooks.h
index a7e401e..4404b54c 100644
--- a/base/memory/shared_memory_hooks.h
+++ b/base/memory/shared_memory_hooks.h
@@ -9,6 +9,13 @@
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/memory/writable_shared_memory_region.h"
 
+namespace service_manager {
+
+struct MainParams;
+int Main(const MainParams&);
+
+}  // namespace service_manager
+
 namespace base {
 
 class SharedMemoryHooks {
@@ -17,6 +24,7 @@
 
  private:
   friend class SharedMemoryHooksTest;
+  friend int service_manager::Main(const service_manager::MainParams&);
 
   // Allows shared memory region creation to be hooked. Useful for sandboxed
   // processes that are restricted from invoking the platform APIs directly.
diff --git a/base/memory/shared_memory_mapping.cc b/base/memory/shared_memory_mapping.cc
index 0c9c0f8a1..c475d00 100644
--- a/base/memory/shared_memory_mapping.cc
+++ b/base/memory/shared_memory_mapping.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "base/memory/shared_memory_security_policy.h"
 #include "base/memory/shared_memory_tracker.h"
 #include "base/unguessable_token.h"
 #include "build/build_config.h"
@@ -65,6 +66,7 @@
   if (!IsValid())
     return;
 
+  SharedMemorySecurityPolicy::ReleaseReservationForMapping(size_);
   SharedMemoryTracker::GetInstance()->DecrementMemoryUsage(*this);
 #if defined(OS_WIN)
   if (!UnmapViewOfFile(memory_))
diff --git a/base/memory/shared_memory_mapping_unittest.cc b/base/memory/shared_memory_mapping_unittest.cc
index 52cd294..b710d978 100644
--- a/base/memory/shared_memory_mapping_unittest.cc
+++ b/base/memory/shared_memory_mapping_unittest.cc
@@ -11,6 +11,10 @@
 
 #include "base/containers/span.h"
 #include "base/memory/read_only_shared_memory_region.h"
+#include "base/memory/writable_shared_memory_region.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "build/build_config.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
@@ -143,4 +147,27 @@
                   .empty());
 }
 
+TEST_F(SharedMemoryMappingTest, TotalMappedSizeLimit) {
+  // Nothing interesting to test if the address space isn't 64 bits, since
+  // there's no real limit enforced on 32 bits other than complete address
+  // space exhaustion.
+  // Also exclude NaCl since pointers are 32 bits on all architectures:
+  // https://bugs.chromium.org/p/nativeclient/issues/detail?id=1162
+#if defined(ARCH_CPU_64_BITS) && !defined(OS_NACL)
+  base::HistogramTester histogram_tester;
+  auto region = WritableSharedMemoryRegion::Create(1024 * 1024 * 1024);
+  // The limit is 32GB of mappings on 64-bit platforms, so the final mapping
+  // should fail.
+  std::vector<WritableSharedMemoryMapping> mappings(32);
+  for (size_t i = 0; i < mappings.size(); ++i) {
+    auto& mapping = mappings[i];
+    mapping = region.Map();
+    DCHECK_EQ(&mapping != &mappings.back(), mapping.IsValid());
+  }
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples("SharedMemory.MapBlockedForSecurity"),
+      ::testing::ElementsAre(Bucket(0, 31), Bucket(1, 1)));
+#endif  // defined(ARCH_CPU_64_BITS)
+}
+
 }  // namespace base
diff --git a/base/memory/shared_memory_security_policy.cc b/base/memory/shared_memory_security_policy.cc
new file mode 100644
index 0000000..df54018
--- /dev/null
+++ b/base/memory/shared_memory_security_policy.cc
@@ -0,0 +1,92 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/memory/shared_memory_security_policy.h"
+
+#include <algorithm>
+#include <atomic>
+
+#include "base/bits.h"
+#include "base/numerics/checked_math.h"
+#include "base/optional.h"
+#include "base/process/process_metrics.h"
+#include "build/build_config.h"
+
+namespace base {
+
+namespace {
+
+// Note: pointers are 32 bits on all architectures in NaCl. See
+// https://bugs.chromium.org/p/nativeclient/issues/detail?id=1162
+#if defined(ARCH_CPU_32_BITS) || defined(OS_NACL)
+// No effective limit on 32-bit, since there simply isn't enough address space
+// for ASLR to be particularly effective.
+constexpr size_t kTotalMappedSizeLimit = -1;
+#elif defined(ARCH_CPU_64_BITS)
+// 32 GB of mappings ought to be enough for anybody.
+constexpr size_t kTotalMappedSizeLimit = 32ULL * 1024 * 1024 * 1024;
+#endif
+
+static std::atomic_size_t total_mapped_size_;
+
+base::Optional<size_t> AlignWithPageSize(size_t size) {
+#if defined(OS_WIN)
+  // TODO(crbug.com/210609): Matches alignment requirements defined in
+  // platform_shared_memory_region_win.cc:PlatformSharedMemoryRegion::Create.
+  // Remove this when NaCl is gone.
+  static const size_t kSectionSize = 65536;
+  const size_t page_size = std::max(kSectionSize, GetPageSize());
+#else
+  const size_t page_size = GetPageSize();
+#endif  // defined(OS_WIN)
+  size_t rounded_size = bits::Align(size, page_size);
+
+  // Fail on overflow.
+  if (rounded_size < size)
+    return base::nullopt;
+
+  return rounded_size;
+}
+
+}  // namespace
+
+// static
+bool SharedMemorySecurityPolicy::AcquireReservationForMapping(size_t size) {
+  size_t previous_mapped_size =
+      total_mapped_size_.load(std::memory_order_relaxed);
+  size_t total_mapped_size;
+
+  base::Optional<size_t> page_aligned_size = AlignWithPageSize(size);
+
+  if (!page_aligned_size)
+    return false;
+
+  // Relaxed memory ordering is all that's needed since all atomicity is all
+  // that's required. If the value is stale, compare_exchange_weak() will fail
+  // and the loop will retry the operation with an updated total mapped size.
+  do {
+    if (!CheckAdd(previous_mapped_size, *page_aligned_size)
+             .AssignIfValid(&total_mapped_size)) {
+      return false;
+    }
+    if (total_mapped_size >= kTotalMappedSizeLimit)
+      return false;
+  } while (!total_mapped_size_.compare_exchange_weak(
+      previous_mapped_size, total_mapped_size, std::memory_order_relaxed,
+      std::memory_order_relaxed));
+
+  return true;
+}
+
+// static
+void SharedMemorySecurityPolicy::ReleaseReservationForMapping(size_t size) {
+  // Note #1: relaxed memory ordering is sufficient since atomicity is all
+  // that's required.
+  // Note #2: |size| should never overflow when aligned to page size, since
+  // this should only be called if |AcquireReservationForMapping()| returned
+  // true.
+  total_mapped_size_.fetch_sub(size, std::memory_order_relaxed);
+}
+
+}  // namespace base
diff --git a/base/memory/shared_memory_security_policy.h b/base/memory/shared_memory_security_policy.h
new file mode 100644
index 0000000..bf356bb
--- /dev/null
+++ b/base/memory/shared_memory_security_policy.h
@@ -0,0 +1,37 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_
+#define BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_
+
+#include <stddef.h>
+
+#include "base/compiler_specific.h"
+
+namespace base {
+
+namespace subtle {
+class PlatformSharedMemoryRegion;
+}  // namespace subtle
+
+// Helper to enforce a limit for the total amount of shared memory that can be
+// mapped. This can help prevent an attacker from spraying the address space of
+// a process with shared memory mappings to bypass ASLR. For more details, see
+// https://googleprojectzero.blogspot.com/2019/04/virtually-unlimited-memory-escaping.html
+class SharedMemorySecurityPolicy {
+ private:
+  friend class subtle::PlatformSharedMemoryRegion;
+  friend class SharedMemoryMapping;
+
+  // Checks that a mapping with |size| can be created. Returns false if there is
+  // an overflow in internal calculations, or the max limit has been reached.
+  static bool AcquireReservationForMapping(size_t size) WARN_UNUSED_RESULT;
+
+  // Releases a reservation that was previously acquired.
+  static void ReleaseReservationForMapping(size_t size);
+};
+
+}  // namespace base
+
+#endif  // BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_
diff --git a/build/.gitignore b/build/.gitignore
index 33a4e19..d020852 100644
--- a/build/.gitignore
+++ b/build/.gitignore
@@ -22,6 +22,5 @@
 /linux/ubuntu_*-sysroot/
 /ios_files
 /mac_files
-/xcode_links
 
 !/util/LASTCHANGE.dummy
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 32492da..2f32362 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -114,20 +114,13 @@
   if (_type != "android_apk" && _type != "java_binary" && _type != "dist_jar" &&
       _type != "java_annotation_processor" && _type != "dist_aar" &&
       _type != "android_app_bundle") {
-    set_sources_assignment_filter(_java_target_whitelist)
     _parent_invoker = invoker.invoker
     _target_label =
         get_label_info(":${_parent_invoker.target_name}", "label_no_toolchain")
-    sources = [ _target_label ]
-    if (sources != []) {
-      set_sources_assignment_filter(_java_target_blacklist)
-      sources = []
-      sources = [ _target_label ]
-      if (sources != []) {
-        assert(false, "Invalid java target name: $_target_label")
-      }
+    if (filter_exclude([ _target_label ], _java_target_whitelist) != [] &&
+        filter_exclude([ _target_label ], _java_target_blacklist) != []) {
+      assert(false, "Invalid java target name: $_target_label")
     }
-    sources = []
   }
 
   action_with_pydeps(target_name) {
@@ -151,23 +144,16 @@
     _deps_configs = []
     if (defined(invoker.possible_config_deps)) {
       foreach(_possible_dep, invoker.possible_config_deps) {
-        set_sources_assignment_filter(_java_target_whitelist)
         _target_label = get_label_info(_possible_dep, "label_no_toolchain")
-        sources = [ _target_label ]
-        if (sources == []) {
-          set_sources_assignment_filter(_java_target_blacklist)
-          sources = []
-          sources = [ _target_label ]
-          if (sources != []) {
-            # Put the bug number in the target name so that false-positives
-            # have a hint in the error message about non-existent dependencies.
-            deps += [ "$_target_label$build_config_target_suffix" ]
-            _dep_gen_dir = get_label_info(_possible_dep, "target_gen_dir")
-            _dep_name = get_label_info(_possible_dep, "name")
-            _deps_configs += [ "$_dep_gen_dir/$_dep_name.build_config" ]
-          }
+        if (filter_exclude([ _target_label ], _java_target_whitelist) == [] &&
+            filter_exclude([ _target_label ], _java_target_blacklist) != []) {
+          # Put the bug number in the target name so that false-positives
+          # have a hint in the error message about non-existent dependencies.
+          deps += [ "$_target_label$build_config_target_suffix" ]
+          _dep_gen_dir = get_label_info(_possible_dep, "target_gen_dir")
+          _dep_name = get_label_info(_possible_dep, "name")
+          _deps_configs += [ "$_dep_gen_dir/$_dep_name.build_config" ]
         }
-        sources = []
       }
     }
     _rebased_deps_configs = rebase_path(_deps_configs, root_build_dir)
@@ -3154,17 +3140,14 @@
       _chromium_code = invoker.chromium_code
     } else {
       # Default based on whether target is in third_party.
-      set_sources_assignment_filter([ "*\bthird_party\b*" ])
-      sources = [ get_label_info(":$_main_target_name", "dir") ]
-      _chromium_code = sources != []
+      _chromium_code =
+          filter_exclude([ get_label_info(":$_main_target_name", "dir") ],
+                         [ "*\bthird_party\b*" ]) != []
       if (!_chromium_code && !_is_prebuilt && _java_files != []) {
         # Unless third_party code has an org.chromium file in it.
-        set_sources_assignment_filter([ "*\bchromium\b*" ])
-        sources = _java_files
-        _chromium_code = _java_files != sources
+        _chromium_code =
+            filter_exclude(_java_files, [ "*\bchromium\b*" ]) != _java_files
       }
-      set_sources_assignment_filter([])
-      sources = []
     }
 
     if (defined(_final_jar_path)) {
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index d0d63d2..64938a5 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1188,9 +1188,8 @@
 
       # This needs to get outputs from grit's internal target, not the final
       # source_set.
-      set_sources_assignment_filter([ "*.stamp" ])
-      sources = get_target_outputs(":${_grit_target_name}_grit")
-      inputs = sources
+      inputs = filter_exclude(get_target_outputs(":${_grit_target_name}_grit"),
+                              [ "*.stamp" ])
       output = _resources_zip
       deps = [ ":$_grit_target_name" ]
     }
diff --git a/build/config/compiler/pgo/BUILD.gn b/build/config/compiler/pgo/BUILD.gn
index 29d434a..dd794c9 100644
--- a/build/config/compiler/pgo/BUILD.gn
+++ b/build/config/compiler/pgo/BUILD.gn
@@ -13,8 +13,7 @@
 
   # Only add flags when chrome_pgo_phase == 1, so that variables we would use
   # are not required to be defined when we're not actually using PGO.
-  if (chrome_pgo_phase == 1 && is_clang && use_lld && !is_nacl &&
-      is_a_target_toolchain) {
+  if (chrome_pgo_phase == 1 && is_clang && !is_nacl && is_a_target_toolchain) {
     cflags = [ "-fprofile-instr-generate" ]
     if (!is_win) {
       # Windows directly calls link.exe instead of the compiler driver when
diff --git a/build/config/ios/ios_sdk.gni b/build/config/ios/ios_sdk.gni
index b03360eb..b42ef65 100644
--- a/build/config/ios/ios_sdk.gni
+++ b/build/config/ios/ios_sdk.gni
@@ -106,7 +106,10 @@
     ]
   }
   if (ios_use_goma_rbe) {
-    ios_sdk_info_args += [ "--create_symlink_under_src" ]
+    ios_sdk_info_args += [
+      "--create_symlink_at",
+      rebase_path("$root_build_dir/sdk/xcode_links", "//"),
+    ]
   }
   script_name = "//build/config/mac/sdk_info.py"
   _ios_sdk_result = exec_script(script_name, ios_sdk_info_args, "scope")
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni
index d290187..8eb865d 100644
--- a/build/config/mac/mac_sdk.gni
+++ b/build/config/mac/mac_sdk.gni
@@ -92,8 +92,9 @@
 # put system xcode under src to avoid absolute path.
 if (use_system_xcode && ios_use_goma_rbe) {
   sdk_info_args += [
-    "--create_symlink_under_src",
     "--get_sdk_info",
+    "--create_symlink_at",
+    rebase_path("$root_build_dir/sdk/xcode_links", "//"),
   ]
 }
 sdk_info_args += [ mac_sdk_name ]
diff --git a/build/config/mac/sdk_info.py b/build/config/mac/sdk_info.py
index 65abd7f..35c439e 100644
--- a/build/config/mac/sdk_info.py
+++ b/build/config/mac/sdk_info.py
@@ -108,35 +108,42 @@
     settings['sdk_build'] = settings['sdk_version']
 
 
-def CreateXcodeSymlinkUnderChromiumSource(src):
-  """Create symlink to Xcode directory under Chromium source."""
+def CreateXcodeSymlinkAt(src, dst):
+  """Create symlink to Xcode directory at target location."""
 
-  if not os.path.isdir(XCODE_LINK_DIR):
-    os.makedirs(XCODE_LINK_DIR)
+  if not os.path.isdir(dst):
+    os.makedirs(dst)
 
-  dst = os.path.join(XCODE_LINK_DIR, os.path.basename(src))
-  # Update the symlink if exist.
+  dst = os.path.join(dst, os.path.basename(src))
+  updated_value = '//' + os.path.relpath(dst, ROOT_SRC_DIR)
+
+  # Update the symlink only if it is different from the current destination.
   if os.path.islink(dst):
+    current_src = os.readlink(dst)
+    if current_src == src:
+      return updated_value
     os.unlink(dst)
+    sys.stderr.write('existing symlink %s points %s; want %s. Removed.' %
+                     (dst, current_src, src))
   os.symlink(src, dst)
-
-  return '//' + os.path.relpath(dst, ROOT_SRC_DIR)
+  return updated_value
 
 
 if __name__ == '__main__':
   doctest.testmod()
 
   parser = argparse.ArgumentParser()
-  parser.add_argument("--developer_dir", required=False)
+  parser.add_argument("--developer_dir", dest="developer_dir", required=False)
   parser.add_argument("--get_sdk_info",
                     action="store_true", dest="get_sdk_info", default=False,
                     help="Returns SDK info in addition to xcode/machine info.")
-  parser.add_argument("--create_symlink_under_src",
-                      action="store_true", dest="create_symlink_under_src",
-                      default=False,
-                      help="Create symlink of SDK under Chromium source "
-                      "and returns the symlinked paths as SDK info instead "
-                      "of the original location.")
+  parser.add_argument(
+      "--create_symlink_at",
+      action="store",
+      dest="create_symlink_at",
+      help="Create symlink of SDK at given location and "
+      "returns the symlinked paths as SDK info instead "
+      "of the original location.")
   args, unknownargs = parser.parse_known_args()
   if args.developer_dir:
     os.environ['DEVELOPER_DIR'] = args.developer_dir
@@ -155,8 +162,8 @@
 
   for key in sorted(settings):
     value = settings[key]
-    if args.create_symlink_under_src and '_path' in key:
-      value = CreateXcodeSymlinkUnderChromiumSource(value)
+    if args.create_symlink_at and '_path' in key:
+      value = CreateXcodeSymlinkAt(value, args.create_symlink_at)
     if isinstance(value, str):
       value = '"%s"' % value
     print('%s=%s' % (key, value))
diff --git a/build/config/python.gni b/build/config/python.gni
index 0fb8bd4..79dcc6e 100644
--- a/build/config/python.gni
+++ b/build/config/python.gni
@@ -41,21 +41,19 @@
                            ])
 
     if (defined(invoker.pydeps_file)) {
-      _py_files = read_file(invoker.pydeps_file, "list lines")
-
-      # Filter out comments.
-      set_sources_assignment_filter([ "#*" ])
-      sources = _py_files
+      # Read and filter out comments.
+      _pydeps_lines = read_file(invoker.pydeps_file, "list lines")
+      _pydeps_entries = filter_exclude(_pydeps_lines, [ "#*" ])
 
       # Dependencies are listed relative to the pydeps file directory, but data
       # parameter expects paths that are relative to the current BUILD.gn
       _script_dir = get_path_info(invoker.pydeps_file, "dir")
-      _rebased_py_files = rebase_path(sources, ".", _script_dir)
+      _rebased_pydeps_entries = rebase_path(_pydeps_entries, ".", _script_dir)
 
       # Even though the .pydep file is not used at runtime, it must be added
       # so that "gn analyze" will mark the target as changed when .py files
       # are removed but none are added or modified.
-      data = _rebased_py_files + [ invoker.pydeps_file ]
+      data = _rebased_pydeps_entries + [ invoker.pydeps_file ]
     } else {
       data = []
     }
@@ -83,18 +81,6 @@
 #     args = [...]
 #   }
 template("action_with_pydeps") {
-  # Read the .pydeps file now. Note that this is done everytime this
-  # template is called, but benchmarking doesn't show any impact on overall
-  # 'gn gen' speed anyway.
-  _pydeps_file = invoker.script + "deps"
-  _pydeps_raw = read_file(_pydeps_file, "list lines")
-
-  # Filter out comments.
-  set_sources_assignment_filter([ "#*" ])
-  sources = _pydeps_raw
-  _pydeps = sources
-  sources = []
-
   action(target_name) {
     # Forward all variables. Ensure that testonly and visibility are forwarded
     # explicitly, since this performs recursive scope lookups, which is
@@ -113,6 +99,13 @@
                              "visibility",
                            ])
 
+    # Read and filter out comments.
+    # Happens every time the template is instantiated, but benchmarking shows no
+    # perceivable impact on overall 'gn gen' speed.
+    _pydeps_file = invoker.script + "deps"
+    _pydeps_lines = read_file(_pydeps_file, "list lines")
+    _pydeps_entries = filter_exclude(_pydeps_lines, [ "#*" ])
+
     if (!defined(inputs)) {
       inputs = []
     }
@@ -120,26 +113,11 @@
     # Dependencies are listed relative to the script directory, but inputs
     # expects paths that are relative to the current BUILD.gn
     _script_dir = get_path_info(_pydeps_file, "dir")
-    inputs += rebase_path(_pydeps, ".", _script_dir)
+    inputs += rebase_path(_pydeps_entries, ".", _script_dir)
   }
 }
 
 template("action_foreach_with_pydeps") {
-  _pydeps_file = invoker.script + "deps"
-  _pydeps_raw = read_file(_pydeps_file, "list lines")
-
-  # Filter out comments.
-  # This is a bit convoluted to preserve the value of sources if defined.
-  _old_sources = []
-  if (defined(sources)) {
-    _old_sources = sources
-  }
-  set_sources_assignment_filter([ "#*" ])
-  sources = _pydeps_raw
-  _pydeps = sources
-  set_sources_assignment_filter([])
-  sources = _old_sources
-
   action_foreach(target_name) {
     # Forward all variables. Ensure that testonly and visibility are forwarded
     # explicitly, since this performs recursive scope lookups, which is
@@ -158,6 +136,13 @@
                              "visibility",
                            ])
 
+    # Read and filter out comments.
+    # Happens every time the template is instantiated, but benchmarking shows no
+    # perceivable impact on overall 'gn gen' speed.
+    _pydeps_file = invoker.script + "deps"
+    _pydeps_lines = read_file(_pydeps_file, "list lines")
+    _pydeps_entries = filter_exclude(_pydeps_lines, [ "#*" ])
+
     if (!defined(inputs)) {
       inputs = []
     }
@@ -165,6 +150,6 @@
     # Dependencies are listed relative to the script directory, but inputs
     # expects paths that are relative to the current BUILD.gn
     _script_dir = get_path_info(script, "dir")
-    inputs += rebase_path(_pydeps, ".", _script_dir)
+    inputs += rebase_path(_pydeps_entries, ".", _script_dir)
   }
 }
diff --git a/build_overrides/OWNERS b/build_overrides/OWNERS
index ee6af5a..fc9fc3b3 100644
--- a/build_overrides/OWNERS
+++ b/build_overrides/OWNERS
@@ -1,6 +1,6 @@
 file://build/OWNERS
 machenbach@chromium.org
-phoglund@chromium.org
+mbonadei@chromium.org
 
 # COMPONENT: Build
 # TEAM: infra-dev@chromium.org
diff --git a/cc/input/scroll_snap_data.cc b/cc/input/scroll_snap_data.cc
index e6305f4..10f3280 100644
--- a/cc/input/scroll_snap_data.cc
+++ b/cc/input/scroll_snap_data.cc
@@ -13,8 +13,8 @@
 namespace {
 
 bool IsMutualVisible(const SnapSearchResult& a, const SnapSearchResult& b) {
-  return a.visible_range().Contains(gfx::RangeF(b.snap_offset())) &&
-         b.visible_range().Contains(gfx::RangeF(a.snap_offset()));
+  return gfx::RangeF(b.snap_offset()).IsBoundedBy(a.visible_range()) &&
+         gfx::RangeF(a.snap_offset()).IsBoundedBy(b.visible_range());
 }
 
 void SetOrUpdateResult(const SnapSearchResult& candidate,
diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc
index fcc15047..bf1be87 100644
--- a/cc/metrics/frame_sequence_tracker.cc
+++ b/cc/metrics/frame_sequence_tracker.cc
@@ -505,9 +505,9 @@
     FrameSequenceTrackerType type,
     ThroughputUkmReporter* throughput_ukm_reporter)
     : type_(type),
-      metrics_(
-          std::make_unique<FrameSequenceMetrics>(type,
-                                                 throughput_ukm_reporter)) {
+      metrics_(std::make_unique<FrameSequenceMetrics>(type,
+                                                      throughput_ukm_reporter)),
+      trace_data_(metrics_.get()) {
   DCHECK_LT(type_, FrameSequenceTrackerType::kMaxType);
 }
 
@@ -814,9 +814,8 @@
   if (ignored_frame_tokens_.contains(frame_token))
     return;
 
-  TRACE_EVENT_NESTABLE_ASYNC_INSTANT_WITH_TIMESTAMP0(
-      "cc,benchmark", "FramePresented", TRACE_ID_LOCAL(metrics_.get()),
-      feedback.timestamp);
+  trace_data_.Advance(feedback.timestamp);
+
   const bool was_presented = !feedback.timestamp.is_null();
   if (was_presented && last_submitted_frame_) {
     DCHECK_LT(impl_throughput().frames_produced,
@@ -1090,4 +1089,19 @@
 FrameSequenceTracker::CheckerboardingData::CheckerboardingData() = default;
 FrameSequenceTracker::CheckerboardingData::~CheckerboardingData() = default;
 
+FrameSequenceTracker::TraceData::TraceData(const void* id) : trace_id(id) {}
+void FrameSequenceTracker::TraceData::Advance(base::TimeTicks new_timestamp) {
+  // Use different names, because otherwise the trace-viewer shows the slices in
+  // the same color, and that makes it difficult to tell the traces apart from
+  // each other.
+  const char* trace_names[] = {"Frame", "Frame ", "Frame   "};
+  TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(
+      "cc,benchmark", trace_names[++this->frame_count % 3],
+      TRACE_ID_LOCAL(this->trace_id), this->last_timestamp);
+  TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(
+      "cc,benchmark", trace_names[this->frame_count % 3],
+      TRACE_ID_LOCAL(this->trace_id), new_timestamp);
+  this->last_timestamp = new_timestamp;
+}
+
 }  // namespace cc
diff --git a/cc/metrics/frame_sequence_tracker.h b/cc/metrics/frame_sequence_tracker.h
index 7828201f..d3d9669 100644
--- a/cc/metrics/frame_sequence_tracker.h
+++ b/cc/metrics/frame_sequence_tracker.h
@@ -425,6 +425,16 @@
   // TODO(xidachen): remove this one.
   uint64_t current_begin_main_sequence_ = 0;
 
+  // Tracks some data to generate useful trace events.
+  struct TraceData {
+    explicit TraceData(const void* trace_id);
+    const void* trace_id;
+    base::TimeTicks last_timestamp = base::TimeTicks::Now();
+    int frame_count = 0;
+
+    void Advance(base::TimeTicks new_timestamp);
+  } trace_data_;
+
 #if DCHECK_IS_ON()
   bool is_inside_frame_ = false;
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 31c5af0..71e241a 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -247,8 +247,6 @@
 
 }  // namespace
 
-DEFINE_SCOPED_UMA_HISTOGRAM_TIMER(PendingTreeDurationHistogramTimer,
-                                  "Scheduling.%s.PendingTreeDuration")
 DEFINE_SCOPED_UMA_HISTOGRAM_TIMER(PendingTreeRasterDurationHistogramTimer,
                                   "Scheduling.%s.PendingTreeRasterDuration")
 
@@ -1728,7 +1726,6 @@
   if (pending_tree_)
     pending_tree_->DetachLayers();
   pending_tree_ = nullptr;
-  pending_tree_duration_timer_ = nullptr;
   if (recycle_tree_)
     recycle_tree_->DetachLayers();
   recycle_tree_ = nullptr;
@@ -3016,9 +3013,6 @@
   client_->OnCanDrawStateChanged(CanDraw());
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("cc", "PendingTree:waiting",
                                     TRACE_ID_LOCAL(pending_tree_.get()));
-
-  DCHECK(!pending_tree_duration_timer_);
-  pending_tree_duration_timer_.reset(new PendingTreeDurationHistogramTimer());
 }
 
 void LayerTreeHostImpl::PushScrollbarOpacitiesFromActiveToPending() {
@@ -3056,10 +3050,6 @@
                                     TRACE_ID_LOCAL(pending_tree_.get()));
     active_tree_->lifecycle().AdvanceTo(LayerTreeLifecycle::kBeginningSync);
 
-    DCHECK(pending_tree_duration_timer_);
-    // Reset will call the destructor and log the timer histogram.
-    pending_tree_duration_timer_.reset();
-
     // In most cases, this will be reset in NotifyReadyToActivate, since we
     // activate the pending tree only when its ready. But an activation may be
     // forced, in the case of a context loss for instance, so reset it here as
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 3c141a9..8f439cf 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -91,7 +91,6 @@
 class MutatorEvents;
 class MutatorHost;
 class PageScaleAnimation;
-class PendingTreeDurationHistogramTimer;
 class PendingTreeRasterDurationHistogramTimer;
 class RasterTilePriorityQueue;
 class RasterBufferProvider;
@@ -1248,8 +1247,6 @@
 
   std::unique_ptr<Viewport> viewport_;
 
-  std::unique_ptr<PendingTreeDurationHistogramTimer>
-      pending_tree_duration_timer_;
   std::unique_ptr<PendingTreeRasterDurationHistogramTimer>
       pending_tree_raster_duration_timer_;
 
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 910f1ce0..97a36fe 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -2331,17 +2331,15 @@
   }
 }
 
-group("chrome_public_wpt") {
+python_library("chrome_public_wpt") {
   testonly = true
+  pydeps_file = "//testing/scripts/run_android_wpt.pydeps"
+  data = [ "//third_party/blink/web_tests/external/" ]
   data_deps = [
     ":chrome_public_apk",
     "//build/android:test_runner_py",
     "//chrome/test/chromedriver:chromedriver($host_toolchain)",
   ]
-  set_sources_assignment_filter([ "#*" ])
-  sources = read_file("//testing/scripts/run_android_wpt.pydeps", "list lines")
-  data = sources
-  data += [ "//third_party/blink/web_tests/external/" ]
 }
 
 chrome_bundle("chrome_modern_public_bundle") {
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
index 1487412..bf4c057 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
@@ -48,6 +48,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.BooleanAndProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.BooleanList;
+import org.chromium.chrome.browser.autofill_assistant.proto.BooleanNotProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.CallbackProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipType;
@@ -90,6 +91,7 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.TextViewProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ToStringProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.ToggleUserActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.UserActionList;
 import org.chromium.chrome.browser.autofill_assistant.proto.UserActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ValueProto;
@@ -1197,4 +1199,96 @@
                 .check(matches(isImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO)));
         onView(withText("custom-desc")).check(matches(withContentDescription("custom")));
     }
+
+    /**
+     * Shows a chip that becomes enabled/disabled based on other interactions.
+     */
+    @Test
+    @MediumTest
+    public void testGenericUiDisableChips() {
+        List<InteractionProto> interactions = new ArrayList<>();
+        interactions.add(
+                (InteractionProto) InteractionProto.newBuilder()
+                        .setTriggerEvent(EventProto.newBuilder().setOnValueChanged(
+                                OnModelValueChangedEventProto.newBuilder().setModelIdentifier(
+                                        "chips")))
+                        .addCallbacks(CallbackProto.newBuilder().setSetUserActions(
+                                SetUserActionsProto.newBuilder().setModelIdentifier("chips")))
+                        .build());
+        interactions.add(
+                (InteractionProto) InteractionProto.newBuilder()
+                        .setTriggerEvent(EventProto.newBuilder().setOnValueChanged(
+                                OnModelValueChangedEventProto.newBuilder().setModelIdentifier(
+                                        "enabled")))
+                        .addCallbacks(CallbackProto.newBuilder().setToggleUserAction(
+                                ToggleUserActionProto.newBuilder()
+                                        .setUserActionsModelIdentifier("chips")
+                                        .setEnabledModelIdentifier("enabled")
+                                        .setUserActionIdentifier("done_chip")))
+                        .build());
+        interactions.add(
+                (InteractionProto) InteractionProto.newBuilder()
+                        .setTriggerEvent(EventProto.newBuilder().setOnViewClicked(
+                                OnViewClickedEventProto.newBuilder().setViewIdentifier(
+                                        "text_view")))
+                        .addCallbacks(CallbackProto.newBuilder().setComputeValue(
+                                ComputeValueProto.newBuilder()
+                                        .setResultModelIdentifier("enabled")
+                                        .setBooleanNot(
+                                                BooleanNotProto.newBuilder().setModelIdentifier(
+                                                        "enabled"))))
+                        .build());
+
+        List<ModelProto.ModelValue> modelValues = new ArrayList<>();
+        modelValues.add(
+                (ModelProto.ModelValue) ModelProto.ModelValue.newBuilder()
+                        .setIdentifier("chips")
+                        .setValue(ValueProto.newBuilder().setUserActions(
+                                UserActionList.newBuilder().addValues(
+                                        UserActionProto.newBuilder()
+                                                .setChip(ChipProto.newBuilder()
+                                                                 .setText("Done")
+                                                                 .setType(ChipType.NORMAL_ACTION))
+                                                .setIdentifier("done_chip"))))
+                        .build());
+        modelValues.add((ModelProto.ModelValue) ModelProto.ModelValue.newBuilder()
+                                .setIdentifier("enabled")
+                                .setValue(ValueProto.newBuilder().setBooleans(
+                                        BooleanList.newBuilder().addValues(false)))
+                                .build());
+
+        GenericUserInterfaceProto genericUserInterface =
+                (GenericUserInterfaceProto) GenericUserInterfaceProto.newBuilder()
+                        .setRootView(createTextView("Click me to toggle the chip", "text_view"))
+                        .setInteractions(
+                                InteractionsProto.newBuilder().addAllInteractions(interactions))
+                        .setModel(ModelProto.newBuilder().addAllValues(modelValues))
+                        .build();
+
+        ArrayList<ActionProto> list = new ArrayList<>();
+        list.add((ActionProto) ActionProto.newBuilder()
+                         .setShowGenericUi(ShowGenericUiProto.newBuilder().setGenericUserInterface(
+                                 genericUserInterface))
+                         .build());
+        AutofillAssistantTestScript script = new AutofillAssistantTestScript(
+                (SupportedScriptProto) SupportedScriptProto.newBuilder()
+                        .setPath("form_target_website.html")
+                        .setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
+                                ChipProto.newBuilder().setText("Autostart")))
+                        .build(),
+                list);
+
+        AutofillAssistantTestService testService =
+                new AutofillAssistantTestService(Collections.singletonList(script));
+        startAutofillAssistant(mTestRule.getActivity(), testService);
+
+        waitUntilViewMatchesCondition(withText("Done"), isCompletelyDisplayed());
+        onView(withContentDescription("Done")).check(matches(not(isEnabled())));
+
+        onView(withText("Click me to toggle the chip")).perform(click());
+        waitUntilViewMatchesCondition(withContentDescription("Done"), isEnabled());
+
+        onView(withText("Click me to toggle the chip")).perform(click());
+        waitUntilViewMatchesCondition(withContentDescription("Done"), not(isEnabled()));
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java
index 897e99c..ee9e305 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java
@@ -66,21 +66,19 @@
         public final int id;
         public final String title;
         public final String originalUrl;
-        public final Profile profile;
         public final String visibleUrl;
 
         /**
          * Constructs a new TabInfo object
          */
         protected TabInfo(int id, String title, String url, String originalUrl, String referrerUrl,
-                long timestampMillis, Profile profile, String visibleUrl) {
+                long timestampMillis, String visibleUrl) {
             this.id = id;
             this.title = title;
             this.url = url;
             this.originalUrl = originalUrl;
             this.referrerUrl = referrerUrl;
             this.timestampMillis = timestampMillis;
-            this.profile = profile;
             this.visibleUrl = visibleUrl;
         }
 
@@ -91,11 +89,12 @@
             String referrerUrl = getReferrerUrlFromTab(tab);
             return new TabInfo(tab.getId(), tab.getTitle(), tab.getUrlString(),
                     tab.getOriginalUrl(), referrerUrl != null ? referrerUrl : "",
-                    tab.getTimestampMillis(), ((TabImpl) tab).getProfile(), tab.getUrlString());
+                    tab.getTimestampMillis(), tab.getUrlString());
         }
 
         public double getSiteEngagementScore() {
-            return SiteEngagementService.getForProfile(profile).getScore(visibleUrl);
+            return SiteEngagementService.getForProfile(Profile.getLastUsedRegularProfile())
+                    .getScore(visibleUrl);
         }
 
         private static String getReferrerUrlFromTab(Tab tab) {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java
index 823f9c6..279238a3 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java
@@ -49,8 +49,8 @@
 
     private TabContext.TabInfo getMockTab(int id, String title, String url, String originalUrl,
             String referrer, long timestamp, double siteEngagementScore) {
-        TabContext.TabInfo tabInfo = spy(
-                new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, null, ""));
+        TabContext.TabInfo tabInfo =
+                spy(new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, ""));
         doReturn(siteEngagementScore).when(tabInfo).getSiteEngagementScore();
         return tabInfo;
     }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
index fb5e5b91..645270f 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
@@ -54,8 +54,8 @@
 
     private TabContext.TabInfo getMockTab(int id, String title, String url, String originalUrl,
             String referrer, long timestamp, double siteEngagementScore) {
-        TabContext.TabInfo tabInfo = spy(
-                new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, null, ""));
+        TabContext.TabInfo tabInfo =
+                spy(new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, ""));
         doReturn(siteEngagementScore).when(tabInfo).getSiteEngagementScore();
         return tabInfo;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
index dbf80303..51663f1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -41,6 +41,7 @@
 import org.chromium.chrome.browser.autofill.prefeditor.EditorDialog;
 import org.chromium.chrome.browser.autofill.prefeditor.EditorObserverForTest;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.payments.PaymentApp;
 import org.chromium.chrome.browser.payments.PaymentRequestImpl.PaymentUisShowStateReconciler;
 import org.chromium.chrome.browser.payments.ShippingStrings;
 import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.LineItemBreakdownSection;
@@ -1022,6 +1023,13 @@
                 && mPaymentMethodSectionInformation != null
                 && mPaymentMethodSectionInformation.getSelectedItem() != null
                 && !mIsClientCheckingSelection && !mIsEditingPaymentItem && !mIsClosing);
+
+        PaymentApp selectedApp = mPaymentMethodSectionInformation == null
+                ? null
+                : (PaymentApp) mPaymentMethodSectionInformation.getSelectedItem();
+        mPayButton.setText(selectedApp != null && !selectedApp.isAutofillInstrument()
+                        ? R.string.payments_continue_button
+                        : R.string.payments_pay_button);
         mReadyToPayNotifierForTest.run();
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java
index d4daf1b..616b586 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestPaymentAppAndBasicCardWithModifiersTest.java
@@ -12,6 +12,7 @@
 import android.graphics.Color;
 import android.graphics.drawable.BitmapDrawable;
 import android.support.test.filters.MediumTest;
+import android.widget.Button;
 
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -62,6 +63,13 @@
                 "310-310-6000", "jon.doe@gmail.com", "en-US"));
     }
 
+    protected String getPrimaryButtonLabel() {
+        Button primary = (Button) mPaymentRequestTestRule.getPaymentRequestUI()
+                                 .getDialogForTest()
+                                 .findViewById(R.id.button_primary);
+        return primary.getText().toString();
+    }
+
     /**
      * Verify modifier for Bobpay is only applied for Bobpay.
      */
@@ -81,6 +89,9 @@
         assertTrue(mPaymentRequestTestRule.getSelectedPaymentAppLabel().startsWith(
                 "https://bobpay.com"));
         assertEquals("USD $4.00", mPaymentRequestTestRule.getOrderSummaryTotal());
+        assertEquals(mPaymentRequestTestRule.getActivity().getResources().getString(
+                             R.string.payments_continue_button),
+                getPrimaryButtonLabel());
 
         // select other payment method and verify modifier for bobpay is not applied
         mPaymentRequestTestRule.clickOnPaymentMethodSuggestionOptionAndWait(
@@ -88,6 +99,9 @@
         assertFalse(mPaymentRequestTestRule.getSelectedPaymentAppLabel().startsWith(
                 "https://bobpay.com"));
         assertEquals("USD $5.00", mPaymentRequestTestRule.getOrderSummaryTotal());
+        assertEquals(mPaymentRequestTestRule.getActivity().getResources().getString(
+                             R.string.payments_pay_button),
+                getPrimaryButtonLabel());
     }
 
     /**
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index eec9412..a8cb7a4f 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3882,15 +3882,19 @@
      flag_descriptions::kSharingDeriveVapidKeyDescription, kOsAll,
      FEATURE_VALUE_TYPE(kSharingDeriveVapidKey)},
 
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+    defined(OS_CHROMEOS)
     {"sharing-peer-connection-receiver",
      flag_descriptions::kSharingPeerConnectionReceiverName,
-     flag_descriptions::kSharingPeerConnectionReceiverDescription, kOsAll,
+     flag_descriptions::kSharingPeerConnectionReceiverDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(kSharingPeerConnectionReceiver)},
 
     {"sharing-peer-connection-sender",
      flag_descriptions::kSharingPeerConnectionSenderName,
-     flag_descriptions::kSharingPeerConnectionSenderDescription, kOsAll,
+     flag_descriptions::kSharingPeerConnectionSenderDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(kSharingPeerConnectionSender)},
+#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
+        // defined(OS_CHROMEOS)
 
     {"sharing-qr-code-generator",
      flag_descriptions::kSharingQRCodeGeneratorName,
@@ -4058,10 +4062,6 @@
      flag_descriptions::kDisableBestEffortTasksName,
      flag_descriptions::kDisableBestEffortTasksDescription, kOsAll,
      SINGLE_VALUE_TYPE(switches::kDisableBestEffortTasks)},
-    {"enable-sync-uss-passwords",
-     flag_descriptions::kEnableSyncUSSPasswordsName,
-     flag_descriptions::kEnableSyncUSSPasswordsDescription, kOsAll,
-     FEATURE_VALUE_TYPE(switches::kSyncUSSPasswords)},
 
 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
     {"web-contents-occlusion", flag_descriptions::kWebContentsOcclusionName,
diff --git a/chrome/browser/accessibility/caption_bubble.cc b/chrome/browser/accessibility/caption_bubble.cc
index 93ccf43..942d02b 100644
--- a/chrome/browser/accessibility/caption_bubble.cc
+++ b/chrome/browser/accessibility/caption_bubble.cc
@@ -20,7 +20,7 @@
     : BubbleDialogDelegateView(anchor,
                                views::BubbleBorder::FLOAT,
                                views::BubbleBorder::Shadow::NO_SHADOW) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DialogDelegate::set_draggable(true);
 }
 
diff --git a/chrome/browser/android/autofill_assistant/interaction_handler_android.cc b/chrome/browser/android/autofill_assistant/interaction_handler_android.cc
index 966cf00..1c1ee3d 100644
--- a/chrome/browser/android/autofill_assistant/interaction_handler_android.cc
+++ b/chrome/browser/android/autofill_assistant/interaction_handler_android.cc
@@ -58,6 +58,14 @@
   basic_interactions->EndAction(proto);
 }
 
+void TryToggleUserAction(base::WeakPtr<BasicInteractions> basic_interactions,
+                         const ToggleUserActionProto& proto) {
+  if (!basic_interactions) {
+    return;
+  }
+  basic_interactions->ToggleUserAction(proto);
+}
+
 void ShowInfoPopup(const InfoPopupProto& proto,
                    base::android::ScopedJavaGlobalRef<jobject> jcontext) {
   JNIEnv* env = base::android::AttachCurrentThread();
@@ -362,6 +370,27 @@
       return base::Optional<InteractionHandlerAndroid::InteractionCallback>(
           base::BindRepeating(&SetTextViewText, user_model->GetWeakPtr(),
                               proto.set_text(), views));
+      break;
+    case CallbackProto::kToggleUserAction:
+      if (proto.toggle_user_action().user_actions_model_identifier().empty()) {
+        VLOG(1) << "Error creating ToggleUserAction interaction: "
+                   "user_actions_model_identifier not set";
+        return base::nullopt;
+      }
+      if (proto.toggle_user_action().user_action_identifier().empty()) {
+        VLOG(1) << "Error creating ToggleUserAction interaction: "
+                   "user_action_identifier not set";
+        return base::nullopt;
+      }
+      if (proto.toggle_user_action().enabled_model_identifier().empty()) {
+        VLOG(1) << "Error creating ToggleUserAction interaction: "
+                   "enabled_model_identifier not set";
+        return base::nullopt;
+      }
+      return base::Optional<InteractionHandlerAndroid::InteractionCallback>(
+          base::BindRepeating(&TryToggleUserAction,
+                              basic_interactions->GetWeakPtr(),
+                              proto.toggle_user_action()));
     case CallbackProto::KIND_NOT_SET:
       VLOG(1) << "Error creating interaction: kind not set";
       return base::nullopt;
diff --git a/chrome/browser/android/preferences/website_preference_bridge.cc b/chrome/browser/android/preferences/website_preference_bridge.cc
index c7a68f2..e8235f5a 100644
--- a/chrome/browser/android/preferences/website_preference_bridge.cc
+++ b/chrome/browser/android/preferences/website_preference_bridge.cc
@@ -22,14 +22,10 @@
 #include "chrome/android/chrome_jni_headers/WebsitePreferenceBridge_jni.h"
 #include "chrome/browser/android/search_permissions/search_permissions_service.h"
 #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h"
-#include "chrome/browser/content_settings/cookie_settings_factory.h"
-#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/content_settings/web_site_settings_uma_util.h"
 #include "chrome/browser/engagement/important_sites_util.h"
 #include "chrome/browser/media/android/cdm/media_drm_license_manager.h"
 #include "chrome/browser/notifications/notification_permission_context.h"
-#include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h"
 #include "chrome/browser/permissions/permission_manager_factory.h"
 #include "chrome/browser/permissions/quiet_notification_permission_ui_state.h"
 #include "chrome/browser/profiles/profile.h"
@@ -41,10 +37,12 @@
 #include "chrome/common/pref_names.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings.h"
 #include "components/permissions/permission_decision_auto_blocker.h"
 #include "components/permissions/permission_manager.h"
 #include "components/permissions/permission_uma_util.h"
 #include "components/permissions/permission_util.h"
+#include "components/permissions/permissions_client.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
@@ -81,11 +79,20 @@
   return profile;
 }
 
+Profile* GetOriginalProfile() {
+  return ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
+}
+
 HostContentSettingsMap* GetHostContentSettingsMap(bool is_incognito) {
-  return HostContentSettingsMapFactory::GetForProfile(
+  return permissions::PermissionsClient::Get()->GetSettingsMap(
       GetActiveUserProfile(is_incognito));
 }
 
+HostContentSettingsMap* GetHostContentSettingsMap() {
+  return permissions::PermissionsClient::Get()->GetSettingsMap(
+      GetOriginalProfile());
+}
+
 // Reset the give permission for the DSE if the permission and origin are
 // controlled by the DSE.
 bool MaybeResetDSEPermission(ContentSettingsType type,
@@ -107,8 +114,7 @@
   return false;
 }
 
-ScopedJavaLocalRef<jstring>
-JNI_WebsitePreferenceBridge_ConvertOriginToJavaString(
+ScopedJavaLocalRef<jstring> ConvertOriginToJavaString(
     JNIEnv* env,
     const std::string& origin) {
   // The string |jorigin| is used to group permissions together in the Site
@@ -142,12 +148,11 @@
     const base::android::JavaRef<jstring>&,
     const base::android::JavaRef<jstring>&);
 
-void JNI_WebsitePreferenceBridge_GetOrigins(
-    JNIEnv* env,
-    ContentSettingsType content_type,
-    InfoListInsertionFunction insertionFunc,
-    const JavaRef<jobject>& list,
-    jboolean managedOnly) {
+void GetOrigins(JNIEnv* env,
+                ContentSettingsType content_type,
+                InfoListInsertionFunction insertionFunc,
+                const JavaRef<jobject>& list,
+                jboolean managedOnly) {
   HostContentSettingsMap* content_settings_map =
       GetHostContentSettingsMap(false);  // is_incognito
   ContentSettingsForOneType all_settings;
@@ -181,17 +186,14 @@
       jembedder = ConvertUTF8ToJavaString(env, embedder);
 
     seen_origins.push_back(origin);
-    insertionFunc(
-        env, list,
-        JNI_WebsitePreferenceBridge_ConvertOriginToJavaString(env, origin),
-        jembedder);
+    insertionFunc(env, list, ConvertOriginToJavaString(env, origin), jembedder);
   }
 
   // Add any origins which have a default content setting value (thus skipped
   // above), but have been automatically blocked for this permission type.
   // We use an empty embedder since embargo doesn't care about it.
   permissions::PermissionDecisionAutoBlocker* auto_blocker =
-      PermissionDecisionAutoBlockerFactory::GetForProfile(
+      permissions::PermissionsClient::Get()->GetPermissionDecisionAutoBlocker(
           GetActiveUserProfile(false /* is_incognito */));
   ScopedJavaLocalRef<jstring> jembedder;
 
@@ -205,20 +207,17 @@
     if (auto_blocker->GetEmbargoResult(GURL(origin), content_type)
             .content_setting == CONTENT_SETTING_BLOCK) {
       seen_origins.push_back(origin);
-      insertionFunc(
-          env, list,
-          JNI_WebsitePreferenceBridge_ConvertOriginToJavaString(env, origin),
-          jembedder);
+      insertionFunc(env, list, ConvertOriginToJavaString(env, origin),
+                    jembedder);
     }
   }
 }
 
-ContentSetting JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-    JNIEnv* env,
-    ContentSettingsType content_type,
-    jstring origin,
-    jstring embedder,
-    jboolean is_incognito) {
+ContentSetting GetSettingForOrigin(JNIEnv* env,
+                                   ContentSettingsType content_type,
+                                   jstring origin,
+                                   jstring embedder,
+                                   jboolean is_incognito) {
   GURL url(ConvertJavaStringToUTF8(env, origin));
   std::string embedder_str = ConvertJavaStringToUTF8(env, embedder);
   GURL embedder_url;
@@ -235,13 +234,12 @@
       .content_setting;
 }
 
-void JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-    JNIEnv* env,
-    ContentSettingsType content_type,
-    jstring origin,
-    jstring embedder,
-    ContentSetting setting,
-    jboolean is_incognito) {
+void SetSettingForOrigin(JNIEnv* env,
+                         ContentSettingsType content_type,
+                         jstring origin,
+                         jstring embedder,
+                         ContentSetting setting,
+                         jboolean is_incognito) {
   GURL origin_url(ConvertJavaStringToUTF8(env, origin));
   GURL embedder_url =
       embedder ? GURL(ConvertJavaStringToUTF8(env, embedder)) : GURL();
@@ -250,7 +248,8 @@
   // The permission may have been blocked due to being under embargo, so if it
   // was changed away from BLOCK, clear embargo status if it exists.
   if (setting != CONTENT_SETTING_BLOCK) {
-    PermissionDecisionAutoBlockerFactory::GetForProfile(profile)
+    permissions::PermissionsClient::Get()
+        ->GetPermissionDecisionAutoBlocker(profile)
         ->RemoveEmbargoByUrl(origin_url, content_type);
   }
 
@@ -263,7 +262,7 @@
       scoped_revocation_reporter(
           profile, origin_url, embedder_url, content_type,
           permissions::PermissionSourceUI::SITE_SETTINGS);
-  HostContentSettingsMapFactory::GetForProfile(profile)
+  GetHostContentSettingsMap(is_incognito)
       ->SetContentSettingDefaultScope(origin_url, embedder_url, content_type,
                                       std::string(), setting);
   WebSiteSettingsUmaUtil::LogPermissionChange(content_type, setting);
@@ -296,13 +295,8 @@
   return origin == url::Origin::Create(other);
 }
 
-Profile* GetOriginalProfile() {
-  return ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
-}
-
 bool GetBooleanForContentSetting(ContentSettingsType type) {
-  HostContentSettingsMap* content_settings =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
+  HostContentSettingsMap* content_settings = GetHostContentSettingsMap();
   switch (content_settings->GetDefaultContentSetting(type, nullptr)) {
     case CONTENT_SETTING_BLOCK:
       return false;
@@ -315,8 +309,7 @@
 
 bool IsContentSettingManaged(ContentSettingsType content_settings_type) {
   std::string source;
-  HostContentSettingsMap* content_settings =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
+  HostContentSettingsMap* content_settings = GetHostContentSettingsMap();
   content_settings->GetDefaultContentSetting(content_settings_type, &source);
   HostContentSettingsMap::ProviderType provider =
       content_settings->GetProviderTypeFromSource(source);
@@ -326,8 +319,7 @@
 bool IsContentSettingManagedByCustodian(
     ContentSettingsType content_settings_type) {
   std::string source;
-  HostContentSettingsMap* content_settings =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
+  HostContentSettingsMap* content_settings = GetHostContentSettingsMap();
   content_settings->GetDefaultContentSetting(content_settings_type, &source);
   HostContentSettingsMap::ProviderType provider =
       content_settings->GetProviderTypeFromSource(source);
@@ -336,8 +328,7 @@
 
 bool IsContentSettingUserModifiable(ContentSettingsType content_settings_type) {
   std::string source;
-  HostContentSettingsMap* content_settings =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
+  HostContentSettingsMap* content_settings = GetHostContentSettingsMap();
   content_settings->GetDefaultContentSetting(content_settings_type, &source);
   HostContentSettingsMap::ProviderType provider =
       content_settings->GetProviderTypeFromSource(source);
@@ -349,18 +340,17 @@
 static void JNI_WebsitePreferenceBridge_GetClipboardOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::CLIPBOARD_READ_WRITE,
-      &Java_WebsitePreferenceBridge_insertClipboardInfoIntoList, list, false);
+  GetOrigins(env, ContentSettingsType::CLIPBOARD_READ_WRITE,
+             &Java_WebsitePreferenceBridge_insertClipboardInfoIntoList, list,
+             false);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetClipboardSettingForOrigin(
     JNIEnv* env,
     const JavaParamRef<jstring>& origin,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::CLIPBOARD_READ_WRITE, origin, origin,
-      is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::CLIPBOARD_READ_WRITE,
+                             origin, origin, is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetClipboardSettingForOrigin(
@@ -368,19 +358,17 @@
     const JavaParamRef<jstring>& origin,
     jint value,
     jboolean is_incognito) {
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::CLIPBOARD_READ_WRITE, origin, origin,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::CLIPBOARD_READ_WRITE, origin,
+                      origin, static_cast<ContentSetting>(value), is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_GetGeolocationOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list,
     jboolean managedOnly) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::GEOLOCATION,
-      &Java_WebsitePreferenceBridge_insertGeolocationInfoIntoList, list,
-      managedOnly);
+  GetOrigins(env, ContentSettingsType::GEOLOCATION,
+             &Java_WebsitePreferenceBridge_insertGeolocationInfoIntoList, list,
+             managedOnly);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetGeolocationSettingForOrigin(
@@ -388,8 +376,8 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::GEOLOCATION, origin, embedder, is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::GEOLOCATION, origin,
+                             embedder, is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetGeolocationSettingForOrigin(
@@ -398,17 +386,15 @@
     const JavaParamRef<jstring>& embedder,
     jint value,
     jboolean is_incognito) {
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::GEOLOCATION, origin, embedder,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::GEOLOCATION, origin, embedder,
+                      static_cast<ContentSetting>(value), is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_GetMidiOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::MIDI_SYSEX,
-      &Java_WebsitePreferenceBridge_insertMidiInfoIntoList, list, false);
+  GetOrigins(env, ContentSettingsType::MIDI_SYSEX,
+             &Java_WebsitePreferenceBridge_insertMidiInfoIntoList, list, false);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetMidiSettingForOrigin(
@@ -416,8 +402,8 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::MIDI_SYSEX, origin, embedder, is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::MIDI_SYSEX, origin,
+                             embedder, is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetMidiSettingForOrigin(
@@ -426,15 +412,14 @@
     const JavaParamRef<jstring>& embedder,
     jint value,
     jboolean is_incognito) {
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::MIDI_SYSEX, origin, embedder,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::MIDI_SYSEX, origin, embedder,
+                      static_cast<ContentSetting>(value), is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_GetProtectedMediaIdentifierOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
+  GetOrigins(
       env, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER,
       &Java_WebsitePreferenceBridge_insertProtectedMediaIdentifierInfoIntoList,
       list, false);
@@ -446,9 +431,9 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER, origin, embedder,
-      is_incognito);
+  return GetSettingForOrigin(env,
+                             ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER,
+                             origin, embedder, is_incognito);
 }
 
 static void
@@ -458,25 +443,25 @@
     const JavaParamRef<jstring>& embedder,
     jint value,
     jboolean is_incognito) {
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER, origin, embedder,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER,
+                      origin, embedder, static_cast<ContentSetting>(value),
+                      is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_GetNotificationOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::NOTIFICATIONS,
-      &Java_WebsitePreferenceBridge_insertNotificationIntoList, list, false);
+  GetOrigins(env, ContentSettingsType::NOTIFICATIONS,
+             &Java_WebsitePreferenceBridge_insertNotificationIntoList, list,
+             false);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetNotificationSettingForOrigin(
     JNIEnv* env,
     const JavaParamRef<jstring>& origin,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::NOTIFICATIONS, origin, origin, is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::NOTIFICATIONS, origin,
+                             origin, is_incognito);
 }
 
 static jboolean JNI_WebsitePreferenceBridge_IsNotificationEmbargoedForOrigin(
@@ -515,7 +500,8 @@
   GURL url = GURL(ConvertJavaStringToUTF8(env, origin));
   ContentSetting setting = static_cast<ContentSetting>(value);
 
-  PermissionDecisionAutoBlockerFactory::GetForProfile(profile)
+  permissions::PermissionsClient::Get()
+      ->GetPermissionDecisionAutoBlocker(profile)
       ->RemoveEmbargoByUrl(url, ContentSettingsType::NOTIFICATIONS);
 
   if (MaybeResetDSEPermission(ContentSettingsType::NOTIFICATIONS, url, GURL(),
@@ -559,20 +545,18 @@
     JNIEnv* env,
     const JavaParamRef<jobject>& list,
     jboolean managedOnly) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::MEDIASTREAM_CAMERA,
-      &Java_WebsitePreferenceBridge_insertCameraInfoIntoList, list,
-      managedOnly);
+  GetOrigins(env, ContentSettingsType::MEDIASTREAM_CAMERA,
+             &Java_WebsitePreferenceBridge_insertCameraInfoIntoList, list,
+             managedOnly);
 }
 
 static void JNI_WebsitePreferenceBridge_GetMicrophoneOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list,
     jboolean managedOnly) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::MEDIASTREAM_MIC,
-      &Java_WebsitePreferenceBridge_insertMicrophoneInfoIntoList, list,
-      managedOnly);
+  GetOrigins(env, ContentSettingsType::MEDIASTREAM_MIC,
+             &Java_WebsitePreferenceBridge_insertMicrophoneInfoIntoList, list,
+             managedOnly);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetMicrophoneSettingForOrigin(
@@ -580,9 +564,8 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::MEDIASTREAM_MIC, origin, embedder,
-      is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::MEDIASTREAM_MIC, origin,
+                             embedder, is_incognito);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetCameraSettingForOrigin(
@@ -590,9 +573,8 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::MEDIASTREAM_CAMERA, origin, embedder,
-      is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::MEDIASTREAM_CAMERA,
+                             origin, embedder, is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetMicrophoneSettingForOrigin(
@@ -601,9 +583,9 @@
     jint value,
     jboolean is_incognito) {
   // Here 'nullptr' indicates that microphone uses wildcard for embedder.
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::MEDIASTREAM_MIC, origin, nullptr,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::MEDIASTREAM_MIC, origin,
+                      nullptr, static_cast<ContentSetting>(value),
+                      is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetCameraSettingForOrigin(
@@ -612,9 +594,9 @@
     jint value,
     jboolean is_incognito) {
   // Here 'nullptr' indicates that camera uses wildcard for embedder.
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::MEDIASTREAM_CAMERA, origin, nullptr,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::MEDIASTREAM_CAMERA, origin,
+                      nullptr, static_cast<ContentSetting>(value),
+                      is_incognito);
 }
 
 static jboolean JNI_WebsitePreferenceBridge_IsContentSettingsPatternValid(
@@ -907,9 +889,8 @@
 static void JNI_WebsitePreferenceBridge_GetArOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::AR,
-      &Java_WebsitePreferenceBridge_insertArInfoIntoList, list, false);
+  GetOrigins(env, ContentSettingsType::AR,
+             &Java_WebsitePreferenceBridge_insertArInfoIntoList, list, false);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetArSettingForOrigin(
@@ -917,8 +898,8 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::AR, origin, embedder, is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::AR, origin, embedder,
+                             is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetArSettingForOrigin(
@@ -927,17 +908,15 @@
     const JavaParamRef<jstring>& embedder,
     jint value,
     jboolean is_incognito) {
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::AR, origin, embedder,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::AR, origin, embedder,
+                      static_cast<ContentSetting>(value), is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_GetNfcOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::NFC,
-      &Java_WebsitePreferenceBridge_insertNfcInfoIntoList, list, false);
+  GetOrigins(env, ContentSettingsType::NFC,
+             &Java_WebsitePreferenceBridge_insertNfcInfoIntoList, list, false);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetNfcSettingForOrigin(
@@ -945,8 +924,8 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::NFC, origin, embedder, is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::NFC, origin, embedder,
+                             is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetNfcSettingForOrigin(
@@ -955,17 +934,16 @@
     const JavaParamRef<jstring>& embedder,
     jint value,
     jboolean is_incognito) {
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::NFC, origin, embedder,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::NFC, origin, embedder,
+                      static_cast<ContentSetting>(value), is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_GetSensorsOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::SENSORS,
-      &Java_WebsitePreferenceBridge_insertSensorsInfoIntoList, list, false);
+  GetOrigins(env, ContentSettingsType::SENSORS,
+             &Java_WebsitePreferenceBridge_insertSensorsInfoIntoList, list,
+             false);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetSensorsSettingForOrigin(
@@ -973,8 +951,8 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::SENSORS, origin, embedder, is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::SENSORS, origin,
+                             embedder, is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetSensorsSettingForOrigin(
@@ -983,17 +961,15 @@
     const JavaParamRef<jstring>& embedder,
     jint value,
     jboolean is_incognito) {
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::SENSORS, origin, embedder,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::SENSORS, origin, embedder,
+                      static_cast<ContentSetting>(value), is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_GetVrOrigins(
     JNIEnv* env,
     const JavaParamRef<jobject>& list) {
-  JNI_WebsitePreferenceBridge_GetOrigins(
-      env, ContentSettingsType::VR,
-      &Java_WebsitePreferenceBridge_insertVrInfoIntoList, list, false);
+  GetOrigins(env, ContentSettingsType::VR,
+             &Java_WebsitePreferenceBridge_insertVrInfoIntoList, list, false);
 }
 
 static jint JNI_WebsitePreferenceBridge_GetVrSettingForOrigin(
@@ -1001,8 +977,8 @@
     const JavaParamRef<jstring>& origin,
     const JavaParamRef<jstring>& embedder,
     jboolean is_incognito) {
-  return JNI_WebsitePreferenceBridge_GetSettingForOrigin(
-      env, ContentSettingsType::VR, origin, embedder, is_incognito);
+  return GetSettingForOrigin(env, ContentSettingsType::VR, origin, embedder,
+                             is_incognito);
 }
 
 static void JNI_WebsitePreferenceBridge_SetVrSettingForOrigin(
@@ -1011,9 +987,8 @@
     const JavaParamRef<jstring>& embedder,
     jint value,
     jboolean is_incognito) {
-  JNI_WebsitePreferenceBridge_SetSettingForOrigin(
-      env, ContentSettingsType::VR, origin, embedder,
-      static_cast<ContentSetting>(value), is_incognito);
+  SetSettingForOrigin(env, ContentSettingsType::VR, origin, embedder,
+                      static_cast<ContentSetting>(value), is_incognito);
 }
 
 // On Android O+ notification channels are not stored in the Chrome profile and
@@ -1072,9 +1047,7 @@
     }
   }
 
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(type, value);
+  GetHostContentSettingsMap()->SetDefaultContentSetting(type, value);
 }
 
 static void JNI_WebsitePreferenceBridge_SetContentSettingForPattern(
@@ -1087,9 +1060,7 @@
       ConvertJavaStringToUTF8(env, primary_pattern);
   std::string secondary_pattern_string =
       ConvertJavaStringToUTF8(env, secondary_pattern);
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetContentSettingCustomScope(
+  GetHostContentSettingsMap()->SetContentSettingCustomScope(
       ContentSettingsPattern::FromString(primary_pattern_string),
       secondary_pattern_string.empty()
           ? ContentSettingsPattern::Wildcard()
@@ -1102,10 +1073,8 @@
     JNIEnv* env,
     int content_settings_type,
     const JavaParamRef<jobject>& list) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
   ContentSettingsForOneType entries;
-  host_content_settings_map->GetSettingsForOneType(
+  GetHostContentSettingsMap()->GetSettingsForOneType(
       static_cast<ContentSettingsType>(content_settings_type), "", &entries);
   for (size_t i = 0; i < entries.size(); ++i) {
     Java_WebsitePreferenceBridge_addContentSettingExceptionToList(
@@ -1120,9 +1089,7 @@
 static jint JNI_WebsitePreferenceBridge_GetContentSetting(
     JNIEnv* env,
     int content_settings_type) {
-  HostContentSettingsMap* content_settings =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  return content_settings->GetDefaultContentSetting(
+  return GetHostContentSettingsMap()->GetDefaultContentSetting(
       static_cast<ContentSettingsType>(content_settings_type), nullptr);
 }
 
@@ -1130,9 +1097,7 @@
     JNIEnv* env,
     int content_settings_type,
     int setting) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       static_cast<ContentSettingsType>(content_settings_type),
       static_cast<ContentSetting>(setting));
 }
@@ -1196,9 +1161,7 @@
     JNIEnv* env) {
   if (!IsContentSettingManaged(ContentSettingsType::GEOLOCATION))
     return false;
-  HostContentSettingsMap* content_settings =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  return content_settings->GetDefaultContentSetting(
+  return GetHostContentSettingsMap()->GetDefaultContentSetting(
              ContentSettingsType::GEOLOCATION, nullptr) ==
          CONTENT_SETTING_ALLOW;
 }
@@ -1215,54 +1178,42 @@
 
 static void JNI_WebsitePreferenceBridge_SetArEnabled(JNIEnv* env,
                                                      jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::AR,
       allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
 
 static void JNI_WebsitePreferenceBridge_SetClipboardEnabled(JNIEnv* env,
                                                             jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::CLIPBOARD_READ_WRITE,
       allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
 
 static void JNI_WebsitePreferenceBridge_SetNfcEnabled(JNIEnv* env,
                                                       jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::NFC,
       allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
 
 static void JNI_WebsitePreferenceBridge_SetVrEnabled(JNIEnv* env,
                                                      jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::VR,
       allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
 
 static void JNI_WebsitePreferenceBridge_SetSensorsEnabled(JNIEnv* env,
                                                           jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::SENSORS,
       allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK);
 }
 
 static void JNI_WebsitePreferenceBridge_SetSoundEnabled(JNIEnv* env,
                                                         jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::SOUND,
       allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK);
 
@@ -1277,9 +1228,7 @@
 
 static void JNI_WebsitePreferenceBridge_SetAllowCookiesEnabled(JNIEnv* env,
                                                                jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::COOKIES,
       allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK);
 }
@@ -1287,9 +1236,7 @@
 static void JNI_WebsitePreferenceBridge_SetBackgroundSyncEnabled(
     JNIEnv* env,
     jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::BACKGROUND_SYNC,
       allow ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK);
 }
@@ -1297,9 +1244,7 @@
 static void JNI_WebsitePreferenceBridge_SetAutomaticDownloadsEnabled(
     JNIEnv* env,
     jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::AUTOMATIC_DOWNLOADS,
       allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
@@ -1307,27 +1252,21 @@
 static void JNI_WebsitePreferenceBridge_SetAllowLocationEnabled(
     JNIEnv* env,
     jboolean is_enabled) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::GEOLOCATION,
       is_enabled ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
 
 static void JNI_WebsitePreferenceBridge_SetCameraEnabled(JNIEnv* env,
                                                          jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::MEDIASTREAM_CAMERA,
       allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
 
 static void JNI_WebsitePreferenceBridge_SetMicEnabled(JNIEnv* env,
                                                       jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::MEDIASTREAM_MIC,
       allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
@@ -1335,9 +1274,7 @@
 static void JNI_WebsitePreferenceBridge_SetNotificationsEnabled(
     JNIEnv* env,
     jboolean allow) {
-  HostContentSettingsMap* host_content_settings_map =
-      HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
-  host_content_settings_map->SetDefaultContentSetting(
+  GetHostContentSettingsMap()->SetDefaultContentSetting(
       ContentSettingsType::NOTIFICATIONS,
       allow ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK);
 }
diff --git a/chrome/browser/apps/app_shim/BUILD.gn b/chrome/browser/apps/app_shim/BUILD.gn
index ee6922e..2467346 100644
--- a/chrome/browser/apps/app_shim/BUILD.gn
+++ b/chrome/browser/apps/app_shim/BUILD.gn
@@ -6,6 +6,8 @@
 # communicating with app_shim processes on Mac.
 source_set("app_shim") {
   sources = [
+    "app_shim_handler_delegate_mac.cc",
+    "app_shim_handler_delegate_mac.h",
     "app_shim_host_bootstrap_mac.cc",
     "app_shim_host_bootstrap_mac.h",
     "app_shim_host_mac.cc",
diff --git a/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.cc b/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.cc
new file mode 100644
index 0000000..110fb69
--- /dev/null
+++ b/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.cc
@@ -0,0 +1,281 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h"
+
+#include "apps/launcher.h"
+#include "chrome/browser/apps/app_shim/app_shim_termination_manager.h"
+#include "chrome/browser/apps/launch_service/launch_service.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/extensions/launch_util.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/profiles/profiles_state.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/extensions/app_launch_params.h"
+#include "chrome/browser/ui/extensions/extension_enable_flow.h"
+#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
+#include "chrome/browser/ui/user_manager.h"
+#include "chrome/browser/web_applications/components/web_app_shortcut_mac.h"
+#include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h"
+#include "chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.h"
+#include "chrome/common/extensions/extension_constants.h"
+#include "chrome/common/extensions/extension_metrics.h"
+#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
+#include "extensions/browser/app_window/app_window.h"
+#include "extensions/browser/app_window/app_window_registry.h"
+#include "extensions/browser/app_window/native_app_window.h"
+#include "extensions/browser/extension_host.h"
+#include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/constants.h"
+
+using extensions::AppWindowRegistry;
+using extensions::Extension;
+using extensions::ExtensionRegistry;
+using extensions::NativeAppWindow;
+
+namespace apps {
+
+namespace {
+
+typedef AppWindowRegistry::AppWindowList AppWindowList;
+
+// Attempts to launch a packaged app, prompting the user to enable it if
+// necessary. The prompt is shown in its own window.
+// This class manages its own lifetime.
+class EnableViaPrompt : public ExtensionEnableFlowDelegate {
+ public:
+  EnableViaPrompt(Profile* profile,
+                  const std::string& extension_id,
+                  base::OnceCallback<void()> callback)
+      : profile_(profile),
+        extension_id_(extension_id),
+        callback_(std::move(callback)) {}
+
+  void Run() {
+    flow_.reset(new ExtensionEnableFlow(profile_, extension_id_, this));
+    flow_->Start();
+  }
+
+ private:
+  ~EnableViaPrompt() override { std::move(callback_).Run(); }
+
+  // ExtensionEnableFlowDelegate overrides.
+  void ExtensionEnableFlowFinished() override { delete this; }
+  void ExtensionEnableFlowAborted(bool user_initiated) override { delete this; }
+
+  Profile* profile_;
+  std::string extension_id_;
+  base::OnceCallback<void()> callback_;
+  std::unique_ptr<ExtensionEnableFlow> flow_;
+
+  DISALLOW_COPY_AND_ASSIGN(EnableViaPrompt);
+};
+
+const Extension* MaybeGetAppExtension(content::BrowserContext* context,
+                                      const std::string& extension_id) {
+  if (!context)
+    return nullptr;
+
+  ExtensionRegistry* registry = ExtensionRegistry::Get(context);
+  const Extension* extension =
+      registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
+  return extension &&
+                 (extension->is_platform_app() || extension->is_hosted_app())
+             ? extension
+             : nullptr;
+}
+
+}  // namespace
+
+AppShimHandlerDelegate::AppShimHandlerDelegate() = default;
+AppShimHandlerDelegate::~AppShimHandlerDelegate() = default;
+
+Profile* AppShimHandlerDelegate::ProfileForPath(
+    const base::FilePath& full_path) {
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  Profile* profile = profile_manager->GetProfileByPath(full_path);
+
+  // Use IsValidProfile to check if the profile has been created.
+  return profile && profile_manager->IsValidProfile(profile) ? profile
+                                                             : nullptr;
+}
+
+void AppShimHandlerDelegate::LoadProfileAsync(
+    const base::FilePath& full_path,
+    base::OnceCallback<void(Profile*)> callback) {
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  profile_manager->LoadProfileByPath(full_path, false, std::move(callback));
+}
+
+bool AppShimHandlerDelegate::IsProfileLockedForPath(
+    const base::FilePath& full_path) {
+  return profiles::IsProfileLocked(full_path);
+}
+
+bool AppShimHandlerDelegate::ShowAppWindows(Profile* profile,
+                                            const web_app::AppId& app_id) {
+  AppWindowList windows =
+      AppWindowRegistry::Get(profile)->GetAppWindowsForApp(app_id);
+  for (auto it = windows.rbegin(); it != windows.rend(); ++it) {
+    if (*it)
+      (*it)->GetBaseWindow()->Show();
+  }
+  return !windows.empty();
+}
+
+void AppShimHandlerDelegate::CloseAppWindows(Profile* profile,
+                                             const web_app::AppId& app_id) {
+  AppWindowList windows =
+      AppWindowRegistry::Get(profile)->GetAppWindowsForApp(app_id);
+  for (auto it = windows.begin(); it != windows.end(); ++it) {
+    if (*it)
+      (*it)->GetBaseWindow()->Close();
+  }
+}
+
+bool AppShimHandlerDelegate::AppIsInstalled(Profile* profile,
+                                            const web_app::AppId& app_id) {
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
+  return profile && extension;
+}
+
+bool AppShimHandlerDelegate::AppCanCreateHost(Profile* profile,
+                                              const web_app::AppId& app_id) {
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
+  if (!profile || !extension)
+    return false;
+  if (extension->is_hosted_app() &&
+      extensions::GetLaunchType(extensions::ExtensionPrefs::Get(profile),
+                                extension) == extensions::LAUNCH_TYPE_REGULAR) {
+    return false;
+  }
+  // Note that this will return true for non-hosted apps (e.g, Chrome Remote
+  // Desktop).
+  return true;
+}
+
+bool AppShimHandlerDelegate::AppIsMultiProfile(Profile* profile,
+                                               const web_app::AppId& app_id) {
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
+  if (!profile || !extension)
+    return false;
+  return extension->from_bookmark();
+}
+
+bool AppShimHandlerDelegate::AppUsesRemoteCocoa(Profile* profile,
+                                                const web_app::AppId& app_id) {
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
+  if (!profile || !extension)
+    return false;
+  return extension->is_hosted_app() && extension->from_bookmark();
+}
+
+std::unique_ptr<AppShimHost> AppShimHandlerDelegate::CreateHost(
+    AppShimHost::Client* client,
+    const base::FilePath& profile_path,
+    const web_app::AppId& app_id,
+    bool use_remote_cocoa) {
+  return std::make_unique<AppShimHost>(client, app_id, profile_path,
+                                       use_remote_cocoa);
+}
+
+void AppShimHandlerDelegate::EnableExtension(
+    Profile* profile,
+    const web_app::AppId& app_id,
+    base::OnceCallback<void()> callback) {
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
+  if (extension)
+    std::move(callback).Run();
+  else
+    (new EnableViaPrompt(profile, app_id, std::move(callback)))->Run();
+}
+
+void AppShimHandlerDelegate::LaunchApp(
+    Profile* profile,
+    const web_app::AppId& app_id,
+    const std::vector<base::FilePath>& files) {
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
+  DCHECK(extension);
+  extensions::RecordAppLaunchType(extension_misc::APP_LAUNCH_CMD_LINE_APP,
+                                  extension->GetType());
+  if (extension->is_hosted_app()) {
+    auto params = CreateAppLaunchParamsUserContainer(
+        profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+        apps::mojom::AppLaunchSource::kSourceCommandLine);
+    params.launch_files = files;
+    apps::LaunchService::Get(profile)->OpenApplication(params);
+    return;
+  }
+  if (files.empty()) {
+    apps::LaunchPlatformApp(profile, extension,
+                            extensions::AppLaunchSource::kSourceCommandLine);
+  } else {
+    for (std::vector<base::FilePath>::const_iterator it = files.begin();
+         it != files.end(); ++it) {
+      apps::LaunchPlatformAppWithPath(profile, extension, *it);
+    }
+  }
+}
+
+void AppShimHandlerDelegate::OpenAppURLInBrowserWindow(
+    const base::FilePath& profile_path,
+    const GURL& url) {
+  Profile* profile =
+      profile_path.empty() ? nullptr : ProfileForPath(profile_path);
+  if (!profile)
+    profile = g_browser_process->profile_manager()->GetLastUsedProfile();
+  if (!profile)
+    return;
+  Browser* browser =
+      new Browser(Browser::CreateParams(Browser::TYPE_NORMAL, profile, true));
+  browser->window()->Show();
+  NavigateParams params(browser, url, ui::PAGE_TRANSITION_AUTO_BOOKMARK);
+  params.tabstrip_add_types = TabStripModel::ADD_ACTIVE;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
+  Navigate(&params);
+}
+
+void AppShimHandlerDelegate::LaunchShim(
+    Profile* profile,
+    const web_app::AppId& app_id,
+    bool recreate_shims,
+    apps::ShimLaunchedCallback launched_callback,
+    apps::ShimTerminatedCallback terminated_callback) {
+  const Extension* extension = MaybeGetAppExtension(profile, app_id);
+  if (!extension) {
+    std::move(launched_callback).Run(base::Process());
+    return;
+  }
+
+  // Only force recreation of shims when RemoteViews is in use (that is, for
+  // PWAs). Otherwise, shims may be created unexpectedly.
+  // https://crbug.com/941160
+  if (recreate_shims && AppUsesRemoteCocoa(profile, app_id)) {
+    // Load the resources needed to build the app shim (icons, etc), and then
+    // recreate the shim and launch it.
+    web_app::GetShortcutInfoForApp(
+        extension, profile,
+        base::BindOnce(
+            &web_app::LaunchShim,
+            web_app::LaunchShimUpdateBehavior::RECREATE_UNCONDITIONALLY,
+            std::move(launched_callback), std::move(terminated_callback)));
+  } else {
+    web_app::LaunchShim(
+        web_app::LaunchShimUpdateBehavior::DO_NOT_RECREATE,
+        std::move(launched_callback), std::move(terminated_callback),
+        web_app::ShortcutInfoForExtensionAndProfile(extension, profile));
+  }
+}
+
+void AppShimHandlerDelegate::LaunchUserManager() {
+  UserManager::Show(base::FilePath(),
+                    profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
+}
+
+void AppShimHandlerDelegate::MaybeTerminate() {
+  apps::AppShimTerminationManager::Get()->MaybeTerminate();
+}
+
+}  // namespace apps
diff --git a/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h b/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h
new file mode 100644
index 0000000..6635f1f
--- /dev/null
+++ b/chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h
@@ -0,0 +1,98 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_HANDLER_DELEGATE_MAC_H_
+#define CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_HANDLER_DELEGATE_MAC_H_
+
+#include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h"
+
+namespace apps {
+
+class AppShimHandlerDelegate : public ExtensionAppShimHandler::Delegate {
+ public:
+  AppShimHandlerDelegate();
+  ~AppShimHandlerDelegate() override;
+
+  // Return the profile for |path|, only if it is already loaded.
+  Profile* ProfileForPath(const base::FilePath& path) override;
+
+  // Load a profile and call |callback| when completed or failed.
+  void LoadProfileAsync(const base::FilePath& path,
+                        base::OnceCallback<void(Profile*)> callback) override;
+
+  // Return true if the specified path is for a valid profile that is also
+  // locked.
+  bool IsProfileLockedForPath(const base::FilePath& path) override;
+
+  // Show all app windows (for non-PWA apps). Return true if there existed any
+  // windows.
+  bool ShowAppWindows(Profile* profile, const web_app::AppId& app_id) override;
+
+  // Close all app windows (for non-PWA apps).
+  void CloseAppWindows(Profile* profile, const web_app::AppId& app_id) override;
+
+  // Return true iff |app_id| corresponds to an app that is installed for
+  // |profile|.
+  bool AppIsInstalled(Profile* profile, const web_app::AppId& app_id) override;
+
+  // Return true iff the specified app can create an AppShimHost, which will
+  // keep the app shim process connected (as opposed to, e.g, a bookmark app
+  // that opens in a tab, which will immediately close).
+  bool AppCanCreateHost(Profile* profile,
+                        const web_app::AppId& app_id) override;
+
+  // Return true if Cocoa windows for this app should be hosted in the app
+  // shim process.
+  bool AppUsesRemoteCocoa(Profile* profile,
+                          const web_app::AppId& app_id) override;
+
+  // Return true if a single app shim is used for all profiles (as opposed to
+  // one shim per profile).
+  bool AppIsMultiProfile(Profile* profile,
+                         const web_app::AppId& app_id) override;
+
+  // Create an AppShimHost for the specified parameters (intercept-able for
+  // tests).
+  std::unique_ptr<AppShimHost> CreateHost(AppShimHost::Client* client,
+                                          const base::FilePath& profile_path,
+                                          const web_app::AppId& app_id,
+                                          bool use_remote_cocoa) override;
+
+  // Open a dialog to enable the specified extension. Call |callback| after
+  // the dialog is executed.
+  void EnableExtension(Profile* profile,
+                       const std::string& extension_id,
+                       base::OnceCallback<void()> callback) override;
+
+  // Launch the app in Chrome. This will (often) create a new window.
+  void LaunchApp(Profile* profile,
+                 const web_app::AppId& app_id,
+                 const std::vector<base::FilePath>& files) override;
+
+  // Open the specified URL in a new Chrome window. This is the fallback when
+  // an app shim exists, but there is no profile or extension for it. If
+  // |profile_path| is specified, then that profile is preferred, otherwise,
+  // the last used profile is used.
+  void OpenAppURLInBrowserWindow(const base::FilePath& profile_path,
+                                 const GURL& url) override;
+
+  // Launch the shim process for an app.
+  void LaunchShim(Profile* profile,
+                  const web_app::AppId& app_id,
+                  bool recreate_shims,
+                  ShimLaunchedCallback launched_callback,
+                  ShimTerminatedCallback terminated_callback) override;
+
+  // Launch the user manager (in response to attempting to access a locked
+  // profile).
+  void LaunchUserManager() override;
+
+  // Terminate Chrome if Chrome attempted to quit, but was prevented from
+  // quitting due to apps being open.
+  void MaybeTerminate() override;
+};
+
+}  // namespace apps
+
+#endif  // CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_HANDLER_DELEGATE_MAC_H_
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
index 40cd2ece..74849ce 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
@@ -12,10 +12,8 @@
 #include <utility>
 
 #include "apps/app_lifetime_monitor_factory.h"
-#include "apps/launcher.h"
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/hash/sha1.h"
 #include "base/logging.h"
@@ -23,16 +21,15 @@
 #include "base/mac/scoped_cftyperef.h"
 #include "base/macros.h"
 #include "base/stl_util.h"
+#include "chrome/browser/apps/app_shim/app_shim_handler_delegate_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_bootstrap_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_listener.h"
 #include "chrome/browser/apps/app_shim/app_shim_termination_manager.h"
-#include "chrome/browser/apps/launch_service/launch_service.h"
 #include "chrome/browser/apps/platform_apps/app_shim_registry_mac.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/extensions/launch_util.h"
 #include "chrome/browser/profiles/avatar_menu.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
@@ -40,44 +37,17 @@
 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/profiles/profile_window.h"
-#include "chrome/browser/profiles/profiles_state.h"
 #include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/extensions/app_launch_params.h"
-#include "chrome/browser/ui/extensions/extension_enable_flow.h"
-#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
-#include "chrome/browser/ui/user_manager.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_shortcut_mac.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.h"
-#include "chrome/common/chrome_features.h"
-#include "chrome/common/extensions/extension_constants.h"
-#include "chrome/common/extensions/extension_metrics.h"
-#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "components/crx_file/id_util.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_source.h"
-#include "extensions/browser/app_window/app_window.h"
-#include "extensions/browser/app_window/app_window_registry.h"
-#include "extensions/browser/app_window/native_app_window.h"
-#include "extensions/browser/extension_host.h"
-#include "extensions/browser/extension_prefs.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/common/constants.h"
-#include "ui/base/cocoa/focus_window_set.h"
-
-using extensions::AppWindowRegistry;
-using extensions::Extension;
-using extensions::ExtensionRegistry;
-using extensions::NativeAppWindow;
 
 namespace {
 
-typedef AppWindowRegistry::AppWindowList AppWindowList;
-
 // Create a SHA1 hex digest of a certificate, for use specifically in building
 // a code signing requirement string in IsAcceptablyCodeSigned(), below.
 std::string CertificateSHA1Digest(SecCertificateRef certificate) {
@@ -161,61 +131,11 @@
                               shim_requirement) == errSecSuccess;
 }
 
-// Attempts to launch a packaged app, prompting the user to enable it if
-// necessary. The prompt is shown in its own window.
-// This class manages its own lifetime.
-class EnableViaPrompt : public ExtensionEnableFlowDelegate {
- public:
-  EnableViaPrompt(Profile* profile,
-                  const std::string& extension_id,
-                  base::OnceCallback<void()> callback)
-      : profile_(profile),
-        extension_id_(extension_id),
-        callback_(std::move(callback)) {}
-
-  void Run() {
-    flow_.reset(new ExtensionEnableFlow(profile_, extension_id_, this));
-    flow_->Start();
-  }
-
- private:
-  ~EnableViaPrompt() override { std::move(callback_).Run(); }
-
-  // ExtensionEnableFlowDelegate overrides.
-  void ExtensionEnableFlowFinished() override {
-    delete this;
-  }
-  void ExtensionEnableFlowAborted(bool user_initiated) override {
-    delete this;
-  }
-
-  Profile* profile_;
-  std::string extension_id_;
-  base::OnceCallback<void()> callback_;
-  std::unique_ptr<ExtensionEnableFlow> flow_;
-
-  DISALLOW_COPY_AND_ASSIGN(EnableViaPrompt);
-};
-
 bool ProfileMenuItemComparator(const chrome::mojom::ProfileMenuItemPtr& a,
                                const chrome::mojom::ProfileMenuItemPtr& b) {
   return a->menu_index < b->menu_index;
 }
 
-const Extension* MaybeGetAppExtension(content::BrowserContext* context,
-                                      const std::string& extension_id) {
-  if (!context)
-    return nullptr;
-
-  ExtensionRegistry* registry = ExtensionRegistry::Get(context);
-  const Extension* extension =
-      registry->GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
-  return extension &&
-                 (extension->is_platform_app() || extension->is_hosted_app())
-             ? extension
-             : nullptr;
-}
-
 }  // namespace
 
 namespace apps {
@@ -245,7 +165,7 @@
 // The state for an individual app. This includes the state for all
 // profiles that are using the app.
 struct ExtensionAppShimHandler::AppState {
-  AppState(const std::string& app_id,
+  AppState(const web_app::AppId& app_id,
            std::unique_ptr<AppShimHost> multi_profile_host)
       : app_id(app_id), multi_profile_host(std::move(multi_profile_host)) {}
   ~AppState() = default;
@@ -299,200 +219,8 @@
   AppShimRegistry::Get()->OnAppQuit(app_id, last_active_profile_paths);
 }
 
-Profile* ExtensionAppShimHandler::Delegate::ProfileForPath(
-    const base::FilePath& full_path) {
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  Profile* profile = profile_manager->GetProfileByPath(full_path);
-
-  // Use IsValidProfile to check if the profile has been created.
-  return profile && profile_manager->IsValidProfile(profile) ? profile : NULL;
-}
-
-void ExtensionAppShimHandler::Delegate::LoadProfileAsync(
-    const base::FilePath& full_path,
-    base::OnceCallback<void(Profile*)> callback) {
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  profile_manager->LoadProfileByPath(full_path, false, std::move(callback));
-}
-
-bool ExtensionAppShimHandler::Delegate::IsProfileLockedForPath(
-    const base::FilePath& full_path) {
-  return profiles::IsProfileLocked(full_path);
-}
-
-bool ExtensionAppShimHandler::Delegate::ShowAppWindows(
-    Profile* profile,
-    const std::string& app_id) {
-  AppWindowList windows =
-      AppWindowRegistry::Get(profile)->GetAppWindowsForApp(app_id);
-  for (auto it = windows.rbegin(); it != windows.rend(); ++it) {
-    if (*it)
-      (*it)->GetBaseWindow()->Show();
-  }
-  return !windows.empty();
-}
-
-void ExtensionAppShimHandler::Delegate::CloseAppWindows(
-    Profile* profile,
-    const std::string& app_id) {
-  AppWindowList windows =
-      AppWindowRegistry::Get(profile)->GetAppWindowsForApp(app_id);
-  for (auto it = windows.begin(); it != windows.end(); ++it) {
-    if (*it)
-      (*it)->GetBaseWindow()->Close();
-  }
-}
-
-bool ExtensionAppShimHandler::Delegate::AppIsInstalled(
-    Profile* profile,
-    const std::string& app_id) {
-  const Extension* extension = MaybeGetAppExtension(profile, app_id);
-  return profile && extension;
-}
-
-bool ExtensionAppShimHandler::Delegate::AppCanCreateHost(
-    Profile* profile,
-    const std::string& app_id) {
-  const Extension* extension = MaybeGetAppExtension(profile, app_id);
-  if (!profile || !extension)
-    return false;
-  if (extension->is_hosted_app() &&
-      extensions::GetLaunchType(extensions::ExtensionPrefs::Get(profile),
-                                extension) == extensions::LAUNCH_TYPE_REGULAR) {
-    return false;
-  }
-  // Note that this will return true for non-hosted apps (e.g, Chrome Remote
-  // Desktop).
-  return true;
-}
-
-bool ExtensionAppShimHandler::Delegate::AppIsMultiProfile(
-    Profile* profile,
-    const std::string& app_id) {
-  const Extension* extension = MaybeGetAppExtension(profile, app_id);
-  if (!profile || !extension)
-    return false;
-  return extension->from_bookmark();
-}
-
-bool ExtensionAppShimHandler::Delegate::AppUsesRemoteCocoa(
-    Profile* profile,
-    const std::string& app_id) {
-  const Extension* extension = MaybeGetAppExtension(profile, app_id);
-  if (!profile || !extension)
-    return false;
-  return extension->is_hosted_app() && extension->from_bookmark();
-}
-
-std::unique_ptr<AppShimHost> ExtensionAppShimHandler::Delegate::CreateHost(
-    AppShimHost::Client* client,
-    const base::FilePath& profile_path,
-    const std::string& app_id,
-    bool use_remote_cocoa) {
-  return std::make_unique<AppShimHost>(client, app_id, profile_path,
-                                       use_remote_cocoa);
-}
-
-void ExtensionAppShimHandler::Delegate::EnableExtension(
-    Profile* profile,
-    const std::string& app_id,
-    base::OnceCallback<void()> callback) {
-  const Extension* extension = MaybeGetAppExtension(profile, app_id);
-  if (extension)
-    std::move(callback).Run();
-  else
-    (new EnableViaPrompt(profile, app_id, std::move(callback)))->Run();
-}
-
-void ExtensionAppShimHandler::Delegate::LaunchApp(
-    Profile* profile,
-    const std::string& app_id,
-    const std::vector<base::FilePath>& files) {
-  const Extension* extension = MaybeGetAppExtension(profile, app_id);
-  DCHECK(extension);
-  extensions::RecordAppLaunchType(
-      extension_misc::APP_LAUNCH_CMD_LINE_APP, extension->GetType());
-  if (extension->is_hosted_app()) {
-    auto params = CreateAppLaunchParamsUserContainer(
-        profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB,
-        apps::mojom::AppLaunchSource::kSourceCommandLine);
-    params.launch_files = files;
-    apps::LaunchService::Get(profile)->OpenApplication(params);
-    return;
-  }
-  if (files.empty()) {
-    apps::LaunchPlatformApp(profile, extension,
-                            extensions::AppLaunchSource::kSourceCommandLine);
-  } else {
-    for (std::vector<base::FilePath>::const_iterator it = files.begin();
-         it != files.end(); ++it) {
-      apps::LaunchPlatformAppWithPath(profile, extension, *it);
-    }
-  }
-}
-
-void ExtensionAppShimHandler::Delegate::OpenAppURLInBrowserWindow(
-    const base::FilePath& profile_path,
-    const GURL& url) {
-  Profile* profile =
-      profile_path.empty() ? nullptr : ProfileForPath(profile_path);
-  if (!profile)
-    profile = g_browser_process->profile_manager()->GetLastUsedProfile();
-  if (!profile)
-    return;
-  Browser* browser =
-      new Browser(Browser::CreateParams(Browser::TYPE_NORMAL, profile, true));
-  browser->window()->Show();
-  NavigateParams params(browser, url, ui::PAGE_TRANSITION_AUTO_BOOKMARK);
-  params.tabstrip_add_types = TabStripModel::ADD_ACTIVE;
-  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
-  Navigate(&params);
-}
-
-void ExtensionAppShimHandler::Delegate::LaunchShim(
-    Profile* profile,
-    const std::string& app_id,
-    bool recreate_shims,
-    apps::ShimLaunchedCallback launched_callback,
-    apps::ShimTerminatedCallback terminated_callback) {
-  const Extension* extension = MaybeGetAppExtension(profile, app_id);
-  if (!extension) {
-    std::move(launched_callback).Run(base::Process());
-    return;
-  }
-
-  // Only force recreation of shims when RemoteViews is in use (that is, for
-  // PWAs). Otherwise, shims may be created unexpectedly.
-  // https://crbug.com/941160
-  if (recreate_shims && AppUsesRemoteCocoa(profile, app_id)) {
-    // Load the resources needed to build the app shim (icons, etc), and then
-    // recreate the shim and launch it.
-    web_app::GetShortcutInfoForApp(
-        extension, profile,
-        base::BindOnce(
-            &web_app::LaunchShim,
-            web_app::LaunchShimUpdateBehavior::RECREATE_UNCONDITIONALLY,
-            std::move(launched_callback), std::move(terminated_callback)));
-  } else {
-    web_app::LaunchShim(
-        web_app::LaunchShimUpdateBehavior::DO_NOT_RECREATE,
-        std::move(launched_callback), std::move(terminated_callback),
-        web_app::ShortcutInfoForExtensionAndProfile(extension, profile));
-  }
-}
-
-void ExtensionAppShimHandler::Delegate::LaunchUserManager() {
-  UserManager::Show(base::FilePath(),
-                    profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION);
-}
-
-void ExtensionAppShimHandler::Delegate::MaybeTerminate() {
-  apps::AppShimTerminationManager::Get()->MaybeTerminate();
-}
-
 ExtensionAppShimHandler::ExtensionAppShimHandler()
-    : delegate_(new Delegate),
-      weak_factory_(this) {
+    : delegate_(new AppShimHandlerDelegate), weak_factory_(this) {
   // This is instantiated in BrowserProcessImpl::PreMainMessageLoopRun with
   // AppShimListener. Since PROFILE_CREATED is not fired until
   // ProfileManager::GetLastUsedProfile/GetLastOpenedProfiles, this should catch
@@ -509,7 +237,7 @@
 }
 
 AppShimHost* ExtensionAppShimHandler::FindHost(Profile* profile,
-                                               const std::string& app_id) {
+                                               const web_app::AppId& app_id) {
   auto found_app = apps_.find(app_id);
   if (found_app == apps_.end())
     return nullptr;
@@ -573,7 +301,7 @@
 
 void ExtensionAppShimHandler::OnShimProcessConnectedForRegisterOnly(
     std::unique_ptr<AppShimHostBootstrap> bootstrap) {
-  const std::string& app_id = bootstrap->GetAppId();
+  const web_app::AppId& app_id = bootstrap->GetAppId();
   DCHECK_EQ(bootstrap->GetLaunchType(),
             chrome::mojom::AppShimLaunchType::kRegisterOnly);
 
@@ -612,7 +340,7 @@
 
 void ExtensionAppShimHandler::OnShimProcessConnectedForLaunch(
     std::unique_ptr<AppShimHostBootstrap> bootstrap) {
-  const std::string& app_id = bootstrap->GetAppId();
+  const web_app::AppId& app_id = bootstrap->GetAppId();
   DCHECK_EQ(bootstrap->GetLaunchType(),
             chrome::mojom::AppShimLaunchType::kNormal);
 
@@ -816,7 +544,7 @@
 }
 
 void ExtensionAppShimHandler::CloseShimForApp(Profile* profile,
-                                              const std::string& app_id) {
+                                              const web_app::AppId& app_id) {
   auto found_app = apps_.find(app_id);
   if (found_app == apps_.end())
     return;
@@ -834,7 +562,7 @@
 
 void ExtensionAppShimHandler::LoadProfileAndApp(
     const base::FilePath& profile_path,
-    const std::string& app_id,
+    const web_app::AppId& app_id,
     LoadProfileAppCallback callback) {
   Profile* profile = delegate_->ProfileForPath(profile_path);
   if (profile) {
@@ -849,7 +577,7 @@
 
 void ExtensionAppShimHandler::OnProfileLoaded(
     const base::FilePath& profile_path,
-    const std::string& app_id,
+    const web_app::AppId& app_id,
     LoadProfileAppCallback callback,
     Profile* profile) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -878,7 +606,7 @@
 }
 
 void ExtensionAppShimHandler::OnAppEnabled(const base::FilePath& profile_path,
-                                           const std::string& app_id,
+                                           const web_app::AppId& app_id,
                                            LoadProfileAppCallback callback) {
   std::move(callback).Run(delegate_->ProfileForPath(profile_path));
 }
@@ -975,7 +703,7 @@
 }
 
 void ExtensionAppShimHandler::OnShimSelectedProfileAndAppLoaded(
-    const std::string& app_id,
+    const web_app::AppId& app_id,
     Profile* profile) {
   if (!delegate_->AppIsInstalled(profile, app_id))
     return;
@@ -1162,7 +890,7 @@
 
 ExtensionAppShimHandler::ProfileState*
 ExtensionAppShimHandler::GetOrCreateProfileState(Profile* profile,
-                                                 const std::string& app_id) {
+                                                 const web_app::AppId& app_id) {
   if (web_app::AppShimLaunchDisabled())
     return nullptr;
 
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
index 9f51238..eee2568b 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
@@ -20,6 +20,7 @@
 #include "chrome/browser/profiles/avatar_menu_observer.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list_observer.h"
+#include "chrome/browser/web_applications/components/web_app_id.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 
@@ -46,84 +47,90 @@
  public:
   class Delegate {
    public:
-    virtual ~Delegate() {}
+    virtual ~Delegate() = default;
 
     // Return the profile for |path|, only if it is already loaded.
-    virtual Profile* ProfileForPath(const base::FilePath& path);
+    virtual Profile* ProfileForPath(const base::FilePath& path) = 0;
 
     // Load a profile and call |callback| when completed or failed.
-    virtual void LoadProfileAsync(const base::FilePath& path,
-                                  base::OnceCallback<void(Profile*)> callback);
+    virtual void LoadProfileAsync(
+        const base::FilePath& path,
+        base::OnceCallback<void(Profile*)> callback) = 0;
 
     // Return true if the specified path is for a valid profile that is also
     // locked.
-    virtual bool IsProfileLockedForPath(const base::FilePath& path);
+    virtual bool IsProfileLockedForPath(const base::FilePath& path) = 0;
 
     // Show all app windows (for non-PWA apps). Return true if there existed any
     // windows.
-    virtual bool ShowAppWindows(Profile* profile, const std::string& app_id);
+    virtual bool ShowAppWindows(Profile* profile,
+                                const web_app::AppId& app_id) = 0;
 
     // Close all app windows (for non-PWA apps).
-    virtual void CloseAppWindows(Profile* profile, const std::string& app_id);
+    virtual void CloseAppWindows(Profile* profile,
+                                 const web_app::AppId& app_id) = 0;
 
     // Return true iff |app_id| corresponds to an app that is installed for
     // |profile|.
-    virtual bool AppIsInstalled(Profile* profile, const std::string& app_id);
+    virtual bool AppIsInstalled(Profile* profile,
+                                const web_app::AppId& app_id) = 0;
 
     // Return true iff the specified app can create an AppShimHost, which will
     // keep the app shim process connected (as opposed to, e.g, a bookmark app
     // that opens in a tab, which will immediately close).
-    virtual bool AppCanCreateHost(Profile* profile, const std::string& app_id);
+    virtual bool AppCanCreateHost(Profile* profile,
+                                  const web_app::AppId& app_id) = 0;
 
     // Return true if Cocoa windows for this app should be hosted in the app
     // shim process.
     virtual bool AppUsesRemoteCocoa(Profile* profile,
-                                    const std::string& app_id);
+                                    const web_app::AppId& app_id) = 0;
 
     // Return true if a single app shim is used for all profiles (as opposed to
     // one shim per profile).
-    virtual bool AppIsMultiProfile(Profile* profile, const std::string& app_id);
+    virtual bool AppIsMultiProfile(Profile* profile,
+                                   const web_app::AppId& app_id) = 0;
 
     // Create an AppShimHost for the specified parameters (intercept-able for
     // tests).
     virtual std::unique_ptr<AppShimHost> CreateHost(
         AppShimHost::Client* client,
         const base::FilePath& profile_path,
-        const std::string& app_id,
-        bool use_remote_cocoa);
+        const web_app::AppId& app_id,
+        bool use_remote_cocoa) = 0;
 
     // Open a dialog to enable the specified extension. Call |callback| after
     // the dialog is executed.
     virtual void EnableExtension(Profile* profile,
                                  const std::string& extension_id,
-                                 base::OnceCallback<void()> callback);
+                                 base::OnceCallback<void()> callback) = 0;
 
     // Launch the app in Chrome. This will (often) create a new window.
     virtual void LaunchApp(Profile* profile,
-                           const std::string& app_id,
-                           const std::vector<base::FilePath>& files);
+                           const web_app::AppId& app_id,
+                           const std::vector<base::FilePath>& files) = 0;
 
     // Open the specified URL in a new Chrome window. This is the fallback when
     // an app shim exists, but there is no profile or extension for it. If
     // |profile_path| is specified, then that profile is preferred, otherwise,
     // the last used profile is used.
     virtual void OpenAppURLInBrowserWindow(const base::FilePath& profile_path,
-                                           const GURL& url);
+                                           const GURL& url) = 0;
 
     // Launch the shim process for an app.
     virtual void LaunchShim(Profile* profile,
-                            const std::string& app_id,
+                            const web_app::AppId& app_id,
                             bool recreate_shims,
                             ShimLaunchedCallback launched_callback,
-                            ShimTerminatedCallback terminated_callback);
+                            ShimTerminatedCallback terminated_callback) = 0;
 
     // Launch the user manager (in response to attempting to access a locked
     // profile).
-    virtual void LaunchUserManager();
+    virtual void LaunchUserManager() = 0;
 
     // Terminate Chrome if Chrome attempted to quit, but was prevented from
     // quitting due to apps being open.
-    virtual void MaybeTerminate();
+    virtual void MaybeTerminate() = 0;
   };
 
   // Helper function to get the instance on the browser process. This will be
@@ -135,7 +142,7 @@
 
   // Get the host corresponding to a profile and app id, or null if there is
   // none.
-  AppShimHost* FindHost(Profile* profile, const std::string& app_id);
+  AppShimHost* FindHost(Profile* profile, const web_app::AppId& app_id);
 
   // If the specified |browser| should be using RemoteCocoa (because it is a
   // bookmark app), then get or create an AppShimHost for it, and return
@@ -213,7 +220,7 @@
   void CloseShimsForProfile(Profile* profile);
 
   // Close one specified app.
-  void CloseShimForApp(Profile* profile, const std::string& app_id);
+  void CloseShimForApp(Profile* profile, const web_app::AppId& app_id);
 
   // This is called by OnShimProcessConnected if the app shim was launched by
   // Chrome, and should connect to an already-existing AppShimHost.
@@ -243,21 +250,21 @@
       std::unique_ptr<AppShimHostBootstrap> bootstrap);
 
   // Continuation of OnShimSelectedProfile, once the profile has loaded.
-  void OnShimSelectedProfileAndAppLoaded(const std::string& app_id,
+  void OnShimSelectedProfileAndAppLoaded(const web_app::AppId& app_id,
                                          Profile* profile);
 
   // Load the specified profile and extension, and run |callback| with
   // the result. The callback's arguments may be nullptr on failure.
   using LoadProfileAppCallback = base::OnceCallback<void(Profile*)>;
   void LoadProfileAndApp(const base::FilePath& profile_path,
-                         const std::string& app_id,
+                         const web_app::AppId& app_id,
                          LoadProfileAppCallback callback);
   void OnProfileLoaded(const base::FilePath& profile_path,
-                       const std::string& app_id,
+                       const web_app::AppId& app_id,
                        LoadProfileAppCallback callback,
                        Profile* profile);
   void OnAppEnabled(const base::FilePath& profile_path,
-                    const std::string& app_id,
+                    const web_app::AppId& app_id,
                     LoadProfileAppCallback callback);
 
   // Update the profiles menu for the specified host.
@@ -268,7 +275,7 @@
   // Retrieve the ProfileState for a given (Profile, AppId) pair. If one
   // does not exist, create one.
   ProfileState* GetOrCreateProfileState(Profile* profile,
-                                        const std::string& app_id);
+                                        const web_app::AppId& app_id);
 
   // Map from extension id to the state for that app.
   std::map<std::string, std::unique_ptr<AppState>> apps_;
diff --git a/chrome/browser/chromeos/attestation/platform_verification_dialog.cc b/chrome/browser/chromeos/attestation/platform_verification_dialog.cc
index 85e9173..3b78f5f4 100644
--- a/chrome/browser/chromeos/attestation/platform_verification_dialog.cc
+++ b/chrome/browser/chromeos/attestation/platform_verification_dialog.cc
@@ -93,9 +93,9 @@
     : content::WebContentsObserver(web_contents),
       domain_(domain),
       callback_(std::move(callback)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_PERMISSION_DENY));
   learn_more_button_ =
       DialogDelegate::SetExtraView(CreateLearnMoreButton(this));
@@ -109,11 +109,11 @@
     std::move(dialog->callback_).Run(response);
   };
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       run_callback, base::Unretained(this), CONSENT_RESPONSE_ALLOW));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       run_callback, base::Unretained(this), CONSENT_RESPONSE_DENY));
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       run_callback, base::Unretained(this), CONSENT_RESPONSE_NONE));
 
   // Explanation string.
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
index 42c7c72..9b68bc60 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
@@ -98,6 +98,18 @@
   registry_->SaveAppActivity();
 }
 
+AppActivityRegistry::SystemNotification::SystemNotification(
+    base::Optional<base::TimeDelta> app_time_limit,
+    AppNotification app_notification)
+    : time_limit(app_time_limit), notification(app_notification) {}
+
+AppActivityRegistry::SystemNotification::SystemNotification(
+    const SystemNotification&) = default;
+
+AppActivityRegistry::SystemNotification&
+AppActivityRegistry::SystemNotification::operator=(const SystemNotification&) =
+    default;
+
 AppActivityRegistry::AppDetails::AppDetails() = default;
 
 AppActivityRegistry::AppDetails::AppDetails(const AppActivity& activity)
@@ -181,8 +193,14 @@
   // sessions and app service does not. Make sure not to override cached state.
   if (!base::Contains(activity_registry_, app_id)) {
     Add(app_id);
-  } else if (GetAppState(app_id) == AppState::kLimitReached) {
-    NotifyLimitReached(app_id, /* was_active */ false);
+  } else {
+    activity_registry_.at(app_id).received_app_installed_ = true;
+
+    // First send the system notifications for the application.
+    SendSystemNotificationsForApp(app_id);
+
+    if (GetAppState(app_id) == AppState::kLimitReached)
+      NotifyLimitReached(app_id, /* was_active */ false);
   }
 }
 
@@ -360,11 +378,27 @@
   return limit->daily_limit();
 }
 
+void AppActivityRegistry::SetReportingEnabled(base::Optional<bool> value) {
+  if (value.has_value())
+    activity_reporting_enabled_ = value.value();
+}
+
 AppActivityReportInterface::ReportParams
 AppActivityRegistry::GenerateAppActivityReport(
     enterprise_management::ChildStatusReportRequest* report) {
+  // Calling SaveAppActivity is beneficial even if this method is returning
+  // early due to reporting not being enabled. This is because it helps move the
+  // ActiveTimes information from AppActivityRegistry to the stored pref data
+  // which will then be cleaned in the direct CleanRegistry() call below.
   SaveAppActivity();
 
+  // If app activity reporting is not enabled, simply return.
+  if (!activity_reporting_enabled_) {
+    base::Time timestamp = base::Time::Now();
+    CleanRegistry(timestamp);
+    return AppActivityReportInterface::ReportParams{timestamp, false};
+  }
+
   PrefService* pref_service = profile_->GetPrefs();
   const base::Value* value =
       pref_service->GetList(prefs::kPerAppTimeLimitsAppActivities);
@@ -672,6 +706,7 @@
 
 void AppActivityRegistry::Add(const AppId& app_id) {
   activity_registry_[app_id].activity = AppActivity(AppState::kAvailable);
+  activity_registry_[app_id].received_app_installed_ = true;
   newly_installed_apps_.push_back(app_id);
   for (auto& observer : app_state_observers_)
     observer.OnAppInstalled(app_id);
@@ -859,34 +894,31 @@
 
   if (time_left <= kFiveMinutes && time_left > kOneMinute &&
       last_notification != AppNotification::kFiveMinutes) {
-    notification_delegate_->ShowAppTimeLimitNotification(
-        app_id, time_limit, AppNotification::kFiveMinutes);
-    details.activity.set_last_notification(AppNotification::kFiveMinutes);
+    MaybeShowSystemNotification(
+        app_id, SystemNotification(time_limit, AppNotification::kFiveMinutes));
     ScheduleTimeLimitCheckForApp(app_id);
     return;
   }
 
   if (time_left <= kOneMinute && time_left > kZeroMinutes &&
       last_notification != AppNotification::kOneMinute) {
-    notification_delegate_->ShowAppTimeLimitNotification(
-        app_id, time_limit, AppNotification::kOneMinute);
-    details.activity.set_last_notification(AppNotification::kOneMinute);
+    MaybeShowSystemNotification(
+        app_id, SystemNotification(time_limit, AppNotification::kOneMinute));
     ScheduleTimeLimitCheckForApp(app_id);
     return;
   }
 
   if (time_left == kZeroMinutes &&
       last_notification != AppNotification::kTimeLimitReached) {
-    details.activity.set_last_notification(AppNotification::kTimeLimitReached);
+    MaybeShowSystemNotification(
+        app_id,
+        SystemNotification(time_limit, AppNotification::kTimeLimitReached));
 
     if (ContributesToWebTimeLimit(app_id, GetAppState(app_id))) {
       WebTimeLimitReached(base::Time::Now());
     } else {
       SetAppState(app_id, AppState::kLimitReached);
     }
-
-    notification_delegate_->ShowAppTimeLimitNotification(
-        app_id, time_limit, AppNotification::kTimeLimitReached);
   }
 }
 
@@ -910,16 +942,18 @@
 
   // Time limit was removed.
   if (!has_time_limit && had_time_limit) {
-    notification_delegate_->ShowAppTimeLimitNotification(
-        app_id, base::nullopt, AppNotification::kTimeLimitChanged);
+    MaybeShowSystemNotification(
+        app_id,
+        SystemNotification(base::nullopt, AppNotification::kTimeLimitChanged));
     return true;
   }
 
   // Time limit was set or value changed.
   if (has_time_limit && (!had_time_limit || old_limit->daily_limit() !=
                                                 new_limit->daily_limit())) {
-    notification_delegate_->ShowAppTimeLimitNotification(
-        app_id, new_limit->daily_limit(), AppNotification::kTimeLimitChanged);
+    MaybeShowSystemNotification(
+        app_id, SystemNotification(new_limit->daily_limit(),
+                                   AppNotification::kTimeLimitChanged));
     return true;
   }
 
@@ -1007,9 +1041,15 @@
   // |timestamp|.
   details.activity.CaptureOngoingActivity(timestamp);
 
+  std::vector<AppActivity::ActiveTime> activity =
+      details.activity.TakeActiveTimes();
+
+  // If reporting is not enabled, don't save unnecessary data.
+  if (!activity_reporting_enabled_)
+    activity.clear();
+
   return PersistedAppInfo(app_id, details.activity.app_state(),
-                          running_active_time,
-                          details.activity.TakeActiveTimes());
+                          running_active_time, std::move(activity));
 }
 
 bool AppActivityRegistry::ShouldCleanUpStoredPref() {
@@ -1025,5 +1065,41 @@
   return time < base::Time::Now() - base::TimeDelta::FromDays(30);
 }
 
+void AppActivityRegistry::SendSystemNotificationsForApp(const AppId& app_id) {
+  DCHECK(base::Contains(activity_registry_, app_id));
+
+  AppDetails& app_details = activity_registry_.at(app_id);
+  DCHECK(app_details.received_app_installed_);
+
+  // TODO(yilkal): Filter out the notifications to show. For example don't show
+  // 5 min and 1 min left notifications at the same time here. However, time
+  // limit changed and 1 min left notifications can be shown at the same time.
+  for (const auto& elem : app_details.pending_notifications_) {
+    notification_delegate_->ShowAppTimeLimitNotification(
+        app_id, elem.time_limit, elem.notification);
+  }
+  app_details.pending_notifications_.clear();
+}
+
+void AppActivityRegistry::MaybeShowSystemNotification(
+    const AppId& app_id,
+    const SystemNotification& notification) {
+  DCHECK(base::Contains(activity_registry_, app_id));
+
+  AppDetails& app_details = activity_registry_.at(app_id);
+  app_details.activity.set_last_notification(notification.notification);
+
+  // AppActivityRegistry has not yet received OnAppInstalled call from
+  // AppService. Add notification to |AppDetails::pending_notifications_|.
+  if (!app_details.received_app_installed_) {
+    app_details.pending_notifications_.push_back(notification);
+    return;
+  }
+
+  // Otherwise, just show the notification.
+  notification_delegate_->ShowAppTimeLimitNotification(
+      app_id, notification.time_limit, notification.notification);
+}
+
 }  // namespace app_time
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
index b2bccbbe..e6a34720 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
@@ -131,6 +131,9 @@
   // Will return nullopt if there is no limit set.
   base::Optional<base::TimeDelta> GetTimeLimit(const AppId& app_id) const;
 
+  // Reporting enablement is set if |enabled| has value.
+  void SetReportingEnabled(base::Optional<bool> enabled);
+
   // Populates |report| with collected app activity. Returns whether any data
   // were reported.
   AppActivityReportInterface::ReportParams GenerateAppActivityReport(
@@ -170,6 +173,15 @@
       AppRestriction restriction) const;
 
  private:
+  struct SystemNotification {
+    SystemNotification(base::Optional<base::TimeDelta> app_time_limit,
+                       AppNotification app_notification);
+    SystemNotification(const SystemNotification&);
+    SystemNotification& operator=(const SystemNotification&);
+    base::Optional<base::TimeDelta> time_limit = base::nullopt;
+    AppNotification notification = AppNotification::kUnknown;
+  };
+
   // Bundles detailed data stored for a specific app.
   struct AppDetails {
     AppDetails();
@@ -204,6 +216,16 @@
     // Timer set up for when the app time limit is expected to be reached and
     // preceding notifications.
     std::unique_ptr<base::OneShotTimer> app_limit_timer;
+
+    // Boolean to specify if OnAppInstalled call has been received for this
+    // particular application.
+    bool received_app_installed_ = false;
+
+    // At the beginning of a session, we may want to send system notifications
+    // for applications. This may happen if there is an update in
+    // PerAppTimeLimits policy while the user was logged out. In these
+    // scenarios, we have to wait until the application is installed.
+    std::vector<SystemNotification> pending_notifications_;
   };
 
   // Removes data older than |timestamp| from the registry.
@@ -261,6 +283,13 @@
   // from base::Time::Now();
   bool ShouldCleanUpStoredPref();
 
+  // Sends system notification for the application.
+  void SendSystemNotificationsForApp(const AppId& app_id);
+
+  // Shows notification or queues it to be shown later.
+  void MaybeShowSystemNotification(const AppId& app_id,
+                                   const SystemNotification& notification);
+
   Profile* const profile_;
 
   // Owned by AppTimeController.
@@ -283,6 +312,9 @@
 
   // This records the timestamp of the latest set app limit.
   base::Time latest_app_limit_update_;
+
+  // Boolean to capture if app activity data reporting is enabled.
+  bool activity_reporting_enabled_ = true;
 };
 
 }  // namespace app_time
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
index 9aa63d8b..6b6059f9 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
@@ -874,6 +874,9 @@
   // Reinitialized the registry. We don't expect redundant time limit updatese
   // will result in notifications.
   ReInitializeRegistry();
+  registry().OnAppInstalled(GetChromeAppId());
+  registry().OnAppInstalled(kApp1);
+  registry().OnAppInstalled(kApp2);
 
   EXPECT_CALL(notification_delegate_mock(),
               ShowAppTimeLimitNotification(
@@ -908,6 +911,38 @@
   registry().UpdateAppLimits(app_limits);
 }
 
+TEST_F(AppActivityRegistryTest, NoNotification) {
+  AppLimit app1_limit(AppRestriction::kTimeLimit,
+                      base::TimeDelta::FromMinutes(30), base::Time::Now());
+  std::map<AppId, AppLimit> app_limits = {{kApp1, app1_limit}};
+
+  EXPECT_CALL(notification_delegate_mock(),
+              ShowAppTimeLimitNotification(
+                  kApp1, app1_limit.daily_limit(),
+                  chromeos::app_time::AppNotification::kTimeLimitChanged))
+      .Times(0);
+  registry().SaveAppActivity();
+  ReInitializeRegistry();
+  registry().UpdateAppLimits(app_limits);
+}
+
+TEST_F(AppActivityRegistryTest, NotificationAfterAppInstall) {
+  AppLimit app1_limit(AppRestriction::kTimeLimit,
+                      base::TimeDelta::FromMinutes(30), base::Time::Now());
+  std::map<AppId, AppLimit> app_limits = {{kApp1, app1_limit}};
+
+  EXPECT_CALL(notification_delegate_mock(),
+              ShowAppTimeLimitNotification(
+                  kApp1, app1_limit.daily_limit(),
+                  chromeos::app_time::AppNotification::kTimeLimitChanged))
+      .Times(1);
+
+  registry().SaveAppActivity();
+  ReInitializeRegistry();
+  registry().UpdateAppLimits(app_limits);
+  registry().OnAppInstalled(kApp1);
+}
+
 TEST_F(AppActivityRegistryTest, AvoidRedundantCallsToPauseApp) {
   AppStateObserverMock state_observer_mock;
   registry().AddAppStateObserver(&state_observer_mock);
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
index a1d5366..6ab3239 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
@@ -341,10 +341,12 @@
     LOG(WARNING) << "Invalid PerAppTimeLimits policy.";
     return;
   }
-
   bool updated =
       app_registry_->UpdateAppLimits(policy::AppLimitsFromDict(*policy));
 
+  app_registry_->SetReportingEnabled(
+      policy::ActivityReportingEnabledFromDict(*policy));
+
   base::Optional<base::TimeDelta> new_reset_time =
       policy::ResetTimeFromDict(*policy);
   // TODO(agawronska): Propagate the information about reset time change.
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc
index ff2a2a5..58ea259e 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc
@@ -13,6 +13,7 @@
   value_.SetKey(policy::kAppLimitsArray, base::Value(base::Value::Type::LIST));
   value_.SetKey(policy::kResetAtDict,
                 base::Value(base::Value::Type::DICTIONARY));
+  value_.SetBoolKey(policy::kActivityReportingEnabled, true);
 }
 
 AppTimeLimitsPolicyBuilder::~AppTimeLimitsPolicyBuilder() = default;
@@ -33,5 +34,9 @@
   value_.SetKey(policy::kResetAtDict, policy::ResetTimeToDict(hour, minutes));
 }
 
+void AppTimeLimitsPolicyBuilder::SetAppActivityReportingEnabled(bool enabled) {
+  value_.SetBoolKey(policy::kActivityReportingEnabled, enabled);
+}
+
 }  // namespace app_time
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h
index eb6e104..a6e856b 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h
@@ -28,6 +28,8 @@
   // Sets reset time in the policy.
   void SetResetTime(int hour, int minutes);
 
+  void SetAppActivityReportingEnabled(bool enabled);
+
   const base::Value& value() const { return value_; }
 
  private:
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.cc
index d812dc0..868478ba 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.cc
@@ -28,6 +28,7 @@
 const char kResetAtDict[] = "reset_at";
 const char kHourInt[] = "hour";
 const char kMinInt[] = "minute";
+const char kActivityReportingEnabled[] = "activity_reporting_enabled";
 
 apps::mojom::AppType PolicyStringToAppType(const std::string& app_type) {
   if (app_type == "ARC")
@@ -217,6 +218,12 @@
   return value;
 }
 
+base::Optional<bool> ActivityReportingEnabledFromDict(const base::Value& dict) {
+  if (!dict.is_dict())
+    return base::nullopt;
+  return dict.FindBoolPath(kActivityReportingEnabled);
+}
+
 std::map<AppId, AppLimit> AppLimitsFromDict(const base::Value& dict) {
   std::map<AppId, AppLimit> app_limits;
 
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h
index f5292fb..82bffe2 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h
@@ -38,6 +38,7 @@
 extern const char kResetAtDict[];
 extern const char kHourInt[];
 extern const char kMinInt[];
+extern const char kActivityReportingEnabled[];
 
 // Converts between apps::mojom::AppType and string used by app time limits
 // policies.
@@ -74,6 +75,10 @@
 // Serializes daily limits reset to the dictionary.
 base::Value ResetTimeToDict(int hour, int minutes);
 
+// Deserializes activity reporting enabled boolean from |dict|.
+// Returns value if |dict| contains a valid entry.
+base::Optional<bool> ActivityReportingEnabledFromDict(const base::Value& dict);
+
 // Deserializes app limits data from the |dict|.
 // Will return empty map if |dict| is invalid.
 std::map<AppId, AppLimit> AppLimitsFromDict(const base::Value& dict);
diff --git a/chrome/browser/chromeos/external_protocol_dialog.cc b/chrome/browser/chromeos/external_protocol_dialog.cc
index 55a7021..e1bd0c1 100644
--- a/chrome/browser/chromeos/external_protocol_dialog.cc
+++ b/chrome/browser/chromeos/external_protocol_dialog.cc
@@ -61,8 +61,8 @@
 ExternalProtocolDialog::ExternalProtocolDialog(WebContents* web_contents,
                                                const GURL& url)
     : creation_time_(base::TimeTicks::Now()), scheme_(url.scheme()) {
-  views::DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  views::DialogDelegate::set_button_label(
+  views::DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  views::DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_OK_BUTTON_TEXT));
 
diff --git a/chrome/browser/chromeos/lock_screen_apps/toast_dialog_view.cc b/chrome/browser/chromeos/lock_screen_apps/toast_dialog_view.cc
index a93b08f5..2e6f11d 100644
--- a/chrome/browser/chromeos/lock_screen_apps/toast_dialog_view.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/toast_dialog_view.cc
@@ -42,8 +42,8 @@
 ToastDialogView::ToastDialogView(const base::string16& app_name,
                                  base::OnceClosure dismissed_callback)
     : app_name_(app_name) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
-  DialogDelegate::set_close_callback(std::move(dismissed_callback));
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetCloseCallback(std::move(dismissed_callback));
 
   chrome::RecordDialogCreation(
       chrome::DialogIdentifier::LOCK_SCREEN_NOTE_APP_TOAST);
diff --git a/chrome/browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc
index 81f2a9c..6192d93 100644
--- a/chrome/browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc
+++ b/chrome/browser/chromeos/policy/status_collector/child_status_collector_browsertest.cc
@@ -23,11 +23,13 @@
 #include "base/test/scoped_path_override.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
+#include "base/values.h"
 #include "chrome/browser/chrome_content_browser_client.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_activity_registry.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
 #include "chrome/browser/chromeos/login/users/mock_user_manager.h"
 #include "chrome/browser/chromeos/ownership/fake_owner_settings_service.h"
@@ -55,6 +57,7 @@
 #include "components/account_id/account_id.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "components/prefs/pref_service.h"
+#include "components/prefs/scoped_user_pref_update.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/session_manager/core/session_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
@@ -421,6 +424,8 @@
             time, &profile_pref_service_));
   }
 
+  Profile* testing_profile() { return testing_profile_.get(); }
+
   // Since this is a unit test running in browser_tests we must do additional
   // unit test setup and make a TestingBrowserProcess. Must be first member.
   TestingBrowserProcessInitializer initializer_;
@@ -761,4 +766,41 @@
   EXPECT_EQ(0, child_status_.app_activity_size());
 }
 
+TEST_F(ChildStatusCollectorTest, ReportingAppActivityNoReport) {
+  // Nothing reported yet.
+  GetStatus();
+  EXPECT_EQ(0, child_status_.app_activity_size());
+  status_collector_->OnSubmittedSuccessfully();
+
+  const chromeos::app_time::AppId app1(apps::mojom::AppType::kWeb, "app1");
+  const chromeos::app_time::AppId app2(apps::mojom::AppType::kExtension,
+                                       "app2");
+  const base::TimeDelta app1_interval = base::TimeDelta::FromMinutes(1);
+  const base::TimeDelta app2_interval = base::TimeDelta::FromMinutes(2);
+
+  SimulateAppActivity(app1, app1_interval);
+  SimulateAppActivity(app2, app2_interval);
+  SimulateAppActivity(app1, app1_interval);
+  SimulateAppActivity(app2, app2_interval);
+  SimulateAppActivity(app1, app1_interval);
+
+  {
+    chromeos::app_time::AppTimeLimitsPolicyBuilder builder;
+    builder.SetAppActivityReportingEnabled(/* enabled */ false);
+    DictionaryPrefUpdate update(testing_profile()->GetPrefs(),
+                                prefs::kPerAppTimeLimitsPolicy);
+    base::Value* value = update.Get();
+    *value = builder.value().Clone();
+  }
+
+  SimulateAppActivity(app1, app1_interval);
+  SimulateAppActivity(app2, app2_interval);
+  SimulateAppActivity(app1, app1_interval);
+  SimulateAppActivity(app2, app2_interval);
+  SimulateAppActivity(app1, app1_interval);
+
+  GetStatus();
+  EXPECT_EQ(0, child_status_.app_activity_size());
+}
+
 }  // namespace policy
diff --git a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc
index ae0ceed2..f6e4a356 100644
--- a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc
+++ b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc
@@ -33,7 +33,7 @@
 IdleActionWarningDialogView::IdleActionWarningDialogView(
     base::TimeTicks idle_action_time)
     : idle_action_time_(idle_action_time) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   SetBorder(views::CreateEmptyBorder(
       ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(views::TEXT,
diff --git a/chrome/browser/chromeos/ui/echo_dialog_view.cc b/chrome/browser/chromeos/ui/echo_dialog_view.cc
index e1e8bd5..a26e3e8 100644
--- a/chrome/browser/chromeos/ui/echo_dialog_view.cc
+++ b/chrome/browser/chromeos/ui/echo_dialog_view.cc
@@ -45,26 +45,26 @@
   chrome::RecordDialogCreation(chrome::DialogIdentifier::ECHO);
 
   if (params.echo_enabled) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK |
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK |
                                 ui::DIALOG_BUTTON_CANCEL);
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_OK,
         l10n_util::GetStringUTF16(IDS_OFFERS_CONSENT_INFOBAR_ENABLE_BUTTON));
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_CANCEL,
         l10n_util::GetStringUTF16(IDS_OFFERS_CONSENT_INFOBAR_DISABLE_BUTTON));
     InitForEnabledEcho(params.service_name, params.origin);
   } else {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL);
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL);
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_CANCEL,
         l10n_util::GetStringUTF16(IDS_ECHO_CONSENT_DISMISS_BUTTON));
     InitForDisabledEcho();
   }
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &EchoDialogListener::OnAccept, base::Unretained(listener_)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &EchoDialogListener::OnCancel, base::Unretained(listener_)));
 }
 
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
index a10389d..27bd712b 100644
--- a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
+++ b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
@@ -25,12 +25,22 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "third_party/blink/public/common/context_menu_data/media_type.h"
 
+#if defined(OS_MACOSX)
+#include "chrome/test/base/launchservices_utils_mac.h"
+#endif
+
 using content::WebContents;
 
 class RegisterProtocolHandlerBrowserTest : public InProcessBrowserTest {
  public:
   RegisterProtocolHandlerBrowserTest() { }
 
+  void SetUpOnMainThread() override {
+#if defined(OS_MACOSX)
+    ASSERT_TRUE(test::RegisterAppWithLaunchServices());
+#endif
+  }
+
   TestRenderViewContextMenu* CreateContextMenu(GURL url) {
     content::ContextMenuParams params;
     params.media_type = blink::ContextMenuDataMediaType::kNone;
diff --git a/chrome/browser/download/download_frame_policy_browsertest.cc b/chrome/browser/download/download_frame_policy_browsertest.cc
index 70d04071..9f628905 100644
--- a/chrome/browser/download/download_frame_policy_browsertest.cc
+++ b/chrome/browser/download/download_frame_policy_browsertest.cc
@@ -721,10 +721,7 @@
 
 // Test that when the iframe sandbox attribute is updated before navigation,
 // the updated flag will be controlling the navigation-instantiating frame's
-// policy for the download intervention. Given that the feature is disabled by
-// default, the download will occur, but the point of the test is to track the
-// use counter for whether or not the download would have been blocked by the
-// policy.
+// policy for the download intervention.
 IN_PROC_BROWSER_TEST_P(
     DownloadFramePolicyBrowserTest_UpdateIframeSandboxFlags,
     PendingSandboxPolicyUsedForNavigationInstantiatingFrame) {
@@ -732,6 +729,7 @@
   bool from_allow_to_disallow;
   std::tie(is_cross_origin, from_allow_to_disallow) = GetParam();
 
+  size_t number_of_downloads = from_allow_to_disallow ? 0u : 1u;
   SandboxOption initial_sandbox_option =
       from_allow_to_disallow ? SandboxOption::kAllowDownloads
                              : SandboxOption::kDisallowDownloads;
@@ -741,7 +739,7 @@
                                     : kSandboxTokensAllowDownloads;
 
   InitializeHistogramTesterAndWebFeatureWaiter();
-  SetNumDownloadsExpectation(1);
+  SetNumDownloadsExpectation(number_of_downloads);
   InitializeOneSubframeSetup(initial_sandbox_option, false /* is_ad_frame */,
                              is_cross_origin);
 
@@ -769,16 +767,14 @@
 
 // Test that when the iframe sandbox attribute is updated before navigation,
 // the updated flag will NOT be controlling the navigation-initiator frame's
-// policy for the download intervention. Given that the feature is disabled by
-// default, the download will occur, but the point of the test is to track the
-// use counter for whether or not the download would have been blocked by the
-// policy.
+// policy for the download intervention.
 IN_PROC_BROWSER_TEST_P(DownloadFramePolicyBrowserTest_UpdateIframeSandboxFlags,
                        EffectiveSandboxPolicyUsedForNavigationInitiatorFrame) {
   bool is_cross_origin;
   bool from_allow_to_disallow;
   std::tie(is_cross_origin, from_allow_to_disallow) = GetParam();
 
+  size_t number_of_downloads = from_allow_to_disallow ? 1u : 0u;
   SandboxOption initial_sandbox_option =
       from_allow_to_disallow ? SandboxOption::kAllowDownloads
                              : SandboxOption::kDisallowDownloads;
@@ -788,7 +784,7 @@
                                     : kSandboxTokensAllowDownloads;
 
   InitializeHistogramTesterAndWebFeatureWaiter();
-  SetNumDownloadsExpectation(1);
+  SetNumDownloadsExpectation(number_of_downloads);
   InitializeOneSubframeSetup(initial_sandbox_option, false /* is_ad_frame */,
                              is_cross_origin);
 
diff --git a/chrome/browser/extensions/api/storage/settings_sync_unittest.cc b/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
index 127f747..1a1c21e 100644
--- a/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
+++ b/chrome/browser/extensions/api/storage/settings_sync_unittest.cc
@@ -239,7 +239,7 @@
   // from extension id to its sync data.
   SettingSyncDataMultimap GetAllSyncData(syncer::ModelType model_type) {
     syncer::SyncDataList as_list =
-        GetSyncableService(model_type)->GetAllSyncData(model_type);
+        GetSyncableService(model_type)->GetAllSyncDataForTesting(model_type);
     SettingSyncDataMultimap as_map;
     for (auto it = as_list.begin(); it != as_list.end(); ++it) {
       std::unique_ptr<SettingSyncData> sync_data(new SettingSyncData(*it));
@@ -1026,7 +1026,7 @@
     GetExisting("bad")->set_status_code(ValueStore::CORRUPTION);
     {
       syncer::SyncDataList all_sync_data =
-          GetSyncableService(model_type)->GetAllSyncData(model_type);
+          GetSyncableService(model_type)->GetAllSyncDataForTesting(model_type);
       EXPECT_EQ(1u, all_sync_data.size());
       EXPECT_EQ("good/foo", syncer::SyncDataLocal(all_sync_data[0]).GetTag());
     }
diff --git a/chrome/browser/extensions/api/storage/sync_storage_backend.cc b/chrome/browser/extensions/api/storage/sync_storage_backend.cc
index 6e1cd48..d25a5140 100644
--- a/chrome/browser/extensions/api/storage/sync_storage_backend.cc
+++ b/chrome/browser/extensions/api/storage/sync_storage_backend.cc
@@ -146,8 +146,8 @@
   std::move(done).Run();
 }
 
-syncer::SyncDataList SyncStorageBackend::GetAllSyncData(syncer::ModelType type)
-    const {
+syncer::SyncDataList SyncStorageBackend::GetAllSyncDataForTesting(
+    syncer::ModelType type) const {
   DCHECK(IsOnBackendSequence());
   // For all extensions, get all their settings.  This has the effect
   // of bringing in the entire state of extension settings in memory; sad.
diff --git a/chrome/browser/extensions/api/storage/sync_storage_backend.h b/chrome/browser/extensions/api/storage/sync_storage_backend.h
index f57cedb..db9c01d 100644
--- a/chrome/browser/extensions/api/storage/sync_storage_backend.h
+++ b/chrome/browser/extensions/api/storage/sync_storage_backend.h
@@ -49,7 +49,7 @@
 
   // syncer::SyncableService implementation.
   void WaitUntilReadyToSync(base::OnceClosure done) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
   syncer::SyncMergeResult MergeDataAndStartSyncing(
       syncer::ModelType type,
       const syncer::SyncDataList& initial_sync_data,
diff --git a/chrome/browser/extensions/extension_service_sync_unittest.cc b/chrome/browser/extensions/extension_service_sync_unittest.cc
index 4e1cee8..fccb6c3 100644
--- a/chrome/browser/extensions/extension_service_sync_unittest.cc
+++ b/chrome/browser/extensions/extension_service_sync_unittest.cc
@@ -699,7 +699,7 @@
       std::make_unique<syncer::SyncErrorFactoryMock>());
 
   syncer::SyncDataList list =
-      extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+      extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
   ASSERT_EQ(list.size(), 1U);
   std::unique_ptr<ExtensionSyncData> data =
       ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -728,7 +728,7 @@
 
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(list.size(), 1U);
     std::unique_ptr<ExtensionSyncData> data =
         ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -744,7 +744,7 @@
                               extensions::disable_reason::DISABLE_USER_ACTION);
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(list.size(), 1U);
     std::unique_ptr<ExtensionSyncData> data =
         ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -761,7 +761,7 @@
                               extensions::disable_reason::DISABLE_RELOAD);
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(list.size(), 1U);
     std::unique_ptr<ExtensionSyncData> data =
         ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -780,7 +780,7 @@
                                   extensions::disable_reason::DISABLE_RELOAD);
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(list.size(), 1U);
     std::unique_ptr<ExtensionSyncData> data =
         ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -806,7 +806,7 @@
       std::make_unique<syncer::SyncErrorFactoryMock>());
 
   syncer::SyncDataList list =
-      extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+      extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
   ASSERT_EQ(list.size(), 1U);
   std::unique_ptr<ExtensionSyncData> data =
       ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -834,7 +834,7 @@
       std::make_unique<syncer::SyncErrorFactoryMock>());
 
   syncer::SyncDataList list =
-      extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+      extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
   ASSERT_EQ(list.size(), 0U);
 }
 
@@ -851,7 +851,7 @@
 
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(list.size(), 1U);
     std::unique_ptr<ExtensionSyncData> data =
         ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -864,7 +864,7 @@
                               extensions::disable_reason::DISABLE_USER_ACTION);
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(list.size(), 1U);
     std::unique_ptr<ExtensionSyncData> data =
         ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -876,7 +876,7 @@
   extensions::util::SetIsIncognitoEnabled(good_crx, profile(), true);
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(list.size(), 1U);
     std::unique_ptr<ExtensionSyncData> data =
         ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -888,7 +888,7 @@
   service()->EnableExtension(good_crx);
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(list.size(), 1U);
     std::unique_ptr<ExtensionSyncData> data =
         ExtensionSyncData::CreateFromSyncData(list[0]);
@@ -947,7 +947,7 @@
       syncer::StringOrdinal::CreateInitialOrdinal();
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::APPS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS);
     ASSERT_EQ(list.size(), 1U);
 
     std::unique_ptr<ExtensionSyncData> app_sync_data =
@@ -960,7 +960,7 @@
   sorting->SetAppLaunchOrdinal(app->id(), initial_ordinal.CreateAfter());
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::APPS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS);
     ASSERT_EQ(list.size(), 1U);
 
     std::unique_ptr<ExtensionSyncData> app_sync_data =
@@ -973,7 +973,7 @@
   sorting->SetPageOrdinal(app->id(), initial_ordinal.CreateAfter());
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::APPS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS);
     ASSERT_EQ(list.size(), 1U);
 
     std::unique_ptr<ExtensionSyncData> app_sync_data =
@@ -1010,7 +1010,7 @@
       ->OnExtensionMoved(apps[0]->id(), apps[1]->id(), apps[2]->id());
   {
     syncer::SyncDataList list =
-        extension_sync_service()->GetAllSyncData(syncer::APPS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS);
     ASSERT_EQ(list.size(), 3U);
 
     std::unique_ptr<ExtensionSyncData> data[kAppCount];
@@ -1055,9 +1055,12 @@
                               extensions::disable_reason::DISABLE_USER_ACTION);
   TerminateExtension(theme2_crx);
 
-  EXPECT_EQ(0u, extension_sync_service()->GetAllSyncData(syncer::APPS).size());
   EXPECT_EQ(
-      2u, extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS).size());
+      0u,
+      extension_sync_service()->GetAllSyncDataForTesting(syncer::APPS).size());
+  EXPECT_EQ(2u, extension_sync_service()
+                    ->GetAllSyncDataForTesting(syncer::EXTENSIONS)
+                    .size());
 }
 
 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataUninstall) {
@@ -1341,7 +1344,7 @@
     EXPECT_FALSE(service()->updater()->WillCheckSoon());
     // Make sure the version we'll send back to sync didn't change.
     syncer::SyncDataList data =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(1u, data.size());
     std::unique_ptr<ExtensionSyncData> extension_data =
         ExtensionSyncData::CreateFromSyncData(data[0]);
@@ -1360,7 +1363,7 @@
     EXPECT_FALSE(service()->updater()->WillCheckSoon());
     // Make sure the version we'll send back to sync didn't change.
     syncer::SyncDataList data =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(1u, data.size());
     std::unique_ptr<ExtensionSyncData> extension_data =
         ExtensionSyncData::CreateFromSyncData(data[0]);
@@ -1382,7 +1385,7 @@
     // haven't actually updated yet. This is to prevent the data in sync from
     // flip-flopping back and forth until all clients are up to date.
     syncer::SyncDataList data =
-        extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS);
+        extension_sync_service()->GetAllSyncDataForTesting(syncer::EXTENSIONS);
     ASSERT_EQ(1u, data.size());
     std::unique_ptr<ExtensionSyncData> extension_data =
         ExtensionSyncData::CreateFromSyncData(data[0]);
diff --git a/chrome/browser/extensions/extension_sync_service.cc b/chrome/browser/extensions/extension_sync_service.cc
index e9fc392..d9d31a9 100644
--- a/chrome/browser/extensions/extension_sync_service.cc
+++ b/chrome/browser/extensions/extension_sync_service.cc
@@ -203,7 +203,7 @@
   GetSyncBundle(type)->Reset();
 }
 
-syncer::SyncDataList ExtensionSyncService::GetAllSyncData(
+syncer::SyncDataList ExtensionSyncService::GetAllSyncDataForTesting(
     syncer::ModelType type) const {
   const SyncBundle* bundle = GetSyncBundle(type);
   if (!bundle->IsSyncing())
diff --git a/chrome/browser/extensions/extension_sync_service.h b/chrome/browser/extensions/extension_sync_service.h
index 06de954..26a2be2 100644
--- a/chrome/browser/extensions/extension_sync_service.h
+++ b/chrome/browser/extensions/extension_sync_service.h
@@ -70,7 +70,7 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> sync_error_factory) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index e24fc8c..85bbbf6 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -785,10 +785,6 @@
 const char kEnableSyncUSSNigoriDescription[] =
     "Enables the new, experimental implementation of sync encryption keys";
 
-const char kEnableSyncUSSPasswordsName[] = "Enable USS for passwords sync";
-const char kEnableSyncUSSPasswordsDescription[] =
-    "Enables the new, experimental implementation of passwords sync";
-
 const char kEnableTextFragmentAnchorName[] = "Enable Text Fragment Anchor.";
 const char kEnableTextFragmentAnchorDescription[] =
     "Enables scrolling to text specified in URL's fragment.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index eb1902b..cce43c8 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -461,9 +461,6 @@
 extern const char kEnableSyncUSSNigoriName[];
 extern const char kEnableSyncUSSNigoriDescription[];
 
-extern const char kEnableSyncUSSPasswordsName[];
-extern const char kEnableSyncUSSPasswordsDescription[];
-
 extern const char kEnableTextFragmentAnchorName[];
 extern const char kEnableTextFragmentAnchorDescription[];
 
diff --git a/chrome/browser/media/webrtc/OWNERS b/chrome/browser/media/webrtc/OWNERS
index 768e9f6..2e2b5fb1 100644
--- a/chrome/browser/media/webrtc/OWNERS
+++ b/chrome/browser/media/webrtc/OWNERS
@@ -6,7 +6,7 @@
 
 # For WebRTC browser tests.
 per-file *webrtc*browsertest*=hbos@chromium.org
-per-file *webrtc*browsertest*=phoglund@chromium.org
+per-file *webrtc*browsertest*=mbonadei@chromium.org
 
 # For changes related to the tab media indicators.
 per-file media_stream_capture_indicator*=miu@chromium.org
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
index 43e14c41..74b4d99 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
@@ -141,7 +141,7 @@
     page_load_metrics::InitPageLoadTimingForTest(timing.get());
     observer->OnTimingUpdated(
         navigation_handle()->GetRenderFrameHost(), std::move(timing),
-        page_load_metrics::mojom::PageLoadMetadataPtr(base::in_place),
+        page_load_metrics::mojom::FrameMetadataPtr(base::in_place),
         page_load_metrics::mojom::PageLoadFeaturesPtr(base::in_place),
         resources,
         page_load_metrics::mojom::FrameRenderDataUpdatePtr(base::in_place),
diff --git a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc
index 8f93a06..56ba2053 100644
--- a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer_unittest.cc
@@ -201,7 +201,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
@@ -265,7 +265,7 @@
   NavigationSimulator::CreateRendererInitiated(amp_url, main_rfh())
       ->CommitSameDocument();
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
@@ -316,7 +316,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
@@ -380,7 +380,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
@@ -420,7 +420,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
@@ -487,7 +487,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
@@ -529,7 +529,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
@@ -585,7 +585,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe1"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe1);
@@ -690,7 +690,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
@@ -775,7 +775,7 @@
           content::RenderFrameHostTester::For(web_contents()->GetMainFrame())
               ->AppendChild("subframe"));
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags =
       blink::LoadingBehaviorFlag::kLoadingBehaviorAmpDocumentLoaded;
   tester()->SimulateMetadataUpdate(metadata, subframe);
diff --git a/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc
index c0ee9b0..7f39b5e7 100644
--- a/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc
@@ -52,7 +52,7 @@
       base::TimeDelta::FromMilliseconds(3);
   PopulateRequiredTimingFields(&timing);
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags |=
       blink::LoadingBehaviorFlag::kLoadingBehaviorDocumentWriteBlock;
   NavigateAndCommit(GURL("https://www.google.com/"));
@@ -101,7 +101,7 @@
   timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1);
   PopulateRequiredTimingFields(&timing);
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags |=
       blink::LoadingBehaviorFlag::kLoadingBehaviorDocumentWriteBlockReload;
   NavigateAndCommit(GURL("https://www.google.com/"));
@@ -160,7 +160,7 @@
   timing.paint_timing->first_contentful_paint = contentful_paint;
   PopulateRequiredTimingFields(&timing);
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   NavigateAndCommit(GURL("https://www.google.com/"));
   tester()->SimulateTimingAndMetadataUpdate(timing, metadata);
 
diff --git a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc
index cc6f109..c4e5abd7 100644
--- a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc
@@ -171,7 +171,7 @@
   InitializeTestPageLoadTiming(&timing);
 
   NavigateAndCommit(GURL(kDefaultTestUrl));
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags |=
       blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled;
   tester()->SimulateTimingAndMetadataUpdate(timing, metadata);
@@ -248,7 +248,7 @@
   page_load_metrics::InitPageLoadTimingForTest(&timing);
   PopulateRequiredTimingFields(&timing);
 
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags |=
       blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled;
 
@@ -304,7 +304,7 @@
   InitializeTestPageLoadTiming(&timing);
 
   NavigateAndCommit(GURL(kInboxTestUrl));
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags |=
       blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled;
   tester()->SimulateTimingAndMetadataUpdate(timing, metadata);
@@ -427,7 +427,7 @@
   InitializeTestPageLoadTiming(&timing);
 
   NavigateAndCommit(GURL(kSearchTestUrl));
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags |=
       blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled;
   tester()->SimulateTimingAndMetadataUpdate(timing, metadata);
@@ -550,7 +550,7 @@
   InitializeTestPageLoadTiming(&timing);
 
   NavigateAndCommit(GURL(kSearchTestUrl));
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   tester()->SimulateTimingAndMetadataUpdate(timing, metadata);
 
   tester()->histogram_tester().ExpectTotalCount(
@@ -617,7 +617,7 @@
       GURL(kDefaultTestUrl),
       ui::PageTransitionFromInt(ui::PAGE_TRANSITION_RELOAD |
                                 ui::PAGE_TRANSITION_FORWARD_BACK));
-  page_load_metrics::mojom::PageLoadMetadata metadata;
+  page_load_metrics::mojom::FrameMetadata metadata;
   metadata.behavior_flags |=
       blink::LoadingBehaviorFlag::kLoadingBehaviorServiceWorkerControlled;
   tester()->SimulateTimingAndMetadataUpdate(timing, metadata);
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
index cb54aa3a..b0967fc 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -2485,3 +2485,199 @@
       internal::kFeaturesHistogramName,
       static_cast<int32_t>(WebFeature::kSecureContextCheckFailed), 0);
 }
+
+// Creates a single frame within the main frame and verifies the intersection
+// with the main frame.
+IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
+                       MainFrameDocumentIntersectionSingleFrame) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  auto waiter = CreatePageLoadMetricsTestWaiter();
+  ui_test_utils::NavigateToURL(
+      browser(),
+      embedded_test_server()->GetURL(
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  waiter->AddMainFrameDocumentIntersectionExpectation(
+      gfx::Rect(100, 100, 200, 200));
+
+  // Create a 200x200 iframe at 100,100.
+  EXPECT_TRUE(ExecJs(web_contents,
+                     "createIframeAtRect(\"test\", 100, 100, 200, 200);"));
+
+  waiter->Wait();
+}
+
+// Creates a set of nested frames within the main frame and verifies
+// their intersections with the main frame.
+IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
+                       MainFrameDocumentIntersectionSameOrigin) {
+  EXPECT_TRUE(embedded_test_server()->Start());
+
+  auto waiter = CreatePageLoadMetricsTestWaiter();
+  ui_test_utils::NavigateToURL(
+      browser(),
+      embedded_test_server()->GetURL(
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  waiter->AddMainFrameDocumentIntersectionExpectation(
+      gfx::Rect(100, 100, 200, 200));
+
+  // Create a 200x200 iframe at 100,100.
+  EXPECT_TRUE(ExecJs(web_contents,
+                     "createIframeAtRect(\"test\", 100, 100, 200, 200);"));
+  waiter->Wait();
+
+  NavigateIframeToURL(
+      web_contents, "test",
+      embedded_test_server()->GetURL(
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+
+  // Creates the grandchild iframe within the child frame at 10, 10 with
+  // dimensions 300x300. This frame is clipped by 110 pixels in the bottom and
+  // right. This translates to an intersection of 110, 110, 190, 190 with the
+  // main frame.
+  waiter->AddMainFrameDocumentIntersectionExpectation(
+      gfx::Rect(110, 110, 190, 190));
+  content::RenderFrameHost* child_frame =
+      content::ChildFrameAt(web_contents->GetMainFrame(), 0);
+  EXPECT_TRUE(
+      ExecJs(child_frame, "createIframeAtRect(\"test2\", 10, 10, 300, 300);"));
+
+  waiter->Wait();
+}
+
+// Creates a set of nested frames, with a cross origin subframe, within the
+// main frame and verifies their intersections with the main frame.
+IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
+                       MainFrameDocumentIntersectionCrossOrigin) {
+  EXPECT_TRUE(embedded_test_server()->Start());
+  auto waiter = CreatePageLoadMetricsTestWaiter();
+  ui_test_utils::NavigateToURL(
+      browser(),
+      embedded_test_server()->GetURL(
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  waiter->AddMainFrameDocumentIntersectionExpectation(
+      gfx::Rect(100, 100, 200, 200));
+
+  // Create a 200x200 iframe at 100,100.
+  EXPECT_TRUE(ExecJs(web_contents,
+                     "createIframeAtRect(\"test\", 100, 100, 200, 200);"));
+  waiter->Wait();
+
+  NavigateIframeToURL(
+      web_contents, "test",
+      embedded_test_server()->GetURL(
+          "b.com",
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+
+  // Creates the grandchild iframe within the child frame at 10, 10 with
+  // dimensions 300x300. This frame is clipped by 110 pixels in the bottom and
+  // right. This translates to an intersection of 110, 110, 190, 190 with the
+  // main frame.
+  waiter->AddMainFrameDocumentIntersectionExpectation(
+      gfx::Rect(110, 110, 190, 190));
+  content::RenderFrameHost* child_frame =
+      content::ChildFrameAt(web_contents->GetMainFrame(), 0);
+  EXPECT_TRUE(
+      ExecJs(child_frame, "createIframeAtRect(\"test2\", 10, 10, 300, 300);"));
+
+  waiter->Wait();
+}
+
+// Creates a set of nested frames, with a cross origin subframe that is out of
+// view within the main frame and verifies their intersections with the main
+// frame.
+IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
+                       MainFrameDocumentIntersectionCrossOriginOutOfView) {
+  EXPECT_TRUE(embedded_test_server()->Start());
+  auto waiter = CreatePageLoadMetricsTestWaiter();
+  ui_test_utils::NavigateToURL(
+      browser(),
+      embedded_test_server()->GetURL(
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  waiter->AddMainFrameDocumentIntersectionExpectation(
+      gfx::Rect(100, 100, 200, 200));
+
+  // Create a 200x200 iframe at 100,100.
+  EXPECT_TRUE(ExecJs(web_contents,
+                     "createIframeAtRect(\"test\", 100, 100, 200, 200);"));
+  waiter->Wait();
+
+  NavigateIframeToURL(
+      web_contents, "test",
+      embedded_test_server()->GetURL(
+          "b.com",
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+
+  // Creates the grandchild iframe within the child frame outside the parent
+  // frame's viewport.
+  waiter->AddMainFrameDocumentIntersectionExpectation(gfx::Rect(0, 0, 0, 0));
+  content::RenderFrameHost* child_frame =
+      content::ChildFrameAt(web_contents->GetMainFrame(), 0);
+  EXPECT_TRUE(ExecJs(child_frame,
+                     "createIframeAtRect(\"test2\", 5000, 5000, 190, 190);"));
+
+  waiter->Wait();
+}
+
+// Creates a set of nested frames, with a cross origin subframe that is out of
+// view within the main frame and verifies their intersections with the main
+// frame. The out of view frame is then scrolled back into view and the
+// intersection is verified.
+IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
+                       MainFrameDocumentIntersectionCrossOriginScrolled) {
+  EXPECT_TRUE(embedded_test_server()->Start());
+  auto waiter = CreatePageLoadMetricsTestWaiter();
+  ui_test_utils::NavigateToURL(
+      browser(),
+      embedded_test_server()->GetURL(
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  waiter->AddMainFrameDocumentIntersectionExpectation(
+      gfx::Rect(100, 100, 200, 200));
+
+  // Create a 200x200 iframe at 100,100.
+  EXPECT_TRUE(ExecJs(web_contents,
+                     "createIframeAtRect(\"test\", 100, 100, 200, 200);"));
+  waiter->Wait();
+
+  NavigateIframeToURL(
+      web_contents, "test",
+      embedded_test_server()->GetURL(
+          "b.com",
+          "/page_load_metrics/blank_with_positioned_iframe_writer.html"));
+
+  // Creates the grandchild iframe within the child frame outside the parent
+  // frame's viewport.
+  waiter->AddMainFrameDocumentIntersectionExpectation(gfx::Rect(0, 0, 0, 0));
+  content::RenderFrameHost* child_frame =
+      content::ChildFrameAt(web_contents->GetMainFrame(), 0);
+  EXPECT_TRUE(ExecJs(child_frame,
+                     "createIframeAtRect(\"test2\", 5000, 5000, 190, 190);"));
+  waiter->Wait();
+
+  // Scroll the child frame and verify the grandchild frame's intersection.
+  // The parent frame is at position 100,100 with dimensions 200x200. The
+  // child frame after scrolling is positioned at 100,100 within the parent
+  // frame and is clipped to 100x100. The grand child's main frame document
+  // position is then 200,200 after the child frame is scrolled.
+  waiter->AddMainFrameDocumentIntersectionExpectation(
+      gfx::Rect(200, 200, 100, 100));
+
+  EXPECT_TRUE(ExecJs(child_frame, "window.scroll(4900, 4900); "));
+
+  waiter->Wait();
+}
diff --git a/chrome/browser/password_manager/account_storage/account_password_store_factory.cc b/chrome/browser/password_manager/account_storage/account_password_store_factory.cc
index 2f8df20..9f1a917 100644
--- a/chrome/browser/password_manager/account_storage/account_password_store_factory.cc
+++ b/chrome/browser/password_manager/account_storage/account_password_store_factory.cc
@@ -119,7 +119,7 @@
 
   scoped_refptr<PasswordStore> ps =
       new password_manager::PasswordStoreDefault(std::move(login_db));
-  if (!ps->Init(/*flare=*/base::DoNothing(), profile->GetPrefs(),
+  if (!ps->Init(profile->GetPrefs(),
                 base::BindRepeating(&SyncEnabledOrDisabled, profile))) {
     // TODO(crbug.com/479725): Remove the LOG once this error is visible in the
     // UI.
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 0c276a36..8fd45689 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -549,12 +549,14 @@
 
 void ChromePasswordManagerClient::NotifyUserCredentialsWereLeaked(
     password_manager::CredentialLeakType leak_type,
-    const GURL& origin) {
+    const GURL& origin,
+    const base::string16& username) {
 #if defined(OS_ANDROID)
   HideSavePasswordInfobar(web_contents());
 #if defined(ENABLE_PASSWORD_CHANGE)
+  was_leak_warning_shown_ = true;
   (new CredentialLeakPasswordChangeControllerAndroid(
-       leak_type, origin, web_contents()->GetTopLevelNativeWindow()))
+       leak_type, origin, username, web_contents()->GetTopLevelNativeWindow()))
       ->ShowDialog();
 #else
   (new CredentialLeakControllerAndroid(
@@ -832,6 +834,15 @@
   return false;
 }
 
+bool ChromePasswordManagerClient::WasCredentialLeakDialogShown() const {
+#if defined(ENABLE_PASSWORD_CHANGE)
+  return was_leak_warning_shown_;
+#else
+  // Don't allow a password change flow if the feature is not enabled.
+  return false;
+#endif
+}
+
 net::CertStatus ChromePasswordManagerClient::GetMainFrameCertStatus() const {
   content::NavigationEntry* entry =
       web_contents()->GetController().GetLastCommittedEntry();
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h
index 5a972f64..d25b42d 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.h
+++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -131,7 +131,8 @@
       const password_manager::PasswordFormManagerForUI* form_manager) override;
   void NotifyUserCredentialsWereLeaked(
       password_manager::CredentialLeakType leak_type,
-      const GURL& origin) override;
+      const GURL& origin,
+      const base::string16& username) override;
   void TriggerReauthForAccount(
       const CoreAccountId& account_id,
       base::OnceCallback<void(ReauthSucceeded)> reauth_callback) override;
@@ -142,6 +143,7 @@
   password_manager::PasswordStore* GetAccountPasswordStore() const override;
   password_manager::SyncState GetPasswordSyncState() const override;
   bool WasLastNavigationHTTPError() const override;
+  bool WasCredentialLeakDialogShown() const override;
   net::CertStatus GetMainFrameCertStatus() const override;
   void PromptUserToEnableAutosignin() override;
   bool IsIncognito() const override;
@@ -372,6 +374,11 @@
   // Whether OnPaste() was called from this ChromePasswordManagerClient
   bool was_on_paste_called_ = false;
 
+#if defined(ENABLE_PASSWORD_CHANGE)
+  // Whether a leak warning was shown.
+  bool was_leak_warning_shown_ = false;
+#endif
+
   // Helper for performing logic that is common between
   // ChromePasswordManagerClient and IOSChromePasswordManagerClient.
   password_manager::PasswordManagerClientHelper helper_;
diff --git a/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc b/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
index 4588e17b..22a4401 100644
--- a/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
+++ b/chrome/browser/password_manager/credential_leak_password_change_controller_android.cc
@@ -20,8 +20,12 @@
     CredentialLeakPasswordChangeControllerAndroid(
         password_manager::CredentialLeakType leak_type,
         const GURL& origin,
+        const base::string16& username,
         ui::WindowAndroid* window_android)
-    : leak_type_(leak_type), origin_(origin), window_android_(window_android) {}
+    : leak_type_(leak_type),
+      origin_(origin),
+      username_(username),
+      window_android_(window_android) {}
 
 CredentialLeakPasswordChangeControllerAndroid::
     ~CredentialLeakPasswordChangeControllerAndroid() = default;
diff --git a/chrome/browser/password_manager/credential_leak_password_change_controller_android.h b/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
index 0ffbfc27..a1e32aa 100644
--- a/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
+++ b/chrome/browser/password_manager/credential_leak_password_change_controller_android.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 #include "base/macros.h"
+#include "base/strings/string16.h"
 #include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
 #include "ui/gfx/range/range.h"
 #include "url/gurl.h"
@@ -27,6 +28,7 @@
   CredentialLeakPasswordChangeControllerAndroid(
       password_manager::CredentialLeakType leak_type,
       const GURL& origin,
+      const base::string16& username,
       ui::WindowAndroid* window_android);
   ~CredentialLeakPasswordChangeControllerAndroid();
 
@@ -72,6 +74,8 @@
 
   const GURL origin_;
 
+  const base::string16 username_;
+
   ui::WindowAndroid* window_android_;
 
   std::unique_ptr<CredentialLeakDialogPasswordChangeViewAndroid> dialog_view_;
diff --git a/chrome/browser/password_manager/password_store_factory.cc b/chrome/browser/password_manager/password_store_factory.cc
index 5ebc850..d95471a 100644
--- a/chrome/browser/password_manager/password_store_factory.cc
+++ b/chrome/browser/password_manager/password_store_factory.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/sync/glue/sync_start_util.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/browser/web_data_service_factory.h"
 #include "chrome/common/chrome_paths_internal.h"
@@ -162,8 +161,7 @@
   NOTIMPLEMENTED();
 #endif
   DCHECK(ps);
-  if (!ps->Init(sync_start_util::GetFlareForSyncableService(profile->GetPath()),
-                profile->GetPrefs())) {
+  if (!ps->Init(profile->GetPrefs())) {
     // TODO(crbug.com/479725): Remove the LOG once this error is visible in the
     // UI.
     LOG(WARNING) << "Could not initialize password store.";
diff --git a/chrome/browser/password_manager/password_store_factory.h b/chrome/browser/password_manager/password_store_factory.h
index 8c5e78b00..74366f87 100644
--- a/chrome/browser/password_manager/password_store_factory.h
+++ b/chrome/browser/password_manager/password_store_factory.h
@@ -30,7 +30,7 @@
 
   static PasswordStoreFactory* GetInstance();
 
-  // Called by the PasswordDataTypeController whenever there is a possibility
+  // Called by the PasswordModelTypeController whenever there is a possibility
   // that syncing passwords has just started or ended for |profile|.
   static void OnPasswordsSyncedStatePotentiallyChanged(Profile* profile);
 
diff --git a/chrome/browser/password_manager/password_store_x_unittest.cc b/chrome/browser/password_manager/password_store_x_unittest.cc
index d625ff4..06e84da 100644
--- a/chrome/browser/password_manager/password_store_x_unittest.cc
+++ b/chrome/browser/password_manager/password_store_x_unittest.cc
@@ -133,7 +133,7 @@
       test_login_db_file_path(), password_manager::IsAccountStore(false));
   scoped_refptr<PasswordStoreX> store =
       new PasswordStoreX(std::move(login_db), fake_pref_service());
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   // Check the contents are still around.
   MockPasswordStoreConsumer consumer;
@@ -179,7 +179,7 @@
 
   scoped_refptr<PasswordStoreX> store =
       new PasswordStoreX(std::move(login_db), fake_pref_service());
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
   WaitForPasswordStore();
 
   // Add a password to the db.
@@ -234,7 +234,7 @@
 
   scoped_refptr<PasswordStoreX> store =
       new PasswordStoreX(std::move(login_db), fake_pref_service());
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
   WaitForPasswordStore();
 
   // Add another password to the db.
diff --git a/chrome/browser/payments/BUILD.gn b/chrome/browser/payments/BUILD.gn
index f97970f7..5ad6856 100644
--- a/chrome/browser/payments/BUILD.gn
+++ b/chrome/browser/payments/BUILD.gn
@@ -9,6 +9,7 @@
     "empty_parameters_browsertest.cc",
     "has_enrolled_instrument_browsertest.cc",
     "has_enrolled_instrument_query_quota_browsertest.cc",
+    "iframe_csp_browsertest.cc",
     "journey_logger_browsertest.cc",
     "payment_handler_change_shipping_address_option_browsertest.cc",
     "payment_handler_enable_delegations_browsertest.cc",
diff --git a/chrome/browser/payments/iframe_csp_browsertest.cc b/chrome/browser/payments/iframe_csp_browsertest.cc
new file mode 100644
index 0000000..bcc4469f
--- /dev/null
+++ b/chrome/browser/payments/iframe_csp_browsertest.cc
@@ -0,0 +1,62 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "base/macros.h"
+#include "chrome/test/payments/payment_request_platform_browsertest_base.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace payments {
+
+class IframeCspTest : public PaymentRequestPlatformBrowserTestBase {
+ public:
+  IframeCspTest() : app_server_(net::EmbeddedTestServer::TYPE_HTTPS) {}
+
+  ~IframeCspTest() override = default;
+
+  void SetUpOnMainThread() override {
+    PaymentRequestPlatformBrowserTestBase::SetUpOnMainThread();
+
+    // kylepay.com is a payment app that supports just-in-time installation.
+    app_server_.ServeFilesFromSourceDirectory(
+        "components/test/data/payments/kylepay.com");
+    ASSERT_TRUE(app_server_.Start());
+
+    // Set up test manifest downloader that knows how to fake origin.
+    const std::string method_name = "kylepay.com";
+    SetDownloaderAndIgnorePortInOriginComparisonForTesting(
+        {{method_name, &app_server_}});
+  }
+
+ private:
+  net::EmbeddedTestServer app_server_;
+};
+
+IN_PROC_BROWSER_TEST_F(IframeCspTest, Show) {
+  NavigateTo("/csp_test_main.html");
+
+  content::WebContentsConsoleObserver console_observer(GetActiveWebContents());
+  // Filter for console messages related to the CSP failure. There should be
+  // none.
+  console_observer.SetPattern(
+      "Refused to load the image 'https://kylepay.com:*/icon.png *");
+
+  GURL iframe_url =
+      https_server()->GetURL("other.example", "/csp_test_iframe.html");
+  EXPECT_TRUE(
+      content::NavigateIframeToURL(GetActiveWebContents(), "test", iframe_url));
+
+  content::RenderFrameHost* iframe = content::FrameMatchingPredicate(
+      GetActiveWebContents(),
+      base::BindRepeating(&content::FrameHasSourceUrl, iframe_url));
+  EXPECT_EQ(iframe_url, iframe->GetLastCommittedURL());
+
+  EXPECT_EQ(true, content::EvalJs(iframe, "checkCanMakePayment()"));
+  EXPECT_TRUE(console_observer.messages().empty());
+}
+
+}  // namespace payments
diff --git a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
index 1c9aeb8f..447dfa6 100644
--- a/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
+++ b/chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.cc
@@ -17,6 +17,7 @@
 #include "content/public/common/transferrable_url_loader.mojom.h"
 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_attach_helper.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/manifest_handlers/mime_types_handler.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -54,6 +55,8 @@
   if (extension_id.empty())
     return;
 
+  MimeTypesHandler::ReportUsedHandler(extension_id);
+
   std::string view_id = base::GenerateGUID();
   // The string passed down to the original client with the response body.
   std::string payload = view_id;
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder.cc b/chrome/browser/profiles/profile_activity_metrics_recorder.cc
index c8cf894..325ed011 100644
--- a/chrome/browser/profiles/profile_activity_metrics_recorder.cc
+++ b/chrome/browser/profiles/profile_activity_metrics_recorder.cc
@@ -24,6 +24,10 @@
 // in the metrics.
 constexpr int kMaxProfileBucket = 100;
 
+// Long time of inactivity that is treated as if user starts the browser anew.
+constexpr base::TimeDelta kLongTimeOfInactivity =
+    base::TimeDelta::FromMinutes(30);
+
 int GetMetricsBucketIndex(Profile* profile) {
   if (profile->IsGuestSession())
     return 0;
@@ -77,6 +81,12 @@
   }
 }
 
+void RecordProfilesState() {
+  g_browser_process->profile_manager()
+      ->GetProfileAttributesStorage()
+      .RecordProfilesState();
+}
+
 }  // namespace
 
 // static
@@ -98,11 +108,28 @@
   RecordBrowserActivation(active_profile);
 
   if (last_active_profile_ != active_profile) {
+    // No-op, if starting a new session (|last_active_profile_| is nullptr).
     RecordProfileSessionDuration(
         last_active_profile_, base::TimeTicks::Now() - profile_session_start_);
+
     last_active_profile_ = active_profile;
     profile_session_start_ = base::TimeTicks::Now();
+
+    // Record state at startup (when last_profile_session_end_ is 0) and
+    // whenever the user starts browsing after a longer time of inactivity. Do
+    // it asynchronously because active_time of the just activated profile is
+    // also updated from OnBrowserSetLastActive() in another BrowserListObserver
+    // and we have no guarantee if this happens before or after this function
+    // call.
+    if (profile_session_start_ - last_profile_session_end_ >
+        kLongTimeOfInactivity) {
+      base::SequencedTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE, base::BindOnce(&RecordProfilesState));
+    }
   }
+
+  // This browsing session is still lasting.
+  last_profile_session_end_ = base::TimeTicks::Now();
 }
 
 void ProfileActivityMetricsRecorder::OnSessionEnded(
@@ -113,6 +140,7 @@
   RecordProfileSessionDuration(last_active_profile_,
                                session_end - profile_session_start_);
   last_active_profile_ = nullptr;
+  last_profile_session_end_ = base::TimeTicks::Now();
 }
 
 ProfileActivityMetricsRecorder::ProfileActivityMetricsRecorder() {
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder.h b/chrome/browser/profiles/profile_activity_metrics_recorder.h
index 5a2977c..99ec5a9 100644
--- a/chrome/browser/profiles/profile_activity_metrics_recorder.h
+++ b/chrome/browser/profiles/profile_activity_metrics_recorder.h
@@ -42,6 +42,7 @@
 
   Profile* last_active_profile_ = nullptr;
   base::TimeTicks profile_session_start_;
+  base::TimeTicks last_profile_session_end_;
 
   base::ActionCallback action_callback_;
 
diff --git a/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc b/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc
index f8a3fc86..54c7c15 100644
--- a/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc
+++ b/chrome/browser/profiles/profile_activity_metrics_recorder_unittest.cc
@@ -24,6 +24,8 @@
 namespace {
 
 constexpr base::TimeDelta kInactivityTimeout = base::TimeDelta::FromMinutes(5);
+constexpr base::TimeDelta kLongTimeOfInactivity =
+    base::TimeDelta::FromMinutes(30);
 
 }  // namespace
 
@@ -57,7 +59,9 @@
     Browser::CreateParams browser_params(profile, false);
     browsers_.push_back(CreateBrowserWithTestWindowForParams(&browser_params));
 
+    // This triggers the recorder to post a task, wait until that's done.
     BrowserList::SetLastActive(browsers_.back().get());
+    task_environment_.RunUntilIdle();
   }
 
   void ActivateIncognitoBrowser(Profile* profile) {
@@ -206,3 +210,42 @@
   histograms()->ExpectBucketCount("Profile.SessionDuration.PerProfile",
                                   /*bucket=*/1, /*count=*/2);
 }
+
+TEST_F(ProfileActivityMetricsRecorderTest, ProfileState) {
+  Profile* regular_profile = profile_manager()->CreateTestingProfile("p1");
+  Profile* guest_profile = profile_manager()->CreateGuestProfile();
+  histograms()->ExpectTotalCount("Profile.State.Avatar_All", 0);
+
+  // TODO(crbug.com/1060113): It seems like some state is sometimes carried over
+  // in these tests: sometimes the first profile activation does not trigger
+  // recording profile state any more. Reset the object to simulate a fresh
+  // start.
+  ProfileActivityMetricsRecorder::CleanupForTesting();
+  ProfileActivityMetricsRecorder::Initialize();
+
+  ActivateBrowser(regular_profile);
+  histograms()->ExpectTotalCount("Profile.State.Avatar_All", 1);
+  // This is somehow important for the session to end later in the test.
+  SimulateUserEvent();
+
+  // Repeating the same thing immediately has no impact.
+  ActivateBrowser(regular_profile);
+  histograms()->ExpectTotalCount("Profile.State.Avatar_All", 1);
+
+  // Repeating the same thing immediately has no impact (neither for any other
+  // profile). Note that guest profile can only get created with incognito.
+  ActivateIncognitoBrowser(guest_profile);
+  histograms()->ExpectTotalCount("Profile.State.Avatar_All", 1);
+
+  // Stay inactive so the session ends and stay inactive long after that.
+  task_environment()->FastForwardBy(kInactivityTimeout * 2 +
+                                    kLongTimeOfInactivity);
+
+  // Now we get another record (no matter which profile triggers that).
+  ActivateBrowser(regular_profile);
+  histograms()->ExpectTotalCount("Profile.State.Avatar_All", 2);
+
+  // Repeating the same thing immediately has no impact.
+  ActivateBrowser(regular_profile);
+  histograms()->ExpectTotalCount("Profile.State.Avatar_All", 2);
+}
diff --git a/chrome/browser/profiles/profile_attributes_entry.cc b/chrome/browser/profiles/profile_attributes_entry.cc
index 27d0e1a..92774ed 100644
--- a/chrome/browser/profiles/profile_attributes_entry.cc
+++ b/chrome/browser/profiles/profile_attributes_entry.cc
@@ -177,22 +177,6 @@
   return false;
 }
 
-base::string16 ProfileAttributesEntry::GetNameToDisplay() const {
-  base::string16 name_to_display = GetGAIANameToDisplay();
-
-  base::string16 local_profile_name = GetLocalProfileName();
-  if (name_to_display.empty())
-    return local_profile_name;
-
-  if (!ShouldShowProfileLocalName(name_to_display))
-    return name_to_display;
-
-  name_to_display.append(base::UTF8ToUTF16(" ("));
-  name_to_display.append(local_profile_name);
-  name_to_display.append(base::UTF8ToUTF16(")"));
-  return name_to_display;
-}
-
 base::string16 ProfileAttributesEntry::GetLastNameToDisplay() const {
   return last_name_to_display_;
 }
@@ -206,8 +190,25 @@
   return true;
 }
 
+NameForm ProfileAttributesEntry::GetNameForm() const {
+  base::string16 name_to_display = GetGAIANameToDisplay();
+  if (name_to_display.empty())
+    return NameForm::kLocalName;
+  if (!ShouldShowProfileLocalName(name_to_display))
+    return NameForm::kGaiaName;
+  return NameForm::kGaiaAndLocalName;
+}
+
 base::string16 ProfileAttributesEntry::GetName() const {
-  return GetNameToDisplay();
+  switch (GetNameForm()) {
+    case NameForm::kGaiaName:
+      return GetGAIANameToDisplay();
+    case NameForm::kLocalName:
+      return GetLocalProfileName();
+    case NameForm::kGaiaAndLocalName:
+      return GetGAIANameToDisplay() + base::UTF8ToUTF16(" (") +
+             GetLocalProfileName() + base::UTF8ToUTF16(")");
+  }
 }
 
 base::string16 ProfileAttributesEntry::GetShortcutName() const {
diff --git a/chrome/browser/profiles/profile_attributes_entry.h b/chrome/browser/profiles/profile_attributes_entry.h
index 1a31f561..02105ec 100644
--- a/chrome/browser/profiles/profile_attributes_entry.h
+++ b/chrome/browser/profiles/profile_attributes_entry.h
@@ -32,6 +32,12 @@
   kSignedInWithConsentedPrimaryAccount,
 };
 
+enum class NameForm {
+  kGaiaName,
+  kLocalName,
+  kGaiaAndLocalName,
+};
+
 class ProfileAttributesEntry {
  public:
   static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
@@ -51,6 +57,8 @@
   base::string16 GetGAIANameToDisplay() const;
   // Returns true if the profile name has changed.
   bool HasProfileNameChanged();
+  // Returns how the value of GetName() gets constructed.
+  NameForm GetNameForm() const;
 
   // Gets the local profile name.
   base::string16 GetLocalProfileName() const;
@@ -172,13 +180,6 @@
                   const base::FilePath& path,
                   PrefService* prefs);
 
-  // Gets the name of the profile which is the one displayed in the User Menu,
-  // which could be:
-  // - Profile name (The profile is not signed in).
-  // - Gaia name if the profile name is empty or |ShouldShowProfileLocalName()|
-  //   return false.
-  // - Otherwise the concatenation of GAIA name and local profile name.
-  base::string16 GetNameToDisplay() const;
   base::string16 GetLastNameToDisplay() const;
 
   // Returns true if:
diff --git a/chrome/browser/profiles/profile_attributes_storage.cc b/chrome/browser/profiles/profile_attributes_storage.cc
index 898feb7..316e0def 100644
--- a/chrome/browser/profiles/profile_attributes_storage.cc
+++ b/chrome/browser/profiles/profile_attributes_storage.cc
@@ -22,7 +22,10 @@
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile_avatar_downloader.h"
 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
+#include "chrome/browser/profiles/profile_metrics.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/profile_metrics/state.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "third_party/icu/source/i18n/unicode/coll.h"
@@ -56,6 +59,13 @@
   IDS_DEFAULT_AVATAR_NAME_26
 };
 
+enum class MultiProfileUserType {
+  kSingleProfile,       // There is only one profile.
+  kActiveMultiProfile,  // Several profiles are actively used.
+  kLatentMultiProfile   // There are several profiles, but only one is actively
+                        // used.
+};
+
 // Reads a PNG from disk and decodes it. If the bitmap was successfully read
 // from disk then this will return the bitmap image, otherwise it will return
 // an empty gfx::Image.
@@ -137,6 +147,76 @@
   return a->GetPath().value() < b->GetPath().value();
 }
 
+MultiProfileUserType GetMultiProfileUserType(
+    const std::vector<ProfileAttributesEntry*>& entries) {
+  DCHECK(entries.size() > 0);
+  if (entries.size() == 1u)
+    return MultiProfileUserType::kSingleProfile;
+
+  int active_count = std::count_if(
+      entries.begin(), entries.end(), [](ProfileAttributesEntry* entry) {
+        return ProfileMetrics::IsProfileActive(entry);
+      });
+
+  if (active_count <= 1)
+    return MultiProfileUserType::kLatentMultiProfile;
+  return MultiProfileUserType::kActiveMultiProfile;
+}
+
+profile_metrics::AvatarState GetAvatarState(ProfileAttributesEntry* entry) {
+  size_t index = entry->GetAvatarIconIndex();
+  bool is_modern = profiles::IsModernAvatarIconIndex(index);
+  if (entry->GetSigninState() == SigninState::kNotSignedIn) {
+    if (index == profiles::GetPlaceholderAvatarIndex())
+      return profile_metrics::AvatarState::kSignedOutDefault;
+    return is_modern ? profile_metrics::AvatarState::kSignedOutModern
+                     : profile_metrics::AvatarState::kSignedOutOld;
+  }
+  if (entry->IsUsingGAIAPicture())
+    return profile_metrics::AvatarState::kSignedInGaia;
+  return is_modern ? profile_metrics::AvatarState::kSignedInModern
+                   : profile_metrics::AvatarState::kSignedInOld;
+}
+
+profile_metrics::NameState GetNameState(ProfileAttributesEntry* entry) {
+  bool has_default_name = entry->IsUsingDefaultName();
+  switch (entry->GetNameForm()) {
+    case NameForm::kGaiaName:
+      return profile_metrics::NameState::kGaiaName;
+    case NameForm::kLocalName:
+      return has_default_name ? profile_metrics::NameState::kDefaultName
+                              : profile_metrics::NameState::kCustomName;
+    case NameForm::kGaiaAndLocalName:
+      return has_default_name ? profile_metrics::NameState::kGaiaAndDefaultName
+                              : profile_metrics::NameState::kGaiaAndCustomName;
+  }
+}
+
+profile_metrics::UnconsentedPrimaryAccountType GetUnconsentedPrimaryAccountType(
+    ProfileAttributesEntry* entry) {
+  if (entry->GetSigninState() == SigninState::kNotSignedIn)
+    return profile_metrics::UnconsentedPrimaryAccountType::kSignedOut;
+  if (entry->IsChild())
+    return profile_metrics::UnconsentedPrimaryAccountType::kChild;
+  if (policy::BrowserPolicyConnector::IsNonEnterpriseUser(
+          base::UTF16ToUTF8(entry->GetUserName()))) {
+    return profile_metrics::UnconsentedPrimaryAccountType::kConsumer;
+  }
+  // TODO(crbug.com/1060113): Figure out how to distinguish EDU accounts from
+  // other enterprise.
+  return profile_metrics::UnconsentedPrimaryAccountType::kEnterprise;
+}
+
+void RecordProfileState(ProfileAttributesEntry* entry,
+                        profile_metrics::StateSuffix suffix) {
+  profile_metrics::LogProfileAvatar(GetAvatarState(entry), suffix);
+  profile_metrics::LogProfileName(GetNameState(entry), suffix);
+  profile_metrics::LogProfileAccountType(
+      GetUnconsentedPrimaryAccountType(entry), suffix);
+  profile_metrics::LogProfileDaysSinceLastUse(
+      (base::Time::Now() - entry->GetActiveTime()).InDays(), suffix);
+}
+
 }  // namespace
 
 ProfileAttributesStorage::ProfileAttributesStorage(PrefService* prefs)
@@ -300,6 +380,38 @@
   observer_list_.RemoveObserver(obs);
 }
 
+void ProfileAttributesStorage::RecordProfilesState() {
+  std::vector<ProfileAttributesEntry*> entries = GetAllProfilesAttributes();
+  if (entries.size() == 0)
+    return;
+
+  MultiProfileUserType type = GetMultiProfileUserType(entries);
+
+  for (ProfileAttributesEntry* entry : entries) {
+    RecordProfileState(entry, profile_metrics::StateSuffix::kAll);
+
+    switch (type) {
+      case MultiProfileUserType::kSingleProfile:
+        RecordProfileState(entry, profile_metrics::StateSuffix::kSingleProfile);
+        break;
+      case MultiProfileUserType::kActiveMultiProfile:
+        RecordProfileState(entry,
+                           profile_metrics::StateSuffix::kActiveMultiProfile);
+        break;
+      case MultiProfileUserType::kLatentMultiProfile: {
+        if (ProfileMetrics::IsProfileActive(entry)) {
+          RecordProfileState(
+              entry, profile_metrics::StateSuffix::kLatentMultiProfileActive);
+        } else {
+          RecordProfileState(
+              entry, profile_metrics::StateSuffix::kLatentMultiProfileOthers);
+        }
+        break;
+      }
+    }
+  }
+}
+
 void ProfileAttributesStorage::NotifyOnProfileAvatarChanged(
     const base::FilePath& profile_path) const {
   for (auto& observer : observer_list_)
diff --git a/chrome/browser/profiles/profile_attributes_storage.h b/chrome/browser/profiles/profile_attributes_storage.h
index ddbe82a..9bb5aaf 100644
--- a/chrome/browser/profiles/profile_attributes_storage.h
+++ b/chrome/browser/profiles/profile_attributes_storage.h
@@ -94,6 +94,10 @@
   bool IsDefaultProfileName(const base::string16& name,
                             bool include_check_for_legacy_profile_name) const;
 
+  // Records statistics about profiles as would be visible in the profile picker
+  // (if we would display it in this moment).
+  void RecordProfilesState();
+
   // Returns an avatar icon index that can be assigned to a newly created
   // profile. Note that the icon may not be unique since there are a limited
   // set of default icons.
diff --git a/chrome/browser/profiles/profile_attributes_storage_unittest.cc b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
index 7b6b0c81..36d991a3 100644
--- a/chrome/browser/profiles/profile_attributes_storage_unittest.cc
+++ b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/format_macros.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile_avatar_downloader.h"
 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
@@ -21,6 +22,7 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/account_id/account_id.h"
+#include "components/profile_metrics/state.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -829,3 +831,80 @@
   EXPECT_FALSE(base::PathExists(icon_path));
 }
 #endif
+
+TEST_F(ProfileAttributesStorageTest, ProfilesState_ActiveMultiProfile) {
+  EXPECT_EQ(0U, storage()->GetNumberOfProfiles());
+  for (size_t i = 0; i < 5; ++i)
+    AddTestingProfile();
+  EXPECT_EQ(5U, storage()->GetNumberOfProfiles());
+
+  std::vector<ProfileAttributesEntry*> entries =
+      storage()->GetAllProfilesAttributes();
+  entries[0]->SetActiveTimeToNow();
+  entries[1]->SetActiveTimeToNow();
+
+  base::HistogramTester histogram_tester;
+  storage()->RecordProfilesState();
+
+  // There are 5 profiles all together.
+  histogram_tester.ExpectTotalCount("Profile.State.Avatar_All", 5);
+  histogram_tester.ExpectTotalCount("Profile.State.Avatar_ActiveMultiProfile",
+                                    5);
+
+  // Other user segments get 0 records.
+  histogram_tester.ExpectTotalCount("Profile.State.Avatar_SingleProfile", 0);
+  histogram_tester.ExpectTotalCount(
+      "Profile.State.Avatar_LatentMultiProfileActive", 0);
+  histogram_tester.ExpectTotalCount(
+      "Profile.State.Avatar_LatentMultiProfileOthers", 0);
+}
+
+// On Android (at least on KitKat), all profiles are considered active (because
+// ActiveTime is not set in production). Thus, these test does not work.
+#if !defined(OS_ANDROID)
+TEST_F(ProfileAttributesStorageTest, ProfilesState_LatentMultiProfile) {
+  EXPECT_EQ(0U, storage()->GetNumberOfProfiles());
+  for (size_t i = 0; i < 5; ++i)
+    AddTestingProfile();
+  EXPECT_EQ(5U, storage()->GetNumberOfProfiles());
+
+  std::vector<ProfileAttributesEntry*> entries =
+      storage()->GetAllProfilesAttributes();
+  entries[0]->SetActiveTimeToNow();
+
+  base::HistogramTester histogram_tester;
+  storage()->RecordProfilesState();
+
+  // There are 5 profiles all together.
+  histogram_tester.ExpectTotalCount("Profile.State.Name_All", 5);
+  histogram_tester.ExpectTotalCount(
+      "Profile.State.Name_LatentMultiProfileActive", 1);
+  histogram_tester.ExpectTotalCount(
+      "Profile.State.Name_LatentMultiProfileOthers", 4);
+
+  // Other user segments get 0 records.
+  histogram_tester.ExpectTotalCount("Profile.State.Name_SingleProfile", 0);
+  histogram_tester.ExpectTotalCount("Profile.State.Name_ActiveMultiProfile", 0);
+}
+#endif
+
+TEST_F(ProfileAttributesStorageTest, ProfilesState_SingleProfile) {
+  EXPECT_EQ(0U, storage()->GetNumberOfProfiles());
+  AddTestingProfile();
+  EXPECT_EQ(1U, storage()->GetNumberOfProfiles());
+
+  base::HistogramTester histogram_tester;
+  storage()->RecordProfilesState();
+
+  // There is 1 profile all together.
+  histogram_tester.ExpectTotalCount("Profile.State.LastUsed_All", 1);
+  histogram_tester.ExpectTotalCount("Profile.State.LastUsed_SingleProfile", 1);
+
+  // Other user segments get 0 records.
+  histogram_tester.ExpectTotalCount("Profile.State.LastUsed_ActiveMultiProfile",
+                                    0);
+  histogram_tester.ExpectTotalCount(
+      "Profile.State.LastUsed_LatentMultiProfileActive", 0);
+  histogram_tester.ExpectTotalCount(
+      "Profile.State.LastUsed_LatentMultiProfileOthers", 0);
+}
diff --git a/chrome/browser/profiles/profile_metrics.cc b/chrome/browser/profiles/profile_metrics.cc
index 0b3b9253..a845e9f 100644
--- a/chrome/browser/profiles/profile_metrics.cc
+++ b/chrome/browser/profiles/profile_metrics.cc
@@ -31,7 +31,10 @@
 
 namespace {
 
-const int kMaximumDaysOfDisuse = 4 * 7;  // Should be integral number of weeks.
+#if !defined(OS_ANDROID)
+constexpr base::TimeDelta kProfileActivityThreshold =
+    base::TimeDelta::FromDays(28);  // Should be integral number of weeks.
+#endif
 
 enum class ProfileType {
   ORIGINAL = 0,  // Refers to the original/default profile
@@ -61,17 +64,6 @@
   return metric;
 }
 
-bool HasProfileBeenActiveSince(const ProfileAttributesEntry* entry,
-                               const base::Time& active_limit) {
-#if !defined(OS_ANDROID)
-  // TODO(mlerman): iOS and Android should set an ActiveTime in the
-  // ProfileAttributesStorage. (see ProfileManager::OnBrowserSetLastActive)
-  if (entry->GetActiveTime() < active_limit)
-    return false;
-#endif
-  return true;
-}
-
 }  // namespace
 
 // This enum is used for histograms. Do not change existing values. Append new
@@ -139,6 +131,17 @@
   NUM_PROFILE_AVATAR_METRICS
 };
 
+// static
+bool ProfileMetrics::IsProfileActive(const ProfileAttributesEntry* entry) {
+#if !defined(OS_ANDROID)
+  // TODO(mlerman): iOS and Android should set an ActiveTime in the
+  // ProfileAttributesStorage. (see ProfileManager::OnBrowserSetLastActive)
+  if (base::Time::Now() - entry->GetActiveTime() > kProfileActivityThreshold)
+    return false;
+#endif
+  return true;
+}
+
 void ProfileMetrics::CountProfileInformation(ProfileAttributesStorage* storage,
                                              profile_metrics::Counts* counts) {
   size_t number_of_profiles = storage->GetNumberOfProfiles();
@@ -148,14 +151,10 @@
   if (!number_of_profiles)
     return;
 
-  // Maximum age for "active" profile is 4 weeks.
-  base::Time oldest = base::Time::Now() -
-      base::TimeDelta::FromDays(kMaximumDaysOfDisuse);
-
   std::vector<ProfileAttributesEntry*> entries =
       storage->GetAllProfilesAttributes();
   for (ProfileAttributesEntry* entry : entries) {
-    if (!HasProfileBeenActiveSince(entry, oldest)) {
+    if (!IsProfileActive(entry)) {
       counts->unused++;
     } else {
       counts->active++;
diff --git a/chrome/browser/profiles/profile_metrics.h b/chrome/browser/profiles/profile_metrics.h
index b57b1a18..5ddf02f 100644
--- a/chrome/browser/profiles/profile_metrics.h
+++ b/chrome/browser/profiles/profile_metrics.h
@@ -12,6 +12,7 @@
 #include "build/build_config.h"
 
 class Profile;
+class ProfileAttributesEntry;
 class ProfileAttributesStorage;
 
 namespace base {
@@ -121,6 +122,9 @@
   };
 #endif  // defined(OS_ANDROID)
 
+  // Returns whether profile |entry| is considered active for metrics.
+  static bool IsProfileActive(const ProfileAttributesEntry* entry);
+
   // Count and return summary information about the profiles currently in the
   // |storage|. This information is returned in the output variable |counts|.
   static void CountProfileInformation(ProfileAttributesStorage* storage,
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.css b/chrome/browser/resources/chromeos/login/oobe_eula.css
index ddc0995..c52e0dc 100644
--- a/chrome/browser/resources/chromeos/login/oobe_eula.css
+++ b/chrome/browser/resources/chromeos/login/oobe_eula.css
@@ -13,6 +13,10 @@
   min-height: 300px;
 }
 
+#additionalChromeToSFrame {
+  height: 300px;
+}
+
 #installationSettings,
 #logging {
   font-size: 13px;
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.html b/chrome/browser/resources/chromeos/login/oobe_eula.html
index 69af9c8..e6794e8e 100644
--- a/chrome/browser/resources/chromeos/login/oobe_eula.html
+++ b/chrome/browser/resources/chromeos/login/oobe_eula.html
@@ -1,10 +1,11 @@
 <!-- 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. -->
-
-<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
+<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
 
 <dom-module id="oobe-eula-md">
   <template>
@@ -34,10 +35,12 @@
             on-contentload="onFrameLoad_">
         </webview>
         <div id="footer-more" class="layout vertical">
-          <a href="#" id="additionalTerms" on-tap="onAdditionalTermsClicked_">
+          <a href="#" id="additionalTerms" on-tap="onAdditionalTermsClicked_"
+              class="oobe-local-link">
             [[i18nDynamic(locale, 'oobeEulaAditionalTerms')]]
           </a>
           <a id="installationSettings" href="#"
+              class="oobe-local-link"
               on-tap="onInstallationSettingsClicked_">
             [[i18nDynamic(locale, 'eulaSystemInstallationSettings')]]
           </a>
@@ -109,10 +112,18 @@
             on-tap="onInstallationSettingsCloseClicked_"></oobe-text-button>
       </div>
     </oobe-dialog>
-    <oobe-help-dialog id="additional-tos">
-      <webview slot="content" role="document" class="flex oobe-tos-webview"
-          id="additionalChromeToS">
+    <cr-dialog id="additional-tos" ignore-popstate
+        on-close="focusAdditionalTermsLink_"
+        on-cancel="focusAdditionalTermsLink_">
+      <div slot="title">
+        [[i18nDynamic(locale, 'oobeEulaAditionalTerms')]]
+      </div>
+      <webview slot="body" role="document" class="flex oobe-tos-webview"
+          id="additionalChromeToSFrame">
       </webview>
-    </oobe-help-dialog>
+      <oobe-text-button slot="button-container" inverse
+          on-click="hideToSDialog_" text-key="oobeModalDialogClose">
+      </oobe-text-button>
+    </cr-dialog>
   </template>
 </dom-module>
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.js b/chrome/browser/resources/chromeos/login/oobe_eula.js
index b1eaff4..a0125d9 100644
--- a/chrome/browser/resources/chromeos/login/oobe_eula.js
+++ b/chrome/browser/resources/chromeos/login/oobe_eula.js
@@ -129,7 +129,8 @@
     const additionalToSUrl =
         loadTimeData.getString('eulaAdditionalToSOnlineUrl');
     this.screen.loadEulaToWebview_(
-        this.$.additionalChromeToS, additionalToSUrl, true /* clear_anchors */);
+        this.$.additionalChromeToSFrame, additionalToSUrl,
+        true /* clear_anchors */);
     this.i18nUpdateLocale();
   },
 
@@ -151,8 +152,27 @@
     this.screen.onUsageStatsClicked_(this.$.usageStats.checked);
   },
 
+  /**
+   * @private
+   */
   onAdditionalTermsClicked_() {
-    this.$['additional-tos'].showDialog();
+    this.$['additional-tos'].showModal();
+  },
+
+  /**
+   * On-click event handler for close button of the additional ToS dialog.
+   *
+   * @private
+   */
+  hideToSDialog_() {
+    this.$['additional-tos'].close();
+  },
+
+  /**
+   * @private
+   */
+  focusAdditionalTermsLink_() {
+    this.$.additionalTerms.focus();
   },
 
   /**
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_page.html b/chrome/browser/resources/settings/safety_check_page/safety_check_page.html
index c964daac..7728638 100644
--- a/chrome/browser/resources/settings/safety_check_page/safety_check_page.html
+++ b/chrome/browser/resources/settings/safety_check_page/safety_check_page.html
@@ -51,9 +51,8 @@
         }
       }
     </style>
-    <div id="safetyCheckParent" class="settings-box first two-line" tabindex="0"
-        aria-label="[[getParentAriaLabel_(parentStatus_)]]">
-      <iron-icon icon="[[getParentIcon_(parentStatus_)]]"
+    <div id="safetyCheckParent" class="settings-box first two-line">
+      <iron-icon icon="[[getParentIcon_(parentStatus_)]]" aria-hidden="true"
           src="[[getParentIconSrc_(parentStatus_)]]"
           class$="[[getParentIconClass_(parentStatus_)]]">
       </iron-icon>
@@ -81,9 +80,8 @@
     </div>
     <iron-collapse id="safetyCheckCollapse"
         opened="[[shouldShowChildren_(parentStatus_)]]">
-      <div class="settings-box two-line" tabindex="0"
-          aria-label="[[getUpdatesAriaLabel_(updatesDisplayString_)]]">
-        <iron-icon icon="[[getUpdatesIcon_(updatesStatus_)]]"
+      <div class="settings-box two-line">
+        <iron-icon icon="[[getUpdatesIcon_(updatesStatus_)]]" aria-hidden="true"
             src="[[getUpdatesIconSrc_(updatesStatus_)]]"
             class$="[[getUpdatesIconClass_(updatesStatus_)]]">
         </iron-icon>
@@ -104,16 +102,16 @@
         </template>
         <template is="dom-if"
             if="[[shouldShowUpdatesManagedIcon_(updatesStatus_)]]" restamp>
-          <iron-icon id="safetyCheckUpdatesManagedIcon"
-              icon="cr20:domain">
+          <iron-icon id="safetyCheckUpdatesManagedIcon" icon="cr20:domain"
+              aria-hidden="true">
           </iron-icon>
         </template>
       </div>
-      <div class="settings-box two-line" tabindex="0"
-          aria-label="[[getPasswordsAriaLabel_(passwordsDisplayString_)]]">
+      <div class="settings-box two-line">
         <iron-icon icon="[[getPasswordsIcon_(passwordsStatus_)]]"
             src="[[getPasswordsIconSrc_(passwordsStatus_)]]"
-            class$="[[getPasswordsIconClass_(passwordsStatus_)]]">
+            class$="[[getPasswordsIconClass_(passwordsStatus_)]]"
+            aria-hidden="true">
         </iron-icon>
         <div class="start settings-box-text">
           <div>$i18n{passwords}</div>
@@ -131,11 +129,11 @@
           </cr-button>
         </template>
       </div>
-      <div class="settings-box two-line" tabindex="0"
-          aria-label="[[getSafeBrowsingAriaLabel_(safeBrowsingDisplayString_)]]">
+      <div class="settings-box two-line">
         <iron-icon icon="[[getSafeBrowsingIcon_(safeBrowsingStatus_)]]"
             src="[[getSafeBrowsingIconSrc_(safeBrowsingStatus_)]]"
-            class$="[[getSafeBrowsingIconClass_(safeBrowsingStatus_)]]">
+            class$="[[getSafeBrowsingIconClass_(safeBrowsingStatus_)]]"
+            aria-hidden="true">
         </iron-icon>
         <div class="start settings-box-text">
           <div>$i18n{safeBrowsingSectionLabel}</div>
@@ -155,15 +153,16 @@
         <template is="dom-if"
             if="[[shouldShowSafeBrowsingManagedIcon_(safeBrowsingStatus_)]]"
             restamp>
-          <iron-icon id="safetyCheckSafeBrowsingManagedIcon" icon="cr20:domain">
+          <iron-icon id="safetyCheckSafeBrowsingManagedIcon" icon="cr20:domain"
+              aria-hidden="true">
           </iron-icon>
         </template>
       </div>
-      <div class="settings-box two-line" tabindex="0"
-          aria-label="[[getExtensionsAriaLabel_(extensionsDisplayString_)]]">
+      <div class="settings-box two-line">
         <iron-icon icon="[[getExtensionsIcon_(extensionsStatus_)]]"
             src="[[getExtensionsIconSrc_(extensionsStatus_)]]"
-            class$="[[getExtensionsIconClass_(extensionsStatus_)]]">
+            class$="[[getExtensionsIconClass_(extensionsStatus_)]]"
+            aria-hidden="true">
         </iron-icon>
         <div class="start settings-box-text">
           <div>$i18n{safetyCheckExtensionsPrimaryLabel}</div>
@@ -184,7 +183,8 @@
         <template is="dom-if"
             if="[[shouldShowExtensionsManagedIcon_(extensionsStatus_)]]"
             restamp>
-          <iron-icon id="safetyCheckExtensionsManagedIcon" icon="cr20:domain">
+          <iron-icon id="safetyCheckExtensionsManagedIcon" icon="cr20:domain"
+              aria-hidden="true">
           </iron-icon>
         </template>
       </div>
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_page.js b/chrome/browser/resources/settings/safety_check_page/safety_check_page.js
index dd74e9c3..ea417748 100644
--- a/chrome/browser/resources/settings/safety_check_page/safety_check_page.js
+++ b/chrome/browser/resources/settings/safety_check_page/safety_check_page.js
@@ -363,15 +363,6 @@
     this.focusParent_();
   },
 
-  /**
-   * @private
-   * @return {string}
-   */
-  getParentAriaLabel_: function() {
-    return this.i18n('safetyCheckSectionTitle') + ': ' +
-        this.parentDisplayString_;
-  },
-
   /** @private */
   focusParent_() {
     const parent = /** @type {!Element} */ (this.$$('#safetyCheckParent'));
@@ -463,15 +454,6 @@
 
   /**
    * @private
-   * @return {string}
-   */
-  getUpdatesAriaLabel_: function() {
-    return this.i18n('safetyCheckUpdatesPrimaryLabel') + ': ' +
-        this.updatesDisplayString_;
-  },
-
-  /**
-   * @private
    * @return {boolean}
    */
   shouldShowPasswordsButton_: function() {
@@ -505,15 +487,6 @@
 
   /**
    * @private
-   * @return {string}
-   */
-  getPasswordsAriaLabel_: function() {
-    return this.i18n('passwords') + ': ' + this.passwordsDisplayString_;
-  },
-
-
-  /**
-   * @private
    * @return {?string}
    */
   getPasswordsIconSrc_: function() {
@@ -618,15 +591,6 @@
     }
   },
 
-  /**
-   * @private
-   * @return {string}
-   */
-  getSafeBrowsingAriaLabel_: function() {
-    return this.i18n('safeBrowsingSectionLabel') + ': ' +
-        this.safeBrowsingDisplayString_;
-  },
-
   /** @private */
   onSafeBrowsingButtonClick_: function() {
     settings.Router.getInstance().navigateTo(settings.routes.SECURITY);
@@ -725,15 +689,6 @@
    * @private
    * @return {string}
    */
-  getExtensionsAriaLabel_: function() {
-    return this.i18n('safetyCheckExtensionsPrimaryLabel') + ': ' +
-        this.extensionsDisplayString_;
-  },
-
-  /**
-   * @private
-   * @return {string}
-   */
   getExtensionsButtonClass_: function() {
     switch (this.extensionsStatus_) {
       case settings.SafetyCheckExtensionsStatus
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
index ffb4e77f..3fef1f1 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_views.cc
@@ -387,34 +387,34 @@
   // TODO(domfc): Add "Learn more" button on scan failure.
   if (is_warning()) {
     // Include the Ok and Cancel buttons if there is a bypassable warning.
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL |
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL |
                                 ui::DIALOG_BUTTON_OK);
-    DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL);
+    DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL);
 
-    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+    DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                      GetCancelButtonText());
-    DialogDelegate::set_cancel_callback(
+    DialogDelegate::SetCancelCallback(
         base::BindOnce(&DeepScanningDialogViews::CancelButtonCallback,
                        weak_ptr_factory_.GetWeakPtr()));
 
-    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+    DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                      GetBypassWarningButtonText());
-    DialogDelegate::set_accept_callback(
+    DialogDelegate::SetAcceptCallback(
         base::BindOnce(&DeepScanningDialogViews::AcceptButtonCallback,
                        weak_ptr_factory_.GetWeakPtr()));
   } else if (is_failure() || is_pending()) {
     // Include the Cancel button when the scan is pending or failing.
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL);
-    DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL);
+    DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_NONE);
 
-    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+    DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                      GetCancelButtonText());
-    DialogDelegate::set_cancel_callback(
+    DialogDelegate::SetCancelCallback(
         base::BindOnce(&DeepScanningDialogViews::CancelButtonCallback,
                        weak_ptr_factory_.GetWeakPtr()));
   } else {
     // Include no buttons otherwise.
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   }
 }
 
diff --git a/chrome/browser/sharing/shared_clipboard/remote_copy_message_handler_unittest.cc b/chrome/browser/sharing/shared_clipboard/remote_copy_message_handler_unittest.cc
index b7b9201..b2cf72ec 100644
--- a/chrome/browser/sharing/shared_clipboard/remote_copy_message_handler_unittest.cc
+++ b/chrome/browser/sharing/shared_clipboard/remote_copy_message_handler_unittest.cc
@@ -26,6 +26,8 @@
 #include "content/public/test/url_loader_interceptor.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/clipboard/clipboard_monitor.h"
+#include "ui/base/clipboard/clipboard_observer.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/skia_util.h"
@@ -39,6 +41,21 @@
 const char kHistogramName[] = "Sharing.RemoteCopyHandleMessageResult";
 const char kTestImageUrl[] = "https://foo.com/image.png";
 
+class ClipboardObserver : public ui::ClipboardObserver {
+ public:
+  explicit ClipboardObserver(base::RepeatingClosure callback)
+      : callback_(callback) {}
+  ClipboardObserver(const ClipboardObserver&) = delete;
+  ClipboardObserver& operator=(const ClipboardObserver&) = delete;
+  ~ClipboardObserver() override = default;
+
+  // ui::ClipboardObserver:
+  void OnClipboardDataChanged() override { callback_.Run(); }
+
+ private:
+  base::RepeatingClosure callback_;
+};
+
 class RemoteCopyMessageHandlerTest : public SharedClipboardTestBase {
  public:
   RemoteCopyMessageHandlerTest()
@@ -170,9 +187,8 @@
       IsImageSourceAllowed(image_url, "https://bar.com,https://foo.com"));
 }
 
-// Times out on all platforms. https://crbug.com/1060869
 TEST_F(RemoteCopyMessageHandlerTest,
-       DISABLED_NoProgressNotificationWithoutProgressFlag) {
+       NoProgressNotificationWithoutProgressFlag) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{kRemoteCopyReceiver,
@@ -183,11 +199,13 @@
                               base::DoNothing());
 
   EXPECT_FALSE(HasProgressNotification());
+
+  // Calling GetDefaultStoragePartition creates tasks that need to run before
+  // the ScopedFeatureList is destroyed. See crbug.com/1060869
+  task_environment_.RunUntilIdle();
 }
 
-// Times out on all platforms. https://crbug.com/1060869
-TEST_F(RemoteCopyMessageHandlerTest,
-       DISABLED_ProgressNotificationWithProgressFlag) {
+TEST_F(RemoteCopyMessageHandlerTest, ProgressNotificationWithProgressFlag) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}},
@@ -208,25 +226,33 @@
                 IDS_SHARING_REMOTE_COPY_NOTIFICATION_PREPARING_DOWNLOAD),
             notification.progress_status());
   EXPECT_EQ(-1, notification.progress());
+
+  // Calling GetDefaultStoragePartition creates tasks that need to run before
+  // the ScopedFeatureList is destroyed. See crbug.com/1060869
+  task_environment_.RunUntilIdle();
 }
 
-// Times out on all platforms. https://crbug.com/1060869
-TEST_F(RemoteCopyMessageHandlerTest,
-       DISABLED_ImageNotificationWithoutProgressFlag) {
+TEST_F(RemoteCopyMessageHandlerTest, ImageNotificationWithoutProgressFlag) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{kRemoteCopyReceiver,
         {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}}},
       {kRemoteCopyProgressNotification});
 
+  base::RunLoop run_loop;
+  ClipboardObserver observer(run_loop.QuitClosure());
+  ui::ClipboardMonitor::GetInstance()->AddObserver(&observer);
+
   message_handler_->OnMessage(CreateMessageWithImage(kTestImageUrl),
                               base::DoNothing());
 
   // There should not be a progress notification without the flag set.
   EXPECT_FALSE(HasProgressNotification());
 
-  // Let tasks run until the image is decoded and written to the clipboard.
-  task_environment_.RunUntilIdle();
+  // Let tasks run until the image is decoded, written to the clipboard and the
+  // image notification is shown.
+  run_loop.Run();
+  ui::ClipboardMonitor::GetInstance()->RemoveObserver(&observer);
 
   // Expect the image to be in the clipboard now.
   SkBitmap image = GetClipboardImage();
@@ -235,27 +261,33 @@
   // Expect an image notification showing the image.
   auto notification = GetImageNotification();
   EXPECT_FALSE(notification.image().IsEmpty());
+
+  // Calling GetDefaultStoragePartition creates tasks that need to run before
+  // the ScopedFeatureList is destroyed. See crbug.com/1060869
+  task_environment_.RunUntilIdle();
 }
 
-// Times out on all platforms. https://crbug.com/1060869
-TEST_F(RemoteCopyMessageHandlerTest,
-       DISABLED_ImageNotificationWithProgressFlag) {
+TEST_F(RemoteCopyMessageHandlerTest, ImageNotificationWithProgressFlag) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}},
        {kRemoteCopyProgressNotification, {}}},
       {});
 
+  base::RunLoop run_loop;
+  ClipboardObserver observer(run_loop.QuitClosure());
+  ui::ClipboardMonitor::GetInstance()->AddObserver(&observer);
+
   message_handler_->OnMessage(CreateMessageWithImage(kTestImageUrl),
                               base::DoNothing());
 
   // There should be a progress notification with the flag set.
   EXPECT_TRUE(HasProgressNotification());
 
-  // Let tasks run until the image is decoded and written to the clipboard.
-  // TODO(knollr): Test updates to the progress notitification during the
-  // download.
-  task_environment_.RunUntilIdle();
+  // Let tasks run until the image is decoded, written to the clipboard and the
+  // image notification is shown.
+  run_loop.Run();
+  ui::ClipboardMonitor::GetInstance()->RemoveObserver(&observer);
 
   // After finishing the transfer there should be no progress notification.
   EXPECT_FALSE(HasProgressNotification());
@@ -267,10 +299,13 @@
   // Expect an image notification showing the image.
   auto notification = GetImageNotification();
   EXPECT_FALSE(notification.image().IsEmpty());
+
+  // Calling GetDefaultStoragePartition creates tasks that need to run before
+  // the ScopedFeatureList is destroyed. See crbug.com/1060869
+  task_environment_.RunUntilIdle();
 }
 
-// Times out on all platforms. https://crbug.com/1060869
-TEST_F(RemoteCopyMessageHandlerTest, DISABLED_CancelProgressNotification) {
+TEST_F(RemoteCopyMessageHandlerTest, CancelProgressNotification) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}},
@@ -296,14 +331,17 @@
   EXPECT_FALSE(HasImageNotification());
 }
 
-// Times out on all platforms. https://crbug.com/1060869
-TEST_F(RemoteCopyMessageHandlerTest, DISABLED_DismissProgressNotification) {
+TEST_F(RemoteCopyMessageHandlerTest, DismissProgressNotification) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{kRemoteCopyReceiver, {{kRemoteCopyAllowedOrigins.name, kTestImageUrl}}},
        {kRemoteCopyProgressNotification, {}}},
       {});
 
+  base::RunLoop run_loop;
+  ClipboardObserver observer(run_loop.QuitClosure());
+  ui::ClipboardMonitor::GetInstance()->AddObserver(&observer);
+
   message_handler_->OnMessage(CreateMessageWithImage(kTestImageUrl),
                               base::DoNothing());
   auto notification = GetProgressNotification();
@@ -316,8 +354,14 @@
   // The progress notification should now be closed.
   EXPECT_FALSE(HasProgressNotification());
 
-  // Let tasks run until the image is decoded and written to the clipboard.
-  task_environment_.RunUntilIdle();
+  // Let tasks run until the image is decoded, written to the clipboard and the
+  // image notification is shown.
+  run_loop.Run();
+  ui::ClipboardMonitor::GetInstance()->RemoveObserver(&observer);
 
   EXPECT_TRUE(HasImageNotification());
+
+  // Calling GetDefaultStoragePartition creates tasks that need to run before
+  // the ScopedFeatureList is destroyed. See crbug.com/1060869
+  task_environment_.RunUntilIdle();
 }
diff --git a/chrome/browser/sharing/sharing_device_registration.cc b/chrome/browser/sharing/sharing_device_registration.cc
index eeb1f74c..cbf2e580 100644
--- a/chrome/browser/sharing/sharing_device_registration.cc
+++ b/chrome/browser/sharing/sharing_device_registration.cc
@@ -337,7 +337,13 @@
 }
 
 bool SharingDeviceRegistration::IsPeerConnectionSupported() const {
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+    defined(OS_CHROMEOS)
   return base::FeatureList::IsEnabled(kSharingPeerConnectionReceiver);
+#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
+        // defined(OS_CHROMEOS)
+
+  return false;
 }
 
 void SharingDeviceRegistration::SetEnabledFeaturesForTesting(
diff --git a/chrome/browser/sharing/sharing_service.cc b/chrome/browser/sharing/sharing_service.cc
index a0b771c..086c1a0 100644
--- a/chrome/browser/sharing/sharing_service.cc
+++ b/chrome/browser/sharing/sharing_service.cc
@@ -30,6 +30,8 @@
 SharingMessageSender::DelegateType GetSendDelegateType(
     const syncer::DeviceInfo& device,
     const chrome_browser_sharing::SharingMessage& message) {
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+    defined(OS_CHROMEOS)
   // Messages other than SharedClipboard are always sent via FCM.
   if (message.payload_case() !=
       chrome_browser_sharing::SharingMessage::kSharedClipboardMessage) {
@@ -54,6 +56,11 @@
   // logic once we wrap up the experiment and e.g. only send messages over a
   // certain size via WebRTC.
   return SharingMessageSender::DelegateType::kWebRtc;
+#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
+        // defined(OS_CHROMEOS)
+
+  // Only FCM is supported for non desktop OS.
+  return SharingMessageSender::DelegateType::kFCM;
 }
 
 }  // namespace
diff --git a/chrome/browser/sharing/webrtc/webrtc_flags.cc b/chrome/browser/sharing/webrtc/webrtc_flags.cc
index 294d8a2..7e097c7b 100644
--- a/chrome/browser/sharing/webrtc/webrtc_flags.cc
+++ b/chrome/browser/sharing/webrtc/webrtc_flags.cc
@@ -4,8 +4,12 @@
 
 #include "chrome/browser/sharing/webrtc/webrtc_flags.h"
 
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+    defined(OS_CHROMEOS)
 const base::Feature kSharingPeerConnectionReceiver{
     "SharingPeerConnectionReceiver", base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kSharingPeerConnectionSender{
     "SharingPeerConnectionSender", base::FEATURE_ENABLED_BY_DEFAULT};
+#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
+        // defined(OS_CHROMEOS)
diff --git a/chrome/browser/sharing/webrtc/webrtc_flags.h b/chrome/browser/sharing/webrtc/webrtc_flags.h
index f1c5133..c1dc0be 100644
--- a/chrome/browser/sharing/webrtc/webrtc_flags.h
+++ b/chrome/browser/sharing/webrtc/webrtc_flags.h
@@ -6,11 +6,16 @@
 #define CHROME_BROWSER_SHARING_WEBRTC_WEBRTC_FLAGS_H_
 
 #include "base/feature_list.h"
+#include "build/build_config.h"
 
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
+    defined(OS_CHROMEOS)
 // Feature flag to enable receiving PeerConnection requests.
 extern const base::Feature kSharingPeerConnectionReceiver;
 
 // Feature flag to enable sending SharingMessage using PeerConnection.
 extern const base::Feature kSharingPeerConnectionSender;
+#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
+        // defined(OS_CHROMEOS)
 
 #endif  // CHROME_BROWSER_SHARING_WEBRTC_WEBRTC_FLAGS_H_
diff --git a/chrome/browser/signin/account_consistency_mode_manager.cc b/chrome/browser/signin/account_consistency_mode_manager.cc
index 306c6d0..50ad925 100644
--- a/chrome/browser/signin/account_consistency_mode_manager.cc
+++ b/chrome/browser/signin/account_consistency_mode_manager.cc
@@ -33,35 +33,8 @@
 // Preference indicating that the Dice migraton has happened.
 const char kDiceMigrationCompletePref[] = "signin.DiceMigrationComplete";
 
-const char kDiceMigrationStatusHistogram[] = "Signin.DiceMigrationStatus";
-
 const char kAllowBrowserSigninArgument[] = "allow-browser-signin";
 
-// Used for UMA histogram kDiceMigrationStatusHistogram.
-// Do not remove or re-order values.
-enum class DiceMigrationStatus {
-  kEnabled,
-  kDisabledReadyForMigration,
-  kDisabledNotReadyForMigration,
-  kDisabled,
-
-  // This is the last value. New values should be inserted above.
-  kDiceMigrationStatusCount
-};
-
-DiceMigrationStatus GetDiceMigrationStatus(
-    AccountConsistencyMethod account_consistency) {
-  switch (account_consistency) {
-    case AccountConsistencyMethod::kDice:
-      return DiceMigrationStatus::kEnabled;
-    case AccountConsistencyMethod::kDisabled:
-      return DiceMigrationStatus::kDisabled;
-    case AccountConsistencyMethod::kMirror:
-      NOTREACHED();
-      return DiceMigrationStatus::kDisabled;
-  }
-}
-
 bool IsBrowserSigninAllowedByCommandLine() {
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(kAllowBrowserSigninArgument)) {
@@ -110,10 +83,6 @@
   // were created before Dice.
   if (profile_->IsNewProfile())
     SetDiceMigrationCompleted();
-
-  UMA_HISTOGRAM_ENUMERATION(kDiceMigrationStatusHistogram,
-                            GetDiceMigrationStatus(account_consistency_),
-                            DiceMigrationStatus::kDiceMigrationStatusCount);
 #endif
 
   DCHECK_EQ(account_consistency_, ComputeAccountConsistencyMethod(profile_));
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc b/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
index c025542..7b85b1e 100644
--- a/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
+++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
@@ -350,7 +350,7 @@
   sync_error_handler_.reset();
 }
 
-syncer::SyncDataList SpellcheckCustomDictionary::GetAllSyncData(
+syncer::SyncDataList SpellcheckCustomDictionary::GetAllSyncDataForTesting(
     syncer::ModelType type) const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(syncer::DICTIONARY, type);
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary.h b/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
index 7ea9991..61e2e8a5 100644
--- a/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
+++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary.h
@@ -154,7 +154,7 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> sync_error_handler) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc b/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
index 1b75004..385d13f 100644
--- a/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
+++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary_unittest.cc
@@ -300,13 +300,14 @@
       SpellcheckServiceFactory::GetForContext(
           &profile_)->GetCustomDictionary();
 
-  syncer::SyncDataList data = dictionary->GetAllSyncData(syncer::DICTIONARY);
+  syncer::SyncDataList data =
+      dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY);
   EXPECT_TRUE(data.empty());
 
   EXPECT_TRUE(dictionary->AddWord("bar"));
   EXPECT_TRUE(dictionary->AddWord("foo"));
 
-  data = dictionary->GetAllSyncData(syncer::DICTIONARY);
+  data = dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY);
   EXPECT_EQ(2UL, data.size());
   std::vector<std::string> words;
   words.push_back("bar");
@@ -321,7 +322,7 @@
   EXPECT_TRUE(dictionary->RemoveWord("bar"));
   EXPECT_TRUE(dictionary->RemoveWord("foo"));
 
-  data = dictionary->GetAllSyncData(syncer::DICTIONARY);
+  data = dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY);
   EXPECT_TRUE(data.empty());
 }
 
@@ -338,25 +339,25 @@
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords - 1,
             dictionary->GetWords().size());
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords - 1,
-            dictionary->GetAllSyncData(syncer::DICTIONARY).size());
+            dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 
   dictionary->AddWord("baz");
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
             dictionary->GetWords().size());
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            dictionary->GetAllSyncData(syncer::DICTIONARY).size());
+            dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 
   dictionary->AddWord("bar");
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords + 1,
             dictionary->GetWords().size());
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            dictionary->GetAllSyncData(syncer::DICTIONARY).size());
+            dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 
   dictionary->AddWord("snafoo");
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords + 2,
             dictionary->GetWords().size());
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            dictionary->GetAllSyncData(syncer::DICTIONARY).size());
+            dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, ProcessSyncChanges) {
@@ -455,17 +456,18 @@
   Apply(*custom_dictionary2, change2);
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_TRUE(custom_dictionary->IsSyncing());
 
@@ -515,17 +517,18 @@
   EXPECT_TRUE(custom_dictionary->GetWords().empty());
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_TRUE(custom_dictionary->IsSyncing());
 
@@ -563,17 +566,18 @@
   Apply(*custom_dictionary, change);
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_FALSE(custom_dictionary->IsSyncing());
 
@@ -582,10 +586,12 @@
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
             custom_dictionary2->GetWords().size());
 
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size());
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigAndServerFull) {
@@ -616,17 +622,18 @@
             custom_dictionary2->GetWords().size());
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_FALSE(custom_dictionary->IsSyncing());
 
@@ -635,10 +642,12 @@
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
             custom_dictionary2->GetWords().size());
 
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size());
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, ServerTooBig) {
@@ -687,10 +696,12 @@
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords + 1,
             custom_dictionary2->GetWords().size());
 
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size());
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigToStartSyncing) {
@@ -715,17 +726,18 @@
   custom_dictionary2->AddWord("baz");
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_FALSE(custom_dictionary->IsSyncing());
 
@@ -734,10 +746,12 @@
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
             custom_dictionary2->GetWords().size());
 
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size());
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, DictionaryTooBigToContiueSyncing) {
@@ -759,17 +773,18 @@
   Apply(*custom_dictionary, change);
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_TRUE(custom_dictionary->IsSyncing());
 
@@ -786,10 +801,12 @@
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
             custom_dictionary2->GetWords().size());
 
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size());
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, LoadAfterSyncStart) {
@@ -807,17 +824,18 @@
   custom_dictionary->AddWord("foo");
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_TRUE(custom_dictionary->IsSyncing());
 
@@ -830,8 +848,12 @@
   EXPECT_EQ(2UL, custom_dictionary->GetWords().size());
   EXPECT_EQ(2UL, custom_dictionary2->GetWords().size());
 
-  EXPECT_EQ(2UL, custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size());
-  EXPECT_EQ(2UL, custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      2UL,
+      custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      2UL,
+      custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, LoadAfterSyncStartTooBigToSync) {
@@ -849,17 +871,18 @@
   custom_dictionary->AddWord("foo");
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_TRUE(custom_dictionary->IsSyncing());
 
@@ -877,10 +900,12 @@
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
             custom_dictionary2->GetWords().size());
 
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size());
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
-            custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords,
+      custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, LoadDuplicatesAfterSync) {
@@ -902,17 +927,18 @@
   Apply(*custom_dictionary, change);
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_TRUE(custom_dictionary->IsSyncing());
 
@@ -926,10 +952,12 @@
   EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords / 2,
             custom_dictionary2->GetWords().size());
 
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords / 2,
-            custom_dictionary->GetAllSyncData(syncer::DICTIONARY).size());
-  EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords / 2,
-            custom_dictionary2->GetAllSyncData(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords / 2,
+      custom_dictionary->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
+  EXPECT_EQ(
+      spellcheck::kMaxSyncableDictionaryWords / 2,
+      custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY).size());
 }
 
 TEST_F(SpellcheckCustomDictionaryTest, DictionaryLoadNotification) {
@@ -1024,17 +1052,18 @@
   custom_dictionary2->AddObserver(&observer2);
 
   int error_counter = 0;
-  EXPECT_FALSE(custom_dictionary
-                   ->MergeDataAndStartSyncing(
-                       syncer::DICTIONARY,
-                       custom_dictionary2->GetAllSyncData(syncer::DICTIONARY),
-                       std::unique_ptr<syncer::SyncChangeProcessor>(
-                           new syncer::SyncChangeProcessorWrapperForTest(
-                               custom_dictionary2)),
-                       std::unique_ptr<syncer::SyncErrorFactory>(
-                           new SyncErrorFactoryStub(&error_counter)))
-                   .error()
-                   .IsSet());
+  EXPECT_FALSE(
+      custom_dictionary
+          ->MergeDataAndStartSyncing(
+              syncer::DICTIONARY,
+              custom_dictionary2->GetAllSyncDataForTesting(syncer::DICTIONARY),
+              std::unique_ptr<syncer::SyncChangeProcessor>(
+                  new syncer::SyncChangeProcessorWrapperForTest(
+                      custom_dictionary2)),
+              std::unique_ptr<syncer::SyncErrorFactory>(
+                  new SyncErrorFactoryStub(&error_counter)))
+          .error()
+          .IsSet());
   EXPECT_EQ(0, error_counter);
   EXPECT_TRUE(custom_dictionary->IsSyncing());
 
@@ -1074,18 +1103,18 @@
     Apply(*custom_dictionary, change);
 
     int error_counter = 0;
-    EXPECT_FALSE(
-        custom_dictionary
-            ->MergeDataAndStartSyncing(
-                syncer::DICTIONARY,
-                server_custom_dictionary->GetAllSyncData(syncer::DICTIONARY),
-                std::unique_ptr<syncer::SyncChangeProcessor>(
-                    new syncer::SyncChangeProcessorWrapperForTest(
-                        server_custom_dictionary)),
-                std::unique_ptr<syncer::SyncErrorFactory>(
-                    new SyncErrorFactoryStub(&error_counter)))
-            .error()
-            .IsSet());
+    EXPECT_FALSE(custom_dictionary
+                     ->MergeDataAndStartSyncing(
+                         syncer::DICTIONARY,
+                         server_custom_dictionary->GetAllSyncDataForTesting(
+                             syncer::DICTIONARY),
+                         std::unique_ptr<syncer::SyncChangeProcessor>(
+                             new syncer::SyncChangeProcessorWrapperForTest(
+                                 server_custom_dictionary)),
+                         std::unique_ptr<syncer::SyncErrorFactory>(
+                             new SyncErrorFactoryStub(&error_counter)))
+                     .error()
+                     .IsSet());
     EXPECT_EQ(0, error_counter);
     EXPECT_TRUE(custom_dictionary->IsSyncing());
     EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords,
@@ -1120,18 +1149,18 @@
 
     // Associate the server and the client.
     int error_counter = 0;
-    EXPECT_FALSE(
-        client_custom_dictionary
-            ->MergeDataAndStartSyncing(
-                syncer::DICTIONARY,
-                server_custom_dictionary->GetAllSyncData(syncer::DICTIONARY),
-                std::unique_ptr<syncer::SyncChangeProcessor>(
-                    new syncer::SyncChangeProcessorWrapperForTest(
-                        server_custom_dictionary)),
-                std::unique_ptr<syncer::SyncErrorFactory>(
-                    new SyncErrorFactoryStub(&error_counter)))
-            .error()
-            .IsSet());
+    EXPECT_FALSE(client_custom_dictionary
+                     ->MergeDataAndStartSyncing(
+                         syncer::DICTIONARY,
+                         server_custom_dictionary->GetAllSyncDataForTesting(
+                             syncer::DICTIONARY),
+                         std::unique_ptr<syncer::SyncChangeProcessor>(
+                             new syncer::SyncChangeProcessorWrapperForTest(
+                                 server_custom_dictionary)),
+                         std::unique_ptr<syncer::SyncErrorFactory>(
+                             new SyncErrorFactoryStub(&error_counter)))
+                     .error()
+                     .IsSet());
     EXPECT_EQ(0, error_counter);
     EXPECT_FALSE(client_custom_dictionary->IsSyncing());
     EXPECT_EQ(spellcheck::kMaxSyncableDictionaryWords * 2,
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
index ba7b902..5406c3f4 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
+++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
@@ -39,22 +39,6 @@
 
 using content::NavigationEntry;
 
-// static
-void SupervisedUserNavigationObserver::MaybeCreateForWebContents(
-    content::WebContents* web_contents) {
-  DCHECK(web_contents);
-  Profile* user_profile =
-      Profile::FromBrowserContext(web_contents->GetBrowserContext());
-  if (!user_profile->IsSupervised())
-    return;
-
-  if (!FromWebContents(web_contents)) {
-    web_contents->SetUserData(
-        UserDataKey(),
-        base::WrapUnique(new SupervisedUserNavigationObserver(web_contents)));
-  }
-}
-
 SupervisedUserNavigationObserver::~SupervisedUserNavigationObserver() {
   supervised_user_service_->RemoveObserver(this);
 }
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.h b/chrome/browser/supervised_user/supervised_user_navigation_observer.h
index 16e2960..f7a4d78 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_observer.h
+++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.h
@@ -40,10 +40,6 @@
       public SupervisedUserServiceObserver,
       public supervised_user::mojom::SupervisedUserCommands {
  public:
-  // Creates SupervisedUserNavigationObserver if the profile is a child user.
-  static void MaybeCreateForWebContents(content::WebContents* web_contents);
-  static void CreateForWebContents(content::WebContents* web_contents) = delete;
-
   ~SupervisedUserNavigationObserver() override;
 
   const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>&
diff --git a/chrome/browser/supervised_user/supervised_user_settings_service.cc b/chrome/browser/supervised_user/supervised_user_settings_service.cc
index 5967f4e..42524db 100644
--- a/chrome/browser/supervised_user/supervised_user_settings_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_settings_service.cc
@@ -336,7 +336,7 @@
   error_handler_.reset();
 }
 
-SyncDataList SupervisedUserSettingsService::GetAllSyncData(
+SyncDataList SupervisedUserSettingsService::GetAllSyncDataForTesting(
     ModelType type) const {
   DCHECK_EQ(syncer::SUPERVISED_USER_SETTINGS, type);
   SyncDataList data;
diff --git a/chrome/browser/supervised_user/supervised_user_settings_service.h b/chrome/browser/supervised_user/supervised_user_settings_service.h
index c40f7d1..072ea1ae 100644
--- a/chrome/browser/supervised_user/supervised_user_settings_service.h
+++ b/chrome/browser/supervised_user/supervised_user_settings_service.h
@@ -133,7 +133,7 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> error_handler) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc b/chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc
index 762e49a0b..9a961c56 100644
--- a/chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc
+++ b/chrome/browser/supervised_user/supervised_user_settings_service_unittest.cc
@@ -302,8 +302,8 @@
   }
 
   // It should also show up in local Sync data.
-  syncer::SyncDataList sync_data =
-      settings_service_.GetAllSyncData(syncer::SUPERVISED_USER_SETTINGS);
+  syncer::SyncDataList sync_data = settings_service_.GetAllSyncDataForTesting(
+      syncer::SUPERVISED_USER_SETTINGS);
   EXPECT_EQ(3u, sync_data.size());
   for (const syncer::SyncData& sync_data_item : sync_data)
     VerifySyncDataItem(sync_data_item);
@@ -317,7 +317,7 @@
   EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type());
   VerifySyncDataItem(change.sync_data());
 
-  sync_data = settings_service_.GetAllSyncData(
+  sync_data = settings_service_.GetAllSyncDataForTesting(
       syncer::SUPERVISED_USER_SETTINGS);
   EXPECT_EQ(4u, sync_data.size());
   for (const syncer::SyncData& sync_data_item : sync_data)
@@ -333,7 +333,7 @@
   EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type());
   VerifySyncDataItem(change.sync_data());
 
-  sync_data = settings_service_.GetAllSyncData(
+  sync_data = settings_service_.GetAllSyncDataForTesting(
       syncer::SUPERVISED_USER_SETTINGS);
   EXPECT_EQ(4u, sync_data.size());
   for (const syncer::SyncData& sync_data_item : sync_data)
@@ -347,7 +347,7 @@
   EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type());
   VerifySyncDataItem(change.sync_data());
 
-  sync_data = settings_service_.GetAllSyncData(
+  sync_data = settings_service_.GetAllSyncDataForTesting(
       syncer::SUPERVISED_USER_SETTINGS);
   EXPECT_EQ(4u, sync_data.size());
   for (const syncer::SyncData& sync_data_item : sync_data)
diff --git a/chrome/browser/supervised_user/supervised_user_whitelist_service.cc b/chrome/browser/supervised_user/supervised_user_whitelist_service.cc
index 57ef85f0..38fdf38 100644
--- a/chrome/browser/supervised_user/supervised_user_whitelist_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_whitelist_service.cc
@@ -213,29 +213,6 @@
   DCHECK_EQ(syncer::SUPERVISED_USER_WHITELISTS, type);
 }
 
-syncer::SyncDataList SupervisedUserWhitelistService::GetAllSyncData(
-    syncer::ModelType type) const {
-  syncer::SyncDataList sync_data;
-  const base::DictionaryValue* whitelists =
-      prefs_->GetDictionary(prefs::kSupervisedUserWhitelists);
-  for (base::DictionaryValue::Iterator it(*whitelists); !it.IsAtEnd();
-       it.Advance()) {
-    const std::string& id = it.key();
-    const base::DictionaryValue* dict = nullptr;
-    it.value().GetAsDictionary(&dict);
-    std::string name;
-    bool result = dict->GetString(kName, &name);
-    DCHECK(result);
-    sync_pb::EntitySpecifics specifics;
-    sync_pb::ManagedUserWhitelistSpecifics* whitelist =
-        specifics.mutable_managed_user_whitelist();
-    whitelist->set_id(id);
-    whitelist->set_name(name);
-    sync_data.push_back(syncer::SyncData::CreateLocalData(id, name, specifics));
-  }
-  return sync_data;
-}
-
 syncer::SyncError SupervisedUserWhitelistService::ProcessSyncChanges(
     const base::Location& from_here,
     const syncer::SyncChangeList& change_list) {
diff --git a/chrome/browser/supervised_user/supervised_user_whitelist_service.h b/chrome/browser/supervised_user/supervised_user_whitelist_service.h
index 740e571b..4b6b8a1 100644
--- a/chrome/browser/supervised_user/supervised_user_whitelist_service.h
+++ b/chrome/browser/supervised_user/supervised_user_whitelist_service.h
@@ -85,7 +85,6 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> error_handler) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/supervised_user/supervised_user_whitelist_service_unittest.cc b/chrome/browser/supervised_user/supervised_user_whitelist_service_unittest.cc
index aed02c54..75731ee 100644
--- a/chrome/browser/supervised_user/supervised_user_whitelist_service_unittest.cc
+++ b/chrome/browser/supervised_user/supervised_user_whitelist_service_unittest.cc
@@ -264,18 +264,3 @@
 
   CheckFinalStateAndPreferences();
 }
-
-TEST_F(SupervisedUserWhitelistServiceTest, GetAllSyncData) {
-  PrepareInitialStateAndPreferences();
-
-  syncer::SyncDataList sync_data =
-      service_->GetAllSyncData(syncer::SUPERVISED_USER_WHITELISTS);
-  ASSERT_EQ(2u, sync_data.size());
-  const sync_pb::ManagedUserWhitelistSpecifics* whitelist =
-      FindWhitelist(sync_data, "aaaa");
-  ASSERT_TRUE(whitelist);
-  EXPECT_EQ("Whitelist A", whitelist->name());
-  whitelist = FindWhitelist(sync_data, "bbbb");
-  ASSERT_TRUE(whitelist);
-  EXPECT_EQ("Whitelist B", whitelist->name());
-}
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index 4d7b8ad..81a3efa 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -65,7 +65,6 @@
 #include "components/invalidation/impl/invalidation_switches.h"
 #include "components/invalidation/impl/profile_invalidation_provider.h"
 #include "components/password_manager/core/browser/password_store.h"
-#include "components/password_manager/core/browser/sync/password_model_worker.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
 #include "components/spellcheck/spellcheck_buildflags.h"
@@ -79,8 +78,6 @@
 #include "components/sync/driver/sync_util.h"
 #include "components/sync/driver/syncable_service_based_model_type_controller.h"
 #include "components/sync/engine/passive_model_worker.h"
-#include "components/sync/engine/sequenced_model_worker.h"
-#include "components/sync/engine/ui_model_worker.h"
 #include "components/sync/model/model_type_store.h"
 #include "components/sync/model/model_type_store_service.h"
 #include "components/sync/model_impl/forwarding_model_type_controller_delegate.h"
@@ -586,11 +583,6 @@
           ->GetWhitelistService()
           ->AsWeakPtr();
 #endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS)
-    case syncer::PASSWORDS: {
-      return profile_password_store_.get()
-                 ? profile_password_store_->GetPasswordSyncableService()
-                 : nullptr;
-    }
 #if defined(OS_CHROMEOS)
     case syncer::ARC_PACKAGE:
       return arc::ArcPackageSyncableService::Get(profile_)->AsWeakPtr();
@@ -674,19 +666,8 @@
 ChromeSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   switch (group) {
-    case syncer::GROUP_UI:
-      return new syncer::UIModelWorker(
-          base::CreateSingleThreadTaskRunner({BrowserThread::UI}));
     case syncer::GROUP_PASSIVE:
       return new syncer::PassiveModelWorker();
-    case syncer::GROUP_PASSWORD: {
-      // Note: This is only used for the directory implementation of passwords,
-      // not for USS, but only USS supports the account password store. So we
-      // can safely ignore the account store here.
-      if (!profile_password_store_.get())
-        return nullptr;
-      return new PasswordModelWorker(profile_password_store_);
-    }
     default:
       return nullptr;
   }
diff --git a/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index 7b5d5e7..922ae1c 100644
--- a/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -104,7 +104,8 @@
     }
 #endif  // OS_CHROMEOS
 
-    // Common types.
+    // Common types. This excludes PASSWORDS because the password store factory
+    // is null for testing and hence no controller gets instantiated.
     datatypes.push_back(syncer::AUTOFILL);
     datatypes.push_back(syncer::AUTOFILL_PROFILE);
     datatypes.push_back(syncer::AUTOFILL_WALLET_DATA);
@@ -112,12 +113,6 @@
     datatypes.push_back(syncer::BOOKMARKS);
     datatypes.push_back(syncer::DEVICE_INFO);
     datatypes.push_back(syncer::HISTORY_DELETE_DIRECTIVES);
-    if (!base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) {
-      // Password store factory is null for testing. For directory
-      // implementation, a controller was added anyway. For USS, no controller
-      // gets added, and hence the type isn't available.
-      datatypes.push_back(syncer::PASSWORDS);
-    }
     datatypes.push_back(syncer::PREFERENCES);
     datatypes.push_back(syncer::PRIORITY_PREFERENCES);
     datatypes.push_back(syncer::SESSIONS);
diff --git a/chrome/browser/sync/test/integration/encryption_helper.cc b/chrome/browser/sync/test/integration/encryption_helper.cc
index b2ca172f..7f2c095 100644
--- a/chrome/browser/sync/test/integration/encryption_helper.cc
+++ b/chrome/browser/sync/test/integration/encryption_helper.cc
@@ -13,6 +13,8 @@
 #include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_client.h"
 #include "components/sync/engine/sync_engine_switches.h"
+#include "components/sync/nigori/cryptographer_impl.h"
+#include "components/sync/nigori/nigori_key_bag.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace encryption_helper {
@@ -33,36 +35,46 @@
 InitCustomPassphraseCryptographerFromNigori(
     const sync_pb::NigoriSpecifics& nigori,
     const std::string& passphrase) {
-  auto cryptographer = std::make_unique<syncer::DirectoryCryptographer>();
+  std::unique_ptr<syncer::CryptographerImpl> cryptographer;
   sync_pb::EncryptedData keybag = nigori.encryption_keybag();
-  cryptographer->SetPendingKeys(keybag);
 
   std::string decoded_salt;
   switch (syncer::ProtoKeyDerivationMethodToEnum(
       nigori.custom_passphrase_key_derivation_method())) {
     case syncer::KeyDerivationMethod::PBKDF2_HMAC_SHA1_1003:
-      EXPECT_TRUE(cryptographer->DecryptPendingKeys(
-          {syncer::KeyDerivationParams::CreateForPbkdf2(), passphrase}));
+      cryptographer =
+          syncer::CryptographerImpl::FromSingleKeyForTesting(passphrase);
       break;
     case syncer::KeyDerivationMethod::SCRYPT_8192_8_11:
       EXPECT_TRUE(base::Base64Decode(
           nigori.custom_passphrase_key_derivation_salt(), &decoded_salt));
-      EXPECT_TRUE(cryptographer->DecryptPendingKeys(
-          {syncer::KeyDerivationParams::CreateForScrypt(decoded_salt),
-           passphrase}));
+      cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting(
+          passphrase,
+          syncer::KeyDerivationParams::CreateForScrypt(decoded_salt));
       break;
     case syncer::KeyDerivationMethod::UNSUPPORTED:
       // This test cannot pass since we wouldn't know how to decrypt data
       // encrypted using an unsupported method.
       ADD_FAILURE() << "Unsupported key derivation method encountered: "
                     << nigori.custom_passphrase_key_derivation_method();
+      return syncer::CryptographerImpl::CreateEmpty();
   }
 
+  std::string decrypted_keys_str;
+  EXPECT_TRUE(cryptographer->DecryptToString(nigori.encryption_keybag(),
+                                             &decrypted_keys_str));
+
+  sync_pb::NigoriKeyBag decrypted_keys;
+  EXPECT_TRUE(decrypted_keys.ParseFromString(decrypted_keys_str));
+
+  syncer::NigoriKeyBag key_bag =
+      syncer::NigoriKeyBag::CreateFromProto(decrypted_keys);
+
+  cryptographer->EmplaceKeysFrom(key_bag);
   return cryptographer;
 }
 
-sync_pb::NigoriSpecifics CreateCustomPassphraseNigori(
-    const syncer::KeyParams& params) {
+sync_pb::NigoriSpecifics CreateCustomPassphraseNigori(const KeyParams& params) {
   syncer::KeyDerivationMethod method = params.derivation_params.method();
 
   sync_pb::NigoriSpecifics nigori;
@@ -100,27 +112,27 @@
   // keybag using a key derived from that passphrase). However, in some migrated
   // states, the keybag might also additionally contain an old, pre-migration
   // key.
-  syncer::DirectoryCryptographer cryptographer;
-  bool add_key_result = cryptographer.AddKey(params);
-  DCHECK(add_key_result);
-  bool get_keys_result =
-      cryptographer.GetKeys(nigori.mutable_encryption_keybag());
-  DCHECK(get_keys_result);
+  auto cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting(
+      params.password, params.derivation_params);
+  sync_pb::CryptographerData proto = cryptographer->ToProto();
+  bool encrypt_result = cryptographer->Encrypt(
+      proto.key_bag(), nigori.mutable_encryption_keybag());
+  DCHECK(encrypt_result);
 
   return nigori;
 }
 
 sync_pb::EntitySpecifics GetEncryptedBookmarkEntitySpecifics(
     const sync_pb::BookmarkSpecifics& bookmark_specifics,
-    const syncer::KeyParams& key_params) {
+    const KeyParams& key_params) {
   sync_pb::EntitySpecifics new_specifics;
 
   sync_pb::EntitySpecifics wrapped_entity_specifics;
   *wrapped_entity_specifics.mutable_bookmark() = bookmark_specifics;
-  syncer::DirectoryCryptographer cryptographer;
-  bool add_key_result = cryptographer.AddKey(key_params);
-  DCHECK(add_key_result);
-  bool encrypt_result = cryptographer.Encrypt(
+  auto cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting(
+      key_params.password, key_params.derivation_params);
+
+  bool encrypt_result = cryptographer->Encrypt(
       wrapped_entity_specifics, new_specifics.mutable_encrypted());
   DCHECK(encrypt_result);
 
diff --git a/chrome/browser/sync/test/integration/encryption_helper.h b/chrome/browser/sync/test/integration/encryption_helper.h
index 5809d1af..1f4b04d 100644
--- a/chrome/browser/sync/test/integration/encryption_helper.h
+++ b/chrome/browser/sync/test/integration/encryption_helper.h
@@ -12,12 +12,21 @@
 #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
 #include "chrome/browser/sync/test/integration/status_change_checker.h"
 #include "components/sync/driver/trusted_vault_client.h"
+#include "components/sync/nigori/nigori.h"
 #include "components/sync/protocol/nigori_specifics.pb.h"
-#include "components/sync/syncable/directory_cryptographer.h"
 #include "components/sync/test/fake_server/fake_server.h"
 
+namespace syncer {
+class Cryptographer;
+}  // namespace syncer
+
 namespace encryption_helper {
 
+struct KeyParams {
+  syncer::KeyDerivationParams derivation_params;
+  std::string password;
+};
+
 // Given a |fake_server|, fetches its Nigori node and writes it to the
 // proto pointed to by |nigori|. Returns false if the server does not contain
 // exactly one Nigori node.
@@ -42,12 +51,11 @@
 // provided BookmarkSpecifics and encrypted using the given |key_params|.
 sync_pb::EntitySpecifics GetEncryptedBookmarkEntitySpecifics(
     const sync_pb::BookmarkSpecifics& specifics,
-    const syncer::KeyParams& key_params);
+    const KeyParams& key_params);
 
 // Creates a NigoriSpecifics that describes encryption using a custom passphrase
 // with the given key parameters.
-sync_pb::NigoriSpecifics CreateCustomPassphraseNigori(
-    const syncer::KeyParams& params);
+sync_pb::NigoriSpecifics CreateCustomPassphraseNigori(const KeyParams& params);
 
 }  // namespace encryption_helper
 
diff --git a/chrome/browser/sync/test/integration/password_manager_sync_test.cc b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
index f836f9b9..3df15c76 100644
--- a/chrome/browser/sync/test/integration/password_manager_sync_test.cc
+++ b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
@@ -67,12 +67,10 @@
 class PasswordManagerSyncTest : public SyncTest {
  public:
   PasswordManagerSyncTest() : SyncTest(SINGLE_CLIENT) {
-    feature_list_.InitWithFeatures(
-        /*enabled_features=*/{switches::kSyncUSSPasswords,
-                              password_manager::features::
-                                  kEnablePasswordsAccountStorage},
-        /*disabled_features=*/{});
+    feature_list_.InitAndEnableFeature(
+        password_manager::features::kEnablePasswordsAccountStorage);
   }
+
   ~PasswordManagerSyncTest() override = default;
 
   void SetUpInProcessBrowserTestFixture() override {
diff --git a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
index 723bd4e..829e845f 100644
--- a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
@@ -11,7 +11,7 @@
 #include "components/sync/driver/profile_sync_service.h"
 #include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/engine/sync_engine_switches.h"
-#include "components/sync/nigori/cryptographer.h"
+#include "components/sync/nigori/cryptographer_impl.h"
 #include "content/public/test/test_launcher.h"
 #include "crypto/ec_private_key.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -26,6 +26,7 @@
 using encryption_helper::GetEncryptedBookmarkEntitySpecifics;
 using encryption_helper::GetServerNigori;
 using encryption_helper::InitCustomPassphraseCryptographerFromNigori;
+using encryption_helper::KeyParams;
 using encryption_helper::SetNigoriInFakeServer;
 using fake_server::FakeServer;
 using sync_pb::EncryptedData;
@@ -33,7 +34,6 @@
 using sync_pb::SyncEntity;
 using syncer::Cryptographer;
 using syncer::KeyDerivationParams;
-using syncer::KeyParams;
 using syncer::LoopbackServerEntity;
 using syncer::ModelType;
 using syncer::ModelTypeSet;
@@ -107,7 +107,8 @@
       const std::vector<ServerBookmarksEqualityChecker::ExpectedBookmark>&
           expected_bookmarks,
       const KeyParams& key_params) {
-    auto cryptographer = CreateCryptographerWithKeyParams(key_params);
+    auto cryptographer = syncer::CryptographerImpl::FromSingleKeyForTesting(
+        key_params.password, key_params.derivation_params);
     return ServerBookmarksEqualityChecker(GetSyncService(), GetFakeServer(),
                                           expected_bookmarks,
                                           cryptographer.get())
@@ -160,16 +161,6 @@
     return InitCustomPassphraseCryptographerFromNigori(nigori, passphrase);
   }
 
-  // A cryptographer initialized with the given KeyParams has not "seen" the
-  // server-side Nigori, and so any data decryptable by such a cryptographer
-  // does not depend on external info.
-  std::unique_ptr<Cryptographer> CreateCryptographerWithKeyParams(
-      const KeyParams& key_params) {
-    auto cryptographer = std::make_unique<syncer::DirectoryCryptographer>();
-    cryptographer->AddKey(key_params);
-    return cryptographer;
-  }
-
   void InjectEncryptedServerBookmark(const std::string& title,
                                      const GURL& url,
                                      const KeyParams& key_params) {
@@ -189,18 +180,8 @@
       public testing::WithParamInterface<bool> {
  public:
   SingleClientCustomPassphraseSyncTestWithUssTests() {
-    if (GetParam()) {
-      // USS Nigori requires USS implementations to be enabled for all
-      // datatypes.
-      override_features_.InitWithFeatures(
-          /*enabled_features=*/{switches::kSyncUSSPasswords,
-                                switches::kSyncUSSNigori},
-          /*disabled_features=*/{});
-    } else {
-      // We test Directory Nigori with default values of USS feature flags of
-      // other datatypes.
-      override_features_.InitAndDisableFeature(switches::kSyncUSSNigori);
-    }
+    override_features_.InitWithFeatureState(switches::kSyncUSSNigori,
+                                            GetParam());
   }
   ~SingleClientCustomPassphraseSyncTestWithUssTests() override = default;
 
@@ -458,8 +439,7 @@
       // key derivation method in ShouldLoadUSSCustomPassphraseInDirectoryMode,
       // once USS implementation support it for new passphrases.
       feature_list_.InitWithFeatures(
-          /*enabled_features=*/{switches::kSyncUSSPasswords,
-                                switches::kSyncUSSNigori},
+          /*enabled_features=*/{switches::kSyncUSSNigori},
           /*disabled_features=*/{
               switches::kSyncUseScryptForNewCustomPassphrases});
     } else {
@@ -508,8 +488,7 @@
       // when kSyncUSSNigori was disabled, without providing it again once
       // kSyncUSSNigori is enabled.
       feature_list_.InitWithFeatures(
-          /*enabled_features=*/{switches::kSyncUSSPasswords,
-                                switches::kSyncUSSNigori},
+          /*enabled_features=*/{switches::kSyncUSSNigori},
           /*disabled_features=*/{});
     }
   }
diff --git a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
index 015d6de..08d2408 100644
--- a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
@@ -37,15 +37,11 @@
 namespace {
 
 using encryption_helper::GetServerNigori;
+using encryption_helper::KeyParams;
 using encryption_helper::SetNigoriInFakeServer;
 using testing::NotNull;
 using testing::SizeIs;
 
-struct KeyParams {
-  syncer::KeyDerivationParams derivation_params;
-  std::string password;
-};
-
 MATCHER_P(IsDataEncryptedWith, key_params, "") {
   const sync_pb::EncryptedData& encrypted_data = arg;
   std::unique_ptr<syncer::Nigori> nigori = syncer::Nigori::CreateByDerivation(
@@ -225,18 +221,8 @@
       public testing::WithParamInterface<bool> {
  public:
   SingleClientNigoriSyncTestWithUssTests() : SyncTest(SINGLE_CLIENT) {
-    if (GetParam()) {
-      // USS Nigori requires USS implementations to be enabled for all
-      // datatypes.
-      override_features_.InitWithFeatures(
-          /*enabled_features=*/{switches::kSyncUSSPasswords,
-                                switches::kSyncUSSNigori},
-          /*disabled_features=*/{});
-    } else {
-      // We test Directory Nigori with default values of USS feature flags of
-      // other datatypes.
-      override_features_.InitAndDisableFeature(switches::kSyncUSSNigori);
-    }
+    override_features_.InitWithFeatureState(switches::kSyncUSSNigori,
+                                            GetParam());
   }
 
   ~SingleClientNigoriSyncTestWithUssTests() override = default;
@@ -272,14 +258,8 @@
 class SingleClientKeystoreKeysMigrationSyncTest : public SyncTest {
  public:
   SingleClientKeystoreKeysMigrationSyncTest() : SyncTest(SINGLE_CLIENT) {
-    if (content::IsPreTest()) {
-      override_features_.InitAndDisableFeature(switches::kSyncUSSNigori);
-    } else {
-      override_features_.InitWithFeatures(
-          /*enabled_features=*/{switches::kSyncUSSPasswords,
-                                switches::kSyncUSSNigori},
-          /*disabled_features=*/{});
-    }
+    override_features_.InitWithFeatureState(switches::kSyncUSSNigori,
+                                            !content::IsPreTest());
   }
 
   ~SingleClientKeystoreKeysMigrationSyncTest() override = default;
@@ -546,8 +526,7 @@
     // USS Nigori requires USS implementations to be enabled for all
     // datatypes.
     override_features_.InitWithFeatures(
-        /*enabled_features=*/{switches::kSyncUSSPasswords,
-                              switches::kSyncUSSNigori,
+        /*enabled_features=*/{switches::kSyncUSSNigori,
                               switches::kSyncSupportTrustedVaultPassphrase,
                               features::kSyncEncryptionKeysWebApi},
         /*disabled_features=*/{});
diff --git a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
index fec09c64..d39a306d 100644
--- a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
@@ -7,7 +7,6 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/sync/test/integration/encryption_helper.h"
-#include "chrome/browser/sync/test/integration/feature_toggler.h"
 #include "chrome/browser/sync/test/integration/passwords_helper.h"
 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
 #include "chrome/browser/sync/test/integration/secondary_account_helper.h"
@@ -20,7 +19,6 @@
 #include "components/signin/public/identity_manager/identity_test_utils.h"
 #include "components/sync/base/time.h"
 #include "components/sync/driver/profile_sync_service.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/syncable/directory_cryptographer.h"
 #include "content/public/test/test_launcher.h"
 
@@ -74,17 +72,16 @@
   }
 };
 
-class SingleClientPasswordsSyncTest : public FeatureToggler, public SyncTest {
+class SingleClientPasswordsSyncTest : public SyncTest {
  public:
-  SingleClientPasswordsSyncTest()
-      : FeatureToggler(switches::kSyncUSSPasswords), SyncTest(SINGLE_CLIENT) {}
+  SingleClientPasswordsSyncTest() : SyncTest(SINGLE_CLIENT) {}
   ~SingleClientPasswordsSyncTest() override {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(SingleClientPasswordsSyncTest);
 };
 
-IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest, Sanity) {
+IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, Sanity) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
 
   PasswordForm form = CreateTestPasswordForm(0);
@@ -101,7 +98,7 @@
 // Verifies that committed passwords contain the appropriate proto fields, and
 // in particular lack some others that could potentially contain unencrypted
 // data. In this test, custom passphrase is NOT set.
-IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest,
+IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest,
                        CommitWithoutCustomPassphrase) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
 
@@ -126,7 +123,7 @@
 
 // Same as above but with custom passphrase set, which requires to prune commit
 // data even further.
-IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest,
+IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest,
                        CommitWithCustomPassphrase) {
   SetEncryptionPassphraseForClient(/*index=*/0, "hunter2");
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
@@ -150,7 +147,7 @@
 
 // Tests the scenario when a syncing user enables a custom passphrase. PASSWORDS
 // should be recommitted with the new encryption key.
-IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest,
+IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest,
                        ReencryptsDataWhenPassphraseIsSet) {
   ASSERT_TRUE(SetupSync());
   ASSERT_TRUE(ServerNigoriChecker(GetSyncService(0), fake_server_.get(),
@@ -201,7 +198,7 @@
   EXPECT_NE(new_encryption_key_name, prior_encryption_key_name);
 }
 
-IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest,
+IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest,
                        PRE_PersistProgressMarkerOnRestart) {
   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
   PasswordForm form = CreateTestPasswordForm(0);
@@ -218,7 +215,7 @@
                                          /*REMOTE_NON_INITIAL_UPDATE=*/4));
 }
 
-IN_PROC_BROWSER_TEST_P(SingleClientPasswordsSyncTest,
+IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest,
                        PersistProgressMarkerOnRestart) {
   base::HistogramTester histogram_tester;
   ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
@@ -246,80 +243,11 @@
                                          /*REMOTE_NON_INITIAL_UPDATE=*/4));
 }
 
-INSTANTIATE_TEST_SUITE_P(USS,
-                         SingleClientPasswordsSyncTest,
-                         ::testing::Values(false, true));
-
-class SingleClientPasswordsSyncUssMigratorTest : public SyncTest {
- public:
-  SingleClientPasswordsSyncUssMigratorTest() : SyncTest(SINGLE_CLIENT) {}
-  ~SingleClientPasswordsSyncUssMigratorTest() override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SingleClientPasswordsSyncUssMigratorTest);
-};
-
-class SingleClientPasswordsSyncUssMigratorTestWithUssTransition
-    : public SingleClientPasswordsSyncUssMigratorTest {
- public:
-  SingleClientPasswordsSyncUssMigratorTestWithUssTransition() {
-    if (content::IsPreTest())
-      feature_list_.InitAndDisableFeature(switches::kSyncUSSPasswords);
-    else
-      feature_list_.InitAndEnableFeature(switches::kSyncUSSPasswords);
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
-// Creates and syncs two passwords before USS being enabled.
-IN_PROC_BROWSER_TEST_F(
-    SingleClientPasswordsSyncUssMigratorTestWithUssTransition,
-    PRE_ExerciseUssMigrator) {
-  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  AddLogin(GetPasswordStore(0), CreateTestPasswordForm(0));
-  AddLogin(GetPasswordStore(0), CreateTestPasswordForm(1));
-  ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
-  ASSERT_EQ(2, GetPasswordCount(0));
-}
-
-// Now that local passwords, the local sync directory and the sever are
-// populated with two passwords, USS is enabled for passwords.
-IN_PROC_BROWSER_TEST_F(
-    SingleClientPasswordsSyncUssMigratorTestWithUssTransition,
-    ExerciseUssMigrator) {
-  base::HistogramTester histogram_tester;
-  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
-  ASSERT_EQ(2, GetPasswordCount(0));
-#if defined(OS_CHROMEOS)
-  // signin::SetRefreshTokenForPrimaryAccount() is needed on ChromeOS in order
-  // to get a non-empty refresh token on startup.
-  GetClient(0)->SignInPrimaryAccount();
-#endif  // defined(OS_CHROMEOS)
-  ASSERT_TRUE(GetClient(0)->AwaitSyncSetupCompletion());
-  ASSERT_EQ(2, GetPasswordCount(0));
-
-  EXPECT_EQ(1, histogram_tester.GetBucketCount(
-                   "Sync.USSMigrationSuccess",
-                   static_cast<int>(
-                       syncer::ModelTypeHistogramValue(syncer::PASSWORDS))));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples("Sync.USSMigrationEntityCount.PASSWORD"),
-      ElementsAre(base::Bucket(/*min=*/2, /*count=*/1)));
-  EXPECT_THAT(histogram_tester.GetAllSamples("Sync.DataTypeStartFailures2"),
-              IsEmpty());
-  EXPECT_EQ(
-      0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.PASSWORD",
-                                         /*REMOTE_INITIAL_UPDATE=*/5));
-}
-
 class SingleClientPasswordsWithAccountStorageSyncTest : public SyncTest {
  public:
   SingleClientPasswordsWithAccountStorageSyncTest() : SyncTest(SINGLE_CLIENT) {
     feature_list_.InitWithFeatures(
-        /*enabled_features=*/{switches::kSyncUSSPasswords,
-                              password_manager::features::
+        /*enabled_features=*/{password_manager::features::
                                   kEnablePasswordsAccountStorage},
         /*disabled_features=*/{});
   }
diff --git a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
index 0e66ee9..1730465 100644
--- a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
@@ -14,13 +14,11 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
-#include "chrome/browser/sync/test/integration/feature_toggler.h"
 #include "chrome/browser/sync/test/integration/passwords_helper.h"
 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/engine/cycle/sync_cycle_snapshot.h"
 #include "components/sync/engine/model_safe_worker.h"
 
@@ -42,10 +40,9 @@
 
 static const char* kValidPassphrase = "passphrase!";
 
-class TwoClientPasswordsSyncTest : public FeatureToggler, public SyncTest {
+class TwoClientPasswordsSyncTest : public SyncTest {
  public:
-  TwoClientPasswordsSyncTest()
-      : FeatureToggler(switches::kSyncUSSPasswords), SyncTest(TWO_CLIENT) {}
+  TwoClientPasswordsSyncTest() : SyncTest(TWO_CLIENT) {}
 
   ~TwoClientPasswordsSyncTest() override {}
 
@@ -53,7 +50,7 @@
   DISALLOW_COPY_AND_ASSIGN(TwoClientPasswordsSyncTest);
 };
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ENABLED(Add)) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ENABLED(Add)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(SamePasswordFormsChecker().Wait());
@@ -66,7 +63,7 @@
   ASSERT_EQ(1, GetPasswordCount(1));
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ENABLED(Race)) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ENABLED(Race)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(AllProfilesContainSamePasswordForms());
@@ -81,7 +78,7 @@
   ASSERT_TRUE(SamePasswordFormsChecker().Wait());
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, MergeWithTheMostRecent) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, MergeWithTheMostRecent) {
   // Setup the test to have Form 0 and Form 1 added on both clients. Form 0 is
   // more recent on Client 0, and Form 1 is more recent on Client 1. They should
   // be merged such that recent passwords are chosen.
@@ -125,7 +122,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest,
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest,
                        E2E_ENABLED(SetPassphraseAndAddPassword)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
@@ -146,7 +143,7 @@
   ASSERT_TRUE(SamePasswordFormsChecker().Wait());
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, Update) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Update) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier());
 
@@ -167,7 +164,7 @@
   ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier());
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, AddTwice) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, AddTwice) {
   // Password store supports adding the same form twice, so this is testing this
   // behaviour.
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
@@ -191,7 +188,7 @@
   ASSERT_EQ(1, GetPasswordCount(1));
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, Delete) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, Delete) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier());
 
@@ -214,7 +211,7 @@
   ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier());
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest,
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest,
                        SetPassphraseAndThenSetupSync) {
   ASSERT_TRUE(SetupClients());
 
@@ -247,7 +244,7 @@
   ASSERT_TRUE(SamePasswordFormsChecker().Wait());
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ONLY(DeleteTwo)) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ONLY(DeleteTwo)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(AllProfilesContainSamePasswordForms());
@@ -278,7 +275,7 @@
   ASSERT_EQ(init_password_count - 2, GetPasswordCount(0));
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, DeleteAll) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, DeleteAll) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier());
 
@@ -298,7 +295,7 @@
   ASSERT_EQ(0, GetVerifierPasswordCount());
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ENABLED(Merge)) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ENABLED(Merge)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(AllProfilesContainSamePasswordForms());
@@ -314,7 +311,7 @@
   ASSERT_EQ(3, GetPasswordCount(0));
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, E2E_ONLY(TwoClientAddPass)) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, E2E_ONLY(TwoClientAddPass)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync()) <<  "SetupSync() failed.";
   // All profiles should sync same passwords.
@@ -339,7 +336,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_P(TwoClientPasswordsSyncTest, AddImmediatelyAfterDelete) {
+IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest, AddImmediatelyAfterDelete) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(AllProfilesContainSamePasswordFormsAsVerifier());
   base::HistogramTester histogram_tester;
@@ -364,7 +361,3 @@
       1, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.PASSWORD",
                                          /*LOCAL_DELETION=*/0));
 }
-
-INSTANTIATE_TEST_SUITE_P(USS,
-                         TwoClientPasswordsSyncTest,
-                         ::testing::Values(false, true));
diff --git a/chrome/browser/themes/theme_syncable_service.cc b/chrome/browser/themes/theme_syncable_service.cc
index b6bc5c36..5b8e9fa 100644
--- a/chrome/browser/themes/theme_syncable_service.cc
+++ b/chrome/browser/themes/theme_syncable_service.cc
@@ -122,7 +122,7 @@
   sync_error_handler_.reset();
 }
 
-syncer::SyncDataList ThemeSyncableService::GetAllSyncData(
+syncer::SyncDataList ThemeSyncableService::GetAllSyncDataForTesting(
     syncer::ModelType type) const {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_EQ(type, syncer::THEMES);
diff --git a/chrome/browser/themes/theme_syncable_service.h b/chrome/browser/themes/theme_syncable_service.h
index 635adfd..4fc5ea3 100644
--- a/chrome/browser/themes/theme_syncable_service.h
+++ b/chrome/browser/themes/theme_syncable_service.h
@@ -43,7 +43,7 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> error_handler) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/themes/theme_syncable_service_unittest.cc b/chrome/browser/themes/theme_syncable_service_unittest.cc
index 2eb58226..de11187 100644
--- a/chrome/browser/themes/theme_syncable_service_unittest.cc
+++ b/chrome/browser/themes/theme_syncable_service_unittest.cc
@@ -512,12 +512,12 @@
             theme_specifics.autogenerated_theme().color());
 }
 
-TEST_F(ThemeSyncableServiceTest, GetAllSyncData_Extension) {
+TEST_F(ThemeSyncableServiceTest, GetAllSyncDataForTesting_Extension) {
   // Set up theme service to use custom theme.
   fake_theme_service_->SetTheme(theme_extension_.get());
 
   syncer::SyncDataList data_list =
-      theme_sync_service_->GetAllSyncData(syncer::THEMES);
+      theme_sync_service_->GetAllSyncDataForTesting(syncer::THEMES);
 
   ASSERT_EQ(1u, data_list.size());
   const sync_pb::ThemeSpecifics& theme_specifics =
@@ -530,13 +530,13 @@
       theme_specifics.custom_theme_update_url());
 }
 
-TEST_F(ThemeSyncableServiceTest, GetAllSyncData_Autogenerated) {
+TEST_F(ThemeSyncableServiceTest, GetAllSyncDataForTesting_Autogenerated) {
   // Set up theme service to use autogenerated theme.
   fake_theme_service_->BuildAutogeneratedThemeFromColor(
       SkColorSetRGB(0, 0, 100));
 
   syncer::SyncDataList data_list =
-      theme_sync_service_->GetAllSyncData(syncer::THEMES);
+      theme_sync_service_->GetAllSyncDataForTesting(syncer::THEMES);
 
   ASSERT_EQ(1u, data_list.size());
   const sync_pb::ThemeSpecifics& theme_specifics =
@@ -836,7 +836,7 @@
   fake_theme_service_->SetTheme(theme_extension_.get());
 
   syncer::SyncDataList data_list =
-      theme_sync_service_->GetAllSyncData(syncer::THEMES);
+      theme_sync_service_->GetAllSyncDataForTesting(syncer::THEMES);
 
   ASSERT_EQ(0u, data_list.size());
 }
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.cc b/chrome/browser/ui/app_list/app_list_syncable_service.cc
index 74c146a3..e498afc 100644
--- a/chrome/browser/ui/app_list/app_list_syncable_service.cc
+++ b/chrome/browser/ui/app_list/app_list_syncable_service.cc
@@ -966,10 +966,7 @@
   sync_error_handler_.reset();
 }
 
-syncer::SyncDataList AppListSyncableService::GetAllSyncData(
-    syncer::ModelType type) const {
-  DCHECK_EQ(syncer::APP_LIST, type);
-
+syncer::SyncDataList AppListSyncableService::GetAllSyncDataForTesting() const {
   VLOG(2) << this << ": GetAllSyncData: " << sync_items_.size();
   syncer::SyncDataList list;
   for (auto iter = sync_items_.begin(); iter != sync_items_.end(); ++iter) {
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.h b/chrome/browser/ui/app_list/app_list_syncable_service.h
index 3527587..9551e68 100644
--- a/chrome/browser/ui/app_list/app_list_syncable_service.h
+++ b/chrome/browser/ui/app_list/app_list_syncable_service.h
@@ -184,7 +184,7 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> error_handler) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  syncer::SyncDataList GetAllSyncDataForTesting() const;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc
index 13aaedb..7c65898 100644
--- a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc
+++ b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc
@@ -204,20 +204,6 @@
   pending_uninstall_items_.clear();
 }
 
-syncer::SyncDataList ArcPackageSyncableService::GetAllSyncData(
-    syncer::ModelType type) const {
-  DCHECK_EQ(type, syncer::ARC_PACKAGE);
-
-  syncer::SyncDataList list;
-  for (const auto& item : sync_items_)
-    list.emplace_back(GetSyncDataFromSyncItem(item.second.get()));
-
-  for (const auto& item : pending_install_items_)
-    list.emplace_back(GetSyncDataFromSyncItem(item.second.get()));
-
-  return list;
-}
-
 syncer::SyncError ArcPackageSyncableService::ProcessSyncChanges(
     const base::Location& from_here,
     const syncer::SyncChangeList& change_list) {
diff --git a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.h b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.h
index 71c91cf3..dcc2d9cb 100644
--- a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.h
+++ b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.h
@@ -62,7 +62,6 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> error_handler) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index c7ff038..87eb84f 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -337,8 +337,7 @@
 
     app_list_syncable_service_ =
         app_list::AppListSyncableServiceFactory::GetForProfile(profile());
-    StartAppSyncService(
-        app_list_syncable_service_->GetAllSyncData(syncer::APP_LIST));
+    StartAppSyncService(app_list_syncable_service_->GetAllSyncDataForTesting());
 
     std::string error;
     extension_chrome_ = Extension::Create(base::FilePath(), Manifest::UNPACKED,
@@ -1443,7 +1442,7 @@
   // Persist pin state, we don't have active pin for ARC apps yet, but pin
   // model should have it.
   syncer::SyncDataList copy_sync_list =
-      app_list_syncable_service_->GetAllSyncData(syncer::APP_LIST);
+      app_list_syncable_service_->GetAllSyncDataForTesting();
 
   ResetLauncherController();
   SendPinChanges(syncer::SyncChangeList(), true);
@@ -1476,7 +1475,7 @@
             GetPinnedAppStatus());
 
   app_service_test().WaitForAppService();
-  copy_sync_list = app_list_syncable_service_->GetAllSyncData(syncer::APP_LIST);
+  copy_sync_list = app_list_syncable_service_->GetAllSyncDataForTesting();
 
   ResetLauncherController();
   ResetPinModel();
@@ -4452,7 +4451,7 @@
   EXPECT_EQ("Chrome, App1, App2", GetPinnedAppStatus());
 
   syncer::SyncDataList copy_sync_list =
-      app_list_syncable_service_->GetAllSyncData(syncer::APP_LIST);
+      app_list_syncable_service_->GetAllSyncDataForTesting();
 
   app_list_syncable_service_->StopSyncing(syncer::APP_LIST);
   RecreateLauncherController()->Init();
diff --git a/chrome/browser/ui/ash/network/enrollment_dialog_view.cc b/chrome/browser/ui/ash/network/enrollment_dialog_view.cc
index 48bf366..0084402 100644
--- a/chrome/browser/ui/ash/network/enrollment_dialog_view.cc
+++ b/chrome/browser/ui/ash/network/enrollment_dialog_view.cc
@@ -91,7 +91,7 @@
       target_uri_(target_uri),
       connect_(connect),
       added_cert_(false) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_NETWORK_ENROLLMENT_HANDLER_BUTTON));
   set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 6f2b63b1..a6cb7b3 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1729,8 +1729,12 @@
 }
 
 void Browser::ActivateContents(WebContents* contents) {
-  tab_strip_model_->ActivateTabAt(
-      tab_strip_model_->GetIndexOfWebContents(contents));
+  // A WebContents can ask to activate after it's been removed from the
+  // TabStripModel. See https://crbug.com/1060986
+  int index = tab_strip_model_->GetIndexOfWebContents(contents);
+  if (index == TabStripModel::kNoTab)
+    return;
+  tab_strip_model_->ActivateTabAt(index);
   window_->Activate();
 }
 
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
index c2f1745..7a4e099 100644
--- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
+++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
@@ -131,7 +131,10 @@
   SupervisedUserNavigationObserver* navigation_observer =
       SupervisedUserNavigationObserver::FromWebContents(web_contents_);
 
-  // TODO(1048643) The check on |navigation_observer| should be a DCHECK.
+  // TODO(crbug.com/1061427): If the profile is supervised,
+  // |navigation_observer| should always be non-null. Investigate why some users
+  // run into null pointers here and ultimately replace the condition below with
+  // a DCHECK. This is a workaround to avoid reported crashes.
   if (!navigation_observer)
     return nullptr;
 
@@ -151,9 +154,10 @@
   if (ProfileIsSupervised()) {
     const auto* blocked_navigations = GetBlockedNavigations();
 
-    // TODO(1048643) If profile is supervised, |blocked_navigations| should not
-    // be nullptr. This is a work around to check if the crash reported in the
-    // bug was caused by the violation of the invariant.
+    // TODO(crbug.com/1061427): If the profile is supervised,
+    // |blocked_navigations| should always be non-null. Investigate why some
+    // users run into null pointers here and ultimately replace the condition
+    // below with a DCHECK. This is a workaround to avoid reported crashes.
     if (blocked_navigations && !blocked_navigations->empty())
       return true;
   }
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index fe1dc6fc..e37e00e 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -427,7 +427,7 @@
 #endif
 
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
-  SupervisedUserNavigationObserver::MaybeCreateForWebContents(web_contents);
+  SupervisedUserNavigationObserver::CreateForWebContents(web_contents);
 #endif
 
   // --- Section 4: The warning ---
diff --git a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
index 64e8061f..c1212d8 100644
--- a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
+++ b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
@@ -82,8 +82,8 @@
     : views::BubbleDialogDelegateView(anchor_view,
                                       views::BubbleBorder::TOP_RIGHT),
       browser_(browser) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    l10n_util::GetStringUTF16(IDS_DONE));
   DialogDelegate::SetExtraView(::CreateExtraView(this));
   set_margins(gfx::Insets());
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc
index 1881a123..f017ad5 100644
--- a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc
+++ b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc
@@ -34,7 +34,7 @@
 
 void AppDialogView::InitializeView(const gfx::ImageSkia& image,
                                    const base::string16& heading_text) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
   SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kHorizontal,
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc
index f2f98c84..daa1b686 100644
--- a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc
+++ b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc
@@ -68,11 +68,11 @@
     : apps::UninstallDialog::UiBase(image, uninstall_dialog),
       app_type_(app_type),
       app_name_(app_name) {
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       &AppUninstallDialogView::OnDialogCancelled, base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &AppUninstallDialogView::OnDialogCancelled, base::Unretained(this)));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &AppUninstallDialogView::OnDialogAccepted, base::Unretained(this)));
 
   InitializeView(profile, app_type, app_id);
@@ -153,7 +153,7 @@
 void AppUninstallDialogView::InitializeView(Profile* profile,
                                             apps::mojom::AppType app_type,
                                             const std::string& app_id) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_APP_BUTTON));
 
@@ -270,7 +270,7 @@
   shortcut_ = app_info->shortcut;
 
   if (shortcut_) {
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_OK,
         l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON));
   } else {
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
index 442f896..4ba7197 100644
--- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc
@@ -81,7 +81,7 @@
                       const base::Closure& close_callback)
       : dialog_body_(AddChildView(std::move(dialog_body))),
         close_callback_(close_callback) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   }
   ~BaseDialogContainer() override {}
 
diff --git a/chrome/browser/ui/views/arc_app_dialog_view.cc b/chrome/browser/ui/views/arc_app_dialog_view.cc
index 09b36c7..51863c5a 100644
--- a/chrome/browser/ui/views/arc_app_dialog_view.cc
+++ b/chrome/browser/ui/views/arc_app_dialog_view.cc
@@ -103,12 +103,12 @@
       app_id_(app_id),
       window_title_(window_title),
       confirm_callback_(std::move(confirm_callback)) {
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, confirm_button_text);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, confirm_button_text);
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    cancel_button_text);
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &ArcAppDialogView::OnDialogAccepted, base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &ArcAppDialogView::OnDialogCancelled, base::Unretained(this)));
 
   ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/arc_data_removal_dialog_view.cc b/chrome/browser/ui/views/arc_data_removal_dialog_view.cc
index 9de71b1..4a676d3 100644
--- a/chrome/browser/ui/views/arc_data_removal_dialog_view.cc
+++ b/chrome/browser/ui/views/arc_data_removal_dialog_view.cc
@@ -78,16 +78,16 @@
     Profile* profile,
     DataRemovalConfirmationCallback confirm_callback)
     : profile_(profile), confirm_callback_(std::move(confirm_callback)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_ARC_DATA_REMOVAL_CONFIRMATION_OK_BUTTON));
 
   auto run_callback = [](DataRemovalConfirmationDialog* dialog, bool accept) {
     std::move(dialog->confirm_callback_).Run(accept);
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(run_callback, base::Unretained(this), true));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(run_callback, base::Unretained(this), false));
 
   ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
index 9c1cf7c4..d7b37f2 100644
--- a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
@@ -469,10 +469,10 @@
       controller_->GetVerificationResult();
   bool has_ok = result != AutofillClient::PERMANENT_FAILURE &&
                 result != AutofillClient::NETWORK_ERROR;
-  DialogDelegate::set_buttons(has_ok ? ui::DIALOG_BUTTON_OK |
+  DialogDelegate::SetButtons(has_ok ? ui::DIALOG_BUTTON_OK |
                                            ui::DIALOG_BUTTON_CANCEL
                                      : ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    controller_->GetOkButtonLabel());
 }
 
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc
index b38a1ed..cf2863d2 100644
--- a/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc
@@ -49,15 +49,15 @@
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       controller_(controller) {
   DCHECK(controller);
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_AUTOFILL_LOCAL_CARD_MIGRATION_BUBBLE_BUTTON_LABEL));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&LocalCardMigrationBubbleViews::OnDialogCancelled,
                      base::Unretained(this)));
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&LocalCardMigrationBubbleViews::OnDialogAccepted,
                      base::Unretained(this)));
 }
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.cc
index 4913783e..af0fd863 100644
--- a/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.cc
+++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_dialog_view.cc
@@ -351,17 +351,17 @@
     LocalCardMigrationDialogController* controller,
     content::WebContents* web_contents)
     : controller_(controller), web_contents_(web_contents) {
-  DialogDelegate::set_buttons(controller_->AllCardsInvalid()
+  DialogDelegate::SetButtons(controller_->AllCardsInvalid()
                                   ? ui::DIALOG_BUTTON_OK
                                   : ui::DIALOG_BUTTON_OK |
                                         ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, GetOkButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, GetOkButtonLabel());
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    GetCancelButtonLabel());
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&LocalCardMigrationDialogView::OnDialogCancelled,
                      base::Unretained(this)));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &LocalCardMigrationDialogView::OnDialogAccepted, base::Unretained(this)));
   set_close_on_deactivate(false);
   set_margins(gfx::Insets());
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_error_dialog_view.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_error_dialog_view.cc
index b263a02a..701fbe9 100644
--- a/chrome/browser/ui/views/autofill/payments/local_card_migration_error_dialog_view.cc
+++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_error_dialog_view.cc
@@ -35,8 +35,8 @@
     LocalCardMigrationDialogController* controller,
     content::WebContents* web_contents)
     : controller_(controller), web_contents_(web_contents) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&LocalCardMigrationDialogController::OnDoneButtonClicked,
                      base::Unretained(controller_)));
   set_close_on_deactivate(false);
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc
index bba6991..d22374d 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc
@@ -54,13 +54,13 @@
                                          SaveCardBubbleController* controller)
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       controller_(controller) {
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    controller->GetAcceptButtonText());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    controller->GetDeclineButtonText());
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &SaveCardBubbleViews::OnDialogCancelled, base::Unretained(this)));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &SaveCardBubbleViews::OnDialogAccepted, base::Unretained(this)));
   DCHECK(controller);
   chrome::RecordDialogCreation(chrome::DialogIdentifier::SAVE_CARD);
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc
index 26bf7d2b..c0c915bd 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_failure_bubble_views.cc
@@ -16,7 +16,7 @@
     content::WebContents* web_contents,
     SaveCardBubbleController* controller)
     : SaveCardBubbleViews(anchor_view, web_contents, controller) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 }
 
 std::unique_ptr<views::View>
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc
index 81b828d..d0788350 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_manage_cards_bubble_views.cc
@@ -40,7 +40,7 @@
     content::WebContents* web_contents,
     SaveCardBubbleController* controller)
     : SaveCardBubbleViews(anchor_view, web_contents, controller) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   DialogDelegate::SetExtraView(CreateManageCardsButton(this));
   DialogDelegate::SetFootnoteView(CreateSigninPromoView());
 }
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
index 962b007..bdee8852 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -65,7 +65,7 @@
     content::WebContents* web_contents,
     SaveCardBubbleController* controller)
     : SaveCardBubbleViews(anchor_view, web_contents, controller) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
   legal_message_view_ = DialogDelegate::SetFootnoteView(
       CreateLegalMessageView(controller->GetLegalMessageLines(), this));
   if (legal_message_view_)
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_sign_in_promo_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_sign_in_promo_bubble_views.cc
index 5910eb3f..8cde052 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_sign_in_promo_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_sign_in_promo_bubble_views.cc
@@ -29,7 +29,7 @@
     SaveCardBubbleController* controller)
     : SaveCardBubbleViews(anchor_view, web_contents, controller) {
   // The BubbleSyncPromoView takes care of buttons.
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 }
 
 SaveCardSignInPromoBubbleViews::~SaveCardSignInPromoBubbleViews() = default;
diff --git a/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc
index dcc93996..c9c0f0a 100644
--- a/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc
@@ -20,10 +20,10 @@
       controller_(controller) {
   DCHECK(controller_);
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_UPI_PROMPT_ACCEPT));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_UPI_PROMPT_REJECT));
 }
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc b/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc
index 86c5448..a21d99ef6 100644
--- a/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc
+++ b/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc
@@ -27,14 +27,14 @@
 VirtualCardSelectionDialogViewImpl::VirtualCardSelectionDialogViewImpl(
     VirtualCardSelectionDialogController* controller)
     : controller_(controller) {
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    controller_->GetOkButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    controller_->GetCancelButtonLabel());
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::Bind(&VirtualCardSelectionDialogController::OnOkButtonClicked,
                  base::Unretained(controller_)));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::Bind(&VirtualCardSelectionDialogController::OnCancelButtonClicked,
                  base::Unretained(controller_)));
 }
diff --git a/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc b/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc
index 54c6c3d..02c35dd 100644
--- a/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc
+++ b/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc
@@ -32,11 +32,11 @@
       AddChildView(CreateSheetViewForAutofillWebAuthn(std::move(model)));
   sheet_view_->ReInitChildViews();
 
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    model_->GetAcceptButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    model_->GetCancelButtonLabel());
-  DialogDelegate::set_buttons(model_->IsAcceptButtonVisible()
+  DialogDelegate::SetButtons(model_->IsAcceptButtonVisible()
                                   ? ui::DIALOG_BUTTON_OK |
                                         ui::DIALOG_BUTTON_CANCEL
                                   : ui::DIALOG_BUTTON_CANCEL);
@@ -139,12 +139,12 @@
 void WebauthnDialogViewImpl::RefreshContent() {
   sheet_view_->ReInitChildViews();
   sheet_view_->InvalidateLayout();
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    model_->GetAcceptButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    model_->GetCancelButtonLabel());
   DCHECK(model_->IsCancelButtonVisible());
-  DialogDelegate::set_buttons(model_->IsAcceptButtonVisible()
+  DialogDelegate::SetButtons(model_->IsAcceptButtonVisible()
                                   ? ui::DIALOG_BUTTON_OK |
                                         ui::DIALOG_BUTTON_CANCEL
                                   : ui::DIALOG_BUTTON_CANCEL);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
index b9a9d6f5..ff43d7e 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -229,15 +229,15 @@
       profile_(profile),
       url_(url),
       newly_bookmarked_(newly_bookmarked) {
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    l10n_util::GetStringUTF16(IDS_DONE));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK));
   DialogDelegate::SetExtraView(CreateEditButton(this));
   DialogDelegate::SetFootnoteView(CreateSigninPromoView());
 
-  DialogDelegate::set_cancel_callback(base::Bind(
+  DialogDelegate::SetCancelCallback(base::Bind(
       &BookmarkBubbleView::OnDialogCancelled, base::Unretained(this)));
 
   chrome::RecordDialogCreation(chrome::DialogIdentifier::BOOKMARK);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc
index 64121910..29b5055 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc
@@ -71,7 +71,7 @@
   DCHECK(profile);
   DCHECK(bb_model_);
   DCHECK(bb_model_->client()->CanBeEditedByUser(parent));
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    l10n_util::GetStringUTF16(IDS_SAVE));
   if (show_tree_) {
     new_folder_button_ = DialogDelegate::SetExtraView(
diff --git a/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc b/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc
index f5a31202..76b593f 100644
--- a/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc
+++ b/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc
@@ -58,7 +58,7 @@
   DCHECK(dialog_controller_);
   DCHECK(cleaner_controller_);
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CHROME_CLEANUP_PROMPT_REMOVE_BUTTON_LABEL));
   details_button_ =
@@ -66,13 +66,13 @@
           this, l10n_util::GetStringUTF16(
                     IDS_CHROME_CLEANUP_PROMPT_DETAILS_BUTTON_LABEL)));
 
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&ChromeCleanerDialog::HandleDialogInteraction,
                      base::Unretained(this), DialogInteractionResult::kAccept));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&ChromeCleanerDialog::HandleDialogInteraction,
                      base::Unretained(this), DialogInteractionResult::kCancel));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&ChromeCleanerDialog::HandleDialogInteraction,
                      base::Unretained(this), DialogInteractionResult::kClose));
 
diff --git a/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.cc b/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.cc
index 6afd4e6..97a7607 100644
--- a/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.cc
+++ b/chrome/browser/ui/views/chrome_cleaner_reboot_dialog_win.cc
@@ -49,7 +49,7 @@
   DCHECK(dialog_controller_);
 
   DialogDelegate::set_draggable(true);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_CHROME_CLEANUP_REBOOT_PROMPT_RESTART_BUTTON_LABEL));
@@ -65,13 +65,13 @@
     (std::exchange(*controller, nullptr)->*(fn))();
   };
 
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(close_callback, base::Unretained(&dialog_controller_),
                      &Controller::Accept));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(close_callback, base::Unretained(&dialog_controller_),
                      &Controller::Cancel));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(close_callback, base::Unretained(&dialog_controller_),
                      &Controller::Close));
 
diff --git a/chrome/browser/ui/views/collected_cookies_views.cc b/chrome/browser/ui/views/collected_cookies_views.cc
index 03bec1ec..6abfaca 100644
--- a/chrome/browser/ui/views/collected_cookies_views.cc
+++ b/chrome/browser/ui/views/collected_cookies_views.cc
@@ -345,8 +345,8 @@
 
 CollectedCookiesViews::CollectedCookiesViews(content::WebContents* web_contents)
     : web_contents_(web_contents) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    l10n_util::GetStringUTF16(IDS_DONE));
   views::GridLayout* layout =
       SetLayoutManager(std::make_unique<views::GridLayout>());
diff --git a/chrome/browser/ui/views/confirm_bubble_views.cc b/chrome/browser/ui/views/confirm_bubble_views.cc
index b2a0e3f..f10e7815 100644
--- a/chrome/browser/ui/views/confirm_bubble_views.cc
+++ b/chrome/browser/ui/views/confirm_bubble_views.cc
@@ -40,14 +40,14 @@
 ConfirmBubbleViews::ConfirmBubbleViews(
     std::unique_ptr<ConfirmBubbleModel> model)
     : model_(std::move(model)), help_button_(nullptr) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, model_->GetButtonLabel(ui::DIALOG_BUTTON_OK));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       model_->GetButtonLabel(ui::DIALOG_BUTTON_CANCEL));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &ConfirmBubbleModel::Accept, base::Unretained(model_.get())));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &ConfirmBubbleModel::Cancel, base::Unretained(model_.get())));
   help_button_ = DialogDelegate::SetExtraView(::CreateExtraView(this));
 
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.cc b/chrome/browser/ui/views/content_setting_bubble_contents.cc
index 5bbb76d0..c817c73 100644
--- a/chrome/browser/ui/views/content_setting_bubble_contents.cc
+++ b/chrome/browser/ui/views/content_setting_bubble_contents.cc
@@ -380,12 +380,12 @@
   DCHECK(content_setting_bubble_model_);
   const base::string16& done_text =
       content_setting_bubble_model_->bubble_content().done_button_text;
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       done_text.empty() ? l10n_util::GetStringUTF16(IDS_DONE) : done_text);
   DialogDelegate::SetExtraView(CreateHelpAndManageView());
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&ContentSettingBubbleModel::OnDoneButtonClicked,
                      base::Unretained(content_setting_bubble_model_.get())));
 }
diff --git a/chrome/browser/ui/views/create_application_shortcut_view.cc b/chrome/browser/ui/views/create_application_shortcut_view.cc
index 51cd96c..fbd98fb 100644
--- a/chrome/browser/ui/views/create_application_shortcut_view.cc
+++ b/chrome/browser/ui/views/create_application_shortcut_view.cc
@@ -44,7 +44,7 @@
     const extensions::Extension* app,
     const base::Callback<void(bool)>& close_callback)
     : profile_(profile), close_callback_(close_callback) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_COMMIT));
   set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
diff --git a/chrome/browser/ui/views/critical_notification_bubble_view.cc b/chrome/browser/ui/views/critical_notification_bubble_view.cc
index c7e650b..019f529 100644
--- a/chrome/browser/ui/views/critical_notification_bubble_view.cc
+++ b/chrome/browser/ui/views/critical_notification_bubble_view.cc
@@ -36,15 +36,15 @@
 CriticalNotificationBubbleView::CriticalNotificationBubbleView(
     views::View* anchor_view)
     : BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CRITICAL_NOTIFICATION_RESTART));
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    l10n_util::GetStringUTF16(IDS_CANCEL));
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&CriticalNotificationBubbleView::OnDialogAccepted,
                      base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&CriticalNotificationBubbleView::OnDialogCancelled,
                      base::Unretained(this)));
   set_close_on_deactivate(false);
diff --git a/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc b/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc
index c9fe5a8a..1b492f3 100644
--- a/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_ansible_software_config_view.cc
@@ -162,7 +162,7 @@
 
   // In the initial state (CONFIGURING), there are no buttons and hence no set
   // labels.
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 }
 
 CrostiniAnsibleSoftwareConfigView::~CrostiniAnsibleSoftwareConfigView() {
@@ -173,14 +173,14 @@
 void CrostiniAnsibleSoftwareConfigView::OnStateChanged() {
   progress_bar_->SetVisible(state_ == State::CONFIGURING);
   subtext_label_->SetText(GetSubtextLabel());
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetButtons(
       state_ == State::CONFIGURING
           ? ui::DIALOG_BUTTON_NONE
           : (state_ == State::ERROR
                  ? ui::DIALOG_BUTTON_OK
                  : ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL));
   // The cancel button, even when present, always uses the default text.
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       state_ == State::ERROR
           ? l10n_util::GetStringUTF16(IDS_APP_OK)
diff --git a/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc b/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc
index 382e5f4..143b52f 100644
--- a/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc
@@ -67,10 +67,10 @@
 CrostiniAppRestartView::CrostiniAppRestartView(const ash::ShelfID& id,
                                                int64_t display_id)
     : id_(id), display_id_(display_id) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CROSTINI_APP_RESTART_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_CROSTINI_NOT_NOW_BUTTON));
 
diff --git a/chrome/browser/ui/views/crostini/crostini_force_close_view.cc b/chrome/browser/ui/views/crostini/crostini_force_close_view.cc
index ea37670..d2ab3330 100644
--- a/chrome/browser/ui/views/crostini/crostini_force_close_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_force_close_view.cc
@@ -80,7 +80,7 @@
     base::OnceClosure force_close_callback)
     : app_name_(base::UTF8ToUTF16(app_name)),
       force_close_callback_(std::move(force_close_callback)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CROSTINI_FORCE_CLOSE_ACCEPT_BUTTON));
 
diff --git a/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc b/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc
index 779283a..6cd9d7af 100644
--- a/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc
@@ -50,7 +50,7 @@
 
 CrostiniPackageInstallFailureView::CrostiniPackageInstallFailureView(
     const std::string& error_message) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   views::LayoutProvider* provider = views::LayoutProvider::Get();
   SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kVertical,
diff --git a/chrome/browser/ui/views/crostini/crostini_recovery_view.cc b/chrome/browser/ui/views/crostini/crostini_recovery_view.cc
index be842c3..0d2e143 100644
--- a/chrome/browser/ui/views/crostini/crostini_recovery_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_recovery_view.cc
@@ -142,11 +142,11 @@
       display_id_(display_id),
       callback_(std::move(callback)),
       weak_ptr_factory_(this) {
-  set_buttons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
-  set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CROSTINI_RECOVERY_RESTART_BUTTON));
-  set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_CROSTINI_RECOVERY_TERMINAL_BUTTON));
 
diff --git a/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc b/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc
index 4a5d0bf..41edfe7 100644
--- a/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_uninstaller_view.cc
@@ -61,7 +61,7 @@
 
 bool CrostiniUninstallerView::Accept() {
   state_ = State::UNINSTALLING;
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   message_label_->SetText(
       l10n_util::GetStringUTF16(IDS_CROSTINI_UNINSTALLER_UNINSTALLING_MESSAGE));
 
@@ -101,7 +101,7 @@
 
 CrostiniUninstallerView::CrostiniUninstallerView(Profile* profile)
     : profile_(profile) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CROSTINI_UNINSTALLER_UNINSTALL_BUTTON));
 
@@ -128,7 +128,7 @@
 
 void CrostiniUninstallerView::HandleError(const base::string16& error_message) {
   state_ = State::ERROR;
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL);
   message_label_->SetVisible(true);
   message_label_->SetText(error_message);
   progress_bar_->SetVisible(false);
diff --git a/chrome/browser/ui/views/crostini/crostini_update_component_view.cc b/chrome/browser/ui/views/crostini/crostini_update_component_view.cc
index 355fa8e..b0eb8fa 100644
--- a/chrome/browser/ui/views/crostini/crostini_update_component_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_update_component_view.cc
@@ -68,7 +68,7 @@
 }
 
 CrostiniUpdateComponentView::CrostiniUpdateComponentView() {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
 
   views::LayoutProvider* provider = views::LayoutProvider::Get();
   SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/chrome/browser/ui/views/crostini/crostini_update_filesystem_view.cc b/chrome/browser/ui/views/crostini/crostini_update_filesystem_view.cc
index 1124a43..5f1fadc9 100644
--- a/chrome/browser/ui/views/crostini/crostini_update_filesystem_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_update_filesystem_view.cc
@@ -114,7 +114,7 @@
 CrostiniUpdateFilesystemView::CrostiniUpdateFilesystemView() {
   constexpr int kDialogSpacingVertical = 32;
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
 
   views::LayoutProvider* provider = views::LayoutProvider::Get();
   SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/chrome/browser/ui/views/crypto_module_password_dialog_view.cc b/chrome/browser/ui/views/crypto_module_password_dialog_view.cc
index d02dc48..8857655 100644
--- a/chrome/browser/ui/views/crypto_module_password_dialog_view.cc
+++ b/chrome/browser/ui/views/crypto_module_password_dialog_view.cc
@@ -25,16 +25,16 @@
     const std::string& hostname,
     const CryptoModulePasswordCallback& callback)
     : callback_(callback) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CRYPTO_MODULE_AUTH_DIALOG_OK_BUTTON_LABEL));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       [](CryptoModulePasswordDialogView* dialog) {
         dialog->callback_.Run(
             base::UTF16ToUTF8(dialog->password_entry_->GetText()));
       },
       base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(callback_, std::string()));
+  DialogDelegate::SetCancelCallback(base::BindOnce(callback_, std::string()));
   set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
       views::TEXT, views::CONTROL));
   Init(hostname, slot_name, reason);
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
index a857f22..bb9337d 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
@@ -63,7 +63,7 @@
     DesktopMediaPickerViews* parent,
     std::vector<std::unique_ptr<DesktopMediaList>> source_lists)
     : parent_(parent), modality_(params.modality) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_DESKTOP_MEDIA_PICKER_SHARE));
   const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/download/download_danger_prompt_views.cc b/chrome/browser/ui/views/download/download_danger_prompt_views.cc
index 24d8059..4f7c93d2 100644
--- a/chrome/browser/ui/views/download/download_danger_prompt_views.cc
+++ b/chrome/browser/ui/views/download/download_danger_prompt_views.cc
@@ -83,9 +83,9 @@
       done_(done) {
   // Note that this prompt is asking whether to cancel a dangerous download, so
   // the accept path is titled "Cancel".
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    l10n_util::GetStringUTF16(IDS_CANCEL));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       show_context_ ? l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD)
                     : l10n_util::GetStringUTF16(IDS_CONFIRM_DOWNLOAD_AGAIN));
@@ -98,9 +98,9 @@
   // Note that the presentational concept of "Accept/Cancel" is inverted from
   // the model's concept of ACCEPT/CANCEL. In the UI, the safe path is "Accept"
   // and the dangerous path is "Cancel".
-  DialogDelegate::set_accept_callback(make_done_callback(CANCEL));
-  DialogDelegate::set_cancel_callback(make_done_callback(ACCEPT));
-  DialogDelegate::set_close_callback(make_done_callback(DISMISS));
+  DialogDelegate::SetAcceptCallback(make_done_callback(CANCEL));
+  DialogDelegate::SetCancelCallback(make_done_callback(ACCEPT));
+  DialogDelegate::SetCloseCallback(make_done_callback(DISMISS));
 
   download_->AddObserver(this);
 
diff --git a/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc b/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc
index c6ac8cda..3dcf624 100644
--- a/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc
+++ b/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc
@@ -35,11 +35,11 @@
     : download_count_(download_count),
       app_modal_(app_modal),
       callback_(callback) {
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_ABANDON_DOWNLOAD_DIALOG_EXIT_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_ABANDON_DOWNLOAD_DIALOG_CONTINUE_BUTTON));
   SetLayoutManager(std::make_unique<views::FillLayout>());
@@ -51,9 +51,9 @@
     // means "continue the download".
     dialog->callback_.Run(accept);
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(run_callback, base::Unretained(this), true));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(run_callback, base::Unretained(this), false));
 
   int message_id = 0;
diff --git a/chrome/browser/ui/views/extensions/chooser_dialog_view.cc b/chrome/browser/ui/views/extensions/chooser_dialog_view.cc
index 9a4f5cc..f0f90ed7 100644
--- a/chrome/browser/ui/views/extensions/chooser_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/chooser_dialog_view.cc
@@ -43,9 +43,9 @@
 
   DCHECK(chooser_controller);
 
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    chooser_controller->GetOkButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    chooser_controller->GetCancelButtonLabel());
 
   device_chooser_content_view_ =
@@ -56,13 +56,13 @@
 
   DialogDelegate::SetExtraView(device_chooser_content_view_->CreateExtraView());
 
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&DeviceChooserContentView::Accept,
                      base::Unretained(device_chooser_content_view_)));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&DeviceChooserContentView::Cancel,
                      base::Unretained(device_chooser_content_view_)));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&DeviceChooserContentView::Close,
                      base::Unretained(device_chooser_content_view_)));
 
diff --git a/chrome/browser/ui/views/extensions/extension_dialog.cc b/chrome/browser/ui/views/extensions/extension_dialog.cc
index aaa8d9b..445459f 100644
--- a/chrome/browser/ui/views/extensions/extension_dialog.cc
+++ b/chrome/browser/ui/views/extensions/extension_dialog.cc
@@ -180,7 +180,7 @@
     std::unique_ptr<extensions::ExtensionViewHost> host,
     ExtensionDialogObserver* observer)
     : host_(std::move(host)), observer_(observer) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DialogDelegate::set_use_custom_frame(false);
 
   AddRef();  // Balanced in DeleteDelegate();
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
index 79c5e51..9b6239fc 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -208,8 +208,8 @@
   int buttons = prompt_->GetDialogButtons();
   DCHECK(buttons & ui::DIALOG_BUTTON_CANCEL);
 
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_buttons(buttons);
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetButtons(buttons);
   DialogDelegate::set_draggable(true);
   if (prompt_->has_webstore_data()) {
     auto store_link = std::make_unique<views::Link>(
@@ -223,9 +223,9 @@
             l10n_util::GetStringUTF16(IDS_EXTENSION_WITHHOLD_PERMISSIONS)));
   }
 
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    prompt_->GetAcceptButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    prompt_->GetAbortButtonLabel());
   set_close_on_deactivate(false);
   CreateContents();
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
index b6c693f..15308db 100644
--- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -187,7 +187,7 @@
       model_(std::move(model)),
       icon_(model_->MakeIconOfSize(kMaxIconSize)) {
   chrome::RecordDialogCreation(chrome::DialogIdentifier::EXTENSION_INSTALLED);
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   if (model_->show_sign_in_promo()) {
     DialogDelegate::SetFootnoteView(
         CreateSigninPromoView(browser->profile(), this));
diff --git a/chrome/browser/ui/views/extensions/extension_popup.cc b/chrome/browser/ui/views/extensions/extension_popup.cc
index b98ab3f..3f0ed84 100644
--- a/chrome/browser/ui/views/extensions/extension_popup.cc
+++ b/chrome/browser/ui/views/extensions/extension_popup.cc
@@ -188,7 +188,7 @@
       host_(std::move(host)),
       extension_registry_observer_(this),
       show_action_(show_action) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DialogDelegate::set_use_round_corners(false);
 
   set_margins(gfx::Insets());
diff --git a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc
index be50dee..a6801c0 100644
--- a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc
@@ -204,7 +204,7 @@
           skia::ImageOperations::ResizeMethod::RESIZE_GOOD,
           gfx::Size(extension_misc::EXTENSION_ICON_SMALL,
                     extension_misc::EXTENSION_ICON_SMALL))) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON));
 
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
index f5bd963..9013434 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
@@ -91,7 +91,7 @@
   browser_->tab_strip_model()->AddObserver(this);
   set_margins(gfx::Insets(0));
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   EnableUpDownKeyboardAccelerators();
 
diff --git a/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc b/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc
index e1ed3d21..e7c121d 100644
--- a/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc
+++ b/chrome/browser/ui/views/extensions/media_galleries_dialog_views.cc
@@ -79,9 +79,9 @@
       auxiliary_button_(nullptr),
       confirm_available_(false),
       accepted_(false) {
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    controller_->GetAcceptButtonText());
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       [](MediaGalleriesDialogViews* dialog) { dialog->accepted_ = true; },
       base::Unretained(this)));
 
diff --git a/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc b/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc
index a71c120..bf1a6b8 100644
--- a/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc
@@ -100,11 +100,11 @@
                     extension_misc::EXTENSION_ICON_SMALL))),
       callback_(std::move(callback)),
       dialog_is_bubble_(anchor_view != nullptr) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_EXTENSIONS_PRINTING_API_PRINT_REQUEST_ALLOW));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(
           IDS_EXTENSIONS_PRINTING_API_PRINT_REQUEST_DENY));
@@ -112,9 +112,9 @@
   auto run_callback = [](PrintJobConfirmationDialogView* dialog, bool accept) {
     std::move(dialog->callback_).Run(accept);
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(run_callback, base::Unretained(this), true));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(run_callback, base::Unretained(this), false));
 
   ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc b/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc
index af31c5b..9e8d663 100644
--- a/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/request_file_system_dialog_view.cc
@@ -63,12 +63,12 @@
     bool writable,
     const base::Callback<void(ui::DialogButton)>& callback)
     : callback_(callback) {
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_DIALOG_ALLOW_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(
           IDS_FILE_SYSTEM_REQUEST_FILE_SYSTEM_DIALOG_DENY_BUTTON));
@@ -77,9 +77,9 @@
                          ui::DialogButton button) {
     dialog->callback_.Run(button);
   };
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       run_callback, base::Unretained(this), ui::DIALOG_BUTTON_OK));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       run_callback, base::Unretained(this), ui::DIALOG_BUTTON_CANCEL));
 
   DCHECK(!callback_.is_null());
diff --git a/chrome/browser/ui/views/external_protocol_dialog.cc b/chrome/browser/ui/views/external_protocol_dialog.cc
index 3f299ad..4fef48b 100644
--- a/chrome/browser/ui/views/external_protocol_dialog.cc
+++ b/chrome/browser/ui/views/external_protocol_dialog.cc
@@ -73,21 +73,21 @@
       url_(url),
       program_name_(program_name),
       initiating_origin_(initiating_origin) {
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringFUTF16(IDS_EXTERNAL_PROTOCOL_OK_BUTTON_TEXT,
                                  program_name_));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_CANCEL_BUTTON_TEXT));
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &ExternalProtocolDialog::OnDialogAccepted, base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &ExternalProtocolHandler::RecordHandleStateMetrics,
       false /* checkbox_selected */, ExternalProtocolHandler::BLOCK));
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       &ExternalProtocolHandler::RecordHandleStateMetrics,
       false /* checkbox_selected */, ExternalProtocolHandler::BLOCK));
 
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
index 80e85f8..5cf2c2dc 100644
--- a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
@@ -114,7 +114,7 @@
 
   set_margins(gfx::Insets());
   set_title_margins(gfx::Insets());
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   set_color(background_color);
 
diff --git a/chrome/browser/ui/views/first_run_dialog.cc b/chrome/browser/ui/views/first_run_dialog.cc
index a3f2160..9cd1d70b 100644
--- a/chrome/browser/ui/views/first_run_dialog.cc
+++ b/chrome/browser/ui/views/first_run_dialog.cc
@@ -68,7 +68,7 @@
 }
 
 FirstRunDialog::FirstRunDialog(Profile* profile) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   DialogDelegate::SetExtraView(
       std::make_unique<views::Link>(l10n_util::GetStringUTF16(IDS_LEARN_MORE)))
       ->set_callback(base::BindRepeating(&platform_util::OpenExternal,
diff --git a/chrome/browser/ui/views/folder_upload_confirmation_view.cc b/chrome/browser/ui/views/folder_upload_confirmation_view.cc
index a4dd724..419c29f 100644
--- a/chrome/browser/ui/views/folder_upload_confirmation_view.cc
+++ b/chrome/browser/ui/views/folder_upload_confirmation_view.cc
@@ -22,21 +22,21 @@
     std::vector<ui::SelectedFileInfo> selected_files)
     : callback_(std::move(callback)),
       selected_files_(std::move(selected_files)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CONFIRM_FILE_UPLOAD_OK_BUTTON));
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       [](FolderUploadConfirmationView* dialog) {
         std::move(dialog->callback_).Run(dialog->selected_files_);
       },
       base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       [](FolderUploadConfirmationView* dialog) {
         std::move(dialog->callback_).Run({});
       },
       base::Unretained(this)));
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       [](FolderUploadConfirmationView* dialog) {
         std::move(dialog->callback_).Run({});
       },
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
index 5dd65c8..e3b65ee 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -1067,7 +1067,7 @@
 }
 
 // TODO(): Flaky crash on Chrome OS debug.
-#if defined(OS_CHROMEOS) && !defined(NDEBUG)
+#if defined(OS_CHROMEOS)
 #define MAYBE_BrowserCommandFocusToolbarGeolocation \
   DISABLED_BrowserCommandFocusToolbarGeolocation
 #else
diff --git a/chrome/browser/ui/views/global_error_bubble_view.cc b/chrome/browser/ui/views/global_error_bubble_view.cc
index 7220ce0..56e9a3e 100644
--- a/chrome/browser/ui/views/global_error_bubble_view.cc
+++ b/chrome/browser/ui/views/global_error_bubble_view.cc
@@ -80,22 +80,22 @@
   // error_ is a WeakPtr, but it's always non-null during construction.
   DCHECK(error_);
 
-  DialogDelegate::set_default_button(error_->GetDefaultDialogButton());
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetDefaultButton(error_->GetDefaultDialogButton());
+  DialogDelegate::SetButtons(
       !error_->GetBubbleViewCancelButtonLabel().empty()
           ? (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL)
           : ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    error_->GetBubbleViewAcceptButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    error_->GetBubbleViewCancelButtonLabel());
 
   // Note that error is already a WeakPtr, so these callbacks will simply do
   // nothing if they are invoked after its destruction.
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &GlobalErrorWithStandardBubble::BubbleViewAcceptButtonPressed, error,
       base::Unretained(browser_)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &GlobalErrorWithStandardBubble::BubbleViewCancelButtonPressed, error,
       base::Unretained(browser_)));
 
diff --git a/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc b/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc
index 1cb5a4dd..a8f548e 100644
--- a/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc
+++ b/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc
@@ -158,7 +158,7 @@
       service_(service),
       active_sessions_view_(
           AddChildView(std::make_unique<MediaNotificationListView>())) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DCHECK(service_);
 }
 
diff --git a/chrome/browser/ui/views/hats/hats_bubble_view.cc b/chrome/browser/ui/views/hats/hats_bubble_view.cc
index 332cb55..b02db2aa 100644
--- a/chrome/browser/ui/views/hats/hats_bubble_view.cc
+++ b/chrome/browser/ui/views/hats/hats_bubble_view.cc
@@ -101,10 +101,10 @@
       consent_callback_(std::move(consent_callback)) {
   chrome::RecordDialogCreation(chrome::DialogIdentifier::HATS_BUBBLE);
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_HATS_BUBBLE_OK_LABEL));
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    l10n_util::GetStringUTF16(IDS_NO_THANKS));
   set_close_on_deactivate(false);
   set_parent_window(parent_view);
@@ -112,9 +112,9 @@
   auto run_callback = [](HatsBubbleView* bubble, bool accept) {
     std::move(bubble->consent_callback_).Run(accept);
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(run_callback, base::Unretained(this), true));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(run_callback, base::Unretained(this), false));
 
   ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/hung_renderer_view.cc b/chrome/browser/ui/views/hung_renderer_view.cc
index 9034050..aa2401e1 100644
--- a/chrome/browser/ui/views/hung_renderer_view.cc
+++ b/chrome/browser/ui/views/hung_renderer_view.cc
@@ -287,19 +287,19 @@
       hung_pages_table_model_.get(), columns, views::ICON_AND_TEXT, true);
   hung_pages_table_ = hung_pages_table.get();
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetPluralStringFUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_END,
                                        hung_pages_table_model_->RowCount()));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_WAIT));
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &HungRendererDialogView::RestartHangTimer, base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &HungRendererDialogView::ForceCrashHungRenderer, base::Unretained(this)));
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       &HungRendererDialogView::RestartHangTimer, base::Unretained(this)));
 
   DialogModelChanged();
diff --git a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
index 822a3f7a9..45ea4a99 100644
--- a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
+++ b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
@@ -80,7 +80,7 @@
       response_callback_(callback) {
   BrowserList::AddObserver(this);
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       [](ImeWarningBubbleView* bubble) {
         const bool never_show = bubble->never_show_checkbox_->GetChecked();
         std::move(bubble->response_callback_)
@@ -89,7 +89,7 @@
                      : ImeWarningBubblePermissionStatus::GRANTED);
       },
       base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       [](ImeWarningBubbleView* bubble) {
         std::move(bubble->response_callback_)
             .Run(ImeWarningBubblePermissionStatus::DENIED);
diff --git a/chrome/browser/ui/views/importer/import_lock_dialog_view.cc b/chrome/browser/ui/views/importer/import_lock_dialog_view.cc
index b6d00e9..763fd2e 100644
--- a/chrome/browser/ui/views/importer/import_lock_dialog_view.cc
+++ b/chrome/browser/ui/views/importer/import_lock_dialog_view.cc
@@ -46,7 +46,7 @@
 ImportLockDialogView::ImportLockDialogView(
     const base::Callback<void(bool)>& callback)
     : callback_(callback) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_IMPORTER_LOCK_OK));
 
   SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.cc b/chrome/browser/ui/views/intent_picker_bubble_view.cc
index 09329b02..553bde3 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view.cc
+++ b/chrome/browser/ui/views/intent_picker_bubble_view.cc
@@ -280,23 +280,23 @@
       icon_view_(icon_view),
       icon_type_(icon_type),
       initiating_origin_(initiating_origin) {
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetButtons(
       show_stay_in_chrome_ ? (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL)
                            : ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           icon_type_ == PageActionIconType::kClickToCall
               ? IDS_BROWSER_SHARING_CLICK_TO_CALL_DIALOG_CALL_BUTTON_LABEL
               : IDS_INTENT_PICKER_BUBBLE_VIEW_OPEN));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_INTENT_PICKER_BUBBLE_VIEW_STAY_IN_CHROME));
-  DialogDelegate::set_accept_callback(base::Bind(
+  DialogDelegate::SetAcceptCallback(base::Bind(
       &IntentPickerBubbleView::OnDialogAccepted, base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::Bind(
+  DialogDelegate::SetCancelCallback(base::Bind(
       &IntentPickerBubbleView::OnDialogCancelled, base::Unretained(this)));
-  DialogDelegate::set_close_callback(base::Bind(
+  DialogDelegate::SetCloseCallback(base::Bind(
       &IntentPickerBubbleView::OnDialogClosed, base::Unretained(this)));
 
   // Click to call bubbles need to be closed after navigation if the main frame
diff --git a/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc b/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc
index 3fdb2c527..a5c445493 100644
--- a/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc
+++ b/chrome/browser/ui/views/javascript_tab_modal_dialog_view_views.cc
@@ -65,28 +65,28 @@
       default_prompt_text_(default_prompt_text),
       dialog_callback_(std::move(dialog_callback)),
       dialog_force_closed_callback_(std::move(dialog_force_closed_callback)) {
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_OK);
   const bool is_alert = dialog_type == content::JAVASCRIPT_DIALOG_TYPE_ALERT;
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetButtons(
       // Alerts only have an OK button, no Cancel, because there is no choice
       // being made.
       is_alert ? ui::DIALOG_BUTTON_OK
                : (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL));
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       [](JavaScriptTabModalDialogViewViews* dialog) {
         if (dialog->dialog_callback_)
           std::move(dialog->dialog_callback_)
               .Run(true, dialog->message_box_view_->GetInputText());
       },
       base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       [](JavaScriptTabModalDialogViewViews* dialog) {
         if (dialog->dialog_callback_)
           std::move(dialog->dialog_callback_).Run(false, base::string16());
       },
       base::Unretained(this)));
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       [](JavaScriptTabModalDialogViewViews* dialog) {
         if (dialog->dialog_force_closed_callback_)
           std::move(dialog->dialog_force_closed_callback_).Run();
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
index 9c40f4b..4b0c0c6 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
@@ -103,7 +103,7 @@
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       controller_(controller) {
   controller_observer_.Add(controller);
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 }
 
 CookieControlsBubbleView::~CookieControlsBubbleView() = default;
@@ -152,17 +152,17 @@
       extra_view_->SetVisible(false);
   }
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       intermediate_step_ == IntermediateStep::kTurnOffButton
           ? l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON)
           : l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_ON_BUTTON));
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetButtons(
       (intermediate_step_ == IntermediateStep::kTurnOffButton ||
        status_ == CookieControlsStatus::kDisabledForSite)
           ? ui::DIALOG_BUTTON_OK
           : ui::DIALOG_BUTTON_NONE);
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &CookieControlsBubbleView::OnDialogAccepted, base::Unretained(this)));
 
   DialogModelChanged();
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
index 86998cbd..04120c1 100644
--- a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
@@ -283,7 +283,7 @@
       immersive_mode_controller_(immersive_mode_controller),
       session_id_(
           chrome::FindBrowserWithWebContents(web_contents)->session_id()) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   set_notify_enter_exit_on_child(true);
   if (immersive_mode_controller_)
diff --git a/chrome/browser/ui/views/login_handler_views.cc b/chrome/browser/ui/views/login_handler_views.cc
index c20e45983..d700b49 100644
--- a/chrome/browser/ui/views/login_handler_views.cc
+++ b/chrome/browser/ui/views/login_handler_views.cc
@@ -86,10 +86,10 @@
            const base::string16& explanation,
            LoginHandler::LoginModelData* login_model_data)
         : handler_(handler), login_view_(nullptr), widget_(nullptr) {
-      DialogDelegate::set_button_label(
+      DialogDelegate::SetButtonLabel(
           ui::DIALOG_BUTTON_OK,
           l10n_util::GetStringUTF16(IDS_LOGIN_DIALOG_OK_BUTTON_LABEL));
-      DialogDelegate::set_accept_callback(base::BindOnce(
+      DialogDelegate::SetAcceptCallback(base::BindOnce(
           [](Dialog* dialog) {
             if (!dialog->handler_)
               return;
@@ -97,7 +97,7 @@
                                       dialog->login_view_->GetPassword());
           },
           base::Unretained(this)));
-      DialogDelegate::set_cancel_callback(base::BindOnce(
+      DialogDelegate::SetCancelCallback(base::BindOnce(
           [](Dialog* dialog) {
             if (!dialog->handler_)
               return;
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.cc b/chrome/browser/ui/views/media_router/cast_dialog_view.cc
index adccb54..078fc73e1 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_view.cc
+++ b/chrome/browser/ui/views/media_router/cast_dialog_view.cc
@@ -265,7 +265,7 @@
       controller_(controller),
       profile_(profile),
       metrics_(start_time, activation_location, profile) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   sources_button_ = DialogDelegate::SetExtraView(CreateSourcesButton(this));
   ShowNoSinksView();
 }
diff --git a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc
index 99dbf6f8..0c39ea8 100644
--- a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc
+++ b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc
@@ -91,13 +91,13 @@
                                                  Browser* browser)
     : BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
       browser_(browser) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_CLOUD_SERVICES_DIALOG_ENABLE));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_CLOUD_SERVICES_DIALOG_CANCEL));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &CloudServicesDialogView::OnDialogAccepted, base::Unretained(this)));
   set_close_on_deactivate(false);
   SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc
index 1d365ae..ec299f0 100644
--- a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc
+++ b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc
@@ -101,19 +101,19 @@
       dialog_title_(
           l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_REMOTING_DIALOG_TITLE)) {
   DCHECK(pref_service_);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_MEDIA_ROUTER_REMOTING_DIALOG_OPTIMIZE_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(
           IDS_MEDIA_ROUTER_REMOTING_DIALOG_CANCEL_BUTTON));
 
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&MediaRemotingDialogView::ReportPermission,
                      base::Unretained(this), true));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&MediaRemotingDialogView::ReportPermission,
                      base::Unretained(this), false));
 
diff --git a/chrome/browser/ui/views/message_box_dialog.cc b/chrome/browser/ui/views/message_box_dialog.cc
index 3317d6f..634095c 100644
--- a/chrome/browser/ui/views/message_box_dialog.cc
+++ b/chrome/browser/ui/views/message_box_dialog.cc
@@ -217,17 +217,17 @@
       message_box_view_(new views::MessageBoxView(
           views::MessageBoxView::InitParams(message))),
       is_system_modal_(is_system_modal) {
-  DialogDelegate::set_buttons(type_ == chrome::MESSAGE_BOX_TYPE_QUESTION
+  DialogDelegate::SetButtons(type_ == chrome::MESSAGE_BOX_TYPE_QUESTION
                                   ? ui::DIALOG_BUTTON_OK |
                                         ui::DIALOG_BUTTON_CANCEL
                                   : ui::DIALOG_BUTTON_OK);
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &MessageBoxDialog::OnDialogAccepted, base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&MessageBoxDialog::Done, base::Unretained(this),
                      chrome::MESSAGE_BOX_RESULT_NO));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&MessageBoxDialog::Done, base::Unretained(this),
                      chrome::MESSAGE_BOX_RESULT_NO));
 
@@ -238,14 +238,14 @@
             ? l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL)
             : l10n_util::GetStringUTF16(IDS_OK);
   }
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, ok_text);
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, ok_text);
 
   // Only MESSAGE_BOX_TYPE_QUESTION has a Cancel button.
   if (type_ == chrome::MESSAGE_BOX_TYPE_QUESTION) {
     base::string16 cancel_text = no_text;
     if (cancel_text.empty())
       cancel_text = l10n_util::GetStringUTF16(IDS_CANCEL);
-    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, cancel_text);
+    DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, cancel_text);
   }
 
   if (!checkbox_text.empty())
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc
index 79c892f..8127f46d 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_directory_access_confirmation_view.cc
@@ -83,7 +83,7 @@
         base::ScopedClosureRunner fullscreen_block)
     : callback_(std::move(callback)),
       fullscreen_block_(std::move(fullscreen_block)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_NATIVE_FILE_SYSTEM_DIRECTORY_ACCESS_ALLOW_BUTTON));
@@ -98,13 +98,13 @@
          permissions::PermissionAction result) {
         std::move(dialog->callback_).Run(result);
       };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(run_callback, base::Unretained(this),
                      permissions::PermissionAction::GRANTED));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(run_callback, base::Unretained(this),
                      permissions::PermissionAction::DISMISSED));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(run_callback, base::Unretained(this),
                      permissions::PermissionAction::DISMISSED));
 
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc
index 2ed214ab..427ad08 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc
@@ -72,7 +72,7 @@
     const Request& request,
     base::OnceCallback<void(permissions::PermissionAction result)> callback)
     : request_(request), callback_(std::move(callback)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(GetButtonLabel(request_)));
 
@@ -80,13 +80,13 @@
                          permissions::PermissionAction result) {
     std::move(dialog->callback_).Run(result);
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(run_callback, base::Unretained(this),
                      permissions::PermissionAction::GRANTED));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(run_callback, base::Unretained(this),
                      permissions::PermissionAction::DISMISSED));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(run_callback, base::Unretained(this),
                      permissions::PermissionAction::DISMISSED));
 
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc
index ae8db228..fd937ff 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc
@@ -69,7 +69,7 @@
         bool is_directory,
         base::OnceCallback<void(SensitiveDirectoryResult)> callback)
     : is_directory_(is_directory), callback_(std::move(callback)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           is_directory_ ? IDS_NATIVE_FILE_SYSTEM_RESTRICTED_DIRECTORY_BUTTON
@@ -79,10 +79,10 @@
                          SensitiveDirectoryResult result) {
     std::move(dialog->callback_).Run(result);
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(run_callback, base::Unretained(this),
                      SensitiveDirectoryResult::kTryAgain));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       run_callback, base::Unretained(this), SensitiveDirectoryResult::kAbort));
 
   SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
index 3b27174..73e1606 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
@@ -308,12 +308,12 @@
                             std::move(usage_.readable_directories)),
       writable_paths_model_(std::move(usage_.writable_files),
                             std::move(usage_.writable_directories)) {
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    l10n_util::GetStringUTF16(IDS_DONE));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_NATIVE_FILE_SYSTEM_USAGE_REMOVE_ACCESS));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&NativeFileSystemUsageBubbleView::OnDialogCancelled,
                      base::Unretained(this)));
 }
diff --git a/chrome/browser/ui/views/network_profile_bubble_view.cc b/chrome/browser/ui/views/network_profile_bubble_view.cc
index c4bb044f..35f559c 100644
--- a/chrome/browser/ui/views/network_profile_bubble_view.cc
+++ b/chrome/browser/ui/views/network_profile_bubble_view.cc
@@ -54,7 +54,7 @@
     : BubbleDialogDelegateView(anchor, views::BubbleBorder::TOP_RIGHT),
       navigator_(navigator),
       profile_(profile) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   auto* learn_more = DialogDelegate::SetExtraView(
       std::make_unique<views::Link>(l10n_util::GetStringUTF16(IDS_LEARN_MORE)));
   learn_more->set_callback(base::BindRepeating(
diff --git a/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc b/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc
index 4fbb09a3..ad29ffb 100644
--- a/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc
+++ b/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc
@@ -34,9 +34,9 @@
     DCHECK(template_url_service);
     DCHECK(match_.SupportsDeletion());
 
-    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+    DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                      l10n_util::GetStringUTF16(IDS_REMOVE));
-    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+    DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                      l10n_util::GetStringUTF16(IDS_CANCEL));
 
     auto* layout_manager = SetLayoutManager(std::make_unique<views::BoxLayout>(
diff --git a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
index abbe8282..8f17dbc2f 100644
--- a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
+++ b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
@@ -153,14 +153,14 @@
     : BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
       auto_update_enabled_(auto_update_enabled),
       navigator_(navigator) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(auto_update_enabled_ ? IDS_REINSTALL_APP
                                                      : IDS_REENABLE_UPDATES));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &OutdatedUpgradeBubbleView::OnDialogAccepted, base::Unretained(this)));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&base::RecordAction,
                      base::UserMetricsAction("OutdatedUpgradeBubble.Later")));
   chrome::RecordDialogCreation(chrome::DialogIdentifier::OUTDATED_UPGRADE);
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc
index 397dc77..ef61d91c 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_base.cc
@@ -49,7 +49,7 @@
   g_shown_bubble_type = type;
   g_page_info_bubble = this;
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   set_parent_window(parent_window);
   if (!anchor_view)
diff --git a/chrome/browser/ui/views/parent_permission_dialog_view.cc b/chrome/browser/ui/views/parent_permission_dialog_view.cc
index 025e56b..5be2d79f 100644
--- a/chrome/browser/ui/views/parent_permission_dialog_view.cc
+++ b/chrome/browser/ui/views/parent_permission_dialog_view.cc
@@ -205,12 +205,12 @@
     std::unique_ptr<Params> params,
     ParentPermissionDialogView::DoneCallback done_callback)
     : params_(std::move(params)), done_callback_(std::move(done_callback)) {
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_OK);
   DialogDelegate::set_draggable(true);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_PARENT_PERMISSION_PROMPT_APPROVE_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_PARENT_PERMISSION_PROMPT_CANCEL_BUTTON));
 }
diff --git a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
index 14c99c3..fe80ab0a 100644
--- a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
+++ b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
@@ -88,8 +88,8 @@
     : controller_(controller), web_contents_(web_contents) {
   DCHECK(controller);
   DCHECK(web_contents);
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_ACCOUNT_CHOOSER_SIGN_IN));
   set_close_on_deactivate(false);
@@ -105,7 +105,7 @@
 void AccountChooserDialogView::ShowAccountChooser() {
   // It isn't known until after the creation of this dialog whether the sign-in
   // button should be shown, so always reset the button state here.
-  DialogDelegate::set_buttons(controller_->ShouldShowSignInButton()
+  DialogDelegate::SetButtons(controller_->ShouldShowSignInButton()
                                   ? ui::DIALOG_BUTTON_OK |
                                         ui::DIALOG_BUTTON_CANCEL
                                   : ui::DIALOG_BUTTON_CANCEL);
diff --git a/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc b/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc
index 8e6635c..cea3da5 100644
--- a/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc
+++ b/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc
@@ -22,10 +22,10 @@
     CredentialManagerDialogController* controller,
     content::WebContents* web_contents)
     : controller_(controller), web_contents_(web_contents) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_AUTO_SIGNIN_FIRST_RUN_OK));
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    l10n_util::GetStringUTF16(IDS_TURN_OFF));
 
   using ControllerCallbackFn = void (CredentialManagerDialogController::*)();
@@ -35,10 +35,10 @@
       (dialog->controller_->*func)();
     }
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(call_controller, base::Unretained(this),
                      &CredentialManagerDialogController::OnAutoSigninOK));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(call_controller, base::Unretained(this),
                      &CredentialManagerDialogController::OnAutoSigninTurnOff));
 
diff --git a/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc b/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc
index 29b4dc43..23a370c 100644
--- a/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc
+++ b/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc
@@ -80,13 +80,13 @@
   DCHECK(controller);
   DCHECK(web_contents);
 
-  DialogDelegate::set_buttons(controller->ShouldShowCancelButton()
+  DialogDelegate::SetButtons(controller->ShouldShowCancelButton()
                                   ? ui::DIALOG_BUTTON_OK |
                                         ui::DIALOG_BUTTON_CANCEL
                                   : ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    controller_->GetAcceptButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    controller_->GetCancelButtonLabel());
 
   using ControllerClosureFn = void (CredentialLeakDialogController::*)(void);
@@ -102,13 +102,13 @@
     (std::exchange(*controller, nullptr)->*(fn))();
   };
 
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(close_callback, base::Unretained(&controller_),
                      &CredentialLeakDialogController::OnAcceptDialog));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(close_callback, base::Unretained(&controller_),
                      &CredentialLeakDialogController::OnCancelDialog));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(close_callback, base::Unretained(&controller_),
                      &CredentialLeakDialogController::OnCloseDialog));
 }
diff --git a/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc b/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc
index 68b9231a..56b421be 100644
--- a/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc
+++ b/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc
@@ -36,7 +36,7 @@
   SetLayoutManager(std::make_unique<views::FillLayout>());
   const autofill::PasswordForm& form = controller_.pending_password();
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   set_margins(
       ChromeLayoutProvider::Get()->GetInsetsMetric(views::INSETS_DIALOG));
diff --git a/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc b/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc
index fdb48bc..689a271 100644
--- a/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc
+++ b/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc
@@ -30,7 +30,7 @@
               : PasswordBubbleControllerBase::DisplayReason::kUserAction) {
   SetLayoutManager(std::make_unique<views::FillLayout>());
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   auto label = std::make_unique<views::StyledLabel>(
       controller_.save_confirmation_text(), this);
diff --git a/chrome/browser/ui/views/passwords/password_items_view.cc b/chrome/browser/ui/views/passwords/password_items_view.cc
index e0da42d..c7d7f27 100644
--- a/chrome/browser/ui/views/passwords/password_items_view.cc
+++ b/chrome/browser/ui/views/passwords/password_items_view.cc
@@ -220,7 +220,7 @@
                              anchor_view,
                              /*easily_dismissable=*/true),
       controller_(PasswordsModelDelegateFromWebContents(web_contents)) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   DialogDelegate::SetExtraView(CreateManageButton(this));
 
   if (controller_.local_credentials().empty()) {
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.cc b/chrome/browser/ui/views/passwords/password_save_update_view.cc
index abcb6cb..529e5c22 100644
--- a/chrome/browser/ui/views/passwords/password_save_update_view.cc
+++ b/chrome/browser/ui/views/passwords/password_save_update_view.cc
@@ -308,7 +308,7 @@
   }
 
   DialogDelegate::SetFootnoteView(CreateFooterView());
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &PasswordSaveUpdateView::OnDialogCancelled, base::Unretained(this)));
   UpdateDialogButtons();
 }
@@ -475,17 +475,17 @@
 
 void PasswordSaveUpdateView::UpdateDialogButtons() {
   if (sign_in_promo_) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
     return;
   }
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetButtons(
       (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(controller_.IsCurrentStateUpdate()
                                     ? IDS_PASSWORD_MANAGER_UPDATE_BUTTON
                                     : IDS_PASSWORD_MANAGER_SAVE_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(
           is_update_bubble_ ? IDS_PASSWORD_MANAGER_CANCEL_BUTTON
diff --git a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
index 101fc03..61ca9d2 100644
--- a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
+++ b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
@@ -392,9 +392,9 @@
       (dialog->controller_.*func)();
     };
 
-    DialogDelegate::set_accept_callback(base::BindOnce(
+    DialogDelegate::SetAcceptCallback(base::BindOnce(
         button_clicked, base::Unretained(this), &Controller::OnSaveClicked));
-    DialogDelegate::set_cancel_callback(base::BindOnce(
+    DialogDelegate::SetCancelCallback(base::BindOnce(
         button_clicked, base::Unretained(this),
         is_update_bubble_ ? &Controller::OnNopeUpdateClicked
                           : &Controller::OnNeverForThisSiteClicked));
@@ -525,14 +525,14 @@
 }
 
 void PasswordSaveUpdateWithAccountStoreView::UpdateDialogButtons() {
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetButtons(
       (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(controller_.IsCurrentStateUpdate()
                                     ? IDS_PASSWORD_MANAGER_UPDATE_BUTTON
                                     : IDS_PASSWORD_MANAGER_SAVE_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(
           is_update_bubble_ ? IDS_PASSWORD_MANAGER_CANCEL_BUTTON
diff --git a/chrome/browser/ui/views/payments/order_summary_view_controller.cc b/chrome/browser/ui/views/payments/order_summary_view_controller.cc
index 7d817fc4eb..2c982b3 100644
--- a/chrome/browser/ui/views/payments/order_summary_view_controller.cc
+++ b/chrome/browser/ui/views/payments/order_summary_view_controller.cc
@@ -143,7 +143,10 @@
 OrderSummaryViewController::CreatePrimaryButton() {
   std::unique_ptr<views::Button> button(
       views::MdTextButton::CreateSecondaryUiBlueButton(
-          this, l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON)));
+          this, state()->selected_app() && state()->selected_app()->type() !=
+                                               PaymentApp::Type::AUTOFILL
+                    ? l10n_util::GetStringUTF16(IDS_PAYMENTS_CONTINUE_BUTTON)
+                    : l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON)));
   button->set_tag(static_cast<int>(PaymentRequestCommonTags::PAY_BUTTON_TAG));
   button->SetID(static_cast<int>(DialogViewID::PAY_BUTTON));
   pay_button_ = button.get();
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
index 55721cf..52794057 100644
--- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
+++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
@@ -50,6 +50,7 @@
 #include "ui/gfx/animation/test_animation_delegate.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/views/controls/button/button.h"
+#include "ui/views/controls/button/md_text_button.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/styled_label.h"
 
@@ -767,6 +768,13 @@
   return button->GetEnabled();
 }
 
+base::string16 PaymentRequestBrowserTestBase::GetPrimaryButtonLabel() const {
+  return static_cast<views::MdTextButton*>(
+             delegate_->dialog_view()->GetViewByID(
+                 static_cast<int>(DialogViewID::PAY_BUTTON)))
+      ->GetText();
+}
+
 void PaymentRequestBrowserTestBase::WaitForAnimation() {
   WaitForAnimation(delegate_->dialog_view());
 }
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
index f951a32..8880d4c 100644
--- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
+++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
@@ -241,6 +241,8 @@
 
   bool IsPayButtonEnabled();
 
+  base::string16 GetPrimaryButtonLabel() const;
+
   // Sets proper animation delegates and waits for animation to finish.
   void WaitForAnimation();
   void WaitForAnimation(PaymentRequestDialogView* dialog_view);
diff --git a/chrome/browser/ui/views/payments/payment_request_dialog_view.cc b/chrome/browser/ui/views/payments/payment_request_dialog_view.cc
index 47ce46a..baed14a 100644
--- a/chrome/browser/ui/views/payments/payment_request_dialog_view.cc
+++ b/chrome/browser/ui/views/payments/payment_request_dialog_view.cc
@@ -63,7 +63,7 @@
     : request_(request), observer_for_testing_(observer) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   request->spec()->AddObserver(this);
   SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
index 84dd5012..89433ad2 100644
--- a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
+++ b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
@@ -862,7 +862,6 @@
 
   // Make sure that the metrics that required the Payment Request to be shown
   // are not logged.
-  histogram_tester.ExpectTotalCount("PaymentRequest.SelectedPaymentMethod", 0);
   histogram_tester.ExpectTotalCount("PaymentRequest.NumberOfSelectionAdds", 0);
   histogram_tester.ExpectTotalCount("PaymentRequest.NumberOfSelectionChanges",
                                     0);
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
index 7f99dc51..399c48b3 100644
--- a/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
+++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller.cc
@@ -369,6 +369,15 @@
   DISALLOW_COPY_AND_ASSIGN(PaymentSheetRowBuilder);
 };
 
+// The primary button should show "Continue" when the selected payment app is
+// non-autofill.
+base::string16 CalculatePrimaryButtonLabel(const PaymentRequestState* state) {
+  return state->selected_app() &&
+                 state->selected_app()->type() != PaymentApp::Type::AUTOFILL
+             ? l10n_util::GetStringUTF16(IDS_PAYMENTS_CONTINUE_BUTTON)
+             : l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON);
+}
+
 }  // namespace
 
 PaymentSheetViewController::PaymentSheetViewController(
@@ -398,7 +407,7 @@
 PaymentSheetViewController::CreatePrimaryButton() {
   std::unique_ptr<views::Button> button(
       views::MdTextButton::CreateSecondaryUiBlueButton(
-          this, l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON)));
+          this, CalculatePrimaryButtonLabel(state())));
   button->set_tag(static_cast<int>(PaymentRequestCommonTags::PAY_BUTTON_TAG));
   button->SetID(static_cast<int>(DialogViewID::PAY_BUTTON));
   button->SetEnabled(state()->is_ready_to_pay());
@@ -575,6 +584,8 @@
 
 void PaymentSheetViewController::UpdatePayButtonState(bool enabled) {
   primary_button()->SetEnabled(enabled);
+  static_cast<views::MdTextButton*>(primary_button())
+      ->SetText(CalculatePrimaryButtonLabel(state()));
 }
 
 // Creates the Order Summary row, which contains an "Order Summary" label,
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
index 338167e..609bfcc 100644
--- a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
@@ -14,6 +14,7 @@
 #include "components/strings/grit/components_strings.h"
 #include "net/dns/mock_host_resolver.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/l10n/l10n_util.h"
 
 namespace payments {
 
@@ -22,7 +23,7 @@
 class PaymentSheetViewControllerNoShippingTest
     : public PaymentRequestBrowserTestBase {
  protected:
-  PaymentSheetViewControllerNoShippingTest() {}
+  PaymentSheetViewControllerNoShippingTest() = default;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(PaymentSheetViewControllerNoShippingTest);
@@ -48,6 +49,11 @@
 
   InvokePaymentRequestUI();
   EXPECT_TRUE(IsPayButtonEnabled());
+
+  // When an autofill payment app is selected the primary button should have
+  // "Pay" label.
+  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_PAYMENTS_PAY_BUTTON),
+            GetPrimaryButtonLabel());
 }
 
 // With only an unsupported card (Amex) in the database, the pay button should
@@ -220,6 +226,11 @@
   // Payment button should be enabled with blank autofill profiles since the
   // payment handler supports shipping delegation.
   EXPECT_TRUE(IsPayButtonEnabled());
+
+  // When a 3rd party payment app is selected the primary button should have
+  // "Continue" label.
+  EXPECT_EQ(l10n_util::GetStringUTF16(IDS_PAYMENTS_CONTINUE_BUTTON),
+            GetPrimaryButtonLabel());
 }
 
 // Payment sheet view skips showing contact section when the selected instrument
diff --git a/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc b/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc
index d84ccde..6c7986a8 100644
--- a/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc
+++ b/chrome/browser/ui/views/permission_bubble/chooser_bubble_ui.cc
@@ -89,9 +89,9 @@
   // | Get help                         |
   // ------------------------------------
 
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    chooser_controller->GetOkButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    chooser_controller->GetCancelButtonLabel());
 
   SetLayoutManager(std::make_unique<views::FillLayout>());
@@ -109,15 +109,15 @@
     if (reason.has_value() && dialog->bubble_reference_)
       dialog->bubble_reference_->CloseBubble(reason.value());
   };
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       closure_callback, base::Unretained(this),
       &DeviceChooserContentView::Accept,
       base::make_optional<BubbleCloseReason>(BUBBLE_CLOSE_ACCEPTED)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       closure_callback, base::Unretained(this),
       &DeviceChooserContentView::Cancel,
       base::make_optional<BubbleCloseReason>(BUBBLE_CLOSE_CANCELED)));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(closure_callback, base::Unretained(this),
                      &DeviceChooserContentView::Close, base::nullopt));
 
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc
index 7085cf1..d27ebe2 100644
--- a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc
+++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc
@@ -47,21 +47,21 @@
   // To prevent permissions being accepted accidentally, and as a security
   // measure against crbug.com/619429, permission prompts should not be accepted
   // as the default action.
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_NONE);
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL, l10n_util::GetStringUTF16(IDS_PERMISSION_DENY));
   set_close_on_deactivate(false);
 
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&permissions::PermissionPrompt::Delegate::Accept,
                      base::Unretained(delegate)));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&permissions::PermissionPrompt::Delegate::Deny,
                      base::Unretained(delegate)));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&permissions::PermissionPrompt::Delegate::Closing,
                      base::Unretained(delegate)));
 
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
index f9b89a2..509315e 100644
--- a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
+++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
@@ -528,14 +528,14 @@
   SetBigImage();
 
   int buttons = GetCurrentDialogButtons();
-  DialogDelegate::set_buttons(buttons);
+  DialogDelegate::SetButtons(buttons);
   if (buttons & ui::DIALOG_BUTTON_OK) {
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_OK,
         GetCurrentDialogButtonLabel(ui::DIALOG_BUTTON_OK));
   }
   if (buttons & ui::DIALOG_BUTTON_CANCEL) {
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_CANCEL,
         GetCurrentDialogButtonLabel(ui::DIALOG_BUTTON_CANCEL));
   }
diff --git a/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc b/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc
index 55b478c..a9695d6 100644
--- a/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc
+++ b/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc
@@ -93,15 +93,15 @@
     EnterpriseStartupDialog::DialogResultCallback callback)
     : callback_(std::move(callback)) {
   DialogDelegate::set_draggable(true);
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   DialogDelegate::SetExtraView(CreateLogoView());
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&EnterpriseStartupDialogView::RunDialogCallback,
                      base::Unretained(this), true));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&EnterpriseStartupDialogView::RunDialogCallback,
                      base::Unretained(this), false));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&EnterpriseStartupDialogView::RunDialogCallback,
                      base::Unretained(this), false));
   SetBorder(views::CreateEmptyBorder(GetDialogInsets()));
@@ -140,7 +140,7 @@
                                 ui::NativeTheme::kColorId_AlertSeverityHigh)));
 
   if (accept_button) {
-    // TODO(ellyjones): This should use DialogDelegate::set_button_label()
+    // TODO(ellyjones): This should use DialogDelegate::SetButtonLabel()
     // instead of changing the button text directly - this might break the
     // dialog's layout.
     GetOkButton()->SetText(*accept_button);
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
index 512c187..8d32bb0f 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -356,7 +356,7 @@
       close_bubble_helper_(this, browser) {
   DCHECK(!g_profile_bubble_);
   g_profile_bubble_ = this;
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   // TODO(tluk): Remove when fixing https://crbug.com/822075
   // The sign in webview will be clipped on the bottom corners without these
   // margins, see related bug <http://crbug.com/593203>.
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
index 5e7d783..c7c981f 100644
--- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
+++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
@@ -90,14 +90,14 @@
     : signin_view_controller_(signin_view_controller),
       browser_(browser),
       reauth_callback_(std::move(reauth_callback)) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&SigninViewControllerFakeReauthDelegateView::OnAccept,
                      base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&SigninViewControllerFakeReauthDelegateView::OnCancel,
                      base::Unretained(this)));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&SigninViewControllerFakeReauthDelegateView::OnClose,
                      base::Unretained(this)));
   DisplayModal();
@@ -278,7 +278,7 @@
   DCHECK(browser_->tab_strip_model()->GetActiveWebContents())
       << "A tab must be active to present the sign-in modal dialog.";
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   web_contents_->SetDelegate(this);
 
diff --git a/chrome/browser/ui/views/profiles/user_manager_view.cc b/chrome/browser/ui/views/profiles/user_manager_view.cc
index 4dcaa4a..a7ea26f 100644
--- a/chrome/browser/ui/views/profiles/user_manager_view.cc
+++ b/chrome/browser/ui/views/profiles/user_manager_view.cc
@@ -67,7 +67,7 @@
     const std::string& email_address,
     const GURL& url)
     : parent_(parent), web_view_(web_view), email_address_(email_address) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DialogDelegate::set_use_custom_frame(false);
 
   AddChildView(web_view_);
@@ -294,7 +294,7 @@
     : web_view_(nullptr),
       delegate_(nullptr),
       user_manager_started_showing_(base::Time()) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DialogDelegate::set_use_custom_frame(false);
   keep_alive_ = std::make_unique<ScopedKeepAlive>(
       KeepAliveOrigin::USER_MANAGER_VIEW, KeepAliveRestartOption::DISABLED);
diff --git a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
index c9eb40e9..004e334f 100644
--- a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
+++ b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
@@ -75,7 +75,7 @@
       controller_(controller) {
   DCHECK(controller);
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 }
 
 QRCodeGeneratorBubble::~QRCodeGeneratorBubble() = default;
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc
index eda986da..fb67525 100644
--- a/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc
+++ b/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc
@@ -145,12 +145,12 @@
           detection_time,
           base::BindRepeating(&RelaunchRecommendedBubbleView::UpdateWindowTitle,
                               base::Unretained(this))) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_RELAUNCH_ACCEPT_BUTTON));
 
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&base::RecordAction,
                      base::UserMetricsAction("RelaunchRecommended_Close")));
 
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc
index 8128a52..e6547079 100644
--- a/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc
+++ b/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc
@@ -112,11 +112,11 @@
           deadline,
           base::BindRepeating(&RelaunchRequiredDialogView::UpdateWindowTitle,
                               base::Unretained(this))) {
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_RELAUNCH_ACCEPT_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_RELAUNCH_REQUIRED_CANCEL_BUTTON));
   SetLayoutManager(std::make_unique<views::FillLayout>());
diff --git a/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc b/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc
index 810113d0..1cb184d 100644
--- a/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog.cc
@@ -35,16 +35,16 @@
     base::OnceClosure cancel_callback,
     base::OnceClosure open_now_callback)
     : open_now_callback_(std::move(open_now_callback)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_DEEP_SCANNING_TIMED_OUT_DIALOG_ACCEPT_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(
           IDS_DEEP_SCANNING_TIMED_OUT_DIALOG_CANCEL_BUTTON));
-  DialogDelegate::set_accept_callback(std::move(accept_callback));
-  DialogDelegate::set_cancel_callback(std::move(cancel_callback));
+  DialogDelegate::SetAcceptCallback(std::move(accept_callback));
+  DialogDelegate::SetCancelCallback(std::move(cancel_callback));
   auto open_now_button = views::MdTextButton::CreateSecondaryUiButton(
       this,
       l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_INFO_DIALOG_OPEN_NOW_BUTTON));
diff --git a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
index 0d14b8e..035f29b 100644
--- a/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog.cc
@@ -155,14 +155,14 @@
   if (password_type.account_type() !=
           ReusedPasswordAccountType::SAVED_PASSWORD ||
       show_check_passwords) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK |
-                                ui::DIALOG_BUTTON_CANCEL);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK |
+                               ui::DIALOG_BUTTON_CANCEL);
   } else {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   }
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
-                                   GetOkButtonLabel(password_type_));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
+                                 GetOkButtonLabel(password_type_));
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_PAGE_INFO_IGNORE_PASSWORD_WARNING_BUTTON));
 
@@ -177,16 +177,15 @@
         },
         base::Unretained(&done_callback_), value);
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       (password_type_.account_type() !=
            ReusedPasswordAccountType::SAVED_PASSWORD ||
        show_check_passwords)
-
           ? make_done_callback(WarningAction::CHANGE_PASSWORD)
           : base::DoNothing());
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       make_done_callback(WarningAction::IGNORE_WARNING));
-  DialogDelegate::set_close_callback(make_done_callback(WarningAction::CLOSE));
+  DialogDelegate::SetCloseCallback(make_done_callback(WarningAction::CLOSE));
 
   // |service| maybe NULL in tests.
   if (service_)
diff --git a/chrome/browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog.cc b/chrome/browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog.cc
index 401dc975..d571840 100644
--- a/chrome/browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog.cc
@@ -42,13 +42,13 @@
     base::OnceClosure open_now_callback)
     : web_contents_(web_contents),
       open_now_callback_(std::move(open_now_callback)) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_INFO_DIALOG_ACCEPT_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_INFO_DIALOG_CANCEL_BUTTON));
-  DialogDelegate::set_accept_callback(std::move(accept_callback));
+  DialogDelegate::SetAcceptCallback(std::move(accept_callback));
   auto open_now_button = views::MdTextButton::CreateSecondaryUiButton(
       this,
       l10n_util::GetStringUTF16(IDS_DEEP_SCANNING_INFO_DIALOG_OPEN_NOW_BUTTON));
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc
index a804823..49f1ccc7 100644
--- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc
@@ -42,7 +42,7 @@
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       web_contents_(web_contents),
       controller_(controller) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DCHECK(controller);
 }
 
diff --git a/chrome/browser/ui/views/session_crashed_bubble_view.cc b/chrome/browser/ui/views/session_crashed_bubble_view.cc
index d520b7e..0a642e9d 100644
--- a/chrome/browser/ui/views/session_crashed_bubble_view.cc
+++ b/chrome/browser/ui/views/session_crashed_bubble_view.cc
@@ -185,22 +185,22 @@
       SessionStartupPref::GetStartupPref(browser_->profile());
   // Offer the option to open the startup pages using the cancel button, but
   // only when the user has selected the URLS option, and set at least one url.
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetButtons(
       (session_startup_pref.type == SessionStartupPref::URLS &&
        !session_startup_pref.urls.empty())
           ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL
           : ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_RESTORE_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_STARTUP_PAGES_BUTTON));
 
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&SessionCrashedBubbleView::RestorePreviousSession,
                      base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &SessionCrashedBubbleView::OpenStartupPages, base::Unretained(this)));
 
   set_close_on_deactivate(false);
diff --git a/chrome/browser/ui/views/settings_reset_prompt_dialog.cc b/chrome/browser/ui/views/settings_reset_prompt_dialog.cc
index 76047ba..f0be6b0 100644
--- a/chrome/browser/ui/views/settings_reset_prompt_dialog.cc
+++ b/chrome/browser/ui/views/settings_reset_prompt_dialog.cc
@@ -39,16 +39,16 @@
     : browser_(nullptr), controller_(controller) {
   DCHECK(controller_);
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_SETTINGS_RESET_PROMPT_ACCEPT_BUTTON_LABEL));
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&safe_browsing::SettingsResetPromptController::Accept,
                      base::Unretained(controller_)));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&safe_browsing::SettingsResetPromptController::Cancel,
                      base::Unretained(controller_)));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&safe_browsing::SettingsResetPromptController::Close,
                      base::Unretained(controller_)));
 
diff --git a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc
index d42c3bc..c184f97 100644
--- a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc
+++ b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc
@@ -180,7 +180,7 @@
                                      SharingDialogData data)
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       data_(std::move(data)) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DialogDelegate::SetFootnoteView(
       CreateHelpOrOriginView(data_, web_contents, this));
   set_close_on_main_frame_origin_navigation(true);
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
index 6f39790..27e14ce5 100644
--- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
+++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
@@ -59,12 +59,12 @@
     set_parent_window(
         platform_util::GetViewForWindow(browser->window()->GetNativeWindow()));
   }
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_SETTINGS_STORAGE_PRESSURE_BUBBLE_VIEW_BUTTON_LABEL));
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &StoragePressureBubbleView::OnDialogAccepted, base::Unretained(this)));
 }
 
diff --git a/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc b/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc
index 37a3411..923b08d 100644
--- a/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc
+++ b/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc
@@ -126,10 +126,10 @@
   advanced_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   DialogDelegate::SetExtraView(std::move(advanced_link));
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_OK_BUTTON));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_ONE_CLICK_SIGNIN_DIALOG_UNDO_BUTTON));
 
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
index 18f1239..a8f34f7 100644
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
+++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
@@ -52,13 +52,13 @@
       username_(username),
       delegate_(std::move(delegate)),
       prompt_for_new_profile_(prompt_for_new_profile) {
-  DialogDelegate::set_default_button(ui::DIALOG_BUTTON_NONE);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetDefaultButton(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(prompt_for_new_profile_
                                     ? IDS_ENTERPRISE_SIGNIN_CREATE_NEW_PROFILE
                                     : IDS_ENTERPRISE_SIGNIN_CONTINUE));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(IDS_ENTERPRISE_SIGNIN_CANCEL));
 
@@ -76,11 +76,11 @@
       dialog->delegate_.reset();
     }
   };
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(notify_delegate, base::Unretained(this),
                      prompt_for_new_profile_ ? &Delegate::OnSigninWithNewProfile
                                              : &Delegate::OnContinueSignin));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       notify_delegate, base::Unretained(this), &Delegate::OnCancelSignin));
 
   chrome::RecordDialogCreation(
diff --git a/chrome/browser/ui/views/tab_modal_confirm_dialog_views.cc b/chrome/browser/ui/views/tab_modal_confirm_dialog_views.cc
index bfbc92a8..8350d07f 100644
--- a/chrome/browser/ui/views/tab_modal_confirm_dialog_views.cc
+++ b/chrome/browser/ui/views/tab_modal_confirm_dialog_views.cc
@@ -32,25 +32,25 @@
     std::unique_ptr<TabModalConfirmDialogDelegate> delegate,
     content::WebContents* web_contents)
     : delegate_(std::move(delegate)) {
-  DialogDelegate::set_buttons(delegate_->GetDialogButtons());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtons(delegate_->GetDialogButtons());
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    delegate_->GetAcceptButtonTitle());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    delegate_->GetCancelButtonTitle());
 
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&TabModalConfirmDialogDelegate::Accept,
                      base::Unretained(delegate_.get())));
-  DialogDelegate::set_cancel_callback(
+  DialogDelegate::SetCancelCallback(
       base::BindOnce(&TabModalConfirmDialogDelegate::Cancel,
                      base::Unretained(delegate_.get())));
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&TabModalConfirmDialogDelegate::Close,
                      base::Unretained(delegate_.get())));
 
   base::Optional<int> default_button = delegate_->GetDefaultDialogButton();
   if (bool(default_button))
-    DialogDelegate::set_default_button(*default_button);
+    DialogDelegate::SetDefaultButton(*default_button);
 
   views::MessageBoxView::InitParams init_params(delegate_->GetDialogMessage());
   init_params.inter_row_vertical_spacing =
diff --git a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
index 730b137..46cde38 100644
--- a/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
+++ b/chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.cc
@@ -101,7 +101,7 @@
 
   set_margins(gfx::Insets());
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   const base::string16 title = browser_->tab_strip_model()
                                    ->group_model()
@@ -109,7 +109,7 @@
                                    ->visual_data()
                                    ->title();
   title_at_opening_ = title;
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       &TabGroupEditorBubbleView::OnBubbleClose, base::Unretained(this)));
 
   const auto* layout_provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
index 58cdc33..697dbbc 100644
--- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
+++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
@@ -386,7 +386,7 @@
 
 TabHoverCardBubbleView::TabHoverCardBubbleView(Tab* tab)
     : BubbleDialogDelegateView(tab, views::BubbleBorder::TOP_LEFT) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   // We'll do all of our own layout inside the bubble, so no need to inset this
   // view inside the client view.
diff --git a/chrome/browser/ui/views/task_manager_view.cc b/chrome/browser/ui/views/task_manager_view.cc
index 3e87569..3265a36 100644
--- a/chrome/browser/ui/views/task_manager_view.cc
+++ b/chrome/browser/ui/views/task_manager_view.cc
@@ -286,15 +286,15 @@
       tab_table_parent_(nullptr),
       is_always_on_top_(false) {
   DialogDelegate::set_use_custom_frame(false);
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_TASK_MANAGER_KILL));
 
   // Avoid calling Accept() when closing the dialog, since Accept() here means
   // "kill task" (!).
   // TODO(ellyjones): Remove this once the Accept() override is removed from
   // this class.
-  DialogDelegate::set_close_callback(base::DoNothing());
+  DialogDelegate::SetCloseCallback(base::DoNothing());
 
   Init();
   chrome::RecordDialogCreation(chrome::DialogIdentifier::TASK_MANAGER);
diff --git a/chrome/browser/ui/views/toolbar/home_button.cc b/chrome/browser/ui/views/toolbar/home_button.cc
index 37d484e..d1bca14 100644
--- a/chrome/browser/ui/views/toolbar/home_button.cc
+++ b/chrome/browser/ui/views/toolbar/home_button.cc
@@ -88,7 +88,7 @@
       browser_(browser),
       undo_value_is_ntp_(undo_value_is_ntp),
       undo_url_(undo_url) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   set_margins(
       ChromeLayoutProvider::Get()->GetInsetsMetric(views::INSETS_DIALOG));
   chrome::RecordDialogCreation(chrome::DialogIdentifier::HOME_PAGE_UNDO);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc
index 93fcba05..fef5619f 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc
@@ -41,20 +41,20 @@
     buttons |= ui::DIALOG_BUTTON_OK;
   if (!cancel_text.empty())
     buttons |= ui::DIALOG_BUTTON_CANCEL;
-  DialogDelegate::set_buttons(buttons);
-  DialogDelegate::set_default_button(delegate_->GetDefaultDialogButton());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, ok_text);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, cancel_text);
+  DialogDelegate::SetButtons(buttons);
+  DialogDelegate::SetDefaultButton(delegate_->GetDefaultDialogButton());
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, ok_text);
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, cancel_text);
   DialogDelegate::SetExtraView(CreateExtraInfoView());
 
-  DialogDelegate::set_accept_callback(base::BindOnce(
+  DialogDelegate::SetAcceptCallback(base::BindOnce(
       &ToolbarActionsBarBubbleViews::NotifyDelegateOfClose,
       base::Unretained(this), ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &ToolbarActionsBarBubbleViews::NotifyDelegateOfClose,
       base::Unretained(this),
       ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION));
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       &ToolbarActionsBarBubbleViews::NotifyDelegateOfClose,
       base::Unretained(this),
       ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_DEACTIVATION));
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc
index 7e59e10..7df689a 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -654,7 +654,7 @@
   if (web_contents)  // web_contents can be null in unit_tests.
     mouse_handler_ =
         std::make_unique<WebContentMouseHandler>(this, web_contents);
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   DialogDelegate::SetFootnoteView(CreateWordmarkView(bubble_ui_model_));
   chrome::RecordDialogCreation(chrome::DialogIdentifier::TRANSLATE);
 }
diff --git a/chrome/browser/ui/views/uninstall_view.cc b/chrome/browser/ui/views/uninstall_view.cc
index 468a1886..d1a730e 100644
--- a/chrome/browser/ui/views/uninstall_view.cc
+++ b/chrome/browser/ui/views/uninstall_view.cc
@@ -28,14 +28,14 @@
       browsers_combo_(NULL),
       user_selection_(*user_selection),
       quit_closure_(quit_closure) {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_UNINSTALL_BUTTON_TEXT));
-  DialogDelegate::set_accept_callback(
+  DialogDelegate::SetAcceptCallback(
       base::BindOnce(&UninstallView::OnDialogAccepted, base::Unretained(this)));
-  DialogDelegate::set_cancel_callback(base::BindOnce(
+  DialogDelegate::SetCancelCallback(base::BindOnce(
       &UninstallView::OnDialogCancelled, base::Unretained(this)));
-  DialogDelegate::set_close_callback(base::BindOnce(
+  DialogDelegate::SetCloseCallback(base::BindOnce(
       &UninstallView::OnDialogCancelled, base::Unretained(this)));
   set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
       views::TEXT, views::TEXT));
diff --git a/chrome/browser/ui/views/update_recommended_message_box.cc b/chrome/browser/ui/views/update_recommended_message_box.cc
index 79fe5720..06e78fb 100644
--- a/chrome/browser/ui/views/update_recommended_message_box.cc
+++ b/chrome/browser/ui/views/update_recommended_message_box.cc
@@ -35,9 +35,9 @@
 // UpdateRecommendedMessageBox, private:
 
 UpdateRecommendedMessageBox::UpdateRecommendedMessageBox() {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK, l10n_util::GetStringUTF16(IDS_RELAUNCH_AND_UPDATE));
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    l10n_util::GetStringUTF16(IDS_NOT_NOW));
   base::string16 update_message;
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc
index fd7ec909..0948d4d8 100644
--- a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc
+++ b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc
@@ -86,7 +86,7 @@
       web_app_info_(std::move(web_app_info)),
       callback_(std::move(callback)) {
   DCHECK(web_app_info_);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_INSTALL_PWA_BUTTON_LABEL));
   base::TrimWhitespace(web_app_info_->title, base::TRIM_ALL,
diff --git a/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc b/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc
index 9c5b04a..b9b280a 100644
--- a/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc
@@ -44,7 +44,7 @@
     chrome::AppInstallationAcceptanceCallback callback)
     : web_app_info_(std::move(web_app_info)), callback_(std::move(callback)) {
   DCHECK(web_app_info_);
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_BUTTON_LABEL));
   const ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get();
diff --git a/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc b/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc
index 3627ba1..b3b7e58 100644
--- a/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc
@@ -65,7 +65,7 @@
       std::make_unique<WebAppInfoImageSource>(kIconSizeInDip, icon_bitmaps),
       image_size);
 
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON));
 
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
index 804d99d4..803e84e 100644
--- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
+++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
@@ -73,7 +73,7 @@
   DCHECK(!model_->should_dialog_be_closed());
   model_->AddObserver(this);
 
-  DialogDelegate::set_close_callback(
+  DialogDelegate::SetCloseCallback(
       base::BindOnce(&AuthenticatorRequestDialogView::OnDialogClosing,
                      base::Unretained(this)));
 
@@ -313,13 +313,13 @@
     buttons |= ui::DIALOG_BUTTON_OK;
   if (sheet()->model()->IsCancelButtonVisible())
     buttons |= ui::DIALOG_BUTTON_CANCEL;
-  DialogDelegate::set_buttons(buttons);
-  DialogDelegate::set_default_button((buttons & ui::DIALOG_BUTTON_OK)
+  DialogDelegate::SetButtons(buttons);
+  DialogDelegate::SetDefaultButton((buttons & ui::DIALOG_BUTTON_OK)
                                          ? ui::DIALOG_BUTTON_OK
                                          : ui::DIALOG_BUTTON_NONE);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                    sheet_->model()->GetAcceptButtonLabel());
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                    sheet_->model()->GetCancelButtonLabel());
 
   // Whether to show the `Choose another option` button, or other dialog
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc b/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
index 77abe22e..ff42bc9e 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/confirm_signout_dialog.cc
@@ -29,11 +29,11 @@
 }  // namespace
 
 ConfirmSignoutDialog::ConfirmSignoutDialog() {
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_OK,
       l10n_util::GetStringUTF16(
           IDS_ADD_SUPERVISION_EXIT_DIALOG_SIGNOUT_BUTTON_LABEL));
-  DialogDelegate::set_button_label(
+  DialogDelegate::SetButtonLabel(
       ui::DIALOG_BUTTON_CANCEL,
       l10n_util::GetStringUTF16(
           IDS_ADD_SUPERVISION_EXIT_DIALOG_CANCEL_BUTTON_LABEL));
diff --git a/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc b/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
index 3509b31..5889a94 100644
--- a/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
@@ -332,7 +332,7 @@
   VerifyDisplayString(
       event,
       "Updates are managed by <a target=\"_blank\" "
-      "href=\"https://support.google.com/accounts/answer/6208960\">your "
+      "href=\"https://support.google.com/chrome?p=your_administrator\">your "
       "administrator</a>");
 }
 
@@ -360,9 +360,8 @@
   VerifyDisplayString(
       event,
       "Browser didn't update, something went wrong. <a target=\"_blank\" "
-      "href=\"https://support.google.com/chrome/answer/111996\">Fix "
-      "Browser "
-      "update problems and failed updates.</a>");
+      "href=\"https://support.google.com/chrome?p=fix_chrome_updates\">Fix "
+      "Browser update problems and failed updates.</a>");
 }
 
 TEST_F(SafetyCheckHandlerTest, CheckSafeBrowsing_Enabled) {
@@ -410,7 +409,7 @@
   VerifyDisplayString(
       event,
       "<a target=\"_blank\" "
-      "href=\"https://support.google.com/accounts/answer/6208960\">Your "
+      "href=\"https://support.google.com/chrome?p=your_administrator\">Your "
       "administrator</a> has turned off Safe Browsing");
 }
 
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index ff2d9382..413a9b42 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -35,11 +35,8 @@
 const char kChromeBetaForumURL[] =
     "https://support.google.com/chrome/?p=beta_forum";
 
-// TODO(https://crbug.com/1015841): Replace answer number with p-link once the
-// p-link has been created.
-// https://bugs.chromium.org/p/chromium/issues/detail?id=679462
 const char kChromeFixUpdateProblems[] =
-    "https://support.google.com/chrome/answer/111996";
+    "https://support.google.com/chrome?p=fix_chrome_updates";
 
 // TODO: replace w/link after marketing provides it.
 const char kChromeReleaseNotesURL[] =
@@ -273,11 +270,8 @@
     "https://support.google.com/installer/?product="
     "{8A69D345-D564-463c-AFF1-A69D9E530F96}&error=";
 
-// TODO(https://crbug.com/1015841): Replace answer number with p-link once the
-// p-link has been created.
-// https://bugs.chromium.org/p/chromium/issues/detail?id=679462
 const char kWhoIsMyAdministratorHelpURL[] =
-    "https://support.google.com/accounts/answer/6208960";
+    "https://support.google.com/chrome?p=your_administrator";
 
 #if defined(OS_ANDROID)
 const char kAndroidAppScheme[] = "android-app";
diff --git a/chrome/test/data/page_load_metrics/blank_with_positioned_iframe_writer.html b/chrome/test/data/page_load_metrics/blank_with_positioned_iframe_writer.html
new file mode 100644
index 0000000..164e289
--- /dev/null
+++ b/chrome/test/data/page_load_metrics/blank_with_positioned_iframe_writer.html
@@ -0,0 +1,27 @@
+<html>
+<body>
+<script>
+// Creates an iframe element with an absolute x and y position and dimensions
+// width and height. The iframe element is appended to the body element.
+// Make sure the caller has a body element!
+function createIframeAtRect(frame_id, x, y, width, height) {
+    let frame = document.createElement('iframe');
+    frame.id = frame_id;
+    frame.style.border = "0px none transparent";
+    frame.style.overflow = "hidden";
+    frame.style.position = "absolute";
+    frame.style.left = x;
+    frame.style.top = y;
+    frame.scrolling = "no";
+    frame.frameborder="0";
+    frame.allowTransparency="true";
+    frame.width = width;
+    frame.height = height;
+    document.body.appendChild(frame);
+    return frame;
+}
+</script>
+</body>
+</html>
+
+
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index f5f9d19..7790f98 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -62,7 +62,7 @@
   ]),
 };
 
-TEST_F('CrSettingsCheckboxTest', 'All', function() {
+TEST_F('CrSettingsCheckboxTest', 'DISABLED_All', function() {
   mocha.run();
 });
 
@@ -394,7 +394,7 @@
   ]),
 };
 
-TEST_F('CrSettingsPasswordsCheckTest', 'All', function() {
+TEST_F('CrSettingsPasswordsCheckTest', 'DISABLED_All', function() {
   mocha.run();
 });
 
@@ -1643,7 +1643,7 @@
   ]),
 };
 
-TEST_F('CrSettingsSiteDataTest', 'All', function() {
+TEST_F('CrSettingsSiteDataTest', 'DISABLED_All', function() {
   mocha.run();
 });
 
diff --git a/chrome/test/payments/payment_request_test_controller_desktop.cc b/chrome/test/payments/payment_request_test_controller_desktop.cc
index cfdf351..cfee9fe0f 100644
--- a/chrome/test/payments/payment_request_test_controller_desktop.cc
+++ b/chrome/test/payments/payment_request_test_controller_desktop.cc
@@ -127,9 +127,9 @@
         PaymentRequestWebContentsManager* manager =
             PaymentRequestWebContentsManager::GetOrCreateForWebContents(
                 web_contents);
-        manager->CreatePaymentRequest(web_contents->GetMainFrame(),
-                                      web_contents, std::move(delegate),
-                                      std::move(receiver), observer_for_test);
+        manager->CreatePaymentRequest(render_frame_host, web_contents,
+                                      std::move(delegate), std::move(receiver),
+                                      observer_for_test);
       },
       observer_converter_.get(), is_incognito_, valid_ssl_, prefs_.get()));
 }
diff --git a/chrome/updater/app/app_update_all.cc b/chrome/updater/app/app_update_all.cc
index 389895168..22aac99 100644
--- a/chrome/updater/app/app_update_all.cc
+++ b/chrome/updater/app/app_update_all.cc
@@ -25,6 +25,7 @@
   void Initialize() override;
 
   scoped_refptr<Configurator> config_;
+  std::unique_ptr<UpdateService> update_service_;
 };
 
 void AppUpdateAll::Initialize() {
@@ -33,9 +34,12 @@
 
 // AppUpdateAll triggers an update of all registered applications.
 void AppUpdateAll::FirstTaskRun() {
-  CreateUpdateService(config_)->UpdateAll(base::BindOnce(
+  update_service_ = CreateUpdateService(config_);
+  update_service_->UpdateAll(base::BindOnce(
       [](base::OnceCallback<void(int)> quit, update_client::Error error) {
-        VLOG(0) << "UpdateAll complete: error = " << static_cast<int>(error);
+        const int err = static_cast<int>(error);
+        VLOG(0) << "UpdateAll complete: error = " << err << "/0x" << std::hex
+                << err;
         std::move(quit).Run(static_cast<int>(error));
       },
       base::BindOnce(&AppUpdateAll::Shutdown, this)));
diff --git a/chrome/updater/update_apps_win.cc b/chrome/updater/update_apps_win.cc
index 355b133..2a28990 100644
--- a/chrome/updater/update_apps_win.cc
+++ b/chrome/updater/update_apps_win.cc
@@ -17,7 +17,7 @@
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSingleProcessSwitch))
     return std::make_unique<UpdateServiceInProcess>(config);
   else
-    return std::make_unique<UpdateServiceOutOfProcess>();
+    return UpdateServiceOutOfProcess::CreateInstance();
 }
 
 }  // namespace updater
diff --git a/chrome/updater/update_service.h b/chrome/updater/update_service.h
index 4074227..f8455ef 100644
--- a/chrome/updater/update_service.h
+++ b/chrome/updater/update_service.h
@@ -21,7 +21,8 @@
 // All functions and callbacks must be called on the same sequence.
 class UpdateService {
  public:
-  typedef update_client::Error Result;
+  using Result = update_client::Error;
+
   // Possible states for updating an app.
   enum class UpdateState {
     // This value represents the absence of a state. No update request has
diff --git a/chrome/updater/win/update_service_out_of_process.cc b/chrome/updater/win/update_service_out_of_process.cc
index 82df517..e8f25e1 100644
--- a/chrome/updater/win/update_service_out_of_process.cc
+++ b/chrome/updater/win/update_service_out_of_process.cc
@@ -4,8 +4,26 @@
 
 #include "chrome/updater/win/update_service_out_of_process.h"
 
+#include <windows.h>
+#include <wrl/client.h>
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
 #include "base/callback.h"
 #include "base/logging.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
+#include "chrome/updater/server/win/updater_idl.h"
+
+namespace {
+
+static constexpr base::TaskTraits kComClientTraits = {
+    base::TaskPriority::BEST_EFFORT,
+    base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN};
+
+}  // namespace
 
 namespace updater {
 
@@ -15,6 +33,17 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
+std::unique_ptr<UpdateServiceOutOfProcess>
+UpdateServiceOutOfProcess::CreateInstance() {
+  struct Creator : public UpdateServiceOutOfProcess {};
+  auto instance = std::make_unique<Creator>();
+  instance->com_task_runner_ =
+      base::ThreadPool::CreateCOMSTATaskRunner(kComClientTraits);
+  if (!instance->com_task_runner_)
+    return nullptr;
+  return instance;
+}
+
 void UpdateServiceOutOfProcess::RegisterApp(
     const RegistrationRequest& request,
     base::OnceCallback<void(const RegistrationResponse&)> callback) {
@@ -31,7 +60,9 @@
 
   // TODO(sorin) the updater must be run with "--single-process" until
   // crbug.com/1053729 is resolved.
-  NOTREACHED();
+  com_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&UpdateServiceOutOfProcess::UpdateAllOnSTA,
+                                base::Unretained(this), std::move(callback)));
 }
 
 void UpdateServiceOutOfProcess::Update(const std::string& app_id,
@@ -45,4 +76,33 @@
   NOTREACHED();
 }
 
+void UpdateServiceOutOfProcess::UpdateAllOnSTA(
+    base::OnceCallback<void(Result)> callback) {
+  DCHECK(com_task_runner_->BelongsToCurrentThread());
+
+  Microsoft::WRL::ComPtr<IUnknown> server;
+  HRESULT hr = ::CoCreateInstance(CLSID_UpdaterClass, nullptr,
+                                  CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&server));
+  if (FAILED(hr)) {
+    VLOG(2) << "Failed to instantiate the update server. " << std::hex << hr;
+    std::move(callback).Run(static_cast<Result>(hr));
+    return;
+  }
+
+  Microsoft::WRL::ComPtr<IUpdater> updater;
+  hr = server.As(&updater);
+  if (FAILED(hr)) {
+    VLOG(2) << "Failed to query the updater interface. " << std::hex << hr;
+    std::move(callback).Run(static_cast<Result>(hr));
+    return;
+  }
+
+  hr = updater->UpdateAll();
+  if (FAILED(hr)) {
+    VLOG(2) << "Failed to call IUpdater::UpdateAll" << std::hex << hr;
+    std::move(callback).Run(static_cast<Result>(hr));
+    return;
+  }
+}
+
 }  // namespace updater
diff --git a/chrome/updater/win/update_service_out_of_process.h b/chrome/updater/win/update_service_out_of_process.h
index e0256810..2287316 100644
--- a/chrome/updater/win/update_service_out_of_process.h
+++ b/chrome/updater/win/update_service_out_of_process.h
@@ -5,12 +5,18 @@
 #ifndef CHROME_UPDATER_WIN_UPDATE_SERVICE_OUT_OF_PROCESS_H_
 #define CHROME_UPDATER_WIN_UPDATE_SERVICE_OUT_OF_PROCESS_H_
 
+#include <memory>
 #include <string>
 
 #include "base/callback_forward.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/sequence_checker.h"
 #include "chrome/updater/update_service.h"
 
+namespace base {
+class SingleThreadTaskRunner;
+}  // namespace base
+
 namespace update_client {
 enum class Error;
 }  // namespace update_client
@@ -23,12 +29,13 @@
 // All functions and callbacks must be called on the same sequence.
 class UpdateServiceOutOfProcess : public UpdateService {
  public:
-  UpdateServiceOutOfProcess();
   UpdateServiceOutOfProcess(const UpdateServiceOutOfProcess&) = delete;
   UpdateServiceOutOfProcess& operator=(const UpdateServiceOutOfProcess&) =
       delete;
   ~UpdateServiceOutOfProcess() override;
 
+  static std::unique_ptr<UpdateServiceOutOfProcess> CreateInstance();
+
   // Overrides for updater::UpdateService.
   // Update-checks all registered applications. Calls |callback| once the
   // operation is complete.
@@ -42,7 +49,12 @@
               base::OnceCallback<void(Result)> done) override;
 
  private:
+  UpdateServiceOutOfProcess();
+  void UpdateAllOnSTA(base::OnceCallback<void(Result)> callback);
+
   SEQUENCE_CHECKER(sequence_checker_);
+
+  scoped_refptr<base::SingleThreadTaskRunner> com_task_runner_;
 };
 
 }  // namespace updater
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index e82f8f2a..c7112ef 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-12972.0.0
\ No newline at end of file
+12973.0.0
\ No newline at end of file
diff --git a/chromeos/components/print_management/resources/BUILD.gn b/chromeos/components/print_management/resources/BUILD.gn
index fba0ab3..993c3b7 100644
--- a/chromeos/components/print_management/resources/BUILD.gn
+++ b/chromeos/components/print_management/resources/BUILD.gn
@@ -31,7 +31,7 @@
 }
 
 group("polymer3_elements") {
-  deps = [
+  public_deps = [
     ":print_management_module",
     ":scanning_ui_module",
   ]
diff --git a/chromeos/profiles/airmont.afdo.newest.txt b/chromeos/profiles/airmont.afdo.newest.txt
index 1ca1e9c..d54acddd 100644
--- a/chromeos/profiles/airmont.afdo.newest.txt
+++ b/chromeos/profiles/airmont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-airmont-82-4072.0-1583751487-benchmark-82.0.4081.0-r1-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-airmont-82-4072.0-1583751487-benchmark-82.0.4082.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/chromeos/resources/BUILD.gn b/chromeos/resources/BUILD.gn
index 335a928..823bd74 100644
--- a/chromeos/resources/BUILD.gn
+++ b/chromeos/resources/BUILD.gn
@@ -138,8 +138,6 @@
   source =
       "../components/print_management/resources/print_management_resources.grd"
 
-  source_is_generated = true
-
   deps = [ "../components/print_management/resources:polymer3_elements" ]
 
   outputs = [
diff --git a/chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler_unittest.cc b/chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler_unittest.cc
index 1ae0474..17f8578 100644
--- a/chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler_unittest.cc
+++ b/chromeos/services/multidevice_setup/grandfathered_easy_unlock_host_disabler_unittest.cc
@@ -85,7 +85,8 @@
     for (const auto& remote_device : test_devices_) {
       bool should_be_host =
           host_device != base::nullopt &&
-          host_device->GetDeviceId() == remote_device.GetDeviceId();
+          host_device->GetDeviceId() == remote_device.GetDeviceId() &&
+          host_device->instance_id() == remote_device.instance_id();
 
       GetMutableRemoteDevice(remote_device)->software_features[host_type] =
           should_be_host ? multidevice::SoftwareFeatureState::kEnabled
diff --git a/components/autofill/core/common/signatures_util.cc b/components/autofill/core/common/signatures_util.cc
index cf342fa1..3d6a98df 100644
--- a/components/autofill/core/common/signatures_util.cc
+++ b/components/autofill/core/common/signatures_util.cc
@@ -9,18 +9,21 @@
 #include "base/hash/sha1.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
 #include "components/autofill/core/common/autofill_util.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/form_field_data.h"
 #include "url/gurl.h"
 
+using base::UTF16ToUTF8;
+
 namespace autofill {
 
 namespace {
 
 // Returns a copy of |input| without >= 5 consecutive digits.
 std::string StripDigitsIfRequired(const base::string16& input) {
-  std::string input_utf8 = base::UTF16ToUTF8(input);
+  std::string input_utf8 = UTF16ToUTF8(input);
   std::string result;
   result.reserve(input_utf8.length());
 
@@ -43,6 +46,19 @@
 
 }  // namespace
 
+// If a form name was set by Chrome, we should ignore it when calculating
+// the form signature.
+std::string GetDOMFormName(const std::string& form_name) {
+#if defined(OS_IOS)
+  // In case of an empty form name, the synthetic name is created. Ignore it.
+  return (StartsWith(form_name, "gChrome~form~", base::CompareCase::SENSITIVE)
+              ? std::string()
+              : form_name);
+#else
+  return form_name;
+#endif
+}
+
 FormSignature CalculateFormSignature(const FormData& form_data) {
   const GURL& target_url = form_data.action;
   const GURL& source_url = form_data.url;
@@ -67,9 +83,9 @@
     }
   }
 
-  std::string form_string = scheme + "://" + host + "&" +
-                            base::UTF16ToUTF8(form_data.name) +
-                            form_signature_field_names;
+  std::string form_name = GetDOMFormName(UTF16ToUTF8(form_data.name));
+  std::string form_string =
+      scheme + "://" + host + "&" + form_name + form_signature_field_names;
 
   return StrToHash64Bit(form_string);
 }
@@ -77,7 +93,7 @@
 FieldSignature CalculateFieldSignatureByNameAndType(
     const base::string16& field_name,
     const std::string& field_type) {
-  std::string name = base::UTF16ToUTF8(field_name);
+  std::string name = UTF16ToUTF8(field_name);
   std::string field_string = name + "&" + field_type;
   return StrToHash32Bit(field_string);
 }
diff --git a/components/autofill_assistant/browser/actions/prompt_action.cc b/components/autofill_assistant/browser/actions/prompt_action.cc
index 23890eb6..7d64511 100644
--- a/components/autofill_assistant/browser/actions/prompt_action.cc
+++ b/components/autofill_assistant/browser/actions/prompt_action.cc
@@ -135,6 +135,7 @@
   for (int i = 0; i < proto_.prompt().choices_size(); i++) {
     auto& choice_proto = proto_.prompt().choices(i);
     UserAction user_action(choice_proto.chip(), choice_proto.direct_action(),
+                           /* enabled = */ true,
                            /* identifier = */ std::string());
     if (!user_action.has_triggers())
       continue;
diff --git a/components/autofill_assistant/browser/actions/show_form_action.cc b/components/autofill_assistant/browser/actions/show_form_action.cc
index ce8391e..ca6897ea 100644
--- a/components/autofill_assistant/browser/actions/show_form_action.cc
+++ b/components/autofill_assistant/browser/actions/show_form_action.cc
@@ -48,7 +48,7 @@
   // Show "Continue" chip.
   UserAction user_action =
       UserAction(proto_.show_form().chip(), proto_.show_form().direct_action(),
-                 /* identifier = */ std::string());
+                 /* enabled = */ true, /* identifier = */ std::string());
   if (user_action.chip().empty()) {
     user_action.chip().text =
         l10n_util::GetStringUTF8(IDS_AUTOFILL_ASSISTANT_PAYMENT_INFO_CONFIRM);
diff --git a/components/autofill_assistant/browser/basic_interactions.cc b/components/autofill_assistant/browser/basic_interactions.cc
index d2a25808..4f737d55f 100644
--- a/components/autofill_assistant/browser/basic_interactions.cc
+++ b/components/autofill_assistant/browser/basic_interactions.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "components/autofill_assistant/browser/basic_interactions.h"
+#include <algorithm>
 #include "base/bind_helpers.h"
 #include "base/i18n/time_formatting.h"
 #include "base/strings/string_number_conversions.h"
@@ -361,6 +362,59 @@
   return true;
 }
 
+bool BasicInteractions::ToggleUserAction(const ToggleUserActionProto& proto) {
+  auto user_actions_value = delegate_->GetUserModel()->GetValue(
+      proto.user_actions_model_identifier());
+  if (!user_actions_value.has_value()) {
+    DVLOG(2) << "Error evaluating " << __func__ << ": "
+             << proto.user_actions_model_identifier() << " not found in model";
+    return false;
+  }
+  if (!user_actions_value->has_user_actions()) {
+    DVLOG(2) << "Error evaluating " << __func__
+             << ": expected user_actions_model_identifier to contain user "
+                "actions, but was "
+             << *user_actions_value;
+    return false;
+  }
+
+  auto enabled_value =
+      delegate_->GetUserModel()->GetValue(proto.enabled_model_identifier());
+  if (!enabled_value.has_value()) {
+    DVLOG(2) << "Error evaluating " << __func__ << ": "
+             << proto.enabled_model_identifier() << " not found in model";
+    return false;
+  }
+  if (enabled_value->booleans().values_size() != 1) {
+    DVLOG(2) << "Error evaluating " << __func__
+             << ": expected enabled_model_identifier to contain a single bool, "
+                "but was "
+             << *enabled_value;
+    return false;
+  }
+
+  auto user_action_it = std::find_if(
+      user_actions_value->user_actions().values().cbegin(),
+      user_actions_value->user_actions().values().cend(),
+      [&](const UserActionProto& user_action) {
+        return user_action.identifier() == proto.user_action_identifier();
+      });
+  if (user_action_it == user_actions_value->user_actions().values().cend()) {
+    DVLOG(2) << "Error evaluating " << __func__ << ": "
+             << proto.user_action_identifier() << " not found in "
+             << *user_actions_value;
+    return false;
+  }
+  auto user_action_index =
+      user_action_it - user_actions_value->user_actions().values().cbegin();
+  user_actions_value->mutable_user_actions()
+      ->mutable_values(user_action_index)
+      ->set_enabled(enabled_value->booleans().values(0));
+  delegate_->GetUserModel()->SetValue(proto.user_actions_model_identifier(),
+                                      *user_actions_value);
+  return true;
+}
+
 bool BasicInteractions::EndAction(const EndActionProto& proto) {
   CHECK(end_action_callback_) << "Failed to EndAction: no callback set";
   std::move(end_action_callback_)
diff --git a/components/autofill_assistant/browser/basic_interactions.h b/components/autofill_assistant/browser/basic_interactions.h
index d4e73bc..d9354ed 100644
--- a/components/autofill_assistant/browser/basic_interactions.h
+++ b/components/autofill_assistant/browser/basic_interactions.h
@@ -39,6 +39,9 @@
   // true on success, false on error.
   bool SetUserActions(const SetUserActionsProto& proto);
 
+  // Enables or disables a user action. Returns true on success, false on error.
+  bool ToggleUserAction(const ToggleUserActionProto& proto);
+
   // Ends the current action. Can only be called during a ShowGenericUiAction.
   bool EndAction(const EndActionProto& proto);
 
diff --git a/components/autofill_assistant/browser/basic_interactions_unittest.cc b/components/autofill_assistant/browser/basic_interactions_unittest.cc
index 5867ea7..18e74fbe 100644
--- a/components/autofill_assistant/browser/basic_interactions_unittest.cc
+++ b/components/autofill_assistant/browser/basic_interactions_unittest.cc
@@ -13,6 +13,11 @@
 
 namespace autofill_assistant {
 
+using ::testing::ElementsAre;
+using ::testing::Eq;
+using ::testing::Property;
+using ::testing::StrEq;
+
 namespace {
 DateProto CreateDateProto(int year, int month, int day) {
   DateProto proto;
@@ -347,4 +352,72 @@
   EXPECT_EQ(user_model_.GetValue("result"), SimpleValue(true));
 }
 
+TEST_F(BasicInteractionsTest, ToggleUserAction) {
+  ToggleUserActionProto proto;
+  ValueProto user_actions_value;
+  UserActionProto cancel_user_action;
+  cancel_user_action.set_identifier("cancel_identifier");
+  cancel_user_action.mutable_chip()->set_type(ChipType::CANCEL_ACTION);
+  cancel_user_action.mutable_chip()->set_text("Cancel");
+  *user_actions_value.mutable_user_actions()->add_values() = cancel_user_action;
+  UserActionProto done_user_action;
+  done_user_action.set_identifier("done_identifier");
+  done_user_action.mutable_chip()->set_type(ChipType::HIGHLIGHTED_ACTION);
+  done_user_action.mutable_chip()->set_text("Done");
+  *user_actions_value.mutable_user_actions()->add_values() = done_user_action;
+  user_model_.SetValue("chips", user_actions_value);
+  user_model_.SetValue("enabled", SimpleValue(false));
+
+  // Missing fields.
+  EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto));
+  proto.set_user_actions_model_identifier("chips");
+  EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto));
+  proto.set_enabled_model_identifier("enabled");
+  EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto));
+  proto.set_user_action_identifier("done_identifier");
+  EXPECT_TRUE(basic_interactions_.ToggleUserAction(proto));
+
+  // Wrong value types/sizes.
+  user_model_.SetValue("chips", SimpleValue(3));
+  EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto));
+  user_model_.SetValue("chips", user_actions_value);
+  user_model_.SetValue("enabled", SimpleValue(2));
+  EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto));
+  ValueProto multi_bool;
+  multi_bool.mutable_booleans()->add_values(true);
+  multi_bool.mutable_booleans()->add_values(false);
+  user_model_.SetValue("enabled", multi_bool);
+  EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto));
+  user_model_.SetValue("enabled", SimpleValue(false));
+  EXPECT_TRUE(basic_interactions_.ToggleUserAction(proto));
+
+  // Wrong user action identifier.
+  proto.set_user_action_identifier("wrong");
+  EXPECT_FALSE(basic_interactions_.ToggleUserAction(proto));
+  proto.set_user_action_identifier("cancel_identifier");
+  EXPECT_TRUE(basic_interactions_.ToggleUserAction(proto));
+
+  // Check changes to values.
+  user_model_.SetValue("chips", user_actions_value);
+  user_model_.SetValue("enabled", SimpleValue(false));
+  proto.set_user_action_identifier("done_identifier");
+  EXPECT_THAT(
+      user_model_.GetValue("chips")->user_actions().values(),
+      ElementsAre(AllOf(Property(&UserActionProto::identifier,
+                                 StrEq("cancel_identifier")),
+                        Property(&UserActionProto::enabled, Eq(true))),
+                  AllOf(Property(&UserActionProto::identifier,
+                                 StrEq("done_identifier")),
+                        Property(&UserActionProto::enabled, Eq(true)))));
+  EXPECT_TRUE(basic_interactions_.ToggleUserAction(proto));
+  EXPECT_THAT(
+      user_model_.GetValue("chips")->user_actions().values(),
+      ElementsAre(AllOf(Property(&UserActionProto::identifier,
+                                 StrEq("cancel_identifier")),
+                        Property(&UserActionProto::enabled, Eq(true))),
+                  AllOf(Property(&UserActionProto::identifier,
+                                 StrEq("done_identifier")),
+                        Property(&UserActionProto::enabled, Eq(false)))));
+}
+
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/interactions.proto b/components/autofill_assistant/browser/interactions.proto
index 5cf00ff..c599309 100644
--- a/components/autofill_assistant/browser/interactions.proto
+++ b/components/autofill_assistant/browser/interactions.proto
@@ -36,6 +36,7 @@
     EndActionProto end_action = 6;
     ShowCalendarPopupProto show_calendar_popup = 7;
     SetTextProto set_text = 8;
+    ToggleUserActionProto toggle_user_action = 9;
   }
 }
 
@@ -198,6 +199,17 @@
   optional string model_identifier = 1;
 }
 
+// Enables or disables a single user action. Modifies the value in-place.
+message ToggleUserActionProto {
+  // Input and output. Should point to a list of user actions to modify.
+  optional string user_actions_model_identifier = 1;
+  // The identifier of the specific user action to modify.
+  optional string user_action_identifier = 2;
+  // Whether the user action should be enabled or disabled. Should point to a
+  // single boolean.
+  optional string enabled_model_identifier = 3;
+}
+
 // Ends the generic Ui action (this is usually tied to a chip).
 //
 // This behaves exactly the same as tapping a regular chip would in any other
diff --git a/components/autofill_assistant/browser/model.proto b/components/autofill_assistant/browser/model.proto
index fc705cb..75ee3c41 100644
--- a/components/autofill_assistant/browser/model.proto
+++ b/components/autofill_assistant/browser/model.proto
@@ -248,6 +248,9 @@
 
   // A unique identifier for this user action.
   optional string identifier = 3;
+
+  // Whether this action is enabled or not.
+  optional bool enabled = 4 [default = true];
 }
 
 message DateProto {
diff --git a/components/autofill_assistant/browser/user_action.cc b/components/autofill_assistant/browser/user_action.cc
index 312b93c..4e63a9b 100644
--- a/components/autofill_assistant/browser/user_action.cc
+++ b/components/autofill_assistant/browser/user_action.cc
@@ -15,12 +15,6 @@
   std::move(callback).Run();
 }
 
-// void Intercept(base::OnceCallback<void(UserAction::Callback, const
-// TriggerContext&)> interceptor, UserAction::Callback original,
-// std::unique_ptr<TriggerContext>) {
-//   std::move(interceptor).Run(std::move(original), context);
-// }
-
 }  // namespace
 
 UserAction::UserAction(UserAction&& other) = default;
@@ -32,13 +26,16 @@
 UserAction::UserAction(const UserActionProto& action)
     : chip_(action.chip()),
       direct_action_(action.direct_action()),
+      enabled_(action.enabled()),
       identifier_(action.identifier()) {}
 
 UserAction::UserAction(const ChipProto& chip_proto,
                        const DirectActionProto& direct_action_proto,
+                       bool enabled,
                        const std::string& identifier)
     : chip_(chip_proto),
       direct_action_(direct_action_proto),
+      enabled_(enabled),
       identifier_(identifier) {}
 
 void UserAction::SetCallback(base::OnceCallback<void()> callback) {
diff --git a/components/autofill_assistant/browser/user_action.h b/components/autofill_assistant/browser/user_action.h
index 9ec6a14..88a4c88 100644
--- a/components/autofill_assistant/browser/user_action.h
+++ b/components/autofill_assistant/browser/user_action.h
@@ -35,6 +35,7 @@
   UserAction(const UserActionProto& action);
   UserAction(const ChipProto& chip,
              const DirectActionProto& direct_action,
+             bool enabled,
              const std::string& identifier);
 
   // Returns true if the action has no trigger, that is, there is no chip and no
diff --git a/components/autofill_assistant/browser/value_util.cc b/components/autofill_assistant/browser/value_util.cc
index 2827a21..77c5f95 100644
--- a/components/autofill_assistant/browser/value_util.cc
+++ b/components/autofill_assistant/browser/value_util.cc
@@ -120,7 +120,8 @@
                 const UserActionProto& value_b) {
   return value_a.chip() == value_b.chip() &&
          value_a.direct_action() == value_b.direct_action() &&
-         value_a.identifier() == value_b.identifier();
+         value_a.identifier() == value_b.identifier() &&
+         value_a.enabled() == value_b.enabled();
 }
 
 // Compares two |DateProto| instances and returns true if they exactly match.
diff --git a/components/autofill_assistant/browser/value_util_unittest.cc b/components/autofill_assistant/browser/value_util_unittest.cc
index a2ac622..4c977ad 100644
--- a/components/autofill_assistant/browser/value_util_unittest.cc
+++ b/components/autofill_assistant/browser/value_util_unittest.cc
@@ -149,6 +149,28 @@
   EXPECT_TRUE(value_a == value_b);
 }
 
+TEST_F(ValueUtilTest, UserActionComparison) {
+  ValueProto user_actions_value;
+  UserActionProto user_action_a;
+  user_action_a.set_identifier("identifier");
+  user_action_a.mutable_chip()->set_type(ChipType::HIGHLIGHTED_ACTION);
+  user_action_a.mutable_chip()->set_text("text");
+  UserActionProto user_action_b = user_action_a;
+
+  ValueProto value_a;
+  *value_a.mutable_user_actions()->add_values() = user_action_a;
+  ValueProto value_b;
+  *value_b.mutable_user_actions()->add_values() = user_action_b;
+  EXPECT_TRUE(value_a == value_b);
+
+  value_b.mutable_user_actions()->mutable_values(0)->set_enabled(false);
+  EXPECT_FALSE(value_a == value_b);
+
+  value_b = value_a;
+  value_b.mutable_user_actions()->mutable_values(0)->set_identifier("test");
+  EXPECT_FALSE(value_a == value_b);
+}
+
 TEST_F(ValueUtilTest, AreAllValuesOfType) {
   ValueProto value_a;
   ValueProto value_b;
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc
index 73a4c661..eb19d30 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.cc
+++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -21,7 +21,6 @@
 #include "components/history/core/browser/sync/history_delete_directives_model_type_controller.h"
 #include "components/history/core/browser/sync/typed_url_model_type_controller.h"
 #include "components/password_manager/core/browser/password_store.h"
-#include "components/password_manager/core/browser/sync/password_data_type_controller.h"
 #include "components/password_manager/core/browser/sync/password_model_type_controller.h"
 #include "components/prefs/pref_service.h"
 #include "components/reading_list/features/reading_list_switches.h"
@@ -260,24 +259,17 @@
   // Password sync is enabled by default.  Register unless explicitly
   // disabled.
   if (!disabled_types.Has(syncer::PASSWORDS)) {
-    if (base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) {
-      if (profile_password_store_) {
-        // |profile_password_store_| can be null in tests.
-        controllers.push_back(
-            std::make_unique<password_manager::PasswordModelTypeController>(
-                profile_password_store_->CreateSyncControllerDelegate(),
-                account_password_store_
-                    ? account_password_store_->CreateSyncControllerDelegate()
-                    : nullptr,
-                sync_client_->GetPrefService(),
-                sync_client_->GetIdentityManager(), sync_service,
-                sync_client_->GetPasswordStateChangedCallback()));
-      }
-    } else {
-      controllers.push_back(std::make_unique<PasswordDataTypeController>(
-          dump_stack, sync_service, sync_client_,
-          sync_client_->GetPasswordStateChangedCallback(),
-          profile_password_store_));
+    if (profile_password_store_) {
+      // |profile_password_store_| can be null in tests.
+      controllers.push_back(
+          std::make_unique<password_manager::PasswordModelTypeController>(
+              profile_password_store_->CreateSyncControllerDelegate(),
+              account_password_store_
+                  ? account_password_store_->CreateSyncControllerDelegate()
+                  : nullptr,
+              sync_client_->GetPrefService(),
+              sync_client_->GetIdentityManager(), sync_service,
+              sync_client_->GetPasswordStateChangedCallback()));
     }
   }
 
diff --git a/components/history/core/browser/sync/delete_directive_handler.cc b/components/history/core/browser/sync/delete_directive_handler.cc
index 19a9870..7e24352 100644
--- a/components/history/core/browser/sync/delete_directive_handler.cc
+++ b/components/history/core/browser/sync/delete_directive_handler.cc
@@ -458,14 +458,6 @@
   sync_processor_.reset();
 }
 
-syncer::SyncDataList DeleteDirectiveHandler::GetAllSyncData(
-    syncer::ModelType type) const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK_EQ(type, syncer::HISTORY_DELETE_DIRECTIVES);
-  // TODO(akalin): Keep track of existing delete directives.
-  return syncer::SyncDataList();
-}
-
 syncer::SyncError DeleteDirectiveHandler::ProcessSyncChanges(
     const base::Location& from_here,
     const syncer::SyncChangeList& change_list) {
diff --git a/components/history/core/browser/sync/delete_directive_handler.h b/components/history/core/browser/sync/delete_directive_handler.h
index 60cb15c..7685081 100644
--- a/components/history/core/browser/sync/delete_directive_handler.h
+++ b/components/history/core/browser/sync/delete_directive_handler.h
@@ -73,7 +73,6 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> error_handler) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/components/javascript_dialogs/views/app_modal_dialog_view_views.cc b/components/javascript_dialogs/views/app_modal_dialog_view_views.cc
index 9ca3815..92397fd 100644
--- a/components/javascript_dialogs/views/app_modal_dialog_view_views.cc
+++ b/components/javascript_dialogs/views/app_modal_dialog_view_views.cc
@@ -39,14 +39,14 @@
         l10n_util::GetStringUTF16(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION));
   }
 
-  DialogDelegate::set_buttons(
+  DialogDelegate::SetButtons(
       controller_->javascript_dialog_type() ==
               content::JAVASCRIPT_DIALOG_TYPE_ALERT
           ? ui::DIALOG_BUTTON_OK
           : (ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL));
 
   if (controller_->is_before_unload_dialog()) {
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_OK,
         l10n_util::GetStringUTF16(
             controller_->is_reload()
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
index ca5b41e..43da144c 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -683,7 +683,7 @@
 void MetricsWebContentsObserver::OnTimingUpdated(
     content::RenderFrameHost* render_frame_host,
     mojom::PageLoadTimingPtr timing,
-    mojom::PageLoadMetadataPtr metadata,
+    mojom::FrameMetadataPtr metadata,
     mojom::PageLoadFeaturesPtr new_features,
     const std::vector<mojom::ResourceDataUpdatePtr>& resources,
     mojom::FrameRenderDataUpdatePtr render_data,
@@ -702,6 +702,8 @@
     // any of the errors below for main frames. Thus, we track occurrences of
     // all errors below, rather than returning early after encountering an
     // error.
+    // TODO(crbug/1061090): Update page load metrics IPC validation to ues
+    // mojo::ReportBadMessage.
     bool error = false;
     if (!committed_load_) {
       RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD);
@@ -713,6 +715,14 @@
       error = true;
     }
 
+    if (!metadata->intersection_update.is_null()) {
+      mojo::ReportBadMessage(
+          "page_load_metrics.mojom.FrameMetadata does not report an "
+          "intersection "
+          "update for the main frame. ");
+      error = true;
+    }
+
     if (error)
       return;
   } else if (!committed_load_) {
@@ -729,7 +739,7 @@
 
 void MetricsWebContentsObserver::UpdateTiming(
     mojom::PageLoadTimingPtr timing,
-    mojom::PageLoadMetadataPtr metadata,
+    mojom::FrameMetadataPtr metadata,
     mojom::PageLoadFeaturesPtr new_features,
     std::vector<mojom::ResourceDataUpdatePtr> resources,
     mojom::FrameRenderDataUpdatePtr render_data,
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h
index a260826..6b36c86 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.h
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.h
@@ -158,7 +158,7 @@
   void OnTimingUpdated(
       content::RenderFrameHost* render_frame_host,
       mojom::PageLoadTimingPtr timing,
-      mojom::PageLoadMetadataPtr metadata,
+      mojom::FrameMetadataPtr metadata,
       mojom::PageLoadFeaturesPtr new_features,
       const std::vector<mojom::ResourceDataUpdatePtr>& resources,
       mojom::FrameRenderDataUpdatePtr render_data,
@@ -180,7 +180,7 @@
   // page_load_metrics::mojom::PageLoadMetrics implementation.
   void UpdateTiming(
       mojom::PageLoadTimingPtr timing,
-      mojom::PageLoadMetadataPtr metadata,
+      mojom::FrameMetadataPtr metadata,
       mojom::PageLoadFeaturesPtr new_features,
       std::vector<mojom::ResourceDataUpdatePtr> resources,
       mojom::FrameRenderDataUpdatePtr render_data,
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
index 036f3ead..0e7413e 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
@@ -105,7 +105,7 @@
                                content::RenderFrameHost* render_frame_host) {
     observer()->OnTimingUpdated(
         render_frame_host, previous_timing_->Clone(),
-        mojom::PageLoadMetadataPtr(base::in_place),
+        mojom::FrameMetadataPtr(base::in_place),
         mojom::PageLoadFeaturesPtr(base::in_place),
         std::vector<mojom::ResourceDataUpdatePtr>(),
         mojom::FrameRenderDataUpdatePtr(base::in_place), timing.Clone(),
@@ -129,7 +129,7 @@
     previous_timing_ = timing.Clone();
     observer()->OnTimingUpdated(
         render_frame_host, timing.Clone(),
-        mojom::PageLoadMetadataPtr(base::in_place),
+        mojom::FrameMetadataPtr(base::in_place),
         mojom::PageLoadFeaturesPtr(base::in_place),
         std::vector<mojom::ResourceDataUpdatePtr>(),
         mojom::FrameRenderDataUpdatePtr(base::in_place),
diff --git a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc
index 6b432652..b927215b 100644
--- a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc
+++ b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc
@@ -109,7 +109,7 @@
     const mojom::PageLoadTiming& timing,
     content::RenderFrameHost* rfh) {
   SimulatePageLoadTimingUpdate(
-      timing, mojom::PageLoadMetadata(), mojom::PageLoadFeatures(),
+      timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(),
       mojom::FrameRenderDataUpdate(), mojom::CpuTiming(),
       mojom::DeferredResourceCounts(), rfh);
 }
@@ -124,7 +124,7 @@
     content::RenderFrameHost* rfh) {
   auto timing = page_load_metrics::mojom::PageLoadTimingPtr(base::in_place);
   page_load_metrics::InitPageLoadTimingForTest(timing.get());
-  SimulatePageLoadTimingUpdate(*timing, mojom::PageLoadMetadata(),
+  SimulatePageLoadTimingUpdate(*timing, mojom::FrameMetadata(),
                                mojom::PageLoadFeatures(),
                                mojom::FrameRenderDataUpdate(), cpu_timing,
                                mojom::DeferredResourceCounts(), rfh);
@@ -132,7 +132,7 @@
 
 void PageLoadMetricsObserverTester::SimulateTimingAndMetadataUpdate(
     const mojom::PageLoadTiming& timing,
-    const mojom::PageLoadMetadata& metadata) {
+    const mojom::FrameMetadata& metadata) {
   SimulatePageLoadTimingUpdate(
       timing, metadata, mojom::PageLoadFeatures(),
       mojom::FrameRenderDataUpdate(), mojom::CpuTiming(),
@@ -140,7 +140,7 @@
 }
 
 void PageLoadMetricsObserverTester::SimulateMetadataUpdate(
-    const mojom::PageLoadMetadata& metadata,
+    const mojom::FrameMetadata& metadata,
     content::RenderFrameHost* rfh) {
   mojom::PageLoadTiming timing;
   InitPageLoadTimingForTest(&timing);
@@ -153,7 +153,7 @@
 void PageLoadMetricsObserverTester::SimulateFeaturesUpdate(
     const mojom::PageLoadFeatures& new_features) {
   SimulatePageLoadTimingUpdate(
-      mojom::PageLoadTiming(), mojom::PageLoadMetadata(), new_features,
+      mojom::PageLoadTiming(), mojom::FrameMetadata(), new_features,
       mojom::FrameRenderDataUpdate(), mojom::CpuTiming(),
       mojom::DeferredResourceCounts(), web_contents()->GetMainFrame());
 }
@@ -169,13 +169,13 @@
   mojom::PageLoadTiming timing;
   InitPageLoadTimingForTest(&timing);
   SimulatePageLoadTimingUpdate(
-      timing, mojom::PageLoadMetadata(), mojom::PageLoadFeatures(), render_data,
+      timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(), render_data,
       mojom::CpuTiming(), mojom::DeferredResourceCounts(), rfh);
 }
 
 void PageLoadMetricsObserverTester::SimulatePageLoadTimingUpdate(
     const mojom::PageLoadTiming& timing,
-    const mojom::PageLoadMetadata& metadata,
+    const mojom::FrameMetadata& metadata,
     const mojom::PageLoadFeatures& new_features,
     const mojom::FrameRenderDataUpdate& render_data,
     const mojom::CpuTiming& cpu_timing,
@@ -205,7 +205,7 @@
   InitPageLoadTimingForTest(timing.get());
   metrics_web_contents_observer_->OnTimingUpdated(
       render_frame_host, std::move(timing),
-      mojom::PageLoadMetadataPtr(base::in_place),
+      mojom::FrameMetadataPtr(base::in_place),
       mojom::PageLoadFeaturesPtr(base::in_place), resources,
       mojom::FrameRenderDataUpdatePtr(base::in_place),
       mojom::CpuTimingPtr(base::in_place),
diff --git a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h
index 449d9180..50f90161 100644
--- a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h
+++ b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h
@@ -36,7 +36,7 @@
 namespace mojom {
 class FrameRenderDataUpdate;
 class PageLoadFeatures;
-class PageLoadMetadata;
+class FrameMetadata;
 class PageLoadTiming;
 }  // namespace mojom
 
@@ -92,8 +92,8 @@
   void SimulateCpuTimingUpdate(const mojom::CpuTiming& cpu_timing,
                                content::RenderFrameHost* rfh);
   void SimulateTimingAndMetadataUpdate(const mojom::PageLoadTiming& timing,
-                                       const mojom::PageLoadMetadata& metadata);
-  void SimulateMetadataUpdate(const mojom::PageLoadMetadata& metadata,
+                                       const mojom::FrameMetadata& metadata);
+  void SimulateMetadataUpdate(const mojom::FrameMetadata& metadata,
                               content::RenderFrameHost* rfh);
   void SimulateFeaturesUpdate(const mojom::PageLoadFeatures& new_features);
   void SimulateResourceDataUseUpdate(
@@ -161,7 +161,7 @@
  private:
   void SimulatePageLoadTimingUpdate(
       const mojom::PageLoadTiming& timing,
-      const mojom::PageLoadMetadata& metadata,
+      const mojom::FrameMetadata& metadata,
       const mojom::PageLoadFeatures& new_features,
       const mojom::FrameRenderDataUpdate& render_data,
       const mojom::CpuTiming& cpu_timing,
diff --git a/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.cc
index 9da7543..c11215f0 100644
--- a/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.cc
+++ b/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.cc
@@ -60,10 +60,9 @@
     case WebFeature::kDownloadInSandbox:
       rfh->AddMessageToConsole(
           blink::mojom::ConsoleMessageLevel::kWarning,
-          "[Deprecation] Download in sandbox is deprecated and will be removed "
-          "in M81. You may consider adding 'allow-downloads' to the sandbox "
-          "attribute list. See "
-          "https://www.chromestatus.com/feature/5706745674465280 for more "
+          "Download is disallowed. The frame initiating or instantiating the "
+          "download is sandboxed, but the flag ‘allow-downloads’ is not set. "
+          "See https://www.chromestatus.com/feature/5706745674465280 for more "
           "details.");
       return;
     case WebFeature::kDownloadInAdFrameWithoutUserGesture:
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer.h b/components/page_load_metrics/browser/page_load_metrics_observer.h
index 7cd04e7..4d97d3c4 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer.h
+++ b/components/page_load_metrics/browser/page_load_metrics_observer.h
@@ -362,6 +362,15 @@
       const content::WebContentsObserver::MediaPlayerInfo& video_type,
       content::RenderFrameHost* render_frame_host) {}
 
+  // Invoked when a frame's intersections with page elements changes and an
+  // update is received. The main_frame_document_intersection_rect
+  // returns an empty rect for out of view subframes and does not send updates
+  // for the main frame.
+  // TODO(crbug/1048175): Expose intersections to observers via shared delegate.
+  virtual void OnFrameIntersectionUpdate(
+      content::RenderFrameHost* rfh,
+      const mojom::FrameIntersectionUpdate& intersection_update) {}
+
   // Invoked when the UMA metrics subsystem is persisting metrics as the
   // application goes into the background, on platforms where the browser
   // process may be killed after backgrounding (Android). Implementers should
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
index c493e52..9f2091f9 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
+++ b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
@@ -19,7 +19,7 @@
 namespace page_load_metrics {
 
 namespace mojom {
-class PageLoadMetadata;
+class FrameMetadata;
 }  // namespace mojom
 
 struct UserInitiatedInfo;
@@ -91,10 +91,12 @@
 
   // Extra information supplied to the page load metrics system from the
   // renderer for the main frame.
-  virtual const mojom::PageLoadMetadata& GetMainFrameMetadata() const = 0;
+  virtual const mojom::FrameMetadata& GetMainFrameMetadata() const = 0;
 
-  // PageLoadMetadata for subframes of the current page load.
-  virtual const mojom::PageLoadMetadata& GetSubframeMetadata() const = 0;
+  // FrameMetadata for subframes of the current page load. This contains
+  // aggregate information across all subframes. Non-aggregatable information
+  // such as subframe intersections is initialized to defaults.
+  virtual const mojom::FrameMetadata& GetSubframeMetadata() const = 0;
   virtual const PageRenderData& GetPageRenderData() const = 0;
   virtual const PageRenderData& GetMainFrameRenderData() const = 0;
   virtual const ui::ScopedVisibilityTracker& GetVisibilityTracker() const = 0;
diff --git a/components/page_load_metrics/browser/page_load_metrics_test_waiter.cc b/components/page_load_metrics/browser/page_load_metrics_test_waiter.cc
index 7e0d82f..539d1ea 100644
--- a/components/page_load_metrics/browser/page_load_metrics_test_waiter.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_test_waiter.cc
@@ -35,6 +35,11 @@
   expected_frame_sizes_.insert(size);
 }
 
+void PageLoadMetricsTestWaiter::AddMainFrameDocumentIntersectionExpectation(
+    const gfx::Rect& rect) {
+  expected_main_frame_intersection_ = rect;
+}
+
 void PageLoadMetricsTestWaiter::AddSubFrameExpectation(TimingField field) {
   CHECK_NE(field, TimingField::kLoadTimingInfo)
       << "LOAD_TIMING_INFO should only be used as a page-level expectation";
@@ -97,7 +102,7 @@
     const page_load_metrics::mojom::PageLoadTiming& timing) {
   if (ExpectationsSatisfied())
     return;
-  const page_load_metrics::mojom::PageLoadMetadata& metadata =
+  const page_load_metrics::mojom::FrameMetadata& metadata =
       subframe_rfh ? GetDelegateForCommittedLoad().GetSubframeMetadata()
                    : GetDelegateForCommittedLoad().GetMainFrameMetadata();
   TimingFieldBitSet matched_bits = GetMatchedBits(timing, metadata);
@@ -183,6 +188,19 @@
     run_loop_->Quit();
 }
 
+void PageLoadMetricsTestWaiter::OnFrameIntersectionUpdate(
+    content::RenderFrameHost* rfh,
+    const page_load_metrics::mojom::FrameIntersectionUpdate&
+        frame_intersection_update) {
+  if (expected_main_frame_intersection_ &&
+      expected_main_frame_intersection_ ==
+          frame_intersection_update.main_frame_document_intersection_rect) {
+    expected_main_frame_intersection_.reset();
+  }
+  if (ExpectationsSatisfied() && run_loop_)
+    run_loop_->Quit();
+}
+
 void PageLoadMetricsTestWaiter::OnDidFinishSubFrameNavigation(
     content::NavigationHandle* navigation_handle) {
   if (SubframeNavigationExpectationsSatisfied())
@@ -206,7 +224,7 @@
 PageLoadMetricsTestWaiter::TimingFieldBitSet
 PageLoadMetricsTestWaiter::GetMatchedBits(
     const page_load_metrics::mojom::PageLoadTiming& timing,
-    const page_load_metrics::mojom::PageLoadMetadata& metadata) {
+    const page_load_metrics::mojom::FrameMetadata& metadata) {
   PageLoadMetricsTestWaiter::TimingFieldBitSet matched_bits;
   if (timing.document_timing->load_event_start)
     matched_bits.Set(TimingField::kLoadEvent);
@@ -283,7 +301,8 @@
          WebFeaturesExpectationsSatisfied() &&
          SubframeNavigationExpectationsSatisfied() &&
          SubframeDataExpectationsSatisfied() && expected_frame_sizes_.empty() &&
-         CpuTimeExpectationsSatisfied();
+         CpuTimeExpectationsSatisfied() &&
+         !expected_main_frame_intersection_.has_value();
 }
 
 PageLoadMetricsTestWaiter::WaiterMetricsObserver::~WaiterMetricsObserver() =
@@ -331,6 +350,15 @@
 }
 
 void PageLoadMetricsTestWaiter::WaiterMetricsObserver::
+    OnFrameIntersectionUpdate(
+        content::RenderFrameHost* rfh,
+        const page_load_metrics::mojom::FrameIntersectionUpdate&
+            frame_intersection_update) {
+  if (waiter_)
+    waiter_->OnFrameIntersectionUpdate(rfh, frame_intersection_update);
+}
+
+void PageLoadMetricsTestWaiter::WaiterMetricsObserver::
     OnDidFinishSubFrameNavigation(
         content::NavigationHandle* navigation_handle) {
   if (waiter_)
diff --git a/components/page_load_metrics/browser/page_load_metrics_test_waiter.h b/components/page_load_metrics/browser/page_load_metrics_test_waiter.h
index 728d9b1d..9a05ec6 100644
--- a/components/page_load_metrics/browser/page_load_metrics_test_waiter.h
+++ b/components/page_load_metrics/browser/page_load_metrics_test_waiter.h
@@ -46,6 +46,11 @@
   // size update of |size|.
   void AddFrameSizeExpectation(const gfx::Size& size);
 
+  // Add a main frame document intersection expectation. Expects that a frame
+  // receives an intersection update with a main frame document intersection
+  // of |rect|. Subsequent calls overwrite unmet expectations.
+  void AddMainFrameDocumentIntersectionExpectation(const gfx::Rect& rect);
+
   // Add a single WebFeature expectation.
   void AddWebFeatureExpectation(blink::mojom::WebFeature web_feature);
 
@@ -127,6 +132,10 @@
         content::NavigationHandle* navigation_handle) override;
     void FrameSizeChanged(content::RenderFrameHost* render_frame_host,
                           const gfx::Size& frame_size) override;
+    void OnFrameIntersectionUpdate(
+        content::RenderFrameHost* rfh,
+        const page_load_metrics::mojom::FrameIntersectionUpdate&
+            frame_intersection_update) override;
 
    private:
     const base::WeakPtr<PageLoadMetricsTestWaiter> waiter_;
@@ -169,7 +178,7 @@
 
   static TimingFieldBitSet GetMatchedBits(
       const page_load_metrics::mojom::PageLoadTiming& timing,
-      const page_load_metrics::mojom::PageLoadMetadata& metadata);
+      const page_load_metrics::mojom::FrameMetadata& metadata);
 
   // Updates observed page fields when a timing update is received by the
   // MetricsWebContentsObserver. Stops waiting if expectations are satsfied
@@ -204,6 +213,11 @@
   void FrameSizeChanged(content::RenderFrameHost* render_frame_host,
                         const gfx::Size& frame_size);
 
+  void OnFrameIntersectionUpdate(
+      content::RenderFrameHost* rfh,
+      const page_load_metrics::mojom::FrameIntersectionUpdate&
+          frame_intersection_update);
+
   void OnDidFinishSubFrameNavigation(
       content::NavigationHandle* navigation_handle);
 
@@ -237,6 +251,10 @@
   std::set<gfx::Size, FrameSizeComparator> expected_frame_sizes_;
   std::set<gfx::Size, FrameSizeComparator> observed_frame_sizes_;
 
+  // Expectation for the main frame document intersection. Has a value when
+  // an expectation has not been met.
+  base::Optional<gfx::Rect> expected_main_frame_intersection_;
+
   int current_complete_resources_ = 0;
   int64_t current_network_bytes_ = 0;
 
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
index f20a98f9..d71204c 100644
--- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
@@ -408,8 +408,8 @@
       navigation_start_(navigation_handle->NavigationStart()),
       current_merged_page_timing_(CreatePageLoadTiming()),
       pending_merged_page_timing_(CreatePageLoadTiming()),
-      main_frame_metadata_(mojom::PageLoadMetadata::New()),
-      subframe_metadata_(mojom::PageLoadMetadata::New()) {}
+      main_frame_metadata_(mojom::FrameMetadata::New()),
+      subframe_metadata_(mojom::FrameMetadata::New()) {}
 
 PageLoadMetricsUpdateDispatcher::~PageLoadMetricsUpdateDispatcher() {
   ShutDown();
@@ -431,7 +431,7 @@
 void PageLoadMetricsUpdateDispatcher::UpdateMetrics(
     content::RenderFrameHost* render_frame_host,
     mojom::PageLoadTimingPtr new_timing,
-    mojom::PageLoadMetadataPtr new_metadata,
+    mojom::FrameMetadataPtr new_metadata,
     mojom::PageLoadFeaturesPtr new_features,
     const std::vector<mojom::ResourceDataUpdatePtr>& resources,
     mojom::FrameRenderDataUpdatePtr render_data,
@@ -543,11 +543,41 @@
 
 void PageLoadMetricsUpdateDispatcher::UpdateSubFrameMetadata(
     content::RenderFrameHost* render_frame_host,
-    mojom::PageLoadMetadataPtr subframe_metadata) {
+    mojom::FrameMetadataPtr subframe_metadata) {
   // Merge the subframe loading behavior flags with any we've already observed,
   // possibly from other subframes.
   subframe_metadata_->behavior_flags |= subframe_metadata->behavior_flags;
   client_->OnSubframeMetadataChanged(render_frame_host, *subframe_metadata);
+
+  // Handle intersection updates if included in the metadata.
+  if (subframe_metadata->intersection_update.is_null()) {
+    return;
+  }
+
+  // Do not notify intersections for untracked loads,
+  // subframe_navigation_start_offset_ excludes untracked loads.
+  // TODO(crbug/1061091): Document definition of untracked loads in page load
+  // metrics.
+  const int frame_tree_node_id = render_frame_host->GetFrameTreeNodeId();
+  if (subframe_navigation_start_offset_.find(frame_tree_node_id) ==
+      subframe_navigation_start_offset_.end()) {
+    return;
+  }
+
+  auto existing_intersection_it =
+      frame_intersection_updates_.find(render_frame_host->GetFrameTreeNodeId());
+
+  // Check if we already have a frame intersection update for the frame,
+  // dispatch updates for the first frame intersection update or if
+  // the intersection has changed.
+  if (existing_intersection_it == frame_intersection_updates_.end() ||
+      !existing_intersection_it->second.Equals(
+          *subframe_metadata->intersection_update)) {
+    frame_intersection_updates_[frame_tree_node_id] =
+        *subframe_metadata->intersection_update;
+    client_->OnFrameIntersectionUpdate(render_frame_host,
+                                       *subframe_metadata->intersection_update);
+  }
 }
 
 void PageLoadMetricsUpdateDispatcher::UpdateMainFrameTiming(
@@ -593,7 +623,7 @@
 }
 
 void PageLoadMetricsUpdateDispatcher::UpdateMainFrameMetadata(
-    mojom::PageLoadMetadataPtr new_metadata) {
+    mojom::FrameMetadataPtr new_metadata) {
   if (main_frame_metadata_->Equals(*new_metadata))
     return;
 
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
index f470eb9..5739c01 100644
--- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
+++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
@@ -110,7 +110,7 @@
     virtual void OnMainFrameMetadataChanged() = 0;
     virtual void OnSubframeMetadataChanged(
         content::RenderFrameHost* rfh,
-        const mojom::PageLoadMetadata& metadata) = 0;
+        const mojom::FrameMetadata& metadata) = 0;
     virtual void OnSubFrameRenderDataChanged(
         content::RenderFrameHost* rfh,
         const mojom::FrameRenderDataUpdate& render_data) = 0;
@@ -122,6 +122,9 @@
         const std::vector<mojom::ResourceDataUpdatePtr>& resources) = 0;
     virtual void UpdateFrameCpuTiming(content::RenderFrameHost* rfh,
                                       const mojom::CpuTiming& timing) = 0;
+    virtual void OnFrameIntersectionUpdate(
+        content::RenderFrameHost* rfh,
+        const mojom::FrameIntersectionUpdate& frame_intersection_update) = 0;
     virtual void OnNewDeferredResourceCounts(
         const mojom::DeferredResourceCounts& new_deferred_resource_data) = 0;
   };
@@ -136,7 +139,7 @@
   void UpdateMetrics(
       content::RenderFrameHost* render_frame_host,
       mojom::PageLoadTimingPtr new_timing,
-      mojom::PageLoadMetadataPtr new_metadata,
+      mojom::FrameMetadataPtr new_metadata,
       mojom::PageLoadFeaturesPtr new_features,
       const std::vector<mojom::ResourceDataUpdatePtr>& resources,
       mojom::FrameRenderDataUpdatePtr render_data,
@@ -158,10 +161,10 @@
     return *(current_merged_page_timing_.get());
   }
 
-  const mojom::PageLoadMetadata& main_frame_metadata() const {
+  const mojom::FrameMetadata& main_frame_metadata() const {
     return *(main_frame_metadata_.get());
   }
-  const mojom::PageLoadMetadata& subframe_metadata() const {
+  const mojom::FrameMetadata& subframe_metadata() const {
     return *(subframe_metadata_.get());
   }
   const PageRenderData& page_render_data() const { return page_render_data_; }
@@ -178,9 +181,9 @@
   void UpdateFrameCpuTiming(content::RenderFrameHost* render_frame_host,
                             mojom::CpuTimingPtr new_timing);
 
-  void UpdateMainFrameMetadata(mojom::PageLoadMetadataPtr new_metadata);
+  void UpdateMainFrameMetadata(mojom::FrameMetadataPtr new_metadata);
   void UpdateSubFrameMetadata(content::RenderFrameHost* render_frame_host,
-                              mojom::PageLoadMetadataPtr subframe_metadata);
+                              mojom::FrameMetadataPtr subframe_metadata);
 
   void UpdatePageRenderData(const mojom::FrameRenderDataUpdate& render_data);
   void UpdateMainFrameRenderData(
@@ -214,12 +217,19 @@
   mojom::PageLoadTimingPtr current_merged_page_timing_;
   mojom::PageLoadTimingPtr pending_merged_page_timing_;
 
-  mojom::PageLoadMetadataPtr main_frame_metadata_;
-  mojom::PageLoadMetadataPtr subframe_metadata_;
+  // TODO(crbug/1058393): Replace aggregate frame metadata with a separate
+  // struct instead of using mojo.
+  mojom::FrameMetadataPtr main_frame_metadata_;
+  mojom::FrameMetadataPtr subframe_metadata_;
 
   PageRenderData page_render_data_;
   PageRenderData main_frame_render_data_;
 
+  // The last main frame document intersection dispatched to page load metrics
+  // observers.
+  std::map<FrameTreeNodeId, mojom::FrameIntersectionUpdate>
+      frame_intersection_updates_;
+
   // Navigation start offsets for the most recently committed document in each
   // frame.
   std::map<FrameTreeNodeId, base::TimeDelta> subframe_navigation_start_offset_;
diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc
index 0cd62a85..a6bc3758 100644
--- a/components/page_load_metrics/browser/page_load_tracker.cc
+++ b/components/page_load_metrics/browser/page_load_tracker.cc
@@ -667,7 +667,7 @@
 
 void PageLoadTracker::OnSubframeMetadataChanged(
     content::RenderFrameHost* rfh,
-    const mojom::PageLoadMetadata& metadata) {
+    const mojom::FrameMetadata& metadata) {
   for (const auto& observer : observers_) {
     observer->OnLoadingBehaviorObserved(rfh, metadata.behavior_flags);
   }
@@ -711,6 +711,14 @@
   }
 }
 
+void PageLoadTracker::OnFrameIntersectionUpdate(
+    content::RenderFrameHost* rfh,
+    const mojom::FrameIntersectionUpdate& frame_intersection_update) {
+  for (const auto& observer : observers_) {
+    observer->OnFrameIntersectionUpdate(rfh, frame_intersection_update);
+  }
+}
+
 content::WebContents* PageLoadTracker::GetWebContents() const {
   return web_contents_;
 }
@@ -770,11 +778,11 @@
   return page_end_time;
 }
 
-const mojom::PageLoadMetadata& PageLoadTracker::GetMainFrameMetadata() const {
+const mojom::FrameMetadata& PageLoadTracker::GetMainFrameMetadata() const {
   return metrics_update_dispatcher_.main_frame_metadata();
 }
 
-const mojom::PageLoadMetadata& PageLoadTracker::GetSubframeMetadata() const {
+const mojom::FrameMetadata& PageLoadTracker::GetSubframeMetadata() const {
   return metrics_update_dispatcher_.subframe_metadata();
 }
 
diff --git a/components/page_load_metrics/browser/page_load_tracker.h b/components/page_load_metrics/browser/page_load_tracker.h
index bcc83a9..555bf9c 100644
--- a/components/page_load_metrics/browser/page_load_tracker.h
+++ b/components/page_load_metrics/browser/page_load_tracker.h
@@ -188,9 +188,8 @@
       content::RenderFrameHost* rfh,
       const mojom::FrameRenderDataUpdate& render_data) override;
   void OnMainFrameMetadataChanged() override;
-  void OnSubframeMetadataChanged(
-      content::RenderFrameHost* rfh,
-      const mojom::PageLoadMetadata& metadata) override;
+  void OnSubframeMetadataChanged(content::RenderFrameHost* rfh,
+                                 const mojom::FrameMetadata& metadata) override;
   void UpdateFeaturesUsage(
       content::RenderFrameHost* rfh,
       const mojom::PageLoadFeatures& new_features) override;
@@ -201,6 +200,9 @@
       const mojom::DeferredResourceCounts& new_deferred_resource_data) override;
   void UpdateFrameCpuTiming(content::RenderFrameHost* rfh,
                             const mojom::CpuTiming& timing) override;
+  void OnFrameIntersectionUpdate(
+      content::RenderFrameHost* rfh,
+      const mojom::FrameIntersectionUpdate& frame_intersection_update) override;
 
   // PageLoadMetricsDelegate implementation:
   content::WebContents* GetWebContents() const override;
@@ -217,8 +219,8 @@
   PageEndReason GetPageEndReason() const override;
   const UserInitiatedInfo& GetPageEndUserInitiatedInfo() const override;
   base::Optional<base::TimeDelta> GetPageEndTime() const override;
-  const mojom::PageLoadMetadata& GetMainFrameMetadata() const override;
-  const mojom::PageLoadMetadata& GetSubframeMetadata() const override;
+  const mojom::FrameMetadata& GetMainFrameMetadata() const override;
+  const mojom::FrameMetadata& GetSubframeMetadata() const override;
   const PageRenderData& GetPageRenderData() const override;
   const PageRenderData& GetMainFrameRenderData() const override;
   const ui::ScopedVisibilityTracker& GetVisibilityTracker() const override;
diff --git a/components/page_load_metrics/common/BUILD.gn b/components/page_load_metrics/common/BUILD.gn
index 40345f3..5605576 100644
--- a/components/page_load_metrics/common/BUILD.gn
+++ b/components/page_load_metrics/common/BUILD.gn
@@ -46,6 +46,7 @@
   public_deps = [
     "//mojo/public/mojom/base",
     "//third_party/blink/public/mojom:web_feature_mojo_bindings",
+    "//ui/gfx/geometry/mojom",
     "//url/mojom:url_mojom_origin",
   ]
 }
diff --git a/components/page_load_metrics/common/DEPS b/components/page_load_metrics/common/DEPS
index 258a310..10b3f566 100644
--- a/components/page_load_metrics/common/DEPS
+++ b/components/page_load_metrics/common/DEPS
@@ -2,4 +2,5 @@
   "+base",
   "+net/base",
   "+third_party/blink/public",
-]
\ No newline at end of file
+  "+ui/gfx/geometry",
+]
diff --git a/components/page_load_metrics/common/page_load_metrics.mojom b/components/page_load_metrics/common/page_load_metrics.mojom
index bc5e2eb..a4718e6 100644
--- a/components/page_load_metrics/common/page_load_metrics.mojom
+++ b/components/page_load_metrics/common/page_load_metrics.mojom
@@ -4,6 +4,7 @@
 
 module page_load_metrics.mojom;
 
+import "ui/gfx/geometry/mojom/geometry.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "third_party/blink/public/mojom/web_feature/web_feature.mojom";
 import "third_party/blink/public/mojom/use_counter/css_property_id.mojom";
@@ -144,9 +145,23 @@
   // If you add additional members, also be sure to update page_load_timing.h.
 };
 
-struct PageLoadMetadata {
+// FrameIntersectionUpdate contains a frame's intersections with other elements
+// in a page load.
+struct FrameIntersectionUpdate {
+  // The frame's current intersection rect with the main frame document in the
+  // coordinate system of the main frame's viewport. The intersection rect is
+  // an empty rect when there is no intersection with the main frame. No
+  // rect is returned for the main frame. This is only set the first time an
+  // intersection changes and is null otherwise.
+  gfx.mojom.Rect? main_frame_document_intersection_rect;
+};
+
+struct FrameMetadata {
   // These are packed blink::LoadingBehaviorFlag enums.
   int32 behavior_flags = 0;
+
+  // The frame's intersection with page elements.
+  FrameIntersectionUpdate? intersection_update;
 };
 
 // PageLoadFeatures contains a list of features newly observed by use counter.
@@ -262,8 +277,12 @@
 // Sent from renderer to browser process when the PageLoadTiming for the
 // associated frame changed.
 interface PageLoadMetrics {
+  // Called when an update is ready to be sent from renderer to browser.
+  // UpdateTiming calls are buffered, and contain all updates that have been
+  // received in the last buffer window. Some of the update data may be empty.
+  // Only called when at least one change has been observed within the frame.
   UpdateTiming(PageLoadTiming page_load_timing,
-               PageLoadMetadata page_load_metadata,
+               FrameMetadata frame_metadata,
                PageLoadFeatures new_features,
                array<ResourceDataUpdate> resources,
                FrameRenderDataUpdate render_data,
diff --git a/components/page_load_metrics/renderer/DEPS b/components/page_load_metrics/renderer/DEPS
index c6d293a..8b9c4a8 100644
--- a/components/page_load_metrics/renderer/DEPS
+++ b/components/page_load_metrics/renderer/DEPS
@@ -7,6 +7,7 @@
   "+services/network/public/cpp",
   "+services/network/public/mojom",
   "+third_party/blink/public",
+  "+ui/gfx/geometry",
   "+url",
 ]
 
diff --git a/components/page_load_metrics/renderer/fake_page_timing_sender.cc b/components/page_load_metrics/renderer/fake_page_timing_sender.cc
index 14a4f66..a19c5b1 100644
--- a/components/page_load_metrics/renderer/fake_page_timing_sender.cc
+++ b/components/page_load_metrics/renderer/fake_page_timing_sender.cc
@@ -17,7 +17,7 @@
 
 void FakePageTimingSender::SendTiming(
     const mojom::PageLoadTimingPtr& timing,
-    const mojom::PageLoadMetadataPtr& metadata,
+    const mojom::FrameMetadataPtr& metadata,
     mojom::PageLoadFeaturesPtr new_features,
     std::vector<mojom::ResourceDataUpdatePtr> resources,
     const mojom::FrameRenderDataUpdate& render_data,
@@ -27,7 +27,7 @@
                            render_data, cpu_timing, new_deferred_resource_data);
 }
 
-FakePageTimingSender::PageTimingValidator::PageTimingValidator() {}
+FakePageTimingSender::PageTimingValidator::PageTimingValidator() = default;
 
 FakePageTimingSender::PageTimingValidator::~PageTimingValidator() {
   VerifyExpectedTimings();
@@ -120,9 +120,18 @@
                   actual_render_data_.layout_shift_delta);
 }
 
+void FakePageTimingSender::PageTimingValidator::
+    VerifyExpectedFrameIntersectionUpdate() const {
+  if (!expected_frame_intersection_update_.is_null()) {
+    EXPECT_FALSE(actual_frame_intersection_update_.is_null());
+    EXPECT_TRUE(expected_frame_intersection_update_->Equals(
+        *actual_frame_intersection_update_));
+  }
+}
+
 void FakePageTimingSender::PageTimingValidator::UpdateTiming(
     const mojom::PageLoadTimingPtr& timing,
-    const mojom::PageLoadMetadataPtr& metadata,
+    const mojom::FrameMetadataPtr& metadata,
     const mojom::PageLoadFeaturesPtr& new_features,
     const std::vector<mojom::ResourceDataUpdatePtr>& resources,
     const mojom::FrameRenderDataUpdate& render_data,
@@ -145,11 +154,13 @@
     actual_css_properties_.insert(css_property_id);
   }
   actual_render_data_.layout_shift_delta = render_data.layout_shift_delta;
+  actual_frame_intersection_update_ = metadata->intersection_update.Clone();
   VerifyExpectedTimings();
   VerifyExpectedCpuTimings();
   VerifyExpectedFeatures();
   VerifyExpectedCssProperties();
   VerifyExpectedRenderData();
+  VerifyExpectedFrameIntersectionUpdate();
 }
 
 }  // namespace page_load_metrics
diff --git a/components/page_load_metrics/renderer/fake_page_timing_sender.h b/components/page_load_metrics/renderer/fake_page_timing_sender.h
index 0e74280..9c432596 100644
--- a/components/page_load_metrics/renderer/fake_page_timing_sender.h
+++ b/components/page_load_metrics/renderer/fake_page_timing_sender.h
@@ -68,6 +68,11 @@
       expected_render_data_ = render_data;
     }
 
+    void UpdateExpectFrameIntersectionUpdate(
+        const mojom::FrameIntersectionUpdate& frame_intersection_update) {
+      expected_frame_intersection_update_ = frame_intersection_update.Clone();
+    }
+
     // Forces verification that actual features sent through SendTiming match
     // expected features provided via ExpectPageLoadFeatures.
     void VerifyExpectedFeatures() const;
@@ -75,6 +80,7 @@
     // match expected CSS properties provided via ExpectPageLoadCSSProperties.
     void VerifyExpectedCssProperties() const;
     void VerifyExpectedRenderData() const;
+    void VerifyExpectedFrameIntersectionUpdate() const;
 
     const std::vector<mojom::PageLoadTimingPtr>& expected_timings() const {
       return expected_timings_;
@@ -85,7 +91,7 @@
 
     void UpdateTiming(
         const mojom::PageLoadTimingPtr& timing,
-        const mojom::PageLoadMetadataPtr& metadata,
+        const mojom::FrameMetadataPtr& metadata,
         const mojom::PageLoadFeaturesPtr& new_features,
         const std::vector<mojom::ResourceDataUpdatePtr>& resources,
         const mojom::FrameRenderDataUpdate& render_data,
@@ -103,6 +109,8 @@
     std::set<blink::mojom::CSSSampleId> actual_css_properties_;
     mojom::FrameRenderDataUpdate expected_render_data_;
     mojom::FrameRenderDataUpdate actual_render_data_;
+    mojom::FrameIntersectionUpdatePtr expected_frame_intersection_update_;
+    mojom::FrameIntersectionUpdatePtr actual_frame_intersection_update_;
     DISALLOW_COPY_AND_ASSIGN(PageTimingValidator);
   };
 
@@ -110,7 +118,7 @@
   ~FakePageTimingSender() override;
   void SendTiming(
       const mojom::PageLoadTimingPtr& timing,
-      const mojom::PageLoadMetadataPtr& metadata,
+      const mojom::FrameMetadataPtr& metadata,
       mojom::PageLoadFeaturesPtr new_features,
       std::vector<mojom::ResourceDataUpdatePtr> resources,
       const mojom::FrameRenderDataUpdate& render_data,
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
index 8b0f33c..e04911bd 100644
--- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
+++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
@@ -16,6 +16,7 @@
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/loader/resource_type_util.h"
+#include "third_party/blink/public/platform/web_rect.h"
 #include "third_party/blink/public/web/web_document.h"
 #include "third_party/blink/public/web/web_document_loader.h"
 #include "third_party/blink/public/web/web_local_frame.h"
@@ -43,10 +44,10 @@
     render_frame->GetRemoteAssociatedInterfaces()->GetInterface(
         &page_load_metrics_);
   }
-  ~MojoPageTimingSender() override {}
+  ~MojoPageTimingSender() override = default;
   void SendTiming(
       const mojom::PageLoadTimingPtr& timing,
-      const mojom::PageLoadMetadataPtr& metadata,
+      const mojom::FrameMetadataPtr& metadata,
       mojom::PageLoadFeaturesPtr new_features,
       std::vector<mojom::ResourceDataUpdatePtr> resources,
       const mojom::FrameRenderDataUpdate& render_data,
@@ -278,6 +279,13 @@
   ad_request_ids_.insert(request_id);
 }
 
+void MetricsRenderFrameObserver::OnMainFrameDocumentIntersectionChanged(
+    const blink::WebRect& main_frame_document_intersection) {
+  if (page_timing_metrics_sender_)
+    page_timing_metrics_sender_->OnMainFrameDocumentIntersectionChanged(
+        main_frame_document_intersection);
+}
+
 void MetricsRenderFrameObserver::MaybeSetCompletedBeforeFCP(int request_id) {
   if (HasNoRenderFrame())
     return;
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.h b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
index 82bd4414..559167c 100644
--- a/components/page_load_metrics/renderer/metrics_render_frame_observer.h
+++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
@@ -17,6 +17,7 @@
 #include "content/public/renderer/render_frame_observer.h"
 #include "third_party/blink/public/common/loader/loading_behavior_flag.h"
 #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
+#include "third_party/blink/public/platform/web_rect.h"
 #include "third_party/blink/public/web/web_local_frame_client.h"
 
 class GURL;
@@ -87,6 +88,9 @@
   void OnAdResourceTrackerGoingAway() override;
   void OnAdResourceObserved(int request_id) override;
 
+  void OnMainFrameDocumentIntersectionChanged(
+      const blink::WebRect& main_frame_document_intersection) override;
+
  protected:
   // The relative and monotonic page load timings.
   struct Timing {
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
index f354e96..aefb357 100644
--- a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
+++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
@@ -17,6 +17,7 @@
 #include "components/page_load_metrics/renderer/page_timing_sender.h"
 #include "services/network/public/cpp/url_loader_completion_status.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
+#include "ui/gfx/geometry/rect.h"
 
 namespace page_load_metrics {
 
@@ -36,9 +37,8 @@
       timer_(std::move(timer)),
       last_timing_(std::move(initial_timing)),
       last_cpu_timing_(mojom::CpuTiming::New()),
-      metadata_(mojom::PageLoadMetadata::New()),
+      metadata_(mojom::FrameMetadata::New()),
       new_features_(mojom::PageLoadFeatures::New()),
-      render_data_(),
       new_deferred_resource_data_(mojom::DeferredResourceCounts::New()),
       buffer_timer_delay_ms_(kBufferTimerDelayMillis),
       metadata_recorder_(initial_monotonic_timing) {
@@ -206,6 +206,13 @@
   modified_resources_.insert(resource_it.first->second.get());
 }
 
+void PageTimingMetricsSender::OnMainFrameDocumentIntersectionChanged(
+    const blink::WebRect& main_frame_document_intersection) {
+  metadata_->intersection_update = mojom::FrameIntersectionUpdate::New(
+      gfx::Rect(main_frame_document_intersection));
+  EnsureSendTimer();
+}
+
 void PageTimingMetricsSender::UpdateResourceMetadata(
     int resource_id,
     bool reported_as_ad_resource,
@@ -288,6 +295,7 @@
                       std::move(new_deferred_resource_data_));
   new_deferred_resource_data_ = mojom::DeferredResourceCounts::New();
   new_features_ = mojom::PageLoadFeatures::New();
+  metadata_->intersection_update.reset();
   last_cpu_timing_->task_time = base::TimeDelta();
   modified_resources_.clear();
   render_data_.layout_shift_delta = 0;
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.h b/components/page_load_metrics/renderer/page_timing_metrics_sender.h
index 6427613..b379d322 100644
--- a/components/page_load_metrics/renderer/page_timing_metrics_sender.h
+++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.h
@@ -69,6 +69,8 @@
                                       int request_id,
                                       int64_t encoded_body_length,
                                       const std::string& mime_type);
+  void OnMainFrameDocumentIntersectionChanged(
+      const blink::WebRect& intersect_rect);
 
   // Updates the timing information. Buffers |timing| to be sent over mojo
   // sometime 'soon'.
@@ -102,7 +104,7 @@
 
   // The the sender keep track of metadata as it comes in, because the sender is
   // scoped to a single committed load.
-  mojom::PageLoadMetadataPtr metadata_;
+  mojom::FrameMetadataPtr metadata_;
   // A list of newly observed features during page load, to be sent to the
   // browser.
   mojom::PageLoadFeaturesPtr new_features_;
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc
index 8848a89..6ee825a 100644
--- a/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc
+++ b/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc
@@ -389,4 +389,21 @@
   validator_.VerifyExpectedRenderData();
 }
 
+TEST_F(PageTimingMetricsSenderTest, SendFrameIntersectionUpdate) {
+  mojom::PageLoadTiming timing;
+  InitPageLoadTimingForTest(&timing);
+  metrics_sender_->Update(timing.Clone(),
+                          PageTimingMetadataRecorder::MonotonicTiming());
+  validator_.ExpectPageLoadTiming(timing);
+
+  metrics_sender_->OnMainFrameDocumentIntersectionChanged(
+      blink::WebRect(0, 0, 1, 1));
+  mojom::FrameIntersectionUpdate frame_intersection_update(
+      gfx::Rect(0, 0, 1, 1));
+  validator_.UpdateExpectFrameIntersectionUpdate(frame_intersection_update);
+
+  metrics_sender_->mock_timer()->Fire();
+  validator_.VerifyExpectedFrameIntersectionUpdate();
+}
+
 }  // namespace page_load_metrics
diff --git a/components/page_load_metrics/renderer/page_timing_sender.h b/components/page_load_metrics/renderer/page_timing_sender.h
index 597e457..38190a2 100644
--- a/components/page_load_metrics/renderer/page_timing_sender.h
+++ b/components/page_load_metrics/renderer/page_timing_sender.h
@@ -13,10 +13,10 @@
 // timing through IPC.
 class PageTimingSender {
  public:
-  virtual ~PageTimingSender() {}
+  virtual ~PageTimingSender() = default;
   virtual void SendTiming(
       const mojom::PageLoadTimingPtr& timing,
-      const mojom::PageLoadMetadataPtr& metadata,
+      const mojom::FrameMetadataPtr& metadata,
       mojom::PageLoadFeaturesPtr new_features,
       std::vector<mojom::ResourceDataUpdatePtr> resources,
       const mojom::FrameRenderDataUpdate& render_data,
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
index 42be50e..b91ce442 100644
--- a/components/password_manager/core/browser/BUILD.gn
+++ b/components/password_manager/core/browser/BUILD.gn
@@ -204,16 +204,10 @@
     "statistics_table.h",
     "store_metrics_reporter.cc",
     "store_metrics_reporter.h",
-    "sync/password_data_type_controller.cc",
-    "sync/password_data_type_controller.h",
     "sync/password_model_type_controller.cc",
     "sync/password_model_type_controller.h",
-    "sync/password_model_worker.cc",
-    "sync/password_model_worker.h",
     "sync/password_sync_bridge.cc",
     "sync/password_sync_bridge.h",
-    "sync/password_syncable_service.cc",
-    "sync/password_syncable_service.h",
     "sync_credentials_filter.cc",
     "sync_credentials_filter.h",
     "ui/bulk_leak_check_service_adapter.cc",
@@ -574,7 +568,6 @@
     "statistics_table_unittest.cc",
     "store_metrics_reporter_unittest.cc",
     "sync/password_sync_bridge_unittest.cc",
-    "sync/password_syncable_service_unittest.cc",
     "sync_credentials_filter_unittest.cc",
     "sync_username_test_base.cc",
     "sync_username_test_base.h",
diff --git a/components/password_manager/core/browser/android_affiliation/affiliated_match_helper_unittest.cc b/components/password_manager/core/browser/android_affiliation/affiliated_match_helper_unittest.cc
index ef4e4a3e..1ec20b5 100644
--- a/components/password_manager/core/browser/android_affiliation/affiliated_match_helper_unittest.cc
+++ b/components/password_manager/core/browser/android_affiliation/affiliated_match_helper_unittest.cc
@@ -334,7 +334,7 @@
     mock_affiliation_service_ = service.get();
 
     password_store_ = new TestPasswordStore;
-    password_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+    password_store_->Init(nullptr);
 
     match_helper_.reset(
         new AffiliatedMatchHelper(password_store_.get(), std::move(service)));
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 6697b44..f38893c 100644
--- a/components/password_manager/core/browser/credential_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
@@ -198,7 +198,7 @@
 
   void SetUp() override {
     store_ = new TestPasswordStore;
-    store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+    store_->Init(nullptr);
     client_.reset(
         new testing::NiceMock<MockPasswordManagerClient>(store_.get()));
     cm_service_impl_.reset(new CredentialManagerImpl(client_.get()));
diff --git a/components/password_manager/core/browser/field_info_manager_unittest.cc b/components/password_manager/core/browser/field_info_manager_unittest.cc
index 85813a95..51f2181f 100644
--- a/components/password_manager/core/browser/field_info_manager_unittest.cc
+++ b/components/password_manager/core/browser/field_info_manager_unittest.cc
@@ -38,7 +38,7 @@
     test_data_.push_back({102u, 1u, SINGLE_USERNAME, Time::FromTimeT(10)});
 
     store_ = new MockPasswordStore;
-    store_->Init(syncer::SyncableService::StartSyncFlare(), /*prefs=*/nullptr);
+    store_->Init(/*prefs=*/nullptr);
     EXPECT_CALL(*store_, GetAllFieldInfoImpl());
     field_info_manager_ = std::make_unique<FieldInfoManagerImpl>(store_);
     task_environment_.RunUntilIdle();
diff --git a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc
index d646268..bfb9a0b2 100644
--- a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc
+++ b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc
@@ -197,7 +197,7 @@
                      kTestHttpURL,
                      GURL(kTestHttpURL)) {
     mock_store_ = new MockPasswordStore;
-    mock_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+    mock_store_->Init(nullptr);
     client_.set_store(mock_store_.get());
 
     if (!GetParam()) {
diff --git a/components/password_manager/core/browser/http_auth_manager_unittest.cc b/components/password_manager/core/browser/http_auth_manager_unittest.cc
index ff55fea..6874807 100644
--- a/components/password_manager/core/browser/http_auth_manager_unittest.cc
+++ b/components/password_manager/core/browser/http_auth_manager_unittest.cc
@@ -100,8 +100,7 @@
  protected:
   void SetUp() override {
     store_ = new testing::StrictMock<MockPasswordStore>;
-    ASSERT_TRUE(
-        store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr));
+    ASSERT_TRUE(store_->Init(nullptr));
 
     ON_CALL(client_, GetProfilePasswordStore())
         .WillByDefault(Return(store_.get()));
diff --git a/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc b/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc
index 4dd19f84..a4024a6 100644
--- a/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc
+++ b/components/password_manager/core/browser/http_credentials_cleaner_unittest.cc
@@ -140,7 +140,7 @@
                                              base::ASCIIToUTF16("pass1")};
 
   base::test::TaskEnvironment task_environment;
-  ASSERT_TRUE(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr));
+  ASSERT_TRUE(store_->Init(nullptr));
   TestCase test = GetParam();
   SCOPED_TRACE(testing::Message()
                << "is_hsts_enabled=" << test.is_hsts_enabled
@@ -252,8 +252,7 @@
 
     base::test::TaskEnvironment task_environment;
     auto password_store = base::MakeRefCounted<TestPasswordStore>();
-    ASSERT_TRUE(password_store->Init(syncer::SyncableService::StartSyncFlare(),
-                                     nullptr));
+    ASSERT_TRUE(password_store->Init(nullptr));
 
     double last_time =
         (base::Time::Now() - base::TimeDelta::FromMinutes(10)).ToDoubleT();
diff --git a/components/password_manager/core/browser/http_password_store_migrator_unittest.cc b/components/password_manager/core/browser/http_password_store_migrator_unittest.cc
index a40ccaab..689de82 100644
--- a/components/password_manager/core/browser/http_password_store_migrator_unittest.cc
+++ b/components/password_manager/core/browser/http_password_store_migrator_unittest.cc
@@ -120,7 +120,7 @@
   HttpPasswordStoreMigratorTest()
       : mock_store_(new testing::StrictMock<MockPasswordStore>),
         client_(mock_store_.get()) {
-    mock_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+    mock_store_->Init(nullptr);
   }
 
   ~HttpPasswordStoreMigratorTest() override {
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc
index 07e6569..fab35d6 100644
--- a/components/password_manager/core/browser/leak_detection_delegate.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -98,7 +98,7 @@
   CredentialLeakType leak_type = CreateLeakType(
       is_saved, is_reused,
       IsSyncing(client_->GetPasswordSyncState() == SYNCING_NORMAL_ENCRYPTION));
-  client_->NotifyUserCredentialsWereLeaked(leak_type, url);
+  client_->NotifyUserCredentialsWereLeaked(leak_type, url, username);
 }
 
 void LeakDetectionDelegate::OnError(LeakDetectionError error) {
diff --git a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
index 17b695ac..d3c0dd6 100644
--- a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
@@ -68,7 +68,7 @@
  protected:
   void SetUp() override {
     store_ = new testing::StrictMock<MockPasswordStore>;
-    CHECK(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr));
+    CHECK(store_->Init(nullptr));
 
     delegate_helper_ =
         std::make_unique<LeakDetectionDelegateHelper>(store_, callback_.Get());
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 3933d5a..f303641 100644
--- a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
@@ -62,8 +62,10 @@
 
   MOCK_CONST_METHOD0(IsIncognito, bool());
   MOCK_CONST_METHOD0(GetPrefs, PrefService*());
-  MOCK_METHOD2(NotifyUserCredentialsWereLeaked,
-               void(password_manager::CredentialLeakType, const GURL&));
+  MOCK_METHOD3(NotifyUserCredentialsWereLeaked,
+               void(password_manager::CredentialLeakType,
+                    const GURL&,
+                    const base::string16& username));
   MOCK_CONST_METHOD0(GetProfilePasswordStore, PasswordStore*());
 };
 
@@ -77,7 +79,7 @@
 class LeakDetectionDelegateTest : public testing::Test {
  public:
   LeakDetectionDelegateTest() {
-    mock_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+    mock_store_->Init(nullptr);
     auto mock_factory =
         std::make_unique<testing::StrictMock<MockLeakDetectionCheckFactory>>();
     mock_factory_ = mock_factory.get();
@@ -293,7 +295,7 @@
               NotifyUserCredentialsWereLeaked(
                   password_manager::CreateLeakType(
                       IsSaved(false), IsReused(false), IsSyncing(false)),
-                  form.origin));
+                  form.origin, form.username_value));
   delegate_interface->OnLeakDetectionDone(
       /*is_leaked=*/true, form.origin, form.username_value,
       form.password_value);
@@ -317,7 +319,8 @@
           Return(ByMove(std::make_unique<NiceMock<MockLeakDetectionCheck>>())));
   delegate().StartLeakCheck(form);
 
-  EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked(_, form.origin));
+  EXPECT_CALL(client(), NotifyUserCredentialsWereLeaked(_, form.origin,
+                                                        form.username_value));
   delegate_interface->OnLeakDetectionDone(
       /*is_leaked=*/true, form.origin, form.username_value,
       form.password_value);
diff --git a/components/password_manager/core/browser/mock_password_store.cc b/components/password_manager/core/browser/mock_password_store.cc
index c88b29a..1279df124 100644
--- a/components/password_manager/core/browser/mock_password_store.cc
+++ b/components/password_manager/core/browser/mock_password_store.cc
@@ -18,8 +18,7 @@
   return base::SequencedTaskRunnerHandle::Get();
 }
 
-bool MockPasswordStore::InitOnBackgroundSequence(
-    const syncer::SyncableService::StartSyncFlare& flare) {
+bool MockPasswordStore::InitOnBackgroundSequence() {
   return true;
 }
 
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h
index 8e5c66e53..11f2a3b 100644
--- a/components/password_manager/core/browser/mock_password_store.h
+++ b/components/password_manager/core/browser/mock_password_store.h
@@ -126,8 +126,7 @@
   // PasswordStore:
   scoped_refptr<base::SequencedTaskRunner> CreateBackgroundTaskRunner()
       const override;
-  bool InitOnBackgroundSequence(
-      const syncer::SyncableService::StartSyncFlare& flare) override;
+  bool InitOnBackgroundSequence() override;
 };
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc
index 67703118..9dbd37d 100644
--- a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc
+++ b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc
@@ -124,13 +124,11 @@
                      kTestHttpURL,
                      GURL(kTestHttpURL)) {
     profile_mock_store_ = new MockPasswordStore;
-    profile_mock_store_->Init(syncer::SyncableService::StartSyncFlare(),
-                              /*prefs=*/nullptr);
+    profile_mock_store_->Init(/*prefs=*/nullptr);
     client_.set_profile_store(profile_mock_store_.get());
 
     account_mock_store_ = new MockPasswordStore;
-    account_mock_store_->Init(syncer::SyncableService::StartSyncFlare(),
-                              /*prefs=*/nullptr);
+    account_mock_store_->Init(/*prefs=*/nullptr);
     client_.set_account_store(account_mock_store_.get());
 
     form_fetcher_ = std::make_unique<MultiStoreFormFetcher>(
diff --git a/components/password_manager/core/browser/password_manager_client.cc b/components/password_manager/core/browser/password_manager_client.cc
index 06380bb..3ec5d778 100644
--- a/components/password_manager/core/browser/password_manager_client.cc
+++ b/components/password_manager/core/browser/password_manager_client.cc
@@ -56,7 +56,8 @@
 
 void PasswordManagerClient::NotifyUserCredentialsWereLeaked(
     password_manager::CredentialLeakType leak_type,
-    const GURL& origin) {}
+    const GURL& origin,
+    const base::string16& username) {}
 
 void PasswordManagerClient::TriggerReauthForAccount(
     const CoreAccountId& account_id,
@@ -72,6 +73,10 @@
   return false;
 }
 
+bool PasswordManagerClient::WasCredentialLeakDialogShown() const {
+  return false;
+}
+
 net::CertStatus PasswordManagerClient::GetMainFrameCertStatus() const {
   return 0;
 }
diff --git a/components/password_manager/core/browser/password_manager_client.h b/components/password_manager/core/browser/password_manager_client.h
index 9f38f38..3f7ee0fa 100644
--- a/components/password_manager/core/browser/password_manager_client.h
+++ b/components/password_manager/core/browser/password_manager_client.h
@@ -232,7 +232,8 @@
 
   // Informs the embedder that user credentials were leaked.
   virtual void NotifyUserCredentialsWereLeaked(CredentialLeakType leak_type,
-                                               const GURL& origin);
+                                               const GURL& origin,
+                                               const base::string16& username);
 
   // Requests a reauth for the given |account_id| and triggers the
   // |reauth_callback| with ReauthSucceeded(true) if reauthentication succeeded.
@@ -256,6 +257,11 @@
   // Returns true if last navigation page had HTTP error i.e 5XX or 4XX
   virtual bool WasLastNavigationHTTPError() const;
 
+  // Returns true if a credential leak dialog was shown. Used by Autofill
+  // Assistance to verify a password change intent. TODO(b/151391231): Remove
+  // when proper intent signing is implemented.
+  virtual bool WasCredentialLeakDialogShown() const;
+
   // Obtains the cert status for the main frame.
   virtual net::CertStatus GetMainFrameCertStatus() const;
 
diff --git a/components/password_manager/core/browser/password_manager_onboarding_unittest.cc b/components/password_manager/core/browser/password_manager_onboarding_unittest.cc
index 5597300..63cc640 100644
--- a/components/password_manager/core/browser/password_manager_onboarding_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_onboarding_unittest.cc
@@ -42,7 +42,7 @@
 
   void SetUp() override {
     store_ = new TestPasswordStore;
-    store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+    store_->Init(nullptr);
 
     prefs_.reset(new TestingPrefServiceSimple());
     prefs_->registry()->RegisterIntegerPref(
diff --git a/components/password_manager/core/browser/password_manager_test_utils.h b/components/password_manager/core/browser/password_manager_test_utils.h
index e058e3d1..451f5bac 100644
--- a/components/password_manager/core/browser/password_manager_test_utils.h
+++ b/components/password_manager/core/browser/password_manager_test_utils.h
@@ -30,7 +30,7 @@
 template <class Context, class Store>
 scoped_refptr<RefcountedKeyedService> BuildPasswordStore(Context* context) {
   scoped_refptr<password_manager::PasswordStore> store(new Store);
-  if (!store->Init(syncer::SyncableService::StartSyncFlare(), nullptr))
+  if (!store->Init(nullptr))
     return nullptr;
   return store;
 }
@@ -45,7 +45,7 @@
     Context* context) {
   scoped_refptr<password_manager::PasswordStore> store(
       new Store(std::forward<Args>(args)...));
-  if (!store->Init(syncer::SyncableService::StartSyncFlare(), nullptr))
+  if (!store->Init(nullptr))
     return nullptr;
   return store;
 }
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index 77284f1f..33eb222 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -304,7 +304,7 @@
   void SetUp() override {
     store_ = new testing::StrictMock<MockPasswordStore>;
     EXPECT_CALL(*store_, ReportMetrics(_, _, _)).Times(AnyNumber());
-    CHECK(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr));
+    CHECK(store_->Init(nullptr));
 
     ON_CALL(client_, GetProfilePasswordStore())
         .WillByDefault(Return(store_.get()));
diff --git a/components/password_manager/core/browser/password_reuse_detection_manager_unittest.cc b/components/password_manager/core/browser/password_reuse_detection_manager_unittest.cc
index 7b5bc51..6f641a8 100644
--- a/components/password_manager/core/browser/password_reuse_detection_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_reuse_detection_manager_unittest.cc
@@ -40,10 +40,10 @@
 
 class PasswordReuseDetectionManagerTest : public ::testing::Test {
  public:
-  PasswordReuseDetectionManagerTest() {}
+  PasswordReuseDetectionManagerTest() = default;
   void SetUp() override {
     store_ = new testing::StrictMock<MockPasswordStore>;
-    CHECK(store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr));
+    CHECK(store_->Init(nullptr));
   }
   void TearDown() override {
     store_->ShutdownOnUIThread();
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc
index 6d23d1e..ca3d6ed 100644
--- a/components/password_manager/core/browser/password_store.cc
+++ b/components/password_manager/core/browser/password_store.cc
@@ -35,10 +35,8 @@
 #include "components/password_manager/core/browser/password_store_consumer.h"
 #include "components/password_manager/core/browser/statistics_table.h"
 #include "components/password_manager/core/browser/sync/password_sync_bridge.h"
-#include "components/password_manager/core/browser/sync/password_syncable_service.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/model_impl/client_tag_based_model_type_processor.h"
 #include "components/sync/model_impl/proxy_model_type_controller_delegate.h"
 
@@ -143,8 +141,7 @@
       shutdown_called_(false),
       init_status_(InitStatus::kUnknown) {}
 
-bool PasswordStore::Init(const syncer::SyncableService::StartSyncFlare& flare,
-                         PrefService* prefs,
+bool PasswordStore::Init(PrefService* prefs,
                          base::RepeatingClosure sync_enabled_or_disabled_cb) {
   main_task_runner_ = base::SequencedTaskRunnerHandle::Get();
   DCHECK(main_task_runner_);
@@ -160,7 +157,7 @@
         "passwords", "PasswordStore::InitOnBackgroundSequence", this);
     base::PostTaskAndReplyWithResult(
         background_task_runner_.get(), FROM_HERE,
-        base::BindOnce(&PasswordStore::InitOnBackgroundSequence, this, flare),
+        base::BindOnce(&PasswordStore::InitOnBackgroundSequence, this),
         base::BindOnce(&PasswordStore::OnInitCompleted, this));
   }
 
@@ -480,13 +477,6 @@
 #endif
 }
 
-base::WeakPtr<syncer::SyncableService>
-PasswordStore::GetPasswordSyncableService() {
-  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
-  DCHECK(syncable_service_);
-  return syncable_service_->AsWeakPtr();
-}
-
 std::unique_ptr<syncer::ProxyModelTypeControllerDelegate>
 PasswordStore::CreateSyncControllerDelegate() {
   DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
@@ -638,19 +628,12 @@
       {base::MayBlock(), base::TaskPriority::USER_VISIBLE});
 }
 
-bool PasswordStore::InitOnBackgroundSequence(
-    const syncer::SyncableService::StartSyncFlare& flare) {
+bool PasswordStore::InitOnBackgroundSequence() {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
-  if (base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) {
-    sync_bridge_.reset(new PasswordSyncBridge(
-        std::make_unique<syncer::ClientTagBasedModelTypeProcessor>(
-            syncer::PASSWORDS, base::DoNothing()),
-        /*password_store_sync=*/this, sync_enabled_or_disabled_cb_));
-  } else {
-    DCHECK(!syncable_service_);
-    syncable_service_.reset(new PasswordSyncableService(this));
-    syncable_service_->InjectStartSyncFlare(flare);
-  }
+  sync_bridge_.reset(new PasswordSyncBridge(
+      std::make_unique<syncer::ClientTagBasedModelTypeProcessor>(
+          syncer::PASSWORDS, base::DoNothing()),
+      /*password_store_sync=*/this, sync_enabled_or_disabled_cb_));
 
 #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
   reuse_detector_ = new PasswordReuseDetector;
@@ -703,8 +686,6 @@
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   if (!changes.empty()) {
     observers_->Notify(FROM_HERE, &Observer::OnLoginsChanged, changes);
-    if (syncable_service_)
-      syncable_service_->ActOnPasswordStoreChanges(changes);
     if (sync_bridge_)
       sync_bridge_->ActOnPasswordStoreChanges(changes);
 
@@ -1228,7 +1209,6 @@
 
 void PasswordStore::DestroyOnBackgroundSequence() {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
-  syncable_service_.reset();
   sync_bridge_.reset();
 
 #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h
index 759a4e1f..2b7f639 100644
--- a/components/password_manager/core/browser/password_store.h
+++ b/components/password_manager/core/browser/password_store.h
@@ -24,7 +24,6 @@
 #include "components/password_manager/core/browser/compromised_credentials_table.h"
 #include "components/password_manager/core/browser/password_store_change.h"
 #include "components/password_manager/core/browser/password_store_sync.h"
-#include "components/sync/model/syncable_service.h"
 
 #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 #include "components/password_manager/core/browser/hash_password_manager.h"
@@ -43,8 +42,7 @@
 namespace syncer {
 class ModelTypeControllerDelegate;
 class ProxyModelTypeControllerDelegate;
-class SyncableService;
-}
+}  // namespace syncer
 
 using StateSubscription =
     base::CallbackList<void(const std::string& username)>::Subscription;
@@ -60,7 +58,6 @@
 class PasswordStoreConsumer;
 class CompromisedCredentialsConsumer;
 class PasswordStoreSigninNotifier;
-class PasswordSyncableService;
 class PasswordSyncBridge;
 struct FieldInfo;
 struct InteractionsStats;
@@ -79,7 +76,7 @@
 // this manner. If this deferred initialization fails, all subsequent method
 // calls should fail without side effects, return no data, and send no
 // notifications. PasswordStoreSync is a hidden base class because only
-// PasswordSyncableService needs to access these methods.
+// PasswordSyncBridge needs to access these methods.
 class PasswordStore : protected PasswordStoreSync,
                       public RefcountedKeyedService {
  public:
@@ -133,7 +130,6 @@
 
   // Always call this too on the UI thread.
   bool Init(
-      const syncer::SyncableService::StartSyncFlare& flare,
       PrefService* prefs,
       base::RepeatingClosure sync_enabled_or_disabled_cb = base::DoNothing());
 
@@ -319,8 +315,6 @@
   // Returns true iff initialization was successful.
   virtual bool IsAbleToSavePasswords() const;
 
-  base::WeakPtr<syncer::SyncableService> GetPasswordSyncableService();
-
   // For sync codebase only: instantiates a proxy controller delegate to
   // interact with PasswordSyncBridge. Must be called from the UI thread.
   std::unique_ptr<syncer::ProxyModelTypeControllerDelegate>
@@ -443,11 +437,10 @@
   virtual scoped_refptr<base::SequencedTaskRunner> CreateBackgroundTaskRunner()
       const;
 
-  // Creates PasswordSyncableService and PasswordReuseDetector instances on the
+  // Creates PasswordSyncBridge and PasswordReuseDetector instances on the
   // background sequence. Subclasses can add more logic. Returns true on
   // success.
-  virtual bool InitOnBackgroundSequence(
-      const syncer::SyncableService::StartSyncFlare& flare);
+  virtual bool InitOnBackgroundSequence();
 
   // Methods below will be run in PasswordStore's own sequence.
   // Synchronous implementation that reports usage metrics.
@@ -797,8 +790,6 @@
           base::MakeRefCounted<base::ObserverListThreadSafe<
               DatabaseCompromisedCredentialsObserver>>();
 
-  // Either of two below would actually be set based on a feature flag.
-  std::unique_ptr<PasswordSyncableService> syncable_service_;
   std::unique_ptr<PasswordSyncBridge> sync_bridge_;
 
   base::RepeatingClosure sync_enabled_or_disabled_cb_;
diff --git a/components/password_manager/core/browser/password_store_default.cc b/components/password_manager/core/browser/password_store_default.cc
index 41a094e..0d1f379 100644
--- a/components/password_manager/core/browser/password_store_default.cc
+++ b/components/password_manager/core/browser/password_store_default.cc
@@ -30,19 +30,18 @@
   ScheduleTask(base::BindOnce(&PasswordStoreDefault::ResetLoginDB, this));
 }
 
-bool PasswordStoreDefault::InitOnBackgroundSequence(
-    const syncer::SyncableService::StartSyncFlare& flare) {
+bool PasswordStoreDefault::InitOnBackgroundSequence() {
   DCHECK(background_task_runner()->RunsTasksInCurrentSequence());
   DCHECK(login_db_);
   bool success = true;
   if (!login_db_->Init()) {
     login_db_.reset();
-    // The initialization should be continued, because PasswordSyncableService
+    // The initialization should be continued, because PasswordSyncBridge
     // has to be initialized even if database initialization failed.
     success = false;
     LOG(ERROR) << "Could not create/open login database.";
   }
-  return PasswordStore::InitOnBackgroundSequence(flare) && success;
+  return PasswordStore::InitOnBackgroundSequence() && success;
 }
 
 void PasswordStoreDefault::ReportMetricsImpl(
diff --git a/components/password_manager/core/browser/password_store_default.h b/components/password_manager/core/browser/password_store_default.h
index 456d8d8c..430b954 100644
--- a/components/password_manager/core/browser/password_store_default.h
+++ b/components/password_manager/core/browser/password_store_default.h
@@ -33,8 +33,7 @@
   ~PasswordStoreDefault() override;
 
   // Opens |login_db_| on the background sequence.
-  bool InitOnBackgroundSequence(
-      const syncer::SyncableService::StartSyncFlare& flare) override;
+  bool InitOnBackgroundSequence() override;
 
   // Implements PasswordStore interface.
   void ReportMetricsImpl(const std::string& sync_username,
diff --git a/components/password_manager/core/browser/password_store_default_unittest.cc b/components/password_manager/core/browser/password_store_default_unittest.cc
index 2fb9da7..0be0cec 100644
--- a/components/password_manager/core/browser/password_store_default_unittest.cc
+++ b/components/password_manager/core/browser/password_store_default_unittest.cc
@@ -144,7 +144,7 @@
     std::unique_ptr<LoginDatabase> database) {
   scoped_refptr<PasswordStoreDefault> store(
       new PasswordStoreDefault(std::move(database)));
-  store->Init(syncer::SyncableService::StartSyncFlare(), &prefs_);
+  store->Init(&prefs_);
 
   return store;
 }
diff --git a/components/password_manager/core/browser/password_store_factory_util.h b/components/password_manager/core/browser/password_store_factory_util.h
index eaef85ac4..e1162d41 100644
--- a/components/password_manager/core/browser/password_store_factory_util.h
+++ b/components/password_manager/core/browser/password_store_factory_util.h
@@ -14,7 +14,6 @@
 #include "components/password_manager/core/browser/login_database.h"
 #include "components/password_manager/core/browser/password_store.h"
 #include "components/sync/driver/sync_service.h"
-#include "components/sync/model/syncable_service.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace network {
diff --git a/components/password_manager/core/browser/password_store_sync.h b/components/password_manager/core/browser/password_store_sync.h
index b03d1062..c07fad13d 100644
--- a/components/password_manager/core/browser/password_store_sync.h
+++ b/components/password_manager/core/browser/password_store_sync.h
@@ -89,7 +89,7 @@
   kMaxValue = kDbError,
 };
 
-// PasswordStore interface for PasswordSyncableService. It provides access to
+// PasswordStore interface for PasswordSyncBridge. It provides access to
 // synchronous methods of PasswordStore which shouldn't be accessible to other
 // classes. These methods are to be called on the PasswordStore background
 // thread only.
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc
index d12a983..0380659 100644
--- a/components/password_manager/core/browser/password_store_unittest.cc
+++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -36,7 +36,6 @@
 #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/sync/driver/sync_driver_switches.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -123,16 +122,6 @@
   MOCK_METHOD0(UnsubscribeFromSigninEvents, void());
 };
 
-class StartSyncFlareMock {
- public:
-  StartSyncFlareMock() = default;
-
-  MOCK_METHOD1(StartSyncFlare, void(syncer::ModelType));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(StartSyncFlareMock);
-};
-
 }  // namespace
 
 class PasswordStoreTest : public testing::Test {
@@ -179,7 +168,7 @@
 
 TEST_F(PasswordStoreTest, IgnoreOldWwwGoogleLogins) {
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   const time_t cutoff = 1325376000;           // 00:00 Jan 1 2012 UTC
   const time_t last_usage_time = 1546300800;  // 00:00 Jan 1 2019 UTC
@@ -268,26 +257,6 @@
   store->ShutdownOnUIThread();
 }
 
-TEST_F(PasswordStoreTest, StartSyncFlare) {
-  // This test isn't relevant for USS code path.
-  if (base::FeatureList::IsEnabled(switches::kSyncUSSPasswords))
-    return;
-  scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  StartSyncFlareMock mock;
-  store->Init(
-      base::Bind(&StartSyncFlareMock::StartSyncFlare, base::Unretained(&mock)),
-      nullptr);
-
-  PasswordForm form;
-  form.origin = GURL("http://accounts.google.com/LoginAuth");
-  form.signon_realm = "http://accounts.google.com/";
-  EXPECT_CALL(mock, StartSyncFlare(syncer::PASSWORDS));
-  store->AddLogin(form);
-  WaitForPasswordStore();
-
-  store->ShutdownOnUIThread();
-}
-
 TEST_F(PasswordStoreTest, UpdateLoginPrimaryKeyFields) {
   /* clang-format off */
   static const PasswordFormData kTestCredentials[] = {
@@ -308,7 +277,7 @@
   /* clang-format on */
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   std::unique_ptr<PasswordForm> old_form(
       FillPasswordFormWithData(kTestCredentials[0]));
@@ -359,7 +328,7 @@
   /* clang-format on */
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   std::unique_ptr<PasswordForm> test_form(
       FillPasswordFormWithData(kTestCredential));
@@ -391,7 +360,7 @@
       base::Time::FromTimeT(1), CompromiseType::kLeaked};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   store->AddCompromisedCredentials(compromised_credentials);
 
@@ -433,7 +402,7 @@
       kTestWebRealm1, base::ASCIIToUTF16("username_value_1"),
       base::Time::FromTimeT(1), CompromiseType::kLeaked};
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   store->AddCompromisedCredentials(compromised_credentials);
 
@@ -475,7 +444,7 @@
       kTestWebRealm1, base::ASCIIToUTF16("username_value_1"),
       base::Time::FromTimeT(1), CompromiseType::kLeaked};
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   store->AddCompromisedCredentials(compromised_credentials);
 
@@ -519,7 +488,7 @@
       base::Time::FromTimeT(1), CompromiseType::kLeaked};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
   store->AddDatabaseCompromisedCredentialsObserver(&observer);
 
   // Expect a notification after adding a credential.
@@ -546,7 +515,7 @@
       base::Time::FromTimeT(1), CompromiseType::kLeaked};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
   store->AddCompromisedCredentials(compromised_credentials);
   WaitForPasswordStore();
 
@@ -580,7 +549,7 @@
       base::Time::FromTimeT(1), CompromiseType::kLeaked};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
   store->AddCompromisedCredentials(compromised_credentials);
   WaitForPasswordStore();
 
@@ -625,7 +594,7 @@
   /* clang-format on */
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   std::vector<std::unique_ptr<PasswordForm>> all_credentials;
   for (size_t i = 0; i < base::size(kTestCredentials); ++i) {
@@ -724,7 +693,7 @@
       }};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   std::vector<std::unique_ptr<PasswordForm>> all_credentials;
   for (const auto& i : kTestCredentials) {
@@ -891,7 +860,7 @@
                  << test_remove_and_add_login);
 
     scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-    store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+    store->Init(nullptr);
     store->RemoveLoginsCreatedBetween(base::Time(), base::Time::Max(),
                                       base::Closure());
 
@@ -988,7 +957,7 @@
        L"", L"", nullptr, L"", true, 1}};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   std::vector<std::unique_ptr<PasswordForm>> all_credentials;
   for (const auto& test_credential : kTestCredentials) {
@@ -1038,7 +1007,7 @@
        L"", L"", nullptr, tested_password, true, 1}};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   std::vector<std::unique_ptr<PasswordForm>> all_credentials;
   for (const auto& test_credential : kTestCredentials) {
@@ -1093,7 +1062,7 @@
        L"", L"", nullptr, L"", true, 1}};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   std::vector<std::unique_ptr<PasswordForm>> all_credentials;
   for (const auto& test_credential : kTestCredentials) {
@@ -1168,7 +1137,7 @@
        kTestUnrelatedWebOrigin2, "", L"", L"", L"", L"username", L"", true, 1}};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   std::vector<std::unique_ptr<PasswordForm>> all_credentials;
   for (const auto& test_credential : kTestCredentials) {
@@ -1213,7 +1182,7 @@
        "https://facebook.com", "", L"", L"", L"", L"", L"topsecret", true, 1}};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   for (const auto& test_credentials : kTestCredentials) {
     auto credentials = FillPasswordFormWithData(test_credentials);
@@ -1257,7 +1226,7 @@
   prefs.registry()->RegisterListPref(prefs::kPasswordHashDataList,
                                      PrefRegistry::NO_REGISTRATION_FLAGS);
   ASSERT_FALSE(prefs.HasPrefPath(prefs::kSyncPasswordHash));
-  store->Init(syncer::SyncableService::StartSyncFlare(), &prefs);
+  store->Init(&prefs);
 
   const base::string16 sync_password = base::ASCIIToUTF16("password");
   const base::string16 input = base::ASCIIToUTF16("123password");
@@ -1415,7 +1384,7 @@
   prefs.registry()->RegisterListPref(prefs::kPasswordHashDataList,
                                      PrefRegistry::NO_REGISTRATION_FLAGS);
   ASSERT_FALSE(prefs.HasPrefPath(prefs::kSyncPasswordHash));
-  store->Init(syncer::SyncableService::StartSyncFlare(), &prefs);
+  store->Init(&prefs);
 
   // Hash does not exist yet.
   base::HistogramTester histogram_tester;
@@ -1449,7 +1418,7 @@
   prefs.registry()->RegisterListPref(prefs::kPasswordHashDataList,
                                      PrefRegistry::NO_REGISTRATION_FLAGS);
   ASSERT_FALSE(prefs.HasPrefPath(prefs::kSyncPasswordHash));
-  store->Init(syncer::SyncableService::StartSyncFlare(), &prefs);
+  store->Init(&prefs);
 
   // Hash does not exist yet.
   base::HistogramTester histogram_tester;
@@ -1493,7 +1462,7 @@
       base::Time::FromTimeT(2), CompromiseType::kLeaked};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   store->AddCompromisedCredentials(compromised_credentials);
   store->AddCompromisedCredentials(compromised_credentials2);
@@ -1530,7 +1499,7 @@
       base::Time::FromTimeT(300), CompromiseType::kLeaked};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   store->AddCompromisedCredentials(compromised_credentials1);
   store->AddCompromisedCredentials(compromised_credentials2);
@@ -1567,7 +1536,7 @@
   FieldInfo field_info2{1002 /*form_signature*/, 10 /* field_signature */,
                         autofill::PASSWORD, base::Time::FromTimeT(2)};
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   store->AddFieldInfo(field_info1);
   store->AddFieldInfo(field_info2);
@@ -1590,7 +1559,7 @@
                         autofill::PASSWORD, base::Time::FromTimeT(300)};
 
   scoped_refptr<PasswordStoreDefault> store = CreatePasswordStore();
-  store->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store->Init(nullptr);
 
   store->AddFieldInfo(field_info1);
   store->AddFieldInfo(field_info2);
diff --git a/components/password_manager/core/browser/sync/password_data_type_controller.cc b/components/password_manager/core/browser/sync/password_data_type_controller.cc
deleted file mode 100644
index 5d6ef22..0000000
--- a/components/password_manager/core/browser/sync/password_data_type_controller.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/password_manager/core/browser/sync/password_data_type_controller.h"
-
-#include "base/bind.h"
-#include "base/metrics/histogram.h"
-#include "components/password_manager/core/browser/password_store.h"
-#include "components/sync/driver/sync_client.h"
-#include "components/sync/driver/sync_service.h"
-
-namespace browser_sync {
-
-PasswordDataTypeController::PasswordDataTypeController(
-    const base::RepeatingClosure& dump_stack,
-    syncer::SyncService* sync_service,
-    syncer::SyncClient* sync_client,
-    const base::RepeatingClosure& state_changed_callback,
-    const scoped_refptr<password_manager::PasswordStore>& password_store)
-    : AsyncDirectoryTypeController(syncer::PASSWORDS,
-                                   dump_stack,
-                                   sync_service,
-                                   sync_client,
-                                   syncer::GROUP_PASSWORD,
-                                   nullptr),
-      state_changed_callback_(state_changed_callback),
-      password_store_(password_store) {}
-
-PasswordDataTypeController::~PasswordDataTypeController() {}
-
-bool PasswordDataTypeController::PostTaskOnModelThread(
-    const base::Location& from_here,
-    base::OnceClosure task) {
-  DCHECK(CalledOnValidThread());
-  if (!password_store_)
-    return false;
-  return password_store_->ScheduleTask(std::move(task));
-}
-
-bool PasswordDataTypeController::StartModels() {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(MODEL_STARTING, state());
-
-  sync_service()->AddObserver(this);
-
-  OnStateChanged(sync_service());
-
-  return !!password_store_;
-}
-
-void PasswordDataTypeController::StopModels() {
-  DCHECK(CalledOnValidThread());
-  sync_service()->RemoveObserver(this);
-}
-
-void PasswordDataTypeController::OnStateChanged(syncer::SyncService* sync) {
-  DCHECK(CalledOnValidThread());
-  state_changed_callback_.Run();
-}
-
-}  // namespace browser_sync
diff --git a/components/password_manager/core/browser/sync/password_data_type_controller.h b/components/password_manager/core/browser/sync/password_data_type_controller.h
deleted file mode 100644
index 6e847490..0000000
--- a/components/password_manager/core/browser/sync/password_data_type_controller.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_DATA_TYPE_CONTROLLER_H_
-#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_DATA_TYPE_CONTROLLER_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "components/sync/driver/async_directory_type_controller.h"
-#include "components/sync/driver/sync_service_observer.h"
-
-namespace password_manager {
-class PasswordStore;
-}
-
-namespace syncer {
-class SyncClient;
-class SyncService;
-}
-
-namespace browser_sync {
-
-// A class that manages the startup and shutdown of password sync.
-class PasswordDataTypeController : public syncer::AsyncDirectoryTypeController,
-                                   public syncer::SyncServiceObserver {
- public:
-  // |dump_stack| is called when an unrecoverable error occurs.
-  PasswordDataTypeController(
-      const base::RepeatingClosure& dump_stack,
-      syncer::SyncService* sync_service,
-      syncer::SyncClient* sync_client,
-      const base::RepeatingClosure& state_changed_callback,
-      const scoped_refptr<password_manager::PasswordStore>& password_store);
-  ~PasswordDataTypeController() override;
-
- protected:
-  // AsyncDirectoryTypeController interface.
-  bool PostTaskOnModelThread(const base::Location& from_here,
-                             base::OnceClosure task) override;
-  bool StartModels() override;
-  void StopModels() override;
-
-  // syncer::SyncServiceObserver:
-  void OnStateChanged(syncer::SyncService* sync) override;
-
- private:
-  const base::RepeatingClosure state_changed_callback_;
-  scoped_refptr<password_manager::PasswordStore> password_store_;
-
-  DISALLOW_COPY_AND_ASSIGN(PasswordDataTypeController);
-};
-
-}  // namespace browser_sync
-
-#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_DATA_TYPE_CONTROLLER_H_
diff --git a/components/password_manager/core/browser/sync/password_model_worker.cc b/components/password_manager/core/browser/sync/password_model_worker.cc
deleted file mode 100644
index 9314d1c6..0000000
--- a/components/password_manager/core/browser/sync/password_model_worker.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 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.
-
-#include "components/password_manager/core/browser/sync/password_model_worker.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "components/password_manager/core/browser/password_store.h"
-
-namespace browser_sync {
-
-PasswordModelWorker::PasswordModelWorker(
-    const scoped_refptr<password_manager::PasswordStore>& password_store)
-    : password_store_(password_store) {
-  DCHECK(password_store);
-}
-
-syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() {
-  return syncer::GROUP_PASSWORD;
-}
-
-bool PasswordModelWorker::IsOnModelSequence() {
-  // Ideally PasswordStore would expose a way to check whether this is the
-  // thread it does work on. Since it doesn't, just return true to bypass a
-  // CHECK in the sync code.
-  return true;
-}
-
-PasswordModelWorker::~PasswordModelWorker() {}
-
-void PasswordModelWorker::ScheduleWork(base::OnceClosure work) {
-  base::AutoLock lock(password_store_lock_);
-  if (password_store_) {
-    password_store_->ScheduleTask(std::move(work));
-  }
-}
-
-void PasswordModelWorker::RequestStop() {
-  ModelSafeWorker::RequestStop();
-
-  base::AutoLock lock(password_store_lock_);
-  password_store_ = nullptr;
-}
-
-}  // namespace browser_sync
diff --git a/components/password_manager/core/browser/sync/password_model_worker.h b/components/password_manager/core/browser/sync/password_model_worker.h
deleted file mode 100644
index 6c43209..0000000
--- a/components/password_manager/core/browser/sync/password_model_worker.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 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 COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_WORKER_H_
-#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_WORKER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "components/sync/engine/model_safe_worker.h"
-
-namespace password_manager {
-class PasswordStore;
-}
-
-namespace browser_sync {
-
-// A syncer::ModelSafeWorker for password models that accepts requests
-// from the syncapi that need to be fulfilled on the password thread,
-// which is the DB thread on Linux and Windows.
-class PasswordModelWorker : public syncer::ModelSafeWorker {
- public:
-  PasswordModelWorker(
-      const scoped_refptr<password_manager::PasswordStore>& password_store);
-
-  // syncer::ModelSafeWorker implementation.
-  syncer::ModelSafeGroup GetModelSafeGroup() override;
-  bool IsOnModelSequence() override;
-  void RequestStop() override;
-
- private:
-  ~PasswordModelWorker() override;
-
-  void ScheduleWork(base::OnceClosure work) override;
-
-  // |password_store_| is used on password thread but released on UI thread.
-  // Protected by |password_store_lock_|.
-  base::Lock password_store_lock_;
-  scoped_refptr<password_manager::PasswordStore> password_store_;
-  DISALLOW_COPY_AND_ASSIGN(PasswordModelWorker);
-};
-
-}  // namespace browser_sync
-
-#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_WORKER_H_
diff --git a/components/password_manager/core/browser/sync/password_syncable_service.cc b/components/password_manager/core/browser/sync/password_syncable_service.cc
deleted file mode 100644
index bad5601..0000000
--- a/components/password_manager/core/browser/sync/password_syncable_service.cc
+++ /dev/null
@@ -1,558 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/password_manager/core/browser/sync/password_syncable_service.h"
-
-#include <algorithm>
-#include <iterator>
-#include <memory>
-#include <utility>
-
-#include "base/auto_reset.h"
-#include "base/location.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "components/autofill/core/common/password_form.h"
-#include "components/password_manager/core/browser/password_manager_metrics_util.h"
-#include "components/password_manager/core/browser/password_store_sync.h"
-#include "components/password_manager/core/common/password_manager_features.h"
-#include "components/sync/model/sync_change_processor.h"
-#include "components/sync/model/sync_error_factory.h"
-#include "net/base/escape.h"
-
-namespace password_manager {
-
-// Converts the |password| into a SyncData object.
-syncer::SyncData SyncDataFromPassword(const autofill::PasswordForm& password);
-
-// Extracts the |PasswordForm| data from sync's protobuf format.
-autofill::PasswordForm PasswordFromSpecifics(
-    const sync_pb::PasswordSpecificsData& password);
-
-// Returns the unique tag that will serve as the sync identifier for the
-// |password| entry.
-std::string MakePasswordSyncTag(const sync_pb::PasswordSpecificsData& password);
-std::string MakePasswordSyncTag(const autofill::PasswordForm& password);
-
-namespace {
-
-// Returns true iff |password_specifics| and |password_specifics| are equal
-// memberwise.
-bool AreLocalAndSyncPasswordsEqual(
-    const sync_pb::PasswordSpecificsData& password_specifics,
-    const autofill::PasswordForm& password_form) {
-  return (
-      static_cast<int>(password_form.scheme) == password_specifics.scheme() &&
-      password_form.signon_realm == password_specifics.signon_realm() &&
-      password_form.origin.spec() == password_specifics.origin() &&
-      password_form.action.spec() == password_specifics.action() &&
-      base::UTF16ToUTF8(password_form.username_element) ==
-          password_specifics.username_element() &&
-      base::UTF16ToUTF8(password_form.password_element) ==
-          password_specifics.password_element() &&
-      base::UTF16ToUTF8(password_form.username_value) ==
-          password_specifics.username_value() &&
-      base::UTF16ToUTF8(password_form.password_value) ==
-          password_specifics.password_value() &&
-      password_form.date_last_used.ToDeltaSinceWindowsEpoch()
-              .InMicroseconds() == password_specifics.date_last_used() &&
-      password_form.date_created.ToInternalValue() ==
-          password_specifics.date_created() &&
-      password_form.blacklisted_by_user == password_specifics.blacklisted() &&
-      static_cast<int>(password_form.type) == password_specifics.type() &&
-      password_form.times_used == password_specifics.times_used() &&
-      base::UTF16ToUTF8(password_form.display_name) ==
-          password_specifics.display_name() &&
-      password_form.icon_url.spec() == password_specifics.avatar_url() &&
-      url::Origin::Create(GURL(password_specifics.federation_url()))
-              .Serialize() == password_form.federation_origin.Serialize());
-}
-
-syncer::SyncChange::SyncChangeType GetSyncChangeType(
-    PasswordStoreChange::Type type) {
-  switch (type) {
-    case PasswordStoreChange::ADD:
-      return syncer::SyncChange::ACTION_ADD;
-    case PasswordStoreChange::UPDATE:
-      return syncer::SyncChange::ACTION_UPDATE;
-    case PasswordStoreChange::REMOVE:
-      return syncer::SyncChange::ACTION_DELETE;
-  }
-  NOTREACHED();
-  return syncer::SyncChange::ACTION_INVALID;
-}
-
-// Creates a PasswordForm from |specifics| and |sync_time|, appends it to
-// |entries|.
-void AppendPasswordFromSpecifics(
-    const sync_pb::PasswordSpecificsData& specifics,
-    base::Time sync_time,
-    std::vector<std::unique_ptr<autofill::PasswordForm>>* entries) {
-  entries->push_back(std::make_unique<autofill::PasswordForm>(
-      PasswordFromSpecifics(specifics)));
-  entries->back()->date_synced = sync_time;
-}
-
-}  // namespace
-
-struct PasswordSyncableService::SyncEntries {
-  std::vector<std::unique_ptr<autofill::PasswordForm>>* EntriesForChangeType(
-      syncer::SyncChange::SyncChangeType type) {
-    switch (type) {
-      case syncer::SyncChange::ACTION_ADD:
-        return &new_entries;
-      case syncer::SyncChange::ACTION_UPDATE:
-        return &updated_entries;
-      case syncer::SyncChange::ACTION_DELETE:
-        return &deleted_entries;
-      case syncer::SyncChange::ACTION_INVALID:
-        return nullptr;
-    }
-    NOTREACHED();
-    return nullptr;
-  }
-
-  // List that contains the entries that are known only to sync.
-  std::vector<std::unique_ptr<autofill::PasswordForm>> new_entries;
-
-  // List that contains the entries that are known to both sync and the local
-  // database but have updates in sync. They need to be updated in the local
-  // database.
-  std::vector<std::unique_ptr<autofill::PasswordForm>> updated_entries;
-
-  // The list of entries to be deleted from the local database.
-  std::vector<std::unique_ptr<autofill::PasswordForm>> deleted_entries;
-};
-
-PasswordSyncableService::PasswordSyncableService(
-    PasswordStoreSync* password_store)
-    : password_store_(password_store), is_processing_sync_changes_(false) {}
-
-PasswordSyncableService::~PasswordSyncableService() = default;
-
-void PasswordSyncableService::WaitUntilReadyToSync(base::OnceClosure done) {
-  // PasswordStore becomes ready upon construction.
-  std::move(done).Run();
-}
-
-syncer::SyncMergeResult PasswordSyncableService::MergeDataAndStartSyncing(
-    syncer::ModelType type,
-    const syncer::SyncDataList& initial_sync_data,
-    std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
-    std::unique_ptr<syncer::SyncErrorFactory> sync_error_factory) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(syncer::PASSWORDS, type);
-  base::AutoReset<bool> processing_changes(&is_processing_sync_changes_, true);
-  syncer::SyncMergeResult merge_result(type);
-
-  // We add all the db entries as |new_local_entries| initially. During model
-  // association entries that match a sync entry will be removed and this list
-  // will only contain entries that are not in sync.
-  std::vector<std::unique_ptr<autofill::PasswordForm>> password_entries;
-  PasswordEntryMap new_local_entries;
-  if (!ReadFromPasswordStore(&password_entries, &new_local_entries)) {
-    if (!ShouldRecoverPasswordsDuringMerge()) {
-      merge_result.set_error(sync_error_factory->CreateAndUploadError(
-          FROM_HERE, "Failed to get passwords from store."));
-      metrics_util::LogPasswordSyncState(metrics_util::NOT_SYNCING_FAILED_READ);
-      return merge_result;
-    }
-
-    // On MacOS it may happen that some passwords cannot be decrypted due to
-    // modification of encryption key in Keychain (https://crbug.com/730625).
-    // Delete those logins from the store, they should be automatically updated
-    // with Sync data.
-    DatabaseCleanupResult cleanup_result =
-        password_store_->DeleteUndecryptableLogins();
-
-    if (cleanup_result == DatabaseCleanupResult::kEncryptionUnavailable) {
-      merge_result.set_error(sync_error_factory->CreateAndUploadError(
-          FROM_HERE, "Failed to get encryption key during database cleanup."));
-      metrics_util::LogPasswordSyncState(
-          metrics_util::NOT_SYNCING_FAILED_DECRYPTION);
-      return merge_result;
-    }
-
-    if (cleanup_result != DatabaseCleanupResult::kSuccess) {
-      merge_result.set_error(sync_error_factory->CreateAndUploadError(
-          FROM_HERE, "Failed to cleanup database."));
-      metrics_util::LogPasswordSyncState(
-          metrics_util::NOT_SYNCING_FAILED_CLEANUP);
-      return merge_result;
-    }
-
-    // Try to read all entries again. If deletion of passwords which couldn't
-    // be deleted didn't help, return an error.
-    password_entries.clear();
-    new_local_entries.clear();
-    if (!ReadFromPasswordStore(&password_entries, &new_local_entries)) {
-      merge_result.set_error(sync_error_factory->CreateAndUploadError(
-          FROM_HERE, "Failed to get passwords from store."));
-      metrics_util::LogPasswordSyncState(metrics_util::NOT_SYNCING_FAILED_READ);
-      return merge_result;
-    }
-  }
-
-  if (password_entries.size() != new_local_entries.size()) {
-    merge_result.set_error(sync_error_factory->CreateAndUploadError(
-        FROM_HERE,
-        "There are passwords with identical sync tags in the database."));
-    metrics_util::LogPasswordSyncState(
-        metrics_util::NOT_SYNCING_DUPLICATE_TAGS);
-    return merge_result;
-  }
-  merge_result.set_num_items_before_association(new_local_entries.size());
-
-  SyncEntries sync_entries;
-  // Changes from password db that need to be propagated to sync.
-  syncer::SyncChangeList updated_db_entries;
-  for (auto sync_iter = initial_sync_data.begin();
-       sync_iter != initial_sync_data.end(); ++sync_iter) {
-    CreateOrUpdateEntry(*sync_iter, &new_local_entries, &sync_entries,
-                        &updated_db_entries);
-  }
-
-  for (auto it = new_local_entries.begin(); it != new_local_entries.end();
-       ++it) {
-    updated_db_entries.push_back(
-        syncer::SyncChange(FROM_HERE, syncer::SyncChange::ACTION_ADD,
-                           SyncDataFromPassword(*it->second)));
-  }
-
-  WriteToPasswordStore(sync_entries, /*is_merge=*/true);
-  merge_result.set_error(
-      sync_processor->ProcessSyncChanges(FROM_HERE, updated_db_entries));
-  if (merge_result.error().IsSet()) {
-    metrics_util::LogPasswordSyncState(metrics_util::NOT_SYNCING_SERVER_ERROR);
-    return merge_result;
-  }
-
-  merge_result.set_num_items_after_association(
-      merge_result.num_items_before_association() +
-      sync_entries.new_entries.size());
-  merge_result.set_num_items_added(sync_entries.new_entries.size());
-  merge_result.set_num_items_modified(sync_entries.updated_entries.size());
-  merge_result.set_num_items_deleted(sync_entries.deleted_entries.size());
-
-  // Save |sync_processor_| only if the whole procedure succeeded. In case of
-  // failure Sync shouldn't receive any updates from the PasswordStore.
-  sync_error_factory_ = std::move(sync_error_factory);
-  sync_processor_ = std::move(sync_processor);
-
-  metrics_util::LogPasswordSyncState(metrics_util::SYNCING_OK);
-  return merge_result;
-}
-
-void PasswordSyncableService::StopSyncing(syncer::ModelType type) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(syncer::PASSWORDS, type);
-
-  sync_processor_.reset();
-  sync_error_factory_.reset();
-}
-
-syncer::SyncDataList PasswordSyncableService::GetAllSyncData(
-    syncer::ModelType type) const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(syncer::PASSWORDS, type);
-  std::vector<std::unique_ptr<autofill::PasswordForm>> password_entries;
-  ReadFromPasswordStore(&password_entries, nullptr);
-
-  syncer::SyncDataList sync_data;
-  sync_data.reserve(password_entries.size());
-  std::transform(password_entries.begin(), password_entries.end(),
-                 std::back_inserter(sync_data),
-                 [](const std::unique_ptr<autofill::PasswordForm>& form) {
-                   return SyncDataFromPassword(*form);
-                 });
-  return sync_data;
-}
-
-syncer::SyncError PasswordSyncableService::ProcessSyncChanges(
-    const base::Location& from_here,
-    const syncer::SyncChangeList& change_list) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  base::AutoReset<bool> processing_changes(&is_processing_sync_changes_, true);
-  SyncEntries sync_entries;
-  base::Time time_now = base::Time::Now();
-
-  for (auto it = change_list.begin(); it != change_list.end(); ++it) {
-    const sync_pb::EntitySpecifics& specifics = it->sync_data().GetSpecifics();
-    std::vector<std::unique_ptr<autofill::PasswordForm>>* entries =
-        sync_entries.EntriesForChangeType(it->change_type());
-    if (!entries) {
-      return sync_error_factory_->CreateAndUploadError(
-          FROM_HERE, "Failed to process sync changes for passwords datatype.");
-    }
-    AppendPasswordFromSpecifics(
-        specifics.password().client_only_encrypted_data(), time_now, entries);
-  }
-
-  WriteToPasswordStore(sync_entries, /*is_merge=*/false);
-  return syncer::SyncError();
-}
-
-void PasswordSyncableService::ActOnPasswordStoreChanges(
-    const PasswordStoreChangeList& local_changes) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!sync_processor_) {
-    if (!flare_.is_null()) {
-      flare_.Run(syncer::PASSWORDS);
-      flare_.Reset();
-    }
-    return;
-  }
-
-  // ActOnPasswordStoreChanges() can be called from ProcessSyncChanges(). Do
-  // nothing in this case.
-  if (is_processing_sync_changes_)
-    return;
-  syncer::SyncChangeList sync_changes;
-  for (auto it = local_changes.begin(); it != local_changes.end(); ++it) {
-    syncer::SyncData data =
-        (it->type() == PasswordStoreChange::REMOVE
-             ? syncer::SyncData::CreateLocalDelete(
-                   MakePasswordSyncTag(it->form()), syncer::PASSWORDS)
-             : SyncDataFromPassword(it->form()));
-    sync_changes.push_back(
-        syncer::SyncChange(FROM_HERE, GetSyncChangeType(it->type()), data));
-  }
-  sync_processor_->ProcessSyncChanges(FROM_HERE, sync_changes);
-}
-
-void PasswordSyncableService::InjectStartSyncFlare(
-    const syncer::SyncableService::StartSyncFlare& flare) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  flare_ = flare;
-}
-
-bool PasswordSyncableService::ReadFromPasswordStore(
-    std::vector<std::unique_ptr<autofill::PasswordForm>>* password_entries,
-    PasswordEntryMap* passwords_entry_map) const {
-  DCHECK(password_entries);
-  std::vector<std::unique_ptr<autofill::PasswordForm>> autofillable_entries;
-  std::vector<std::unique_ptr<autofill::PasswordForm>> blacklist_entries;
-  if (!password_store_->FillAutofillableLogins(&autofillable_entries) ||
-      !password_store_->FillBlacklistLogins(&blacklist_entries)) {
-    return false;
-  }
-  password_entries->resize(autofillable_entries.size() +
-                           blacklist_entries.size());
-  std::move(autofillable_entries.begin(), autofillable_entries.end(),
-            password_entries->begin());
-  std::move(blacklist_entries.begin(), blacklist_entries.end(),
-            password_entries->begin() + autofillable_entries.size());
-
-  if (!passwords_entry_map)
-    return true;
-
-  PasswordEntryMap& entry_map = *passwords_entry_map;
-  for (const auto& form : *password_entries) {
-    autofill::PasswordForm* password_form = form.get();
-    entry_map[MakePasswordSyncTag(*password_form)] = password_form;
-  }
-
-  return true;
-}
-
-void PasswordSyncableService::WriteToPasswordStore(const SyncEntries& entries,
-                                                   bool is_merge) {
-  PasswordStoreChangeList changes;
-
-  for (const std::unique_ptr<autofill::PasswordForm>& form :
-       entries.new_entries) {
-    AddLoginError add_login_error;
-    PasswordStoreChangeList new_changes =
-        password_store_->AddLoginSync(*form, &add_login_error);
-    changes.insert(changes.end(), new_changes.begin(), new_changes.end());
-    if (is_merge) {
-      base::UmaHistogramEnumeration(
-          "PasswordManager.MergeSyncData.AddLoginSyncError", add_login_error);
-    } else {
-      base::UmaHistogramEnumeration(
-          "PasswordManager.ApplySyncChanges.AddLoginSyncError",
-          add_login_error);
-    }
-  }
-
-  for (const std::unique_ptr<autofill::PasswordForm>& form :
-       entries.updated_entries) {
-    UpdateLoginError update_login_error;
-    PasswordStoreChangeList new_changes =
-        password_store_->UpdateLoginSync(*form, &update_login_error);
-    if (is_merge) {
-      base::UmaHistogramEnumeration(
-          "PasswordManager.MergeSyncData.UpdateLoginSyncError",
-          update_login_error);
-    } else {
-      base::UmaHistogramEnumeration(
-          "PasswordManager.ApplySyncChanges.UpdateLoginSyncError",
-          update_login_error);
-    }
-    changes.insert(changes.end(), new_changes.begin(), new_changes.end());
-  }
-
-  for (const std::unique_ptr<autofill::PasswordForm>& form :
-       entries.deleted_entries) {
-    PasswordStoreChangeList new_changes =
-        password_store_->RemoveLoginSync(*form);
-    changes.insert(changes.end(), new_changes.begin(), new_changes.end());
-  }
-
-  // We have to notify password store observers of the change by hand since
-  // we use internal password store interfaces to make changes synchronously.
-  password_store_->NotifyLoginsChanged(changes);
-}
-
-// static
-void PasswordSyncableService::CreateOrUpdateEntry(
-    const syncer::SyncData& data,
-    PasswordEntryMap* unmatched_data_from_password_db,
-    SyncEntries* sync_entries,
-    syncer::SyncChangeList* updated_db_entries) {
-  const sync_pb::EntitySpecifics& specifics = data.GetSpecifics();
-  const sync_pb::PasswordSpecificsData& password_specifics(
-      specifics.password().client_only_encrypted_data());
-  std::string tag = MakePasswordSyncTag(password_specifics);
-
-  // Check whether the data from sync is already in the password store.
-  auto existing_local_entry_iter = unmatched_data_from_password_db->find(tag);
-  base::Time time_now = base::Time::Now();
-  if (existing_local_entry_iter == unmatched_data_from_password_db->end()) {
-    // The sync data is not in the password store, so we need to create it in
-    // the password store. Add the entry to the new_entries list.
-    AppendPasswordFromSpecifics(password_specifics, time_now,
-                                &sync_entries->new_entries);
-  } else {
-    // The entry is in password store. If the entries are not identical, then
-    // the entries need to be merged.
-    // If the passwords differ, take the one that was created more recently.
-    const autofill::PasswordForm& password_form =
-        *existing_local_entry_iter->second;
-    if (!AreLocalAndSyncPasswordsEqual(password_specifics, password_form)) {
-      if (base::Time::FromInternalValue(password_specifics.date_created()) <
-          password_form.date_created) {
-        updated_db_entries->push_back(
-            syncer::SyncChange(FROM_HERE, syncer::SyncChange::ACTION_UPDATE,
-                               SyncDataFromPassword(password_form)));
-      } else {
-        AppendPasswordFromSpecifics(password_specifics, time_now,
-                                    &sync_entries->updated_entries);
-      }
-    }
-    // Remove the entry from the entry map to indicate a match has been found.
-    // Entries that remain in the map at the end of associating all sync entries
-    // will be treated as additions that need to be propagated to sync.
-    unmatched_data_from_password_db->erase(existing_local_entry_iter);
-  }
-}
-
-// Whether we should try to recover undecryptable local passwords by deleting
-// the local copy, to be replaced by the remote version coming from Sync during
-// merge.
-bool PasswordSyncableService::ShouldRecoverPasswordsDuringMerge() const {
-  // Delete the local undecryptable copy under the following conditions:
-  // 1. This is MacOS only.
-  // 2. The more general feature kDeleteCorruptedPasswords is disabled.
-  //    kDeleteCorruptedPasswords takes cares of deleting undecryptable entities
-  //    for Sync and non-Sync users upon reading from the LoginDatabase.
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  return !base::FeatureList::IsEnabled(features::kDeleteCorruptedPasswords);
-#else
-  return false;
-#endif
-}
-
-syncer::SyncData SyncDataFromPassword(
-    const autofill::PasswordForm& password_form) {
-  sync_pb::EntitySpecifics password_data;
-  sync_pb::PasswordSpecificsData* password_specifics =
-      password_data.mutable_password()->mutable_client_only_encrypted_data();
-#define CopyEnumField(field) \
-  password_specifics->set_##field(static_cast<int>(password_form.field))
-#define CopyField(field) password_specifics->set_##field(password_form.field)
-#define CopyStringField(field) \
-  password_specifics->set_##field(base::UTF16ToUTF8(password_form.field))
-  CopyEnumField(scheme);
-  CopyField(signon_realm);
-  password_specifics->set_origin(password_form.origin.spec());
-  password_specifics->set_action(password_form.action.spec());
-  CopyStringField(username_element);
-  CopyStringField(password_element);
-  CopyStringField(username_value);
-  CopyStringField(password_value);
-  password_specifics->set_date_last_used(
-      password_form.date_last_used.ToDeltaSinceWindowsEpoch().InMicroseconds());
-  password_specifics->set_date_created(
-      password_form.date_created.ToInternalValue());
-  password_specifics->set_blacklisted(password_form.blacklisted_by_user);
-  CopyEnumField(type);
-  CopyField(times_used);
-  CopyStringField(display_name);
-  password_specifics->set_avatar_url(password_form.icon_url.spec());
-  password_specifics->set_federation_url(
-      password_form.federation_origin.opaque()
-          ? std::string()
-          : password_form.federation_origin.Serialize());
-#undef CopyStringField
-#undef CopyField
-#undef CopyEnumField
-
-  std::string tag = MakePasswordSyncTag(*password_specifics);
-  return syncer::SyncData::CreateLocalData(tag, tag, password_data);
-}
-
-autofill::PasswordForm PasswordFromSpecifics(
-    const sync_pb::PasswordSpecificsData& password) {
-  autofill::PasswordForm new_password;
-  new_password.scheme =
-      static_cast<autofill::PasswordForm::Scheme>(password.scheme());
-  new_password.signon_realm = password.signon_realm();
-  new_password.origin = GURL(password.origin());
-  new_password.action = GURL(password.action());
-  new_password.username_element =
-      base::UTF8ToUTF16(password.username_element());
-  new_password.password_element =
-      base::UTF8ToUTF16(password.password_element());
-  new_password.username_value = base::UTF8ToUTF16(password.username_value());
-  new_password.password_value = base::UTF8ToUTF16(password.password_value());
-  if (password.has_date_last_used()) {
-    new_password.date_last_used = base::Time::FromDeltaSinceWindowsEpoch(
-        base::TimeDelta::FromMicroseconds(password.date_last_used()));
-  } else if (password.preferred()) {
-    // For legacy passwords that don't have the |date_last_used| field set, we
-    // should set it similar to the logic in login database migration.
-    new_password.date_last_used =
-        base::Time::FromDeltaSinceWindowsEpoch(base::TimeDelta::FromDays(1));
-  }
-  new_password.date_created =
-      base::Time::FromInternalValue(password.date_created());
-  new_password.blacklisted_by_user = password.blacklisted();
-  new_password.type =
-      static_cast<autofill::PasswordForm::Type>(password.type());
-  new_password.times_used = password.times_used();
-  new_password.display_name = base::UTF8ToUTF16(password.display_name());
-  new_password.icon_url = GURL(password.avatar_url());
-  new_password.federation_origin =
-      url::Origin::Create(GURL(password.federation_url()));
-  return new_password;
-}
-
-std::string MakePasswordSyncTag(
-    const sync_pb::PasswordSpecificsData& password) {
-  return MakePasswordSyncTag(PasswordFromSpecifics(password));
-}
-
-std::string MakePasswordSyncTag(const autofill::PasswordForm& password) {
-  return (net::EscapePath(password.origin.spec()) + "|" +
-          net::EscapePath(base::UTF16ToUTF8(password.username_element)) + "|" +
-          net::EscapePath(base::UTF16ToUTF8(password.username_value)) + "|" +
-          net::EscapePath(base::UTF16ToUTF8(password.password_element)) + "|" +
-          net::EscapePath(password.signon_realm));
-}
-
-}  // namespace password_manager
diff --git a/components/password_manager/core/browser/sync/password_syncable_service.h b/components/password_manager/core/browser/sync/password_syncable_service.h
deleted file mode 100644
index 409838d..0000000
--- a/components/password_manager/core/browser/sync/password_syncable_service.h
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_SYNCABLE_SERVICE_H_
-#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_SYNCABLE_SERVICE_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/sequence_checker.h"
-#include "components/password_manager/core/browser/password_store_change.h"
-#include "components/sync/model/sync_change.h"
-#include "components/sync/model/sync_data.h"
-#include "components/sync/model/sync_error.h"
-#include "components/sync/model/syncable_service.h"
-#include "components/sync/protocol/password_specifics.pb.h"
-#include "components/sync/protocol/sync.pb.h"
-
-namespace autofill {
-struct PasswordForm;
-}
-
-namespace syncer {
-class SyncErrorFactory;
-}
-
-namespace password_manager {
-
-class PasswordStoreSync;
-
-// The implementation of the SyncableService API for passwords.
-class PasswordSyncableService : public syncer::SyncableService {
- public:
-  // Since the constructed |PasswordSyncableService| is typically owned by the
-  // |password_store|, the constructor doesn't take ownership of the
-  // |password_store|.
-  explicit PasswordSyncableService(PasswordStoreSync* password_store);
-  ~PasswordSyncableService() override;
-
-  // syncer::SyncableService:
-  void WaitUntilReadyToSync(base::OnceClosure done) override;
-  syncer::SyncMergeResult MergeDataAndStartSyncing(
-      syncer::ModelType type,
-      const syncer::SyncDataList& initial_sync_data,
-      std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
-      std::unique_ptr<syncer::SyncErrorFactory> error_handler) override;
-  void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
-  syncer::SyncError ProcessSyncChanges(
-      const base::Location& from_here,
-      const syncer::SyncChangeList& change_list) override;
-
-  // Notifies the Sync engine of changes to the password database.
-  void ActOnPasswordStoreChanges(const PasswordStoreChangeList& changes);
-
-  // Provides a StartSyncFlare to the SyncableService. See
-  // chrome/browser/sync/glue/sync_start_util.h for more.
-  void InjectStartSyncFlare(
-      const syncer::SyncableService::StartSyncFlare& flare);
-
- private:
-  // Map from password sync tag to password form.
-  typedef std::map<std::string, autofill::PasswordForm*> PasswordEntryMap;
-
-  struct SyncEntries;
-
-  // Retrieves the entries from password db and fills both |password_entries|
-  // and |passwords_entry_map|. |passwords_entry_map| can be NULL.
-  bool ReadFromPasswordStore(
-      std::vector<std::unique_ptr<autofill::PasswordForm>>* password_entries,
-      PasswordEntryMap* passwords_entry_map) const;
-
-  // Uses the |PasswordStore| APIs to change entries.
-  void WriteToPasswordStore(const SyncEntries& entries, bool is_merge);
-
-  // Examines |data|, an entry in sync db, and updates |sync_entries| or
-  // |updated_db_entries| accordingly. An element is removed from
-  // |unmatched_data_from_password_db| if its tag is identical to |data|'s.
-  static void CreateOrUpdateEntry(
-      const syncer::SyncData& data,
-      PasswordEntryMap* unmatched_data_from_password_db,
-      SyncEntries* sync_entries,
-      syncer::SyncChangeList* updated_db_entries);
-
-  // Returns true if corrupted passwords should be deleted from the local
-  // database when merging data.
-  // This is true if the feature DeleteCorruptedPasswords is disabled, as it
-  // recovers both Sync and non-Sync users internally in LoginDatabase.
-  bool ShouldRecoverPasswordsDuringMerge() const;
-
-  // The factory that creates sync errors. |SyncError| has rich data
-  // suitable for debugging.
-  std::unique_ptr<syncer::SyncErrorFactory> sync_error_factory_;
-
-  // |sync_processor_| will mirror the |PasswordStore| changes in the sync db.
-  std::unique_ptr<syncer::SyncChangeProcessor> sync_processor_;
-
-  // The password store that adds/updates/deletes password entries. Not owned.
-  PasswordStoreSync* const password_store_;
-
-  // A signal activated by this class to start sync as soon as possible.
-  syncer::SyncableService::StartSyncFlare flare_;
-
-  // True if processing sync changes is in progress.
-  bool is_processing_sync_changes_;
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
-  DISALLOW_COPY_AND_ASSIGN(PasswordSyncableService);
-};
-
-}  // namespace password_manager
-
-#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_SYNCABLE_SERVICE_H_
diff --git a/components/password_manager/core/browser/sync/password_syncable_service_unittest.cc b/components/password_manager/core/browser/sync/password_syncable_service_unittest.cc
deleted file mode 100644
index fec1c9f..0000000
--- a/components/password_manager/core/browser/sync/password_syncable_service_unittest.cc
+++ /dev/null
@@ -1,784 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/password_manager/core/browser/sync/password_syncable_service.h"
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/utf_string_conversions.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/mock_password_store.h"
-#include "components/password_manager/core/common/password_manager_features.h"
-#include "components/sync/model/sync_change_processor.h"
-#include "components/sync/model/sync_change_processor_wrapper_for_test.h"
-#include "components/sync/model/sync_error.h"
-#include "components/sync/model/sync_error_factory_mock.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using syncer::SyncChange;
-using syncer::SyncData;
-using syncer::SyncDataList;
-using syncer::SyncError;
-using testing::_;
-using testing::AnyNumber;
-using testing::DoAll;
-using testing::ElementsAre;
-using testing::IgnoreResult;
-using testing::Invoke;
-using testing::IsEmpty;
-using testing::Matches;
-using testing::Return;
-using testing::SetArgPointee;
-using testing::UnorderedElementsAre;
-
-namespace password_manager {
-
-// Defined in the implementation file corresponding to this test.
-syncer::SyncData SyncDataFromPassword(const autofill::PasswordForm& password);
-autofill::PasswordForm PasswordFromSpecifics(
-    const sync_pb::PasswordSpecificsData& password);
-std::string MakePasswordSyncTag(const sync_pb::PasswordSpecificsData& password);
-std::string MakePasswordSyncTag(const autofill::PasswordForm& password);
-
-namespace {
-
-// PasswordForm values for tests.
-constexpr autofill::PasswordForm::Type kArbitraryType =
-    autofill::PasswordForm::Type::kGenerated;
-constexpr char kIconUrl[] = "https://fb.com/Icon";
-constexpr char kDisplayName[] = "Agent Smith";
-constexpr char kFederationUrl[] = "https://fb.com/";
-constexpr char kPassword[] = "abcdef";
-constexpr char kSignonRealm[] = "abc";
-constexpr char kSignonRealm2[] = "def";
-constexpr char kSignonRealm3[] = "xyz";
-constexpr int kTimesUsed = 5;
-constexpr char kUsername[] = "godzilla";
-
-typedef std::vector<SyncChange> SyncChangeList;
-
-const sync_pb::PasswordSpecificsData& GetPasswordSpecifics(
-    const syncer::SyncData& sync_data) {
-  return sync_data.GetSpecifics().password().client_only_encrypted_data();
-}
-
-MATCHER(HasDateSynced, "") {
-  return !arg.date_synced.is_null() && !arg.date_synced.is_max();
-}
-
-MATCHER_P(PasswordIs, form, "") {
-  sync_pb::PasswordSpecificsData actual_password =
-      GetPasswordSpecifics(SyncDataFromPassword(arg));
-  sync_pb::PasswordSpecificsData expected_password =
-      GetPasswordSpecifics(SyncDataFromPassword(form));
-  if (expected_password.scheme() == actual_password.scheme() &&
-      expected_password.signon_realm() == actual_password.signon_realm() &&
-      expected_password.origin() == actual_password.origin() &&
-      expected_password.action() == actual_password.action() &&
-      expected_password.username_element() ==
-          actual_password.username_element() &&
-      expected_password.password_element() ==
-          actual_password.password_element() &&
-      expected_password.username_value() == actual_password.username_value() &&
-      expected_password.password_value() == actual_password.password_value() &&
-      expected_password.date_last_used() == actual_password.date_last_used() &&
-      expected_password.date_created() == actual_password.date_created() &&
-      expected_password.blacklisted() == actual_password.blacklisted() &&
-      expected_password.type() == actual_password.type() &&
-      expected_password.times_used() == actual_password.times_used() &&
-      expected_password.display_name() == actual_password.display_name() &&
-      expected_password.avatar_url() == actual_password.avatar_url() &&
-      expected_password.federation_url() == actual_password.federation_url())
-    return true;
-
-  *result_listener << "Password protobuf does not match; expected:\n"
-                   << form << '\n'
-                   << "actual:" << '\n'
-                   << arg;
-  return false;
-}
-
-MATCHER_P2(SyncChangeIs, change_type, password, "") {
-  const SyncData& data = arg.sync_data();
-  autofill::PasswordForm form =
-      PasswordFromSpecifics(GetPasswordSpecifics(data));
-  return (arg.change_type() == change_type &&
-          syncer::SyncDataLocal(data).GetTag() ==
-              MakePasswordSyncTag(password) &&
-          (change_type == SyncChange::ACTION_DELETE ||
-           Matches(PasswordIs(password))(form)));
-}
-
-// The argument is std::vector<autofill::PasswordForm*>*. The caller is
-// responsible for the lifetime of all the password forms.
-ACTION_P(AppendForm, form) {
-  arg0->push_back(std::make_unique<autofill::PasswordForm>(form));
-  return true;
-}
-
-// Creates a sync data consisting of password specifics. The sign on realm is
-// set to |signon_realm|.
-SyncData CreateSyncData(const std::string& signon_realm) {
-  sync_pb::EntitySpecifics password_data;
-  sync_pb::PasswordSpecificsData* password_specifics =
-      password_data.mutable_password()->mutable_client_only_encrypted_data();
-  password_specifics->set_signon_realm(signon_realm);
-  password_specifics->set_type(
-      static_cast<int>(autofill::PasswordForm::Type::kGenerated));
-  password_specifics->set_times_used(3);
-  password_specifics->set_display_name("Mr. X");
-  password_specifics->set_avatar_url("https://accounts.google.com/Icon");
-  password_specifics->set_federation_url("https://google.com");
-  password_specifics->set_username_value("kingkong");
-  password_specifics->set_password_value("sicrit");
-
-  std::string tag = MakePasswordSyncTag(*password_specifics);
-  return syncer::SyncData::CreateLocalData(tag, tag, password_data);
-}
-
-SyncChange CreateSyncChange(const autofill::PasswordForm& password,
-                            SyncChange::SyncChangeType type) {
-  SyncData data = SyncDataFromPassword(password);
-  return SyncChange(FROM_HERE, type, data);
-}
-
-// Mock implementation of SyncChangeProcessor.
-class MockSyncChangeProcessor : public syncer::SyncChangeProcessor {
- public:
-  MockSyncChangeProcessor() {}
-
-  MOCK_METHOD2(ProcessSyncChanges,
-               SyncError(const base::Location&, const SyncChangeList& list));
-  SyncDataList GetAllSyncData(syncer::ModelType type) const override {
-    NOTREACHED();
-    return SyncDataList();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSyncChangeProcessor);
-};
-
-// Convenience wrapper around a PasswordSyncableService and PasswordStore
-// pair.
-class PasswordSyncableServiceWrapper {
- public:
-  PasswordSyncableServiceWrapper() {
-    password_store_ = new testing::StrictMock<MockPasswordStore>;
-    password_store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
-    service_.reset(
-        new PasswordSyncableService(password_store_->GetSyncInterface()));
-
-    ON_CALL(*password_store_, AddLoginImpl(HasDateSynced(), _))
-        .WillByDefault([](const autofill::PasswordForm& form,
-                          password_manager::AddLoginError* error) {
-          if (error) {
-            *error = AddLoginError::kNone;
-          }
-          return PasswordStoreChangeList();
-        });
-    ON_CALL(*password_store_, RemoveLoginImpl(_))
-        .WillByDefault(Return(PasswordStoreChangeList()));
-    ON_CALL(*password_store_, UpdateLoginImpl(HasDateSynced(), _))
-        .WillByDefault([](const autofill::PasswordForm& form,
-                          password_manager::UpdateLoginError* error) {
-          if (error) {
-            *error = UpdateLoginError::kNone;
-          }
-          return PasswordStoreChangeList();
-        });
-    EXPECT_CALL(*password_store(), NotifyLoginsChanged(_)).Times(AnyNumber());
-  }
-
-  ~PasswordSyncableServiceWrapper() { password_store_->ShutdownOnUIThread(); }
-
-  MockPasswordStore* password_store() { return password_store_.get(); }
-
-  PasswordSyncableService* service() { return service_.get(); }
-
- private:
-  scoped_refptr<MockPasswordStore> password_store_;
-  std::unique_ptr<PasswordSyncableService> service_;
-
-  DISALLOW_COPY_AND_ASSIGN(PasswordSyncableServiceWrapper);
-};
-
-class PasswordSyncableServiceTest : public testing::Test {
- public:
-  PasswordSyncableServiceTest()
-      : processor_(new testing::StrictMock<MockSyncChangeProcessor>) {
-    ON_CALL(*processor_, ProcessSyncChanges(_, _))
-        .WillByDefault(Return(SyncError()));
-  }
-  MockPasswordStore* password_store() { return wrapper_.password_store(); }
-  PasswordSyncableService* service() { return wrapper_.service(); }
-
-  MOCK_METHOD1(StartSyncFlare, void(syncer::ModelType));
-
- protected:
-  std::unique_ptr<MockSyncChangeProcessor> processor_;
-
- private:
-  // Used by the password store.
-  base::test::TaskEnvironment task_environment_;
-  PasswordSyncableServiceWrapper wrapper_;
-};
-
-// Both sync and password db have data that are not present in the other.
-TEST_F(PasswordSyncableServiceTest, AdditionsInBoth) {
-  autofill::PasswordForm form;
-  form.signon_realm = kSignonRealm;
-  form.username_value = base::ASCIIToUTF16(kUsername);
-  form.password_value = base::ASCIIToUTF16(kPassword);
-
-  SyncDataList list;
-  list.push_back(CreateSyncData(kSignonRealm2));
-  autofill::PasswordForm new_from_sync =
-      PasswordFromSpecifics(GetPasswordSpecifics(list.back()));
-
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(AppendForm(form));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-  EXPECT_CALL(*password_store(), AddLoginImpl(PasswordIs(new_from_sync), _));
-  EXPECT_CALL(*processor_,
-              ProcessSyncChanges(
-                  _, ElementsAre(SyncChangeIs(SyncChange::ACTION_ADD, form))));
-
-  service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, list, std::move(processor_),
-      std::unique_ptr<syncer::SyncErrorFactory>());
-}
-
-// Sync has data that is not present in the password db.
-TEST_F(PasswordSyncableServiceTest, AdditionOnlyInSync) {
-  SyncDataList list;
-  list.push_back(CreateSyncData(kSignonRealm));
-  autofill::PasswordForm new_from_sync =
-      PasswordFromSpecifics(GetPasswordSpecifics(list.back()));
-
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(Return(true));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-  EXPECT_CALL(*password_store(), AddLoginImpl(PasswordIs(new_from_sync), _));
-  EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty()));
-
-  service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, list, std::move(processor_),
-      std::unique_ptr<syncer::SyncErrorFactory>());
-}
-
-// Passwords db has data that is not present in sync.
-TEST_F(PasswordSyncableServiceTest, AdditionOnlyInPasswordStore) {
-  autofill::PasswordForm form;
-  form.signon_realm = kSignonRealm;
-  form.times_used = kTimesUsed;
-  form.type = kArbitraryType;
-  form.display_name = base::ASCIIToUTF16(kDisplayName);
-  form.icon_url = GURL(kIconUrl);
-  form.federation_origin = url::Origin::Create(GURL(kFederationUrl));
-  form.username_value = base::ASCIIToUTF16(kUsername);
-  form.password_value = base::ASCIIToUTF16(kPassword);
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(AppendForm(form));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-
-  EXPECT_CALL(*processor_,
-              ProcessSyncChanges(
-                  _, ElementsAre(SyncChangeIs(SyncChange::ACTION_ADD, form))));
-
-  service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, SyncDataList(), std::move(processor_),
-      std::unique_ptr<syncer::SyncErrorFactory>());
-}
-
-// Both passwords db and sync contain the same data.
-TEST_F(PasswordSyncableServiceTest, BothInSync) {
-  autofill::PasswordForm form;
-  form.signon_realm = kSignonRealm;
-  form.times_used = kTimesUsed;
-  form.type = kArbitraryType;
-  form.username_value = base::ASCIIToUTF16(kUsername);
-  form.password_value = base::ASCIIToUTF16(kPassword);
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(AppendForm(form));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-
-  EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty()));
-
-  service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, SyncDataList(1, SyncDataFromPassword(form)),
-      std::move(processor_), std::unique_ptr<syncer::SyncErrorFactory>());
-}
-
-// Both passwords db and sync have the same data but they need to be merged
-// as some fields of the data differ.
-TEST_F(PasswordSyncableServiceTest, Merge) {
-  autofill::PasswordForm form1;
-  form1.signon_realm = kSignonRealm;
-  form1.action = GURL("http://pie.com");
-  form1.date_created = base::Time::Now();
-  form1.date_last_used = form1.date_created;
-  form1.username_value = base::ASCIIToUTF16(kUsername);
-  form1.password_value = base::ASCIIToUTF16(kPassword);
-
-  autofill::PasswordForm form2(form1);
-  form2.date_created = form1.date_created + base::TimeDelta::FromDays(1);
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(AppendForm(form1));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-  EXPECT_CALL(*password_store(), UpdateLoginImpl(PasswordIs(form2), _));
-  EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty()));
-
-  service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, SyncDataList(1, SyncDataFromPassword(form2)),
-      std::move(processor_), std::unique_ptr<syncer::SyncErrorFactory>());
-}
-
-// Initiate sync due to local DB changes.
-TEST_F(PasswordSyncableServiceTest, PasswordStoreChanges) {
-  // Save the reference to the processor because |processor_| is NULL after
-  // MergeDataAndStartSyncing().
-  MockSyncChangeProcessor& weak_processor = *processor_;
-  EXPECT_CALL(weak_processor, ProcessSyncChanges(_, IsEmpty()));
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(Return(true));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-  service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, SyncDataList(), std::move(processor_),
-      std::unique_ptr<syncer::SyncErrorFactory>());
-
-  autofill::PasswordForm form1;
-  form1.signon_realm = kSignonRealm;
-  autofill::PasswordForm form2;
-  form2.signon_realm = kSignonRealm2;
-  autofill::PasswordForm form3;
-  form3.signon_realm = kSignonRealm3;
-
-  SyncChangeList sync_list;
-  sync_list.push_back(CreateSyncChange(form1, SyncChange::ACTION_ADD));
-  sync_list.push_back(CreateSyncChange(form2, SyncChange::ACTION_UPDATE));
-  sync_list.push_back(CreateSyncChange(form3, SyncChange::ACTION_DELETE));
-
-  PasswordStoreChangeList list;
-  list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form1));
-  list.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, form2));
-  list.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form3));
-  EXPECT_CALL(
-      weak_processor,
-      ProcessSyncChanges(
-          _, ElementsAre(SyncChangeIs(SyncChange::ACTION_ADD, form1),
-                         SyncChangeIs(SyncChange::ACTION_UPDATE, form2),
-                         SyncChangeIs(SyncChange::ACTION_DELETE, form3))));
-  service()->ActOnPasswordStoreChanges(list);
-}
-
-// Process all types of changes from sync.
-TEST_F(PasswordSyncableServiceTest, ProcessSyncChanges) {
-  autofill::PasswordForm updated_form;
-  updated_form.signon_realm = kSignonRealm;
-  updated_form.action = GURL("http://foo.com");
-  updated_form.date_created = base::Time::Now();
-  updated_form.username_value = base::ASCIIToUTF16(kUsername);
-  updated_form.password_value = base::ASCIIToUTF16(kPassword);
-  autofill::PasswordForm deleted_form;
-  deleted_form.signon_realm = kSignonRealm2;
-  deleted_form.action = GURL("http://bar.com");
-  deleted_form.blacklisted_by_user = true;
-
-  SyncData add_data = CreateSyncData(kSignonRealm3);
-  autofill::PasswordForm new_from_sync =
-      PasswordFromSpecifics(GetPasswordSpecifics(add_data));
-
-  SyncChangeList list;
-  list.push_back(
-      SyncChange(FROM_HERE, syncer::SyncChange::ACTION_ADD, add_data));
-  list.push_back(
-      CreateSyncChange(updated_form, syncer::SyncChange::ACTION_UPDATE));
-  list.push_back(
-      CreateSyncChange(deleted_form, syncer::SyncChange::ACTION_DELETE));
-  EXPECT_CALL(*password_store(), AddLoginImpl(PasswordIs(new_from_sync), _));
-  EXPECT_CALL(*password_store(), UpdateLoginImpl(PasswordIs(updated_form), _));
-  EXPECT_CALL(*password_store(), RemoveLoginImpl(PasswordIs(deleted_form)));
-  service()->ProcessSyncChanges(FROM_HERE, list);
-}
-
-// Retrives sync data from the model.
-TEST_F(PasswordSyncableServiceTest, GetAllSyncData) {
-  autofill::PasswordForm form1;
-  form1.signon_realm = kSignonRealm;
-  form1.action = GURL("http://foo.com");
-  form1.times_used = kTimesUsed;
-  form1.type = kArbitraryType;
-  form1.display_name = base::ASCIIToUTF16(kDisplayName);
-  form1.icon_url = GURL(kIconUrl);
-  form1.federation_origin = url::Origin::Create(GURL(kFederationUrl));
-  form1.username_value = base::ASCIIToUTF16(kUsername);
-  form1.password_value = base::ASCIIToUTF16(kPassword);
-  autofill::PasswordForm form2;
-  form2.signon_realm = kSignonRealm2;
-  form2.action = GURL("http://bar.com");
-  form2.blacklisted_by_user = true;
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(AppendForm(form1));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_))
-      .WillOnce(AppendForm(form2));
-
-  SyncDataList actual_list = service()->GetAllSyncData(syncer::PASSWORDS);
-  std::vector<autofill::PasswordForm> actual_form_list;
-  for (auto it = actual_list.begin(); it != actual_list.end(); ++it) {
-    actual_form_list.push_back(
-        PasswordFromSpecifics(GetPasswordSpecifics(*it)));
-  }
-  EXPECT_THAT(actual_form_list,
-              UnorderedElementsAre(PasswordIs(form1), PasswordIs(form2)));
-}
-
-// Creates 2 PasswordSyncableService instances, merges the content of the first
-// one to the second one and back.
-TEST_F(PasswordSyncableServiceTest, MergeDataAndPushBack) {
-  autofill::PasswordForm form1;
-  form1.signon_realm = kSignonRealm;
-  form1.action = GURL("http://foo.com");
-  form1.username_value = base::ASCIIToUTF16(kUsername);
-  form1.password_value = base::ASCIIToUTF16(kPassword);
-
-  PasswordSyncableServiceWrapper other_service_wrapper;
-  autofill::PasswordForm form2;
-  form2.signon_realm = kSignonRealm2;
-  form2.action = GURL("http://bar.com");
-  form2.username_value = base::ASCIIToUTF16(kUsername);
-  form2.password_value = base::ASCIIToUTF16(kPassword);
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(AppendForm(form1));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-  EXPECT_CALL(*other_service_wrapper.password_store(),
-              FillAutofillableLogins(_))
-      .WillOnce(AppendForm(form2));
-  EXPECT_CALL(*other_service_wrapper.password_store(), FillBlacklistLogins(_))
-      .WillOnce(Return(true));
-  // This method reads all passwords from the database. Make sure that the
-  // database is not read twice if there was no problem getting all the
-  // passwords during the first read.
-  EXPECT_CALL(*password_store(), DeleteUndecryptableLogins()).Times(0);
-
-  EXPECT_CALL(*password_store(), AddLoginImpl(PasswordIs(form2), _));
-  EXPECT_CALL(*other_service_wrapper.password_store(),
-              AddLoginImpl(PasswordIs(form1), _));
-
-  syncer::SyncDataList other_service_data =
-      other_service_wrapper.service()->GetAllSyncData(syncer::PASSWORDS);
-  service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, other_service_data,
-      std::make_unique<syncer::SyncChangeProcessorWrapperForTest>(
-          other_service_wrapper.service()),
-      std::unique_ptr<syncer::SyncErrorFactory>());
-}
-
-// Calls ActOnPasswordStoreChanges without SyncChangeProcessor. StartSyncFlare
-// should be called.
-TEST_F(PasswordSyncableServiceTest, StartSyncFlare) {
-  autofill::PasswordForm form;
-  form.signon_realm = kSignonRealm;
-  form.username_value = base::ASCIIToUTF16(kUsername);
-  form.password_value = base::ASCIIToUTF16(kPassword);
-  PasswordStoreChangeList list;
-  list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form));
-
-  // No flare and no SyncChangeProcessor, the call shouldn't crash.
-  service()->ActOnPasswordStoreChanges(list);
-
-  // Set the flare. It should be called as there is no SyncChangeProcessor.
-  service()->InjectStartSyncFlare(base::Bind(
-      &PasswordSyncableServiceTest::StartSyncFlare, base::Unretained(this)));
-  EXPECT_CALL(*this, StartSyncFlare(syncer::PASSWORDS));
-  service()->ActOnPasswordStoreChanges(list);
-}
-
-// Start syncing with an error. Subsequent password store updates shouldn't be
-// propagated to Sync.
-TEST_F(PasswordSyncableServiceTest, FailedReadFromPasswordStore) {
-  std::unique_ptr<syncer::SyncErrorFactoryMock> error_factory(
-      new syncer::SyncErrorFactoryMock);
-  syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
-                          "Failed to get passwords from store.",
-                          syncer::PASSWORDS);
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(Return(false));
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  EXPECT_CALL(*password_store(), DeleteUndecryptableLogins())
-      .WillOnce(Return(DatabaseCleanupResult::kDatabaseUnavailable));
-#endif
-  EXPECT_CALL(*error_factory, CreateAndUploadError(_, _))
-      .WillOnce(Return(error));
-  // ActOnPasswordStoreChanges() below shouldn't generate any changes for Sync.
-  // |processor_| will be destroyed in MergeDataAndStartSyncing().
-  EXPECT_CALL(*processor_, ProcessSyncChanges(_, _)).Times(0);
-  syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, syncer::SyncDataList(), std::move(processor_),
-      std::move(error_factory));
-  EXPECT_TRUE(result.error().IsSet());
-
-  autofill::PasswordForm form;
-  form.signon_realm = kSignonRealm;
-  PasswordStoreChangeList list;
-  list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form));
-  service()->ActOnPasswordStoreChanges(list);
-}
-class PasswordSyncableServiceTestWithoutDeleteCorruptedPasswords
-    : public PasswordSyncableServiceTest {
- public:
-  PasswordSyncableServiceTestWithoutDeleteCorruptedPasswords() {
-    scoped_feature_list_.InitAndDisableFeature(
-        features::kDeleteCorruptedPasswords);
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-// Test that passwords are recovered for Sync users using the older logic (i.e.
-// recover passwords only for Sync users) when the feature for deleting
-// corrupted passwords for all users is disabled.
-TEST_F(PasswordSyncableServiceTestWithoutDeleteCorruptedPasswords,
-       RecoverPasswordsOnlyForSyncUsers) {
-  EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty()));
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .Times(2)
-      .WillOnce(Return(false))
-      .WillOnce(Return(true));
-  EXPECT_CALL(*password_store(), DeleteUndecryptableLogins())
-      .WillOnce(Return(DatabaseCleanupResult::kSuccess));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-
-  syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, SyncDataList(), std::move(processor_), nullptr);
-  EXPECT_FALSE(result.error().IsSet());
-}
-#endif
-
-class PasswordSyncableServiceTestWithDeleteCorruptedPasswords
-    : public PasswordSyncableServiceTest {
- public:
-  PasswordSyncableServiceTestWithDeleteCorruptedPasswords() {
-    scoped_feature_list_.InitAndEnableFeature(
-        features::kDeleteCorruptedPasswords);
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-// Test that passwords are not recovered when merging data if the feature for
-// deleting passwords for all users is enabled.
-TEST_F(PasswordSyncableServiceTestWithDeleteCorruptedPasswords,
-       PasswordRecoveryForAllUsersEnabled) {
-  auto error_factory = std::make_unique<syncer::SyncErrorFactoryMock>();
-  syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
-                          "Failed to get passwords from store.",
-                          syncer::PASSWORDS);
-  EXPECT_CALL(*error_factory, CreateAndUploadError(_, _))
-      .WillOnce(Return(error));
-
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(Return(false));
-  EXPECT_CALL(*password_store(), DeleteUndecryptableLogins()).Times(0);
-
-  syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, SyncDataList(), std::move(processor_),
-      std::move(error_factory));
-  EXPECT_TRUE(result.error().IsSet());
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-// Database cleanup fails because encryption is unavailable.
-TEST_F(PasswordSyncableServiceTestWithoutDeleteCorruptedPasswords,
-       FailedDeleteUndecryptableLogins) {
-  auto error_factory = std::make_unique<syncer::SyncErrorFactoryMock>();
-  syncer::SyncError error(
-      FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
-      "Failed to get encryption key during database cleanup.",
-      syncer::PASSWORDS);
-  EXPECT_CALL(*error_factory, CreateAndUploadError(_, _))
-      .WillOnce(Return(error));
-
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(Return(false));
-  EXPECT_CALL(*password_store(), DeleteUndecryptableLogins())
-      .WillOnce(Return(DatabaseCleanupResult::kEncryptionUnavailable));
-
-  syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, SyncDataList(), std::move(processor_),
-      std::move(error_factory));
-  EXPECT_TRUE(result.error().IsSet());
-}
-#endif
-
-// Start syncing with an error in ProcessSyncChanges. Subsequent password store
-// updates shouldn't be propagated to Sync.
-TEST_F(PasswordSyncableServiceTest, FailedProcessSyncChanges) {
-  autofill::PasswordForm form;
-  form.signon_realm = kSignonRealm;
-  form.username_value = base::ASCIIToUTF16(kUsername);
-  form.password_value = base::ASCIIToUTF16(kPassword);
-  std::unique_ptr<syncer::SyncErrorFactoryMock> error_factory(
-      new syncer::SyncErrorFactoryMock);
-  syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
-                          "There is a problem", syncer::PASSWORDS);
-  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
-      .WillOnce(AppendForm(form));
-  EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true));
-
-  // ActOnPasswordStoreChanges() below shouldn't generate any changes for Sync.
-  // |processor_| will be destroyed in MergeDataAndStartSyncing().
-  EXPECT_CALL(*processor_, ProcessSyncChanges(_, _))
-      .Times(1)
-      .WillOnce(Return(error));
-  syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing(
-      syncer::PASSWORDS, syncer::SyncDataList(), std::move(processor_),
-      std::move(error_factory));
-  EXPECT_TRUE(result.error().IsSet());
-
-  form.signon_realm = kSignonRealm2;
-  PasswordStoreChangeList list;
-  list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form));
-  service()->ActOnPasswordStoreChanges(list);
-}
-
-// Serialize and deserialize empty federation_origin and make sure it's an empty
-// string.
-TEST_F(PasswordSyncableServiceTest, SerializeEmptyFederation) {
-  autofill::PasswordForm form;
-  EXPECT_TRUE(form.federation_origin.opaque());
-  syncer::SyncData data = SyncDataFromPassword(form);
-  const sync_pb::PasswordSpecificsData& specifics = GetPasswordSpecifics(data);
-  EXPECT_TRUE(specifics.has_federation_url());
-  EXPECT_EQ(std::string(), specifics.federation_url());
-
-  // Deserialize back.
-  form = PasswordFromSpecifics(specifics);
-  EXPECT_TRUE(form.federation_origin.opaque());
-
-  // Make sure that the Origins uploaded incorrectly are still deserialized
-  // correctly.
-  // crbug.com/593380.
-  sync_pb::PasswordSpecificsData specifics1;
-  specifics1.set_federation_url("null");
-  form = PasswordFromSpecifics(specifics1);
-  EXPECT_TRUE(form.federation_origin.opaque());
-}
-
-// Serialize empty PasswordForm and make sure the Sync representation is
-// matching the expectations
-TEST_F(PasswordSyncableServiceTest, SerializeEmptyPasswordForm) {
-  autofill::PasswordForm form;
-  syncer::SyncData data = SyncDataFromPassword(form);
-  const sync_pb::PasswordSpecificsData& specifics = GetPasswordSpecifics(data);
-  EXPECT_TRUE(specifics.has_scheme());
-  EXPECT_EQ(0, specifics.scheme());
-  EXPECT_TRUE(specifics.has_signon_realm());
-  EXPECT_EQ("", specifics.signon_realm());
-  EXPECT_TRUE(specifics.has_origin());
-  EXPECT_EQ("", specifics.origin());
-  EXPECT_TRUE(specifics.has_action());
-  EXPECT_EQ("", specifics.action());
-  EXPECT_TRUE(specifics.has_username_element());
-  EXPECT_EQ("", specifics.username_element());
-  EXPECT_TRUE(specifics.has_username_value());
-  EXPECT_EQ("", specifics.username_value());
-  EXPECT_TRUE(specifics.has_password_element());
-  EXPECT_EQ("", specifics.password_element());
-  EXPECT_TRUE(specifics.has_password_value());
-  EXPECT_EQ("", specifics.password_value());
-  EXPECT_TRUE(specifics.has_date_last_used());
-  EXPECT_EQ(0, specifics.date_last_used());
-  EXPECT_TRUE(specifics.has_date_created());
-  EXPECT_EQ(0, specifics.date_created());
-  EXPECT_TRUE(specifics.has_blacklisted());
-  EXPECT_FALSE(specifics.blacklisted());
-  EXPECT_TRUE(specifics.has_type());
-  EXPECT_EQ(0, specifics.type());
-  EXPECT_TRUE(specifics.has_times_used());
-  EXPECT_EQ(0, specifics.times_used());
-  EXPECT_TRUE(specifics.has_display_name());
-  EXPECT_EQ("", specifics.display_name());
-  EXPECT_TRUE(specifics.has_avatar_url());
-  EXPECT_EQ("", specifics.avatar_url());
-  EXPECT_TRUE(specifics.has_federation_url());
-  EXPECT_EQ("", specifics.federation_url());
-}
-
-// Serialize a PasswordForm with non-default member values and make sure the
-// Sync representation is matching the expectations.
-TEST_F(PasswordSyncableServiceTest, SerializeNonEmptyPasswordForm) {
-  autofill::PasswordForm form;
-  form.scheme = autofill::PasswordForm::Scheme::kUsernameOnly;
-  form.signon_realm = "http://google.com/";
-  form.origin = GURL("https://google.com/origin");
-  form.action = GURL("https://google.com/action");
-  form.username_element = base::ASCIIToUTF16("username_element");
-  form.username_value = base::ASCIIToUTF16("god@google.com");
-  form.password_element = base::ASCIIToUTF16("password_element");
-  form.password_value = base::ASCIIToUTF16("!@#$%^&*()");
-  form.date_last_used = base::Time::FromDeltaSinceWindowsEpoch(
-      base::TimeDelta::FromMicroseconds(100));
-  form.date_created = base::Time::FromInternalValue(100);
-  form.blacklisted_by_user = true;
-  form.type = autofill::PasswordForm::Type::kMaxValue;
-  form.times_used = 11;
-  form.display_name = base::ASCIIToUTF16("Great Peter");
-  form.icon_url = GURL("https://google.com/icon");
-  form.federation_origin = url::Origin::Create(GURL("https://google.com/"));
-
-  syncer::SyncData data = SyncDataFromPassword(form);
-  const sync_pb::PasswordSpecificsData& specifics = GetPasswordSpecifics(data);
-  EXPECT_TRUE(specifics.has_scheme());
-  EXPECT_EQ(static_cast<int>(autofill::PasswordForm::Scheme::kUsernameOnly),
-            specifics.scheme());
-  EXPECT_TRUE(specifics.has_signon_realm());
-  EXPECT_EQ("http://google.com/", specifics.signon_realm());
-  EXPECT_TRUE(specifics.has_origin());
-  EXPECT_EQ("https://google.com/origin", specifics.origin());
-  EXPECT_TRUE(specifics.has_action());
-  EXPECT_EQ("https://google.com/action", specifics.action());
-  EXPECT_TRUE(specifics.has_username_element());
-  EXPECT_EQ("username_element", specifics.username_element());
-  EXPECT_TRUE(specifics.has_username_value());
-  EXPECT_EQ("god@google.com", specifics.username_value());
-  EXPECT_TRUE(specifics.has_password_element());
-  EXPECT_EQ("password_element", specifics.password_element());
-  EXPECT_TRUE(specifics.has_password_value());
-  EXPECT_EQ("!@#$%^&*()", specifics.password_value());
-  EXPECT_TRUE(specifics.has_date_last_used());
-  EXPECT_EQ(100, specifics.date_last_used());
-  EXPECT_TRUE(specifics.has_date_created());
-  EXPECT_EQ(100, specifics.date_created());
-  EXPECT_TRUE(specifics.has_blacklisted());
-  EXPECT_TRUE(specifics.blacklisted());
-  EXPECT_TRUE(specifics.has_type());
-  EXPECT_EQ(static_cast<int>(autofill::PasswordForm::Type::kMaxValue),
-            specifics.type());
-  EXPECT_TRUE(specifics.has_times_used());
-  EXPECT_EQ(11, specifics.times_used());
-  EXPECT_TRUE(specifics.has_display_name());
-  EXPECT_EQ("Great Peter", specifics.display_name());
-  EXPECT_TRUE(specifics.has_avatar_url());
-  EXPECT_EQ("https://google.com/icon", specifics.avatar_url());
-  EXPECT_TRUE(specifics.has_federation_url());
-  EXPECT_EQ("https://google.com", specifics.federation_url());
-}
-
-}  // namespace
-
-}  // namespace password_manager
diff --git a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc
index a31030b1d..9228c4e 100644
--- a/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc
+++ b/components/password_manager/core/browser/ui/bulk_leak_check_service_adapter_unittest.cc
@@ -25,7 +25,6 @@
 #include "components/prefs/testing_pref_service.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
-#include "components/sync/model/syncable_service.h"
 #include "services/network/test/test_shared_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -97,8 +96,7 @@
     auto factory = std::make_unique<MockLeakDetectionCheckFactory>();
     factory_ = factory.get();
     service_.set_leak_factory(std::move(factory));
-    store_->Init(syncer::SyncableService::StartSyncFlare(),
-                 /*prefs=*/nullptr);
+    store_->Init(/*prefs=*/nullptr);
     prefs_.registry()->RegisterBooleanPref(prefs::kPasswordLeakDetectionEnabled,
                                            true);
     prefs_.registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnabled, true);
diff --git a/components/password_manager/core/browser/ui/compromised_credentials_provider_unittest.cc b/components/password_manager/core/browser/ui/compromised_credentials_provider_unittest.cc
index 65daec85..248e7a2 100644
--- a/components/password_manager/core/browser/ui/compromised_credentials_provider_unittest.cc
+++ b/components/password_manager/core/browser/ui/compromised_credentials_provider_unittest.cc
@@ -12,7 +12,6 @@
 #include "components/password_manager/core/browser/compromised_credentials_table.h"
 #include "components/password_manager/core/browser/test_password_store.h"
 #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h"
-#include "components/sync/model/syncable_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -68,9 +67,7 @@
 
 class CompromisedCredentialsProviderTest : public ::testing::Test {
  protected:
-  CompromisedCredentialsProviderTest() {
-    store_->Init(syncer::SyncableService::StartSyncFlare(), /*prefs=*/nullptr);
-  }
+  CompromisedCredentialsProviderTest() { store_->Init(/*prefs=*/nullptr); }
 
   ~CompromisedCredentialsProviderTest() override {
     store_->ShutdownOnUIThread();
diff --git a/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc b/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc
index 1280e0b..7dd6b75 100644
--- a/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc
+++ b/components/password_manager/core/browser/ui/saved_passwords_presenter_unittest.cc
@@ -10,7 +10,6 @@
 #include "base/test/task_environment.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/test_password_store.h"
-#include "components/sync/model/syncable_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -37,9 +36,7 @@
 
 class SavedPasswordsPresenterTest : public ::testing::Test {
  protected:
-  SavedPasswordsPresenterTest() {
-    store_->Init(syncer::SyncableService::StartSyncFlare(), /*prefs=*/nullptr);
-  }
+  SavedPasswordsPresenterTest() { store_->Init(/*prefs=*/nullptr); }
 
   ~SavedPasswordsPresenterTest() override {
     store_->ShutdownOnUIThread();
diff --git a/components/password_manager/core/browser/votes_uploader_unittest.cc b/components/password_manager/core/browser/votes_uploader_unittest.cc
index 2bc7b8a..b99bb700 100644
--- a/components/password_manager/core/browser/votes_uploader_unittest.cc
+++ b/components/password_manager/core/browser/votes_uploader_unittest.cc
@@ -461,7 +461,7 @@
 
   // Init store and expect that adding field info is called.
   scoped_refptr<MockPasswordStore> store = new MockPasswordStore;
-  store->Init(syncer::SyncableService::StartSyncFlare(), /*prefs=*/nullptr);
+  store->Init(/*prefs=*/nullptr);
 
 #if defined(OS_ANDROID)
   EXPECT_CALL(*store, AddFieldInfoImpl).Times(0);
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc
index ce62260b..cd531e8 100644
--- a/components/password_manager/core/common/password_manager_features.cc
+++ b/components/password_manager/core/common/password_manager_features.cc
@@ -81,7 +81,7 @@
 
 // Enables support of filling and saving on username first flow.
 const base::Feature kUsernameFirstFlow = {"UsernameFirstFlow",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Field trial identifier for password generation requirements.
 const char kGenerationRequirementsFieldTrial[] =
diff --git a/components/payments/content/payment_request_state.cc b/components/payments/content/payment_request_state.cc
index 65dbd1a..29add52 100644
--- a/components/payments/content/payment_request_state.cc
+++ b/components/payments/content/payment_request_state.cc
@@ -613,6 +613,7 @@
   selected_app_ = nullptr;
   if (!available_apps_.empty() && available_apps_[0]->CanPreselect()) {
     selected_app_ = available_apps_[0].get();
+    UpdateIsReadyToPayAndNotifyObservers();
   }
 
   // Record the missing required payment fields when no complete payment
diff --git a/components/payments_strings.grdp b/components/payments_strings.grdp
index ef58788..a35958e 100644
--- a/components/payments_strings.grdp
+++ b/components/payments_strings.grdp
@@ -208,6 +208,9 @@
     <message name="IDS_PAYMENTS_PAY_BUTTON" desc="The label for the button that finishes the payment process. Sentence-cased." formatter_data="android_java">
       Pay
     </message>
+    <message name="IDS_PAYMENTS_CONTINUE_BUTTON" desc="The label for the button that continues to the payment handler window. Sentence-cased." formatter_data="android_java">
+      Continue
+    </message>
     <message name="IDS_PAYMENTS_ADD_CONTACT" desc="Text on a button that lets a user add new contact details, like the user's full name, an email address or a phone number. Sentence-cased." formatter_data="android_java">
       Add contact info
     </message>
@@ -232,6 +235,9 @@
     <message name="IDS_PAYMENTS_PAY_BUTTON" desc="The label for the button that finishes the payment process. Title-Cased.">
       Pay
     </message>
+    <message name="IDS_PAYMENTS_CONTINUE_BUTTON" desc="The label for the button that continues to the payment handler window. Title-Cased.">
+      Continue
+    </message>
     <message name="IDS_PAYMENTS_ADD_CONTACT" desc="Text on a button that lets a user add new contact details, like the user's full name, an email address or a phone number. Title-Cased.">
       Add Contact Info
     </message>
diff --git a/components/permissions/permission_manager.cc b/components/permissions/permission_manager.cc
index 8d467ae..33767f2 100644
--- a/components/permissions/permission_manager.cc
+++ b/components/permissions/permission_manager.cc
@@ -526,13 +526,15 @@
 
 bool PermissionManager::IsPermissionOverridableByDevTools(
     content::PermissionType permission,
-    const url::Origin& origin) {
+    const base::Optional<url::Origin>& origin) {
   ContentSettingsType type = PermissionTypeToContentSettingSafe(permission);
   PermissionContextBase* context = GetPermissionContext(type);
 
-  return context && !context->IsPermissionKillSwitchOn() &&
-         context->IsPermissionAvailableToOrigins(origin.GetURL(),
-                                                 origin.GetURL());
+  if (!context || context->IsPermissionKillSwitchOn())
+    return false;
+
+  return !origin || context->IsPermissionAvailableToOrigins(origin->GetURL(),
+                                                            origin->GetURL());
 }
 
 int PermissionManager::SubscribePermissionStatusChange(
@@ -685,7 +687,7 @@
 }
 
 void PermissionManager::SetPermissionOverridesForDevTools(
-    const url::Origin& origin,
+    const base::Optional<url::Origin>& optional_origin,
     const PermissionOverrides& overrides) {
   ContentSettingsTypeOverrides result;
   for (const auto& item : overrides) {
@@ -694,6 +696,8 @@
     if (content_setting != ContentSettingsType::DEFAULT)
       result[content_setting] = PermissionStatusToContentSetting(item.second);
   }
+  const url::Origin& origin =
+      optional_origin.value_or(devtools_global_overrides_origin_);
   devtools_permission_overrides_[origin] = std::move(result);
 }
 
@@ -706,6 +710,8 @@
     ContentSettingsType permission) {
   auto it = devtools_permission_overrides_.find(origin);
   if (it == devtools_permission_overrides_.end())
+    it = devtools_permission_overrides_.find(devtools_global_overrides_origin_);
+  if (it == devtools_permission_overrides_.end())
     return CONTENT_SETTING_DEFAULT;
 
   auto setting_it = it->second.find(permission);
diff --git a/components/permissions/permission_manager.h b/components/permissions/permission_manager.h
index 6f1d9aa5..b685b69 100644
--- a/components/permissions/permission_manager.h
+++ b/components/permissions/permission_manager.h
@@ -111,8 +111,9 @@
       content::PermissionType permission,
       content::RenderFrameHost* render_frame_host,
       const GURL& requesting_origin) override;
-  bool IsPermissionOverridableByDevTools(content::PermissionType permission,
-                                         const url::Origin& origin) override;
+  bool IsPermissionOverridableByDevTools(
+      content::PermissionType permission,
+      const base::Optional<url::Origin>& origin) override;
   int SubscribePermissionStatusChange(
       content::PermissionType permission,
       content::RenderFrameHost* render_frame_host,
@@ -129,7 +130,7 @@
   // For the given |origin|, overrides permissions that belong to |overrides|.
   // These permissions are in-sync with the PermissionController.
   void SetPermissionOverridesForDevTools(
-      const url::Origin& origin,
+      const base::Optional<url::Origin>& origin,
       const PermissionOverrides& overrides) override;
   void ResetPermissionOverridesForDevTools() override;
 
@@ -187,6 +188,7 @@
       base::flat_map<ContentSettingsType, ContentSetting>;
   std::map<url::Origin, ContentSettingsTypeOverrides>
       devtools_permission_overrides_;
+  url::Origin devtools_global_overrides_origin_;
 
   bool is_shutting_down_ = false;
 
diff --git a/components/profile_metrics/BUILD.gn b/components/profile_metrics/BUILD.gn
index a17ec03..35e63969 100644
--- a/components/profile_metrics/BUILD.gn
+++ b/components/profile_metrics/BUILD.gn
@@ -7,6 +7,8 @@
     "browser_profile_type.h",
     "counts.cc",
     "counts.h",
+    "state.cc",
+    "state.h",
   ]
 
   deps = [ "//base" ]
diff --git a/components/profile_metrics/state.cc b/components/profile_metrics/state.cc
new file mode 100644
index 0000000..4a748c8c
--- /dev/null
+++ b/components/profile_metrics/state.cc
@@ -0,0 +1,52 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/profile_metrics/state.h"
+
+#include "base/metrics/histogram_functions.h"
+
+namespace profile_metrics {
+
+namespace {
+
+std::string GetStateSuffix(StateSuffix suffix) {
+  switch (suffix) {
+    case StateSuffix::kAll:
+      return "_All";
+    case StateSuffix::kActiveMultiProfile:
+      return "_ActiveMultiProfile";
+    case StateSuffix::kLatentMultiProfileActive:
+      return "_LatentMultiProfileActive";
+    case StateSuffix::kLatentMultiProfileOthers:
+      return "_LatentMultiProfileOthers";
+    case StateSuffix::kSingleProfile:
+      return "_SingleProfile";
+  }
+}
+
+}  // namespace
+
+void LogProfileAvatar(AvatarState avatar_state, StateSuffix suffix) {
+  base::UmaHistogramEnumeration("Profile.State.Avatar" + GetStateSuffix(suffix),
+                                avatar_state);
+}
+
+void LogProfileName(NameState name_state, StateSuffix suffix) {
+  base::UmaHistogramEnumeration("Profile.State.Name" + GetStateSuffix(suffix),
+                                name_state);
+}
+
+void LogProfileAccountType(UnconsentedPrimaryAccountType account_type,
+                           StateSuffix suffix) {
+  base::UmaHistogramEnumeration(
+      "Profile.State.UnconsentedPrimaryAccountType" + GetStateSuffix(suffix),
+      account_type);
+}
+
+void LogProfileDaysSinceLastUse(int days_since_last_use, StateSuffix suffix) {
+  base::UmaHistogramCounts1000(
+      "Profile.State.LastUsed" + GetStateSuffix(suffix), days_since_last_use);
+}
+
+}  // namespace profile_metrics
\ No newline at end of file
diff --git a/components/profile_metrics/state.h b/components/profile_metrics/state.h
new file mode 100644
index 0000000..9ab55f3f
--- /dev/null
+++ b/components/profile_metrics/state.h
@@ -0,0 +1,80 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PROFILE_METRICS_STATE_H_
+#define COMPONENTS_PROFILE_METRICS_STATE_H_
+
+namespace profile_metrics {
+
+// State for a profile avatar, documenting what Chrome UI exactly shows.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class AvatarState {
+  // All SignedIn* states denote having a primary account (incl. unconsented,
+  // not necessarily syncing).
+  kSignedInGaia =
+      0,  // User has the avatar from GAIA (the default for signed-in users).
+  kSignedInModern = 1,    // User has explicitly selected a modern avatar.
+  kSignedInOld = 2,       // User has explicitly selected an old avatar.
+  kSignedOutDefault = 3,  // Grey silhouette.
+  kSignedOutModern = 4,   // User has explicitly selected a modern avatar.
+  kSignedOutOld = 5,      // User has explicitly selected an old avatar.
+  kMaxValue = kSignedOutOld
+};
+
+// State for a profile name, documenting what Chrome UI exactly shows.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class NameState {
+  kGaiaName = 0,            // The name of the user from Gaia.
+  kGaiaAndCustomName = 1,   // The name of the user from Gaia and the custom
+                            // local name specified by the user.
+  kGaiaAndDefaultName = 2,  // Chrome shows "Person X" alongside the Gaia name
+                            // because it is needed to resolve ambiguity.
+  kCustomName = 3,   // Only a custom name of the profile specified by the user.
+  kDefaultName = 4,  // Only "Person X" since there's nothing better.
+  kMaxValue = kDefaultName
+};
+
+// Type of the unconsented primary account in a profile.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class UnconsentedPrimaryAccountType {
+  kConsumer = 0,
+  kEnterprise = 1,
+  kChild = 2,
+  kSignedOut = 3,
+  kMaxValue = kSignedOut
+};
+
+// Different types of reporting for profile state. This is used as a histogram
+// suffix.
+enum class StateSuffix {
+  kAll,                 // Recorded for all clients and all their profiles.
+  kActiveMultiProfile,  // Recorded for multi-profile users with >=2 active
+                        // profiles, for all their profiles.
+  kLatentMultiProfileActive,  // Recorded for multi-profile users with one
+                              // active profile, only for the active profile.
+  kLatentMultiProfileOthers,  // Recorded for multi-profile users with one
+                              // active profile, only for the non-active
+                              // profiles.
+  kSingleProfile  // Recorded for single-profile users for their single profile.
+};
+
+// Records the state of profile's avatar.
+void LogProfileAvatar(AvatarState avatar_state, StateSuffix suffix);
+
+// Records the state of profile's name.
+void LogProfileName(NameState name_state, StateSuffix suffix);
+
+// Records the state of profile's UPA.
+void LogProfileAccountType(UnconsentedPrimaryAccountType account_type,
+                           StateSuffix suffix);
+
+// Records the days since last use of a profile.
+void LogProfileDaysSinceLastUse(int days_since_last_use, StateSuffix suffix);
+
+}  // namespace profile_metrics
+
+#endif  // COMPONENTS_PROFILE_METRICS_STATE_H_
diff --git a/components/search_engines/template_url_service.h b/components/search_engines/template_url_service.h
index cfda0d1..a1f48e9 100644
--- a/components/search_engines/template_url_service.h
+++ b/components/search_engines/template_url_service.h
@@ -365,7 +365,7 @@
 
   // Returns all syncable TemplateURLs from this model as SyncData. This should
   // include every search engine and no Extension keywords.
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const;
   // Process new search engine changes from Sync, merging them into our local
   // data. This may send notifications if local search engines are added,
   // updated or removed.
diff --git a/components/send_tab_to_self/features.cc b/components/send_tab_to_self/features.cc
index 795a4949..bd1df36d 100644
--- a/components/send_tab_to_self/features.cc
+++ b/components/send_tab_to_self/features.cc
@@ -16,7 +16,7 @@
     "SendTabToSelfWhenSignedIn", base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kSharingRenameDevices{"SharingRenameDevices",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
 bool IsReceivingEnabledByUserOnThisDevice(PrefService* prefs) {
   // TODO(crbug.com/1015322): SyncPrefs is used directly instead of methods in
diff --git a/components/services/storage/indexed_db/scopes/leveldb_scope.cc b/components/services/storage/indexed_db/scopes/leveldb_scope.cc
index 1b3cf3fd..83c31f5c 100644
--- a/components/services/storage/indexed_db/scopes/leveldb_scope.cc
+++ b/components/services/storage/indexed_db/scopes/leveldb_scope.cc
@@ -492,15 +492,12 @@
   read_options.fill_cache = false;
   const std::unique_ptr<leveldb::Iterator> it =
       base::WrapUnique(level_db_->db()->NewIterator(read_options));
-  leveldb::Status s;
   const leveldb::Comparator* const comparator = level_db_->comparator();
-  for (it->Seek(range.first);
-       (s = it->status(), s.ok()) && it->Valid() &&
-       IsKeyBeforeEndOfRange(comparator, it->key(), range.second, true);
-       it->Next()) {
-    return false;
-  }
-  return true;
+
+  it->Seek(range.first);
+  leveldb::Status s = it->status();
+  return !s.ok() || !it->Valid() ||
+         !IsKeyBeforeEndOfRange(comparator, it->key(), range.second, true);
 }
 
 bool LevelDBScope::IsInDeferredDeletionRange(const leveldb::Slice& key) {
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn
index 2c2730ef..e6bcf5d 100644
--- a/components/sync/BUILD.gn
+++ b/components/sync/BUILD.gn
@@ -79,8 +79,6 @@
     "engine/passive_model_worker.h",
     "engine/polling_constants.cc",
     "engine/polling_constants.h",
-    "engine/sequenced_model_worker.cc",
-    "engine/sequenced_model_worker.h",
     "engine/shutdown_reason.cc",
     "engine/shutdown_reason.h",
     "engine/sync_auth_provider.h",
@@ -105,8 +103,6 @@
     "engine/sync_status_observer.h",
     "engine/sync_string_conversions.cc",
     "engine/sync_string_conversions.h",
-    "engine/ui_model_worker.cc",
-    "engine/ui_model_worker.h",
     "engine_impl/all_status.cc",
     "engine_impl/all_status.h",
     "engine_impl/apply_control_data_updates.cc",
@@ -577,18 +573,15 @@
     "base/user_demographics_unittest.cc",
     "base/weak_handle_unittest.cc",
     "driver/about_sync_util_unittest.cc",
-    "driver/async_directory_type_controller_unittest.cc",
     "driver/backend_migrator_unittest.cc",
     "driver/data_type_manager_impl_unittest.cc",
     "driver/file_based_trusted_vault_client_unittest.cc",
-    "driver/generic_change_processor_unittest.cc",
     "driver/glue/sync_engine_impl_unittest.cc",
     "driver/model_association_manager_unittest.cc",
     "driver/model_type_controller_unittest.cc",
     "driver/passphrase_type_metrics_provider_unittest.cc",
     "driver/profile_sync_service_startup_unittest.cc",
     "driver/profile_sync_service_unittest.cc",
-    "driver/shared_change_processor_unittest.cc",
     "driver/startup_controller_unittest.cc",
     "driver/sync_auth_manager_unittest.cc",
     "driver/sync_service_crypto_unittest.cc",
@@ -600,9 +593,7 @@
     "engine/cycle/sync_cycle_snapshot_unittest.cc",
     "engine/model_safe_worker_unittest.cc",
     "engine/net/http_bridge_unittest.cc",
-    "engine/sequenced_model_worker_unittest.cc",
     "engine/sync_backend_registrar_unittest.cc",
-    "engine/ui_model_worker_unittest.cc",
     "engine_impl/apply_control_data_updates_unittest.cc",
     "engine_impl/backoff_delay_provider_unittest.cc",
     "engine_impl/bookmark_update_preprocessing_unittest.cc",
diff --git a/components/sync/driver/BUILD.gn b/components/sync/driver/BUILD.gn
index f4eddd7..548c712 100644
--- a/components/sync/driver/BUILD.gn
+++ b/components/sync/driver/BUILD.gn
@@ -15,8 +15,6 @@
   sources = [
     "about_sync_util.cc",
     "about_sync_util.h",
-    "async_directory_type_controller.cc",
-    "async_directory_type_controller.h",
     "backend_migrator.cc",
     "backend_migrator.h",
     "configure_context.h",
@@ -35,10 +33,6 @@
     "directory_data_type_controller.h",
     "file_based_trusted_vault_client.cc",
     "file_based_trusted_vault_client.h",
-    "generic_change_processor.cc",
-    "generic_change_processor.h",
-    "generic_change_processor_factory.cc",
-    "generic_change_processor_factory.h",
     "glue/sync_engine_backend.cc",
     "glue/sync_engine_backend.h",
     "glue/sync_engine_impl.cc",
@@ -53,10 +47,6 @@
     "passphrase_type_metrics_provider.h",
     "profile_sync_service.cc",
     "profile_sync_service.h",
-    "shared_change_processor.cc",
-    "shared_change_processor.h",
-    "shared_change_processor_ref.cc",
-    "shared_change_processor_ref.h",
     "startup_controller.cc",
     "startup_controller.h",
     "sync_api_component_factory.h",
@@ -162,16 +152,12 @@
 static_library("test_support") {
   testonly = true
   sources = [
-    "async_directory_type_controller_mock.cc",
-    "async_directory_type_controller_mock.h",
     "data_type_controller_mock.cc",
     "data_type_controller_mock.h",
     "data_type_manager_mock.cc",
     "data_type_manager_mock.h",
     "fake_data_type_controller.cc",
     "fake_data_type_controller.h",
-    "fake_generic_change_processor.cc",
-    "fake_generic_change_processor.h",
     "fake_sync_service.cc",
     "fake_sync_service.h",
     "mock_sync_service.cc",
diff --git a/components/sync/driver/async_directory_type_controller.cc b/components/sync/driver/async_directory_type_controller.cc
deleted file mode 100644
index 66fb2b8..0000000
--- a/components/sync/driver/async_directory_type_controller.cc
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/async_directory_type_controller.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "components/sync/base/bind_to_task_runner.h"
-#include "components/sync/base/data_type_histogram.h"
-#include "components/sync/base/model_type.h"
-#include "components/sync/driver/configure_context.h"
-#include "components/sync/driver/generic_change_processor_factory.h"
-#include "components/sync/driver/sync_api_component_factory.h"
-#include "components/sync/driver/sync_client.h"
-#include "components/sync/driver/sync_service.h"
-#include "components/sync/model/data_type_error_handler_impl.h"
-#include "components/sync/model/sync_error.h"
-#include "components/sync/model/sync_merge_result.h"
-#include "components/sync/model/syncable_service.h"
-
-namespace syncer {
-
-SharedChangeProcessor*
-AsyncDirectoryTypeController::CreateSharedChangeProcessor() {
-  return new SharedChangeProcessor(type());
-}
-
-AsyncDirectoryTypeController::AsyncDirectoryTypeController(
-    ModelType type,
-    const base::RepeatingClosure& dump_stack,
-    SyncService* sync_service,
-    SyncClient* sync_client,
-    ModelSafeGroup model_safe_group,
-    scoped_refptr<base::SequencedTaskRunner> model_thread)
-    : DirectoryDataTypeController(type,
-                                  dump_stack,
-                                  sync_service,
-                                  model_safe_group),
-      sync_client_(sync_client),
-      user_share_(nullptr),
-      processor_factory_(new GenericChangeProcessorFactory()),
-      state_(NOT_RUNNING),
-      model_thread_(std::move(model_thread)) {}
-
-void AsyncDirectoryTypeController::LoadModels(
-    const ConfigureContext& configure_context,
-    const ModelLoadCallback& model_load_callback) {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(configure_context.sync_mode, SyncMode::kFull)
-      << " for type " << ModelTypeToString(type());
-
-  model_load_callback_ = model_load_callback;
-
-  if (state() != NOT_RUNNING) {
-    model_load_callback_.Run(type(),
-                             SyncError(FROM_HERE, SyncError::DATATYPE_ERROR,
-                                       "Model already running", type()));
-    return;
-  }
-
-  state_ = MODEL_STARTING;
-  // Since we can't be called multiple times before Stop() is called,
-  // |shared_change_processor_| must be null here.
-  DCHECK(!shared_change_processor_);
-  shared_change_processor_ = CreateSharedChangeProcessor();
-  DCHECK(shared_change_processor_);
-  if (!StartModels()) {
-    // If we are waiting for some external service to load before associating
-    // or we failed to start the models, we exit early.
-    DCHECK(state() == MODEL_STARTING || state() == NOT_RUNNING);
-    return;
-  }
-
-  OnModelLoaded();
-}
-
-void AsyncDirectoryTypeController::OnModelLoaded() {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(state_, MODEL_STARTING);
-  state_ = MODEL_LOADED;
-  model_load_callback_.Run(type(), SyncError());
-}
-
-bool AsyncDirectoryTypeController::StartModels() {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(state_, MODEL_STARTING);
-  // By default, no additional services need to be started before we can proceed
-  // with model association.
-  return true;
-}
-
-void AsyncDirectoryTypeController::StopModels() {
-  DCHECK(CalledOnValidThread());
-}
-
-bool AsyncDirectoryTypeController::PostTaskOnModelThread(
-    const base::Location& from_here,
-    base::OnceClosure task) {
-  DCHECK(CalledOnValidThread());
-  return model_thread_->PostTask(from_here, std::move(task));
-}
-
-void AsyncDirectoryTypeController::StartAssociating(
-    StartCallback start_callback) {
-  DCHECK(CalledOnValidThread());
-  DCHECK(!start_callback.is_null());
-  DCHECK_EQ(state_, MODEL_LOADED);
-  state_ = ASSOCIATING;
-
-  user_share_ = sync_service()->GetUserShare();
-
-  start_callback_ = std::move(start_callback);
-  if (!StartAssociationAsync()) {
-    SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                    "Failed to post StartAssociation", type());
-    SyncMergeResult local_merge_result(type());
-    local_merge_result.set_error(error);
-    StartDone(ASSOCIATION_FAILED, local_merge_result, SyncMergeResult(type()));
-    // StartDone should have cleared the SharedChangeProcessor.
-    DCHECK(!shared_change_processor_);
-    return;
-  }
-}
-
-void AsyncDirectoryTypeController::Stop(ShutdownReason shutdown_reason) {
-  DCHECK(CalledOnValidThread());
-
-  if (state() == NOT_RUNNING)
-    return;
-
-  // Disconnect the change processor. At this point, the
-  // SyncableService can no longer interact with the Syncer, even if
-  // it hasn't finished MergeDataAndStartSyncing.
-  DisconnectSharedChangeProcessor();
-
-  // If we haven't finished starting, we need to abort the start.
-  bool service_started = state() == ASSOCIATING || state() == RUNNING;
-  state_ = service_started ? STOPPING : NOT_RUNNING;
-  StopModels();
-
-  if (service_started)
-    StopSyncableService();
-
-  shared_change_processor_ = nullptr;
-  state_ = NOT_RUNNING;
-}
-
-DataTypeController::State AsyncDirectoryTypeController::state() const {
-  return state_;
-}
-
-void AsyncDirectoryTypeController::SetGenericChangeProcessorFactoryForTest(
-    std::unique_ptr<GenericChangeProcessorFactory> factory) {
-  DCHECK_EQ(state_, NOT_RUNNING);
-  processor_factory_ = std::move(factory);
-}
-
-AsyncDirectoryTypeController::AsyncDirectoryTypeController()
-    : DirectoryDataTypeController(UNSPECIFIED,
-                                  base::NullCallback(),
-                                  nullptr,
-                                  GROUP_PASSIVE),
-      sync_client_(nullptr) {}
-
-AsyncDirectoryTypeController::~AsyncDirectoryTypeController() {}
-
-void AsyncDirectoryTypeController::StartDone(
-    DataTypeController::ConfigureResult start_result,
-    const SyncMergeResult& local_merge_result,
-    const SyncMergeResult& syncer_merge_result) {
-  DCHECK(CalledOnValidThread());
-
-  DataTypeController::State new_state;
-  if (IsSuccessfulResult(start_result)) {
-    new_state = RUNNING;
-  } else {
-    new_state = (start_result == ASSOCIATION_FAILED ? FAILED : NOT_RUNNING);
-  }
-
-  // If we failed to start up, and we haven't been stopped yet, we need to
-  // ensure we clean up the local service and shared change processor properly.
-  if (new_state != RUNNING && state() != NOT_RUNNING && state() != STOPPING) {
-    DisconnectSharedChangeProcessor();
-    StopSyncableService();
-    shared_change_processor_ = nullptr;
-  }
-
-  // It's possible to have StartDone called first from the UI thread
-  // (due to Stop being called) and then posted from the non-UI thread. In
-  // this case, we drop the second call because we've already been stopped.
-  if (state_ == NOT_RUNNING) {
-    return;
-  }
-
-  state_ = new_state;
-  if (state_ != RUNNING) {
-    // Start failed.
-    StopModels();
-    RecordStartFailure(start_result);
-  }
-
-  std::move(start_callback_)
-      .Run(start_result, local_merge_result, syncer_merge_result);
-}
-
-void AsyncDirectoryTypeController::RecordStartFailure(ConfigureResult result) {
-  DCHECK(CalledOnValidThread());
-  UMA_HISTOGRAM_ENUMERATION("Sync.DataTypeStartFailures2",
-                            ModelTypeHistogramValue(type()));
-}
-
-void AsyncDirectoryTypeController::DisableImpl(const SyncError& error) {
-  DCHECK(CalledOnValidThread());
-  if (model_load_callback_) {
-    model_load_callback_.Run(type(), error);
-  }
-}
-
-bool AsyncDirectoryTypeController::StartAssociationAsync() {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(state(), ASSOCIATING);
-  return PostTaskOnModelThread(
-      FROM_HERE,
-      base::BindOnce(
-          &SharedChangeProcessor::StartAssociation, shared_change_processor_,
-          BindToCurrentSequence(base::BindOnce(
-              &AsyncDirectoryTypeController::StartDone, base::AsWeakPtr(this))),
-          sync_client_, processor_factory_.get(), user_share_,
-          CreateErrorHandler()));
-}
-
-ChangeProcessor* AsyncDirectoryTypeController::GetChangeProcessor() const {
-  DCHECK(CalledOnValidThread());
-  DCHECK_EQ(state_, RUNNING);
-  return shared_change_processor_->generic_change_processor();
-}
-
-void AsyncDirectoryTypeController::DisconnectSharedChangeProcessor() {
-  DCHECK(CalledOnValidThread());
-  // |shared_change_processor_| can already be null if Stop() is
-  // called after StartDone(_, FAILED, _).
-  if (shared_change_processor_) {
-    shared_change_processor_->Disconnect();
-  }
-}
-
-void AsyncDirectoryTypeController::StopSyncableService() {
-  DCHECK(CalledOnValidThread());
-  if (shared_change_processor_) {
-    PostTaskOnModelThread(
-        FROM_HERE, base::BindOnce(&SharedChangeProcessor::StopLocalService,
-                                  shared_change_processor_));
-  }
-}
-
-std::unique_ptr<DataTypeErrorHandler>
-AsyncDirectoryTypeController::CreateErrorHandler() {
-  DCHECK(CalledOnValidThread());
-  return std::make_unique<DataTypeErrorHandlerImpl>(
-      base::SequencedTaskRunnerHandle::Get(), dump_stack_,
-      base::BindRepeating(&AsyncDirectoryTypeController::DisableImpl,
-                          base::AsWeakPtr(this)));
-}
-
-}  // namespace syncer
diff --git a/components/sync/driver/async_directory_type_controller.h b/components/sync/driver/async_directory_type_controller.h
deleted file mode 100644
index 0d3eaf57..0000000
--- a/components/sync/driver/async_directory_type_controller.h
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_H_
-#define COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/sequenced_task_runner.h"
-#include "components/sync/driver/directory_data_type_controller.h"
-#include "components/sync/driver/shared_change_processor.h"
-
-namespace syncer {
-
-class SyncClient;
-struct UserShare;
-
-// Implementation for directory based datatypes that interact with their
-// syncable services by posting to model thread. All interaction with datatype
-// controller happens on UI thread.
-class AsyncDirectoryTypeController : public DirectoryDataTypeController {
- public:
-  // |dump_stack| is called when an unrecoverable error occurs.
-  AsyncDirectoryTypeController(
-      ModelType type,
-      const base::RepeatingClosure& dump_stack,
-      SyncService* sync_service,
-      SyncClient* sync_client,
-      ModelSafeGroup model_safe_group,
-      scoped_refptr<base::SequencedTaskRunner> model_thread);
-  ~AsyncDirectoryTypeController() override;
-
-  // DataTypeController interface.
-  void LoadModels(const ConfigureContext& configure_context,
-                  const ModelLoadCallback& model_load_callback) override;
-  void StartAssociating(StartCallback start_callback) override;
-  void Stop(ShutdownReason shutdown_reason) override;
-  ChangeProcessor* GetChangeProcessor() const override;
-  State state() const override;
-
-  // Used by tests to override the factory used to create
-  // GenericChangeProcessors.
-  void SetGenericChangeProcessorFactoryForTest(
-      std::unique_ptr<GenericChangeProcessorFactory> factory);
-
- protected:
-  // For testing only.
-  AsyncDirectoryTypeController();
-
-  // Start any dependent services that need to be running before we can
-  // associate models. The default implementation is a no-op.
-  // Return value:
-  //   True - if models are ready and association can proceed.
-  //   False - if models are not ready. StartAssociationAsync should be called
-  //           when the models are ready.
-  // Note: this is performed on the UI thread.
-  virtual bool StartModels();
-
-  // Perform any DataType controller specific state cleanup before stopping
-  // the datatype controller. The default implementation is a no-op.
-  // Note: this is performed on the UI thread.
-  virtual void StopModels();
-
-  // Posts the given task to the model thread, i.e. the thread the datatype
-  // lives on. Return value: True if task posted successfully, false otherwise.
-  // Default implementation posts task to model_thread_. Types that don't use
-  // TaskRunner need to override this method.
-  virtual bool PostTaskOnModelThread(const base::Location& from_here,
-                                     base::OnceClosure task);
-
-  // Start up complete, update the state and invoke the callback.
-  virtual void StartDone(DataTypeController::ConfigureResult start_result,
-                         const SyncMergeResult& local_merge_result,
-                         const SyncMergeResult& syncer_merge_result);
-
-  // Kick off the association process.
-  virtual bool StartAssociationAsync();
-
-  // Record causes of start failure.
-  virtual void RecordStartFailure(ConfigureResult result);
-
-  // To allow unit tests to control thread interaction during non-ui startup
-  // and shutdown, use a factory method to create the SharedChangeProcessor.
-  virtual SharedChangeProcessor* CreateSharedChangeProcessor();
-
-  // If the DTC is waiting for models to load, once the models are
-  // loaded the datatype service will call this function on DTC to let
-  // us know that it is safe to start associating.
-  void OnModelLoaded();
-
-  std::unique_ptr<DataTypeErrorHandler> CreateErrorHandler() override;
-
- private:
-  // Calls Disconnect() on |shared_change_processor_|, then sets it to
-  // null.  Must be called only by StartDoneImpl() or Stop() (on the
-  // UI thread) and only after a call to Start() (i.e.,
-  // |shared_change_processor_| must be non-null).
-  void DisconnectSharedChangeProcessor();
-
-  // Posts StopLocalService() to the processor on the model type thread.
-  void StopSyncableService();
-
-  // Disable this type with the sync service. Should only be invoked in case of
-  // an unrecoverable error.
-  // Note: this is performed on the UI thread.
-  void DisableImpl(const SyncError& error);
-
-  SyncClient* const sync_client_;
-
-  // UserShare is stored in StartAssociating while on UI thread and
-  // passed to SharedChangeProcessor::Connect on the model thread.
-  UserShare* user_share_;
-
-  // Factory is used by tests to inject custom implementation of
-  // GenericChangeProcessor.
-  std::unique_ptr<GenericChangeProcessorFactory> processor_factory_;
-
-  // State of this datatype controller.
-  State state_;
-
-  // Callbacks for use when starting the datatype.
-  StartCallback start_callback_;
-  ModelLoadCallback model_load_callback_;
-
-  // Task runner of the model thread. Can be nullptr in which case datatype
-  // controller needs to override PostTaskOnModelThread().
-  scoped_refptr<base::SequencedTaskRunner> model_thread_;
-
-  // The shared change processor is the thread-safe interface to the
-  // datatype.  We hold a reference to it from the UI thread so that
-  // we can call Disconnect() on it from Stop()/StartDoneImpl().  Most
-  // of the work is done on the backend thread.
-  //
-  // Lifetime: The SharedChangeProcessor object is created on the UI
-  // thread and passed on to the backend thread.  This reference is
-  // released on the UI thread in Stop()/StartDoneImpl(), but the
-  // backend thread may still have references to it (which is okay,
-  // since we call Disconnect() before releasing the UI thread
-  // reference).
-  scoped_refptr<SharedChangeProcessor> shared_change_processor_;
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_H_
diff --git a/components/sync/driver/async_directory_type_controller_mock.cc b/components/sync/driver/async_directory_type_controller_mock.cc
deleted file mode 100644
index b186fa9..0000000
--- a/components/sync/driver/async_directory_type_controller_mock.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/async_directory_type_controller_mock.h"
-
-#include "components/sync/driver/configure_context.h"
-
-namespace syncer {
-
-AsyncDirectoryTypeControllerMock::AsyncDirectoryTypeControllerMock() {}
-
-AsyncDirectoryTypeControllerMock::~AsyncDirectoryTypeControllerMock() {}
-
-}  // namespace syncer
diff --git a/components/sync/driver/async_directory_type_controller_mock.h b/components/sync/driver/async_directory_type_controller_mock.h
deleted file mode 100644
index 80ce628..0000000
--- a/components/sync/driver/async_directory_type_controller_mock.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_MOCK_H_
-#define COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_MOCK_H_
-
-#include <string>
-
-#include "components/sync/driver/async_directory_type_controller.h"
-#include "components/sync/model/sync_error.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace syncer {
-
-class AsyncDirectoryTypeControllerMock : public AsyncDirectoryTypeController {
- public:
-  AsyncDirectoryTypeControllerMock();
-  ~AsyncDirectoryTypeControllerMock() override;
-
-  // DataTypeController mocks.
-  MOCK_METHOD1(StartAssociating, void(StartCallback start_callback));
-  MOCK_METHOD2(LoadModels,
-               void(const ConfigureContext& configure_context,
-                    const ModelLoadCallback& model_load_callback));
-  MOCK_METHOD1(Stop, void(ShutdownReason));
-  MOCK_CONST_METHOD0(type, ModelType());
-  MOCK_CONST_METHOD0(name, std::string());
-  MOCK_CONST_METHOD0(state, State());
-
-  // AsyncDirectoryTypeController mocks.
-  MOCK_METHOD0(StartModels, bool());
-  MOCK_METHOD0(StopModels, void());
-  MOCK_METHOD2(PostTaskOnModelThread,
-               bool(const base::Location&, base::OnceClosure));
-  MOCK_METHOD3(StartDone,
-               void(DataTypeController::ConfigureResult result,
-                    const SyncMergeResult& local_merge_result,
-                    const SyncMergeResult& syncer_merge_result));
-  MOCK_METHOD1(RecordStartFailure, void(ConfigureResult result));
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_DRIVER_ASYNC_DIRECTORY_TYPE_CONTROLLER_MOCK_H_
diff --git a/components/sync/driver/async_directory_type_controller_unittest.cc b/components/sync/driver/async_directory_type_controller_unittest.cc
deleted file mode 100644
index 47a0e7e..0000000
--- a/components/sync/driver/async_directory_type_controller_unittest.cc
+++ /dev/null
@@ -1,472 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/async_directory_type_controller.h"
-
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/sequenced_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/task_environment.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "components/sync/driver/async_directory_type_controller_mock.h"
-#include "components/sync/driver/configure_context.h"
-#include "components/sync/driver/data_type_controller_mock.h"
-#include "components/sync/driver/fake_sync_service.h"
-#include "components/sync/driver/generic_change_processor_factory.h"
-#include "components/sync/driver/sync_client_mock.h"
-#include "components/sync/engine/model_safe_worker.h"
-#include "components/sync/model/fake_syncable_service.h"
-#include "components/sync/model/sync_change.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace syncer {
-namespace {
-
-using base::WaitableEvent;
-using testing::_;
-using testing::AtLeast;
-using testing::DoAll;
-using testing::InvokeWithoutArgs;
-using testing::Mock;
-using testing::Return;
-using testing::SetArgPointee;
-using testing::StrictMock;
-
-const ModelType kType = AUTOFILL_PROFILE;
-
-ACTION_P(WaitOnEvent, event) {
-  event->Wait();
-}
-
-ACTION_P(SignalEvent, event) {
-  event->Signal();
-}
-
-class SharedChangeProcessorMock : public SharedChangeProcessor {
- public:
-  explicit SharedChangeProcessorMock(ModelType type)
-      : SharedChangeProcessor(type) {}
-
-  base::WeakPtr<SyncableService> Connect(
-      SyncClient*,
-      GenericChangeProcessorFactory*,
-      UserShare*,
-      std::unique_ptr<DataTypeErrorHandler>,
-      const base::WeakPtr<SyncMergeResult>&) override {
-    return std::move(connect_return_);
-  }
-  MOCK_METHOD0(Disconnect, bool());
-  MOCK_METHOD2(ProcessSyncChanges,
-               SyncError(const base::Location&, const SyncChangeList&));
-  MOCK_CONST_METHOD2(GetAllSyncDataReturnError,
-                     SyncError(ModelType, SyncDataList*));
-  MOCK_METHOD0(GetSyncCount, int());
-  MOCK_METHOD1(SyncModelHasUserCreatedNodes, bool(bool*));
-  MOCK_METHOD0(CryptoReadyIfNecessary, bool());
-  MOCK_CONST_METHOD1(GetDataTypeContext, bool(std::string*));
-
-  void SetConnectReturn(base::WeakPtr<SyncableService> service) {
-    connect_return_ = service;
-  }
-
- protected:
-  ~SharedChangeProcessorMock() override { DCHECK(!connect_return_); }
-  MOCK_METHOD2(OnUnrecoverableError,
-               void(const base::Location&, const std::string&));
-
- private:
-  base::WeakPtr<SyncableService> connect_return_;
-  DISALLOW_COPY_AND_ASSIGN(SharedChangeProcessorMock);
-};
-
-class AsyncDirectoryTypeControllerFake : public AsyncDirectoryTypeController {
- public:
-  AsyncDirectoryTypeControllerFake(
-      SyncService* sync_service,
-      SyncClient* sync_client,
-      AsyncDirectoryTypeControllerMock* mock,
-      SharedChangeProcessor* change_processor,
-      scoped_refptr<base::SequencedTaskRunner> backend_task_runner)
-      : AsyncDirectoryTypeController(kType,
-                                     base::NullCallback(),
-                                     sync_service,
-                                     sync_client,
-                                     GROUP_PASSWORD,
-                                     nullptr),
-        blocked_(false),
-        mock_(mock),
-        change_processor_(change_processor),
-        backend_task_runner_(backend_task_runner) {}
-  ~AsyncDirectoryTypeControllerFake() override {}
-
-  // Prevent tasks from being posted on the backend thread until
-  // UnblockBackendTasks() is called.
-  void BlockBackendTasks() { blocked_ = true; }
-
-  // Post pending tasks on the backend thread and start allowing tasks
-  // to be posted on the backend thread again.
-  void UnblockBackendTasks() {
-    blocked_ = false;
-    for (auto& entry : pending_tasks_)
-      PostTaskOnModelThread(entry.from_here, std::move(entry.task));
-    pending_tasks_.clear();
-  }
-
-  SharedChangeProcessor* CreateSharedChangeProcessor() override {
-    return change_processor_.get();
-  }
-
-  std::unique_ptr<DataTypeErrorHandler> CreateErrorHandler() override {
-    return AsyncDirectoryTypeController::CreateErrorHandler();
-  }
-
- protected:
-  bool PostTaskOnModelThread(const base::Location& from_here,
-                             base::OnceClosure task) override {
-    if (blocked_) {
-      pending_tasks_.push_back(PendingTask(from_here, std::move(task)));
-      return true;
-    } else {
-      return backend_task_runner_->PostTask(from_here, std::move(task));
-    }
-  }
-
-  // We mock the following methods because their default implementations do
-  // nothing, but we still want to make sure they're called appropriately.
-  bool StartModels() override { return mock_->StartModels(); }
-  void StopModels() override { mock_->StopModels(); }
-  void RecordStartFailure(DataTypeController::ConfigureResult result) override {
-    mock_->RecordStartFailure(result);
-  }
-
- private:
-  struct PendingTask {
-    PendingTask(const base::Location& from_here, base::OnceClosure task)
-        : from_here(from_here), task(std::move(task)) {}
-
-    base::Location from_here;
-    base::OnceClosure task;
-  };
-
-  bool blocked_;
-  std::vector<PendingTask> pending_tasks_;
-  AsyncDirectoryTypeControllerMock* mock_;
-  scoped_refptr<SharedChangeProcessor> change_processor_;
-  scoped_refptr<base::SequencedTaskRunner> backend_task_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(AsyncDirectoryTypeControllerFake);
-};
-
-class SyncAsyncDirectoryTypeControllerTest : public testing::Test {
- public:
-  SyncAsyncDirectoryTypeControllerTest()
-      : task_environment_(
-            base::test::SingleThreadTaskEnvironment::MainThreadType::UI),
-        backend_thread_("dbthread") {}
-
-  void SetUp() override {
-    backend_thread_.Start();
-    change_processor_ = new SharedChangeProcessorMock(kType);
-    // All of these are refcounted, so don't need to be released.
-    dtc_mock_ =
-        std::make_unique<StrictMock<AsyncDirectoryTypeControllerMock>>();
-    non_ui_dtc_ = std::make_unique<AsyncDirectoryTypeControllerFake>(
-        &sync_service_, &sync_client_, dtc_mock_.get(), change_processor_.get(),
-        backend_thread_.task_runner());
-  }
-
-  void TearDown() override { backend_thread_.Stop(); }
-
-  void WaitForDTC() {
-    WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL,
-                       base::WaitableEvent::InitialState::NOT_SIGNALED);
-    backend_thread_.task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&SyncAsyncDirectoryTypeControllerTest::SignalDone,
-                       &done));
-    done.TimedWait(TestTimeouts::action_timeout());
-    if (!done.IsSignaled()) {
-      ADD_FAILURE() << "Timed out waiting for DB thread to finish.";
-    }
-    base::RunLoop().RunUntilIdle();
-  }
-
- protected:
-  void SetStartExpectations() {
-    EXPECT_CALL(*dtc_mock_, StartModels()).WillOnce(Return(true));
-    EXPECT_CALL(model_load_callback_, Run(_, _));
-  }
-
-  void SetAssociateExpectations() {
-    change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
-    EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary())
-        .WillOnce(Return(true));
-    EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_))
-        .WillOnce(DoAll(SetArgPointee<0>(true), Return(true)));
-    EXPECT_CALL(*change_processor_, GetAllSyncDataReturnError(_, _))
-        .WillOnce(Return(SyncError()));
-    EXPECT_CALL(*change_processor_, GetSyncCount()).WillOnce(Return(0));
-  }
-
-  void SetActivateExpectations(DataTypeController::ConfigureResult result) {
-    EXPECT_CALL(start_callback_, Run(result, _, _));
-  }
-
-  void SetStopExpectations() {
-    EXPECT_CALL(*dtc_mock_, StopModels());
-    EXPECT_CALL(*change_processor_, Disconnect()).WillOnce(Return(true));
-  }
-
-  void SetStartFailExpectations(DataTypeController::ConfigureResult result) {
-    EXPECT_CALL(*dtc_mock_, StopModels()).Times(AtLeast(1));
-    EXPECT_CALL(*dtc_mock_, RecordStartFailure(result));
-    EXPECT_CALL(start_callback_, Run(result, _, _));
-  }
-
-  void Start() {
-    non_ui_dtc_->LoadModels(
-        ConfigureContext(),
-        base::BindRepeating(&ModelLoadCallbackMock::Run,
-                            base::Unretained(&model_load_callback_)));
-    non_ui_dtc_->StartAssociating(base::BindOnce(
-        &StartCallbackMock::Run, base::Unretained(&start_callback_)));
-  }
-
-  static void SignalDone(WaitableEvent* done) { done->Signal(); }
-
-  base::test::SingleThreadTaskEnvironment task_environment_;
-  base::Thread backend_thread_;
-
-  StartCallbackMock start_callback_;
-  ModelLoadCallbackMock model_load_callback_;
-  FakeSyncService sync_service_;
-  testing::NiceMock<SyncClientMock> sync_client_;
-  // Must be destroyed after non_ui_dtc_.
-  FakeSyncableService syncable_service_;
-  std::unique_ptr<AsyncDirectoryTypeControllerFake> non_ui_dtc_;
-  std::unique_ptr<AsyncDirectoryTypeControllerMock> dtc_mock_;
-  scoped_refptr<SharedChangeProcessorMock> change_processor_;
-  std::unique_ptr<SyncChangeProcessor> saved_change_processor_;
-};
-
-TEST_F(SyncAsyncDirectoryTypeControllerTest, StartOk) {
-  SetStartExpectations();
-  SetAssociateExpectations();
-  SetActivateExpectations(DataTypeController::OK);
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
-}
-
-TEST_F(SyncAsyncDirectoryTypeControllerTest, StartFirstRun) {
-  SetStartExpectations();
-  change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
-  EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary())
-      .WillOnce(Return(true));
-  EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_))
-      .WillOnce(DoAll(SetArgPointee<0>(false), Return(true)));
-  EXPECT_CALL(*change_processor_, GetAllSyncDataReturnError(_, _))
-      .WillOnce(Return(SyncError()));
-  SetActivateExpectations(DataTypeController::OK_FIRST_RUN);
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
-}
-
-// Start the DTC and have StartModels() return false.  Then, stop the
-// DTC without finishing model startup.  It should stop cleanly.
-TEST_F(SyncAsyncDirectoryTypeControllerTest, AbortDuringStartModels) {
-  EXPECT_CALL(*dtc_mock_, StartModels()).WillOnce(Return(false));
-  EXPECT_CALL(*dtc_mock_, StopModels());
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  non_ui_dtc_->LoadModels(
-      ConfigureContext(),
-      base::BindRepeating(&ModelLoadCallbackMock::Run,
-                          base::Unretained(&model_load_callback_)));
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::MODEL_STARTING, non_ui_dtc_->state());
-  non_ui_dtc_->Stop(STOP_SYNC);
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-}
-
-// Start the DTC and have MergeDataAndStartSyncing() return an error.
-// The DTC should become disabled, and the DTC should still stop
-// cleanly.
-TEST_F(SyncAsyncDirectoryTypeControllerTest, StartAssociationFailed) {
-  SetStartExpectations();
-  change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
-  EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary())
-      .WillOnce(Return(true));
-  EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_))
-      .WillOnce(DoAll(SetArgPointee<0>(true), Return(true)));
-  EXPECT_CALL(*change_processor_, GetAllSyncDataReturnError(_, _))
-      .WillOnce(Return(SyncError()));
-  SetStartFailExpectations(DataTypeController::ASSOCIATION_FAILED);
-  // Set up association to fail with an association failed error.
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  syncable_service_.set_merge_data_and_start_syncing_error(SyncError(
-      FROM_HERE, SyncError::DATATYPE_ERROR, "Sync Error", non_ui_dtc_->type()));
-  Start();
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::FAILED, non_ui_dtc_->state());
-  non_ui_dtc_->Stop(STOP_SYNC);
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-}
-
-TEST_F(SyncAsyncDirectoryTypeControllerTest,
-       StartAssociationTriggersUnrecoverableError) {
-  SetStartExpectations();
-  SetStartFailExpectations(DataTypeController::UNRECOVERABLE_ERROR);
-  // Set up association to fail with an unrecoverable error.
-  change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
-  EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary())
-      .WillRepeatedly(Return(true));
-  EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_))
-      .WillRepeatedly(DoAll(SetArgPointee<0>(false), Return(false)));
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-}
-
-TEST_F(SyncAsyncDirectoryTypeControllerTest, StartAssociationCryptoNotReady) {
-  SetStartExpectations();
-  SetStartFailExpectations(DataTypeController::NEEDS_CRYPTO);
-  // Set up association to fail with a NEEDS_CRYPTO error.
-  change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
-  EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary())
-      .WillRepeatedly(Return(false));
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-}
-
-// Trigger a Stop() call when we check if the model associator has user created
-// nodes.
-TEST_F(SyncAsyncDirectoryTypeControllerTest, AbortDuringAssociation) {
-  WaitableEvent wait_for_db_thread_pause(
-      base::WaitableEvent::ResetPolicy::AUTOMATIC,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent pause_db_thread(
-      base::WaitableEvent::ResetPolicy::AUTOMATIC,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  SetStartExpectations();
-  change_processor_->SetConnectReturn(syncable_service_.AsWeakPtr());
-  EXPECT_CALL(*change_processor_, CryptoReadyIfNecessary())
-      .WillOnce(Return(true));
-  EXPECT_CALL(*change_processor_, SyncModelHasUserCreatedNodes(_))
-      .WillOnce(DoAll(SignalEvent(&wait_for_db_thread_pause),
-                      WaitOnEvent(&pause_db_thread), SetArgPointee<0>(true),
-                      Return(true)));
-  EXPECT_CALL(*change_processor_, GetAllSyncDataReturnError(_, _))
-      .WillOnce(Return(SyncError(FROM_HERE, SyncError::DATATYPE_ERROR,
-                                 "Disconnected.", kType)));
-  EXPECT_CALL(*dtc_mock_, StopModels());
-  EXPECT_CALL(*change_processor_, Disconnect())
-      .WillOnce(DoAll(SignalEvent(&pause_db_thread), Return(true)));
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  wait_for_db_thread_pause.Wait();
-  non_ui_dtc_->Stop(STOP_SYNC);
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-}
-
-// Start the DTC while the backend tasks are blocked. Then stop the DTC before
-// the backend tasks get a chance to run.
-TEST_F(SyncAsyncDirectoryTypeControllerTest, StartAfterSyncShutdown) {
-  non_ui_dtc_->BlockBackendTasks();
-
-  SetStartExpectations();
-  // We don't expect StopSyncing to be called because local_service_ will never
-  // have been set.
-  SetStopExpectations();
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  non_ui_dtc_->Stop(STOP_SYNC);
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Mock::VerifyAndClearExpectations(change_processor_.get());
-  Mock::VerifyAndClearExpectations(dtc_mock_.get());
-
-  non_ui_dtc_->UnblockBackendTasks();
-  WaitForDTC();
-}
-
-TEST_F(SyncAsyncDirectoryTypeControllerTest, Stop) {
-  SetStartExpectations();
-  SetAssociateExpectations();
-  SetActivateExpectations(DataTypeController::OK);
-  SetStopExpectations();
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
-  non_ui_dtc_->Stop(STOP_SYNC);
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-}
-
-// Start the DTC then block its backend tasks.  While its backend
-// tasks are blocked, stop and start it again, then unblock its
-// backend tasks.  The (delayed) running of the backend tasks from the
-// stop after the restart shouldn't cause any problems.
-TEST_F(SyncAsyncDirectoryTypeControllerTest, StopStart) {
-  SetStartExpectations();
-  SetAssociateExpectations();
-  SetActivateExpectations(DataTypeController::OK);
-  SetStopExpectations();
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
-
-  non_ui_dtc_->BlockBackendTasks();
-  non_ui_dtc_->Stop(STOP_SYNC);
-  SetStartExpectations();
-  SetAssociateExpectations();
-  SetActivateExpectations(DataTypeController::OK);
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  non_ui_dtc_->UnblockBackendTasks();
-
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
-}
-
-TEST_F(SyncAsyncDirectoryTypeControllerTest, OnUnrecoverableError) {
-  SetStartExpectations();
-  SetAssociateExpectations();
-  SetActivateExpectations(DataTypeController::OK);
-  EXPECT_EQ(DataTypeController::NOT_RUNNING, non_ui_dtc_->state());
-  Start();
-  WaitForDTC();
-  EXPECT_EQ(DataTypeController::RUNNING, non_ui_dtc_->state());
-
-  testing::Mock::VerifyAndClearExpectations(&start_callback_);
-  EXPECT_CALL(model_load_callback_, Run(_, _));
-  SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR, "error",
-                  non_ui_dtc_->type());
-  backend_thread_.task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&DataTypeErrorHandler::OnUnrecoverableError,
-                                non_ui_dtc_->CreateErrorHandler(), error));
-  WaitForDTC();
-}
-
-}  // namespace
-
-}  // namespace syncer
diff --git a/components/sync/driver/fake_generic_change_processor.cc b/components/sync/driver/fake_generic_change_processor.cc
deleted file mode 100644
index 4492558..0000000
--- a/components/sync/driver/fake_generic_change_processor.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/fake_generic_change_processor.h"
-
-#include <utility>
-
-#include "base/location.h"
-#include "base/memory/weak_ptr.h"
-#include "components/sync/model/syncable_service.h"
-
-namespace syncer {
-
-FakeGenericChangeProcessor::FakeGenericChangeProcessor(ModelType type)
-    : GenericChangeProcessor(type,
-                             nullptr,
-                             base::WeakPtr<SyncableService>(),
-                             base::WeakPtr<SyncMergeResult>(),
-                             nullptr),
-      sync_model_has_user_created_nodes_(true),
-      sync_model_has_user_created_nodes_success_(true) {}
-
-FakeGenericChangeProcessor::~FakeGenericChangeProcessor() {}
-
-void FakeGenericChangeProcessor::set_sync_model_has_user_created_nodes(
-    bool has_nodes) {
-  sync_model_has_user_created_nodes_ = has_nodes;
-}
-void FakeGenericChangeProcessor::set_sync_model_has_user_created_nodes_success(
-    bool success) {
-  sync_model_has_user_created_nodes_success_ = success;
-}
-
-SyncError FakeGenericChangeProcessor::ProcessSyncChanges(
-    const base::Location& from_here,
-    const SyncChangeList& change_list) {
-  return SyncError();
-}
-
-SyncError FakeGenericChangeProcessor::GetAllSyncDataReturnError(
-    SyncDataList* current_sync_data) const {
-  return SyncError();
-}
-
-bool FakeGenericChangeProcessor::GetDataTypeContext(
-    std::string* context) const {
-  return false;
-}
-
-int FakeGenericChangeProcessor::GetSyncCount() {
-  return 0;
-}
-
-bool FakeGenericChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) {
-  *has_nodes = sync_model_has_user_created_nodes_;
-  return sync_model_has_user_created_nodes_success_;
-}
-
-bool FakeGenericChangeProcessor::CryptoReadyIfNecessary() {
-  return true;
-}
-
-FakeGenericChangeProcessorFactory::FakeGenericChangeProcessorFactory(
-    std::unique_ptr<FakeGenericChangeProcessor> processor)
-    : processor_(std::move(processor)) {}
-
-FakeGenericChangeProcessorFactory::~FakeGenericChangeProcessorFactory() {}
-
-std::unique_ptr<GenericChangeProcessor>
-FakeGenericChangeProcessorFactory::CreateGenericChangeProcessor(
-    ModelType type,
-    UserShare* user_share,
-    std::unique_ptr<DataTypeErrorHandler> error_handler,
-    const base::WeakPtr<SyncableService>& local_service,
-    const base::WeakPtr<SyncMergeResult>& merge_result) {
-  return std::move(processor_);
-}
-
-}  // namespace syncer
diff --git a/components/sync/driver/fake_generic_change_processor.h b/components/sync/driver/fake_generic_change_processor.h
deleted file mode 100644
index d72d66c1..0000000
--- a/components/sync/driver/fake_generic_change_processor.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_DRIVER_FAKE_GENERIC_CHANGE_PROCESSOR_H_
-#define COMPONENTS_SYNC_DRIVER_FAKE_GENERIC_CHANGE_PROCESSOR_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "components/sync/base/model_type.h"
-#include "components/sync/driver/generic_change_processor.h"
-#include "components/sync/driver/generic_change_processor_factory.h"
-#include "components/sync/driver/sync_api_component_factory.h"
-#include "components/sync/model/sync_error.h"
-
-namespace syncer {
-
-// A fake GenericChangeProcessor that can return arbitrary values.
-class FakeGenericChangeProcessor : public GenericChangeProcessor {
- public:
-  explicit FakeGenericChangeProcessor(ModelType type);
-  ~FakeGenericChangeProcessor() override;
-
-  // Setters for GenericChangeProcessor implementation results.
-  void set_sync_model_has_user_created_nodes(bool has_nodes);
-  void set_sync_model_has_user_created_nodes_success(bool success);
-
-  // GenericChangeProcessor implementations.
-  SyncError ProcessSyncChanges(const base::Location& from_here,
-                               const SyncChangeList& change_list) override;
-  SyncError GetAllSyncDataReturnError(SyncDataList* data) const override;
-  bool GetDataTypeContext(std::string* context) const override;
-  int GetSyncCount() override;
-  bool SyncModelHasUserCreatedNodes(bool* has_nodes) override;
-  bool CryptoReadyIfNecessary() override;
-
- private:
-  bool sync_model_has_user_created_nodes_;
-  bool sync_model_has_user_created_nodes_success_;
-};
-
-// Define a factory for FakeGenericChangeProcessor for convenience.
-class FakeGenericChangeProcessorFactory : public GenericChangeProcessorFactory {
- public:
-  explicit FakeGenericChangeProcessorFactory(
-      std::unique_ptr<FakeGenericChangeProcessor> processor);
-  ~FakeGenericChangeProcessorFactory() override;
-  std::unique_ptr<GenericChangeProcessor> CreateGenericChangeProcessor(
-      ModelType type,
-      UserShare* user_share,
-      std::unique_ptr<DataTypeErrorHandler> error_handler,
-      const base::WeakPtr<SyncableService>& local_service,
-      const base::WeakPtr<SyncMergeResult>& merge_result) override;
-
- private:
-  std::unique_ptr<FakeGenericChangeProcessor> processor_;
-  DISALLOW_COPY_AND_ASSIGN(FakeGenericChangeProcessorFactory);
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_DRIVER_FAKE_GENERIC_CHANGE_PROCESSOR_H_
diff --git a/components/sync/driver/generic_change_processor.cc b/components/sync/driver/generic_change_processor.cc
deleted file mode 100644
index 71f77d9..0000000
--- a/components/sync/driver/generic_change_processor.cc
+++ /dev/null
@@ -1,582 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/generic_change_processor.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "base/location.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "components/sync/base/unrecoverable_error_handler.h"
-#include "components/sync/driver/sync_api_component_factory.h"
-#include "components/sync/model/local_change_observer.h"
-#include "components/sync/model/sync_change.h"
-#include "components/sync/model/sync_error.h"
-#include "components/sync/model/syncable_service.h"
-#include "components/sync/syncable/base_node.h"
-#include "components/sync/syncable/change_record.h"
-#include "components/sync/syncable/entry.h"  // TODO(tim): Bug 123674.
-#include "components/sync/syncable/read_node.h"
-#include "components/sync/syncable/read_transaction.h"
-#include "components/sync/syncable/write_node.h"
-#include "components/sync/syncable/write_transaction.h"
-
-namespace syncer {
-
-namespace {
-
-const int kContextSizeLimit = 1024;  // Datatype context size limit.
-
-void SetNodeSpecifics(const sync_pb::EntitySpecifics& entity_specifics,
-                      WriteNode* write_node) {
-  if (GetModelTypeFromSpecifics(entity_specifics) == PASSWORDS) {
-    write_node->SetPasswordSpecifics(
-        entity_specifics.password().client_only_encrypted_data());
-  } else {
-    write_node->SetEntitySpecifics(entity_specifics);
-  }
-}
-
-SyncData BuildRemoteSyncData(int64_t sync_id, const ReadNode& read_node) {
-  switch (read_node.GetModelType()) {
-    case PASSWORDS: {
-      // Passwords must be accessed differently, to account for their
-      // encryption, and stored into a temporary EntitySpecifics.
-      sync_pb::EntitySpecifics password_holder;
-      password_holder.mutable_password()
-          ->mutable_client_only_encrypted_data()
-          ->CopyFrom(read_node.GetPasswordSpecifics());
-      return SyncData::CreateRemoteData(sync_id, password_holder);
-    }
-    case SESSIONS:
-      // Include tag hashes for sessions data type to allow discarding during
-      // merge if re-hashing by the service gives a different value. This is to
-      // allow removal of incorrectly hashed values, see crbug.com/604657. This
-      // cannot be done in the processor because only the service knows how to
-      // generate a tag from the specifics. We don't set this value for other
-      // data types because they shouldn't need it and it costs memory to hold
-      // another copy of this string around.
-      return SyncData::CreateRemoteData(
-          sync_id, read_node.GetEntitySpecifics(),
-          read_node.GetEntry()->GetUniqueClientTag());
-    default:
-      // Use the specifics directly, encryption has already been handled.
-      return SyncData::CreateRemoteData(sync_id,
-                                        read_node.GetEntitySpecifics());
-  }
-}
-
-}  // namespace
-
-GenericChangeProcessor::GenericChangeProcessor(
-    ModelType type,
-    std::unique_ptr<DataTypeErrorHandler> error_handler,
-    const base::WeakPtr<SyncableService>& local_service,
-    const base::WeakPtr<SyncMergeResult>& merge_result,
-    UserShare* user_share)
-    : ChangeProcessor(std::move(error_handler)),
-      type_(type),
-      local_service_(local_service),
-      merge_result_(merge_result),
-      share_handle_(user_share) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  DCHECK_NE(type_, UNSPECIFIED);
-}
-
-GenericChangeProcessor::~GenericChangeProcessor() {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-}
-
-void GenericChangeProcessor::ApplyChangesFromSyncModel(
-    const BaseTransaction* trans,
-    int64_t model_version,
-    const ImmutableChangeRecordList& changes) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  DCHECK(syncer_changes_.empty());
-  for (auto it = changes.Get().begin(); it != changes.Get().end(); ++it) {
-    if (it->action == ChangeRecord::ACTION_DELETE) {
-      std::unique_ptr<sync_pb::EntitySpecifics> specifics;
-      if (it->specifics.has_password()) {
-        DCHECK(it->extra.has_value());
-        specifics = std::make_unique<sync_pb::EntitySpecifics>(it->specifics);
-        specifics->mutable_password()
-            ->mutable_client_only_encrypted_data()
-            ->CopyFrom(it->extra->unencrypted());
-      }
-      syncer_changes_.push_back(
-          SyncChange(FROM_HERE, SyncChange::ACTION_DELETE,
-                     SyncData::CreateRemoteData(
-                         it->id, specifics ? *specifics : it->specifics)));
-    } else {
-      SyncChange::SyncChangeType action =
-          (it->action == ChangeRecord::ACTION_ADD) ? SyncChange::ACTION_ADD
-                                                   : SyncChange::ACTION_UPDATE;
-      // Need to load specifics from node.
-      ReadNode read_node(trans);
-      if (read_node.InitByIdLookup(it->id) != BaseNode::INIT_OK) {
-        SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                        "Failed to look up data for received change with id " +
-                            base::NumberToString(it->id),
-                        GetModelTypeFromSpecifics(it->specifics));
-        error_handler()->OnUnrecoverableError(error);
-        return;
-      }
-      syncer_changes_.push_back(SyncChange(
-          FROM_HERE, action, BuildRemoteSyncData(it->id, read_node)));
-    }
-  }
-}
-
-void GenericChangeProcessor::CommitChangesFromSyncModel() {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  if (syncer_changes_.empty())
-    return;
-  if (!local_service_) {
-    ModelType type = syncer_changes_[0].sync_data().GetDataType();
-    SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                    "Local service destroyed.", type);
-    error_handler()->OnUnrecoverableError(error);
-    return;
-  }
-  SyncError error =
-      local_service_->ProcessSyncChanges(FROM_HERE, syncer_changes_);
-  syncer_changes_.clear();
-  if (error.IsSet())
-    error_handler()->OnUnrecoverableError(error);
-}
-
-SyncDataList GenericChangeProcessor::GetAllSyncData(ModelType type) const {
-  DCHECK_EQ(type_, type);
-  // This is slow / memory intensive.  Should be used sparingly by datatypes.
-  SyncDataList data;
-  GetAllSyncDataReturnError(&data);
-  return data;
-}
-
-SyncError GenericChangeProcessor::UpdateDataTypeContext(
-    ModelType type,
-    SyncChangeProcessor::ContextRefreshStatus refresh_status,
-    const std::string& context) {
-  DCHECK(ProtocolTypes().Has(type));
-  DCHECK_EQ(type_, type);
-
-  if (context.size() > static_cast<size_t>(kContextSizeLimit)) {
-    return SyncError(FROM_HERE, SyncError::DATATYPE_ERROR,
-                     "Context size limit exceeded.", type);
-  }
-
-  WriteTransaction trans(FROM_HERE, share_handle());
-  trans.SetDataTypeContext(type, refresh_status, context);
-
-  // TODO(zea): plumb a pointer to the PSS or SyncManagerImpl here so we can
-  // trigger a datatype nudge if |refresh_status == REFRESH_NEEDED|.
-
-  return SyncError();
-}
-
-void GenericChangeProcessor::AddLocalChangeObserver(
-    LocalChangeObserver* observer) {
-  local_change_observers_.AddObserver(observer);
-}
-
-void GenericChangeProcessor::RemoveLocalChangeObserver(
-    LocalChangeObserver* observer) {
-  local_change_observers_.RemoveObserver(observer);
-}
-
-SyncError GenericChangeProcessor::GetAllSyncDataReturnError(
-    SyncDataList* current_sync_data) const {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  std::string type_name = ModelTypeToString(type_);
-  ReadTransaction trans(FROM_HERE, share_handle());
-  ReadNode root(&trans);
-  if (root.InitTypeRoot(type_) != BaseNode::INIT_OK) {
-    SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                    "Server did not create the top-level " + type_name +
-                        " node. We might be running against an out-of-"
-                        "date server.",
-                    type_);
-    return error;
-  }
-
-  // TODO(akalin): We'll have to do a tree traversal for bookmarks.
-  DCHECK_NE(type_, BOOKMARKS);
-
-  std::vector<int64_t> child_ids;
-  root.GetChildIds(&child_ids);
-
-  current_sync_data->reserve(current_sync_data->size() + child_ids.size());
-  for (int64_t child_id : child_ids) {
-    ReadNode sync_child_node(&trans);
-    if (sync_child_node.InitByIdLookup(child_id) != BaseNode::INIT_OK) {
-      SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                      "Failed to fetch child node for type " + type_name + ".",
-                      type_);
-      return error;
-    }
-    current_sync_data->push_back(
-        BuildRemoteSyncData(sync_child_node.GetId(), sync_child_node));
-  }
-  return SyncError();
-}
-
-bool GenericChangeProcessor::GetDataTypeContext(std::string* context) const {
-  ReadTransaction trans(FROM_HERE, share_handle());
-  sync_pb::DataTypeContext context_proto;
-  trans.GetDataTypeContext(type_, &context_proto);
-  if (!context_proto.has_context())
-    return false;
-
-  DCHECK_EQ(type_,
-            GetModelTypeFromSpecificsFieldNumber(context_proto.data_type_id()));
-  *context = context_proto.context();
-  return true;
-}
-
-int GenericChangeProcessor::GetSyncCount() {
-  ReadTransaction trans(FROM_HERE, share_handle());
-  ReadNode root(&trans);
-  if (root.InitTypeRoot(type_) != BaseNode::INIT_OK)
-    return 0;
-
-  // Subtract one to account for type's root node.
-  return root.GetTotalNodeCount() - 1;
-}
-
-namespace {
-
-// WARNING: this code is sensitive to compiler optimizations. Be careful
-// modifying any code around an OnUnrecoverableError call, else the compiler
-// attempts to merge it with other calls, losing useful information in
-// breakpad uploads.
-SyncError LogLookupFailure(BaseNode::InitByLookupResult lookup_result,
-                           const base::Location& from_here,
-                           const std::string& error_prefix,
-                           ModelType type,
-                           DataTypeErrorHandler* error_handler) {
-  switch (lookup_result) {
-    case BaseNode::INIT_FAILED_ENTRY_NOT_GOOD: {
-      SyncError error;
-      error.Reset(
-          from_here,
-          error_prefix + "could not find entry matching the lookup criteria.",
-          type);
-      error_handler->OnUnrecoverableError(error);
-      LOG(ERROR) << "Delete: Bad entry.";
-      return error;
-    }
-    case BaseNode::INIT_FAILED_ENTRY_IS_DEL: {
-      SyncError error;
-      error.Reset(from_here, error_prefix + "entry is already deleted.", type);
-      error_handler->OnUnrecoverableError(error);
-      LOG(ERROR) << "Delete: Deleted entry.";
-      return error;
-    }
-    case BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY: {
-      SyncError error;
-      error.Reset(from_here, error_prefix + "unable to decrypt", type);
-      error_handler->OnUnrecoverableError(error);
-      LOG(ERROR) << "Delete: Undecryptable entry.";
-      return error;
-    }
-    case BaseNode::INIT_FAILED_PRECONDITION: {
-      SyncError error;
-      error.Reset(from_here,
-                  error_prefix + "a precondition was not met for calling init.",
-                  type);
-      error_handler->OnUnrecoverableError(error);
-      LOG(ERROR) << "Delete: Failed precondition.";
-      return error;
-    }
-    default: {
-      SyncError error;
-      // Should have listed all the possible error cases above.
-      error.Reset(from_here, error_prefix + "unknown error", type);
-      error_handler->OnUnrecoverableError(error);
-      LOG(ERROR) << "Delete: Unknown error.";
-      return error;
-    }
-  }
-}
-
-}  // namespace
-
-SyncError GenericChangeProcessor::AttemptDelete(
-    const SyncChange& change,
-    ModelType type,
-    const std::string& type_str,
-    WriteNode* node,
-    DataTypeErrorHandler* error_handler) {
-  DCHECK_EQ(change.change_type(), SyncChange::ACTION_DELETE);
-  if (change.sync_data().IsLocal()) {
-    const std::string& tag = SyncDataLocal(change.sync_data()).GetTag();
-    if (tag.empty()) {
-      SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                      "Failed to delete " + type_str +
-                          " node. Local data, empty tag. " +
-                          change.location().ToString(),
-                      type);
-      error_handler->OnUnrecoverableError(error);
-      NOTREACHED();
-      return error;
-    }
-
-    BaseNode::InitByLookupResult result =
-        node->InitByClientTagLookup(change.sync_data().GetDataType(), tag);
-    if (result != BaseNode::INIT_OK) {
-      return LogLookupFailure(result, FROM_HERE,
-                              "Failed to delete " + type_str +
-                                  " node. Local data. " +
-                                  change.location().ToString(),
-                              type, error_handler);
-    }
-  } else {
-    BaseNode::InitByLookupResult result =
-        node->InitByIdLookup(SyncDataRemote(change.sync_data()).GetId());
-    if (result != BaseNode::INIT_OK) {
-      return LogLookupFailure(result, FROM_HERE,
-                              "Failed to delete " + type_str +
-                                  " node. Non-local data. " +
-                                  change.location().ToString(),
-                              type, error_handler);
-    }
-  }
-  NotifyLocalChangeObservers(node->GetEntry(), change);
-  if (IsActOnceDataType(type))
-    node->Drop();
-  else
-    node->Tombstone();
-  return SyncError();
-}
-
-SyncError GenericChangeProcessor::ProcessSyncChanges(
-    const base::Location& from_here,
-    const SyncChangeList& list_of_changes) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-
-  if (list_of_changes.empty()) {
-    // No work. Exit without entering WriteTransaction.
-    return SyncError();
-  }
-
-  WriteTransaction trans(from_here, share_handle());
-
-  for (auto iter = list_of_changes.begin(); iter != list_of_changes.end();
-       ++iter) {
-    const SyncChange& change = *iter;
-    DCHECK_EQ(change.sync_data().GetDataType(), type_);
-    std::string type_str = ModelTypeToString(type_);
-    WriteNode sync_node(&trans);
-    if (change.change_type() == SyncChange::ACTION_DELETE) {
-      SyncError error =
-          AttemptDelete(change, type_, type_str, &sync_node, error_handler());
-      if (error.IsSet())
-        return error;
-      if (merge_result_) {
-        merge_result_->set_num_items_deleted(
-            merge_result_->num_items_deleted() + 1);
-      }
-    } else if (change.change_type() == SyncChange::ACTION_ADD) {
-      SyncError error = HandleActionAdd(change, type_str, trans, &sync_node);
-      if (error.IsSet()) {
-        return error;
-      }
-    } else if (change.change_type() == SyncChange::ACTION_UPDATE) {
-      SyncError error = HandleActionUpdate(change, type_str, trans, &sync_node);
-      if (error.IsSet()) {
-        return error;
-      }
-    } else {
-      SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                      "Received unset SyncChange in the change processor, " +
-                          change.location().ToString(),
-                      type_);
-      error_handler()->OnUnrecoverableError(error);
-      NOTREACHED();
-      LOG(ERROR) << "Unset sync change.";
-      return error;
-    }
-  }
-
-  return SyncError();
-}
-
-// WARNING: this code is sensitive to compiler optimizations. Be careful
-// modifying any code around an OnUnrecoverableError call, else the compiler
-// attempts to merge it with other calls, losing useful information in
-// breakpad uploads.
-SyncError GenericChangeProcessor::HandleActionAdd(const SyncChange& change,
-                                                  const std::string& type_str,
-                                                  const WriteTransaction& trans,
-                                                  WriteNode* sync_node) {
-  // TODO(sync): Handle other types of creation (custom parents, folders,
-  // etc.).
-  const SyncDataLocal sync_data_local(change.sync_data());
-  WriteNode::InitUniqueByCreationResult result =
-      sync_node->InitUniqueByCreation(sync_data_local.GetDataType(),
-                                      sync_data_local.GetTag());
-  if (result != WriteNode::INIT_SUCCESS) {
-    std::string error_prefix = "Failed to create " + type_str + " node: " +
-                               change.location().ToString() + ", ";
-    switch (result) {
-      case WriteNode::INIT_FAILED_EMPTY_TAG: {
-        SyncError error;
-        error.Reset(FROM_HERE, error_prefix + "empty tag", type_);
-        error_handler()->OnUnrecoverableError(error);
-        LOG(ERROR) << "Create: Empty tag.";
-        return error;
-      }
-      case WriteNode::INIT_FAILED_COULD_NOT_CREATE_ENTRY: {
-        SyncError error;
-        error.Reset(FROM_HERE, error_prefix + "failed to create entry", type_);
-        error_handler()->OnUnrecoverableError(error);
-        LOG(ERROR) << "Create: Could not create entry.";
-        return error;
-      }
-      case WriteNode::INIT_FAILED_SET_PREDECESSOR: {
-        SyncError error;
-        error.Reset(FROM_HERE, error_prefix + "failed to set predecessor",
-                    type_);
-        error_handler()->OnUnrecoverableError(error);
-        LOG(ERROR) << "Create: Bad predecessor.";
-        return error;
-      }
-      case WriteNode::INIT_FAILED_DECRYPT_EXISTING_ENTRY: {
-        SyncError error;
-        error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_);
-        error_handler()->OnUnrecoverableError(error);
-        LOG(ERROR) << "Create: Failed to decrypt.";
-        return error;
-      }
-      default: {
-        SyncError error;
-        error.Reset(FROM_HERE, error_prefix + "unknown error", type_);
-        error_handler()->OnUnrecoverableError(error);
-        LOG(ERROR) << "Create: Unknown error.";
-        return error;
-      }
-    }
-  }
-  NotifyLocalChangeObservers(sync_node->GetEntry(), change);
-
-  sync_node->SetTitle(change.sync_data().GetTitle());
-  SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node);
-
-  if (merge_result_) {
-    merge_result_->set_num_items_added(merge_result_->num_items_added() + 1);
-  }
-  return SyncError();
-}
-// WARNING: this code is sensitive to compiler optimizations. Be careful
-// modifying any code around an OnUnrecoverableError call, else the compiler
-// attempts to merge it with other calls, losing useful information in
-// breakpad uploads.
-SyncError GenericChangeProcessor::HandleActionUpdate(
-    const SyncChange& change,
-    const std::string& type_str,
-    const WriteTransaction& trans,
-    WriteNode* sync_node) {
-  const SyncDataLocal sync_data_local(change.sync_data());
-  BaseNode::InitByLookupResult result = sync_node->InitByClientTagLookup(
-      sync_data_local.GetDataType(), sync_data_local.GetTag());
-  if (result != BaseNode::INIT_OK) {
-    std::string error_prefix = "Failed to load " + type_str + " node. " +
-                               change.location().ToString() + ", ";
-    if (result == BaseNode::INIT_FAILED_PRECONDITION) {
-      SyncError error;
-      error.Reset(FROM_HERE, error_prefix + "empty tag", type_);
-      error_handler()->OnUnrecoverableError(error);
-      LOG(ERROR) << "Update: Empty tag.";
-      return error;
-    } else if (result == BaseNode::INIT_FAILED_ENTRY_NOT_GOOD) {
-      SyncError error;
-      error.Reset(FROM_HERE, error_prefix + "bad entry", type_);
-      error_handler()->OnUnrecoverableError(error);
-      LOG(ERROR) << "Update: bad entry.";
-      return error;
-    } else if (result == BaseNode::INIT_FAILED_ENTRY_IS_DEL) {
-      SyncError error;
-      error.Reset(FROM_HERE, error_prefix + "deleted entry", type_);
-      error_handler()->OnUnrecoverableError(error);
-      LOG(ERROR) << "Update: deleted entry.";
-      return error;
-    } else if (result == BaseNode::INIT_FAILED_DECRYPT_IF_NECESSARY) {
-      SyncError error;
-      error.Reset(FROM_HERE, error_prefix + "failed to decrypt", type_);
-      error_handler()->OnUnrecoverableError(error);
-      LOG(ERROR) << "Update: Failed to decrypt.";
-      return error;
-    } else {
-      NOTREACHED();
-      SyncError error;
-      error.Reset(FROM_HERE, error_prefix + "unknown error", type_);
-      error_handler()->OnUnrecoverableError(error);
-      LOG(ERROR) << "Update: Unknown error.";
-      return error;
-    }
-  }
-
-  NotifyLocalChangeObservers(sync_node->GetEntry(), change);
-
-  sync_node->SetTitle(change.sync_data().GetTitle());
-  SetNodeSpecifics(sync_data_local.GetSpecifics(), sync_node);
-
-  if (merge_result_) {
-    merge_result_->set_num_items_modified(merge_result_->num_items_modified() +
-                                          1);
-  }
-  // TODO(sync): Support updating other parts of the sync node (title,
-  // successor, parent, etc.).
-  return SyncError();
-}
-
-bool GenericChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  DCHECK(has_nodes);
-  std::string type_name = ModelTypeToString(type_);
-  std::string err_str =
-      "Server did not create the top-level " + type_name +
-      " node. We might be running against an out-of-date server.";
-  *has_nodes = false;
-  ReadTransaction trans(FROM_HERE, share_handle());
-  ReadNode type_root_node(&trans);
-  if (type_root_node.InitTypeRoot(type_) != BaseNode::INIT_OK) {
-    LOG(ERROR) << err_str;
-    return false;
-  }
-
-  // The sync model has user created nodes if the type's root node has any
-  // children.
-  *has_nodes = type_root_node.HasChildren();
-  return true;
-}
-
-bool GenericChangeProcessor::CryptoReadyIfNecessary() {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  // We only access the cryptographer while holding a transaction.
-  ReadTransaction trans(FROM_HERE, share_handle());
-  const ModelTypeSet encrypted_types = trans.GetEncryptedTypes();
-  return !encrypted_types.Has(type_) || trans.GetCryptographer()->CanEncrypt();
-}
-
-void GenericChangeProcessor::StartImpl() {}
-
-UserShare* GenericChangeProcessor::share_handle() const {
-  DCHECK(sequence_checker_.CalledOnValidSequence());
-  return share_handle_;
-}
-
-void GenericChangeProcessor::NotifyLocalChangeObservers(
-    const syncable::Entry* current_entry,
-    const SyncChange& change) {
-  for (auto& observer : local_change_observers_)
-    observer.OnLocalChange(current_entry, change);
-}
-
-}  // namespace syncer
diff --git a/components/sync/driver/generic_change_processor.h b/components/sync/driver/generic_change_processor.h
deleted file mode 100644
index cbc2b2b..0000000
--- a/components/sync/driver/generic_change_processor.h
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_H_
-#define COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/observer_list.h"
-#include "base/sequence_checker.h"
-#include "components/sync/model/change_processor.h"
-#include "components/sync/model/data_type_error_handler.h"
-#include "components/sync/model/sync_change_processor.h"
-#include "components/sync/model/sync_merge_result.h"
-
-namespace syncer {
-
-class SyncData;
-class SyncableService;
-class WriteNode;
-class WriteTransaction;
-
-namespace syncable {
-class Entry;
-}  // namespace syncable
-
-using SyncDataList = std::vector<SyncData>;
-
-// Datatype agnostic change processor. One instance of GenericChangeProcessor
-// is created for each datatype and lives on the datatype's sequence. It then
-// handles all interaction with the sync api, both translating pushes from the
-// local service into transactions and receiving changes from the sync model,
-// which then get converted into SyncChange's and sent to the local service.
-//
-// As a rule, the GenericChangeProcessor is not thread safe, and should only
-// be used on the same sequence in which it was created.
-class GenericChangeProcessor : public ChangeProcessor,
-                               public SyncChangeProcessor {
- public:
-  // Create a change processor for |type| and connect it to the syncer.
-  GenericChangeProcessor(ModelType type,
-                         std::unique_ptr<DataTypeErrorHandler> error_handler,
-                         const base::WeakPtr<SyncableService>& local_service,
-                         const base::WeakPtr<SyncMergeResult>& merge_result,
-                         UserShare* user_share);
-  ~GenericChangeProcessor() override;
-
-  // ChangeProcessor interface.
-  // Build and store a list of all changes into |syncer_changes_|.
-  void ApplyChangesFromSyncModel(
-      const BaseTransaction* trans,
-      int64_t version,
-      const ImmutableChangeRecordList& changes) override;
-  // Passes |syncer_changes_|, built in ApplyChangesFromSyncModel, onto
-  // |local_service_| by way of its ProcessSyncChanges method.
-  void CommitChangesFromSyncModel() override;
-
-  // SyncChangeProcessor implementation.
-  SyncError ProcessSyncChanges(const base::Location& from_here,
-                               const SyncChangeList& change_list) override;
-  SyncDataList GetAllSyncData(ModelType type) const override;
-  SyncError UpdateDataTypeContext(
-      ModelType type,
-      SyncChangeProcessor::ContextRefreshStatus refresh_status,
-      const std::string& context) override;
-  void AddLocalChangeObserver(LocalChangeObserver* observer) override;
-  void RemoveLocalChangeObserver(LocalChangeObserver* observer) override;
-
-  // Similar to above, but returns a SyncError for use by direct clients
-  // of GenericChangeProcessor that may need more error visibility.
-  virtual SyncError GetAllSyncDataReturnError(SyncDataList* data) const;
-
-  // If a datatype context associated with this GenericChangeProcessor's type
-  // exists, fills |context| and returns true. Otheriwse, if there has not been
-  // a context set, returns false.
-  virtual bool GetDataTypeContext(std::string* context) const;
-
-  // Returns the number of items for this type.
-  virtual int GetSyncCount();
-
-  // Generic versions of AssociatorInterface methods. Called by
-  // SyncableServiceAdapter or the DataTypeController.
-  virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes);
-  virtual bool CryptoReadyIfNecessary();
-
- protected:
-  // ChangeProcessor interface.
-  void StartImpl() override;  // Does nothing.
-  UserShare* share_handle() const override;
-
- private:
-  SyncError AttemptDelete(const SyncChange& change,
-                          ModelType type,
-                          const std::string& type_str,
-                          WriteNode* node,
-                          DataTypeErrorHandler* error_handler);
-  // Logically part of ProcessSyncChanges.
-  SyncError HandleActionAdd(const SyncChange& change,
-                            const std::string& type_str,
-                            const WriteTransaction& trans,
-                            WriteNode* sync_node);
-
-  // Logically part of ProcessSyncChanges.
-  SyncError HandleActionUpdate(const SyncChange& change,
-                               const std::string& type_str,
-                               const WriteTransaction& trans,
-                               WriteNode* sync_node);
-
-  // Notify every registered local change observer that |change| is about to be
-  // applied to |current_entry|.
-  void NotifyLocalChangeObservers(const syncable::Entry* current_entry,
-                                  const SyncChange& change);
-
-  base::SequenceChecker sequence_checker_;
-
-  const ModelType type_;
-
-  // The SyncableService this change processor will forward changes on to.
-  const base::WeakPtr<SyncableService> local_service_;
-
-  // A SyncMergeResult used to track the changes made during association. The
-  // owner will invalidate the weak pointer when association is complete. While
-  // the pointer is valid though, we increment it with any changes received
-  // via ProcessSyncChanges.
-  const base::WeakPtr<SyncMergeResult> merge_result_;
-
-  // The current list of changes received from the syncer. We buffer because
-  // we must ensure no syncapi transaction is held when we pass it on to
-  // |local_service_|.
-  // Set in ApplyChangesFromSyncModel, consumed in CommitChangesFromSyncModel.
-  SyncChangeList syncer_changes_;
-
-  // Our handle to the sync model. Unlike normal ChangeProcessors, we need to
-  // be able to access the sync model before the change processor begins
-  // listening to changes (the local_service_ will be interacting with us
-  // when it starts up). As such we can't wait until Start(_) has been called,
-  // and have to keep a local pointer to the user_share.
-  UserShare* const share_handle_;
-
-  // List of observers that want to be notified of local changes being written.
-  base::ObserverList<LocalChangeObserver>::Unchecked local_change_observers_;
-
-  base::WeakPtrFactory<GenericChangeProcessor> weak_ptr_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(GenericChangeProcessor);
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_H_
diff --git a/components/sync/driver/generic_change_processor_factory.cc b/components/sync/driver/generic_change_processor_factory.cc
deleted file mode 100644
index acf7f40..0000000
--- a/components/sync/driver/generic_change_processor_factory.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/generic_change_processor_factory.h"
-
-#include <utility>
-
-#include "components/sync/driver/generic_change_processor.h"
-#include "components/sync/model/syncable_service.h"
-
-namespace syncer {
-
-GenericChangeProcessorFactory::GenericChangeProcessorFactory() {}
-
-GenericChangeProcessorFactory::~GenericChangeProcessorFactory() {}
-
-std::unique_ptr<GenericChangeProcessor>
-GenericChangeProcessorFactory::CreateGenericChangeProcessor(
-    ModelType type,
-    UserShare* user_share,
-    std::unique_ptr<DataTypeErrorHandler> error_handler,
-    const base::WeakPtr<SyncableService>& local_service,
-    const base::WeakPtr<SyncMergeResult>& merge_result) {
-  DCHECK(user_share);
-  return std::make_unique<GenericChangeProcessor>(
-      type, std::move(error_handler), local_service, merge_result, user_share);
-}
-
-}  // namespace syncer
diff --git a/components/sync/driver/generic_change_processor_factory.h b/components/sync/driver/generic_change_processor_factory.h
deleted file mode 100644
index 7196514..0000000
--- a/components/sync/driver/generic_change_processor_factory.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_FACTORY_H_
-#define COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_FACTORY_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "components/sync/base/model_type.h"
-#include "components/sync/model/data_type_error_handler.h"
-
-namespace syncer {
-
-class GenericChangeProcessor;
-class SyncMergeResult;
-class SyncableService;
-struct UserShare;
-
-// Because GenericChangeProcessors are created and used only from the model
-// thread, their lifetime is strictly shorter than other components like
-// DataTypeController, which live before / after communication with model
-// threads begins and ends.
-// The GCP is created "on the fly" at just the right time, on just the right
-// thread. Given that, we use a factory to instantiate GenericChangeProcessors
-// so that tests can choose to use a fake processor (i.e instead of injection).
-class GenericChangeProcessorFactory {
- public:
-  GenericChangeProcessorFactory();
-  virtual ~GenericChangeProcessorFactory();
-  virtual std::unique_ptr<GenericChangeProcessor> CreateGenericChangeProcessor(
-      ModelType type,
-      UserShare* user_share,
-      std::unique_ptr<DataTypeErrorHandler> error_handler,
-      const base::WeakPtr<SyncableService>& local_service,
-      const base::WeakPtr<SyncMergeResult>& merge_result);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(GenericChangeProcessorFactory);
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_DRIVER_GENERIC_CHANGE_PROCESSOR_FACTORY_H_
diff --git a/components/sync/driver/generic_change_processor_unittest.cc b/components/sync/driver/generic_change_processor_unittest.cc
deleted file mode 100644
index 492d79c..0000000
--- a/components/sync/driver/generic_change_processor_unittest.cc
+++ /dev/null
@@ -1,304 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/generic_change_processor.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/task_environment.h"
-#include "components/sync/base/client_tag_hash.h"
-#include "components/sync/base/model_type.h"
-#include "components/sync/driver/data_type_manager.h"
-#include "components/sync/driver/sync_api_component_factory_mock.h"
-#include "components/sync/engine/sync_encryption_handler.h"
-#include "components/sync/engine/sync_engine.h"
-#include "components/sync/model/data_type_error_handler_mock.h"
-#include "components/sync/model/fake_syncable_service.h"
-#include "components/sync/model/sync_change.h"
-#include "components/sync/syncable/read_node.h"
-#include "components/sync/syncable/read_transaction.h"
-#include "components/sync/syncable/test_user_share.h"
-#include "components/sync/syncable/user_share.h"
-#include "components/sync/syncable/write_node.h"
-#include "components/sync/syncable/write_transaction.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace syncer {
-
-namespace {
-
-class SyncGenericChangeProcessorTest : public testing::Test {
- public:
-  // Most test cases will use this type.  For those that need a
-  // GenericChangeProcessor for a different type, use |InitializeForType|.
-  static const ModelType kType = PREFERENCES;
-
-  SyncGenericChangeProcessorTest()
-      : task_environment_(
-            base::test::SingleThreadTaskEnvironment::MainThreadType::UI),
-        syncable_service_ptr_factory_(&fake_syncable_service_) {}
-
-  void SetUp() override {
-    // Use kType by default, but allow test cases to re-initialize with whatever
-    // type they choose.  Therefore, it's important that all type dependent
-    // initialization occurs in InitializeForType.
-    InitializeForType(kType);
-  }
-
-  void TearDown() override {
-    if (test_user_share_) {
-      test_user_share_->TearDown();
-    }
-  }
-
-  // Initialize GenericChangeProcessor and related classes for testing with
-  // model type |type|.
-  void InitializeForType(ModelType type) {
-    TearDown();
-    test_user_share_ = std::make_unique<TestUserShare>();
-    test_user_share_->SetUp();
-    sync_merge_result_ = std::make_unique<SyncMergeResult>(type);
-    merge_result_ptr_factory_ =
-        std::make_unique<base::WeakPtrFactory<SyncMergeResult>>(
-            sync_merge_result_.get());
-
-    ModelTypeSet types = ProtocolTypes();
-    for (ModelType type : types) {
-      TestUserShare::CreateRoot(type, test_user_share_->user_share());
-    }
-    test_user_share_->encryption_handler()->Init();
-    ConstructGenericChangeProcessor(type);
-  }
-
-  void ConstructGenericChangeProcessor(ModelType type) {
-    change_processor_ = std::make_unique<GenericChangeProcessor>(
-        type, std::make_unique<DataTypeErrorHandlerMock>(),
-        syncable_service_ptr_factory_.GetWeakPtr(),
-        merge_result_ptr_factory_->GetWeakPtr(),
-        test_user_share_->user_share());
-  }
-
-  void BuildChildNodes(ModelType type, int n) {
-    WriteTransaction trans(FROM_HERE, user_share());
-    for (int i = 0; i < n; ++i) {
-      WriteNode node(&trans);
-      node.InitUniqueByCreation(type, base::StringPrintf("node%05d", i));
-    }
-  }
-
-  GenericChangeProcessor* change_processor() { return change_processor_.get(); }
-
-  UserShare* user_share() { return test_user_share_->user_share(); }
-
-  void RunLoop() {
-    base::RunLoop run_loop;
-    run_loop.RunUntilIdle();
-  }
-
- private:
-  base::test::SingleThreadTaskEnvironment task_environment_;
-
-  std::unique_ptr<SyncMergeResult> sync_merge_result_;
-  std::unique_ptr<base::WeakPtrFactory<SyncMergeResult>>
-      merge_result_ptr_factory_;
-
-  FakeSyncableService fake_syncable_service_;
-  base::WeakPtrFactory<FakeSyncableService> syncable_service_ptr_factory_;
-
-  std::unique_ptr<TestUserShare> test_user_share_;
-  testing::NiceMock<SyncApiComponentFactoryMock> sync_factory_;
-
-  std::unique_ptr<GenericChangeProcessor> change_processor_;
-};
-
-// Similar to above, but focused on the method that implements sync/api
-// interfaces and is hence exposed to datatypes directly.
-TEST_F(SyncGenericChangeProcessorTest, StressGetAllSyncData) {
-  const int kNumChildNodes = 1000;
-  const int kRepeatCount = 1;
-
-  ASSERT_NO_FATAL_FAILURE(BuildChildNodes(kType, kNumChildNodes));
-
-  for (int i = 0; i < kRepeatCount; ++i) {
-    SyncDataList sync_data = change_processor()->GetAllSyncData(kType);
-
-    // Start with a simple test.  We can add more in-depth testing later.
-    EXPECT_EQ(static_cast<size_t>(kNumChildNodes), sync_data.size());
-  }
-}
-
-TEST_F(SyncGenericChangeProcessorTest, SetGetPasswords) {
-  InitializeForType(PASSWORDS);
-  const int kNumPasswords = 10;
-  sync_pb::PasswordSpecificsData password_data;
-  password_data.set_username_value("user");
-
-  sync_pb::EntitySpecifics password_holder;
-
-  SyncChangeList change_list;
-  for (int i = 0; i < kNumPasswords; ++i) {
-    password_data.set_password_value(base::StringPrintf("password%i", i));
-    password_holder.mutable_password()
-        ->mutable_client_only_encrypted_data()
-        ->CopyFrom(password_data);
-    change_list.push_back(
-        SyncChange(FROM_HERE, SyncChange::ACTION_ADD,
-                   SyncData::CreateLocalData(base::StringPrintf("tag%i", i),
-                                             base::StringPrintf("title%i", i),
-                                             password_holder)));
-  }
-
-  ASSERT_FALSE(
-      change_processor()->ProcessSyncChanges(FROM_HERE, change_list).IsSet());
-
-  SyncDataList password_list(change_processor()->GetAllSyncData(PASSWORDS));
-
-  ASSERT_EQ(password_list.size(), change_list.size());
-  for (int i = 0; i < kNumPasswords; ++i) {
-    // Verify the password is returned properly.
-    ASSERT_TRUE(password_list[i].GetSpecifics().has_password());
-    ASSERT_TRUE(password_list[i]
-                    .GetSpecifics()
-                    .password()
-                    .has_client_only_encrypted_data());
-    ASSERT_FALSE(password_list[i].GetSpecifics().password().has_encrypted());
-    const sync_pb::PasswordSpecificsData& sync_password =
-        password_list[i].GetSpecifics().password().client_only_encrypted_data();
-    const sync_pb::PasswordSpecificsData& change_password =
-        change_list[i]
-            .sync_data()
-            .GetSpecifics()
-            .password()
-            .client_only_encrypted_data();
-    ASSERT_EQ(sync_password.password_value(), change_password.password_value());
-    ASSERT_EQ(sync_password.username_value(), change_password.username_value());
-
-    // Verify the raw sync data was stored securely.
-    ReadTransaction read_transaction(FROM_HERE, user_share());
-    ReadNode node(&read_transaction);
-    ASSERT_EQ(
-        node.InitByClientTagLookup(PASSWORDS, base::StringPrintf("tag%i", i)),
-        BaseNode::INIT_OK);
-    ASSERT_EQ(node.GetTitle(), "encrypted");
-    const sync_pb::EntitySpecifics& raw_specifics = node.GetEntitySpecifics();
-    ASSERT_TRUE(raw_specifics.has_password());
-    ASSERT_TRUE(raw_specifics.password().has_encrypted());
-    ASSERT_FALSE(raw_specifics.password().has_client_only_encrypted_data());
-  }
-}
-
-TEST_F(SyncGenericChangeProcessorTest, UpdatePasswords) {
-  InitializeForType(PASSWORDS);
-  const int kNumPasswords = 10;
-  sync_pb::PasswordSpecificsData password_data;
-  password_data.set_username_value("user");
-
-  sync_pb::EntitySpecifics password_holder;
-
-  SyncChangeList change_list;
-  SyncChangeList change_list2;
-  for (int i = 0; i < kNumPasswords; ++i) {
-    password_data.set_password_value(base::StringPrintf("password%i", i));
-    password_holder.mutable_password()
-        ->mutable_client_only_encrypted_data()
-        ->CopyFrom(password_data);
-    change_list.push_back(
-        SyncChange(FROM_HERE, SyncChange::ACTION_ADD,
-                   SyncData::CreateLocalData(base::StringPrintf("tag%i", i),
-                                             base::StringPrintf("title%i", i),
-                                             password_holder)));
-    password_data.set_password_value(base::StringPrintf("password_m%i", i));
-    password_holder.mutable_password()
-        ->mutable_client_only_encrypted_data()
-        ->CopyFrom(password_data);
-    change_list2.push_back(
-        SyncChange(FROM_HERE, SyncChange::ACTION_UPDATE,
-                   SyncData::CreateLocalData(base::StringPrintf("tag%i", i),
-                                             base::StringPrintf("title_m%i", i),
-                                             password_holder)));
-  }
-
-  ASSERT_FALSE(
-      change_processor()->ProcessSyncChanges(FROM_HERE, change_list).IsSet());
-  ASSERT_FALSE(
-      change_processor()->ProcessSyncChanges(FROM_HERE, change_list2).IsSet());
-
-  SyncDataList password_list(change_processor()->GetAllSyncData(PASSWORDS));
-
-  ASSERT_EQ(password_list.size(), change_list2.size());
-  for (int i = 0; i < kNumPasswords; ++i) {
-    // Verify the password is returned properly.
-    ASSERT_TRUE(password_list[i].GetSpecifics().has_password());
-    ASSERT_TRUE(password_list[i]
-                    .GetSpecifics()
-                    .password()
-                    .has_client_only_encrypted_data());
-    ASSERT_FALSE(password_list[i].GetSpecifics().password().has_encrypted());
-    const sync_pb::PasswordSpecificsData& sync_password =
-        password_list[i].GetSpecifics().password().client_only_encrypted_data();
-    const sync_pb::PasswordSpecificsData& change_password =
-        change_list2[i]
-            .sync_data()
-            .GetSpecifics()
-            .password()
-            .client_only_encrypted_data();
-    ASSERT_EQ(sync_password.password_value(), change_password.password_value());
-    ASSERT_EQ(sync_password.username_value(), change_password.username_value());
-
-    // Verify the raw sync data was stored securely.
-    ReadTransaction read_transaction(FROM_HERE, user_share());
-    ReadNode node(&read_transaction);
-    ASSERT_EQ(
-        node.InitByClientTagLookup(PASSWORDS, base::StringPrintf("tag%i", i)),
-        BaseNode::INIT_OK);
-    ASSERT_EQ(node.GetTitle(), "encrypted");
-    const sync_pb::EntitySpecifics& raw_specifics = node.GetEntitySpecifics();
-    ASSERT_TRUE(raw_specifics.has_password());
-    ASSERT_TRUE(raw_specifics.password().has_encrypted());
-    ASSERT_FALSE(raw_specifics.password().has_client_only_encrypted_data());
-  }
-}
-
-// Test that attempting to add an entry that already exists still works.
-TEST_F(SyncGenericChangeProcessorTest, AddExistingEntry) {
-  InitializeForType(SESSIONS);
-  sync_pb::EntitySpecifics sessions_specifics;
-  sessions_specifics.mutable_session()->set_session_tag("session tag");
-  SyncChangeList changes;
-
-  // First add it normally.
-  changes.push_back(
-      SyncChange(FROM_HERE, SyncChange::ACTION_ADD,
-                 SyncData::CreateLocalData(base::StringPrintf("tag"),
-                                           base::StringPrintf("title"),
-                                           sessions_specifics)));
-  ASSERT_FALSE(
-      change_processor()->ProcessSyncChanges(FROM_HERE, changes).IsSet());
-
-  // Now attempt to add it again, but with different specifics. Should not
-  // result in an error and should still update the specifics.
-  sessions_specifics.mutable_session()->set_session_tag("session tag 2");
-  changes[0] = SyncChange(FROM_HERE, SyncChange::ACTION_ADD,
-                          SyncData::CreateLocalData(base::StringPrintf("tag"),
-                                                    base::StringPrintf("title"),
-                                                    sessions_specifics));
-  ASSERT_FALSE(
-      change_processor()->ProcessSyncChanges(FROM_HERE, changes).IsSet());
-
-  // Verify the data was updated properly.
-  SyncDataList sync_data = change_processor()->GetAllSyncData(SESSIONS);
-  ASSERT_EQ(sync_data.size(), 1U);
-  ASSERT_EQ("session tag 2",
-            sync_data[0].GetSpecifics().session().session_tag());
-  EXPECT_FALSE(SyncDataRemote(sync_data[0]).GetClientTagHash().value().empty());
-}
-
-}  // namespace
-
-}  // namespace syncer
diff --git a/components/sync/driver/glue/sync_engine_backend.cc b/components/sync/driver/glue/sync_engine_backend.cc
index 3ab0691b..9dd4158 100644
--- a/components/sync/driver/glue/sync_engine_backend.cc
+++ b/components/sync/driver/glue/sync_engine_backend.cc
@@ -64,20 +64,12 @@
     FILE_PATH_LITERAL("Nigori.bin");
 
 bool ShouldEnableUSSNigori() {
-  // USS implementation of Nigori is not compatible with Directory
-  // implementations of Passwords and Bookmarks.
-  // |kSyncUSSNigori| should be checked last, since check itself has side
-  // effect (only clients, which have feature-flag checked participate in the
-  // study). Otherwise, we will have different amount of clients in control and
-  // experiment groups.
-  return base::FeatureList::IsEnabled(switches::kSyncUSSPasswords) &&
-         base::FeatureList::IsEnabled(switches::kSyncUSSNigori);
+  return base::FeatureList::IsEnabled(switches::kSyncUSSNigori);
 }
 
 // Checks if there is at least one experiment for USS is disabled.
 bool ShouldClearDirectoryOnEmptyBirthday() {
-  return !base::FeatureList::IsEnabled(switches::kSyncUSSPasswords) ||
-         !base::FeatureList::IsEnabled(switches::kSyncUSSNigori);
+  return !base::FeatureList::IsEnabled(switches::kSyncUSSNigori);
 }
 
 }  // namespace
diff --git a/components/sync/driver/glue/sync_engine_impl_unittest.cc b/components/sync/driver/glue/sync_engine_impl_unittest.cc
index fc27b2c2..51e4152 100644
--- a/components/sync/driver/glue/sync_engine_impl_unittest.cc
+++ b/components/sync/driver/glue/sync_engine_impl_unittest.cc
@@ -814,10 +814,7 @@
 // Regression test for crbug.com/1019956.
 TEST_F(SyncEngineImplTest, ShouldDestroyAfterInitFailure) {
   base::test::ScopedFeatureList override_features;
-  override_features.InitWithFeatures(
-      /*enable_feature=*/{switches::kSyncUSSPasswords,
-                          switches::kSyncUSSNigori},
-      /*disable_feature=*/{});
+  override_features.InitAndEnableFeature(switches::kSyncUSSNigori);
 
   fake_manager_factory_->set_should_fail_on_init(true);
   // Sync manager will report initialization failure and gets destroyed during
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index fa90b203..44a6eb1 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -1484,10 +1484,8 @@
   }
 
   if (enable_passwords_account_storage_ &&
-      base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) {
-    if (!GetUserSettings()->IsUsingSecondaryPassphrase()) {
-      allowed_types.Put(PASSWORDS);
-    }
+      !GetUserSettings()->IsUsingSecondaryPassphrase()) {
+    allowed_types.Put(PASSWORDS);
   }
 
   if (base::FeatureList::IsEnabled(switches::kSyncDeviceInfoInTransportMode)) {
diff --git a/components/sync/driver/shared_change_processor.cc b/components/sync/driver/shared_change_processor.cc
deleted file mode 100644
index 8dcb62c..0000000
--- a/components/sync/driver/shared_change_processor.cc
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/shared_change_processor.h"
-
-#include <utility>
-
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "components/sync/driver/generic_change_processor.h"
-#include "components/sync/driver/generic_change_processor_factory.h"
-#include "components/sync/driver/shared_change_processor_ref.h"
-#include "components/sync/driver/sync_client.h"
-#include "components/sync/model/sync_change.h"
-#include "components/sync/model/syncable_service.h"
-
-using base::AutoLock;
-
-namespace syncer {
-
-SharedChangeProcessor::SharedChangeProcessor(ModelType type)
-    : disconnected_(false),
-      type_(type),
-      frontend_task_runner_(base::SequencedTaskRunnerHandle::Get()),
-      generic_change_processor_(nullptr) {
-  DCHECK_NE(type_, UNSPECIFIED);
-}
-
-SharedChangeProcessor::~SharedChangeProcessor() {
-  // We can either be deleted when the DTC is destroyed (on UI thread), or when
-  // the SyncableService stops syncing (on |backend_task_runner_|).
-  // |generic_change_processor_|, if non-null, must be deleted on
-  // |backend_task_runner_|.
-  if (backend_task_runner_) {
-    if (backend_task_runner_->RunsTasksInCurrentSequence()) {
-      delete generic_change_processor_;
-    } else {
-      DCHECK(frontend_task_runner_->RunsTasksInCurrentSequence());
-      if (!backend_task_runner_->DeleteSoon(FROM_HERE,
-                                            generic_change_processor_)) {
-        NOTREACHED();
-      }
-    }
-  } else {
-    DCHECK(!generic_change_processor_);
-  }
-}
-
-void SharedChangeProcessor::StartAssociation(
-    StartDoneCallback start_done,
-    SyncClient* const sync_client,
-    GenericChangeProcessorFactory* processor_factory,
-    UserShare* user_share,
-    std::unique_ptr<DataTypeErrorHandler> error_handler) {
-  DCHECK(user_share);
-  SyncMergeResult local_merge_result(type_);
-  SyncMergeResult syncer_merge_result(type_);
-  base::WeakPtrFactory<SyncMergeResult> weak_ptr_factory(&syncer_merge_result);
-
-  // Connect |shared_change_processor| to the syncer and get the
-  // SyncableService associated with type_.
-  // Note that it's possible the shared_change_processor has already been
-  // disconnected at this point, so all our accesses to the syncer from this
-  // point on are through it.
-  local_service_ =
-      Connect(sync_client, processor_factory, user_share,
-              std::move(error_handler), weak_ptr_factory.GetWeakPtr());
-  if (!local_service_) {
-    SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                    "Failed to connect to syncer.", type_);
-    local_merge_result.set_error(error);
-    std::move(start_done)
-        .Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result,
-             syncer_merge_result);
-    return;
-  }
-
-  if (!CryptoReadyIfNecessary()) {
-    SyncError error(FROM_HERE, SyncError::CRYPTO_ERROR, "", type_);
-    local_merge_result.set_error(error);
-    std::move(start_done)
-        .Run(DataTypeController::NEEDS_CRYPTO, local_merge_result,
-             syncer_merge_result);
-    return;
-  }
-
-  bool sync_has_nodes = false;
-  if (!SyncModelHasUserCreatedNodes(&sync_has_nodes)) {
-    SyncError error(FROM_HERE, SyncError::UNRECOVERABLE_ERROR,
-                    "Failed to load sync nodes", type_);
-    local_merge_result.set_error(error);
-    std::move(start_done)
-        .Run(DataTypeController::UNRECOVERABLE_ERROR, local_merge_result,
-             syncer_merge_result);
-    return;
-  }
-
-  // Scope for |initial_sync_data| which might be expensive, so we don't want
-  // to keep it in memory longer than necessary.
-  {
-    SyncDataList initial_sync_data;
-
-    SyncError error = GetAllSyncDataReturnError(type_, &initial_sync_data);
-    if (error.IsSet()) {
-      local_merge_result.set_error(error);
-      std::move(start_done)
-          .Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result,
-               syncer_merge_result);
-      return;
-    }
-
-    syncer_merge_result.set_num_items_before_association(
-        initial_sync_data.size());
-    // Passes a reference to |shared_change_processor|.
-    local_merge_result = local_service_->MergeDataAndStartSyncing(
-        type_, initial_sync_data, std::unique_ptr<SyncChangeProcessor>(
-                                      new SharedChangeProcessorRef(this)),
-        std::unique_ptr<SyncErrorFactory>(new SharedChangeProcessorRef(this)));
-    if (local_merge_result.error().IsSet()) {
-      std::move(start_done)
-          .Run(DataTypeController::ASSOCIATION_FAILED, local_merge_result,
-               syncer_merge_result);
-      return;
-    }
-  }
-
-  syncer_merge_result.set_num_items_after_association(GetSyncCount());
-
-  std::move(start_done)
-      .Run(!sync_has_nodes ? DataTypeController::OK_FIRST_RUN
-                           : DataTypeController::OK,
-           local_merge_result, syncer_merge_result);
-}
-
-base::WeakPtr<SyncableService> SharedChangeProcessor::Connect(
-    SyncClient* sync_client,
-    GenericChangeProcessorFactory* processor_factory,
-    UserShare* user_share,
-    std::unique_ptr<DataTypeErrorHandler> error_handler,
-    const base::WeakPtr<SyncMergeResult>& merge_result) {
-  DCHECK(sync_client);
-  DCHECK(error_handler);
-  backend_task_runner_ = base::SequencedTaskRunnerHandle::Get();
-  AutoLock lock(monitor_lock_);
-  if (disconnected_)
-    return base::WeakPtr<SyncableService>();
-  error_handler_ = std::move(error_handler);
-  base::WeakPtr<SyncableService> local_service =
-      sync_client->GetSyncableServiceForType(type_);
-  if (!local_service) {
-    DLOG(WARNING) << "SyncableService destroyed before DTC was stopped for "
-                  << ModelTypeToString(type_);
-    disconnected_ = true;
-    return base::WeakPtr<SyncableService>();
-  }
-
-  generic_change_processor_ = processor_factory
-                                  ->CreateGenericChangeProcessor(
-                                      type_, user_share, error_handler_->Copy(),
-                                      local_service, merge_result)
-                                  .release();
-  return local_service;
-}
-
-bool SharedChangeProcessor::Disconnect() {
-  // May be called from any thread.
-  DVLOG(1) << "Disconnecting change processor.";
-  AutoLock lock(monitor_lock_);
-  bool was_connected = !disconnected_;
-  disconnected_ = true;
-  error_handler_.reset();
-  return was_connected;
-}
-
-ChangeProcessor* SharedChangeProcessor::generic_change_processor() {
-  return generic_change_processor_;
-}
-
-int SharedChangeProcessor::GetSyncCount() {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-  AutoLock lock(monitor_lock_);
-  if (disconnected_) {
-    LOG(ERROR) << "Change processor disconnected.";
-    return 0;
-  }
-  return generic_change_processor_->GetSyncCount();
-}
-
-SyncError SharedChangeProcessor::ProcessSyncChanges(
-    const base::Location& from_here,
-    const SyncChangeList& list_of_changes) {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-  AutoLock lock(monitor_lock_);
-  if (disconnected_) {
-    // The DTC that disconnects us must ensure it posts a StopSyncing task.
-    // If we reach this, it means it just hasn't executed yet.
-    SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                    "Change processor disconnected.", type_);
-    return error;
-  }
-  return generic_change_processor_->ProcessSyncChanges(from_here,
-                                                       list_of_changes);
-}
-
-SyncDataList SharedChangeProcessor::GetAllSyncData(ModelType type) const {
-  SyncDataList data;
-  GetAllSyncDataReturnError(type, &data);  // Handles the disconnect case.
-  return data;
-}
-
-SyncError SharedChangeProcessor::GetAllSyncDataReturnError(
-    ModelType type,
-    SyncDataList* data) const {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-  AutoLock lock(monitor_lock_);
-  if (disconnected_) {
-    SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                    "Change processor disconnected.", type_);
-    return error;
-  }
-  return generic_change_processor_->GetAllSyncDataReturnError(data);
-}
-
-SyncError SharedChangeProcessor::UpdateDataTypeContext(
-    ModelType type,
-    SyncChangeProcessor::ContextRefreshStatus refresh_status,
-    const std::string& context) {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-  AutoLock lock(monitor_lock_);
-  if (disconnected_) {
-    SyncError error(FROM_HERE, SyncError::DATATYPE_ERROR,
-                    "Change processor disconnected.", type_);
-    return error;
-  }
-  return generic_change_processor_->UpdateDataTypeContext(type, refresh_status,
-                                                          context);
-}
-
-void SharedChangeProcessor::AddLocalChangeObserver(
-    LocalChangeObserver* observer) {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-
-  generic_change_processor_->AddLocalChangeObserver(observer);
-}
-
-void SharedChangeProcessor::RemoveLocalChangeObserver(
-    LocalChangeObserver* observer) {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-
-  generic_change_processor_->RemoveLocalChangeObserver(observer);
-}
-
-bool SharedChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-  AutoLock lock(monitor_lock_);
-  if (disconnected_) {
-    LOG(ERROR) << "Change processor disconnected.";
-    return false;
-  }
-  return generic_change_processor_->SyncModelHasUserCreatedNodes(has_nodes);
-}
-
-bool SharedChangeProcessor::CryptoReadyIfNecessary() {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-  AutoLock lock(monitor_lock_);
-  if (disconnected_) {
-    LOG(ERROR) << "Change processor disconnected.";
-    return true;  // Otherwise we get into infinite spin waiting.
-  }
-  return generic_change_processor_->CryptoReadyIfNecessary();
-}
-
-bool SharedChangeProcessor::GetDataTypeContext(std::string* context) const {
-  DCHECK(backend_task_runner_);
-  DCHECK(backend_task_runner_->RunsTasksInCurrentSequence());
-  AutoLock lock(monitor_lock_);
-  if (disconnected_) {
-    LOG(ERROR) << "Change processor disconnected.";
-    return false;
-  }
-  return generic_change_processor_->GetDataTypeContext(context);
-}
-
-SyncError SharedChangeProcessor::CreateAndUploadError(
-    const base::Location& location,
-    const std::string& message) {
-  AutoLock lock(monitor_lock_);
-  if (!disconnected_) {
-    return error_handler_->CreateAndUploadError(location, message, type_);
-  } else {
-    return SyncError(location, SyncError::DATATYPE_ERROR, message, type_);
-  }
-}
-
-void SharedChangeProcessor::StopLocalService() {
-  if (local_service_)
-    local_service_->StopSyncing(type_);
-  local_service_.reset();
-}
-
-}  // namespace syncer
diff --git a/components/sync/driver/shared_change_processor.h b/components/sync/driver/shared_change_processor.h
deleted file mode 100644
index 2bb1866..0000000
--- a/components/sync/driver/shared_change_processor.h
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_H_
-#define COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_H_
-
-#include <memory>
-#include <string>
-
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/sequenced_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "components/sync/driver/data_type_controller.h"
-#include "components/sync/engine/model_safe_worker.h"
-#include "components/sync/model/data_type_error_handler.h"
-#include "components/sync/model/sync_change_processor.h"
-#include "components/sync/model/sync_data.h"
-#include "components/sync/model/sync_error.h"
-#include "components/sync/model/sync_error_factory.h"
-#include "components/sync/model/sync_merge_result.h"
-
-namespace syncer {
-
-class ChangeProcessor;
-class GenericChangeProcessor;
-class GenericChangeProcessorFactory;
-class SyncClient;
-class SyncableService;
-struct UserShare;
-
-// A ref-counted wrapper around a GenericChangeProcessor for use with datatypes
-// that don't live on the UI thread.
-//
-// We need to make it refcounted as the ownership transfer from the
-// DataTypeController is dependent on threading, and hence racy. The
-// SharedChangeProcessor should be created on the UI thread, but should only be
-// connected and used on the same thread as the datatype it interacts with.
-//
-// The only thread-safe method is Disconnect, which will disconnect from the
-// generic change processor, letting us shut down the syncer/datatype without
-// waiting for non-UI threads.
-//
-// Note: since we control the work being done while holding the lock, we ensure
-// no I/O or other intensive work is done while blocking the UI thread (all
-// the work is in-memory sync interactions).
-//
-// We use virtual methods so that we can use mock's in testing.
-class SharedChangeProcessor
-    : public base::RefCountedThreadSafe<SharedChangeProcessor> {
- public:
-  using StartDoneCallback =
-      base::OnceCallback<void(DataTypeController::ConfigureResult start_result,
-                              const SyncMergeResult& local_merge_result,
-                              const SyncMergeResult& syncer_merge_result)>;
-
-  // Create an uninitialized SharedChangeProcessor.
-  explicit SharedChangeProcessor(ModelType type);
-
-  void StartAssociation(StartDoneCallback start_done,
-                        SyncClient* const sync_client,
-                        GenericChangeProcessorFactory* processor_factory,
-                        UserShare* user_share,
-                        std::unique_ptr<DataTypeErrorHandler> error_handler);
-
-  // Connect to the Syncer and prepare to handle changes for |type|. Will
-  // create and store a new GenericChangeProcessor and return a weak pointer to
-  // the SyncableService associated with |type|.
-  // Note: If this SharedChangeProcessor has been disconnected, or the
-  // SyncableService was not alive, will return a null weak pointer.
-  virtual base::WeakPtr<SyncableService> Connect(
-      SyncClient* sync_client,
-      GenericChangeProcessorFactory* processor_factory,
-      UserShare* user_share,
-      std::unique_ptr<DataTypeErrorHandler> error_handler,
-      const base::WeakPtr<SyncMergeResult>& merge_result);
-
-  // Disconnects from the generic change processor. This method is thread-safe.
-  // After this, all attempts to interact with the change processor by
-  // |local_service_| are dropped and return errors. The syncer will be safe to
-  // shut down from the point of view of this datatype.
-  // Note: Once disconnected, you cannot reconnect without creating a new
-  // SharedChangeProcessor.
-  // Returns: true if we were previously succesfully connected, false if we were
-  // already disconnected.
-  virtual bool Disconnect();
-
-  // GenericChangeProcessor stubs (with disconnect support).
-  // Should only be called on the same sequence the datatype resides.
-  virtual int GetSyncCount();
-  virtual SyncError ProcessSyncChanges(const base::Location& from_here,
-                                       const SyncChangeList& change_list);
-  virtual SyncDataList GetAllSyncData(ModelType type) const;
-  virtual SyncError GetAllSyncDataReturnError(ModelType type,
-                                              SyncDataList* data) const;
-  virtual SyncError UpdateDataTypeContext(
-      ModelType type,
-      SyncChangeProcessor::ContextRefreshStatus refresh_status,
-      const std::string& context);
-  virtual void AddLocalChangeObserver(LocalChangeObserver* observer);
-  virtual void RemoveLocalChangeObserver(LocalChangeObserver* observer);
-  virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes);
-  virtual bool CryptoReadyIfNecessary();
-
-  // If a datatype context associated with the current type exists, fills
-  // |context| and returns true. Otheriwse, if there has not been a context
-  // set, returns false.
-  virtual bool GetDataTypeContext(std::string* context) const;
-
-  virtual SyncError CreateAndUploadError(const base::Location& location,
-                                         const std::string& message);
-
-  // Calls local_service_->StopSyncing() and releases our reference to it.
-  void StopLocalService();
-
-  ChangeProcessor* generic_change_processor();
-
- protected:
-  friend class base::RefCountedThreadSafe<SharedChangeProcessor>;
-  virtual ~SharedChangeProcessor();
-
- private:
-  // Monitor lock for this object. All methods that interact with the change
-  // processor must aquire this lock and check whether we're disconnected or
-  // not. Once disconnected, all attempted changes to or loads from the change
-  // processor return errors. This enables us to shut down the syncer without
-  // having to wait for possibly non-UI thread datatypes to complete work.
-  mutable base::Lock monitor_lock_;
-  bool disconnected_;
-
-  // The sync datatype we process changes for.
-  const ModelType type_;
-
-  // The frontend / UI MessageLoop this object is constructed on. May also be
-  // destructed and/or disconnected on this loop, see ~SharedChangeProcessor.
-  const scoped_refptr<const base::SequencedTaskRunner> frontend_task_runner_;
-
-  // The execution sequence that all methods except the constructor, destructor,
-  // and Disconnect() should be called on. Set in Connect().
-  scoped_refptr<base::SequencedTaskRunner> backend_task_runner_;
-
-  // Used only on |backend_task_runner_|.
-  GenericChangeProcessor* generic_change_processor_;
-
-  std::unique_ptr<DataTypeErrorHandler> error_handler_;
-
-  // The local service for this type. Only set if the DTC for the type uses
-  // SharedChangeProcessor::StartAssociation().
-  base::WeakPtr<SyncableService> local_service_;
-
-  DISALLOW_COPY_AND_ASSIGN(SharedChangeProcessor);
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_H_
diff --git a/components/sync/driver/shared_change_processor_ref.cc b/components/sync/driver/shared_change_processor_ref.cc
deleted file mode 100644
index 67cf7bd..0000000
--- a/components/sync/driver/shared_change_processor_ref.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/shared_change_processor_ref.h"
-
-namespace syncer {
-
-SharedChangeProcessorRef::SharedChangeProcessorRef(
-    const scoped_refptr<SharedChangeProcessor>& change_processor)
-    : change_processor_(change_processor) {
-  DCHECK(change_processor_);
-}
-
-SharedChangeProcessorRef::~SharedChangeProcessorRef() {}
-
-SyncError SharedChangeProcessorRef::ProcessSyncChanges(
-    const base::Location& from_here,
-    const SyncChangeList& change_list) {
-  return change_processor_->ProcessSyncChanges(from_here, change_list);
-}
-
-SyncDataList SharedChangeProcessorRef::GetAllSyncData(ModelType type) const {
-  return change_processor_->GetAllSyncData(type);
-}
-
-SyncError SharedChangeProcessorRef::UpdateDataTypeContext(
-    ModelType type,
-    SyncChangeProcessor::ContextRefreshStatus refresh_status,
-    const std::string& context) {
-  return change_processor_->UpdateDataTypeContext(type, refresh_status,
-                                                  context);
-}
-
-void SharedChangeProcessorRef::AddLocalChangeObserver(
-    LocalChangeObserver* observer) {
-  change_processor_->AddLocalChangeObserver(observer);
-}
-
-void SharedChangeProcessorRef::RemoveLocalChangeObserver(
-    LocalChangeObserver* observer) {
-  change_processor_->RemoveLocalChangeObserver(observer);
-}
-
-SyncError SharedChangeProcessorRef::CreateAndUploadError(
-    const base::Location& from_here,
-    const std::string& message) {
-  return change_processor_->CreateAndUploadError(from_here, message);
-}
-
-}  // namespace syncer
diff --git a/components/sync/driver/shared_change_processor_ref.h b/components/sync/driver/shared_change_processor_ref.h
deleted file mode 100644
index f75ec1c..0000000
--- a/components/sync/driver/shared_change_processor_ref.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_REF_H_
-#define COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_REF_H_
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/memory/ref_counted.h"
-#include "components/sync/driver/shared_change_processor.h"
-#include "components/sync/model/sync_change_processor.h"
-#include "components/sync/model/sync_error_factory.h"
-
-namespace syncer {
-
-// A SyncChangeProcessor stub for interacting with a refcounted
-// SharedChangeProcessor.
-class SharedChangeProcessorRef : public SyncChangeProcessor,
-                                 public SyncErrorFactory {
- public:
-  SharedChangeProcessorRef(
-      const scoped_refptr<SharedChangeProcessor>& change_processor);
-  ~SharedChangeProcessorRef() override;
-
-  // SyncChangeProcessor implementation.
-  SyncError ProcessSyncChanges(const base::Location& from_here,
-                               const SyncChangeList& change_list) override;
-  SyncDataList GetAllSyncData(ModelType type) const override;
-  SyncError UpdateDataTypeContext(
-      ModelType type,
-      SyncChangeProcessor::ContextRefreshStatus refresh_status,
-      const std::string& context) override;
-  void AddLocalChangeObserver(LocalChangeObserver* observer) override;
-  void RemoveLocalChangeObserver(LocalChangeObserver* observer) override;
-
-  // SyncErrorFactory implementation.
-  SyncError CreateAndUploadError(const base::Location& from_here,
-                                 const std::string& message) override;
-
-  // Default copy and assign welcome (and safe due to refcounted-ness).
-
- private:
-  scoped_refptr<SharedChangeProcessor> change_processor_;
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_DRIVER_SHARED_CHANGE_PROCESSOR_REF_H_
diff --git a/components/sync/driver/shared_change_processor_unittest.cc b/components/sync/driver/shared_change_processor_unittest.cc
deleted file mode 100644
index c50acf4e..0000000
--- a/components/sync/driver/shared_change_processor_unittest.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/driver/shared_change_processor.h"
-
-#include <cstddef>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/compiler_specific.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/task_environment.h"
-#include "base/threading/thread.h"
-#include "components/sync/base/model_type.h"
-#include "components/sync/driver/data_type_manager.h"
-#include "components/sync/driver/generic_change_processor.h"
-#include "components/sync/driver/generic_change_processor_factory.h"
-#include "components/sync/driver/sync_client_mock.h"
-#include "components/sync/engine/sync_engine.h"
-#include "components/sync/model/data_type_error_handler_mock.h"
-#include "components/sync/model/fake_syncable_service.h"
-#include "components/sync/syncable/test_user_share.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace syncer {
-
-namespace {
-
-using ::testing::_;
-using ::testing::NiceMock;
-using ::testing::StrictMock;
-
-class SyncSharedChangeProcessorTest : public testing::Test {
- public:
-  SyncSharedChangeProcessorTest()
-      : model_thread_("dbthread"), did_connect_(false) {}
-
-  ~SyncSharedChangeProcessorTest() override {
-    EXPECT_FALSE(db_syncable_service_);
-  }
-
- protected:
-  base::WeakPtr<SyncableService> GetSyncableServiceForType(ModelType type) {
-    DCHECK(model_thread_.task_runner()->BelongsToCurrentThread());
-    return db_syncable_service_->AsWeakPtr();
-  }
-
-  void SetUp() override {
-    test_user_share_.SetUp();
-    shared_change_processor_ = new SharedChangeProcessor(AUTOFILL);
-    ON_CALL(sync_client_, GetSyncableServiceForType(AUTOFILL))
-        .WillByDefault(testing::Invoke(
-            this, &SyncSharedChangeProcessorTest::GetSyncableServiceForType));
-    ASSERT_TRUE(model_thread_.Start());
-    ASSERT_TRUE(model_thread_.task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&SyncSharedChangeProcessorTest::SetUpDBSyncableService,
-                       base::Unretained(this))));
-  }
-
-  void TearDown() override {
-    EXPECT_TRUE(model_thread_.task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            &SyncSharedChangeProcessorTest::TearDownDBSyncableService,
-            base::Unretained(this))));
-    // This must happen before the DB thread is stopped since
-    // |shared_change_processor_| may post tasks to delete its members
-    // on the correct thread.
-    //
-    // TODO(akalin): Write deterministic tests for the destruction of
-    // |shared_change_processor_| on the UI and DB threads.
-    shared_change_processor_ = nullptr;
-    model_thread_.Stop();
-
-    // Note: Stop() joins the threads, and that barrier prevents this read
-    // from being moved (e.g by compiler optimization) in such a way that it
-    // would race with the write in ConnectOnDBThread (because by this time,
-    // everything that could have run on |model_thread_| has done so).
-    ASSERT_TRUE(did_connect_);
-    test_user_share_.TearDown();
-  }
-
-  // Connect |shared_change_processor_| on the DB thread.
-  void Connect() {
-    EXPECT_TRUE(model_thread_.task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&SyncSharedChangeProcessorTest::ConnectOnDBThread,
-                       base::Unretained(this), shared_change_processor_)));
-  }
-
- private:
-  // Used by SetUp().
-  void SetUpDBSyncableService() {
-    DCHECK(model_thread_.task_runner()->BelongsToCurrentThread());
-    DCHECK(!db_syncable_service_);
-    db_syncable_service_ = std::make_unique<FakeSyncableService>();
-  }
-
-  // Used by TearDown().
-  void TearDownDBSyncableService() {
-    DCHECK(model_thread_.task_runner()->BelongsToCurrentThread());
-    DCHECK(db_syncable_service_);
-    db_syncable_service_.reset();
-  }
-
-  // Used by Connect().  The SharedChangeProcessor is passed in
-  // because we modify |shared_change_processor_| on the main thread
-  // (in TearDown()).
-  void ConnectOnDBThread(
-      const scoped_refptr<SharedChangeProcessor>& shared_change_processor) {
-    DCHECK(model_thread_.task_runner()->BelongsToCurrentThread());
-    EXPECT_TRUE(shared_change_processor->Connect(
-        &sync_client_, &processor_factory_, test_user_share_.user_share(),
-        std::make_unique<DataTypeErrorHandlerMock>(),
-        base::WeakPtr<SyncMergeResult>()));
-    did_connect_ = true;
-  }
-
-  base::test::SingleThreadTaskEnvironment task_environment_;
-  base::Thread model_thread_;
-  TestUserShare test_user_share_;
-
-  scoped_refptr<SharedChangeProcessor> shared_change_processor_;
-
-  GenericChangeProcessorFactory processor_factory_;
-  bool did_connect_;
-
-  // Used only on DB thread.
-  std::unique_ptr<FakeSyncableService> db_syncable_service_;
-
-  testing::NiceMock<SyncClientMock> sync_client_;
-};
-
-// Simply connect the shared change processor.  It should succeed, and
-// nothing further should happen.
-TEST_F(SyncSharedChangeProcessorTest, Basic) {
-  Connect();
-}
-
-}  // namespace
-
-}  // namespace syncer
diff --git a/components/sync/driver/sync_driver_switches.cc b/components/sync/driver/sync_driver_switches.cc
index b474588f..a807610 100644
--- a/components/sync/driver/sync_driver_switches.cc
+++ b/components/sync/driver/sync_driver_switches.cc
@@ -53,10 +53,6 @@
 const base::Feature kStopSyncInPausedState{"StopSyncInPausedState",
                                            base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Enable USS implementation of Passwords datatype.
-const base::Feature kSyncUSSPasswords{"SyncUSSPasswords",
-                                      base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enable USS implementation of Nigori datatype.
 const base::Feature kSyncUSSNigori{"SyncUSSNigori",
                                    base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/sync/driver/sync_driver_switches.h b/components/sync/driver/sync_driver_switches.h
index bfb14065..909b2e88 100644
--- a/components/sync/driver/sync_driver_switches.h
+++ b/components/sync/driver/sync_driver_switches.h
@@ -29,7 +29,6 @@
 extern const base::Feature kStopSyncInPausedState;
 extern const base::Feature
     kSyncAllowWalletDataInTransportModeWithCustomPassphrase;
-extern const base::Feature kSyncUSSPasswords;
 extern const base::Feature kSyncUSSNigori;
 extern const base::Feature kSyncWifiConfigurations;
 extern const base::Feature kUpdateBookmarkGUIDWithNodeReplacement;
diff --git a/components/sync/engine/model_safe_worker.cc b/components/sync/engine/model_safe_worker.cc
index 24d70865..841ee4a 100644
--- a/components/sync/engine/model_safe_worker.cc
+++ b/components/sync/engine/model_safe_worker.cc
@@ -51,12 +51,8 @@
 
 std::string ModelSafeGroupToString(ModelSafeGroup group) {
   switch (group) {
-    case GROUP_UI:
-      return "Group UI";
     case GROUP_PASSIVE:
       return "Group Passive";
-    case GROUP_PASSWORD:
-      return "Group Password";
     case GROUP_NON_BLOCKING:
       return "Group Non Blocking";
   }
diff --git a/components/sync/engine/model_safe_worker.h b/components/sync/engine/model_safe_worker.h
index 1658950..3f514bf 100644
--- a/components/sync/engine/model_safe_worker.h
+++ b/components/sync/engine/model_safe_worker.h
@@ -30,10 +30,6 @@
   GROUP_PASSIVE = 0,   // Models that are just "passively" being synced; e.g.
                        // changes to these models don't need to be pushed to a
                        // native model.
-  GROUP_UI,            // Models that live on UI thread and are being synced.
-  GROUP_PASSWORD,      // Models that live on the password thread and are
-                       // being synced.  On windows and linux, this runs on the
-                       // DB thread.
   GROUP_NON_BLOCKING,  // Models that correspond to non-blocking types. These
                        // models always stay in GROUP_NON_BLOCKING; changes are
                        // forwarded to these models without ModelSafeWorker/
diff --git a/components/sync/engine/model_safe_worker_unittest.cc b/components/sync/engine/model_safe_worker_unittest.cc
index 7efe517..e498aa5e 100644
--- a/components/sync/engine/model_safe_worker_unittest.cc
+++ b/components/sync/engine/model_safe_worker_unittest.cc
@@ -87,14 +87,10 @@
 TEST_F(ModelSafeWorkerTest, ModelSafeRoutingInfoToValue) {
   ModelSafeRoutingInfo routing_info;
   routing_info[BOOKMARKS] = GROUP_PASSIVE;
-  routing_info[NIGORI] = GROUP_UI;
-  routing_info[PASSWORDS] = GROUP_PASSWORD;
   routing_info[APPS] = GROUP_NON_BLOCKING;
   base::DictionaryValue expected_value;
   expected_value.SetString("Apps", "Group Non Blocking");
   expected_value.SetString("Bookmarks", "Group Passive");
-  expected_value.SetString("Encryption Keys", "Group UI");
-  expected_value.SetString("Passwords", "Group Password");
   std::unique_ptr<base::DictionaryValue> value(
       ModelSafeRoutingInfoToValue(routing_info));
   EXPECT_TRUE(value->Equals(&expected_value));
@@ -104,20 +100,15 @@
   ModelSafeRoutingInfo routing_info;
   routing_info[APPS] = GROUP_NON_BLOCKING;
   routing_info[BOOKMARKS] = GROUP_PASSIVE;
-  routing_info[NIGORI] = GROUP_UI;
-  routing_info[PASSWORDS] = GROUP_PASSWORD;
-  EXPECT_EQ(
-      "{\"Apps\":\"Group Non Blocking\",\"Bookmarks\":\"Group Passive\","
-      "\"Encryption Keys\":\"Group UI\",\"Passwords\":\"Group Password\"}",
-      ModelSafeRoutingInfoToString(routing_info));
+  EXPECT_EQ("{\"Apps\":\"Group Non Blocking\",\"Bookmarks\":\"Group Passive\"}",
+            ModelSafeRoutingInfoToString(routing_info));
 }
 
 TEST_F(ModelSafeWorkerTest, GetRoutingInfoTypes) {
   ModelSafeRoutingInfo routing_info;
   routing_info[BOOKMARKS] = GROUP_PASSIVE;
-  routing_info[NIGORI] = GROUP_UI;
-  routing_info[PASSWORDS] = GROUP_PASSWORD;
-  const ModelTypeSet expected_types(BOOKMARKS, NIGORI, PASSWORDS);
+  routing_info[PASSWORDS] = GROUP_NON_BLOCKING;
+  const ModelTypeSet expected_types(BOOKMARKS, PASSWORDS);
   EXPECT_EQ(expected_types, GetRoutingInfoTypes(routing_info));
 }
 
diff --git a/components/sync/engine/sequenced_model_worker.cc b/components/sync/engine/sequenced_model_worker.cc
deleted file mode 100644
index ed84c5cd..0000000
--- a/components/sync/engine/sequenced_model_worker.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/engine/sequenced_model_worker.h"
-
-#include <utility>
-
-namespace syncer {
-
-SequencedModelWorker::SequencedModelWorker(
-    const scoped_refptr<base::SequencedTaskRunner>& runner,
-    ModelSafeGroup group)
-    : runner_(runner), group_(group) {}
-
-void SequencedModelWorker::ScheduleWork(base::OnceClosure work) {
-  if (runner_->RunsTasksInCurrentSequence()) {
-    DLOG(WARNING) << "Already on sequenced task runner " << runner_;
-    std::move(work).Run();
-  } else {
-    runner_->PostTask(FROM_HERE, std::move(work));
-  }
-}
-
-ModelSafeGroup SequencedModelWorker::GetModelSafeGroup() {
-  return group_;
-}
-
-bool SequencedModelWorker::IsOnModelSequence() {
-  return runner_->RunsTasksInCurrentSequence();
-}
-
-SequencedModelWorker::~SequencedModelWorker() {}
-
-}  // namespace syncer
diff --git a/components/sync/engine/sequenced_model_worker.h b/components/sync/engine/sequenced_model_worker.h
deleted file mode 100644
index 7da1b787..0000000
--- a/components/sync/engine/sequenced_model_worker.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_ENGINE_SEQUENCED_MODEL_WORKER_H_
-#define COMPONENTS_SYNC_ENGINE_SEQUENCED_MODEL_WORKER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/sequenced_task_runner.h"
-#include "components/sync/engine/model_safe_worker.h"
-
-namespace syncer {
-
-// A ModelSafeWorker for models that accept requests from the
-// syncapi that need to be fulfilled on a model specific sequenced task runner.
-// TODO(sync): Try to generalize other ModelWorkers (e.g. history, etc).
-class SequencedModelWorker : public ModelSafeWorker {
- public:
-  SequencedModelWorker(const scoped_refptr<base::SequencedTaskRunner>& runner,
-                       ModelSafeGroup group);
-
-  // ModelSafeWorker implementation.
-  ModelSafeGroup GetModelSafeGroup() override;
-  bool IsOnModelSequence() override;
-
- private:
-  ~SequencedModelWorker() override;
-
-  void ScheduleWork(base::OnceClosure work) override;
-
-  scoped_refptr<base::SequencedTaskRunner> runner_;
-  ModelSafeGroup group_;
-
-  DISALLOW_COPY_AND_ASSIGN(SequencedModelWorker);
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_ENGINE_SEQUENCED_MODEL_WORKER_H_
diff --git a/components/sync/engine/sequenced_model_worker_unittest.cc b/components/sync/engine/sequenced_model_worker_unittest.cc
deleted file mode 100644
index 8bb8fafc..0000000
--- a/components/sync/engine/sequenced_model_worker_unittest.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/engine/sequenced_model_worker.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/location.h"
-#include "base/memory/weak_ptr.h"
-#include "base/run_loop.h"
-#include "base/task/post_task.h"
-#include "base/task/thread_pool.h"
-#include "base/test/task_environment.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/timer/timer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace syncer {
-
-namespace {
-
-class SequencedModelWorkerTest : public testing::Test {
- public:
-  SequencedModelWorkerTest() : did_do_work_(false) {}
-
-  bool did_do_work() { return did_do_work_; }
-  SequencedModelWorker* worker() { return worker_.get(); }
-  base::OneShotTimer* timer() { return &timer_; }
-  base::WeakPtrFactory<SequencedModelWorkerTest>* factory() {
-    return &weak_factory_;
-  }
-
-  // Schedule DoWork to be executed on the DB sequence and have the test fail if
-  // DoWork hasn't executed within action_timeout().
-  void ScheduleWork() {
-    // We wait until the callback is done. So it is safe to use unretained.
-    timer()->Start(FROM_HERE, TestTimeouts::action_timeout(), this,
-                   &SequencedModelWorkerTest::Timeout);
-    worker()->DoWorkAndWaitUntilDone(base::BindOnce(
-        &SequencedModelWorkerTest::DoWork, base::Unretained(this)));
-  }
-
-  // This is the work that will be scheduled to be done on the DB sequence.
-  SyncerError DoWork() {
-    EXPECT_TRUE(task_runner_->RunsTasksInCurrentSequence());
-    run_loop_.Quit();
-    did_do_work_ = true;
-    return SyncerError(SyncerError::SYNCER_OK);
-  }
-
-  // This will be called by the OneShotTimer and make the test fail unless
-  // DoWork is called first.
-  void Timeout() {
-    ADD_FAILURE()
-        << "Timed out waiting for work to be done on the DB sequence.";
-    run_loop_.Quit();
-  }
-
- protected:
-  void SetUp() override {
-    task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
-        {base::MayBlock(), base::TaskPriority::BEST_EFFORT});
-    worker_ = new SequencedModelWorker(task_runner_, GROUP_PASSWORD);
-  }
-
- private:
-  base::test::TaskEnvironment task_environment_;
-  bool did_do_work_;
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
-  scoped_refptr<SequencedModelWorker> worker_;
-  base::OneShotTimer timer_;
-
- protected:
-  base::RunLoop run_loop_;
-
- private:
-  base::WeakPtrFactory<SequencedModelWorkerTest> weak_factory_{this};
-};
-
-TEST_F(SequencedModelWorkerTest, DoesWorkOnDatabaseSequence) {
-  base::SequencedTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&SequencedModelWorkerTest::ScheduleWork,
-                                factory()->GetWeakPtr()));
-  run_loop_.Run();
-  EXPECT_TRUE(did_do_work());
-}
-
-}  // namespace
-
-}  // namespace syncer
diff --git a/components/sync/engine/sync_backend_registrar.cc b/components/sync/engine/sync_backend_registrar.cc
index b814d883..9587c44 100644
--- a/components/sync/engine/sync_backend_registrar.cc
+++ b/components/sync/engine/sync_backend_registrar.cc
@@ -19,9 +19,7 @@
     ModelSafeWorkerFactory worker_factory)
     : name_(name) {
   DCHECK(!worker_factory.is_null());
-  MaybeAddWorker(worker_factory, GROUP_UI);
   MaybeAddWorker(worker_factory, GROUP_PASSIVE);
-  MaybeAddWorker(worker_factory, GROUP_PASSWORD);
 }
 
 void SyncBackendRegistrar::RegisterNonBlockingType(ModelType type) {
@@ -58,12 +56,6 @@
     }
   }
 
-  if (!workers_.count(GROUP_PASSWORD)) {
-    LOG_IF(WARNING, initial_types.Has(PASSWORDS))
-        << "Password store not initialized, cannot sync passwords";
-    routing_info_.erase(PASSWORDS);
-  }
-
   // Although this can re-set NonBlocking types, this should be idempotent.
   last_configured_types_ = GetRoutingInfoTypes(routing_info_);
 }
@@ -89,15 +81,10 @@
     ModelTypeSet types_to_add,
     ModelTypeSet types_to_remove) {
   DCHECK(Intersection(types_to_add, types_to_remove).Empty());
-  ModelTypeSet filtered_types_to_add = types_to_add;
-  if (workers_.count(GROUP_PASSWORD) == 0) {
-    LOG(WARNING) << "No password worker -- removing PASSWORDS";
-    filtered_types_to_add.Remove(PASSWORDS);
-  }
 
   base::AutoLock lock(lock_);
   ModelTypeSet newly_added_types;
-  for (ModelType type : filtered_types_to_add) {
+  for (ModelType type : types_to_add) {
     // Add a newly specified data type corresponding initial group into the
     // routing_info, if it does not already exist.
     if (routing_info_.count(type) == 0) {
diff --git a/components/sync/engine/sync_backend_registrar_unittest.cc b/components/sync/engine/sync_backend_registrar_unittest.cc
index 437cc98..7ba17940 100644
--- a/components/sync/engine/sync_backend_registrar_unittest.cc
+++ b/components/sync/engine/sync_backend_registrar_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/test/task_environment.h"
 #include "base/threading/thread.h"
 #include "components/sync/engine/passive_model_worker.h"
-#include "components/sync/engine/sequenced_model_worker.h"
 #include "components/sync/model/change_processor_mock.h"
 #include "components/sync/syncable/test_user_share.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -84,9 +83,6 @@
   scoped_refptr<ModelSafeWorker> CreateModelWorkerForGroup(
       ModelSafeGroup group) {
     switch (group) {
-      case GROUP_UI:
-        return new SequencedModelWorker(
-            task_environment_.GetMainThreadTaskRunner(), group);
       case GROUP_PASSIVE:
         return new PassiveModelWorker();
       default:
@@ -105,16 +101,16 @@
 TEST_F(SyncBackendRegistrarTest, ConstructorEmpty) {
   registrar()->SetInitialTypes(ModelTypeSet());
   EXPECT_FALSE(registrar()->IsNigoriEnabled());
-  EXPECT_EQ(2u, GetWorkersSize());
+  EXPECT_EQ(1u, GetWorkersSize());
   ExpectRoutingInfo(ModelSafeRoutingInfo());
   ExpectHasProcessorsForTypes(ModelTypeSet());
 }
 
 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmpty) {
   registrar()->RegisterNonBlockingType(BOOKMARKS);
-  registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS));
+  registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI));
   EXPECT_TRUE(registrar()->IsNigoriEnabled());
-  EXPECT_EQ(2u, GetWorkersSize());
+  EXPECT_EQ(1u, GetWorkersSize());
   EXPECT_EQ(ModelTypeSet(NIGORI), registrar()->GetLastConfiguredTypes());
   // Bookmarks dropped because it is nonblocking.
   // Passwords dropped because of no password store.
@@ -124,10 +120,10 @@
 
 TEST_F(SyncBackendRegistrarTest, ConstructorNonEmptyReversedInitialization) {
   // The blocking types get to set initial types before NonBlocking types here.
-  registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI, PASSWORDS));
+  registrar()->SetInitialTypes(ModelTypeSet(BOOKMARKS, NIGORI));
   registrar()->RegisterNonBlockingType(BOOKMARKS);
   EXPECT_TRUE(registrar()->IsNigoriEnabled());
-  EXPECT_EQ(2u, GetWorkersSize());
+  EXPECT_EQ(1u, GetWorkersSize());
   EXPECT_EQ(ModelTypeSet(NIGORI), registrar()->GetLastConfiguredTypes());
   // Bookmarks dropped because it is nonblocking.
   // Passwords dropped because of no password store.
@@ -163,38 +159,6 @@
   EXPECT_EQ(ModelTypeSet(), registrar()->GetLastConfiguredTypes());
 }
 
-TEST_F(SyncBackendRegistrarTest, ActivateDeactivateUIDataType) {
-  InSequence in_sequence;
-  registrar()->SetInitialTypes(ModelTypeSet());
-
-  // Should do nothing.
-  TriggerChanges(BOOKMARKS);
-
-  StrictMock<ChangeProcessorMock> change_processor_mock;
-  EXPECT_CALL(change_processor_mock, StartImpl());
-  EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true));
-  EXPECT_CALL(change_processor_mock, ApplyChangesFromSyncModel(nullptr, _, _));
-  EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(true));
-  EXPECT_CALL(change_processor_mock, CommitChangesFromSyncModel());
-  EXPECT_CALL(change_processor_mock, IsRunning()).WillRepeatedly(Return(false));
-
-  const ModelTypeSet types(BOOKMARKS);
-  EXPECT_EQ(types, registrar()->ConfigureDataTypes(types, ModelTypeSet()));
-  registrar()->ActivateDataType(BOOKMARKS, GROUP_UI, &change_processor_mock,
-                                user_share());
-  ExpectRoutingInfo({{BOOKMARKS, GROUP_UI}});
-  ExpectHasProcessorsForTypes(types);
-
-  TriggerChanges(BOOKMARKS);
-
-  registrar()->DeactivateDataType(BOOKMARKS);
-  ExpectRoutingInfo(ModelSafeRoutingInfo());
-  ExpectHasProcessorsForTypes(ModelTypeSet());
-
-  // Should do nothing.
-  TriggerChanges(BOOKMARKS);
-}
-
 // Tests that registration and configuration of non-blocking data types is
 // handled correctly in SyncBackendRegistrar.
 TEST_F(SyncBackendRegistrarTest, ConfigureNonBlockingDataType) {
diff --git a/components/sync/engine/ui_model_worker.cc b/components/sync/engine/ui_model_worker.cc
deleted file mode 100644
index 2df7465f..0000000
--- a/components/sync/engine/ui_model_worker.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/engine/ui_model_worker.h"
-
-#include <utility>
-
-namespace syncer {
-
-UIModelWorker::UIModelWorker(
-    scoped_refptr<base::SingleThreadTaskRunner> ui_thread)
-    : ui_thread_(std::move(ui_thread)) {}
-
-ModelSafeGroup UIModelWorker::GetModelSafeGroup() {
-  return GROUP_UI;
-}
-
-bool UIModelWorker::IsOnModelSequence() {
-  return ui_thread_->BelongsToCurrentThread();
-}
-
-UIModelWorker::~UIModelWorker() {}
-
-void UIModelWorker::ScheduleWork(base::OnceClosure work) {
-  ui_thread_->PostTask(FROM_HERE, std::move(work));
-}
-
-}  // namespace syncer
diff --git a/components/sync/engine/ui_model_worker.h b/components/sync/engine/ui_model_worker.h
deleted file mode 100644
index 325bae0..0000000
--- a/components/sync/engine/ui_model_worker.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SYNC_ENGINE_UI_MODEL_WORKER_H_
-#define COMPONENTS_SYNC_ENGINE_UI_MODEL_WORKER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "components/sync/engine/model_safe_worker.h"
-
-namespace syncer {
-
-// A ModelSafeWorker for UI models (e.g. bookmarks) that
-// accepts work requests from the syncapi that need to be fulfilled
-// from the MessageLoop home to the native model.
-class UIModelWorker : public ModelSafeWorker {
- public:
-  explicit UIModelWorker(scoped_refptr<base::SingleThreadTaskRunner> ui_thread);
-
-  // ModelSafeWorker implementation.
-  ModelSafeGroup GetModelSafeGroup() override;
-  bool IsOnModelSequence() override;
-
- private:
-  ~UIModelWorker() override;
-
-  void ScheduleWork(base::OnceClosure work) override;
-
-  // A reference to the UI thread's task runner.
-  const scoped_refptr<base::SingleThreadTaskRunner> ui_thread_;
-
-  DISALLOW_COPY_AND_ASSIGN(UIModelWorker);
-};
-
-}  // namespace syncer
-
-#endif  // COMPONENTS_SYNC_ENGINE_UI_MODEL_WORKER_H_
diff --git a/components/sync/engine/ui_model_worker_unittest.cc b/components/sync/engine/ui_model_worker_unittest.cc
deleted file mode 100644
index aac3b0e..0000000
--- a/components/sync/engine/ui_model_worker_unittest.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/engine/ui_model_worker.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/location.h"
-#include "base/run_loop.h"
-#include "base/test/task_environment.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace syncer {
-namespace {
-
-// Makes a Closure into a WorkCallback.
-// Does |work| and checks that we're on the |thread_verifier| thread.
-SyncerError DoWork(
-    const scoped_refptr<base::SingleThreadTaskRunner>& thread_verifier,
-    base::OnceClosure work) {
-  DCHECK(thread_verifier->BelongsToCurrentThread());
-  std::move(work).Run();
-  return SyncerError(SyncerError::SYNCER_OK);
-}
-
-// Converts |work| to a WorkCallback that will verify that it's run on the
-// thread it was constructed on.
-WorkCallback ClosureToWorkCallback(base::OnceClosure work) {
-  return base::BindOnce(&DoWork, base::ThreadTaskRunnerHandle::Get(),
-                        std::move(work));
-}
-
-// Increments |counter|.
-void IncrementCounter(int* counter) {
-  ++*counter;
-}
-
-class SyncUIModelWorkerTest : public testing::Test {
- public:
-  SyncUIModelWorkerTest() : sync_thread_("SyncThreadForTest") {
-    sync_thread_.Start();
-    worker_ = new UIModelWorker(base::ThreadTaskRunnerHandle::Get());
-  }
-
-  void PostWorkToSyncThread(base::OnceClosure work) {
-    sync_thread_.task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            base::IgnoreResult(&UIModelWorker::DoWorkAndWaitUntilDone), worker_,
-            ClosureToWorkCallback(std::move(work))));
-  }
-
- protected:
-  std::unique_ptr<base::test::SingleThreadTaskEnvironment> task_environment_ =
-      std::make_unique<base::test::SingleThreadTaskEnvironment>();
-  base::Thread sync_thread_;
-  scoped_refptr<UIModelWorker> worker_;
-};
-
-}  // namespace
-
-TEST_F(SyncUIModelWorkerTest, ScheduledWorkRunsOnUILoop) {
-  base::RunLoop run_loop;
-  PostWorkToSyncThread(run_loop.QuitClosure());
-  // This won't quit until the QuitClosure is run.
-  run_loop.Run();
-}
-
-TEST_F(SyncUIModelWorkerTest, MultipleDoWork) {
-  constexpr int kNumWorkCallbacks = 10;
-  int counter = 0;
-  for (int i = 0; i < kNumWorkCallbacks; ++i) {
-    PostWorkToSyncThread(
-        base::BindOnce(&IncrementCounter, base::Unretained(&counter)));
-  }
-
-  base::RunLoop run_loop;
-  PostWorkToSyncThread(run_loop.QuitClosure());
-  run_loop.Run();
-
-  EXPECT_EQ(kNumWorkCallbacks, counter);
-}
-
-TEST_F(SyncUIModelWorkerTest, JoinSyncThreadAfterUIMessageLoopDestruction) {
-  PostWorkToSyncThread(base::DoNothing());
-
-  // Wait to allow the sync thread to post the WorkCallback to the UI
-  // MessageLoop. This is racy. If the WorkCallback isn't posted fast enough,
-  // this test doesn't verify that UIModelWorker behaves properly when the UI
-  // MessageLoop is destroyed. However, it doesn't fail (no flakes).
-  base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-
-  // The sync thread shouldn't wait for the WorkCallback to run on the UI thread
-  // after the UI MessageLoop is gone.
-  task_environment_.reset();
-  sync_thread_.Stop();
-}
-
-TEST_F(SyncUIModelWorkerTest, JoinSyncThreadAfterRequestStop) {
-  PostWorkToSyncThread(base::DoNothing());
-
-  // Wait to allow the sync thread to post the WorkCallback to the UI
-  // MessageLoop. This is racy. If the WorkCallback isn't posted fast enough,
-  // this test doesn't verify that UIModelWorker behaves properly when
-  // RequestStop() is called. However, it doesn't fail (no flakes).
-  base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-
-  // The sync thread shouldn't wait for the WorkCallback to run on the UI thread
-  // after RequestStop() is called.
-  worker_->RequestStop();
-  sync_thread_.Stop();
-}
-
-}  // namespace syncer
diff --git a/components/sync/engine_impl/directory_update_handler_unittest.cc b/components/sync/engine_impl/directory_update_handler_unittest.cc
index 70b17ad..e8ed43e 100644
--- a/components/sync/engine_impl/directory_update_handler_unittest.cc
+++ b/components/sync/engine_impl/directory_update_handler_unittest.cc
@@ -46,7 +46,7 @@
 class DirectoryUpdateHandlerProcessUpdateTest : public ::testing::Test {
  public:
   DirectoryUpdateHandlerProcessUpdateTest()
-      : ui_worker_(new FakeModelWorker(GROUP_UI)) {}
+      : ui_worker_(new FakeModelWorker(GROUP_NON_BLOCKING)) {}
 
   ~DirectoryUpdateHandlerProcessUpdateTest() override {}
 
@@ -473,24 +473,18 @@
 class DirectoryUpdateHandlerApplyUpdateTest : public ::testing::Test {
  public:
   DirectoryUpdateHandlerApplyUpdateTest()
-      : ui_worker_(new FakeModelWorker(GROUP_UI)),
-        password_worker_(new FakeModelWorker(GROUP_PASSWORD)),
+      : non_blocking_worker_(new FakeModelWorker(GROUP_NON_BLOCKING)),
         passive_worker_(new FakeModelWorker(GROUP_PASSIVE)),
-        bookmarks_emitter_(BOOKMARKS, &type_observers_),
-        passwords_emitter_(PASSWORDS, &type_observers_) {}
+        bookmarks_emitter_(BOOKMARKS, &type_observers_) {}
 
   void SetUp() override {
     dir_maker_.SetUp();
     entry_factory_ = std::make_unique<TestEntryFactory>(directory());
 
     update_handler_map_.insert(std::make_pair(
-        BOOKMARKS,
-        std::make_unique<DirectoryUpdateHandler>(
-            directory(), BOOKMARKS, ui_worker_, &bookmarks_emitter_)));
-    update_handler_map_.insert(std::make_pair(
-        PASSWORDS,
-        std::make_unique<DirectoryUpdateHandler>(
-            directory(), PASSWORDS, password_worker_, &passwords_emitter_)));
+        BOOKMARKS, std::make_unique<DirectoryUpdateHandler>(
+                       directory(), BOOKMARKS, non_blocking_worker_,
+                       &bookmarks_emitter_)));
   }
 
   void TearDown() override { dir_maker_.TearDown(); }
@@ -499,10 +493,6 @@
     return bookmarks_emitter_.GetUpdateCounters();
   }
 
-  const UpdateCounters& GetPasswordsUpdateCounters() {
-    return passwords_emitter_.GetUpdateCounters();
-  }
-
   DirectoryCryptographer* GetCryptographer(
       const syncable::BaseTransaction* trans) {
     return dir_maker_.GetCryptographer(trans);
@@ -513,10 +503,6 @@
     update_handler_map_.find(BOOKMARKS)->second->ApplyUpdates(status);
   }
 
-  void ApplyPasswordUpdates(StatusController* status) {
-    update_handler_map_.find(PASSWORDS)->second->ApplyUpdates(status);
-  }
-
   TestEntryFactory* entry_factory() { return entry_factory_.get(); }
 
   syncable::Directory* directory() { return dir_maker_.directory(); }
@@ -527,13 +513,11 @@
   TestDirectorySetterUpper dir_maker_;
   std::unique_ptr<TestEntryFactory> entry_factory_;
 
-  scoped_refptr<FakeModelWorker> ui_worker_;
-  scoped_refptr<FakeModelWorker> password_worker_;
+  scoped_refptr<FakeModelWorker> non_blocking_worker_;
   scoped_refptr<FakeModelWorker> passive_worker_;
 
   base::ObserverList<TypeDebugInfoObserver>::Unchecked type_observers_;
   DirectoryTypeDebugInfoEmitter bookmarks_emitter_;
-  DirectoryTypeDebugInfoEmitter passwords_emitter_;
 
   std::map<ModelType, std::unique_ptr<UpdateHandler>> update_handler_map_;
 };
@@ -919,151 +903,4 @@
   }
 }
 
-// Attempt application of password upates where the passphrase is known.
-TEST_F(DirectoryUpdateHandlerApplyUpdateTest, DecryptablePassword) {
-  // Decryptable password updates should be applied.
-  DirectoryCryptographer* cryptographer;
-  {
-    // Storing the cryptographer separately is bad, but for this test we
-    // know it's safe.
-    syncable::ReadTransaction trans(FROM_HERE, directory());
-    cryptographer = GetCryptographer(&trans);
-  }
-
-  KeyParams params = {KeyDerivationParams::CreateForPbkdf2(), "foobar"};
-  cryptographer->AddKey(params);
-
-  sync_pb::EntitySpecifics specifics;
-  sync_pb::PasswordSpecificsData data;
-  data.set_origin("http://example.com");
-
-  cryptographer->Encrypt(data,
-                         specifics.mutable_password()->mutable_encrypted());
-  int64_t handle =
-      entry_factory()->CreateUnappliedNewItem("item", specifics, false);
-
-  StatusController status;
-  ApplyPasswordUpdates(&status);
-
-  const UpdateCounters& counters = GetPasswordsUpdateCounters();
-  EXPECT_EQ(1, counters.num_updates_applied)
-      << "The updates that can be decrypted should be applied";
-
-  {
-    syncable::ReadTransaction trans(FROM_HERE, directory());
-    syncable::Entry e(&trans, syncable::GET_BY_HANDLE, handle);
-    ASSERT_TRUE(e.good());
-    EXPECT_FALSE(e.GetIsUnappliedUpdate());
-    EXPECT_FALSE(e.GetIsUnsynced());
-  }
-}
-
-// Attempt application of encrypted items when the passphrase is not known.
-TEST_F(DirectoryUpdateHandlerApplyUpdateTest, UndecryptableData) {
-  // Undecryptable updates should not be applied.
-  sync_pb::EntitySpecifics encrypted_bookmark;
-  encrypted_bookmark.mutable_encrypted();
-  AddDefaultFieldValue(BOOKMARKS, &encrypted_bookmark);
-  std::string root_server_id = Id::GetRoot().GetServerId();
-  int64_t folder_handle = entry_factory()->CreateUnappliedNewItemWithParent(
-      "folder", encrypted_bookmark, root_server_id);
-  int64_t bookmark_handle = entry_factory()->CreateUnappliedNewItem(
-      "item2", encrypted_bookmark, false);
-  sync_pb::EntitySpecifics encrypted_password;
-  encrypted_password.mutable_password();
-  int64_t password_handle = entry_factory()->CreateUnappliedNewItem(
-      "item3", encrypted_password, false);
-
-  StatusController status;
-  ApplyBookmarkUpdates(&status);
-  ApplyPasswordUpdates(&status);
-
-  const UpdateCounters& bm_counters = GetBookmarksUpdateCounters();
-  EXPECT_EQ(2, bm_counters.num_encryption_conflict_application_failures)
-      << "Updates that can't be decrypted should be in encryption conflict";
-  EXPECT_EQ(0, bm_counters.num_updates_applied)
-      << "No update that can't be decrypted should be applied";
-
-  const UpdateCounters& pw_counters = GetPasswordsUpdateCounters();
-  EXPECT_EQ(1, pw_counters.num_encryption_conflict_application_failures)
-      << "Updates that can't be decrypted should be in encryption conflict";
-  EXPECT_EQ(0, pw_counters.num_updates_applied)
-      << "No update that can't be decrypted should be applied";
-
-  {
-    syncable::ReadTransaction trans(FROM_HERE, directory());
-    syncable::Entry folder(&trans, syncable::GET_BY_HANDLE, folder_handle);
-    syncable::Entry bm(&trans, syncable::GET_BY_HANDLE, bookmark_handle);
-    syncable::Entry pw(&trans, syncable::GET_BY_HANDLE, password_handle);
-    ASSERT_TRUE(folder.good());
-    ASSERT_TRUE(bm.good());
-    ASSERT_TRUE(pw.good());
-    EXPECT_TRUE(folder.GetIsUnappliedUpdate());
-    EXPECT_TRUE(bm.GetIsUnappliedUpdate());
-    EXPECT_TRUE(pw.GetIsUnappliedUpdate());
-  }
-}
-
-// Test a mix of decryptable and undecryptable updates.
-TEST_F(DirectoryUpdateHandlerApplyUpdateTest, SomeUndecryptablePassword) {
-  DirectoryCryptographer* cryptographer;
-
-  int64_t decryptable_handle = -1;
-  int64_t undecryptable_handle = -1;
-
-  // Only decryptable password updates should be applied.
-  {
-    sync_pb::EntitySpecifics specifics;
-    sync_pb::PasswordSpecificsData data;
-    data.set_origin("http://example.com/1");
-    {
-      syncable::ReadTransaction trans(FROM_HERE, directory());
-      cryptographer = GetCryptographer(&trans);
-
-      KeyParams params = {KeyDerivationParams::CreateForPbkdf2(), "foobar"};
-      cryptographer->AddKey(params);
-
-      cryptographer->Encrypt(data,
-                             specifics.mutable_password()->mutable_encrypted());
-    }
-    decryptable_handle =
-        entry_factory()->CreateUnappliedNewItem("item1", specifics, false);
-  }
-  {
-    // Create a new cryptographer, independent of the one in the cycle.
-    DirectoryCryptographer other_cryptographer;
-    KeyParams params = {KeyDerivationParams::CreateForPbkdf2(), "bazqux"};
-    other_cryptographer.AddKey(params);
-
-    sync_pb::EntitySpecifics specifics;
-    sync_pb::PasswordSpecificsData data;
-    data.set_origin("http://example.com/2");
-
-    other_cryptographer.Encrypt(
-        data, specifics.mutable_password()->mutable_encrypted());
-    undecryptable_handle =
-        entry_factory()->CreateUnappliedNewItem("item2", specifics, false);
-  }
-
-  StatusController status;
-  ApplyPasswordUpdates(&status);
-
-  const UpdateCounters& counters = GetPasswordsUpdateCounters();
-  EXPECT_EQ(1, counters.num_encryption_conflict_application_failures)
-      << "The updates that can't be decrypted should be in encryption "
-      << "conflict";
-  EXPECT_EQ(1, counters.num_updates_applied)
-      << "The undecryptable password update shouldn't be applied";
-
-  {
-    syncable::ReadTransaction trans(FROM_HERE, directory());
-    syncable::Entry e1(&trans, syncable::GET_BY_HANDLE, decryptable_handle);
-    syncable::Entry e2(&trans, syncable::GET_BY_HANDLE, undecryptable_handle);
-    ASSERT_TRUE(e1.good());
-    ASSERT_TRUE(e2.good());
-    EXPECT_FALSE(e1.GetIsUnappliedUpdate());
-    EXPECT_TRUE(e2.GetIsUnappliedUpdate());
-  }
-}
-
 }  // namespace syncer
diff --git a/components/sync/engine_impl/model_type_registry_unittest.cc b/components/sync/engine_impl/model_type_registry_unittest.cc
index 5a60676..317823da 100644
--- a/components/sync/engine_impl/model_type_registry_unittest.cc
+++ b/components/sync/engine_impl/model_type_registry_unittest.cc
@@ -30,7 +30,8 @@
     test_user_share_.SetUp();
     scoped_refptr<ModelSafeWorker> passive_worker(
         new FakeModelWorker(GROUP_PASSIVE));
-    scoped_refptr<ModelSafeWorker> ui_worker(new FakeModelWorker(GROUP_UI));
+    scoped_refptr<ModelSafeWorker> ui_worker(
+        new FakeModelWorker(GROUP_NON_BLOCKING));
     workers_.push_back(passive_worker);
     workers_.push_back(ui_worker);
 
@@ -111,39 +112,6 @@
   bool migration_attempted_ = false;
 };
 
-// Tests operations with directory types.
-// Registering/unregistering type should affect enabled types and handlers map.
-// Registering/unregistering type twice should trigger DCHECK.
-// Registering type with unknown ModelSafeGroup should trigger DCHECK.
-TEST_F(ModelTypeRegistryTest, DirectoryTypes) {
-  UpdateHandlerMap* update_handler_map = registry()->update_handler_map();
-  EXPECT_TRUE(registry()->GetEnabledTypes().Empty());
-
-  registry()->RegisterDirectoryType(AUTOFILL, GROUP_UI);
-  EXPECT_EQ(ModelTypeSet(AUTOFILL), registry()->GetEnabledTypes());
-
-  registry()->RegisterDirectoryType(BOOKMARKS, GROUP_UI);
-  EXPECT_EQ(ModelTypeSet(AUTOFILL, BOOKMARKS), registry()->GetEnabledTypes());
-
-  // Try registering already registered type.
-  EXPECT_DCHECK_DEATH(registry()->RegisterDirectoryType(BOOKMARKS, GROUP_UI));
-
-  EXPECT_TRUE(update_handler_map->find(AUTOFILL) != update_handler_map->end());
-  EXPECT_TRUE(update_handler_map->find(BOOKMARKS) != update_handler_map->end());
-
-  registry()->UnregisterDirectoryType(AUTOFILL);
-  EXPECT_EQ(ModelTypeSet(BOOKMARKS), registry()->GetEnabledTypes());
-  EXPECT_TRUE(update_handler_map->find(AUTOFILL) == update_handler_map->end());
-  EXPECT_TRUE(update_handler_map->find(BOOKMARKS) != update_handler_map->end());
-
-  // Try unregistering already unregistered type.
-  EXPECT_DCHECK_DEATH(registry()->UnregisterDirectoryType(AUTOFILL));
-
-  // Try registering type with unknown worker.
-  EXPECT_DCHECK_DEATH(
-      registry()->RegisterDirectoryType(SESSIONS, GROUP_PASSWORD));
-}
-
 TEST_F(ModelTypeRegistryTest, NonBlockingTypes) {
   EXPECT_TRUE(registry()->GetEnabledTypes().Empty());
 
diff --git a/components/sync/engine_impl/sync_scheduler_impl_unittest.cc b/components/sync/engine_impl/sync_scheduler_impl_unittest.cc
index 353b090..bd0750b 100644
--- a/components/sync/engine_impl/sync_scheduler_impl_unittest.cc
+++ b/components/sync/engine_impl/sync_scheduler_impl_unittest.cc
@@ -21,6 +21,8 @@
 #include "components/sync/base/cancelation_signal.h"
 #include "components/sync/base/extensions_activity.h"
 #include "components/sync/base/model_type_test_util.h"
+#include "components/sync/engine/data_type_activation_response.h"
+#include "components/sync/engine/fake_model_type_processor.h"
 #include "components/sync/engine/sync_engine_switches.h"
 #include "components/sync/engine_impl/backoff_delay_provider.h"
 #include "components/sync/engine_impl/cycle/test_util.h"
@@ -64,6 +66,12 @@
   MOCK_METHOD2(PollSyncShare, bool(ModelTypeSet, SyncCycle*));
 };
 
+std::unique_ptr<DataTypeActivationResponse> MakeFakeActivationResponse() {
+  auto response = std::make_unique<DataTypeActivationResponse>();
+  response->type_processor = std::make_unique<FakeModelTypeProcessor>();
+  return response;
+}
+
 MockSyncer::MockSyncer() : Syncer(nullptr) {}
 
 using SyncShareTimes = std::vector<TimeTicks>;
@@ -119,7 +127,8 @@
     extensions_activity_ = new ExtensionsActivity();
 
     workers_.clear();
-    workers_.push_back(base::MakeRefCounted<FakeModelWorker>(GROUP_UI));
+    workers_.push_back(
+        base::MakeRefCounted<FakeModelWorker>(GROUP_NON_BLOCKING));
     workers_.push_back(base::MakeRefCounted<FakeModelWorker>(GROUP_PASSIVE));
 
     connection_ = std::make_unique<MockConnectionManager>(directory());
@@ -129,11 +138,13 @@
         workers_, test_user_share_.user_share(), &mock_nudge_handler_,
         UssMigrator(), &cancelation_signal_,
         test_user_share_.keystore_keys_handler());
-    model_type_registry_->RegisterDirectoryType(HISTORY_DELETE_DIRECTIVES,
-                                                GROUP_UI);
+    model_type_registry_->ConnectNonBlockingType(HISTORY_DELETE_DIRECTIVES,
+                                                 MakeFakeActivationResponse());
     model_type_registry_->RegisterDirectoryType(NIGORI, GROUP_PASSIVE);
-    model_type_registry_->RegisterDirectoryType(THEMES, GROUP_UI);
-    model_type_registry_->RegisterDirectoryType(TYPED_URLS, GROUP_UI);
+    model_type_registry_->ConnectNonBlockingType(THEMES,
+                                                 MakeFakeActivationResponse());
+    model_type_registry_->ConnectNonBlockingType(TYPED_URLS,
+                                                 MakeFakeActivationResponse());
 
     context_ = std::make_unique<SyncCycleContext>(
         connection_.get(), directory(), extensions_activity_.get(),
@@ -146,8 +157,8 @@
     RebuildScheduler();
   }
 
-  void UnregisterDataType(ModelType type) {
-    model_type_registry_->UnregisterDirectoryType(type);
+  void DisconnectDataType(ModelType type) {
+    model_type_registry_->DisconnectNonBlockingType(type);
   }
 
   void RebuildScheduler() {
@@ -405,7 +416,7 @@
 
   // The user enables a custom passphrase at this point, so
   // HISTORY_DELETE_DIRECTIVES gets disabled.
-  UnregisterDataType(HISTORY_DELETE_DIRECTIVES);
+  DisconnectDataType(HISTORY_DELETE_DIRECTIVES);
   ASSERT_FALSE(context()->GetEnabledTypes().Has(HISTORY_DELETE_DIRECTIVES));
 
   // The resulting sync cycle should ask only for the remaining types.
diff --git a/components/sync/model/fake_syncable_service.cc b/components/sync/model/fake_syncable_service.cc
index 3d9440a..0532b8f4 100644
--- a/components/sync/model/fake_syncable_service.cc
+++ b/components/sync/model/fake_syncable_service.cc
@@ -56,10 +56,6 @@
   sync_processor_.reset();
 }
 
-SyncDataList FakeSyncableService::GetAllSyncData(ModelType type) const {
-  return SyncDataList();
-}
-
 SyncError FakeSyncableService::ProcessSyncChanges(
     const base::Location& from_here,
     const SyncChangeList& change_list) {
diff --git a/components/sync/model/fake_syncable_service.h b/components/sync/model/fake_syncable_service.h
index 3f2657d..35ff2e9 100644
--- a/components/sync/model/fake_syncable_service.h
+++ b/components/sync/model/fake_syncable_service.h
@@ -36,7 +36,6 @@
       std::unique_ptr<SyncChangeProcessor> sync_processor,
       std::unique_ptr<SyncErrorFactory> sync_error_factory) override;
   void StopSyncing(ModelType type) override;
-  SyncDataList GetAllSyncData(ModelType type) const override;
   SyncError ProcessSyncChanges(const base::Location& from_here,
                                const SyncChangeList& change_list) override;
 
diff --git a/components/sync/model/sync_change_processor.h b/components/sync/model/sync_change_processor.h
index 9d9c1e7..bcb49f71 100644
--- a/components/sync/model/sync_change_processor.h
+++ b/components/sync/model/sync_change_processor.h
@@ -58,8 +58,8 @@
                                           const std::string& context);
 
   // Adds an observer of local sync changes. This observer is notified when
-  // local sync changes are applied by GenericChangeProcessor. observer is
-  // not owned by the SyncChangeProcessor.
+  // local sync changes are applied. |observer| is not owned by the
+  // SyncChangeProcessor.
   virtual void AddLocalChangeObserver(LocalChangeObserver* observer);
   virtual void RemoveLocalChangeObserver(LocalChangeObserver* observer);
 };
diff --git a/components/sync/model/syncable_service.h b/components/sync/model/syncable_service.h
index 7314e4d..69186ebb 100644
--- a/components/sync/model/syncable_service.h
+++ b/components/sync/model/syncable_service.h
@@ -74,10 +74,6 @@
   virtual SyncError ProcessSyncChanges(const base::Location& from_here,
                                        const SyncChangeList& change_list) = 0;
 
-  // TODO(crbug.com/870624): We don't seem to use this function anywhere, so
-  // we should simply remove it and simplify all implementations.
-  virtual SyncDataList GetAllSyncData(ModelType type) const = 0;
-
  private:
   DISALLOW_COPY_AND_ASSIGN(SyncableService);
 };
diff --git a/components/sync/model_impl/syncable_service_based_bridge.cc b/components/sync/model_impl/syncable_service_based_bridge.cc
index 5f6e5903..3abdbf4 100644
--- a/components/sync/model_impl/syncable_service_based_bridge.cc
+++ b/components/sync/model_impl/syncable_service_based_bridge.cc
@@ -228,7 +228,7 @@
                                   ContextRefreshStatus refresh_status,
                                   const std::string& context) override {
     // This function is not supported and not exercised by anyone, since
-    // the USS flow doesn't use SharedChangeProcessor.
+    // the USS flow doesn't use it.
     // TODO(crbug.com/870624): Remove this function altogether when the
     // directory codebase is removed.
     NOTREACHED();
diff --git a/components/sync_preferences/pref_model_associator.cc b/components/sync_preferences/pref_model_associator.cc
index 3e5d781c..330dec7 100644
--- a/components/sync_preferences/pref_model_associator.cc
+++ b/components/sync_preferences/pref_model_associator.cc
@@ -214,8 +214,8 @@
       // We're not syncing this preference locally, ignore the sync data.
       // TODO(zea): Eventually we want to be able to have the syncable service
       // reconstruct all sync data for its datatype (therefore having
-      // GetAllSyncData be a complete representation). We should store this
-      // data somewhere, even if we don't use it.
+      // GetAllSyncDataForTesting be a complete representation). We should store
+      // this data somewhere, even if we don't use it.
       continue;
     }
 
@@ -362,7 +362,7 @@
 // with user controlled data. We do not track any information for preferences
 // not registered locally as syncable and do not inform the syncer of
 // non-user controlled preferences.
-syncer::SyncDataList PrefModelAssociator::GetAllSyncData(
+syncer::SyncDataList PrefModelAssociator::GetAllSyncDataForTesting(
     syncer::ModelType type) const {
   DCHECK_EQ(type_, type);
   syncer::SyncDataList current_data;
diff --git a/components/sync_preferences/pref_model_associator.h b/components/sync_preferences/pref_model_associator.h
index 886cd62..5afc574 100644
--- a/components/sync_preferences/pref_model_associator.h
+++ b/components/sync_preferences/pref_model_associator.h
@@ -68,11 +68,11 @@
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
-  // Note for GetAllSyncData: This will build a model of all preferences
-  // registered as syncable with user controlled data. We do not track any
-  // information for preferences not registered locally as syncable and do not
-  // inform the syncer of non-user controlled preferences.
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  // Note for GetAllSyncDataForTesting: This will build a model of all
+  // preferences registered as syncable with user controlled data. We do not
+  // track any information for preferences not registered locally as syncable
+  // and do not inform the syncer of non-user controlled preferences.
+  syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
 
   // Register a preference with the specified name for syncing. We do not care
   // about the type at registration time, but when changes arrive from the
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc
index fdbd53e..43a6ec5 100644
--- a/components/sync_preferences/pref_service_syncable_unittest.cc
+++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -406,7 +406,8 @@
         kDefaultCharsetPrefName, kDefaultCharsetValue,
         user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
 
-    pref_sync_service_ = prefs_.GetSyncableService(syncer::PREFERENCES);
+    pref_sync_service_ = static_cast<PrefModelAssociator*>(
+        prefs_.GetSyncableService(syncer::PREFERENCES));
     ASSERT_THAT(pref_sync_service_, NotNull());
   }
 
@@ -474,7 +475,7 @@
   scoped_refptr<TestingPrefStore> user_prefs_;
   TestPrefModelAssociatorClient client_;
   PrefServiceSyncable prefs_;
-  syncer::SyncableService* pref_sync_service_;
+  PrefModelAssociator* pref_sync_service_;
   int next_pref_remote_sync_node_id_;
 };
 
@@ -649,7 +650,7 @@
       1, pref_name, base::Value("remote_value2"), SyncChange::ACTION_UPDATE));
   pref_sync_service_->ProcessSyncChanges(FROM_HERE, remote_changes);
   // The pref isn't synced.
-  EXPECT_THAT(pref_sync_service_->GetAllSyncData(syncer::PREFERENCES),
+  EXPECT_THAT(pref_sync_service_->GetAllSyncDataForTesting(syncer::PREFERENCES),
               IsEmpty());
   EXPECT_THAT(GetPreferenceValue(pref_name).GetString(), Eq("default_value"));
 }
diff --git a/components/sync_sessions/favicon_cache.cc b/components/sync_sessions/favicon_cache.cc
index ddf22c8..ccc09ed 100644
--- a/components/sync_sessions/favicon_cache.cc
+++ b/components/sync_sessions/favicon_cache.cc
@@ -321,8 +321,8 @@
   page_task_map_.clear();
 }
 
-syncer::SyncDataList FaviconCache::GetAllSyncData(syncer::ModelType type)
-    const {
+syncer::SyncDataList FaviconCache::GetAllSyncDataForTesting(
+    syncer::ModelType type) const {
   syncer::SyncDataList data_list;
   for (auto iter = synced_favicons_.begin(); iter != synced_favicons_.end();
        ++iter) {
diff --git a/components/sync_sessions/favicon_cache.h b/components/sync_sessions/favicon_cache.h
index efee2f7..47fff98 100644
--- a/components/sync_sessions/favicon_cache.h
+++ b/components/sync_sessions/favicon_cache.h
@@ -75,7 +75,7 @@
       std::unique_ptr<syncer::SyncChangeProcessor> sync_processor,
       std::unique_ptr<syncer::SyncErrorFactory> error_handler) override;
   void StopSyncing(syncer::ModelType type) override;
-  syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const override;
+  syncer::SyncDataList GetAllSyncDataForTesting(syncer::ModelType type) const;
   syncer::SyncError ProcessSyncChanges(
       const base::Location& from_here,
       const syncer::SyncChangeList& change_list) override;
diff --git a/components/sync_sessions/favicon_cache_unittest.cc b/components/sync_sessions/favicon_cache_unittest.cc
index 54245cc0..d0e89b1 100644
--- a/components/sync_sessions/favicon_cache_unittest.cc
+++ b/components/sync_sessions/favicon_cache_unittest.cc
@@ -373,9 +373,9 @@
 testing::AssertionResult SyncFaviconCacheTest::VerifyLocalCustomIcons(
     const std::vector<TestFaviconData>& expected_custom_icons) {
   syncer::SyncDataList image_data_list =
-      cache()->GetAllSyncData(syncer::FAVICON_IMAGES);
+      cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES);
   syncer::SyncDataList tracking_data_list =
-      cache()->GetAllSyncData(syncer::FAVICON_TRACKING);
+      cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING);
   if (expected_custom_icons.size() > image_data_list.size() ||
       expected_custom_icons.size() > tracking_data_list.size())
     return testing::AssertionFailure() << "Number of icons doesn't match.";
@@ -579,7 +579,8 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
 
-  EXPECT_EQ(0U, cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size());
+  EXPECT_EQ(0U,
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size());
   EXPECT_EQ(0U, processor()->GetAndResetChangeList().size());
   EXPECT_EQ(0, merge_result.num_items_added());
   EXPECT_EQ(0, merge_result.num_items_modified());
@@ -593,7 +594,8 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
 
-  EXPECT_EQ(0U, cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size());
+  EXPECT_EQ(0U,
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size());
   EXPECT_EQ(0U, processor()->GetAndResetChangeList().size());
   EXPECT_EQ(0, merge_result.num_items_added());
   EXPECT_EQ(0, merge_result.num_items_modified());
@@ -621,7 +623,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize),
-            cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size());
   syncer::SyncChangeList change_list = processor()->GetAndResetChangeList();
   EXPECT_TRUE(VerifyChanges(syncer::FAVICON_IMAGES,
                             expected_change_types,
@@ -639,7 +641,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize),
-            cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size());
   change_list = processor()->GetAndResetChangeList();
   EXPECT_TRUE(VerifyChanges(syncer::FAVICON_TRACKING,
                             expected_change_types,
@@ -676,7 +678,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize),
-            cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size());
   EXPECT_EQ(0U, processor()->GetAndResetChangeList().size());
   EXPECT_EQ(kFaviconBatchSize, merge_result.num_items_added());
   EXPECT_EQ(0, merge_result.num_items_modified());
@@ -690,7 +692,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize),
-            cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size());
   EXPECT_EQ(0U, processor()->GetAndResetChangeList().size());
   EXPECT_EQ(0, merge_result.num_items_added());
   EXPECT_EQ(kFaviconBatchSize, merge_result.num_items_modified());
@@ -745,7 +747,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize),
-            cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size());
   syncer::SyncChangeList changes = processor()->GetAndResetChangeList();
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize)/2, changes.size());
   EXPECT_EQ(0, merge_result.num_items_added());
@@ -760,7 +762,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize),
-            cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size());
   EXPECT_EQ(0U, processor()->GetAndResetChangeList().size());
   EXPECT_EQ(0, merge_result.num_items_added());
   EXPECT_EQ(kFaviconBatchSize, merge_result.num_items_modified());
@@ -820,7 +822,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize),
-            cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size());
   EXPECT_EQ(0U, processor()->GetAndResetChangeList().size());
   EXPECT_EQ(0, merge_result.num_items_added());
   EXPECT_EQ(kFaviconBatchSize, merge_result.num_items_modified());
@@ -834,7 +836,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize),
-            cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size());
   syncer::SyncChangeList changes = processor()->GetAndResetChangeList();
   EXPECT_EQ(static_cast<size_t>(kFaviconBatchSize)/2, changes.size());
   EXPECT_EQ(0, merge_result.num_items_added());
@@ -1128,7 +1130,7 @@
   EXPECT_EQ(static_cast<size_t>(kMaxSyncFavicons)*2,
             GetFaviconCount());  // Still have tracking.
   EXPECT_EQ(static_cast<size_t>(kMaxSyncFavicons),
-            cache()->GetAllSyncData(syncer::FAVICON_IMAGES).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_IMAGES).size());
   EXPECT_EQ(0U, processor()->GetAndResetChangeList().size());
   EXPECT_EQ(kMaxSyncFavicons, merge_result.num_items_added());
   EXPECT_EQ(0, merge_result.num_items_modified());
@@ -1143,7 +1145,7 @@
                                         CreateAndPassProcessor(),
                                         CreateAndPassSyncErrorFactory());
   EXPECT_EQ(static_cast<size_t>(kMaxSyncFavicons),
-            cache()->GetAllSyncData(syncer::FAVICON_TRACKING).size());
+            cache()->GetAllSyncDataForTesting(syncer::FAVICON_TRACKING).size());
   EXPECT_EQ(0U, processor()->GetAndResetChangeList().size());
   EXPECT_EQ(0, merge_result.num_items_added());
   EXPECT_EQ(kMaxSyncFavicons, merge_result.num_items_modified());
diff --git a/components/sync_sessions/local_session_event_handler_impl.cc b/components/sync_sessions/local_session_event_handler_impl.cc
index 6951bea2..96423492 100644
--- a/components/sync_sessions/local_session_event_handler_impl.cc
+++ b/components/sync_sessions/local_session_event_handler_impl.cc
@@ -414,14 +414,20 @@
   }
 
   if (is_supervised) {
-    const std::vector<std::unique_ptr<const SerializedNavigationEntry>>&
-        blocked_navigations = *tab_delegate.GetBlockedNavigations();
-    for (size_t i = 0; i < blocked_navigations.size(); ++i) {
-      sync_pb::TabNavigation* navigation = specifics.add_navigation();
-      SessionNavigationToSyncData(*blocked_navigations[i]).Swap(navigation);
-      navigation->set_blocked_state(
-          sync_pb::TabNavigation_BlockedState_STATE_BLOCKED);
-      // TODO(bauerb): Add categories
+    const std::vector<std::unique_ptr<const SerializedNavigationEntry>>*
+        blocked_navigations = tab_delegate.GetBlockedNavigations();
+    // TODO(crbug.com/1061427): If the profile is supervised,
+    // |blocked_navigations| should always be non-null. Investigate why some
+    // users run into null pointers here and ultimately replace the condition
+    // below with a DCHECK. This is a workaround to avoid reported crashes.
+    if (blocked_navigations) {
+      for (const auto& blocked_navigation : *blocked_navigations) {
+        sync_pb::TabNavigation* navigation = specifics.add_navigation();
+        *navigation = SessionNavigationToSyncData(*blocked_navigation);
+        navigation->set_blocked_state(
+            sync_pb::TabNavigation_BlockedState_STATE_BLOCKED);
+        // TODO(bauerb): Add categories
+      }
     }
   }
 
diff --git a/components/test/data/payments/csp_test_iframe.html b/components/test/data/payments/csp_test_iframe.html
new file mode 100644
index 0000000..9f66669e1
--- /dev/null
+++ b/components/test/data/payments/csp_test_iframe.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta
+      http-equiv="Content-Security-Policy"
+      content="default-src 'none'; script-src 'unsafe-eval' 'unsafe-inline'; img-src 'self' https://kylepay.com:*"
+    >
+    <script>
+    async function checkCanMakePayment() {
+      const methodData = [{
+        supportedMethods: "https://kylepay.com/webpay",
+      }];
+      let details = {
+        total: {
+          label: "Total",
+          amount: {
+            currency: "USD",
+            value: "1.00",
+          },
+        },
+      };
+      const request = new PaymentRequest(methodData, details);
+      const result = await request.canMakePayment();
+      document.querySelector("#output").innerText = "canMakePayment: " + result;
+      return result;
+    }
+
+    </script>
+  </head>
+  <body>
+    <p>This page is a regression test for <a href="https://crbug.com/1055360">
+      crbug/1055360</a>.</p>
+    <div id="output"></div>
+  </body>
+</html>
diff --git a/components/test/data/payments/csp_test_main.html b/components/test/data/payments/csp_test_main.html
new file mode 100644
index 0000000..53c8d37
--- /dev/null
+++ b/components/test/data/payments/csp_test_main.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta
+      http-equiv="Content-Security-Policy"
+      content="default-src 'none'; script-src 'unsafe-eval'; frame-src https://other.example:*"
+    >
+  </head>
+  <body>
+    <p>This page is a regression test for <a href="https://crbug.com/1055360">
+      crbug/1055360</a>.</p>
+    <ul>
+      <li>Setup:</li>
+        <ul>
+          <li>This top-level document has a CSP policy that sets img-src to
+            'self'</li>
+          <li>The cross-origin iframe creates a payment request that triggers
+            JIT
+            crawling of the payment method manifest hosted at kylepay.com.
+          </li>
+        </ul>
+      <li>Test: if Chrome handles CSP policy correctly, request.canMakePayment()
+        should return true as the payment method manifest crawl is successful.
+      </li>
+    </ul>
+    <iframe id="test" allow="payment">
+    </iframe>
+  </body>
+</html>
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 20a1370..9505df09 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1536,6 +1536,8 @@
     "renderer_host/overscroll_controller_delegate.h",
     "renderer_host/p2p/socket_dispatcher_host.cc",
     "renderer_host/p2p/socket_dispatcher_host.h",
+    "renderer_host/page_lifecycle_state_manager.cc",
+    "renderer_host/page_lifecycle_state_manager.h",
     "renderer_host/render_frame_metadata_provider_impl.cc",
     "renderer_host/render_frame_metadata_provider_impl.h",
     "renderer_host/render_message_filter.cc",
diff --git a/content/browser/accessibility/accessibility_mode_browsertest.cc b/content/browser/accessibility/accessibility_mode_browsertest.cc
index d588d80..71c4587a 100644
--- a/content/browser/accessibility/accessibility_mode_browsertest.cc
+++ b/content/browser/accessibility/accessibility_mode_browsertest.cc
@@ -189,4 +189,24 @@
   EXPECT_EQ(original_id, textbox2->GetId());
 }
 
+IN_PROC_BROWSER_TEST_F(AccessibilityModeTest,
+                       ReEnablingAccessibilityDoesNotTimeout) {
+  EXPECT_TRUE(NavigateToURL(shell(), GURL(kMinimalPageDataURL)));
+  ASSERT_TRUE(web_contents()->GetAccessibilityMode().is_mode_off());
+
+  AccessibilityNotificationWaiter waiter(shell()->web_contents());
+  web_contents()->AddAccessibilityMode(ui::kAXModeWebContentsOnly);
+  EXPECT_TRUE(web_contents()->GetAccessibilityMode() ==
+              ui::kAXModeWebContentsOnly);
+  waiter.WaitForNotification();
+  EXPECT_EQ(nullptr, GetManager());
+
+  AccessibilityNotificationWaiter waiter2(shell()->web_contents());
+  web_contents()->SetAccessibilityMode(ui::AXMode());
+  web_contents()->AddAccessibilityMode(ui::kAXModeComplete);
+  EXPECT_TRUE(web_contents()->GetAccessibilityMode() == ui::kAXModeComplete);
+  waiter2.WaitForNotification();
+  EXPECT_NE(nullptr, GetManager());
+}
+
 }  // namespace content
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 8ca9377a..3c285c7 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -15,7 +15,6 @@
 #include "base/strings/string_util.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
 #include "content/browser/accessibility/browser_accessibility_state_impl.h"
-#include "content/common/accessibility_messages.h"
 #include "content/public/common/content_client.h"
 #include "third_party/blink/public/strings/grit/blink_strings.h"
 #include "ui/accessibility/ax_enums.mojom.h"
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc
index f4728f3..6961805 100644
--- a/content/browser/accessibility/browser_accessibility_android.cc
+++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -12,7 +12,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
-#include "content/common/accessibility_messages.h"
 #include "content/public/common/content_client.h"
 #include "third_party/blink/public/strings/grit/blink_strings.h"
 #include "third_party/skia/include/core/SkColor.h"
diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc
index a2324ad..aa5d005 100644
--- a/content/browser/accessibility/browser_accessibility_com_win.cc
+++ b/content/browser/accessibility/browser_accessibility_com_win.cc
@@ -19,7 +19,6 @@
 #include "content/browser/accessibility/browser_accessibility_manager_win.h"
 #include "content/browser/accessibility/browser_accessibility_state_impl.h"
 #include "content/browser/accessibility/browser_accessibility_win.h"
-#include "content/common/accessibility_messages.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/common/content_client.h"
 #include "ui/accessibility/ax_mode.h"
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index 6267ba5..fd6d640 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -17,7 +17,7 @@
 #include "base/no_destructor.h"
 #include "build/build_config.h"
 #include "content/browser/accessibility/browser_accessibility.h"
-#include "content/common/accessibility_messages.h"
+#include "content/common/render_accessibility.mojom.h"
 #include "content/public/common/use_zoom_for_dsf_policy.h"
 #include "ui/accessibility/ax_language_detection.h"
 #include "ui/accessibility/ax_node_position.h"
@@ -502,23 +502,23 @@
 void BrowserAccessibilityManager::FinalizeAccessibilityEvents() {}
 
 void BrowserAccessibilityManager::OnLocationChanges(
-    const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) {
-  for (size_t i = 0; i < params.size(); ++i) {
-    BrowserAccessibility* obj = GetFromID(params[i].id);
+    const std::vector<mojom::LocationChangesPtr>& changes) {
+  for (auto& change : changes) {
+    BrowserAccessibility* obj = GetFromID(change->id);
     if (!obj)
       continue;
     ui::AXNode* node = obj->node();
-    node->SetLocation(params[i].new_location.offset_container_id,
-                      params[i].new_location.bounds,
-                      params[i].new_location.transform.get());
+    node->SetLocation(change->new_location.offset_container_id,
+                      change->new_location.bounds,
+                      change->new_location.transform.get());
   }
-  SendLocationChangeEvents(params);
+  SendLocationChangeEvents(changes);
 }
 
 void BrowserAccessibilityManager::SendLocationChangeEvents(
-    const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) {
-  for (size_t i = 0; i < params.size(); ++i) {
-    BrowserAccessibility* obj = GetFromID(params[i].id);
+    const std::vector<mojom::LocationChangesPtr>& changes) {
+  for (auto& change : changes) {
+    BrowserAccessibility* obj = GetFromID(change->id);
     if (obj)
       obj->OnLocationChanged();
   }
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h
index 63135b2..8defcf4 100644
--- a/content/browser/accessibility/browser_accessibility_manager.h
+++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -21,6 +21,7 @@
 #include "content/browser/accessibility/accessibility_buildflags.h"
 #include "content/browser/accessibility/browser_accessibility_position.h"
 #include "content/common/content_export.h"
+#include "content/common/render_accessibility.mojom-forward.h"
 #include "content/public/browser/ax_event_notification_details.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "third_party/blink/public/web/web_ax_enums.h"
@@ -38,8 +39,6 @@
 #include "ui/accessibility/platform/ax_platform_node.h"
 #include "ui/gfx/native_widget_types.h"
 
-struct AccessibilityHostMsg_LocationChangeParams;
-
 namespace content {
 class BrowserAccessibility;
 class BrowserAccessibilityDelegate;
@@ -291,8 +290,7 @@
 
   // Called when the renderer process updates the location of accessibility
   // objects. Calls SendLocationChangeEvents(), which can be overridden.
-  void OnLocationChanges(
-      const std::vector<AccessibilityHostMsg_LocationChangeParams>& params);
+  void OnLocationChanges(const std::vector<mojom::LocationChangesPtr>& changes);
 
   // Called when a new find in page result is received. We hold on to this
   // information and don't activate it until the user requests it.
@@ -473,7 +471,7 @@
   // their location has changed. This is called by OnLocationChanges
   // after it's updated the internal data structure.
   virtual void SendLocationChangeEvents(
-      const std::vector<AccessibilityHostMsg_LocationChangeParams>& params);
+      const std::vector<mojom::LocationChangesPtr>& changes);
 
   // Given the data from an atomic update, collect the nodes that need updating
   // assuming that this platform is one where plain text node content is
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc
index e7dce55..facd309 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -7,7 +7,7 @@
 #include "base/i18n/char_iterator.h"
 #include "content/browser/accessibility/browser_accessibility_android.h"
 #include "content/browser/accessibility/web_contents_accessibility_android.h"
-#include "content/common/accessibility_messages.h"
+#include "content/common/render_accessibility.mojom.h"
 #include "content/public/common/use_zoom_for_dsf_policy.h"
 #include "ui/accessibility/ax_role_properties.h"
 
@@ -258,19 +258,19 @@
 }
 
 void BrowserAccessibilityManagerAndroid::SendLocationChangeEvents(
-    const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) {
+    const std::vector<mojom::LocationChangesPtr>& changes) {
   // Android is not very efficient at handling notifications, and location
   // changes in particular are frequent and not time-critical. If a lot of
   // nodes changed location, just send a single notification after a short
   // delay (to batch them), rather than lots of individual notifications.
-  if (params.size() > 3) {
+  if (changes.size() > 3) {
     auto* wcax = GetWebContentsAXFromRootManager();
     if (!wcax)
       return;
     wcax->SendDelayedWindowContentChangedEvent();
     return;
   }
-  BrowserAccessibilityManager::SendLocationChangeEvents(params);
+  BrowserAccessibilityManager::SendLocationChangeEvents(changes);
 }
 
 bool BrowserAccessibilityManagerAndroid::NextAtGranularity(
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h
index d1cde018..9e458b8 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.h
+++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "content/browser/accessibility/browser_accessibility_manager.h"
+#include "content/common/render_accessibility.mojom-forward.h"
 
 namespace ui {
 class MotionEventAndroid;
@@ -75,8 +76,7 @@
   // BrowserAccessibilityManager overrides.
   BrowserAccessibility* GetFocus() const override;
   void SendLocationChangeEvents(
-      const std::vector<AccessibilityHostMsg_LocationChangeParams>& params)
-      override;
+      const std::vector<mojom::LocationChangesPtr>& changes) override;
   void FireFocusEvent(BrowserAccessibility* node) override;
   void FireBlinkEvent(ax::mojom::Event event_type,
                       BrowserAccessibility* node) override;
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
index 206c1970..eddb1c8 100644
--- a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "content/browser/accessibility/browser_accessibility_auralinux.h"
-#include "content/common/accessibility_messages.h"
 #include "ui/accessibility/platform/ax_platform_node_auralinux.h"
 
 namespace content {
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm
index 292d3ed8..2b87af26 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -15,7 +15,6 @@
 #include "base/time/time.h"
 #import "content/browser/accessibility/browser_accessibility_cocoa.h"
 #import "content/browser/accessibility/browser_accessibility_mac.h"
-#include "content/common/accessibility_messages.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
index d7ebc88..a817eb7 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -17,7 +17,6 @@
 #include "content/browser/accessibility/browser_accessibility_state_impl.h"
 #include "content/browser/accessibility/browser_accessibility_win.h"
 #include "content/browser/renderer_host/legacy_render_widget_host_win.h"
-#include "content/common/accessibility_messages.h"
 #include "content/public/common/content_switches.h"
 #include "ui/accessibility/accessibility_switches.h"
 #include "ui/accessibility/ax_role_properties.h"
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc
index 7aaa472..25459cb0 100644
--- a/content/browser/accessibility/browser_accessibility_win_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -21,7 +21,7 @@
 #include "content/browser/accessibility/browser_accessibility_state_impl.h"
 #include "content/browser/accessibility/test_browser_accessibility_delegate.h"
 #include "content/browser/renderer_host/legacy_render_widget_host_win.h"
-#include "content/common/accessibility_messages.h"
+#include "content/common/ax_content_node_data.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/accessibility/accessibility_switches.h"
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc
index 6f66019..e05367b8 100644
--- a/content/browser/devtools/protocol/browser_handler.cc
+++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -304,7 +304,7 @@
 }
 
 Response BrowserHandler::SetPermission(
-    const std::string& origin,
+    Maybe<std::string> origin,
     std::unique_ptr<protocol::Browser::PermissionDescriptor> permission,
     const protocol::Browser::PermissionSetting& setting,
     Maybe<std::string> browser_context_id) {
@@ -327,11 +327,14 @@
 
   PermissionControllerImpl* permission_controller =
       PermissionControllerImpl::FromBrowserContext(browser_context);
-  url::Origin overridden_origin = url::Origin::Create(GURL(origin));
-  if (overridden_origin.opaque())
-    return Response::InvalidParams(
-        "Permission can't be granted to opaque origins.");
 
+  base::Optional<url::Origin> overridden_origin;
+  if (origin.isJust()) {
+    overridden_origin = url::Origin::Create(GURL(origin.fromJust()));
+    if (overridden_origin->opaque())
+      return Response::InvalidParams(
+          "Permission can't be granted to opaque origins.");
+  }
   PermissionControllerImpl::OverrideStatus status =
       permission_controller->SetOverrideForDevTools(overridden_origin, type,
                                                     permission_status);
@@ -345,7 +348,7 @@
 }
 
 Response BrowserHandler::GrantPermissions(
-    const std::string& origin,
+    Maybe<std::string> origin,
     std::unique_ptr<protocol::Array<protocol::Browser::PermissionType>>
         permissions,
     Maybe<std::string> browser_context_id) {
@@ -366,14 +369,17 @@
 
   PermissionControllerImpl* permission_controller =
       PermissionControllerImpl::FromBrowserContext(browser_context);
-  url::Origin overridden_origin = url::Origin::Create(GURL(origin));
-  if (overridden_origin.opaque())
-    return Response::InvalidParams(
-        "Permission can't be granted to opaque origins.");
-
+  base::Optional<url::Origin> overridden_origin;
+  if (origin.isJust()) {
+    overridden_origin = url::Origin::Create(GURL(origin.fromJust()));
+    if (overridden_origin->opaque())
+      return Response::InvalidParams(
+          "Permission can't be granted to opaque origins.");
+  }
   PermissionControllerImpl::OverrideStatus status =
       permission_controller->GrantOverridesForDevTools(overridden_origin,
                                                        internal_permissions);
+
   if (status != PermissionControllerImpl::OverrideStatus::kOverrideSet) {
     return Response::InvalidParams(
         "Permissions can't be granted in current context.");
diff --git a/content/browser/devtools/protocol/browser_handler.h b/content/browser/devtools/protocol/browser_handler.h
index 9b4d310..e1625ec 100644
--- a/content/browser/devtools/protocol/browser_handler.h
+++ b/content/browser/devtools/protocol/browser_handler.h
@@ -50,13 +50,13 @@
       std::unique_ptr<protocol::Array<std::string>>* arguments) override;
 
   Response SetPermission(
-      const std::string& origin,
+      Maybe<std::string> origin,
       std::unique_ptr<protocol::Browser::PermissionDescriptor> permission,
       const protocol::Browser::PermissionSetting& setting,
       Maybe<std::string> browser_context_id) override;
 
   Response GrantPermissions(
-      const std::string& origin,
+      Maybe<std::string> origin,
       std::unique_ptr<protocol::Array<protocol::Browser::PermissionType>>
           permissions,
       Maybe<std::string> browser_context_id) override;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 0491417..2379abe 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1536,12 +1536,8 @@
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidChangeFrameOwnerProperties,
                         OnDidChangeFrameOwnerProperties)
     IPC_MESSAGE_HANDLER(AccessibilityHostMsg_EventBundle, OnAccessibilityEvents)
-    IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges,
-                        OnAccessibilityLocationChanges)
     IPC_MESSAGE_HANDLER(AccessibilityHostMsg_ChildFrameHitTestResult,
                         OnAccessibilityChildFrameHitTestResult)
-    IPC_MESSAGE_HANDLER(AccessibilityHostMsg_SnapshotResponse,
-                        OnAccessibilitySnapshotResponse)
     IPC_MESSAGE_HANDLER(FrameHostMsg_DidStopLoading, OnDidStopLoading)
     IPC_MESSAGE_HANDLER(FrameHostMsg_SelectionChanged, OnSelectionChanged)
     IPC_MESSAGE_HANDLER(FrameHostMsg_FrameDidCallFocus, OnFrameDidCallFocus)
@@ -1707,11 +1703,6 @@
   must_be_replaced_ = IsRenderDocumentEnabledForCrashedFrame();
   has_committed_any_navigation_ = false;
 
-  // Execute any pending AX tree snapshot callbacks with an empty response,
-  // since we're never going to get a response from this renderer.
-  for (auto& iter : ax_tree_snapshot_callbacks_)
-    std::move(iter.second).Run(ui::AXTreeUpdate());
-
 #if defined(OS_ANDROID)
   // Execute any pending Samsung smart clip callbacks.
   for (base::IDMap<std::unique_ptr<ExtractSmartClipDataCallback>>::iterator
@@ -1723,7 +1714,6 @@
   smart_clip_callbacks_.Clear();
 #endif  // defined(OS_ANDROID)
 
-  ax_tree_snapshot_callbacks_.clear();
   visual_state_callbacks_.clear();
 
   // Ensure that future remote interface requests are associated with the new
@@ -3947,37 +3937,6 @@
   controller->GetBackForwardCache().PostTaskToDestroyEvictedFrames();
 }
 
-void RenderFrameHostImpl::OnAccessibilityLocationChanges(
-    const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) {
-  if (accessibility_reset_token_ || !is_active())
-    return;
-
-  RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
-      render_view_host_->GetWidget()->GetView());
-  if (view) {
-    ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode();
-    if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs)) {
-      BrowserAccessibilityManager* manager =
-          GetOrCreateBrowserAccessibilityManager();
-      if (manager)
-        manager->OnLocationChanges(params);
-    }
-
-    // Send the updates to the automation extension API.
-    std::vector<AXLocationChangeNotificationDetails> details;
-    details.reserve(params.size());
-    for (size_t i = 0; i < params.size(); ++i) {
-      const AccessibilityHostMsg_LocationChangeParams& param = params[i];
-      AXLocationChangeNotificationDetails detail;
-      detail.id = param.id;
-      detail.ax_tree_id = GetAXTreeID();
-      detail.new_location = param.new_location;
-      details.push_back(detail);
-    }
-    delegate_->AccessibilityLocationChangesReceived(details);
-  }
-}
-
 void RenderFrameHostImpl::OnAccessibilityChildFrameHitTestResult(
     int action_request_id,
     const gfx::Point& point,
@@ -4011,29 +3970,6 @@
   child_frame->AccessibilityPerformAction(action_data);
 }
 
-void RenderFrameHostImpl::OnAccessibilitySnapshotResponse(
-    int callback_id,
-    const AXContentTreeUpdate& snapshot) {
-  const auto& it = ax_tree_snapshot_callbacks_.find(callback_id);
-  if (it != ax_tree_snapshot_callbacks_.end()) {
-    ui::AXTreeUpdate dst_snapshot;
-    dst_snapshot.root_id = snapshot.root_id;
-    dst_snapshot.nodes.resize(snapshot.nodes.size());
-    for (size_t i = 0; i < snapshot.nodes.size(); ++i) {
-      AXContentNodeDataToAXNodeData(snapshot.nodes[i], &dst_snapshot.nodes[i]);
-    }
-    if (snapshot.has_tree_data) {
-      ax_content_tree_data_ = snapshot.tree_data;
-      AXContentTreeDataToAXTreeData(&dst_snapshot.tree_data);
-      dst_snapshot.has_tree_data = true;
-    }
-    std::move(it->second).Run(dst_snapshot);
-    ax_tree_snapshot_callbacks_.erase(it);
-  } else {
-    NOTREACHED() << "Received AX tree snapshot response for unknown id";
-  }
-}
-
 bool RenderFrameHostImpl::HasSeenRecentXrOverlaySetup() {
   static constexpr base::TimeDelta kMaxInterval =
       base::TimeDelta::FromSeconds(1);
@@ -4798,6 +4734,36 @@
                                   std::move(resource_load_info));
 }
 
+void RenderFrameHostImpl::HandleAXLocationChanges(
+    std::vector<mojom::LocationChangesPtr> changes) {
+  if (accessibility_reset_token_ || !is_active())
+    return;
+
+  RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
+      render_view_host_->GetWidget()->GetView());
+  if (view) {
+    ui::AXMode accessibility_mode = delegate_->GetAccessibilityMode();
+    if (accessibility_mode.has_mode(ui::AXMode::kNativeAPIs)) {
+      BrowserAccessibilityManager* manager =
+          GetOrCreateBrowserAccessibilityManager();
+      if (manager)
+        manager->OnLocationChanges(changes);
+    }
+
+    // Send the updates to the automation extension API.
+    std::vector<AXLocationChangeNotificationDetails> details;
+    details.reserve(changes.size());
+    for (auto& change : changes) {
+      AXLocationChangeNotificationDetails detail;
+      detail.id = change->id;
+      detail.ax_tree_id = GetAXTreeID();
+      detail.new_location = change->new_location;
+      details.push_back(detail);
+    }
+    delegate_->AccessibilityLocationChangesReceived(details);
+  }
+}
+
 void RenderFrameHostImpl::RegisterMojoInterfaces() {
   file_system_manager_.reset(new FileSystemManagerImpl(
       GetProcess()->GetID(),
@@ -5886,6 +5852,15 @@
         },
         base::Unretained(this)));
   }
+
+  associated_registry_->AddInterface(base::BindRepeating(
+      [](RenderFrameHostImpl* impl,
+         mojo::PendingAssociatedReceiver<mojom::RenderAccessibilityHost>
+             receiver) {
+        impl->render_accessibility_host_receiver_.Bind(std::move(receiver));
+      },
+      base::Unretained(this)));
+
   RegisterMojoInterfaces();
   mojo::PendingRemote<mojom::FrameFactory> frame_factory;
   GetProcess()->BindReceiver(frame_factory.InitWithNewPipeAndPassReceiver());
@@ -5928,6 +5903,7 @@
   geolocation_service_.reset();
   sensor_provider_proxy_.reset();
 
+  render_accessibility_host_receiver_.reset();
   local_frame_host_receiver_.reset();
   local_main_frame_host_receiver_.reset();
   associated_registry_.reset();
@@ -6113,11 +6089,10 @@
 
 void RenderFrameHostImpl::RequestAXTreeSnapshot(AXTreeSnapshotCallback callback,
                                                 ui::AXMode ax_mode) {
-  static int next_id = 1;
-  int callback_id = next_id++;
-  Send(new AccessibilityMsg_SnapshotTree(routing_id_, callback_id,
-                                         ax_mode.mode()));
-  ax_tree_snapshot_callbacks_.emplace(callback_id, std::move(callback));
+  frame_->SnapshotAccessibilityTree(
+      ax_mode.mode(),
+      base::BindOnce(&RenderFrameHostImpl::RequestAXTreeSnapshotCallback,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
 void RenderFrameHostImpl::SetAccessibilityCallbackForTesting(
@@ -6479,21 +6454,12 @@
   // Copy the common fields.
   *dst = src;
 
-  // Map content-specific attributes based on routing IDs or browser plugin
-  // instance IDs to generic attributes with global AXTreeIDs.
-  for (auto iter : src.content_int_attributes) {
-    AXContentIntAttribute attr = iter.first;
-    int32_t value = iter.second;
-    switch (attr) {
-      case AX_CONTENT_ATTR_CHILD_ROUTING_ID:
-        dst->string_attributes.push_back(
-            std::make_pair(ax::mojom::StringAttribute::kChildTreeId,
-                           RoutingIDToAXTreeID(value).ToString()));
-        break;
-      case AX_CONTENT_INT_ATTRIBUTE_LAST:
-        NOTREACHED();
-        break;
-    }
+  // Map content-specific's |child_routing_id| attribute to a generic attribute
+  // with a global AXTreeID.
+  if (src.child_routing_id != MSG_ROUTING_NONE) {
+    dst->string_attributes.push_back(
+        std::make_pair(ax::mojom::StringAttribute::kChildTreeId,
+                       RoutingIDToAXTreeID(src.child_routing_id).ToString()));
   }
 }
 
@@ -6503,10 +6469,10 @@
   // Copy the common fields.
   *dst = src;
 
-  if (src.routing_id != -1)
+  if (src.routing_id != MSG_ROUTING_NONE)
     dst->tree_id = RoutingIDToAXTreeID(src.routing_id);
 
-  if (src.parent_routing_id != -1)
+  if (src.parent_routing_id != MSG_ROUTING_NONE)
     dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id);
 
   if (browser_plugin_embedder_ax_tree_id_ != ui::AXTreeIDUnknown())
@@ -6524,6 +6490,23 @@
   dst->focused_tree_id = focused_frame->GetAXTreeID();
 }
 
+void RenderFrameHostImpl::RequestAXTreeSnapshotCallback(
+    AXTreeSnapshotCallback callback,
+    const AXContentTreeUpdate& snapshot) {
+  ui::AXTreeUpdate dst_snapshot;
+  dst_snapshot.root_id = snapshot.root_id;
+  dst_snapshot.nodes.resize(snapshot.nodes.size());
+  for (size_t i = 0; i < snapshot.nodes.size(); ++i)
+    AXContentNodeDataToAXNodeData(snapshot.nodes[i], &dst_snapshot.nodes[i]);
+
+  if (snapshot.has_tree_data) {
+    ax_content_tree_data_ = snapshot.tree_data;
+    AXContentTreeDataToAXTreeData(&dst_snapshot.tree_data);
+    dst_snapshot.has_tree_data = true;
+  }
+  std::move(callback).Run(dst_snapshot);
+}
+
 void RenderFrameHostImpl::CreatePaymentManager(
     mojo::PendingReceiver<payments::mojom::PaymentManager> receiver) {
   if (!IsFeatureEnabled(blink::mojom::FeaturePolicyFeature::kPayment)) {
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 78a1e2d..34448177 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -144,7 +144,6 @@
 
 class GURL;
 struct AccessibilityHostMsg_EventBundleParams;
-struct AccessibilityHostMsg_LocationChangeParams;
 struct FrameHostMsg_OpenURL_Params;
 #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU)
 struct FrameHostMsg_ShowPopup_Params;
@@ -226,6 +225,7 @@
     : public RenderFrameHost,
       public base::SupportsUserData,
       public mojom::FrameHost,
+      public mojom::RenderAccessibilityHost,
       public BrowserAccessibilityDelegate,
       public RenderProcessHostObserver,
       public SiteInstanceImpl::Observer,
@@ -1599,16 +1599,12 @@
       const AccessibilityHostMsg_EventBundleParams& params,
       int reset_token,
       int ack_token);
-  void OnAccessibilityLocationChanges(
-      const std::vector<AccessibilityHostMsg_LocationChangeParams>& params);
   void OnAccessibilityChildFrameHitTestResult(
       int action_request_id,
       const gfx::Point& point,
       int child_frame_routing_id,
       int child_frame_browser_plugin_instance_id,
       ax::mojom::Event event_to_fire);
-  void OnAccessibilitySnapshotResponse(int callback_id,
-                                       const AXContentTreeUpdate& snapshot);
   void OnDidStopLoading();
   void OnSelectionChanged(const base::string16& text,
                           uint32_t offset,
@@ -1704,6 +1700,10 @@
   void UpdateUserGestureCarryoverInfo() override;
 #endif
 
+  // mojom::RenderAccessibilityHost:
+  void HandleAXLocationChanges(
+      std::vector<mojom::LocationChangesPtr> changes) override;
+
   // Registers Mojo interfaces that this frame host makes available.
   void RegisterMojoInterfaces();
 
@@ -1797,6 +1797,13 @@
   // AXTreeData structure.
   void AXContentTreeDataToAXTreeData(ui::AXTreeData* dst);
 
+  // Callback that will be called as a response to the call to the method
+  // content::mojom::RenderAccessibility::SnapshotAccessibilityTree(). The
+  // |callback| passed will be invoked after the renderer has responded with a
+  // standalone snapshot of the accessibility tree as |snapshot|.
+  void RequestAXTreeSnapshotCallback(AXTreeSnapshotCallback callback,
+                                     const AXContentTreeUpdate& snapshot);
+
   // Returns the RenderWidgetHostView used for accessibility. For subframes,
   // this function will return the platform view on the main frame; for main
   // frames, it will return the current frame's view.
@@ -2305,10 +2312,6 @@
   // The AX tree ID of the embedder, if this is a browser plugin guest.
   ui::AXTreeID browser_plugin_embedder_ax_tree_id_;
 
-  // The mapping from callback id to corresponding callback for pending
-  // accessibility tree snapshot calls created by RequestAXTreeSnapshot.
-  std::map<int, AXTreeSnapshotCallback> ax_tree_snapshot_callbacks_;
-
   // Samsung Galaxy Note-specific "smart clip" stylus text getter.
 #if defined(OS_ANDROID)
   base::IDMap<std::unique_ptr<ExtractSmartClipDataCallback>>
@@ -2556,6 +2559,9 @@
   // is an accessibility mode that includes |kWebContents|.
   mojo::AssociatedRemote<mojom::RenderAccessibility> render_accessibility_;
 
+  mojo::AssociatedReceiver<mojom::RenderAccessibilityHost>
+      render_accessibility_host_receiver_{this};
+
   std::unique_ptr<KeepAliveHandleFactory> keep_alive_handle_factory_;
   base::TimeDelta keep_alive_timeout_;
 
diff --git a/content/browser/indexed_db/indexed_db_browsertest.cc b/content/browser/indexed_db/indexed_db_browsertest.cc
index aa86f38e..5a4335e 100644
--- a/content/browser/indexed_db/indexed_db_browsertest.cc
+++ b/content/browser/indexed_db/indexed_db_browsertest.cc
@@ -1078,7 +1078,9 @@
 
 // Fails to cleanup GPU processes on swarming.
 // http://crbug.com/552543
-#if defined(OS_WIN)
+// Flasky on TSAN:
+// crbug.com/1061251
+#if defined(OS_WIN) || defined(THREAD_SANITIZER)
 #define MAYBE_VersionChangeCrashResilience DISABLED_VersionChangeCrashResilience
 #else
 #define MAYBE_VersionChangeCrashResilience VersionChangeCrashResilience
diff --git a/content/browser/mojo_sandbox_browsertest.cc b/content/browser/mojo_sandbox_browsertest.cc
index b0b2eea..16b2847 100644
--- a/content/browser/mojo_sandbox_browsertest.cc
+++ b/content/browser/mojo_sandbox_browsertest.cc
@@ -7,9 +7,16 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/containers/span.h"
 #include "base/macros.h"
+#include "base/memory/read_only_shared_memory_region.h"
+#include "base/memory/shared_memory_mapping.h"
+#include "base/memory/unsafe_shared_memory_region.h"
+#include "base/memory/writable_shared_memory_region.h"
 #include "base/run_loop.h"
+#include "base/strings/string_piece.h"
 #include "base/task/post_task.h"
+#include "base/test/bind_test_util.h"
 #include "content/browser/utility_process_host.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -25,7 +32,7 @@
 
 class MojoSandboxTest : public ContentBrowserTest {
  public:
-  MojoSandboxTest() {}
+  MojoSandboxTest() = default;
 
   void SetUpOnMainThread() override {
     base::RunLoop run_loop;
@@ -62,9 +69,9 @@
   DISALLOW_COPY_AND_ASSIGN(MojoSandboxTest);
 };
 
-IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessSharedBuffer) {
-  // Ensures that a shared buffer can be created within a sandboxed process.
-
+// Ensures that a read-only shared memory region can be created within a
+// sandboxed process.
+IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessReadOnlySharedMemoryRegion) {
   mojo::Remote<mojom::TestService> test_service;
   base::PostTask(
       FROM_HERE, {BrowserThread::IO},
@@ -78,22 +85,79 @@
   bool got_response = false;
   base::RunLoop run_loop;
   test_service.set_disconnect_handler(run_loop.QuitClosure());
-  test_service->CreateSharedBuffer(
+  test_service->CreateReadOnlySharedMemoryRegion(
       kTestMessage,
+      base::BindLambdaForTesting([&](base::ReadOnlySharedMemoryRegion region) {
+        got_response = true;
+        ASSERT_TRUE(region.IsValid());
+        base::ReadOnlySharedMemoryMapping mapping = region.Map();
+        ASSERT_TRUE(mapping.IsValid());
+        auto span = mapping.GetMemoryAsSpan<const char>();
+        EXPECT_EQ(kTestMessage, base::StringPiece(span.data(), span.size()));
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+  EXPECT_TRUE(got_response);
+}
+
+// Ensures that a writable shared memory region can be created within a
+// sandboxed process.
+IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessWritableSharedMemoryRegion) {
+  mojo::Remote<mojom::TestService> test_service;
+  base::PostTask(
+      FROM_HERE, {BrowserThread::IO},
       base::BindOnce(
-          [](base::OnceClosure quit_closure, bool* got_response,
-             mojo::ScopedSharedBufferHandle buffer) {
-            ASSERT_TRUE(buffer.is_valid());
-            mojo::ScopedSharedBufferMapping mapping =
-                buffer->Map(kTestMessage.size());
-            ASSERT_TRUE(mapping);
-            std::string contents(static_cast<const char*>(mapping.get()),
-                                 kTestMessage.size());
-            EXPECT_EQ(kTestMessage, contents);
-            *got_response = true;
-            std::move(quit_closure).Run();
+          [](UtilityProcessHost* host,
+             mojo::PendingReceiver<mojom::TestService> receiver) {
+            host->GetChildProcess()->BindReceiver(std::move(receiver));
           },
-          run_loop.QuitClosure(), &got_response));
+          host_.get(), test_service.BindNewPipeAndPassReceiver()));
+
+  bool got_response = false;
+  base::RunLoop run_loop;
+  test_service.set_disconnect_handler(run_loop.QuitClosure());
+  test_service->CreateWritableSharedMemoryRegion(
+      kTestMessage,
+      base::BindLambdaForTesting([&](base::WritableSharedMemoryRegion region) {
+        got_response = true;
+        ASSERT_TRUE(region.IsValid());
+        base::WritableSharedMemoryMapping mapping = region.Map();
+        ASSERT_TRUE(mapping.IsValid());
+        auto span = mapping.GetMemoryAsSpan<const char>();
+        EXPECT_EQ(kTestMessage, base::StringPiece(span.data(), span.size()));
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+  EXPECT_TRUE(got_response);
+}
+
+// Ensures that an unsafe shared memory region can be created within a
+// sandboxed process.
+IN_PROC_BROWSER_TEST_F(MojoSandboxTest, SubprocessUnsafeSharedMemoryRegion) {
+  mojo::Remote<mojom::TestService> test_service;
+  base::PostTask(
+      FROM_HERE, {BrowserThread::IO},
+      base::BindOnce(
+          [](UtilityProcessHost* host,
+             mojo::PendingReceiver<mojom::TestService> receiver) {
+            host->GetChildProcess()->BindReceiver(std::move(receiver));
+          },
+          host_.get(), test_service.BindNewPipeAndPassReceiver()));
+
+  bool got_response = false;
+  base::RunLoop run_loop;
+  test_service.set_disconnect_handler(run_loop.QuitClosure());
+  test_service->CreateUnsafeSharedMemoryRegion(
+      kTestMessage,
+      base::BindLambdaForTesting([&](base::UnsafeSharedMemoryRegion region) {
+        got_response = true;
+        ASSERT_TRUE(region.IsValid());
+        base::WritableSharedMemoryMapping mapping = region.Map();
+        ASSERT_TRUE(mapping.IsValid());
+        auto span = mapping.GetMemoryAsSpan<const char>();
+        EXPECT_EQ(kTestMessage, base::StringPiece(span.data(), span.size()));
+        run_loop.Quit();
+      }));
   run_loop.Run();
   EXPECT_TRUE(got_response);
 }
diff --git a/content/browser/permissions/permission_controller_impl.cc b/content/browser/permissions/permission_controller_impl.cc
index b269a9f..a7cfeb85 100644
--- a/content/browser/permissions/permission_controller_impl.cc
+++ b/content/browser/permissions/permission_controller_impl.cc
@@ -188,8 +188,8 @@
 
 PermissionControllerImpl::OverrideStatus
 PermissionControllerImpl::SetOverrideForDevTools(
-    const url::Origin& origin,
-    const PermissionType& permission,
+    const base::Optional<url::Origin>& origin,
+    PermissionType permission,
     const blink::mojom::PermissionStatus& status) {
   PermissionControllerDelegate* delegate =
       browser_context_->GetPermissionControllerDelegate();
@@ -197,8 +197,8 @@
       !delegate->IsPermissionOverridableByDevTools(permission, origin)) {
     return OverrideStatus::kOverrideNotSet;
   }
-  const auto old_statuses = GetSubscriptionsStatuses(origin.GetURL());
-
+  const auto old_statuses = GetSubscriptionsStatuses(
+      origin ? base::make_optional(origin->GetURL()) : base::nullopt);
   devtools_permission_overrides_.Set(origin, permission, status);
   NotifyChangedSubscriptions(old_statuses);
 
@@ -208,16 +208,19 @@
 
 PermissionControllerImpl::OverrideStatus
 PermissionControllerImpl::GrantOverridesForDevTools(
-    const url::Origin& origin,
+    const base::Optional<url::Origin>& origin,
     const std::vector<PermissionType>& permissions) {
   PermissionControllerDelegate* delegate =
       browser_context_->GetPermissionControllerDelegate();
-  if (delegate)
-    for (const auto permission : permissions)
+  if (delegate) {
+    for (const auto permission : permissions) {
       if (!delegate->IsPermissionOverridableByDevTools(permission, origin))
         return OverrideStatus::kOverrideNotSet;
+    }
+  }
 
-  const auto old_statuses = GetSubscriptionsStatuses(origin.GetURL());
+  const auto old_statuses = GetSubscriptionsStatuses(
+      origin ? base::make_optional(origin->GetURL()) : base::nullopt);
   devtools_permission_overrides_.GrantPermissions(origin, permissions);
   // If any statuses changed because they lose overrides or the new overrides
   // modify their previous state (overridden or not), subscribers must be
@@ -243,7 +246,7 @@
 }
 
 void PermissionControllerImpl::UpdateDelegateOverridesForDevTools(
-    const url::Origin& origin) {
+    const base::Optional<url::Origin>& origin) {
   PermissionControllerDelegate* delegate =
       browser_context_->GetPermissionControllerDelegate();
   if (!delegate)
diff --git a/content/browser/permissions/permission_controller_impl.h b/content/browser/permissions/permission_controller_impl.h
index 0c5e652..7ebf3c4 100644
--- a/content/browser/permissions/permission_controller_impl.h
+++ b/content/browser/permissions/permission_controller_impl.h
@@ -31,13 +31,14 @@
   enum class OverrideStatus { kOverrideNotSet, kOverrideSet };
 
   // For the given |origin|, grant permissions in |overrides| and reject all
-  // others.
+  // others. If no |origin| is specified, grant permissions to all origins in
+  // the browser context.
   OverrideStatus GrantOverridesForDevTools(
-      const url::Origin& origin,
+      const base::Optional<url::Origin>& origin,
       const std::vector<PermissionType>& permissions);
   OverrideStatus SetOverrideForDevTools(
-      const url::Origin& origin,
-      const PermissionType& permission,
+      const base::Optional<url::Origin>& origin,
+      PermissionType permission,
       const blink::mojom::PermissionStatus& status);
   void ResetOverridesForDevTools();
 
@@ -93,7 +94,8 @@
   void NotifyChangedSubscriptions(const SubscriptionsStatusMap& old_statuses);
   void OnDelegatePermissionStatusChange(Subscription* subscription,
                                         blink::mojom::PermissionStatus status);
-  void UpdateDelegateOverridesForDevTools(const url::Origin& origin);
+  void UpdateDelegateOverridesForDevTools(
+      const base::Optional<url::Origin>& origin);
 
   DevToolsPermissionOverrides devtools_permission_overrides_;
   SubscriptionsMap subscriptions_;
diff --git a/content/browser/permissions/permission_controller_impl_unittest.cc b/content/browser/permissions/permission_controller_impl_unittest.cc
index 7e4909e6..3a133ab 100644
--- a/content/browser/permissions/permission_controller_impl_unittest.cc
+++ b/content/browser/permissions/permission_controller_impl_unittest.cc
@@ -42,11 +42,11 @@
           const base::OnceCallback<void(
               const std::vector<blink::mojom::PermissionStatus>&)> callback));
   MOCK_METHOD2(SetPermissionOverridesForDevTools,
-               void(const url::Origin& origin,
+               void(const base::Optional<url::Origin>& origin,
                     const PermissionOverrides& overrides));
   MOCK_METHOD0(ResetPermissionOverridesForDevTools, void());
   MOCK_METHOD2(IsPermissionOverridableByDevTools,
-               bool(PermissionType, const url::Origin&));
+               bool(PermissionType, const base::Optional<url::Origin>&));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockManagerWithRequests);
@@ -92,7 +92,7 @@
 }
 
 TEST_F(PermissionControllerImplTest, SettingOverridesForwardsUpdates) {
-  url::Origin kTestOrigin = url::Origin::Create(GURL(kTestUrl));
+  auto kTestOrigin = base::make_optional(url::Origin::Create(GURL(kTestUrl)));
   EXPECT_CALL(*mock_manager(),
               SetPermissionOverridesForDevTools(
                   kTestOrigin, testing::ElementsAre(testing::Pair(
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.cc b/content/browser/renderer_host/page_lifecycle_state_manager.cc
new file mode 100644
index 0000000..df0a664
--- /dev/null
+++ b/content/browser/renderer_host/page_lifecycle_state_manager.cc
@@ -0,0 +1,37 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/renderer_host/page_lifecycle_state_manager.h"
+
+#include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/public/browser/render_process_host.h"
+#include "services/service_manager/public/cpp/interface_provider.h"
+
+namespace content {
+
+PageLifecycleStateManager::PageLifecycleStateManager(
+    RenderViewHostImpl* render_view_host_impl)
+    : render_view_host_impl_(render_view_host_impl) {}
+
+PageLifecycleStateManager::~PageLifecycleStateManager() = default;
+
+void PageLifecycleStateManager::SetIsFrozen(bool frozen) {
+  if (!render_view_host_impl_->GetAssociatedPageBroadcast()) {
+    // For some tests, |render_view_host_impl_| does not have the associated
+    // page.
+    return;
+  }
+  auto state = blink::mojom::PageLifecycleState::New();
+  state->is_frozen = frozen;
+
+  render_view_host_impl_->GetAssociatedPageBroadcast()->SetPageLifecycleState(
+      std::move(state), base::BindOnce(&PageLifecycleStateManager::OnFreezeAck,
+                                       weak_ptr_factory_.GetWeakPtr()));
+}
+
+void PageLifecycleStateManager::OnFreezeAck() {
+  // TODO(yuzus): Implement OnPageFrozen and send changes to the observers.
+}
+
+}  // namespace content
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.h b/content/browser/renderer_host/page_lifecycle_state_manager.h
new file mode 100644
index 0000000..79e14f6
--- /dev/null
+++ b/content/browser/renderer_host/page_lifecycle_state_manager.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_RENDERER_HOST_PAGE_LIFECYCLE_STATE_MANAGER_H_
+#define CONTENT_BROWSER_RENDERER_HOST_PAGE_LIFECYCLE_STATE_MANAGER_H_
+
+#include "content/common/content_export.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "third_party/blink/public/mojom/page/page.mojom.h"
+
+namespace content {
+
+class RenderViewHostImpl;
+
+// A class responsible for managing the main lifecycle state of the blink::Page
+// and communicating in to the RenderView. 1:1 with RenderViewHostImpl.
+class CONTENT_EXPORT PageLifecycleStateManager {
+ public:
+  explicit PageLifecycleStateManager(RenderViewHostImpl* render_view_host_impl);
+  ~PageLifecycleStateManager();
+
+  void SetIsFrozen(bool frozen);
+
+ private:
+  void OnFreezeAck();
+
+  RenderViewHostImpl* render_view_host_impl_;
+
+  // NOTE: This must be the last member.
+  base::WeakPtrFactory<PageLifecycleStateManager> weak_ptr_factory_{this};
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_RENDERER_HOST_PAGE_LIFECYCLE_STATE_MANAGER_H_
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager_browsertest.cc b/content/browser/renderer_host/page_lifecycle_state_manager_browsertest.cc
new file mode 100644
index 0000000..0a10b77b
--- /dev/null
+++ b/content/browser/renderer_host/page_lifecycle_state_manager_browsertest.cc
@@ -0,0 +1,80 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/location.h"
+#include "content/browser/frame_host/frame_tree_node.h"
+#include "content/browser/frame_host/render_frame_host_impl.h"
+#include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "content/shell/browser/shell.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+
+namespace content {
+
+class PageLifecycleStateManagerBrowserTest : public ContentBrowserTest {
+ public:
+  ~PageLifecycleStateManagerBrowserTest() override = default;
+
+ protected:
+  WebContentsImpl* web_contents() const {
+    return static_cast<WebContentsImpl*>(shell()->web_contents());
+  }
+
+  void StartRecordingEvents(RenderFrameHostImpl* rfh) {
+    EXPECT_TRUE(ExecJs(rfh, R"(
+      window.testObservedEvents = [];
+      let event_list = [
+        'freeze',
+        'resume',
+      ];
+      for (event_name of event_list) {
+        let result = event_name;
+        document.addEventListener(event_name, event => {
+          window.testObservedEvents.push('document.' + result);
+        });
+      }
+    )"));
+  }
+
+  void MatchEventList(RenderFrameHostImpl* rfh,
+                      base::ListValue list,
+                      base::Location location = base::Location::Current()) {
+    EXPECT_EQ(list, EvalJs(rfh, "window.testObservedEvents"))
+        << location.ToString();
+  }
+
+  RenderViewHostImpl* render_view_host() {
+    return static_cast<RenderViewHostImpl*>(
+        shell()->web_contents()->GetRenderViewHost());
+  }
+
+  RenderFrameHostImpl* current_frame_host() {
+    return static_cast<WebContentsImpl*>(shell()->web_contents())
+        ->GetFrameTree()
+        ->root()
+        ->current_frame_host();
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(PageLifecycleStateManagerBrowserTest, SetFrozen) {
+  EXPECT_TRUE(embedded_test_server()->Start());
+  GURL test_url = embedded_test_server()->GetURL("/empty.html");
+  EXPECT_TRUE(NavigateToURL(shell(), test_url));
+  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+  RenderViewHostImpl* rvh = render_view_host();
+  RenderFrameHostImpl* rfh = current_frame_host();
+  StartRecordingEvents(rfh);
+  // TODO(yuzus):Use PageLifecycleStateManager for visibility change.
+  shell()->web_contents()->WasHidden();
+
+  rvh->SetIsFrozen(/*frozen*/ true);
+  rvh->SetIsFrozen(/*frozen*/ false);
+  MatchEventList(rfh, ListValueOf("document.freeze", "document.resume"));
+}
+
+}  // namespace content
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 464c6df..200d25b6 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -251,6 +251,9 @@
   input_device_change_observer_ =
       std::make_unique<InputDeviceChangeObserver>(this);
 
+  page_lifecycle_state_manager_ =
+      std::make_unique<PageLifecycleStateManager>(this);
+
   GetWidget()->set_owner_delegate(this);
 }
 
@@ -431,6 +434,10 @@
                                                    navigation_start));
 }
 
+void RenderViewHostImpl::SetIsFrozen(bool frozen) {
+  page_lifecycle_state_manager_->SetIsFrozen(frozen);
+}
+
 bool RenderViewHostImpl::IsRenderViewLive() {
   return GetProcess()->IsInitializedAndNotDead() &&
          GetWidget()->renderer_initialized();
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index 9418a36..70f9ea0f 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -22,6 +22,7 @@
 #include "base/process/kill.h"
 #include "build/build_config.h"
 #include "content/browser/renderer_host/input/input_device_change_observer.h"
+#include "content/browser/renderer_host/page_lifecycle_state_manager.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_owner_delegate.h"
 #include "content/browser/site_instance_impl.h"
@@ -221,6 +222,8 @@
   // to allow it to record the latency of this navigation.
   void LeaveBackForwardCache(base::TimeTicks navigation_start);
 
+  void SetIsFrozen(bool frozen);
+
   // Called during frame eviction to return all SurfaceIds in the frame tree.
   // Marks all views in the frame tree as evicted.
   std::vector<viz::SurfaceId> CollectSurfaceIdsForEviction();
@@ -309,6 +312,7 @@
   // specific code away from this class.
   friend class RenderFrameHostImpl;
   friend class TestRenderViewHost;
+  friend class PageLifecycleStateManagerBrowserTest;
   FRIEND_TEST_ALL_PREFIXES(RenderViewHostTest, BasicRenderFrameHost);
   FRIEND_TEST_ALL_PREFIXES(RenderViewHostTest, RoutingIdSane);
   FRIEND_TEST_ALL_PREFIXES(RenderFrameHostManagerTest,
@@ -385,6 +389,9 @@
   // This monitors input changes so they can be reflected to the interaction MQ.
   std::unique_ptr<InputDeviceChangeObserver> input_device_change_observer_;
 
+  // This controls the lifecycle change and notify the renderer.
+  std::unique_ptr<PageLifecycleStateManager> page_lifecycle_state_manager_;
+
   bool updating_web_preferences_ = false;
 
   // This tracks whether this RenderViewHost has notified observers about its
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index d249b1f..815125b 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -3863,6 +3863,35 @@
   }
 }
 
+// Test falling back to PIN for devices that support internal user verification
+// but not uv token.
+TEST_F(InternalUVAuthenticatorImplTest, MakeCredentialFallBackToPin) {
+  mojo::Remote<blink::mojom::Authenticator> authenticator =
+      ConnectToAuthenticator();
+
+  device::VirtualCtap2Device::Config config;
+  config.internal_uv_support = true;
+  config.pin_support = true;
+  config.user_verification_succeeds = false;
+  virtual_device_factory_->mutable_state()->pin = kTestPIN;
+  virtual_device_factory_->mutable_state()->pin_retries =
+      device::kMaxPinRetries;
+  virtual_device_factory_->mutable_state()->fingerprints_enrolled = true;
+  virtual_device_factory_->SetCtap2Config(config);
+
+  auto options =
+      make_credential_options(device::UserVerificationRequirement::kRequired);
+
+  TestMakeCredentialCallback callback_receiver;
+  authenticator->MakeCredential(std::move(options),
+                                callback_receiver.callback());
+  callback_receiver.WaitForCallback();
+
+  EXPECT_EQ(AuthenticatorStatus::SUCCESS, callback_receiver.status());
+  EXPECT_TRUE(HasUV(callback_receiver));
+  EXPECT_TRUE(test_client_.collected_pin());
+}
+
 TEST_F(InternalUVAuthenticatorImplTest, MakeCredentialCryptotoken) {
   auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(
       base::Time::Now(), base::TimeTicks::Now());
@@ -3928,6 +3957,38 @@
   }
 }
 
+// Test falling back to PIN for devices that support internal user verification
+// but not uv token.
+TEST_F(InternalUVAuthenticatorImplTest, GetAssertionFallbackToPIN) {
+  mojo::Remote<blink::mojom::Authenticator> authenticator =
+      ConnectToAuthenticator();
+
+  device::VirtualCtap2Device::Config config;
+  config.internal_uv_support = true;
+  config.pin_support = true;
+  config.user_verification_succeeds = false;
+  virtual_device_factory_->mutable_state()->pin = kTestPIN;
+  virtual_device_factory_->mutable_state()->pin_retries =
+      device::kMaxPinRetries;
+  virtual_device_factory_->mutable_state()->fingerprints_enrolled = true;
+  virtual_device_factory_->SetCtap2Config(config);
+
+  ASSERT_TRUE(virtual_device_factory_->mutable_state()->InjectRegistration(
+      get_credential_options()->allow_credentials[0].id(),
+      kTestRelyingPartyId));
+
+  auto options =
+      get_credential_options(device::UserVerificationRequirement::kRequired);
+
+  TestGetAssertionCallback callback_receiver;
+  authenticator->GetAssertion(std::move(options), callback_receiver.callback());
+  callback_receiver.WaitForCallback();
+
+  EXPECT_EQ(AuthenticatorStatus::SUCCESS, callback_receiver.status());
+  EXPECT_TRUE(HasUV(callback_receiver));
+  EXPECT_TRUE(test_client_.collected_pin());
+}
+
 TEST_F(InternalUVAuthenticatorImplTest, GetAssertionCryptotoken) {
   mojo::Remote<blink::mojom::Authenticator> authenticator =
       ConnectToAuthenticator();
diff --git a/content/browser/webrtc/OWNERS b/content/browser/webrtc/OWNERS
index 0bec65a03..1dedf34e 100644
--- a/content/browser/webrtc/OWNERS
+++ b/content/browser/webrtc/OWNERS
@@ -1,7 +1,7 @@
 guidou@chromium.org
 tommi@chromium.org
 
-per-file *test*=phoglund@chromium.org
+per-file *test*=mbonadei@chromium.org
 
 # Original (legacy) owners.
 chfremer@chromium.org
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index af7b2f3..40c2cf2 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -440,6 +440,9 @@
 
   sources = [
     "associated_interfaces.mojom",
+    "ax_content_node_data.mojom",
+    "ax_content_tree_data.mojom",
+    "ax_content_tree_update.mojom",
     "child_process.mojom",
     "document_scoped_interface_bundle.mojom",
     "download/mhtml_file_writer.mojom",
diff --git a/content/common/accessibility_messages.h b/content/common/accessibility_messages.h
index dff353c..bf70db0 100644
--- a/content/common/accessibility_messages.h
+++ b/content/common/accessibility_messages.h
@@ -16,11 +16,9 @@
 #include "ipc/ipc_param_traits.h"
 #include "ipc/param_traits_macros.h"
 #include "third_party/blink/public/web/web_ax_enums.h"
-#include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_event.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/accessibility/ax_param_traits.h"
-#include "ui/accessibility/ax_relative_bounds.h"
 #include "ui/accessibility/ax_tree_update.h"
 #include "ui/gfx/transform.h"
 
@@ -29,37 +27,6 @@
 
 #define IPC_MESSAGE_START AccessibilityMsgStart
 
-IPC_ENUM_TRAITS_MAX_VALUE(content::AXContentIntAttribute,
-                          content::AX_CONTENT_INT_ATTRIBUTE_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(ax::mojom::Action, ax::mojom::Action::kMaxValue)
-
-IPC_ENUM_TRAITS_MAX_VALUE(ax::mojom::ScrollAlignment,
-                          ax::mojom::ScrollAlignment::kMaxValue)
-
-IPC_ENUM_TRAITS_MAX_VALUE(ax::mojom::ScrollBehavior,
-                          ax::mojom::ScrollBehavior::kMaxValue)
-
-IPC_STRUCT_TRAITS_BEGIN(ui::AXActionData)
-  IPC_STRUCT_TRAITS_MEMBER(action)
-  IPC_STRUCT_TRAITS_MEMBER(target_tree_id)
-  IPC_STRUCT_TRAITS_MEMBER(source_extension_id)
-  IPC_STRUCT_TRAITS_MEMBER(target_node_id)
-  IPC_STRUCT_TRAITS_MEMBER(request_id)
-  IPC_STRUCT_TRAITS_MEMBER(flags)
-  IPC_STRUCT_TRAITS_MEMBER(anchor_node_id)
-  IPC_STRUCT_TRAITS_MEMBER(anchor_offset)
-  IPC_STRUCT_TRAITS_MEMBER(focus_node_id)
-  IPC_STRUCT_TRAITS_MEMBER(focus_offset)
-  IPC_STRUCT_TRAITS_MEMBER(custom_action_id)
-  IPC_STRUCT_TRAITS_MEMBER(target_rect)
-  IPC_STRUCT_TRAITS_MEMBER(target_point)
-  IPC_STRUCT_TRAITS_MEMBER(value)
-  IPC_STRUCT_TRAITS_MEMBER(hit_test_event_to_fire)
-  IPC_STRUCT_TRAITS_MEMBER(horizontal_scroll_alignment)
-  IPC_STRUCT_TRAITS_MEMBER(vertical_scroll_alignment)
-  IPC_STRUCT_TRAITS_MEMBER(scroll_behavior)
-IPC_STRUCT_TRAITS_END()
-
 IPC_STRUCT_TRAITS_BEGIN(content::AXContentNodeData)
   IPC_STRUCT_TRAITS_MEMBER(id)
   IPC_STRUCT_TRAITS_MEMBER(role)
@@ -72,8 +39,8 @@
   IPC_STRUCT_TRAITS_MEMBER(intlist_attributes)
   IPC_STRUCT_TRAITS_MEMBER(html_attributes)
   IPC_STRUCT_TRAITS_MEMBER(child_ids)
-  IPC_STRUCT_TRAITS_MEMBER(content_int_attributes)
   IPC_STRUCT_TRAITS_MEMBER(relative_bounds)
+  IPC_STRUCT_TRAITS_MEMBER(child_routing_id)
 IPC_STRUCT_TRAITS_END()
 
 IPC_STRUCT_TRAITS_BEGIN(content::AXContentTreeData)
@@ -115,14 +82,6 @@
   IPC_STRUCT_MEMBER(std::vector<ui::AXEvent>, events)
 IPC_STRUCT_END()
 
-IPC_STRUCT_BEGIN(AccessibilityHostMsg_LocationChangeParams)
-  // ID of the object whose location is changing.
-  IPC_STRUCT_MEMBER(int, id)
-
-  // The object's new location info.
-  IPC_STRUCT_MEMBER(ui::AXRelativeBounds, new_location)
-IPC_STRUCT_END()
-
 // Messages sent from the browser to the renderer.
 
 // Tells the render view that a AccessibilityHostMsg_EventBundle
@@ -131,13 +90,6 @@
 // AccessibilityHostMsg_EventBundle.
 IPC_MESSAGE_ROUTED1(AccessibilityMsg_EventBundle_ACK, int /* ack_token */)
 
-// Request a one-time snapshot of the accessibility tree without
-// enabling accessibility if it wasn't already enabled. The passed id
-// will be returned in the AccessibilityHostMsg_SnapshotResponse message.
-IPC_MESSAGE_ROUTED2(AccessibilityMsg_SnapshotTree,
-                    int /* callback id */,
-                    ui::AXMode /* ax_mode */)
-
 // Messages sent from the renderer to the browser.
 
 // Sent to notify the browser about renderer accessibility events.
@@ -152,11 +104,6 @@
                     int /* reset_token */,
                     int /* ack_token */)
 
-// Sent to update the browser of the location of accessibility objects.
-IPC_MESSAGE_ROUTED1(
-    AccessibilityHostMsg_LocationChanges,
-    std::vector<AccessibilityHostMsg_LocationChangeParams>)
-
 // Sent in response to PerformAction with parameter kHitTest.
 IPC_MESSAGE_ROUTED5(AccessibilityHostMsg_ChildFrameHitTestResult,
                     int /* action request id of initial caller */,
@@ -165,11 +112,4 @@
                     int /* browser plugin instance id of child frame */,
                     ax::mojom::Event /* event to fire */)
 
-// Sent in response to AccessibilityMsg_SnapshotTree. The callback id that was
-// passed to the request will be returned in |callback_id|, along with
-// a standalone snapshot of the accessibility tree.
-IPC_MESSAGE_ROUTED2(AccessibilityHostMsg_SnapshotResponse,
-                    int /* callback_id */,
-                    content::AXContentTreeUpdate)
-
 #endif  // CONTENT_COMMON_ACCESSIBILITY_MESSAGES_H_
diff --git a/content/common/ax_content_node_data.cc b/content/common/ax_content_node_data.cc
index acd5465..69d550e 100644
--- a/content/common/ax_content_node_data.cc
+++ b/content/common/ax_content_node_data.cc
@@ -7,104 +7,30 @@
 #include <algorithm>
 
 #include "base/strings/string_number_conversions.h"
+#include "content/common/ax_content_node_data.mojom.h"
 
 using base::NumberToString;
 
 namespace content {
 
-namespace {
-
-// Helper function that finds a key in a vector of pairs by matching on the
-// first value, and returns an iterator.
-template<typename FirstType, typename SecondType>
-typename std::vector<std::pair<FirstType, SecondType>>::const_iterator
-    FindInVectorOfPairs(
-        FirstType first,
-        const std::vector<std::pair<FirstType, SecondType>>& vector) {
-  return std::find_if(vector.begin(),
-                      vector.end(),
-                      [first](std::pair<FirstType, SecondType> const& p) {
-                        return p.first == first;
-                      });
-}
-
-}  // namespace
-
-AXContentNodeData::AXContentNodeData() {
-}
-
-AXContentNodeData::AXContentNodeData(const AXContentNodeData& other) = default;
-
-AXContentNodeData::AXContentNodeData(const AXNodeData& other)
-    : AXNodeData(other) {
-}
-
-AXContentNodeData::~AXContentNodeData() {
-}
-
-bool AXContentNodeData::HasContentIntAttribute(
-    AXContentIntAttribute attribute) const {
-  auto iter = FindInVectorOfPairs(attribute, content_int_attributes);
-  return iter != content_int_attributes.end();
-}
-
-int AXContentNodeData::GetContentIntAttribute(
-    AXContentIntAttribute attribute) const {
-  int result;
-  if (GetContentIntAttribute(attribute, &result))
-    return result;
-  return 0;
-}
-
-bool AXContentNodeData::GetContentIntAttribute(
-    AXContentIntAttribute attribute, int* value) const {
-  auto iter = FindInVectorOfPairs(attribute, content_int_attributes);
-  if (iter != content_int_attributes.end()) {
-    *value = iter->second;
-    return true;
-  }
-
-  return false;
-}
-
-void AXContentNodeData::AddContentIntAttribute(AXContentIntAttribute attribute,
-                                               int32_t value) {
-  content_int_attributes.push_back(std::make_pair(attribute, value));
+AXContentNodeData& AXContentNodeData::operator=(const AXNodeData& other) {
+  *static_cast<AXNodeData*>(this) = other;
+  return *this;
 }
 
 std::string AXContentNodeData::ToString() const {
   std::string result = AXNodeData::ToString();
-
-  for (auto iter : content_int_attributes) {
-    std::string value = NumberToString(iter.second);
-    switch (iter.first) {
-      case AX_CONTENT_ATTR_CHILD_ROUTING_ID:
-        result += " child_routing_id=" + value;
-        break;
-      case AX_CONTENT_INT_ATTRIBUTE_LAST:
-        NOTREACHED();
-        break;
-    }
-  }
-
+  if (child_routing_id != MSG_ROUTING_NONE)
+    result += " child_routing_id=" + NumberToString(child_routing_id);
   return result;
 }
 
-AXContentTreeData::AXContentTreeData()
-    : AXTreeData(),
-      routing_id(-1),
-      parent_routing_id(-1) {
-}
-
-AXContentTreeData::~AXContentTreeData() {
-}
-
 std::string AXContentTreeData::ToString() const {
   std::string result = AXTreeData::ToString();
 
-  if (routing_id != -1)
+  if (routing_id != MSG_ROUTING_NONE)
     result += " routing_id=" + NumberToString(routing_id);
-  if (parent_routing_id != -1)
+  if (parent_routing_id != MSG_ROUTING_NONE)
     result += " parent_routing_id=" + NumberToString(parent_routing_id);
 
   return result;
diff --git a/content/common/ax_content_node_data.h b/content/common/ax_content_node_data.h
index 866393b..ab7d4225 100644
--- a/content/common/ax_content_node_data.h
+++ b/content/common/ax_content_node_data.h
@@ -8,55 +8,42 @@
 #include <stdint.h>
 
 #include "content/common/content_export.h"
+#include "ipc/ipc_message.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/accessibility/ax_tree_data.h"
 #include "ui/accessibility/ax_tree_update.h"
 
 namespace content {
 
-enum AXContentIntAttribute {
-  // The routing ID of this node's child tree.
-  AX_CONTENT_ATTR_CHILD_ROUTING_ID,
-
-  AX_CONTENT_INT_ATTRIBUTE_LAST
-};
-
 // A subclass of AXNodeData that contains extra fields for
 // content-layer-specific AX attributes.
 struct CONTENT_EXPORT AXContentNodeData : public ui::AXNodeData {
-  AXContentNodeData();
-  AXContentNodeData(const AXNodeData& other);
-  AXContentNodeData(const AXContentNodeData& other);
-  ~AXContentNodeData() override;
-
-  bool HasContentIntAttribute(AXContentIntAttribute attribute) const;
-  int GetContentIntAttribute(AXContentIntAttribute attribute) const;
-  bool GetContentIntAttribute(AXContentIntAttribute attribute,
-                              int* value) const;
-  void AddContentIntAttribute(AXContentIntAttribute attribute, int value);
+  AXContentNodeData() = default;
+  AXContentNodeData(const AXContentNodeData& other) = default;
+  ~AXContentNodeData() override = default;
+  AXContentNodeData& operator=(const AXNodeData& other);
 
   // Return a string representation of this data, for debugging.
   std::string ToString() const override;
 
-  // This is a simple serializable struct. All member variables should be
-  // public and copyable.
-  std::vector<std::pair<AXContentIntAttribute, int32_t>> content_int_attributes;
+  // The routing ID of this node's child tree.
+  int32_t child_routing_id = MSG_ROUTING_NONE;
 };
 
 // A subclass of AXTreeData that contains extra fields for
 // content-layer-specific AX attributes.
 struct CONTENT_EXPORT AXContentTreeData : public ui::AXTreeData {
-  AXContentTreeData();
-  ~AXContentTreeData() override;
+  AXContentTreeData() = default;
+  ~AXContentTreeData() override = default;
 
   // Return a string representation of this data, for debugging.
   std::string ToString() const override;
 
   // The routing ID of this frame.
-  int routing_id;
+  int routing_id = MSG_ROUTING_NONE;
 
   // The routing ID of the parent frame.
-  int parent_routing_id;
+  int parent_routing_id = MSG_ROUTING_NONE;
 };
 
 typedef ui::AXTreeUpdateBase<content::AXContentNodeData,
diff --git a/content/common/ax_content_node_data.mojom b/content/common/ax_content_node_data.mojom
new file mode 100644
index 0000000..ffc5d33
--- /dev/null
+++ b/content/common/ax_content_node_data.mojom
@@ -0,0 +1,13 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module ax.mojom;
+
+import "ui/accessibility/mojom/ax_node_data.mojom";
+
+// See content::AXContentNodeData for comments / explanations of these fields.
+struct AXContentNodeData {
+  ax.mojom.AXNodeData node_data;
+  int32 child_routing_id;
+};
diff --git a/content/common/ax_content_node_data.typemap b/content/common/ax_content_node_data.typemap
new file mode 100644
index 0000000..09308bd
--- /dev/null
+++ b/content/common/ax_content_node_data.typemap
@@ -0,0 +1,13 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//content/common/ax_content_node_data.mojom"
+public_headers = [ "//content/common/ax_content_node_data.h" ]
+traits_headers = [ "//content/common/ax_content_node_data_mojom_traits.h" ]
+sources = [
+  "ax_content_node_data_mojom_traits.cc",
+  "ax_content_node_data_mojom_traits.h",
+]
+deps = [ "//ui/accessibility" ]
+type_mappings = [ "ax.mojom.AXContentNodeData=::content::AXContentNodeData" ]
diff --git a/content/common/ax_content_node_data_mojom_traits.cc b/content/common/ax_content_node_data_mojom_traits.cc
new file mode 100644
index 0000000..197060a
--- /dev/null
+++ b/content/common/ax_content_node_data_mojom_traits.cc
@@ -0,0 +1,24 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/common/ax_content_node_data_mojom_traits.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/mojom/ax_node_data_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<
+    ax::mojom::AXContentNodeDataDataView,
+    content::AXContentNodeData>::Read(ax::mojom::AXContentNodeDataDataView data,
+                                      content::AXContentNodeData* out) {
+  if (!data.ReadNodeData(static_cast<ui::AXNodeData*>(out)))
+    return false;
+
+  out->child_routing_id = data.child_routing_id();
+
+  return true;
+}
+
+}  // namespace mojo
diff --git a/content/common/ax_content_node_data_mojom_traits.h b/content/common/ax_content_node_data_mojom_traits.h
new file mode 100644
index 0000000..6b5800f
--- /dev/null
+++ b/content/common/ax_content_node_data_mojom_traits.h
@@ -0,0 +1,30 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_COMMON_AX_CONTENT_NODE_DATA_MOJOM_TRAITS_H_
+#define CONTENT_COMMON_AX_CONTENT_NODE_DATA_MOJOM_TRAITS_H_
+
+#include "content/common/ax_content_node_data.h"
+#include "content/common/ax_content_node_data.mojom-shared.h"
+#include "ui/accessibility/ax_node_data.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<ax::mojom::AXContentNodeDataDataView,
+                    content::AXContentNodeData> {
+  static const ui::AXNodeData& node_data(const content::AXContentNodeData& p) {
+    return p;
+  }
+  static int32_t child_routing_id(const content::AXContentNodeData& p) {
+    return p.child_routing_id;
+  }
+
+  static bool Read(ax::mojom::AXContentNodeDataDataView data,
+                   content::AXContentNodeData* out);
+};
+
+}  // namespace mojo
+
+#endif  // CONTENT_COMMON_AX_CONTENT_NODE_DATA_MOJOM_TRAITS_H_
diff --git a/content/common/ax_content_tree_data.mojom b/content/common/ax_content_tree_data.mojom
new file mode 100644
index 0000000..154ea56
--- /dev/null
+++ b/content/common/ax_content_tree_data.mojom
@@ -0,0 +1,14 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module ax.mojom;
+
+import "ui/accessibility/mojom/ax_tree_data.mojom";
+
+// See content::AXContentTreeData for comments / explanations of these fields.
+struct AXContentTreeData {
+  ax.mojom.AXTreeData tree_data;
+  int32 routing_id;
+  int32 parent_routing_id;
+};
diff --git a/content/common/ax_content_tree_data.typemap b/content/common/ax_content_tree_data.typemap
new file mode 100644
index 0000000..3d336ca
--- /dev/null
+++ b/content/common/ax_content_tree_data.typemap
@@ -0,0 +1,13 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//content/common/ax_content_tree_data.mojom"
+public_headers = [ "//content/common/ax_content_node_data.h" ]
+traits_headers = [ "//content/common/ax_content_tree_data_mojom_traits.h" ]
+sources = [
+  "ax_content_tree_data_mojom_traits.cc",
+  "ax_content_tree_data_mojom_traits.h",
+]
+deps = [ "//ui/accessibility" ]
+type_mappings = [ "ax.mojom.AXContentTreeData=::content::AXContentTreeData" ]
diff --git a/content/common/ax_content_tree_data_mojom_traits.cc b/content/common/ax_content_tree_data_mojom_traits.cc
new file mode 100644
index 0000000..af214e2
--- /dev/null
+++ b/content/common/ax_content_tree_data_mojom_traits.cc
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/common/ax_content_tree_data_mojom_traits.h"
+#include "ui/accessibility/ax_tree_data.h"
+#include "ui/accessibility/mojom/ax_tree_data_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<
+    ax::mojom::AXContentTreeDataDataView,
+    content::AXContentTreeData>::Read(ax::mojom::AXContentTreeDataDataView data,
+                                      content::AXContentTreeData* out) {
+  if (!data.ReadTreeData(static_cast<ui::AXTreeData*>(out)))
+    return false;
+
+  out->routing_id = data.routing_id();
+  out->parent_routing_id = data.parent_routing_id();
+
+  return true;
+}
+
+}  // namespace mojo
diff --git a/content/common/ax_content_tree_data_mojom_traits.h b/content/common/ax_content_tree_data_mojom_traits.h
new file mode 100644
index 0000000..ef3657e
--- /dev/null
+++ b/content/common/ax_content_tree_data_mojom_traits.h
@@ -0,0 +1,33 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_COMMON_AX_CONTENT_TREE_DATA_MOJOM_TRAITS_H_
+#define CONTENT_COMMON_AX_CONTENT_TREE_DATA_MOJOM_TRAITS_H_
+
+#include "content/common/ax_content_node_data.h"
+#include "content/common/ax_content_tree_data.mojom-shared.h"
+#include "ui/accessibility/ax_tree_data.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<ax::mojom::AXContentTreeDataDataView,
+                    content::AXContentTreeData> {
+  static const ui::AXTreeData& tree_data(const content::AXContentTreeData& p) {
+    return p;
+  }
+  static int32_t routing_id(const content::AXContentTreeData& p) {
+    return p.routing_id;
+  }
+  static int32_t parent_routing_id(const content::AXContentTreeData& p) {
+    return p.parent_routing_id;
+  }
+
+  static bool Read(ax::mojom::AXContentTreeDataDataView data,
+                   content::AXContentTreeData* out);
+};
+
+}  // namespace mojo
+
+#endif  // CONTENT_COMMON_AX_CONTENT_TREE_DATA_MOJOM_TRAITS_H_
diff --git a/content/common/ax_content_tree_update.mojom b/content/common/ax_content_tree_update.mojom
new file mode 100644
index 0000000..7373065
--- /dev/null
+++ b/content/common/ax_content_tree_update.mojom
@@ -0,0 +1,19 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module ax.mojom;
+
+import "ui/accessibility/ax_enums.mojom";
+import "content/common/ax_content_node_data.mojom";
+import "content/common/ax_content_tree_data.mojom";
+
+// See content::AXContentTreeUpdate for comments / explanations of these fields.
+struct AXContentTreeUpdate {
+  bool has_tree_data;
+  AXContentTreeData tree_data;
+  int32 node_id_to_clear;
+  int32 root_id;
+  array<AXContentNodeData> nodes;
+  ax.mojom.EventFrom event_from;
+};
diff --git a/content/common/ax_content_tree_update.typemap b/content/common/ax_content_tree_update.typemap
new file mode 100644
index 0000000..8050bc0c
--- /dev/null
+++ b/content/common/ax_content_tree_update.typemap
@@ -0,0 +1,13 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+mojom = "//content/common/ax_content_tree_update.mojom"
+public_headers = [ "//content/common/ax_content_node_data.h" ]
+traits_headers = [ "//content/common/ax_content_tree_update_mojom_traits.h" ]
+sources = [
+  "ax_content_tree_update_mojom_traits.cc",
+  "ax_content_tree_update_mojom_traits.h",
+]
+type_mappings =
+    [ "ax.mojom.AXContentTreeUpdate=::content::AXContentTreeUpdate" ]
diff --git a/content/common/ax_content_tree_update_mojom_traits.cc b/content/common/ax_content_tree_update_mojom_traits.cc
new file mode 100644
index 0000000..9793bb2d
--- /dev/null
+++ b/content/common/ax_content_tree_update_mojom_traits.cc
@@ -0,0 +1,28 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/common/ax_content_tree_update_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<ax::mojom::AXContentTreeUpdateDataView,
+                  content::AXContentTreeUpdate>::
+    Read(ax::mojom::AXContentTreeUpdateDataView data,
+         content::AXContentTreeUpdate* out) {
+  if (!data.ReadTreeData(&out->tree_data))
+    return false;
+
+  if (!data.ReadNodes(&out->nodes))
+    return false;
+
+  out->has_tree_data = data.has_tree_data();
+  out->node_id_to_clear = data.node_id_to_clear();
+  out->root_id = data.root_id();
+  out->event_from = data.event_from();
+
+  return true;
+}
+
+}  // namespace mojo
diff --git a/content/common/ax_content_tree_update_mojom_traits.h b/content/common/ax_content_tree_update_mojom_traits.h
new file mode 100644
index 0000000..015de489
--- /dev/null
+++ b/content/common/ax_content_tree_update_mojom_traits.h
@@ -0,0 +1,47 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_COMMON_AX_CONTENT_TREE_UPDATE_MOJOM_TRAITS_H_
+#define CONTENT_COMMON_AX_CONTENT_TREE_UPDATE_MOJOM_TRAITS_H_
+
+#include "content/common/ax_content_node_data.h"
+#include "content/common/ax_content_node_data_mojom_traits.h"
+#include "content/common/ax_content_tree_data_mojom_traits.h"
+#include "content/common/ax_content_tree_update.mojom-shared.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<ax::mojom::AXContentTreeUpdateDataView,
+                    content::AXContentTreeUpdate> {
+  static bool has_tree_data(const content::AXContentTreeUpdate& p) {
+    return p.has_tree_data;
+  }
+  static const content::AXContentTreeData& tree_data(
+      const content::AXContentTreeUpdate& p) {
+    return p.tree_data;
+  }
+  static int32_t node_id_to_clear(const content::AXContentTreeUpdate& p) {
+    return p.node_id_to_clear;
+  }
+  static int32_t root_id(const content::AXContentTreeUpdate& p) {
+    return p.root_id;
+  }
+  static const std::vector<content::AXContentNodeData>& nodes(
+      const content::AXContentTreeUpdate& p) {
+    return p.nodes;
+  }
+
+  static ax::mojom::EventFrom event_from(
+      const content::AXContentTreeUpdate& p) {
+    return p.event_from;
+  }
+
+  static bool Read(ax::mojom::AXContentTreeUpdateDataView data,
+                   content::AXContentTreeUpdate* out);
+};
+
+}  // namespace mojo
+
+#endif  // CONTENT_COMMON_AX_CONTENT_TREE_UPDATE_MOJOM_TRAITS_H_
diff --git a/content/common/frame.mojom b/content/common/frame.mojom
index db3ef34..00d9c34 100644
--- a/content/common/frame.mojom
+++ b/content/common/frame.mojom
@@ -4,6 +4,7 @@
 
 module content.mojom;
 
+import "content/common/ax_content_tree_update.mojom";
 import "content/common/document_scoped_interface_bundle.mojom";
 import "content/common/frame_messages.mojom";
 import "content/common/native_types.mojom";
@@ -83,6 +84,12 @@
   UpdateBrowserControlsState(BrowserControlsState constraints,
                              BrowserControlsState current,
                              bool animate);
+
+  // Requests a one-time snapshot of the accessibility tree without enabling
+  // accessibility if it wasn't already enabled.
+  // See ui/accessibility/ax_mode.h for valid values of |ax_mode|.
+  SnapshotAccessibilityTree(uint32 ax_mode)
+      => (ax.mojom.AXContentTreeUpdate snapshot);
 };
 
 // Implemented by the frame provider and currently must be associated with the
diff --git a/content/common/page_messages.h b/content/common/page_messages.h
index bab308c3..285c1517a 100644
--- a/content/common/page_messages.h
+++ b/content/common/page_messages.h
@@ -22,6 +22,7 @@
 
 // Messages sent from the browser to the renderer.
 
+// TODO(yuzus): Migrate this as a part of blink::mojom::SetPageLifecycleState.
 IPC_MESSAGE_ROUTED1(PageMsg_VisibilityChanged, content::PageVisibilityState)
 
 // Sent when the history for this page is altered from another process. The
diff --git a/content/common/render_accessibility.mojom b/content/common/render_accessibility.mojom
index 0d48a174..f0645624 100644
--- a/content/common/render_accessibility.mojom
+++ b/content/common/render_accessibility.mojom
@@ -5,6 +5,22 @@
 module content.mojom;
 
 import "ui/accessibility/mojom/ax_action_data.mojom";
+import "ui/accessibility/mojom/ax_relative_bounds.mojom";
+
+struct LocationChanges {
+  // ID of the object whose location is changing.
+  int32 id;
+
+  // The object's new location info.
+  ax.mojom.AXRelativeBounds new_location;
+};
+
+// Interface for accessibility messages sent from the renderer to the browser,
+// implemented by RenderFrameHostImpl in the browser process.
+interface RenderAccessibilityHost {
+  // Sent to update the browser of the location of accessibility objects.
+  HandleAXLocationChanges(array<LocationChanges> changes);
+};
 
 // Interface for accessibility messages sent from RenderFrameHostImpl in the
 // browser process, implemented by the RenderAccessibilityManager object in the
diff --git a/content/common/typemaps.gni b/content/common/typemaps.gni
index 48ddd889..7e051a59 100644
--- a/content/common/typemaps.gni
+++ b/content/common/typemaps.gni
@@ -3,6 +3,9 @@
 # found in the LICENSE file.
 
 typemaps = [
+  "//content/common/ax_content_node_data.typemap",
+  "//content/common/ax_content_tree_data.typemap",
+  "//content/common/ax_content_tree_update.typemap",
   "//content/common/frame_messages.typemap",
   "//content/common/input/synchronous_compositor.typemap",
   "//content/common/native_types.typemap",
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
index 0bce81c..615050e 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -1066,11 +1066,11 @@
             return;
         }
 
-        AccessibilityEvent event = buildAccessibilityEvent(virtualViewId, eventType);
-        if (event == null) return;
-
         // Check whether this type of event is one we want to throttle, and if not then send it
         if (!mEventsToThrottle.contains(eventType)) {
+            AccessibilityEvent event = buildAccessibilityEvent(virtualViewId, eventType);
+            if (event == null) return;
+
             mView.requestSendAccessibilityEvent(mView, event);
             return;
         }
@@ -1080,6 +1080,10 @@
         // to be sent immediately and record the time and clear any lingering callbacks.
         long now = Calendar.getInstance().getTimeInMillis();
         if (now - mEventLastFiredTimes.get(eventType, 0) >= ACCESSIBILITY_EVENT_DELAY) {
+            AccessibilityEvent event = buildAccessibilityEvent(virtualViewId, eventType);
+            // If accessibility is disabled or the node is invalid, returned event will be null.
+            if (event == null) return;
+
             mView.requestSendAccessibilityEvent(mView, event);
             mView.removeCallbacks(mPendingEvents.get(eventType));
             mPendingEvents.remove(eventType);
@@ -1092,12 +1096,10 @@
 
             Runnable myRunnable = () -> {
                 // We have delayed firing this event, so accessibility may not be enabled or the
-                // node may be invalid. Only fire if neither of these are the case.
-                if (isAccessibilityEnabled()
-                        && WebContentsAccessibilityImplJni.get().isNodeValid(
-                                mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) {
+                // node may be invalid, in which case build will return a null event.
+                AccessibilityEvent event = buildAccessibilityEvent(virtualViewId, eventType);
+                if (event != null) {
                     mView.requestSendAccessibilityEvent(mView, event);
-
                     // After sending event, record time it was sent
                     mEventLastFiredTimes.put(eventType, Calendar.getInstance().getTimeInMillis());
                 }
@@ -1114,10 +1116,12 @@
     }
 
     private AccessibilityEvent buildAccessibilityEvent(int virtualViewId, int eventType) {
-        // If we don't have any frame info, then the virtual hierarchy
-        // doesn't exist in the view of the Android framework, so should
-        // never send any events.
-        if (!isAccessibilityEnabled() || !isFrameInfoInitialized()) {
+        // If accessibility is disabled, node is invalid, or we don't have any frame info,
+        // then the virtual hierarchy doesn't exist in the view of the Android framework,
+        // so should never send any events.
+        if (!isAccessibilityEnabled() || !isFrameInfoInitialized()
+                || !WebContentsAccessibilityImplJni.get().isNodeValid(
+                        mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) {
             return null;
         }
 
diff --git a/content/public/browser/devtools_permission_overrides.cc b/content/public/browser/devtools_permission_overrides.cc
index eb9f4693..f7ca1a064 100644
--- a/content/public/browser/devtools_permission_overrides.cc
+++ b/content/public/browser/devtools_permission_overrides.cc
@@ -17,10 +17,12 @@
 DevToolsPermissionOverrides& DevToolsPermissionOverrides::operator=(
     DevToolsPermissionOverrides&& other) = default;
 
-void DevToolsPermissionOverrides::Set(const url::Origin& origin,
-                                      const PermissionType& permission,
-                                      const PermissionStatus status) {
-  PermissionOverrides& origin_overrides = overrides_[origin];
+void DevToolsPermissionOverrides::Set(
+    const base::Optional<url::Origin>& origin,
+    PermissionType permission,
+    const blink::mojom::PermissionStatus& status) {
+  PermissionOverrides& origin_overrides =
+      overrides_[origin.value_or(global_overrides_origin_)];
   origin_overrides[permission] = status;
 
   // Special override status - MIDI_SYSEX is stronger than MIDI, meaning that
@@ -37,29 +39,37 @@
 
 base::Optional<PermissionStatus> DevToolsPermissionOverrides::Get(
     const url::Origin& origin,
-    const PermissionType& type) const {
+    PermissionType permission) const {
   auto current_override = overrides_.find(origin);
   if (current_override == overrides_.end())
+    current_override = overrides_.find(global_overrides_origin_);
+  if (current_override == overrides_.end())
     return base::nullopt;
 
-  auto new_status = current_override->second.find(type);
-  if (new_status == current_override->second.end())
-    return base::nullopt;
-
-  return base::make_optional(new_status->second);
+  auto new_status = current_override->second.find(permission);
+  if (new_status != current_override->second.end())
+    return base::make_optional(new_status->second);
+  return base::nullopt;
 }
 
 const PermissionOverrides& DevToolsPermissionOverrides::GetAll(
-    const url::Origin& origin) const {
+    const base::Optional<url::Origin>& origin) const {
   static const base::NoDestructor<PermissionOverrides> empty_overrides;
-  auto it = overrides_.find(origin);
+  auto it = origin ? overrides_.find(*origin) : overrides_.end();
+  if (it == overrides_.end())
+    it = overrides_.find(global_overrides_origin_);
   if (it == overrides_.end())
     return *empty_overrides;
   return it->second;
 }
 
+void DevToolsPermissionOverrides::Reset(
+    const base::Optional<url::Origin>& origin) {
+  overrides_.erase(origin.value_or(global_overrides_origin_));
+}
+
 void DevToolsPermissionOverrides::GrantPermissions(
-    const url::Origin& origin,
+    const base::Optional<url::Origin>& origin,
     const std::vector<PermissionType>& permissions) {
   const std::vector<PermissionType>& kAllPermissionTypes =
       GetAllPermissionTypes();
@@ -69,14 +79,8 @@
   for (const auto& permission : permissions)
     granted_overrides[permission] = PermissionStatus::GRANTED;
   Reset(origin);
-  SetAll(origin, granted_overrides);
-}
-
-void DevToolsPermissionOverrides::SetAll(const url::Origin& origin,
-                                         const PermissionOverrides& overrides) {
-  PermissionOverrides& current_override = overrides_[origin];
-  for (const auto& setting : overrides)
-    current_override[setting.first] = setting.second;
+  for (const auto& setting : granted_overrides)
+    Set(origin, setting.first, setting.second);
 }
 
 }  // namespace content
diff --git a/content/public/browser/devtools_permission_overrides.h b/content/public/browser/devtools_permission_overrides.h
index 3095d53..8c685d0b 100644
--- a/content/public/browser/devtools_permission_overrides.h
+++ b/content/public/browser/devtools_permission_overrides.h
@@ -32,31 +32,34 @@
       base::flat_map<PermissionType, blink::mojom::PermissionStatus>;
 
   // Set permission override for |permission| at |origin| to |status|.
-  void Set(const url::Origin& origin,
-           const PermissionType& permission,
-           const blink::mojom::PermissionStatus status);
+  // Null |origin| specifies global overrides.
+  void Set(const base::Optional<url::Origin>& origin,
+           PermissionType permission,
+           const blink::mojom::PermissionStatus& status);
 
   // Get override for |origin| set for |permission|, if specified.
   base::Optional<blink::mojom::PermissionStatus> Get(
       const url::Origin& origin,
-      const PermissionType& permission) const;
+      PermissionType permission) const;
 
-  // Get all overrides for particular |origin|, stored in |overrides| if found.
-  // Will return empty overrides if none previously existed.
-  const PermissionOverrides& GetAll(const url::Origin& origin) const;
+  // Get all overrides for particular |origin|, stored in |overrides|
+  // if found. Will return empty overrides if none previously existed. Returns
+  // global overrides when |origin| is nullptr.
+  const PermissionOverrides& GetAll(
+      const base::Optional<url::Origin>& origin) const;
 
   // Resets overrides for |origin|.
-  void Reset(const url::Origin& origin) { overrides_.erase(origin); }
+  // Null |origin| resets global overrides.
+  void Reset(const base::Optional<url::Origin>& origin);
 
-  // Sets status for |permissions| to GRANTED in |origin|, and DENIED for all
-  // others.
-  void GrantPermissions(const url::Origin& origin,
+  // Sets status for |permissions| to GRANTED in |origin|, and DENIED
+  // for all others.
+  // Null |origin| grants permissions globally for context.
+  void GrantPermissions(const base::Optional<url::Origin>& origin,
                         const std::vector<PermissionType>& permissions);
 
  private:
-  // Insert/adds every entry of |overrides| to |origin|'s overrides.
-  void SetAll(const url::Origin& origin, const PermissionOverrides& overrides);
-
+  url::Origin global_overrides_origin_;
   base::flat_map<url::Origin, PermissionOverrides> overrides_;
 };
 
diff --git a/content/public/browser/permission_controller_delegate.cc b/content/public/browser/permission_controller_delegate.cc
index cd833f2..d2dc1935 100644
--- a/content/public/browser/permission_controller_delegate.cc
+++ b/content/public/browser/permission_controller_delegate.cc
@@ -8,7 +8,7 @@
 
 bool PermissionControllerDelegate::IsPermissionOverridableByDevTools(
     PermissionType permission,
-    const url::Origin& origin) {
+    const base::Optional<url::Origin>& origin) {
   return true;
 }
 
diff --git a/content/public/browser/permission_controller_delegate.h b/content/public/browser/permission_controller_delegate.h
index fed32f8..e47de2a 100644
--- a/content/public/browser/permission_controller_delegate.h
+++ b/content/public/browser/permission_controller_delegate.h
@@ -100,7 +100,7 @@
   // are tracked by the delegate. This method should only be called by the
   // PermissionController owning the delegate.
   virtual void SetPermissionOverridesForDevTools(
-      const url::Origin& origin,
+      const base::Optional<url::Origin>& origin,
       const PermissionOverrides& overrides) {}
 
   // Removes overrides that have been set, if any, for all origins. If delegate
@@ -109,8 +109,9 @@
 
   // Returns whether permission can be overridden by
   // DevToolsPermissionOverrides.
-  virtual bool IsPermissionOverridableByDevTools(PermissionType permission,
-                                                 const url::Origin& origin);
+  virtual bool IsPermissionOverridableByDevTools(
+      PermissionType permission,
+      const base::Optional<url::Origin>& origin);
 };
 
 }  // namespace content
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index 423c32b..e512760 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -622,7 +622,7 @@
 }
 
 bool NavigateIframeToURL(WebContents* web_contents,
-                         std::string iframe_id,
+                         const std::string& iframe_id,
                          const GURL& url) {
   std::string script = base::StringPrintf(
       "setTimeout(\""
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h
index 123f31b..160f61e 100644
--- a/content/public/test/browser_test_utils.h
+++ b/content/public/test/browser_test_utils.h
@@ -133,7 +133,7 @@
 // finishes.  Uses a renderer-initiated navigation from script code in the
 // main frame.
 bool NavigateIframeToURL(WebContents* web_contents,
-                         std::string iframe_id,
+                         const std::string& iframe_id,
                          const GURL& url);
 
 // Generate a URL for a file path including a query string.
@@ -385,7 +385,7 @@
 bool IsWebcamAvailableOnSystem(WebContents* web_contents);
 
 // Allow ExecuteScript* methods to target either a WebContents or a
-// RenderFrameHost.  Targetting a WebContents means executing the script in the
+// RenderFrameHost.  Targeting a WebContents means executing the script in the
 // RenderFrameHost returned by WebContents::GetMainFrame(), which is the main
 // frame.  Pass a specific RenderFrameHost to target it. Embedders may declare
 // additional ConvertToRenderFrameHost functions for convenience.
diff --git a/content/public/test/test_service.cc b/content/public/test/test_service.cc
index 4497f375..7aecbcd 100644
--- a/content/public/test/test_service.cc
+++ b/content/public/test/test_service.cc
@@ -57,8 +57,21 @@
   std::move(callback).Run(requestor_name_);
 }
 
-void TestService::CreateSharedBuffer(const std::string& message,
-                                     CreateSharedBufferCallback callback) {
+void TestService::CreateReadOnlySharedMemoryRegion(
+    const std::string& message,
+    CreateReadOnlySharedMemoryRegionCallback callback) {
+  NOTREACHED();
+}
+
+void TestService::CreateWritableSharedMemoryRegion(
+    const std::string& message,
+    CreateWritableSharedMemoryRegionCallback callback) {
+  NOTREACHED();
+}
+
+void TestService::CreateUnsafeSharedMemoryRegion(
+    const std::string& message,
+    CreateUnsafeSharedMemoryRegionCallback callback) {
   NOTREACHED();
 }
 
diff --git a/content/public/test/test_service.h b/content/public/test/test_service.h
index 3710c54..1bd344b 100644
--- a/content/public/test/test_service.h
+++ b/content/public/test/test_service.h
@@ -41,8 +41,15 @@
   void DoCrashImmediately(DoCrashImmediatelyCallback callback) override;
   void CreateFolder(CreateFolderCallback callback) override;
   void GetRequestorName(GetRequestorNameCallback callback) override;
-  void CreateSharedBuffer(const std::string& message,
-                          CreateSharedBufferCallback callback) override;
+  void CreateReadOnlySharedMemoryRegion(
+      const std::string& message,
+      CreateReadOnlySharedMemoryRegionCallback callback) override;
+  void CreateWritableSharedMemoryRegion(
+      const std::string& message,
+      CreateWritableSharedMemoryRegionCallback callback) override;
+  void CreateUnsafeSharedMemoryRegion(
+      const std::string& message,
+      CreateUnsafeSharedMemoryRegionCallback callback) override;
 
   service_manager::ServiceBinding service_binding_;
   service_manager::BinderRegistry registry_;
diff --git a/content/public/test/test_service.mojom b/content/public/test/test_service.mojom
index 166e45e..3580ebd9 100644
--- a/content/public/test/test_service.mojom
+++ b/content/public/test/test_service.mojom
@@ -4,6 +4,8 @@
 
 module content.mojom;
 
+import "mojo/public/mojom/base/shared_memory.mojom";
+
 interface TestService {
   // Doesn't actually do anything, just responds.
   DoSomething() => ();
@@ -22,7 +24,21 @@
   // Retrieve the requestor name as seen by the test app providing this service.
   GetRequestorName() => (string name);
 
-  // Requests that a new shared buffer be created and returned. If successful,
-  // |buffer| is non-null and its contents match |message|'s bytes exactly.
-  CreateSharedBuffer(string message) => (handle<shared_buffer>? buffer);
+  // Requests that a new read-only shared memory region be created and
+  // returned. On success, |region| is valid and its contents match |message|'s
+  // bytes exactly.
+  CreateReadOnlySharedMemoryRegion(string message)
+      => (mojo_base.mojom.ReadOnlySharedMemoryRegion? region);
+
+  // Requests that a new writable shared memory region be created and
+  // returned. On success, |region| is valid and its contents match |message|'s
+  // bytes exactly.
+  CreateWritableSharedMemoryRegion(string message)
+      => (mojo_base.mojom.WritableSharedMemoryRegion? region);
+
+  // Requests that a new unsafe shared memory region be created and returned.
+  // On success, |region| is valid and its contents match |message|'s bytes
+  // exactly.
+  CreateUnsafeSharedMemoryRegion(string message)
+      => (mojo_base.mojom.UnsafeSharedMemoryRegion? region);
 };
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc
index 159469f..b1086d9 100644
--- a/content/renderer/accessibility/blink_ax_tree_source.cc
+++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -15,7 +15,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "content/common/accessibility_messages.h"
 #include "content/public/common/content_features.h"
 #include "content/renderer/accessibility/ax_image_annotator.h"
 #include "content/renderer/accessibility/blink_ax_enum_conversion.h"
@@ -1135,10 +1134,8 @@
 
     // Frames and iframes.
     WebFrame* frame = WebFrame::FromFrameOwnerElement(element);
-    if (frame) {
-      dst->AddContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID,
-                                  RenderFrame::GetRoutingIdForWebFrame(frame));
-    }
+    if (frame)
+      dst->child_routing_id = RenderFrame::GetRoutingIdForWebFrame(frame);
   }
 
   // Add the ids of *indirect* children - those who are children of this node,
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index fee479db..8d85936 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -26,6 +26,7 @@
 #include "content/renderer/accessibility/ax_image_annotator.h"
 #include "content/renderer/accessibility/blink_ax_action_target.h"
 #include "content/renderer/accessibility/blink_ax_enum_conversion.h"
+#include "content/renderer/accessibility/render_accessibility_manager.h"
 #include "content/renderer/render_frame_impl.h"
 #include "content/renderer/render_frame_proxy.h"
 #include "content/renderer/render_view_impl.h"
@@ -174,9 +175,12 @@
   snapshotter.SnapshotContentTree(ax_mode, kMaxSnapshotNodeCount, response);
 }
 
-RenderAccessibilityImpl::RenderAccessibilityImpl(RenderFrameImpl* render_frame,
-                                                 ui::AXMode mode)
+RenderAccessibilityImpl::RenderAccessibilityImpl(
+    RenderAccessibilityManager* const render_accessibility_manager,
+    RenderFrameImpl* const render_frame,
+    ui::AXMode mode)
     : RenderFrameObserver(render_frame),
+      render_accessibility_manager_(render_accessibility_manager),
       render_frame_(render_frame),
       tree_source_(render_frame, mode),
       serializer_(&tree_source_),
@@ -812,7 +816,7 @@
 void RenderAccessibilityImpl::SendLocationChanges() {
   TRACE_EVENT0("accessibility", "RenderAccessibilityImpl::SendLocationChanges");
 
-  std::vector<AccessibilityHostMsg_LocationChangeParams> messages;
+  std::vector<mojom::LocationChangesPtr> changes;
 
   // Update layout on the root of the tree.
   WebAXObject root = tree_source_.GetRoot();
@@ -846,12 +850,8 @@
     if (!container_transform.isIdentity())
       new_location.transform = base::WrapUnique(
           new gfx::Transform(container_transform));
-    if (iter->second != new_location) {
-      AccessibilityHostMsg_LocationChangeParams message;
-      message.id = id;
-      message.new_location = new_location;
-      messages.push_back(message);
-    }
+    if (iter->second != new_location)
+      changes.push_back(mojom::LocationChanges::New(id, new_location));
 
     // Save the new location.
     new_locations[id] = new_location;
@@ -864,7 +864,7 @@
   }
   locations_.swap(new_locations);
 
-  Send(new AccessibilityHostMsg_LocationChanges(routing_id(), messages));
+  render_accessibility_manager_->HandleLocationChanges(std::move(changes));
 }
 
 void RenderAccessibilityImpl::OnEventsAck(int ack_token) {
@@ -897,10 +897,10 @@
   AXContentNodeData data;
   ScopedFreezeBlinkAXTreeSource freeze(&tree_source_);
   tree_source_.SerializeNode(obj, &data);
-  if (data.HasContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID)) {
+  if (data.child_routing_id != MSG_ROUTING_NONE) {
     gfx::Point transformed_point = point;
-    bool is_remote_frame = RenderFrameProxy::FromRoutingID(
-        data.GetContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID));
+    bool is_remote_frame =
+        RenderFrameProxy::FromRoutingID(data.child_routing_id);
     if (is_remote_frame) {
       // Remote frames don't have access to the information from the visual
       // viewport regarding the visual viewport offset, so we adjust the
@@ -917,8 +917,7 @@
     }
     Send(new AccessibilityHostMsg_ChildFrameHitTestResult(
         routing_id(), action_request_id, transformed_point,
-        data.GetContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID), 0,
-        event_to_fire));
+        data.child_routing_id, 0, event_to_fire));
     return;
   }
 
@@ -1019,13 +1018,13 @@
   if (!render_frame_)
     return;
   mojo::PendingRemote<image_annotation::mojom::Annotator> annotator;
-  render_frame()->GetBrowserInterfaceBroker()->GetInterface(
+  render_frame_->GetBrowserInterfaceBroker()->GetInterface(
       annotator.InitWithNewPipeAndPassReceiver());
 
   const std::string preferred_language =
-      render_frame()->render_view()
+      render_frame_->render_view()
           ? GetPreferredLanguage(
-                render_frame()->render_view()->GetAcceptLanguages())
+                render_frame_->render_view()->GetAcceptLanguages())
           : std::string();
   ax_image_annotator_ = std::make_unique<AXImageAnnotator>(
       this, preferred_language, std::move(annotator));
diff --git a/content/renderer/accessibility/render_accessibility_impl.h b/content/renderer/accessibility/render_accessibility_impl.h
index 71ef56e0..3e16e83 100644
--- a/content/renderer/accessibility/render_accessibility_impl.h
+++ b/content/renderer/accessibility/render_accessibility_impl.h
@@ -12,6 +12,7 @@
 #include "base/memory/weak_ptr.h"
 #include "content/common/ax_content_node_data.h"
 #include "content/common/content_export.h"
+#include "content/common/render_accessibility.mojom.h"
 #include "content/public/renderer/plugin_ax_tree_source.h"
 #include "content/public/renderer/render_accessibility.h"
 #include "content/public/renderer/render_frame.h"
@@ -39,6 +40,7 @@
 
 class AXImageAnnotator;
 class RenderFrameImpl;
+class RenderAccessibilityManager;
 
 using BlinkAXTreeSerializer = ui::
     AXTreeSerializer<blink::WebAXObject, AXContentNodeData, AXContentTreeData>;
@@ -67,27 +69,28 @@
   AXTreeSnapshotterImpl& operator=(const AXTreeSnapshotterImpl&) = delete;
 };
 
-// The browser process implements native accessibility APIs, allowing
-// assistive technology (e.g., screen readers, magnifiers) to access and
-// control the web contents with high-level APIs. These APIs are also used
-// by automation tools, and Windows 8 uses them to determine when the
-// on-screen keyboard should be shown.
+// The browser process implements native accessibility APIs, allowing assistive
+// technology (e.g., screen readers, magnifiers) to access and control the web
+// contents with high-level APIs. These APIs are also used by automation tools,
+// and Windows 8 uses them to determine when the on-screen keyboard should be
+// shown.
 //
-// An instance of this class belongs to RenderFrameImpl. Accessibility is
-// initialized based on the ui::AXMode of RenderFrameImpl; it lazily
-// starts as Off or EditableTextOnly depending on the operating system, and
-// switches to Complete if assistive technology is detected or a flag is set.
+// An instance of this class belongs to the RenderAccessibilityManager object.
+// Accessibility is initialized based on the ui::AXMode passed from the browser
+// process to the manager object; it lazily starts as Off or EditableTextOnly
+// depending on the operating system, and switches to Complete if assistive
+// technology is detected or a flag is set.
 //
 // A tree of accessible objects is built here and sent to the browser process;
-// the browser process maintains this as a tree of platform-native
-// accessible objects that can be used to respond to accessibility requests
-// from other processes.
+// the browser process maintains this as a tree of platform-native accessible
+// objects that can be used to respond to accessibility requests from other
+// processes.
 //
 // This class implements complete accessibility support for assistive
 // technology. It turns on Blink's accessibility code and sends a serialized
 // representation of that tree whenever it changes. It also handles requests
-// from the browser to perform accessibility actions on nodes in the tree
-// (e.g., change focus, or click on a button).
+// from the browser to perform accessibility actions on nodes in the tree (e.g.,
+// change focus, or click on a button).
 class CONTENT_EXPORT RenderAccessibilityImpl
     : public RenderAccessibility,
       public RenderFrameObserver,
@@ -99,11 +102,12 @@
                                         AXContentTreeUpdate* response,
                                         ui::AXMode ax_mode);
 
-  RenderAccessibilityImpl(RenderFrameImpl* const render_frame, ui::AXMode mode);
+  RenderAccessibilityImpl(
+      RenderAccessibilityManager* const render_accessibility_manager,
+      RenderFrameImpl* const render_frame,
+      ui::AXMode mode);
   ~RenderAccessibilityImpl() override;
 
-  RenderFrameImpl* render_frame() { return render_frame_; }
-
   ui::AXMode GetAccessibilityMode() {
     return tree_source_.accessibility_mode();
   }
@@ -194,7 +198,10 @@
   // Returns the document for the active popup if any.
   blink::WebDocument GetPopupDocument();
 
-  // The RenderFrameImpl that owns us.
+  // The RenderAccessibilityManager that owns us.
+  RenderAccessibilityManager* render_accessibility_manager_;
+
+  // The associated RenderFrameImpl by means of the RenderAccessibilityManager.
   RenderFrameImpl* render_frame_;
 
   // This keeps accessibility enabled as long as it lives.
diff --git a/content/renderer/accessibility/render_accessibility_manager.cc b/content/renderer/accessibility/render_accessibility_manager.cc
index 56258b5..115b897 100644
--- a/content/renderer/accessibility/render_accessibility_manager.cc
+++ b/content/renderer/accessibility/render_accessibility_manager.cc
@@ -49,8 +49,8 @@
 
   if (new_mode.has_mode(ui::AXMode::kWebContents) &&
       !old_mode.has_mode(ui::AXMode::kWebContents)) {
-    render_accessibility_ =
-        std::make_unique<RenderAccessibilityImpl>(render_frame_, new_mode);
+    render_accessibility_ = std::make_unique<RenderAccessibilityImpl>(
+        this, render_frame_, new_mode);
   } else if (!new_mode.has_mode(ui::AXMode::kWebContents) &&
              old_mode.has_mode(ui::AXMode::kWebContents)) {
     render_accessibility_.reset();
@@ -78,4 +78,19 @@
   render_accessibility_->Reset(reset_token);
 }
 
+void RenderAccessibilityManager::HandleLocationChanges(
+    std::vector<mojom::LocationChangesPtr> changes) {
+  GetOrCreateRemoteRenderAccessibilityHost()->HandleAXLocationChanges(
+      std::move(changes));
+}
+
+mojo::AssociatedRemote<mojom::RenderAccessibilityHost>&
+RenderAccessibilityManager::GetOrCreateRemoteRenderAccessibilityHost() {
+  if (!render_accessibility_host_) {
+    render_frame_->GetRemoteAssociatedInterfaces()->GetInterface(
+        &render_accessibility_host_);
+  }
+  return render_accessibility_host_;
+}
+
 }  // namespace content
diff --git a/content/renderer/accessibility/render_accessibility_manager.h b/content/renderer/accessibility/render_accessibility_manager.h
index e2f23d5..7f87facd 100644
--- a/content/renderer/accessibility/render_accessibility_manager.h
+++ b/content/renderer/accessibility/render_accessibility_manager.h
@@ -11,6 +11,7 @@
 #include "content/common/content_export.h"
 #include "content/common/render_accessibility.mojom.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_mode.h"
@@ -59,7 +60,15 @@
   void PerformAction(const ui::AXActionData& data) override;
   void Reset(int32_t reset_token) override;
 
+  // Communication with the browser process.
+  void HandleLocationChanges(std::vector<mojom::LocationChangesPtr> changes);
+
  private:
+  // Returns the associated remote used to send messages to the browser process,
+  // lazily initializing it the first time it's used.
+  mojo::AssociatedRemote<mojom::RenderAccessibilityHost>&
+  GetOrCreateRemoteRenderAccessibilityHost();
+
   // The RenderFrameImpl that owns us.
   RenderFrameImpl* render_frame_;
 
@@ -69,6 +78,10 @@
   // Endpoint to receive and handle messages from the browser process.
   mojo::AssociatedReceiver<mojom::RenderAccessibility> receiver_{this};
 
+  // Endpoint to send messages to the browser process.
+  mojo::AssociatedRemote<mojom::RenderAccessibilityHost>
+      render_accessibility_host_;
+
   DISALLOW_COPY_AND_ASSIGN(RenderAccessibilityManager);
 };
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index b5e1542..e65c52f5 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -49,7 +49,6 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "cc/base/switches.h"
-#include "content/common/accessibility_messages.h"
 #include "content/common/associated_interfaces.mojom.h"
 #include "content/common/content_constants_internal.h"
 #include "content/common/content_navigation_policy.h"
@@ -2181,8 +2180,6 @@
     IPC_MESSAGE_HANDLER(FrameMsg_VisualStateRequest,
                         OnVisualStateRequest)
     IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload)
-    IPC_MESSAGE_HANDLER(AccessibilityMsg_SnapshotTree,
-                        OnSnapshotAccessibilityTree)
     IPC_MESSAGE_HANDLER(FrameMsg_UpdateOpener, OnUpdateOpener)
     IPC_MESSAGE_HANDLER(FrameMsg_AdvanceFocus, OnAdvanceFocus)
     IPC_MESSAGE_HANDLER(FrameMsg_GetSavableResourceLinks,
@@ -2603,14 +2600,6 @@
       std::make_unique<FrameHostMsg_VisualStateResponse>(routing_id_, id));
 }
 
-void RenderFrameImpl::OnSnapshotAccessibilityTree(int callback_id,
-                                                  ui::AXMode ax_mode) {
-  AXContentTreeUpdate response;
-  RenderAccessibilityImpl::SnapshotAccessibilityTree(this, &response, ax_mode);
-  Send(new AccessibilityHostMsg_SnapshotResponse(
-      routing_id_, callback_id, response));
-}
-
 void RenderFrameImpl::OnPortalActivated(
     const base::UnguessableToken& portal_token,
     mojo::PendingAssociatedRemote<blink::mojom::Portal> portal,
@@ -2665,6 +2654,15 @@
       static_cast<cc::BrowserControlsState>(current), animate);
 }
 
+void RenderFrameImpl::SnapshotAccessibilityTree(
+    uint32_t ax_mode,
+    SnapshotAccessibilityTreeCallback callback) {
+  AXContentTreeUpdate response;
+  RenderAccessibilityImpl::SnapshotAccessibilityTree(this, &response,
+                                                     ui::AXMode(ax_mode));
+  std::move(callback).Run(response);
+}
+
 #if defined(OS_ANDROID)
 void RenderFrameImpl::ExtractSmartClipData(
     const gfx::Rect& rect,
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 15005470..aab87eff 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -508,6 +508,9 @@
   void UpdateBrowserControlsState(BrowserControlsState constraints,
                                   BrowserControlsState current,
                                   bool animate) override;
+  void SnapshotAccessibilityTree(
+      uint32_t ax_mode,
+      SnapshotAccessibilityTreeCallback callback) override;
 
 #if defined(OS_ANDROID)
   void ExtractSmartClipData(
@@ -1036,7 +1039,6 @@
   void OnVisualStateRequest(uint64_t key);
   // TODO(https://crbug.com/995428): Deprecated.
   void OnReload();
-  void OnSnapshotAccessibilityTree(int callback_id, ui::AXMode ax_mode);
   void OnUpdateOpener(int opener_routing_id);
   void OnAdvanceFocus(blink::mojom::FocusType type, int32_t source_routing_id);
   void OnGetSavableResourceLinks();
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc
index cad3bfce..5995562 100644
--- a/content/renderer/render_frame_impl_browsertest.cc
+++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -533,7 +533,8 @@
   frame_widget()->OnMessageReceived(set_viewport_intersection_message);
   // Setting a new frame intersection in a local frame triggers the render frame
   // observer call.
-  EXPECT_EQ(observer.last_intersection_rect(), blink::WebRect(0, 0, 200, 140));
+  EXPECT_EQ(observer.last_intersection_rect(),
+            blink::WebRect(7, -11, 200, 140));
 }
 
 // Used to annotate the source of an interface request.
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 1591ba9..1e698fb9 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -212,21 +212,6 @@
   RenderWidget* render_widget_;
 };
 
-class ScopedUkmRafAlignedInputTimer {
- public:
-  explicit ScopedUkmRafAlignedInputTimer(blink::WebWidget* webwidget)
-      : webwidget_(webwidget) {
-    webwidget_->BeginRafAlignedInput();
-  }
-
-  ~ScopedUkmRafAlignedInputTimer() { webwidget_->EndRafAlignedInput(); }
-
- private:
-  blink::WebWidget* webwidget_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedUkmRafAlignedInputTimer);
-};
-
 bool IsDateTimeInput(ui::TextInputType type) {
   return type == ui::TEXT_INPUT_TYPE_DATE ||
          type == ui::TEXT_INPUT_TYPE_DATE_TIME ||
@@ -1164,22 +1149,13 @@
 
 void RenderWidget::BeginMainFrame(base::TimeTicks frame_time) {
   DCHECK(!IsForProvisionalFrame());
-
-  // We record metrics only when running in multi-threaded mode, not
-  // single-thread mode for testing.
-  bool record_main_frame_metrics =
-      !!compositor_deps_->GetCompositorImplThreadTaskRunner();
-  {
-    base::Optional<ScopedUkmRafAlignedInputTimer> ukm_timer;
-    if (record_main_frame_metrics) {
-      ukm_timer.emplace(GetWebWidget());
-    }
-    input_event_queue_->DispatchRafAlignedInput(frame_time);
-  }
-
   GetWebWidget()->BeginFrame(frame_time);
 }
 
+void RenderWidget::DispatchRafAlignedInput(base::TimeTicks frame_time) {
+  input_event_queue_->DispatchRafAlignedInput(frame_time);
+}
+
 void RenderWidget::OnDeferMainFrameUpdatesChanged(bool deferral_state) {
   // LayerTreeHost::CreateThreaded() will defer main frame updates immediately
   // until it gets a LocalSurfaceIdAllocation. That's before the
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 536a1e2..7c9455e 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -429,6 +429,7 @@
                                   bool is_pinch_gesture_active,
                                   float minimum,
                                   float maximum) override;
+  void DispatchRafAlignedInput(base::TimeTicks frame_time) override;
   void RequestDecode(const cc::PaintImage& image,
                      base::OnceCallback<void(bool)> callback) override;
   void NotifySwapTime(blink::WebReportTimeCallback callback) override;
diff --git a/content/shell/renderer/shell_content_renderer_client.cc b/content/shell/renderer/shell_content_renderer_client.cc
index d96ad800..194a43c 100644
--- a/content/shell/renderer/shell_content_renderer_client.cc
+++ b/content/shell/renderer/shell_content_renderer_client.cc
@@ -86,8 +86,21 @@
     std::move(callback).Run("Not implemented.");
   }
 
-  void CreateSharedBuffer(const std::string& message,
-                          CreateSharedBufferCallback callback) override {
+  void CreateReadOnlySharedMemoryRegion(
+      const std::string& message,
+      CreateReadOnlySharedMemoryRegionCallback callback) override {
+    NOTREACHED();
+  }
+
+  void CreateWritableSharedMemoryRegion(
+      const std::string& message,
+      CreateWritableSharedMemoryRegionCallback callback) override {
+    NOTREACHED();
+  }
+
+  void CreateUnsafeSharedMemoryRegion(
+      const std::string& message,
+      CreateUnsafeSharedMemoryRegionCallback callback) override {
     NOTREACHED();
   }
 
diff --git a/content/shell/utility/shell_content_utility_client.cc b/content/shell/utility/shell_content_utility_client.cc
index ea46a70..62382f3 100644
--- a/content/shell/utility/shell_content_utility_client.cc
+++ b/content/shell/utility/shell_content_utility_client.cc
@@ -9,8 +9,13 @@
 
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/containers/span.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ptr_util.h"
+#include "base/memory/read_only_shared_memory_region.h"
+#include "base/memory/shared_memory_mapping.h"
+#include "base/memory/unsafe_shared_memory_region.h"
+#include "base/memory/writable_shared_memory_region.h"
 #include "base/no_destructor.h"
 #include "base/process/process.h"
 #include "build/build_config.h"
@@ -67,18 +72,39 @@
     NOTREACHED();
   }
 
-  void CreateSharedBuffer(const std::string& message,
-                          CreateSharedBufferCallback callback) override {
-    mojo::ScopedSharedBufferHandle buffer =
-        mojo::SharedBufferHandle::Create(message.size());
-    CHECK(buffer.is_valid());
-
-    mojo::ScopedSharedBufferMapping mapping = buffer->Map(message.size());
-    CHECK(mapping);
+  void CreateReadOnlySharedMemoryRegion(
+      const std::string& message,
+      CreateReadOnlySharedMemoryRegionCallback callback) override {
+    base::MappedReadOnlyRegion map_and_region =
+        base::ReadOnlySharedMemoryRegion::Create(message.size());
+    CHECK(map_and_region.IsValid());
     std::copy(message.begin(), message.end(),
-              reinterpret_cast<char*>(mapping.get()));
+              map_and_region.mapping.GetMemoryAsSpan<char>().begin());
+    std::move(callback).Run(std::move(map_and_region.region));
+  }
 
-    std::move(callback).Run(std::move(buffer));
+  void CreateWritableSharedMemoryRegion(
+      const std::string& message,
+      CreateWritableSharedMemoryRegionCallback callback) override {
+    auto region = base::WritableSharedMemoryRegion::Create(message.size());
+    CHECK(region.IsValid());
+    base::WritableSharedMemoryMapping mapping = region.Map();
+    CHECK(mapping.IsValid());
+    std::copy(message.begin(), message.end(),
+              mapping.GetMemoryAsSpan<char>().begin());
+    std::move(callback).Run(std::move(region));
+  }
+
+  void CreateUnsafeSharedMemoryRegion(
+      const std::string& message,
+      CreateUnsafeSharedMemoryRegionCallback callback) override {
+    auto region = base::UnsafeSharedMemoryRegion::Create(message.size());
+    CHECK(region.IsValid());
+    base::WritableSharedMemoryMapping mapping = region.Map();
+    CHECK(mapping.IsValid());
+    std::copy(message.begin(), message.end(),
+              mapping.GetMemoryAsSpan<char>().begin());
+    std::move(callback).Run(std::move(region));
   }
 
  private:
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 3311cd3..43ff60c 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -587,9 +587,9 @@
   group("fuchsia_telemetry_gpu_integration_test") {
     testonly = true
     deps = [
+      ":telemetry_gpu_integration_test_scripts_only",
       "//fuchsia/engine:web_engine_runner",
       "//fuchsia/engine:web_engine_shell",
-      "//tools/perf/chrome_telemetry_build:telemetry_chrome_test_without_chrome",
     ]
   }
 }
@@ -600,7 +600,13 @@
     "//tools/perf/chrome_telemetry_build:telemetry_chrome_test_without_chrome",
   ]
 
-  data = [ "//content/test/gpu/" ]
+  data = [
+    "//content/test/gpu/",
+    "//testing/scripts/run_isolated_script_test.py",
+    "//testing/scripts/common.py",
+    "//testing/xvfb.py",
+    "//testing/test_env.py",
+  ]
 }
 
 # browsertest_support can be used by targets that run content_shell based
@@ -671,7 +677,10 @@
     "frame_host_test_interface.mojom",
     "test_browser_associated_interfaces.mojom",
   ]
-  public_deps = [ "//url/mojom:url_mojom_gurl" ]
+  public_deps = [
+    "//mojo/public/mojom/base",
+    "//url/mojom:url_mojom_gurl",
+  ]
 }
 
 mojom("web_ui_test_mojo_bindings") {
@@ -1012,6 +1021,7 @@
     "../browser/renderer_host/input/wheel_event_listener_browsertest.cc",
     "../browser/renderer_host/input/wheel_scroll_latching_browsertest.cc",
     "../browser/renderer_host/media/video_capture_browsertest.cc",
+    "../browser/renderer_host/page_lifecycle_state_manager_browsertest.cc",
     "../browser/renderer_host/panel_rotation_browsertest.cc",
     "../browser/renderer_host/render_process_host_browsertest.cc",
     "../browser/renderer_host/render_view_host_browsertest.cc",
diff --git a/device/fido/fido_request_handler_base.cc b/device/fido/fido_request_handler_base.cc
index 431f39d2..a124609 100644
--- a/device/fido/fido_request_handler_base.cc
+++ b/device/fido/fido_request_handler_base.cc
@@ -12,7 +12,10 @@
 #include "base/logging.h"
 #include "base/strings/string_piece.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "base/time/time.h"
+#include "base/timer/elapsed_timer.h"
 #include "build/build_config.h"
+#include "components/device_event_log/device_event_log.h"
 #include "device/fido/ble_adapter_manager.h"
 #include "device/fido/fido_authenticator.h"
 #include "device/fido/fido_discovery_factory.h"
@@ -21,8 +24,23 @@
 #include "device/fido/win/authenticator.h"
 #endif
 
+namespace {
+// Authenticators that return a response in less than this time are likely to
+// have done so without interaction from the user.
+static const base::TimeDelta kMinExpectedAuthenticatorResponseTime =
+    base::TimeDelta::FromMilliseconds(300);
+}  // namespace
+
 namespace device {
 
+// FidoRequestHandlerBase::AuthenticatorState ---------------------------------
+
+FidoRequestHandlerBase::AuthenticatorState::AuthenticatorState(
+    FidoAuthenticator* authenticator)
+    : authenticator(authenticator) {}
+
+FidoRequestHandlerBase::AuthenticatorState::~AuthenticatorState() = default;
+
 // FidoRequestHandlerBase::TransportAvailabilityInfo --------------------------
 
 FidoRequestHandlerBase::TransportAvailabilityInfo::TransportAvailabilityInfo() =
@@ -154,7 +172,7 @@
   if (authenticator_it == active_authenticators_.end())
     return;
 
-  InitializeAuthenticatorAndDispatchRequest(authenticator_it->second);
+  InitializeAuthenticatorAndDispatchRequest(authenticator_it->second.get());
 }
 
 void FidoRequestHandlerBase::CancelActiveAuthenticators(
@@ -164,7 +182,7 @@
     DCHECK(!task_it->first.empty());
     if (task_it->first != exclude_device_id) {
       DCHECK(task_it->second);
-      task_it->second->Cancel();
+      task_it->second->authenticator->Cancel();
 
       // Note that the pointer being erased is non-owning. The actual
       // FidoAuthenticator instance is owned by its discovery (which in turn is
@@ -229,6 +247,20 @@
     discovery->Start();
 }
 
+bool FidoRequestHandlerBase::AuthenticatorMayHaveReturnedImmediately(
+    const std::string& authenticator_id) {
+  auto it = active_authenticators_.find(authenticator_id);
+  if (it == active_authenticators_.end())
+    return false;
+
+  if (!it->second->timer)
+    return true;
+
+  FIDO_LOG(DEBUG) << "Authenticator returned in "
+                  << it->second->timer->Elapsed();
+  return it->second->timer->Elapsed() < kMinExpectedAuthenticatorResponseTime;
+}
+
 void FidoRequestHandlerBase::AuthenticatorRemoved(
     FidoDiscoveryBase* discovery,
     FidoAuthenticator* authenticator) {
@@ -271,7 +303,8 @@
 
   if (observer_) {
     observer_->FidoAuthenticatorPairingModeChanged(
-        device_id, is_in_pairing_mode, it->second->GetDisplayName());
+        device_id, is_in_pairing_mode,
+        it->second->authenticator->GetDisplayName());
   }
 }
 
@@ -296,7 +329,11 @@
     FidoAuthenticator* authenticator) {
   DCHECK(authenticator &&
          !base::Contains(active_authenticators(), authenticator->GetId()));
-  active_authenticators_.emplace(authenticator->GetId(), authenticator);
+  auto authenticator_state =
+      std::make_unique<AuthenticatorState>(authenticator);
+  auto* weak_authenticator_state = authenticator_state.get();
+  active_authenticators_.emplace(authenticator->GetId(),
+                                 std::move(authenticator_state));
 
   // If |observer_| exists, dispatching request to |authenticator| is
   // delegated to |observer_|. Else, dispatch request to |authenticator|
@@ -318,7 +355,7 @@
         FROM_HERE,
         base::BindOnce(
             &FidoRequestHandlerBase::InitializeAuthenticatorAndDispatchRequest,
-            GetWeakPtr(), authenticator));
+            GetWeakPtr(), weak_authenticator_state));
   } else {
     VLOG(2) << "Embedder controls the dispatch.";
   }
@@ -347,10 +384,11 @@
 }
 
 void FidoRequestHandlerBase::InitializeAuthenticatorAndDispatchRequest(
-    FidoAuthenticator* authenticator) {
-  authenticator->InitializeAuthenticator(
-      base::BindOnce(&FidoRequestHandlerBase::DispatchRequest,
-                     weak_factory_.GetWeakPtr(), authenticator));
+    AuthenticatorState* authenticator_state) {
+  authenticator_state->timer = std::make_unique<base::ElapsedTimer>();
+  authenticator_state->authenticator->InitializeAuthenticator(base::BindOnce(
+      &FidoRequestHandlerBase::DispatchRequest, weak_factory_.GetWeakPtr(),
+      authenticator_state->authenticator));
 }
 
 void FidoRequestHandlerBase::ConstructBleAdapterPowerManager() {
diff --git a/device/fido/fido_request_handler_base.h b/device/fido/fido_request_handler_base.h
index 87c75e0e..1a183011 100644
--- a/device/fido/fido_request_handler_base.h
+++ b/device/fido/fido_request_handler_base.h
@@ -25,6 +25,10 @@
 #include "device/fido/fido_discovery_base.h"
 #include "device/fido/fido_transport_protocol.h"
 
+namespace base {
+class ElapsedTimer;
+}
+
 namespace device {
 
 class BleAdapterManager;
@@ -39,8 +43,6 @@
 class COMPONENT_EXPORT(DEVICE_FIDO) FidoRequestHandlerBase
     : public FidoDiscoveryBase::Observer {
  public:
-  using AuthenticatorMap =
-      std::map<std::string, FidoAuthenticator*, std::less<>>;
   using RequestCallback = base::RepeatingCallback<void(const std::string&)>;
   using BlePairingCallback =
       base::RepeatingCallback<void(std::string authenticator_id,
@@ -50,6 +52,17 @@
 
   enum class RequestType { kMakeCredential, kGetAssertion };
 
+  struct AuthenticatorState {
+    explicit AuthenticatorState(FidoAuthenticator* authenticator);
+    ~AuthenticatorState();
+
+    FidoAuthenticator* authenticator;
+    std::unique_ptr<base::ElapsedTimer> timer;
+  };
+
+  using AuthenticatorMap =
+      std::map<std::string, std::unique_ptr<AuthenticatorState>, std::less<>>;
+
   // Encapsulates data required to initiate WebAuthN UX dialog. Once all
   // components of TransportAvailabilityInfo is set,
   // AuthenticatorRequestClientDelegate should be notified.
@@ -233,6 +246,13 @@
 
   void Start();
 
+  // Returns |true| if a short enough time has elapsed since the request was
+  // dispatched that an authenticator may be suspected to have returned a
+  // response without user interaction.
+  // Must be called after |DispatchRequest| is called.
+  bool AuthenticatorMayHaveReturnedImmediately(
+      const std::string& authenticator_id);
+
   AuthenticatorMap& active_authenticators() { return active_authenticators_; }
   std::vector<std::unique_ptr<FidoDiscoveryBase>>& discoveries() {
     return discoveries_;
@@ -273,7 +293,8 @@
   // DispatchRequest(). InitializeAuthenticator() sends a GetInfo command
   // to FidoDeviceAuthenticator instances in order to determine their protocol
   // versions before a request can be dispatched.
-  void InitializeAuthenticatorAndDispatchRequest(FidoAuthenticator*);
+  void InitializeAuthenticatorAndDispatchRequest(
+      AuthenticatorState* authenticator_state);
   void ConstructBleAdapterPowerManager();
 
   AuthenticatorMap active_authenticators_;
diff --git a/device/fido/get_assertion_handler_unittest.cc b/device/fido/get_assertion_handler_unittest.cc
index dae12a3..3f57684 100644
--- a/device/fido/get_assertion_handler_unittest.cc
+++ b/device/fido/get_assertion_handler_unittest.cc
@@ -845,7 +845,7 @@
     EXPECT_EQ(handler->AuthenticatorsForTesting().size(), 1u);
     EXPECT_EQ(handler->AuthenticatorsForTesting()
                   .begin()
-                  ->second->IsWinNativeApiAuthenticator(),
+                  ->second->authenticator->IsWinNativeApiAuthenticator(),
               enable_api);
   }
 }
diff --git a/device/fido/get_assertion_request_handler.cc b/device/fido/get_assertion_request_handler.cc
index c55dc17..924942406 100644
--- a/device/fido/get_assertion_request_handler.cc
+++ b/device/fido/get_assertion_request_handler.cc
@@ -398,6 +398,22 @@
          authenticator->WillNeedPINToGetAssertion(request_, observer()) !=
              PINDisposition::kUsePIN);
 
+  if ((status == CtapDeviceResponseCode::kCtap2ErrPinRequired ||
+       status == CtapDeviceResponseCode::kCtap2ErrOperationDenied) &&
+      authenticator->WillNeedPINToGetAssertion(request_, observer()) ==
+          PINDisposition::kUsePINForFallback) {
+    // Some authenticators will return this error immediately without user
+    // interaction when internal UV is locked.
+    if (AuthenticatorMayHaveReturnedImmediately(authenticator->GetId())) {
+      authenticator->GetTouch(base::BindOnce(
+          &GetAssertionRequestHandler::StartPINFallbackForInternalUv,
+          weak_factory_.GetWeakPtr(), authenticator));
+      return;
+    }
+    StartPINFallbackForInternalUv(authenticator);
+    return;
+  }
+
   const base::Optional<GetAssertionStatus> maybe_result =
       ConvertDeviceResponseCode(status);
   if (!maybe_result) {
diff --git a/device/fido/make_credential_request_handler.cc b/device/fido/make_credential_request_handler.cc
index 61a3705..c8e2d09 100644
--- a/device/fido/make_credential_request_handler.cc
+++ b/device/fido/make_credential_request_handler.cc
@@ -421,6 +421,22 @@
          will_need_pin == MakeCredentialPINDisposition::kNoPIN ||
          will_need_pin == MakeCredentialPINDisposition::kUsePINForFallback);
 
+  if ((status == CtapDeviceResponseCode::kCtap2ErrPinAuthInvalid ||
+       status == CtapDeviceResponseCode::kCtap2ErrPinRequired) &&
+      authenticator->WillNeedPINToMakeCredential(request_, observer()) ==
+          MakeCredentialPINDisposition::kUsePINForFallback) {
+    // Some authenticators will return this error immediately without user
+    // interaction when internal UV is locked.
+    if (AuthenticatorMayHaveReturnedImmediately(authenticator->GetId())) {
+      authenticator->GetTouch(base::BindOnce(
+          &MakeCredentialRequestHandler::StartPINFallbackForInternalUv,
+          weak_factory_.GetWeakPtr(), authenticator));
+      return;
+    }
+    StartPINFallbackForInternalUv(authenticator);
+    return;
+  }
+
   const base::Optional<MakeCredentialStatus> maybe_result =
       ConvertDeviceResponseCode(status);
   if (!maybe_result) {
diff --git a/extensions/common/manifest_handlers/mime_types_handler.cc b/extensions/common/manifest_handlers/mime_types_handler.cc
index f4874a5..f0dbb79 100644
--- a/extensions/common/manifest_handlers/mime_types_handler.cc
+++ b/extensions/common/manifest_handlers/mime_types_handler.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 
 #include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -22,6 +23,7 @@
 
 namespace {
 
+// This has to by in sync with MimeHandlerType enum.
 const char* const kMIMETypeHandlersWhitelist[] = {
     extension_misc::kPdfExtensionId,
     extension_misc::kQuickOfficeComponentExtensionId,
@@ -29,6 +31,24 @@
     extension_misc::kQuickOfficeExtensionId,
     extension_misc::kMimeHandlerPrivateTestExtensionId};
 
+// Used for UMA stats. Entries should not be renumbered and numeric values
+// should never be reused. This corresponds to kMimeTypeHandlersWhitelist.
+// Don't forget to update enums.xml when updating these.
+enum class MimeHandlerType {
+  kPdfExtension = 0,
+  kQuickOfficeComponentExtension = 1,
+  kQuickOfficeInternalExtension = 2,
+  kQuickOfficeExtension = 3,
+  kTestExtension = 4,
+
+  kMaxValue = kTestExtension,
+};
+
+static_assert(
+    base::size(kMIMETypeHandlersWhitelist) ==
+        static_cast<size_t>(MimeHandlerType::kMaxValue) + 1,
+    "MimeHandlerType enum is not in sync with kMIMETypeHandlersWhitelist.");
+
 constexpr SkColor kPdfExtensionBackgroundColor = SkColorSetRGB(82, 86, 89);
 constexpr SkColor kQuickOfficeExtensionBackgroundColor =
     SkColorSetRGB(241, 241, 241);
@@ -41,11 +61,8 @@
   ~MimeTypesHandlerInfo() override;
 };
 
-MimeTypesHandlerInfo::MimeTypesHandlerInfo() {
-}
-
-MimeTypesHandlerInfo::~MimeTypesHandlerInfo() {
-}
+MimeTypesHandlerInfo::MimeTypesHandlerInfo() = default;
+MimeTypesHandlerInfo::~MimeTypesHandlerInfo() = default;
 
 }  // namespace
 
@@ -57,11 +74,20 @@
   return whitelist;
 }
 
-MimeTypesHandler::MimeTypesHandler() {
+// static
+void MimeTypesHandler::ReportUsedHandler(const std::string& extension_id) {
+  auto* const* it =
+      std::find(std::begin(kMIMETypeHandlersWhitelist),
+                std::end(kMIMETypeHandlersWhitelist), extension_id);
+  if (it != std::end(kMIMETypeHandlersWhitelist)) {
+    MimeHandlerType type = static_cast<MimeHandlerType>(
+        it - std::begin(kMIMETypeHandlersWhitelist));
+    base::UmaHistogramEnumeration("Extensions.UsedMimeTypeHandler", type);
+  }
 }
 
-MimeTypesHandler::~MimeTypesHandler() {
-}
+MimeTypesHandler::MimeTypesHandler() = default;
+MimeTypesHandler::~MimeTypesHandler() = default;
 
 void MimeTypesHandler::AddMIMEType(const std::string& mime_type) {
   mime_type_set_.insert(mime_type);
diff --git a/extensions/common/manifest_handlers/mime_types_handler.h b/extensions/common/manifest_handlers/mime_types_handler.h
index 22dfd725..b9da14a 100644
--- a/extensions/common/manifest_handlers/mime_types_handler.h
+++ b/extensions/common/manifest_handlers/mime_types_handler.h
@@ -20,6 +20,9 @@
 
   static MimeTypesHandler* GetHandler(const extensions::Extension* extension);
 
+  // Sends a UMA stat about usage of the specific type handler.
+  static void ReportUsedHandler(const std::string& extension_id);
+
   MimeTypesHandler();
   ~MimeTypesHandler();
 
diff --git a/gpu/command_buffer/service/shared_image_backing_egl_image.cc b/gpu/command_buffer/service/shared_image_backing_egl_image.cc
index d4e7f16..3117ba5 100644
--- a/gpu/command_buffer/service/shared_image_backing_egl_image.cc
+++ b/gpu/command_buffer/service/shared_image_backing_egl_image.cc
@@ -68,6 +68,8 @@
 
   gles2::Texture* GetTexture() override { return texture_; }
 
+  bool SupportsMultipleConcurrentReadAccess() override { return true; }
+
  private:
   SharedImageBackingEglImage* egl_backing() {
     return static_cast<SharedImageBackingEglImage*>(backing());
diff --git a/gpu/command_buffer/service/shared_image_representation.cc b/gpu/command_buffer/service/shared_image_representation.cc
index 810e7d83..93133a1 100644
--- a/gpu/command_buffer/service/shared_image_representation.cc
+++ b/gpu/command_buffer/service/shared_image_representation.cc
@@ -54,6 +54,11 @@
   return true;
 }
 
+bool SharedImageRepresentationGLTextureBase::
+    SupportsMultipleConcurrentReadAccess() {
+  return false;
+}
+
 gpu::TextureBase* SharedImageRepresentationGLTexture::GetTextureBase() {
   return GetTexture();
 }
diff --git a/gpu/command_buffer/service/shared_image_representation.h b/gpu/command_buffer/service/shared_image_representation.h
index f4278420..7d0d241 100644
--- a/gpu/command_buffer/service/shared_image_representation.h
+++ b/gpu/command_buffer/service/shared_image_representation.h
@@ -169,6 +169,8 @@
   // exist.
   virtual bool BeginAccess(GLenum mode);
   virtual void EndAccess() {}
+
+  virtual bool SupportsMultipleConcurrentReadAccess();
 };
 
 class GPU_GLES2_EXPORT SharedImageRepresentationGLTexture
diff --git a/gpu/command_buffer/service/shared_image_representation_skia_gl.cc b/gpu/command_buffer/service/shared_image_representation_skia_gl.cc
index 23ce89e..d23d5358 100644
--- a/gpu/command_buffer/service/shared_image_representation_skia_gl.cc
+++ b/gpu/command_buffer/service/shared_image_representation_skia_gl.cc
@@ -147,4 +147,8 @@
 #endif
 }
 
+bool SharedImageRepresentationSkiaGL::SupportsMultipleConcurrentReadAccess() {
+  return gl_representation_->SupportsMultipleConcurrentReadAccess();
+}
+
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image_representation_skia_gl.h b/gpu/command_buffer/service/shared_image_representation_skia_gl.h
index 216856d..f3f1111 100644
--- a/gpu/command_buffer/service/shared_image_representation_skia_gl.h
+++ b/gpu/command_buffer/service/shared_image_representation_skia_gl.h
@@ -38,6 +38,8 @@
       std::vector<GrBackendSemaphore>* end_semaphores) override;
   void EndReadAccess() override;
 
+  bool SupportsMultipleConcurrentReadAccess() override;
+
  private:
   SharedImageRepresentationSkiaGL(
       std::unique_ptr<SharedImageRepresentationGLTextureBase> gl_representation,
diff --git a/infra/config/buckets/ci.star b/infra/config/buckets/ci.star
index a7ed274c..a0a94ce8 100644
--- a/infra/config/buckets/ci.star
+++ b/infra/config/buckets/ci.star
@@ -139,41 +139,6 @@
 )
 
 ci.android_builder(
-    name = 'Android WebView M (dbg)',
-    triggered_by = ['Android arm64 Builder (dbg)'],
-)
-
-ci.android_builder(
-    name = 'Android WebView N (dbg)',
-    triggered_by = ['Android arm64 Builder (dbg)'],
-)
-
-ci.android_builder(
-    name = 'Android WebView O (dbg)',
-    triggered_by = ['Android arm64 Builder (dbg)'],
-)
-
-ci.android_builder(
-    name = 'Android WebView P (dbg)',
-    triggered_by = ['Android arm64 Builder (dbg)'],
-)
-
-ci.android_builder(
-    name = 'Android arm64 Builder (dbg)',
-    goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
-    execution_timeout = 4 * time.hour,
-)
-
-ci.android_builder(
-    name = 'Android x64 Builder (dbg)',
-    execution_timeout = 4 * time.hour,
-)
-
-ci.android_builder(
-    name = 'Android x86 Builder (dbg)',
-)
-
-ci.android_builder(
     name = 'Deterministic Android',
     executable = 'recipe:swarming/deterministic_build',
     execution_timeout = 6 * time.hour,
@@ -223,32 +188,12 @@
 )
 
 ci.android_builder(
-    name = 'Marshmallow 64 bit Tester',
-    triggered_by = ['Android arm64 Builder (dbg)'],
-)
-
-ci.android_builder(
-    name = 'Nougat Phone Tester',
-    triggered_by = ['Android arm64 Builder (dbg)'],
-)
-
-ci.android_builder(
-    name = 'Oreo Phone Tester',
-    triggered_by = ['Android arm64 Builder (dbg)'],
-)
-
-ci.android_builder(
     name = 'android-arm64-proguard-rel',
     goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
     execution_timeout = 6 * time.hour,
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm-dbg',
-    notifies = ['cronet'],
-)
-
-ci.android_builder(
     name = 'android-cronet-arm64-dbg',
     notifies = ['cronet'],
 )
@@ -298,15 +243,6 @@
 )
 
 ci.android_builder(
-    name = 'android-pie-arm64-dbg',
-    triggered_by = ['Android arm64 Builder (dbg)'],
-)
-
-ci.android_builder(
-    name = 'android-pie-arm64-rel',
-)
-
-ci.android_builder(
     name = 'android-10-arm64-rel',
 )
 
@@ -411,17 +347,9 @@
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-dbg',
-)
-
-ci.chromiumos_builder(
     name = 'chromeos-arm-generic-dbg',
 )
 
-ci.chromiumos_builder(
-    name = 'chromeos-kevin-rel',
-)
-
 
 ci.clang_builder(
     name = 'CFI Linux CF',
@@ -583,24 +511,6 @@
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Builder',
-)
-
-ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Release (Intel HD 630)',
-    cores = 2,
-    os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Linux x64 DEPS Builder'],
-)
-
-ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Release (NVIDIA)',
-    cores = 2,
-    os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Linux x64 DEPS Builder'],
-)
-
-ci.dawn_builder(
     name = 'Dawn Linux x64 Release (Intel HD 630)',
     cores = 2,
     os = os.LINUX_DEFAULT,
@@ -622,29 +532,6 @@
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Builder',
-    builderless = False,
-    cores = None,
-    os = os.MAC_ANY,
-)
-
-# Note that the Mac testers are all thin Linux VMs, triggering jobs on the
-# physical Mac hardware in the Swarming pool which is why they run on linux
-ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Release (AMD)',
-    cores = 2,
-    os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Mac x64 DEPS Builder'],
-)
-
-ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Release (Intel)',
-    cores = 2,
-    os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Mac x64 DEPS Builder'],
-)
-
-ci.dawn_builder(
     name = 'Dawn Mac x64 Release (AMD)',
     cores = 2,
     os = os.LINUX_DEFAULT,
@@ -698,44 +585,6 @@
     triggered_by = ['Dawn Win10 x64 Builder'],
 )
 
-ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Builder',
-    os = os.WINDOWS_ANY,
-)
-
-ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Builder',
-    os = os.WINDOWS_ANY,
-)
-
-ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)',
-    cores = 2,
-    os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Win10 x86 DEPS Builder'],
-)
-
-ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)',
-    cores = 2,
-    os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Win10 x64 DEPS Builder'],
-)
-
-ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Release (NVIDIA)',
-    cores = 2,
-    os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Win10 x86 DEPS Builder'],
-)
-
-ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Release (NVIDIA)',
-    cores = 2,
-    os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Win10 x64 DEPS Builder'],
-)
-
 
 ci.fuzz_builder(
     name = 'ASAN Debug',
@@ -1005,10 +854,6 @@
 )
 
 ci.fyi_builder(
-    name = 'VR Linux',
-)
-
-ci.fyi_builder(
     name = 'android-mojo-webview-rel',
 )
 
@@ -1017,10 +862,6 @@
 )
 
 ci.fyi_builder(
-    name = 'chromeos-kevin-rel-hw-tests',
-)
-
-ci.fyi_builder(
     name = 'fuchsia-fyi-arm64-rel',
     notifies = ['cr-fuchsia'],
 )
@@ -1695,38 +1536,14 @@
 )
 
 ci.linux_builder(
-    name = 'Linux Builder (dbg)',
-)
-
-ci.linux_builder(
     name = 'Linux Builder (dbg)(32)',
 )
 
 ci.linux_builder(
-    name = 'Linux Tests (dbg)(1)',
-    triggered_by = ['Linux Builder (dbg)'],
-)
-
-ci.linux_builder(
     name = 'Network Service Linux',
 )
 
 ci.linux_builder(
-    name = 'fuchsia-arm64-cast',
-    notifies = ['cr-fuchsia'],
-)
-
-ci.linux_builder(
-    name = 'fuchsia-x64-cast',
-    notifies = ['cr-fuchsia'],
-)
-
-ci.linux_builder(
-    name = 'fuchsia-x64-dbg',
-    notifies = ['cr-fuchsia'],
-)
-
-ci.linux_builder(
     name = 'linux-gcc-rel',
     goma_backend = None,
 )
diff --git a/infra/config/buckets/try.star b/infra/config/buckets/try.star
index 7b74ec0f..1a3c911 100644
--- a/infra/config/buckets/try.star
+++ b/infra/config/buckets/try.star
@@ -42,19 +42,6 @@
 
 
 try_.blink_builder(
-    name = 'linux-blink-rel',
-    goma_backend = goma.backend.RBE_PROD,
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/cc/.+',
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-        ],
-    ),
-)
-
-try_.blink_builder(
     name = 'win10-blink-rel',
     goma_backend = goma.backend.RBE_PROD,
     os = os.WINDOWS_ANY,
@@ -103,21 +90,6 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android-cronet-arm-dbg',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/components/cronet/.+',
-            '.+/[+]/components/grpc_support/.+',
-            '.+/[+]/build/android/.+',
-            '.+/[+]/build/config/android/.+',
-        ],
-        location_regexp_exclude = [
-            '.+/[+]/components/cronet/ios/.+',
-        ],
-    ),
-)
-
-try_.chromium_android_builder(
     name = 'android-deterministic-dbg',
     executable = 'recipe:swarming/deterministic_build',
     execution_timeout = 6 * time.hour,
@@ -150,21 +122,6 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-dbg',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chrome/android/features/vr/.+',
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
-            '.+/[+]/third_party/arcore-android-sdk/.+',
-            '.+/[+]/third_party/arcore-android-sdk-client/.+',
-        ],
-    ),
-)
-
-try_.chromium_android_builder(
     name = 'android-pie-x86-fyi-rel',
     goma_jobs=goma.jobs.J150,
 )
@@ -178,14 +135,6 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-rel',
-    cores = 16,
-    goma_jobs = goma.jobs.J300,
-    ssd = True,
-    tryjob = try_.job(),
-)
-
-try_.chromium_android_builder(
     name = 'android-10-arm64-rel',
 )
 
@@ -237,37 +186,6 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_x64_dbg',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
-            '.+/[+]/sandbox/linux/system_headers/.+',
-            '.+/[+]/sandbox/linux/tests/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
-        ],
-    ),
-)
-
-try_.chromium_android_builder(
-    name = 'android_compile_x86_dbg',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
-            '.+/[+]/sandbox/linux/system_headers/.+',
-            '.+/[+]/sandbox/linux/tests/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
-        ],
-    ),
-)
-
-
-try_.chromium_android_builder(
     name = 'android_cronet_tester',
     properties = {
         'buildername': 'android-cronet-arm-dbg',
@@ -286,7 +204,6 @@
     name = 'android_unswarmed_pixel_aosp',
 )
 
-
 try_.chromium_android_builder(
     name = 'linux_android_dbg_ng',
 )
@@ -364,16 +281,6 @@
 
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-dbg',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/content/gpu/.+',
-            '.+/[+]/media/.+',
-        ],
-    ),
-)
-
-try_.chromium_chromiumos_builder(
     name = 'chromeos-amd64-generic-cfi-thin-lto-rel',
 )
 
@@ -381,104 +288,12 @@
     name = 'chromeos-arm-generic-dbg',
 )
 
-
-try_.chromium_chromiumos_builder(
-    name = 'chromeos-kevin-compile-rel',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chromeos/CHROMEOS_LKGM',
-        ],
-    ),
-)
-
-try_.chromium_chromiumos_builder(
-    name = 'chromeos-kevin-rel',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/build/chromeos/.+',
-            '.+/[+]/build/config/chromeos/.*',
-        ],
-    ),
-)
-
-
 try_.chromium_chromiumos_builder(
     name = 'linux-chromeos-dbg',
 )
 
 
 try_.chromium_dawn_builder(
-    name = 'dawn-linux-x64-deps-rel',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
-        ],
-    ),
-)
-
-try_.chromium_dawn_builder(
-    name = 'dawn-mac-x64-deps-rel',
-    os = os.MAC_ANY,
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
-        ],
-    ),
-)
-
-try_.chromium_dawn_builder(
-    name = 'dawn-win10-x64-deps-rel',
-    os = os.WINDOWS_ANY,
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
-        ],
-    ),
-)
-
-try_.chromium_dawn_builder(
-    name = 'dawn-win10-x86-deps-rel',
-    os = os.WINDOWS_ANY,
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
-        ],
-    ),
-)
-
-try_.chromium_dawn_builder(
     name = 'linux-dawn-rel',
 )
 
@@ -497,33 +312,6 @@
     name = 'cast_shell_audio_linux',
 )
 
-
-try_.chromium_linux_builder(
-    name = 'closure_compilation',
-    executable = 'recipe:closure_compilation',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/third_party/closure_compiler/.+',
-        ],
-    ),
-)
-
-try_.chromium_linux_builder(
-    name = 'fuchsia-arm64-cast',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chromecast/.+',
-        ],
-    ),
-)
-
-try_.chromium_linux_builder(
-    name = 'fuchsia-compile-x64-dbg',
-    tryjob = try_.job(
-        experiment_percentage = 50,
-    ),
-)
-
 try_.chromium_linux_builder(
     name = 'fuchsia-fyi-arm64-rel',
 )
@@ -537,16 +325,6 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-x64-cast',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chromecast/.+',
-        ],
-    ),
-)
-
-
-try_.chromium_linux_builder(
     name = 'layout_test_leak_detection',
 )
 
@@ -646,65 +424,20 @@
     name = 'linux_chromium_compile_dbg_32_ng',
 )
 
-
 try_.chromium_linux_builder(
     name = 'linux_chromium_compile_rel_ng',
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_dbg_ng',
-    caches = [
-        swarming.cache(
-            name = 'builder',
-            path = 'linux_debug',
-        ),
-    ],
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/build/.*check_gn_headers.*',
-        ],
-    ),
-)
-
-try_.chromium_linux_builder(
     name = 'linux_chromium_msan_rel_ng',
     goma_jobs = goma.jobs.J150,
 )
 
-
 try_.chromium_linux_builder(
     name = 'linux_chromium_ubsan_rel_ng',
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_layout_tests_composite_after_paint',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-            '.+/[+]/third_party/blink/web_tests/.+',
-        ],
-    ),
-)
-
-try_.chromium_linux_builder(
-    name = 'linux_layout_tests_layout_ng_disabled',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/third_party/blink/renderer/core/editing/.+',
-            '.+/[+]/third_party/blink/renderer/core/layout/.+',
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-            '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng',
-            '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+',
-        ],
-    ),
-)
-
-try_.chromium_linux_builder(
     name = 'linux-layout-tests-fragment-item',
 )
 
@@ -730,15 +463,6 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_vr',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-        ],
-    ),
-)
-
-try_.chromium_linux_builder(
     name = 'linux-wpt-fyi-rel',
 )
 
@@ -749,13 +473,6 @@
 
 
 try_.chromium_mac_builder(
-    name = 'mac-coverage-rel',
-    use_clang_coverage = True,
-    goma_jobs = goma.jobs.J150,
-    tryjob = try_.job(experiment_percentage = 3)
-)
-
-try_.chromium_mac_builder(
     name = 'mac-osxbeta-rel',
     os = os.MAC_DEFAULT,
 )
@@ -788,7 +505,6 @@
     goma_jobs = goma.jobs.J150,
 )
 
-
 try_.chromium_mac_builder(
     name = 'mac_chromium_compile_rel_ng',
 )
@@ -836,20 +552,6 @@
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-cronet',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/components/cronet/.+',
-            '.+/[+]/components/grpc_support/.+',
-            '.+/[+]/ios/.+',
-        ],
-        location_regexp_exclude = [
-            '.+/[+]/components/cronet/android/.+',
-        ],
-    ),
-)
-
-try_.chromium_mac_ios_builder(
     name = 'ios-simulator-eg',
 )
 
@@ -858,15 +560,6 @@
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-full-configs',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/ios/.+',
-        ],
-    ),
-)
-
-try_.chromium_mac_ios_builder(
     name = 'ios13-beta-simulator',
 )
 
@@ -875,7 +568,6 @@
 )
 
 
-
 try_.chromium_swangle_linux_builder(
     name = 'linux-swangle-try-tot-angle-x64'
 )
@@ -952,15 +644,6 @@
 )
 
 try_.chromium_win_builder(
-    name = 'win10_chromium_x64_coverage_rel_ng',
-    os = os.WINDOWS_10,
-    use_clang_coverage = True,
-    goma_jobs = goma.jobs.J150,
-    ssd = True,
-    tryjob = try_.job(experiment_percentage = 3),
-)
-
-try_.chromium_win_builder(
     name = 'win10_chromium_x64_rel_ng_exp',
     builderless = False,
     os = os.WINDOWS_ANY,
@@ -977,7 +660,6 @@
     name = 'win_archive',
 )
 
-
 try_.chromium_win_builder(
     name = 'win_chromium_compile_rel_ng',
 )
@@ -1008,98 +690,6 @@
 )
 
 
-try_.gpu_chromium_android_builder(
-    name = 'android_optional_gpu_tests_rel',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/cc/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/components/viz/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/services/viz/.+',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
-        ],
-    ),
-)
-
-
-try_.gpu_chromium_linux_builder(
-    name = 'linux_optional_gpu_tests_rel',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
-        ],
-    ),
-)
-
-
-try_.gpu_chromium_mac_builder(
-    name = 'mac_optional_gpu_tests_rel',
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/services/shape_detection/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
-        ],
-    ),
-)
-
-
-try_.gpu_chromium_win_builder(
-    name = 'win_optional_gpu_tests_rel',
-    builderless = True,
-    os = os.WINDOWS_DEFAULT,
-    tryjob = try_.job(
-        location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/device/vr/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/vr/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/modules/xr/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
-        ],
-    ),
-)
-
-
 # Used for listing chrome trybots in chromium's commit-queue.cfg without also
 # adding them to chromium's cr-buildbucket.cfg. Note that the recipe these
 # builders run allow only known roller accounts when triggered via the CQ.
diff --git a/infra/config/consoles/main-beta.star b/infra/config/consoles/main-beta.star
index ce983c6..df9b8e5 100644
--- a/infra/config/consoles/main-beta.star
+++ b/infra/config/consoles/main-beta.star
@@ -5,7 +5,7 @@
     repo = 'https://chromium.googlesource.com/chromium/src',
     # TODO(gbeaty) Define the main consoles inside the respective versioned
     # directories once their contents are stablilized
-    refs = ['refs/branch-heads/4044'],
+    refs = ['refs/branch-heads/4085'],
     title = 'Chromium Beta Console',
     entries = [
         luci.console_view_entry(
@@ -34,11 +34,36 @@
             short_name = 'ozo',
         ),
         luci.console_view_entry(
+            builder = 'ci-beta/Linux Builder (dbg)',
+            category = 'chromium.linux|debug|builder',
+            short_name = '64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Linux Tests (dbg)(1)',
+            category = 'chromium.linux|debug|tester',
+            short_name = '64',
+        ),
+        luci.console_view_entry(
             builder = 'ci-beta/Cast Linux',
             category = 'chromium.linux|cast',
             short_name = 'vid',
         ),
         luci.console_view_entry(
+            builder = 'ci-beta/fuchsia-arm64-cast',
+            category = 'chromium.linux|fuchsia|cast',
+            short_name = 'a64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/fuchsia-x64-cast',
+            category = 'chromium.linux|fuchsia|cast',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/fuchsia-x64-dbg',
+            category = 'chromium.linux|fuchsia|x64',
+            short_name = 'dbg',
+        ),
+        luci.console_view_entry(
             builder = 'ci-beta/Fuchsia ARM64',
             category = 'chromium.linux|fuchsia|a64',
         ),
@@ -63,11 +88,21 @@
             short_name = 'arm',
         ),
         luci.console_view_entry(
+            builder = 'ci-beta/chromeos-amd64-generic-dbg',
+            category = 'chromium.chromiumos|simple|debug|x64',
+            short_name = 'dbg',
+        ),
+        luci.console_view_entry(
             builder = 'ci-beta/chromeos-amd64-generic-rel',
             category = 'chromium.chromiumos|simple|release|x64',
             short_name = 'rel',
         ),
         luci.console_view_entry(
+            builder = 'ci-beta/chromeos-kevin-rel',
+            category = 'chromium.chromiumos|simple|release',
+            short_name = 'kvn',
+        ),
+        luci.console_view_entry(
             builder = 'ci-beta/Mac Builder',
             category = 'chromium.mac|release',
             short_name = 'bld',
@@ -157,6 +192,7 @@
             category = 'chromium.memory|linux|asan lsan',
             short_name = 'sbx',
         ),
+
         # TODO(https://crbug.com/922150) Add the following builders to the main
         # console or don't have them be mirrored by main waterfall trybots
         luci.console_view_entry(
@@ -180,11 +216,76 @@
             short_name = '32',
         ),
         luci.console_view_entry(
+            builder = 'ci-beta/Android arm64 Builder (dbg)',
+            category = 'chromium.android|builder|arm',
+            short_name = '64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Android x86 Builder (dbg)',
+            category = 'chromium.android|builder|x86',
+            short_name = '32',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Android x64 Builder (dbg)',
+            category = 'chromium.android|builder|x86',
+            short_name = '64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Marshmallow 64 bit Tester',
+            category = 'chromium.android|tester|phone',
+            short_name = 'M',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Nougat Phone Tester',
+            category = 'chromium.android|tester|phone',
+            short_name = 'N',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Oreo Phone Tester',
+            category = 'chromium.android|tester|phone',
+            short_name = 'O',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/android-pie-arm64-dbg',
+            category = 'chromium.android|tester|phone',
+            short_name = 'P',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/android-pie-arm64-rel',
+            category = 'chromium.android|on_cq',
+            short_name = 'P',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Android WebView M (dbg)',
+            category = 'chromium.android|tester|webview',
+            short_name = 'M',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Android WebView N (dbg)',
+            category = 'chromium.android|tester|webview',
+            short_name = 'N',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Android WebView O (dbg)',
+            category = 'chromium.android|tester|webview',
+            short_name = 'O',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Android WebView P (dbg)',
+            category = 'chromium.android|tester|webview',
+            short_name = 'P',
+        ),
+        luci.console_view_entry(
             builder = 'ci-beta/android-cronet-arm-rel',
             category = 'chromium.android|cronet|arm',
             short_name = 'rel',
         ),
         luci.console_view_entry(
+            builder = 'ci-beta/android-cronet-arm-dbg',
+            category = 'cronet|arm',
+            short_name = 'dbg',
+        ),
+        luci.console_view_entry(
             builder = 'ci-beta/android-cronet-kitkat-arm-rel',
             category = 'chromium.android|cronet|test',
             short_name = 'k',
@@ -195,6 +296,74 @@
             short_name = 'l',
         ),
         luci.console_view_entry(
+            builder = 'ci-beta/Dawn Linux x64 DEPS Builder',
+            category = 'chromium.dawn|DEPS|Linux|Builder',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Linux x64 DEPS Release (Intel HD 630)',
+            category = 'chromium.dawn|DEPS|Linux|Intel',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Linux x64 DEPS Release (NVIDIA)',
+            category = 'chromium.dawn|DEPS|Linux|Nvidia',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Mac x64 DEPS Builder',
+            category = 'chromium.dawn|DEPS|Mac|Builder',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Mac x64 DEPS Release (AMD)',
+            category = 'chromium.dawn|DEPS|Mac|AMD',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Mac x64 DEPS Release (Intel)',
+            category = 'chromium.dawn|DEPS|Mac|Intel',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Win10 x86 DEPS Builder',
+            category = 'chromium.dawn|DEPS|Windows|Builder',
+            short_name = 'x86',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Win10 x64 DEPS Builder',
+            category = 'chromium.dawn|DEPS|Windows|Builder',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Win10 x86 DEPS Release (Intel HD 630)',
+            category = 'chromium.dawn|DEPS|Windows|Intel',
+            short_name = 'x86',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Win10 x64 DEPS Release (Intel HD 630)',
+            category = 'chromium.dawn|DEPS|Windows|Intel',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Win10 x86 DEPS Release (NVIDIA)',
+            category = 'chromium.dawn|DEPS|Windows|Nvidia',
+            short_name = 'x86',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/Dawn Win10 x64 DEPS Release (NVIDIA)',
+            category = 'chromium.dawn|DEPS|Windows|Nvidia',
+            short_name = 'x64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/chromeos-kevin-rel-hw-tests',
+            category = 'chromium.fyi|chromeos',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-beta/VR Linux',
+            category = 'chromium.fyi|linux',
+        ),
+        luci.console_view_entry(
             builder = 'ci-beta/mac-osxbeta-rel',
             category = 'chromium.fyi|mac',
             short_name = 'osxbeta',
diff --git a/infra/config/consoles/main-stable.star b/infra/config/consoles/main-stable.star
index 5ca71d32f..e93cc825 100644
--- a/infra/config/consoles/main-stable.star
+++ b/infra/config/consoles/main-stable.star
@@ -5,7 +5,7 @@
     repo = 'https://chromium.googlesource.com/chromium/src',
     # TODO(gbeaty) Define the main consoles inside the respective versioned
     # directories once their contents are stablilized
-    refs = ['refs/branch-heads/3987'],
+    refs = ['refs/branch-heads/4044'],
     title = 'Chromium Stable Console',
     entries = [
         luci.console_view_entry(
@@ -29,14 +29,38 @@
             short_name = 'tst',
         ),
         luci.console_view_entry(
+            builder = 'ci-stable/linux-ozone-rel',
+            category = 'chromium.linux|release',
+            short_name = 'ozo',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Cast Linux',
+            category = 'chromium.linux|cast',
+            short_name = 'vid',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Fuchsia ARM64',
+            category = 'chromium.linux|fuchsia|a64',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Fuchsia x64',
+            category = 'chromium.linux|fuchsia|x64',
+            short_name = 'rel',
+        ),
+        luci.console_view_entry(
             builder = 'ci-stable/linux-chromeos-rel',
             category = 'chromium.chromiumos|default',
             short_name = 'rel',
         ),
         luci.console_view_entry(
-            builder = 'ci-stable/linux-ozone-rel',
-            category = 'chromium.linux|release',
-            short_name = 'ozo',
+            builder = 'ci-stable/linux-chromeos-dbg',
+            category = 'chromium.chromiumos|default',
+            short_name = 'dbg',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/chromeos-arm-generic-rel',
+            category = 'chromium.chromiumos|simple|release',
+            short_name = 'arm',
         ),
         luci.console_view_entry(
             builder = 'ci-stable/chromeos-amd64-generic-rel',
@@ -79,6 +103,16 @@
             short_name = 'ret',
         ),
         luci.console_view_entry(
+            builder = 'ci-stable/Mac Builder (dbg)',
+            category = 'chromium.mac|debug',
+            short_name = 'bld',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Mac10.13 Tests (dbg)',
+            category = 'chromium.mac|debug',
+            short_name = '13',
+        ),
+        luci.console_view_entry(
             builder = 'ci-stable/ios-simulator',
             category = 'chromium.mac|ios|default',
             short_name = 'sim',
@@ -98,6 +132,31 @@
             category = 'chromium.win|release|tester',
             short_name = 'w10',
         ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Win Builder (dbg)',
+            category = 'chromium.win|debug|builder',
+            short_name = '32',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Win7 Tests (dbg)(1)',
+            category = 'chromium.win|debug|tester',
+            short_name = '7',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Linux ASan LSan Builder',
+            category = 'chromium.memory|linux|asan lsan',
+            short_name = 'bld',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Linux ASan LSan Tests (1)',
+            category = 'chromium.memory|linux|asan lsan',
+            short_name = 'tst',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Linux ASan Tests (sandboxed)',
+            category = 'chromium.memory|linux|asan lsan',
+            short_name = 'sbx',
+        ),
         # TODO(https://crbug.com/922150) Add the following builders to the main
         # console or don't have them be mirrored by main waterfall trybots
         luci.console_view_entry(
@@ -111,6 +170,31 @@
             short_name = 'm',
         ),
         luci.console_view_entry(
+            builder = 'ci-stable/Cast Android (dbg)',
+            category = 'chromium.android',
+            short_name = 'cst',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/Android arm Builder (dbg)',
+            category = 'chromium.android|builder|arm',
+            short_name = '32',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/android-cronet-arm-rel',
+            category = 'chromium.android|cronet|arm',
+            short_name = 'rel',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/android-cronet-kitkat-arm-rel',
+            category = 'chromium.android|cronet|test',
+            short_name = 'k',
+        ),
+        luci.console_view_entry(
+            builder = 'ci-stable/android-cronet-lollipop-arm-rel',
+            category = 'chromium.android|cronet|test',
+            short_name = 'l',
+        ),
+        luci.console_view_entry(
             builder = 'ci-stable/mac-osxbeta-rel',
             category = 'chromium.fyi|mac',
             short_name = 'osxbeta',
diff --git a/infra/config/consoles/try-beta.star b/infra/config/consoles/try-beta.star
index 4e705f9..ea1153b 100644
--- a/infra/config/consoles/try-beta.star
+++ b/infra/config/consoles/try-beta.star
@@ -2,30 +2,60 @@
     name = 'try-beta',
     entries = [
         'try-beta/android-binary-size',
+        'try-beta/android-cronet-arm-dbg',
         'try-beta/android-kitkat-arm-rel',
         'try-beta/android-marshmallow-arm64-rel',
+        'try-beta/android-pie-arm64-dbg',
+        'try-beta/android-pie-arm64-rel',
         'try-beta/android_compile_dbg',
+        'try-beta/android_compile_x64_dbg',
+        'try-beta/android_compile_x86_dbg',
         'try-beta/android_cronet',
+        'try-beta/android_optional_gpu_tests_rel',
         'try-beta/cast_shell_android',
         'try-beta/cast_shell_linux',
+        'try-beta/chromeos-amd64-generic-dbg',
         'try-beta/chromeos-amd64-generic-rel',
         'try-beta/chromeos-arm-generic-rel',
+        'try-beta/chromeos-kevin-compile-rel',
+        'try-beta/chromeos-kevin-rel',
         'try-beta/chromium_presubmit',
+        'try-beta/closure_compilation',
+        'try-beta/dawn-linux-x64-deps-rel',
+        'try-beta/dawn-mac-x64-deps-rel',
+        'try-beta/dawn-win10-x64-deps-rel',
+        'try-beta/dawn-win10-x86-deps-rel',
+        'try-beta/fuchsia-arm64-cast',
+        'try-beta/fuchsia-compile-x64-dbg',
+        'try-beta/fuchsia-x64-cast',
         'try-beta/fuchsia_arm64',
         'try-beta/fuchsia_x64',
         'try-beta/ios-simulator',
+        'try-beta/ios-simulator-cronet',
+        'try-beta/ios-simulator-full-configs',
+        'try-beta/linux-blink-rel',
         'try-beta/linux-chromeos-compile-dbg',
         'try-beta/linux-chromeos-rel',
         'try-beta/linux-libfuzzer-asan-rel',
         'try-beta/linux-ozone-rel',
+        'try-beta/linux-ozone-x11-and-wayland-rel',
         'try-beta/linux-rel',
         'try-beta/linux_chromium_asan_rel_ng',
         'try-beta/linux_chromium_compile_dbg_ng',
+        'try-beta/linux_chromium_dbg_ng',
         'try-beta/linux_chromium_tsan_rel_ng',
+        'try-beta/linux_layout_tests_composite_after_paint',
+        'try-beta/linux_layout_tests_layout_ng_disabled',
+        'try-beta/linux_optional_gpu_tests_rel',
+        'try-beta/linux_vr',
+        'try-beta/mac-coverage-rel',
         'try-beta/mac-rel',
         'try-beta/mac_chromium_compile_dbg_ng',
+        'try-beta/mac_optional_gpu_tests_rel',
         'try-beta/win-libfuzzer-asan-rel',
+        'try-beta/win10_chromium_x64_coverage_rel_ng',
         'try-beta/win10_chromium_x64_rel_ng',
         'try-beta/win_chromium_compile_dbg_ng',
+        'try-beta/win_optional_gpu_tests_rel',
     ],
 )
diff --git a/infra/config/consoles/try-stable.star b/infra/config/consoles/try-stable.star
index cf0cc0af..456e686 100644
--- a/infra/config/consoles/try-stable.star
+++ b/infra/config/consoles/try-stable.star
@@ -1,14 +1,31 @@
 luci.list_view(
     name = 'try-stable',
     entries = [
+        'try-stable/android-binary-size',
         'try-stable/android-kitkat-arm-rel',
         'try-stable/android-marshmallow-arm64-rel',
+        'try-stable/android_compile_dbg',
+        'try-stable/android_cronet',
+        'try-stable/cast_shell_android',
+        'try-stable/cast_shell_linux',
         'try-stable/chromeos-amd64-generic-rel',
+        'try-stable/chromeos-arm-generic-rel',
         'try-stable/chromium_presubmit',
+        'try-stable/fuchsia_arm64',
+        'try-stable/fuchsia_x64',
         'try-stable/ios-simulator',
+        'try-stable/linux-chromeos-compile-dbg',
         'try-stable/linux-chromeos-rel',
+        'try-stable/linux-libfuzzer-asan-rel',
+        'try-stable/linux-ozone-rel',
         'try-stable/linux-rel',
+        'try-stable/linux_chromium_asan_rel_ng',
+        'try-stable/linux_chromium_compile_dbg_ng',
+        'try-stable/linux_chromium_tsan_rel_ng',
         'try-stable/mac-rel',
+        'try-stable/mac_chromium_compile_dbg_ng',
+        'try-stable/win-libfuzzer-asan-rel',
         'try-stable/win10_chromium_x64_rel_ng',
+        'try-stable/win_chromium_compile_dbg_ng',
     ],
 )
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg
index 4936ebf8..9ba304f 100644
--- a/infra/config/generated/commit-queue.cfg
+++ b/infra/config/generated/commit-queue.cfg
@@ -1202,7 +1202,7 @@
     url: "https://chromium-review.googlesource.com"
     projects: <
       name: "chromium/src"
-      ref_regexp: "refs/branch-heads/4044"
+      ref_regexp: "refs/branch-heads/4085"
     >
   >
   verifiers: <
@@ -1215,34 +1215,170 @@
         name: "chromium/try-beta/android-binary-size"
       >
       builders: <
+        name: "chromium/try-beta/android-cronet-arm-dbg"
+        location_regexp: ".+/[+]/components/cronet/.+"
+        location_regexp: ".+/[+]/components/grpc_support/.+"
+        location_regexp: ".+/[+]/build/android/.+"
+        location_regexp: ".+/[+]/build/config/android/.+"
+        location_regexp_exclude: ".+/[+]/components/cronet/ios/.+"
+      >
+      builders: <
         name: "chromium/try-beta/android-kitkat-arm-rel"
       >
       builders: <
         name: "chromium/try-beta/android-marshmallow-arm64-rel"
       >
       builders: <
+        name: "chromium/try-beta/android-pie-arm64-dbg"
+        location_regexp: ".+/[+]/chrome/android/features/vr/.+"
+        location_regexp: ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/third_party/gvr-android-sdk/.+"
+        location_regexp: ".+/[+]/third_party/arcore-android-sdk/.+"
+        location_regexp: ".+/[+]/third_party/arcore-android-sdk-client/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/android-pie-arm64-rel"
+      >
+      builders: <
         name: "chromium/try-beta/android_compile_dbg"
       >
       builders: <
+        name: "chromium/try-beta/android_compile_x64_dbg"
+        location_regexp: ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/sandbox/linux/seccomp-bpf/.+"
+        location_regexp: ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+"
+        location_regexp: ".+/[+]/sandbox/linux/system_headers/.+"
+        location_regexp: ".+/[+]/sandbox/linux/tests/.+"
+        location_regexp: ".+/[+]/third_party/gvr-android-sdk/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/android_compile_x86_dbg"
+        location_regexp: ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/sandbox/linux/seccomp-bpf/.+"
+        location_regexp: ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+"
+        location_regexp: ".+/[+]/sandbox/linux/system_headers/.+"
+        location_regexp: ".+/[+]/sandbox/linux/tests/.+"
+        location_regexp: ".+/[+]/third_party/gvr-android-sdk/.+"
+      >
+      builders: <
         name: "chromium/try-beta/android_cronet"
       >
       builders: <
+        name: "chromium/try-beta/android_optional_gpu_tests_rel"
+        location_regexp: ".+/[+]/cc/.+"
+        location_regexp: ".+/[+]/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/components/viz/.+"
+        location_regexp: ".+/[+]/content/test/gpu/.+"
+        location_regexp: ".+/[+]/gpu/.+"
+        location_regexp: ".+/[+]/media/audio/.+"
+        location_regexp: ".+/[+]/media/filters/.+"
+        location_regexp: ".+/[+]/media/gpu/.+"
+        location_regexp: ".+/[+]/services/viz/.+"
+        location_regexp: ".+/[+]/testing/trigger_scripts/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgl/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+"
+        location_regexp: ".+/[+]/tools/clang/scripts/update.py"
+        location_regexp: ".+/[+]/ui/gl/.+"
+      >
+      builders: <
         name: "chromium/try-beta/cast_shell_android"
       >
       builders: <
         name: "chromium/try-beta/cast_shell_linux"
       >
       builders: <
+        name: "chromium/try-beta/chromeos-amd64-generic-dbg"
+        location_regexp: ".+/[+]/content/gpu/.+"
+        location_regexp: ".+/[+]/media/.+"
+      >
+      builders: <
         name: "chromium/try-beta/chromeos-amd64-generic-rel"
       >
       builders: <
         name: "chromium/try-beta/chromeos-arm-generic-rel"
       >
       builders: <
+        name: "chromium/try-beta/chromeos-kevin-compile-rel"
+        location_regexp: ".+/[+]/chromeos/CHROMEOS_LKGM"
+      >
+      builders: <
+        name: "chromium/try-beta/chromeos-kevin-rel"
+        location_regexp: ".+/[+]/build/chromeos/.+"
+        location_regexp: ".+/[+]/build/config/chromeos/.*"
+      >
+      builders: <
         name: "chromium/try-beta/chromium_presubmit"
         disable_reuse: true
       >
       builders: <
+        name: "chromium/try-beta/closure_compilation"
+        location_regexp: ".+/[+]/third_party/closure_compiler/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/dawn-linux-x64-deps-rel"
+        location_regexp: ".+/[+]/gpu/.+"
+        location_regexp: ".+/[+]/testing/buildbot/chromium.dawn.json"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/WebGPUExpectations"
+        location_regexp: ".+/[+]/third_party/dawn/.+"
+        location_regexp: ".+/[+]/tools/clang/scripts/update.py"
+        location_regexp: ".+/[+]/ui/gl/features.gni"
+      >
+      builders: <
+        name: "chromium/try-beta/dawn-mac-x64-deps-rel"
+        location_regexp: ".+/[+]/gpu/.+"
+        location_regexp: ".+/[+]/testing/buildbot/chromium.dawn.json"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/WebGPUExpectations"
+        location_regexp: ".+/[+]/third_party/dawn/.+"
+        location_regexp: ".+/[+]/tools/clang/scripts/update.py"
+        location_regexp: ".+/[+]/ui/gl/features.gni"
+      >
+      builders: <
+        name: "chromium/try-beta/dawn-win10-x64-deps-rel"
+        location_regexp: ".+/[+]/gpu/.+"
+        location_regexp: ".+/[+]/testing/buildbot/chromium.dawn.json"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/WebGPUExpectations"
+        location_regexp: ".+/[+]/third_party/dawn/.+"
+        location_regexp: ".+/[+]/tools/clang/scripts/update.py"
+        location_regexp: ".+/[+]/ui/gl/features.gni"
+      >
+      builders: <
+        name: "chromium/try-beta/dawn-win10-x86-deps-rel"
+        location_regexp: ".+/[+]/gpu/.+"
+        location_regexp: ".+/[+]/testing/buildbot/chromium.dawn.json"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/WebGPUExpectations"
+        location_regexp: ".+/[+]/third_party/dawn/.+"
+        location_regexp: ".+/[+]/tools/clang/scripts/update.py"
+        location_regexp: ".+/[+]/ui/gl/features.gni"
+      >
+      builders: <
+        name: "chromium/try-beta/fuchsia-arm64-cast"
+        location_regexp: ".+/[+]/chromecast/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/fuchsia-compile-x64-dbg"
+        experiment_percentage: 50
+      >
+      builders: <
+        name: "chromium/try-beta/fuchsia-x64-cast"
+        location_regexp: ".+/[+]/chromecast/.+"
+      >
+      builders: <
         name: "chromium/try-beta/fuchsia_arm64"
       >
       builders: <
@@ -1252,6 +1388,24 @@
         name: "chromium/try-beta/ios-simulator"
       >
       builders: <
+        name: "chromium/try-beta/ios-simulator-cronet"
+        location_regexp: ".+/[+]/components/cronet/.+"
+        location_regexp: ".+/[+]/components/grpc_support/.+"
+        location_regexp: ".+/[+]/ios/.+"
+        location_regexp_exclude: ".+/[+]/components/cronet/android/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/ios-simulator-full-configs"
+        location_regexp: ".+/[+]/ios/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/linux-blink-rel"
+        location_regexp: ".+/[+]/cc/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/core/paint/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/core/svg/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/.+"
+      >
+      builders: <
         name: "chromium/try-beta/linux-chromeos-compile-dbg"
       >
       builders: <
@@ -1264,6 +1418,10 @@
         name: "chromium/try-beta/linux-ozone-rel"
       >
       builders: <
+        name: "chromium/try-beta/linux-ozone-x11-and-wayland-rel"
+        experiment_percentage: 1
+      >
+      builders: <
         name: "chromium/try-beta/linux-rel"
       >
       builders: <
@@ -1273,23 +1431,106 @@
         name: "chromium/try-beta/linux_chromium_compile_dbg_ng"
       >
       builders: <
+        name: "chromium/try-beta/linux_chromium_dbg_ng"
+        location_regexp: ".+/[+]/build/.*check_gn_headers.*"
+      >
+      builders: <
         name: "chromium/try-beta/linux_chromium_tsan_rel_ng"
       >
       builders: <
+        name: "chromium/try-beta/linux_layout_tests_composite_after_paint"
+        location_regexp: ".+/[+]/third_party/blink/renderer/core/paint/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/core/svg/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/linux_layout_tests_layout_ng_disabled"
+        location_regexp: ".+/[+]/third_party/blink/renderer/core/editing/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/core/layout/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/core/paint/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/core/svg/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/.+"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng"
+        location_regexp: ".+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/linux_optional_gpu_tests_rel"
+        location_regexp: ".+/[+]/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/content/test/gpu/.+"
+        location_regexp: ".+/[+]/gpu/.+"
+        location_regexp: ".+/[+]/media/audio/.+"
+        location_regexp: ".+/[+]/media/filters/.+"
+        location_regexp: ".+/[+]/media/gpu/.+"
+        location_regexp: ".+/[+]/testing/buildbot/chromium.gpu.fyi.json"
+        location_regexp: ".+/[+]/testing/trigger_scripts/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgl/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+"
+        location_regexp: ".+/[+]/tools/clang/scripts/update.py"
+        location_regexp: ".+/[+]/ui/gl/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/linux_vr"
+        location_regexp: ".+/[+]/chrome/browser/vr/.+"
+      >
+      builders: <
+        name: "chromium/try-beta/mac-coverage-rel"
+        experiment_percentage: 3
+      >
+      builders: <
         name: "chromium/try-beta/mac-rel"
       >
       builders: <
         name: "chromium/try-beta/mac_chromium_compile_dbg_ng"
       >
       builders: <
+        name: "chromium/try-beta/mac_optional_gpu_tests_rel"
+        location_regexp: ".+/[+]/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/content/test/gpu/.+"
+        location_regexp: ".+/[+]/gpu/.+"
+        location_regexp: ".+/[+]/media/audio/.+"
+        location_regexp: ".+/[+]/media/filters/.+"
+        location_regexp: ".+/[+]/media/gpu/.+"
+        location_regexp: ".+/[+]/services/shape_detection/.+"
+        location_regexp: ".+/[+]/testing/buildbot/chromium.gpu.fyi.json"
+        location_regexp: ".+/[+]/testing/trigger_scripts/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgl/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+"
+        location_regexp: ".+/[+]/tools/clang/scripts/update.py"
+        location_regexp: ".+/[+]/ui/gl/.+"
+      >
+      builders: <
         name: "chromium/try-beta/win-libfuzzer-asan-rel"
       >
       builders: <
+        name: "chromium/try-beta/win10_chromium_x64_coverage_rel_ng"
+        experiment_percentage: 3
+      >
+      builders: <
         name: "chromium/try-beta/win10_chromium_x64_rel_ng"
       >
       builders: <
         name: "chromium/try-beta/win_chromium_compile_dbg_ng"
       >
+      builders: <
+        name: "chromium/try-beta/win_optional_gpu_tests_rel"
+        location_regexp: ".+/[+]/chrome/browser/vr/.+"
+        location_regexp: ".+/[+]/content/test/gpu/.+"
+        location_regexp: ".+/[+]/device/vr/.+"
+        location_regexp: ".+/[+]/gpu/.+"
+        location_regexp: ".+/[+]/media/audio/.+"
+        location_regexp: ".+/[+]/media/filters/.+"
+        location_regexp: ".+/[+]/media/gpu/.+"
+        location_regexp: ".+/[+]/testing/buildbot/chromium.gpu.fyi.json"
+        location_regexp: ".+/[+]/testing/trigger_scripts/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/vr/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/webgl/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/modules/xr/.+"
+        location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+"
+        location_regexp: ".+/[+]/tools/clang/scripts/update.py"
+        location_regexp: ".+/[+]/ui/gl/.+"
+      >
       retry_config: <
         single_quota: 1
         global_quota: 2
@@ -1307,7 +1548,7 @@
     url: "https://chromium-review.googlesource.com"
     projects: <
       name: "chromium/src"
-      ref_regexp: "refs/branch-heads/3987"
+      ref_regexp: "refs/branch-heads/4044"
     >
   >
   verifiers: <
@@ -1317,33 +1558,84 @@
     >
     tryjob: <
       builders: <
+        name: "chromium/try-stable/android-binary-size"
+      >
+      builders: <
         name: "chromium/try-stable/android-kitkat-arm-rel"
       >
       builders: <
         name: "chromium/try-stable/android-marshmallow-arm64-rel"
       >
       builders: <
+        name: "chromium/try-stable/android_compile_dbg"
+      >
+      builders: <
+        name: "chromium/try-stable/android_cronet"
+      >
+      builders: <
+        name: "chromium/try-stable/cast_shell_android"
+      >
+      builders: <
+        name: "chromium/try-stable/cast_shell_linux"
+      >
+      builders: <
         name: "chromium/try-stable/chromeos-amd64-generic-rel"
       >
       builders: <
+        name: "chromium/try-stable/chromeos-arm-generic-rel"
+      >
+      builders: <
         name: "chromium/try-stable/chromium_presubmit"
         disable_reuse: true
       >
       builders: <
+        name: "chromium/try-stable/fuchsia_arm64"
+      >
+      builders: <
+        name: "chromium/try-stable/fuchsia_x64"
+      >
+      builders: <
         name: "chromium/try-stable/ios-simulator"
       >
       builders: <
+        name: "chromium/try-stable/linux-chromeos-compile-dbg"
+      >
+      builders: <
         name: "chromium/try-stable/linux-chromeos-rel"
       >
       builders: <
+        name: "chromium/try-stable/linux-libfuzzer-asan-rel"
+      >
+      builders: <
+        name: "chromium/try-stable/linux-ozone-rel"
+      >
+      builders: <
         name: "chromium/try-stable/linux-rel"
       >
       builders: <
+        name: "chromium/try-stable/linux_chromium_asan_rel_ng"
+      >
+      builders: <
+        name: "chromium/try-stable/linux_chromium_compile_dbg_ng"
+      >
+      builders: <
+        name: "chromium/try-stable/linux_chromium_tsan_rel_ng"
+      >
+      builders: <
         name: "chromium/try-stable/mac-rel"
       >
       builders: <
+        name: "chromium/try-stable/mac_chromium_compile_dbg_ng"
+      >
+      builders: <
+        name: "chromium/try-stable/win-libfuzzer-asan-rel"
+      >
+      builders: <
         name: "chromium/try-stable/win10_chromium_x64_rel_ng"
       >
+      builders: <
+        name: "chromium/try-stable/win_chromium_compile_dbg_ng"
+      >
       retry_config: <
         single_quota: 1
         global_quota: 2
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 99b4997..35f6b5c 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -599,6 +599,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -620,6 +621,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -641,6 +643,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -662,6 +665,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -747,6 +751,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -768,6 +773,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -789,6 +795,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -1022,6 +1029,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1043,6 +1051,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1064,6 +1073,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1144,6 +1154,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1165,6 +1176,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1186,6 +1198,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1270,6 +1283,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1291,6 +1305,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1312,6 +1327,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1396,6 +1412,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1417,6 +1434,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -1438,6 +1456,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.dawn\""
@@ -2550,6 +2569,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.linux\""
@@ -3193,6 +3213,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.linux\""
@@ -4002,6 +4023,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -4148,6 +4170,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -4169,6 +4192,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -4936,6 +4960,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.fyi\""
@@ -6019,6 +6044,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -6378,6 +6404,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -6399,6 +6426,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.android\""
@@ -6503,6 +6531,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.chromiumos\""
@@ -6610,6 +6639,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.chromiumos\""
@@ -6631,6 +6661,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.fyi\""
@@ -6652,6 +6683,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.linux\""
@@ -6736,6 +6768,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.linux\""
@@ -6757,6 +6790,7 @@
         name: "chromium"
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
         properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
         properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
         properties_j: "mastername:\"chromium.linux\""
@@ -8125,6 +8159,1856 @@
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
     >
     builders: <
+      name: "Android WebView M (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Android WebView N (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Android WebView O (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Android WebView P (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Android arm Builder (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Android arm64 Builder (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Android x64 Builder (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Android x86 Builder (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Cast Android (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Cast Linux"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":50,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Linux x64 DEPS Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Linux x64 DEPS Release (Intel HD 630)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Linux x64 DEPS Release (NVIDIA)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Mac x64 DEPS Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Dawn Mac x64 DEPS Builder"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Mac x64 DEPS Release (AMD)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Mac x64 DEPS Release (Intel)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Win10 x64 DEPS Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Win10 x64 DEPS Release (NVIDIA)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Win10 x86 DEPS Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Dawn Win10 x86 DEPS Release (NVIDIA)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.dawn\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Fuchsia ARM64"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Fuchsia x64"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "GPU Linux Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.gpu\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "GPU Mac Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:GPU Mac Builder"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.gpu\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "GPU Win x64 Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.gpu\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux ASan LSan Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.memory\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux ASan LSan Tests (1)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.memory\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux ASan Tests (sandboxed)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.memory\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux Builder (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux Ozone Tester (Wayland)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux Ozone Tester (X11)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux Release (NVIDIA)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.gpu\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux Tests"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"jobs\":500}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Linux Tests (dbg)(1)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Mac Builder"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac-10.14"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac Builder (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Mac Builder (dbg)"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac Release (Intel)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.gpu\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac Retina Release (AMD)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.gpu\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac10.10 Tests"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Mac10.10 Tests"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac-10.13"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac10.11 Tests"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Mac10.11 Tests"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac-10.13"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac10.12 Tests"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Mac10.12 Tests"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac-10.12"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac10.13 Tests"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Mac10.13 Tests"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac-10.13"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac10.13 Tests (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Mac10.13 Tests (dbg)"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Mac10.14 Tests"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Mac10.14 Tests"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac-10.14"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Marshmallow 64 bit Tester"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Nougat Phone Tester"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Oreo Phone Tester"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "VR Linux"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.fyi\""
+      >
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "WebKit Mac10.13 (retina)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:WebKit Mac10.13 (retina)"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac-10.13"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Win 7 Tests x64 (1)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Win 7 Tests x64 (1)"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows-7"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.win\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Win Builder (dbg)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Win Builder (dbg)"
+      dimensions: "cores:32"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.win\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Win x64 Builder"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Win x64 Builder"
+      dimensions: "cores:32"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.win\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Win10 Tests x64"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Win10 Tests x64"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows-10"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.win\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Win10 Tests x64 1803"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Win10 Tests x64 1803"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows-10"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.fyi\""
+      >
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Win10 x64 Release (NVIDIA)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:2"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.gpu\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "Win7 Tests (dbg)(1)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:Win7 Tests (dbg)(1)"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows-7"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.win\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "android-cronet-arm-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "android-cronet-arm-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "android-cronet-kitkat-arm-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "android-cronet-lollipop-arm-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "android-kitkat-arm-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "android-marshmallow-arm64-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "android-pie-arm64-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "android-pie-arm64-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.android\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "chromeos-amd64-generic-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.chromiumos\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "chromeos-amd64-generic-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.chromiumos\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "chromeos-arm-generic-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.chromiumos\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "chromeos-kevin-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.chromiumos\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "chromeos-kevin-rel-hw-tests"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.fyi\""
+      >
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "fuchsia-arm64-cast"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "fuchsia-x64-cast"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "fuchsia-x64-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "ios-simulator"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:ios-simulator"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.ci"
+      recipe: <
+        name: "ios/unified_builder_tester"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.mac\""
+      >
+      execution_timeout_secs: 10800
+      caches: <
+        name: "xcode_ios_11c29"
+        path: "xcode_ios_11c29.app"
+      >
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "linux-chromeos-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.chromiumos\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "linux-chromeos-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.chromiumos\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "linux-ozone-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.linux\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
+      name: "mac-osxbeta-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.fyi\""
+      >
+      execution_timeout_secs: 36000
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+  >
+>
+buckets: <
+  name: "ci-stable"
+  acls: <
+    role: WRITER
+    group: "google/luci-task-force@google.com"
+  >
+  acls: <
+    group: "all"
+  >
+  acls: <
+    role: SCHEDULER
+    group: "project-chromium-ci-schedulers"
+  >
+  swarming: <
+    builders: <
+      name: "Android Release (Nexus 5X)"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"chromium.gpu\""
+      >
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+    >
+    builders: <
       name: "Android arm Builder (dbg)"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
@@ -9158,691 +11042,6 @@
   >
 >
 buckets: <
-  name: "ci-stable"
-  acls: <
-    role: WRITER
-    group: "google/luci-task-force@google.com"
-  >
-  acls: <
-    group: "all"
-  >
-  acls: <
-    role: SCHEDULER
-    group: "project-chromium-ci-schedulers"
-  >
-  swarming: <
-    builders: <
-      name: "Android Release (Nexus 5X)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.gpu\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "GPU Linux Builder"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.gpu\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "GPU Mac Builder"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:GPU Mac Builder"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.gpu\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "GPU Win x64 Builder"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Windows"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.gpu\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Linux Builder"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.linux\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Linux Ozone Tester (Wayland)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"jobs\":500}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.linux\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Linux Ozone Tester (X11)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"jobs\":500}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.linux\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Linux Release (NVIDIA)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:2"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.gpu\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Linux Tests"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"jobs\":500}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.linux\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Mac Builder"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Mac Builder"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-10.14"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.mac\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Mac Release (Intel)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:2"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.gpu\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Mac Retina Release (AMD)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:2"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.gpu\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Mac10.10 Tests"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Mac10.10 Tests"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-10.13"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.mac\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Mac10.11 Tests"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Mac10.11 Tests"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-10.13"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.mac\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Mac10.12 Tests"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Mac10.12 Tests"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-10.12"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.mac\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Mac10.13 Tests"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Mac10.13 Tests"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-10.13"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.mac\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Mac10.14 Tests"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Mac10.14 Tests"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-10.14"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.mac\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "WebKit Mac10.13 (retina)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:WebKit Mac10.13 (retina)"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-10.13"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.mac\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Win 7 Tests x64 (1)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Win 7 Tests x64 (1)"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Windows-7"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.win\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Win x64 Builder"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Win x64 Builder"
-      dimensions: "cores:32"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Windows"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.win\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Win10 Tests x64"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Win10 Tests x64"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Windows-10"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.win\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Win10 Tests x64 1803"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:Win10 Tests x64 1803"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Windows-10"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.fyi\""
-      >
-      execution_timeout_secs: 36000
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "Win10 x64 Release (NVIDIA)"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:2"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.gpu\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "android-kitkat-arm-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.android\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "android-marshmallow-arm64-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.android\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "chromeos-amd64-generic-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.chromiumos\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "ios-simulator"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:ios-simulator"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac"
-      dimensions: "pool:luci.chromium.ci"
-      recipe: <
-        name: "ios/unified_builder_tester"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.mac\""
-      >
-      execution_timeout_secs: 10800
-      caches: <
-        name: "xcode_ios_11c29"
-        path: "xcode_ios_11c29.app"
-      >
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "linux-chromeos-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.chromiumos\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "linux-ozone-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.linux\""
-      >
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-    builders: <
-      name: "mac-osxbeta-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/chromium_tests:{\"bucketed_triggers\":true}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"chromium.fyi\""
-      >
-      execution_timeout_secs: 36000
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-    >
-  >
->
-buckets: <
   name: "findit"
   acls: <
     identity: "user:findit-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -18827,6 +20026,1720 @@
       >
     >
     builders: <
+      name: "android-cronet-arm-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android-kitkat-arm-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android-marshmallow-arm64-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:16"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/code_coverage:{\"use_java_coverage\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android-pie-arm64-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android-pie-arm64-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:16"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android_compile_dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android_compile_x64_dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android_compile_x86_dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android_cronet"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "android_optional_gpu_tests_rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:android_optional_gpu_tests_rel"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 21600
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "cast_shell_android"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "cast_shell_linux"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "chromeos-amd64-generic-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "chromeos-amd64-generic-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "chromeos-arm-generic-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "chromeos-kevin-compile-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "chromeos-kevin-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "chromium_presubmit"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "presubmit"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$depot_tools/presubmit:{\"runhooks\":true,\"timeout_s\":480}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+        properties_j: "repo_name:\"chromium\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "closure_compilation"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "closure_compilation"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "dawn-linux-x64-deps-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:dawn-linux-x64-deps-rel"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.dawn\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "dawn-mac-x64-deps-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:dawn-mac-x64-deps-rel"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.dawn\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "dawn-win10-x64-deps-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:dawn-win10-x64-deps-rel"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.dawn\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "dawn-win10-x86-deps-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:dawn-win10-x86-deps-rel"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.dawn\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "fuchsia-arm64-cast"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "fuchsia-compile-x64-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "fuchsia-x64-cast"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "fuchsia_arm64"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "fuchsia_x64"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "ios-simulator"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:ios-simulator"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "ios/try"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.mac\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      caches: <
+        name: "xcode_ios_11c29"
+        path: "xcode_ios_11c29.app"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "ios-simulator-cronet"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:ios-simulator-cronet"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "ios/try"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.mac\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      caches: <
+        name: "xcode_ios_11c29"
+        path: "xcode_ios_11c29.app"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "ios-simulator-full-configs"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:ios-simulator-full-configs"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "ios/try"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.mac\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      caches: <
+        name: "xcode_ios_11c29"
+        path: "xcode_ios_11c29.app"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux-blink-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.blink\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux-chromeos-compile-dbg"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux-chromeos-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux-libfuzzer-asan-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_libfuzzer_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux-ozone-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux-ozone-x11-and-wayland-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux_chromium_asan_rel_ng"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux_chromium_compile_dbg_ng"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "builder"
+        path: "linux_debug"
+      >
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux_chromium_dbg_ng"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "builder"
+        path: "linux_debug"
+      >
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux_chromium_tsan_rel_ng"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux_layout_tests_composite_after_paint"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux_layout_tests_layout_ng_disabled"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux_optional_gpu_tests_rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:linux_optional_gpu_tests_rel"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 21600
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "linux_vr"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.linux\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "mac-coverage-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}"
+        properties_j: "$build/goma:{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.mac\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "mac-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.mac\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "mac_chromium_compile_dbg_ng"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac-10.13"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.mac\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "mac_optional_gpu_tests_rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:mac_optional_gpu_tests_rel"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Mac"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.mac\""
+      >
+      execution_timeout_secs: 21600
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "win-libfuzzer-asan-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builder:win-libfuzzer-asan-rel"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows"
+      dimensions: "pool:luci.chromium.try"
+      recipe: <
+        name: "chromium_libfuzzer_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.win\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "win10_chromium_x64_coverage_rel_ng"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows-10"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.win\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "win10_chromium_x64_rel_ng"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows-10"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:1"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.win\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "win_chromium_compile_dbg_ng"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows-10"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.win\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
+      name: "win_optional_gpu_tests_rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Windows-10"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "chromium_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.win\""
+      >
+      execution_timeout_secs: 21600
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+  >
+>
+buckets: <
+  name: "try-stable"
+  acls: <
+    role: WRITER
+    group: "service-account-chromium-tryserver"
+  >
+  acls: <
+    group: "all"
+  >
+  acls: <
+    role: SCHEDULER
+    identity: "user:findit-for-me@appspot.gserviceaccount.com"
+  >
+  acls: <
+    role: SCHEDULER
+    identity: "user:tricium-prod@appspot.gserviceaccount.com"
+  >
+  acls: <
+    role: SCHEDULER
+    group: "project-chromium-tryjob-access"
+  >
+  acls: <
+    role: SCHEDULER
+    group: "service-account-chromeperf"
+  >
+  acls: <
+    role: SCHEDULER
+    group: "service-account-cq"
+  >
+  swarming: <
+    builders: <
+      name: "android-binary-size"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      recipe: <
+        name: "binary_size_trybot"
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
+        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
+        properties_j: "mastername:\"tryserver.chromium.android\""
+      >
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      caches: <
+        name: "win_toolchain"
+        path: "win_toolchain"
+      >
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage: <
+        value: 5
+      >
+    >
+    builders: <
       name: "android-kitkat-arm-rel"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
@@ -19589,312 +22502,6 @@
   >
 >
 buckets: <
-  name: "try-stable"
-  acls: <
-    role: WRITER
-    group: "service-account-chromium-tryserver"
-  >
-  acls: <
-    group: "all"
-  >
-  acls: <
-    role: SCHEDULER
-    identity: "user:findit-for-me@appspot.gserviceaccount.com"
-  >
-  acls: <
-    role: SCHEDULER
-    identity: "user:tricium-prod@appspot.gserviceaccount.com"
-  >
-  acls: <
-    role: SCHEDULER
-    group: "project-chromium-tryjob-access"
-  >
-  acls: <
-    role: SCHEDULER
-    group: "service-account-chromeperf"
-  >
-  acls: <
-    role: SCHEDULER
-    group: "service-account-cq"
-  >
-  swarming: <
-    builders: <
-      name: "android-kitkat-arm-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium_trybot"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.android\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
-      name: "android-marshmallow-arm64-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:16"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:1"
-      recipe: <
-        name: "chromium_trybot"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/code_coverage:{\"use_java_coverage\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.android\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
-      name: "chromeos-amd64-generic-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium_trybot"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
-      name: "chromium_presubmit"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "presubmit"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$depot_tools/presubmit:{\"runhooks\":true,\"timeout_s\":480}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.linux\""
-        properties_j: "repo_name:\"chromium\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
-      name: "ios-simulator"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builder:ios-simulator"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac"
-      dimensions: "pool:luci.chromium.try"
-      recipe: <
-        name: "ios/try"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.mac\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      caches: <
-        name: "xcode_ios_11c29"
-        path: "xcode_ios_11c29.app"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
-      name: "linux-chromeos-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium_trybot"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.chromiumos\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
-      name: "linux-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium_trybot"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/code_coverage:{\"use_clang_coverage\":true}"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.linux\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
-      name: "mac-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:1"
-      recipe: <
-        name: "chromium_trybot"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/goma:{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.mac\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
-      name: "win10_chromium_x64_rel_ng"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Windows-10"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:1"
-      recipe: <
-        name: "chromium_trybot"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.win\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-  >
->
-buckets: <
   name: "webrtc"
   acls: <
     role: WRITER
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index 8f4ab7ee..72bfc45 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -11145,7 +11145,7 @@
   id: "main-beta"
   name: "Chromium Beta Console"
   repo_url: "https://chromium.googlesource.com/chromium/src"
-  refs: "regexp:refs/branch-heads/4044"
+  refs: "regexp:refs/branch-heads/4085"
   manifest_name: "REVISION"
   builders: <
     name: "buildbucket/luci.chromium.ci-beta/Linux Builder"
@@ -11173,11 +11173,36 @@
     short_name: "ozo"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Linux Builder (dbg)"
+    category: "chromium.linux|debug|builder"
+    short_name: "64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Linux Tests (dbg)(1)"
+    category: "chromium.linux|debug|tester"
+    short_name: "64"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-beta/Cast Linux"
     category: "chromium.linux|cast"
     short_name: "vid"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-beta/fuchsia-arm64-cast"
+    category: "chromium.linux|fuchsia|cast"
+    short_name: "a64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/fuchsia-x64-cast"
+    category: "chromium.linux|fuchsia|cast"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/fuchsia-x64-dbg"
+    category: "chromium.linux|fuchsia|x64"
+    short_name: "dbg"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-beta/Fuchsia ARM64"
     category: "chromium.linux|fuchsia|a64"
   >
@@ -11202,11 +11227,21 @@
     short_name: "arm"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-beta/chromeos-amd64-generic-dbg"
+    category: "chromium.chromiumos|simple|debug|x64"
+    short_name: "dbg"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-beta/chromeos-amd64-generic-rel"
     category: "chromium.chromiumos|simple|release|x64"
     short_name: "rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-beta/chromeos-kevin-rel"
+    category: "chromium.chromiumos|simple|release"
+    short_name: "kvn"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-beta/Mac Builder"
     category: "chromium.mac|release"
     short_name: "bld"
@@ -11317,11 +11352,76 @@
     short_name: "32"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Android arm64 Builder (dbg)"
+    category: "chromium.android|builder|arm"
+    short_name: "64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Android x86 Builder (dbg)"
+    category: "chromium.android|builder|x86"
+    short_name: "32"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Android x64 Builder (dbg)"
+    category: "chromium.android|builder|x86"
+    short_name: "64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Marshmallow 64 bit Tester"
+    category: "chromium.android|tester|phone"
+    short_name: "M"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Nougat Phone Tester"
+    category: "chromium.android|tester|phone"
+    short_name: "N"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Oreo Phone Tester"
+    category: "chromium.android|tester|phone"
+    short_name: "O"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/android-pie-arm64-dbg"
+    category: "chromium.android|tester|phone"
+    short_name: "P"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/android-pie-arm64-rel"
+    category: "chromium.android|on_cq"
+    short_name: "P"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Android WebView M (dbg)"
+    category: "chromium.android|tester|webview"
+    short_name: "M"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Android WebView N (dbg)"
+    category: "chromium.android|tester|webview"
+    short_name: "N"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Android WebView O (dbg)"
+    category: "chromium.android|tester|webview"
+    short_name: "O"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Android WebView P (dbg)"
+    category: "chromium.android|tester|webview"
+    short_name: "P"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-beta/android-cronet-arm-rel"
     category: "chromium.android|cronet|arm"
     short_name: "rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-beta/android-cronet-arm-dbg"
+    category: "cronet|arm"
+    short_name: "dbg"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-beta/android-cronet-kitkat-arm-rel"
     category: "chromium.android|cronet|test"
     short_name: "k"
@@ -11332,6 +11432,74 @@
     short_name: "l"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Linux x64 DEPS Builder"
+    category: "chromium.dawn|DEPS|Linux|Builder"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Linux x64 DEPS Release (Intel HD 630)"
+    category: "chromium.dawn|DEPS|Linux|Intel"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Linux x64 DEPS Release (NVIDIA)"
+    category: "chromium.dawn|DEPS|Linux|Nvidia"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Mac x64 DEPS Builder"
+    category: "chromium.dawn|DEPS|Mac|Builder"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Mac x64 DEPS Release (AMD)"
+    category: "chromium.dawn|DEPS|Mac|AMD"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Mac x64 DEPS Release (Intel)"
+    category: "chromium.dawn|DEPS|Mac|Intel"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x86 DEPS Builder"
+    category: "chromium.dawn|DEPS|Windows|Builder"
+    short_name: "x86"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x64 DEPS Builder"
+    category: "chromium.dawn|DEPS|Windows|Builder"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x86 DEPS Release (Intel HD 630)"
+    category: "chromium.dawn|DEPS|Windows|Intel"
+    short_name: "x86"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x64 DEPS Release (Intel HD 630)"
+    category: "chromium.dawn|DEPS|Windows|Intel"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x86 DEPS Release (NVIDIA)"
+    category: "chromium.dawn|DEPS|Windows|Nvidia"
+    short_name: "x86"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/Dawn Win10 x64 DEPS Release (NVIDIA)"
+    category: "chromium.dawn|DEPS|Windows|Nvidia"
+    short_name: "x64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/chromeos-kevin-rel-hw-tests"
+    category: "chromium.fyi|chromeos"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-beta/VR Linux"
+    category: "chromium.fyi|linux"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-beta/mac-osxbeta-rel"
     category: "chromium.fyi|mac"
     short_name: "osxbeta"
@@ -11642,7 +11810,7 @@
   id: "main-stable"
   name: "Chromium Stable Console"
   repo_url: "https://chromium.googlesource.com/chromium/src"
-  refs: "regexp:refs/branch-heads/3987"
+  refs: "regexp:refs/branch-heads/4044"
   manifest_name: "REVISION"
   builders: <
     name: "buildbucket/luci.chromium.ci-stable/Linux Builder"
@@ -11665,14 +11833,38 @@
     short_name: "tst"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-stable/linux-ozone-rel"
+    category: "chromium.linux|release"
+    short_name: "ozo"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Cast Linux"
+    category: "chromium.linux|cast"
+    short_name: "vid"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Fuchsia ARM64"
+    category: "chromium.linux|fuchsia|a64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Fuchsia x64"
+    category: "chromium.linux|fuchsia|x64"
+    short_name: "rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-stable/linux-chromeos-rel"
     category: "chromium.chromiumos|default"
     short_name: "rel"
   >
   builders: <
-    name: "buildbucket/luci.chromium.ci-stable/linux-ozone-rel"
-    category: "chromium.linux|release"
-    short_name: "ozo"
+    name: "buildbucket/luci.chromium.ci-stable/linux-chromeos-dbg"
+    category: "chromium.chromiumos|default"
+    short_name: "dbg"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/chromeos-arm-generic-rel"
+    category: "chromium.chromiumos|simple|release"
+    short_name: "arm"
   >
   builders: <
     name: "buildbucket/luci.chromium.ci-stable/chromeos-amd64-generic-rel"
@@ -11715,6 +11907,16 @@
     short_name: "ret"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Mac Builder (dbg)"
+    category: "chromium.mac|debug"
+    short_name: "bld"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Mac10.13 Tests (dbg)"
+    category: "chromium.mac|debug"
+    short_name: "13"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-stable/ios-simulator"
     category: "chromium.mac|ios|default"
     short_name: "sim"
@@ -11735,6 +11937,31 @@
     short_name: "w10"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Win Builder (dbg)"
+    category: "chromium.win|debug|builder"
+    short_name: "32"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Win7 Tests (dbg)(1)"
+    category: "chromium.win|debug|tester"
+    short_name: "7"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Linux ASan LSan Builder"
+    category: "chromium.memory|linux|asan lsan"
+    short_name: "bld"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Linux ASan LSan Tests (1)"
+    category: "chromium.memory|linux|asan lsan"
+    short_name: "tst"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Linux ASan Tests (sandboxed)"
+    category: "chromium.memory|linux|asan lsan"
+    short_name: "sbx"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-stable/android-kitkat-arm-rel"
     category: "chromium.android"
     short_name: "k"
@@ -11745,6 +11972,31 @@
     short_name: "m"
   >
   builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Cast Android (dbg)"
+    category: "chromium.android"
+    short_name: "cst"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/Android arm Builder (dbg)"
+    category: "chromium.android|builder|arm"
+    short_name: "32"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/android-cronet-arm-rel"
+    category: "chromium.android|cronet|arm"
+    short_name: "rel"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/android-cronet-kitkat-arm-rel"
+    category: "chromium.android|cronet|test"
+    short_name: "k"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.ci-stable/android-cronet-lollipop-arm-rel"
+    category: "chromium.android|cronet|test"
+    short_name: "l"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.ci-stable/mac-osxbeta-rel"
     category: "chromium.fyi|mac"
     short_name: "osxbeta"
@@ -12365,33 +12617,84 @@
     name: "buildbucket/luci.chromium.try-beta/android-binary-size"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/android-cronet-arm-dbg"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/android-kitkat-arm-rel"
   >
   builders: <
     name: "buildbucket/luci.chromium.try-beta/android-marshmallow-arm64-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/android-pie-arm64-dbg"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/android-pie-arm64-rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/android_compile_dbg"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/android_compile_x64_dbg"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/android_compile_x86_dbg"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/android_cronet"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/android_optional_gpu_tests_rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/cast_shell_android"
   >
   builders: <
     name: "buildbucket/luci.chromium.try-beta/cast_shell_linux"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/chromeos-amd64-generic-dbg"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/chromeos-amd64-generic-rel"
   >
   builders: <
     name: "buildbucket/luci.chromium.try-beta/chromeos-arm-generic-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/chromeos-kevin-compile-rel"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/chromeos-kevin-rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/chromium_presubmit"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/closure_compilation"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/dawn-linux-x64-deps-rel"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/dawn-mac-x64-deps-rel"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/dawn-win10-x64-deps-rel"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/dawn-win10-x86-deps-rel"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/fuchsia-arm64-cast"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/fuchsia-compile-x64-dbg"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/fuchsia-x64-cast"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/fuchsia_arm64"
   >
   builders: <
@@ -12401,6 +12704,15 @@
     name: "buildbucket/luci.chromium.try-beta/ios-simulator"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/ios-simulator-cronet"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/ios-simulator-full-configs"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/linux-blink-rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/linux-chromeos-compile-dbg"
   >
   builders: <
@@ -12413,6 +12725,9 @@
     name: "buildbucket/luci.chromium.try-beta/linux-ozone-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/linux-ozone-x11-and-wayland-rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/linux-rel"
   >
   builders: <
@@ -12422,55 +12737,133 @@
     name: "buildbucket/luci.chromium.try-beta/linux_chromium_compile_dbg_ng"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/linux_chromium_dbg_ng"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/linux_chromium_tsan_rel_ng"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/linux_layout_tests_composite_after_paint"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/linux_layout_tests_layout_ng_disabled"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/linux_optional_gpu_tests_rel"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/linux_vr"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/mac-coverage-rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/mac-rel"
   >
   builders: <
     name: "buildbucket/luci.chromium.try-beta/mac_chromium_compile_dbg_ng"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/mac_optional_gpu_tests_rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/win-libfuzzer-asan-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-beta/win10_chromium_x64_coverage_rel_ng"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-beta/win10_chromium_x64_rel_ng"
   >
   builders: <
     name: "buildbucket/luci.chromium.try-beta/win_chromium_compile_dbg_ng"
   >
+  builders: <
+    name: "buildbucket/luci.chromium.try-beta/win_optional_gpu_tests_rel"
+  >
   builder_view_only: true
 >
 consoles: <
   id: "try-stable"
   name: "try-stable"
   builders: <
+    name: "buildbucket/luci.chromium.try-stable/android-binary-size"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-stable/android-kitkat-arm-rel"
   >
   builders: <
     name: "buildbucket/luci.chromium.try-stable/android-marshmallow-arm64-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-stable/android_compile_dbg"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/android_cronet"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/cast_shell_android"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/cast_shell_linux"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-stable/chromeos-amd64-generic-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-stable/chromeos-arm-generic-rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-stable/chromium_presubmit"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-stable/fuchsia_arm64"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/fuchsia_x64"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-stable/ios-simulator"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-stable/linux-chromeos-compile-dbg"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-stable/linux-chromeos-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-stable/linux-libfuzzer-asan-rel"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/linux-ozone-rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-stable/linux-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-stable/linux_chromium_asan_rel_ng"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/linux_chromium_compile_dbg_ng"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/linux_chromium_tsan_rel_ng"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-stable/mac-rel"
   >
   builders: <
+    name: "buildbucket/luci.chromium.try-stable/mac_chromium_compile_dbg_ng"
+  >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/win-libfuzzer-asan-rel"
+  >
+  builders: <
     name: "buildbucket/luci.chromium.try-stable/win10_chromium_x64_rel_ng"
   >
+  builders: <
+    name: "buildbucket/luci.chromium.try-stable/win_chromium_compile_dbg_ng"
+  >
   builder_view_only: true
 >
 consoles: <
diff --git a/infra/config/generated/luci-notify.cfg b/infra/config/generated/luci-notify.cfg
index efbbd26..ff54cfd 100644
--- a/infra/config/generated/luci-notify.cfg
+++ b/infra/config/generated/luci-notify.cfg
@@ -699,6 +699,19 @@
   >
   builders: <
     bucket: "ci-beta"
+    name: "android-cronet-arm-dbg"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  >
+>
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cronet-bots-observer@google.com"
+    >
+  >
+  builders: <
+    bucket: "ci-beta"
     name: "android-cronet-arm-rel"
     repository: "https://chromium.googlesource.com/chromium/src"
   >
@@ -727,3 +740,105 @@
     name: "android-cronet-lollipop-arm-rel"
   >
 >
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cr-fuchsia+bot@chromium.org"
+    >
+  >
+  builders: <
+    bucket: "ci-beta"
+    name: "fuchsia-arm64-cast"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  >
+>
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cr-fuchsia+bot@chromium.org"
+    >
+  >
+  builders: <
+    bucket: "ci-beta"
+    name: "fuchsia-x64-cast"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  >
+>
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cr-fuchsia+bot@chromium.org"
+    >
+  >
+  builders: <
+    bucket: "ci-beta"
+    name: "fuchsia-x64-dbg"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  >
+>
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cr-fuchsia+bot@chromium.org"
+    >
+  >
+  builders: <
+    bucket: "ci-stable"
+    name: "Fuchsia ARM64"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  >
+>
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cr-fuchsia+bot@chromium.org"
+    >
+  >
+  builders: <
+    bucket: "ci-stable"
+    name: "Fuchsia x64"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  >
+>
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cronet-bots-observer@google.com"
+    >
+  >
+  builders: <
+    bucket: "ci-stable"
+    name: "android-cronet-arm-rel"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  >
+>
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cronet-bots-observer@google.com"
+    >
+  >
+  builders: <
+    bucket: "ci-stable"
+    name: "android-cronet-kitkat-arm-rel"
+  >
+>
+notifiers: <
+  notifications: <
+    on_change: true
+    email: <
+      recipients: "cronet-bots-observer@google.com"
+    >
+  >
+  builders: <
+    bucket: "ci-stable"
+    name: "android-cronet-lollipop-arm-rel"
+  >
+>
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg
index 2a3024a..5e3775b5 100644
--- a/infra/config/generated/luci-scheduler.cfg
+++ b/infra/config/generated/luci-scheduler.cfg
@@ -275,58 +275,6 @@
   >
 >
 job: <
-  id: "Android WebView M (dbg)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android WebView M (dbg)"
-  >
->
-job: <
-  id: "Android WebView N (dbg)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android WebView N (dbg)"
-  >
->
-job: <
-  id: "Android WebView O (dbg)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android WebView O (dbg)"
-  >
->
-job: <
-  id: "Android WebView P (dbg)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android WebView P (dbg)"
-  >
->
-job: <
   id: "Android WebView P Blink-CORS FYI (rel)"
   acl_sets: "ci"
   buildbucket: <
@@ -345,33 +293,6 @@
   >
 >
 job: <
-  id: "Android arm64 Builder (dbg)"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android arm64 Builder (dbg)"
-  >
->
-job: <
-  id: "Android x64 Builder (dbg)"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android x64 Builder (dbg)"
-  >
->
-job: <
-  id: "Android x86 Builder (dbg)"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android x86 Builder (dbg)"
-  >
->
-job: <
   id: "CFI Linux CF"
   acl_sets: "ci"
   buildbucket: <
@@ -619,41 +540,6 @@
   >
 >
 job: <
-  id: "Dawn Linux x64 DEPS Builder"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Linux x64 DEPS Builder"
-  >
->
-job: <
-  id: "Dawn Linux x64 DEPS Release (Intel HD 630)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Linux x64 DEPS Release (Intel HD 630)"
-  >
->
-job: <
-  id: "Dawn Linux x64 DEPS Release (NVIDIA)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Linux x64 DEPS Release (NVIDIA)"
-  >
->
-job: <
   id: "Dawn Linux x64 Release (Intel HD 630)"
   acls: <
     role: TRIGGERER
@@ -689,41 +575,6 @@
   >
 >
 job: <
-  id: "Dawn Mac x64 DEPS Builder"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Mac x64 DEPS Builder"
-  >
->
-job: <
-  id: "Dawn Mac x64 DEPS Release (AMD)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Mac x64 DEPS Release (AMD)"
-  >
->
-job: <
-  id: "Dawn Mac x64 DEPS Release (Intel)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Mac x64 DEPS Release (Intel)"
-  >
->
-job: <
   id: "Dawn Mac x64 Release (AMD)"
   acls: <
     role: TRIGGERER
@@ -759,41 +610,6 @@
   >
 >
 job: <
-  id: "Dawn Win10 x64 DEPS Builder"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Win10 x64 DEPS Builder"
-  >
->
-job: <
-  id: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
-  >
->
-job: <
-  id: "Dawn Win10 x64 DEPS Release (NVIDIA)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Win10 x64 DEPS Release (NVIDIA)"
-  >
->
-job: <
   id: "Dawn Win10 x64 Release (Intel HD 630)"
   acls: <
     role: TRIGGERER
@@ -829,41 +645,6 @@
   >
 >
 job: <
-  id: "Dawn Win10 x86 DEPS Builder"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Win10 x86 DEPS Builder"
-  >
->
-job: <
-  id: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
-  >
->
-job: <
-  id: "Dawn Win10 x86 DEPS Release (NVIDIA)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Dawn Win10 x86 DEPS Release (NVIDIA)"
-  >
->
-job: <
   id: "Dawn Win10 x86 Release (Intel HD 630)"
   acls: <
     role: TRIGGERER
@@ -1315,15 +1096,6 @@
   >
 >
 job: <
-  id: "Linux Builder (dbg)"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Linux Builder (dbg)"
-  >
->
-job: <
   id: "Linux Builder (dbg)(32)"
   acl_sets: "ci"
   buildbucket: <
@@ -1662,19 +1434,6 @@
   >
 >
 job: <
-  id: "Linux Tests (dbg)(1)"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Linux Tests (dbg)(1)"
-  >
->
-job: <
   id: "Linux Viz"
   acl_sets: "ci"
   buildbucket: <
@@ -2100,19 +1859,6 @@
   >
 >
 job: <
-  id: "Marshmallow 64 bit Tester"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Marshmallow 64 bit Tester"
-  >
->
-job: <
   id: "ci-Marshmallow Tablet Tester"
   acls: <
     role: TRIGGERER
@@ -2171,32 +1917,6 @@
   >
 >
 job: <
-  id: "Nougat Phone Tester"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Nougat Phone Tester"
-  >
->
-job: <
-  id: "Oreo Phone Tester"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Oreo Phone Tester"
-  >
->
-job: <
   id: "Site Isolation Android"
   acl_sets: "ci"
   buildbucket: <
@@ -2528,15 +2248,6 @@
   >
 >
 job: <
-  id: "VR Linux"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "VR Linux"
-  >
->
-job: <
   id: "WebKit Linux ASAN"
   acl_sets: "ci"
   buildbucket: <
@@ -3495,15 +3206,6 @@
   >
 >
 job: <
-  id: "android-cronet-arm-dbg"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "android-cronet-arm-dbg"
-  >
->
-job: <
   id: "android-cronet-arm64-dbg"
   acl_sets: "ci"
   buildbucket: <
@@ -3608,28 +3310,6 @@
   >
 >
 job: <
-  id: "android-pie-arm64-dbg"
-  acls: <
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  >
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "android-pie-arm64-dbg"
-  >
->
-job: <
-  id: "android-pie-arm64-rel"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "android-pie-arm64-rel"
-  >
->
-job: <
   id: "android-pie-x86-fyi-rel"
   acl_sets: "ci"
   buildbucket: <
@@ -3667,15 +3347,6 @@
   >
 >
 job: <
-  id: "chromeos-amd64-generic-dbg"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "chromeos-amd64-generic-dbg"
-  >
->
-job: <
   id: "chromeos-amd64-generic-rel-goma-canary"
   acl_sets: "goma"
   buildbucket: <
@@ -3730,24 +3401,6 @@
   >
 >
 job: <
-  id: "chromeos-kevin-rel"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "chromeos-kevin-rel"
-  >
->
-job: <
-  id: "chromeos-kevin-rel-hw-tests"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "chromeos-kevin-rel-hw-tests"
-  >
->
-job: <
   id: "ci-Android Release (Nexus 5X)"
   acl_sets: "ci"
   buildbucket: <
@@ -3757,6 +3410,58 @@
   >
 >
 job: <
+  id: "ci-Android WebView M (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android WebView M (dbg)"
+  >
+>
+job: <
+  id: "ci-Android WebView N (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android WebView N (dbg)"
+  >
+>
+job: <
+  id: "ci-Android WebView O (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android WebView O (dbg)"
+  >
+>
+job: <
+  id: "ci-Android WebView P (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android WebView P (dbg)"
+  >
+>
+job: <
   id: "ci-Android arm Builder (dbg)"
   acl_sets: "ci"
   buildbucket: <
@@ -3766,6 +3471,33 @@
   >
 >
 job: <
+  id: "ci-Android arm64 Builder (dbg)"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android arm64 Builder (dbg)"
+  >
+>
+job: <
+  id: "ci-Android x64 Builder (dbg)"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android x64 Builder (dbg)"
+  >
+>
+job: <
+  id: "ci-Android x86 Builder (dbg)"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android x86 Builder (dbg)"
+  >
+>
+job: <
   id: "ci-Cast Android (dbg)"
   acl_sets: "ci"
   buildbucket: <
@@ -3784,6 +3516,146 @@
   >
 >
 job: <
+  id: "ci-Dawn Linux x64 DEPS Builder"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Linux x64 DEPS Builder"
+  >
+>
+job: <
+  id: "ci-Dawn Linux x64 DEPS Release (Intel HD 630)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Linux x64 DEPS Release (Intel HD 630)"
+  >
+>
+job: <
+  id: "ci-Dawn Linux x64 DEPS Release (NVIDIA)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Linux x64 DEPS Release (NVIDIA)"
+  >
+>
+job: <
+  id: "ci-Dawn Mac x64 DEPS Builder"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Mac x64 DEPS Builder"
+  >
+>
+job: <
+  id: "ci-Dawn Mac x64 DEPS Release (AMD)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Mac x64 DEPS Release (AMD)"
+  >
+>
+job: <
+  id: "ci-Dawn Mac x64 DEPS Release (Intel)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Mac x64 DEPS Release (Intel)"
+  >
+>
+job: <
+  id: "ci-Dawn Win10 x64 DEPS Builder"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Win10 x64 DEPS Builder"
+  >
+>
+job: <
+  id: "ci-Dawn Win10 x64 DEPS Release (Intel HD 630)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
+  >
+>
+job: <
+  id: "ci-Dawn Win10 x64 DEPS Release (NVIDIA)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Win10 x64 DEPS Release (NVIDIA)"
+  >
+>
+job: <
+  id: "ci-Dawn Win10 x86 DEPS Builder"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Win10 x86 DEPS Builder"
+  >
+>
+job: <
+  id: "ci-Dawn Win10 x86 DEPS Release (Intel HD 630)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
+  >
+>
+job: <
+  id: "ci-Dawn Win10 x86 DEPS Release (NVIDIA)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Dawn Win10 x86 DEPS Release (NVIDIA)"
+  >
+>
+job: <
   id: "ci-Fuchsia ARM64"
   acl_sets: "ci"
   buildbucket: <
@@ -3873,6 +3745,15 @@
   >
 >
 job: <
+  id: "ci-Linux Builder (dbg)"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Linux Builder (dbg)"
+  >
+>
+job: <
   id: "ci-Linux Ozone Tester (Wayland)"
   acls: <
     role: TRIGGERER
@@ -3925,6 +3806,19 @@
   >
 >
 job: <
+  id: "ci-Linux Tests (dbg)(1)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Linux Tests (dbg)(1)"
+  >
+>
+job: <
   id: "ci-Mac Builder"
   acl_sets: "ci"
   buildbucket: <
@@ -4047,6 +3941,54 @@
   >
 >
 job: <
+  id: "ci-Marshmallow 64 bit Tester"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Marshmallow 64 bit Tester"
+  >
+>
+job: <
+  id: "ci-Nougat Phone Tester"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Nougat Phone Tester"
+  >
+>
+job: <
+  id: "ci-Oreo Phone Tester"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Oreo Phone Tester"
+  >
+>
+job: <
+  id: "ci-VR Linux"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "VR Linux"
+  >
+>
+job: <
   id: "ci-WebKit Mac10.13 (retina)"
   acls: <
     role: TRIGGERER
@@ -4143,6 +4085,15 @@
   >
 >
 job: <
+  id: "ci-android-cronet-arm-dbg"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "android-cronet-arm-dbg"
+  >
+>
+job: <
   id: "ci-android-cronet-arm-rel"
   acl_sets: "ci"
   buildbucket: <
@@ -4196,6 +4147,28 @@
   >
 >
 job: <
+  id: "ci-android-pie-arm64-dbg"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "android-pie-arm64-dbg"
+  >
+>
+job: <
+  id: "ci-android-pie-arm64-rel"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "android-pie-arm64-rel"
+  >
+>
+job: <
   id: "ci-beta-Android Release (Nexus 5X)"
   acl_sets: "ci-beta"
   buildbucket: <
@@ -4205,6 +4178,58 @@
   >
 >
 job: <
+  id: "ci-beta-Android WebView M (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Android WebView M (dbg)"
+  >
+>
+job: <
+  id: "ci-beta-Android WebView N (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Android WebView N (dbg)"
+  >
+>
+job: <
+  id: "ci-beta-Android WebView O (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Android WebView O (dbg)"
+  >
+>
+job: <
+  id: "ci-beta-Android WebView P (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Android WebView P (dbg)"
+  >
+>
+job: <
   id: "ci-beta-Android arm Builder (dbg)"
   acl_sets: "ci-beta"
   buildbucket: <
@@ -4214,6 +4239,33 @@
   >
 >
 job: <
+  id: "ci-beta-Android arm64 Builder (dbg)"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Android arm64 Builder (dbg)"
+  >
+>
+job: <
+  id: "ci-beta-Android x64 Builder (dbg)"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Android x64 Builder (dbg)"
+  >
+>
+job: <
+  id: "ci-beta-Android x86 Builder (dbg)"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Android x86 Builder (dbg)"
+  >
+>
+job: <
   id: "ci-beta-Cast Android (dbg)"
   acl_sets: "ci-beta"
   buildbucket: <
@@ -4232,6 +4284,146 @@
   >
 >
 job: <
+  id: "ci-beta-Dawn Linux x64 DEPS Builder"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Linux x64 DEPS Builder"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Linux x64 DEPS Release (Intel HD 630)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Linux x64 DEPS Release (Intel HD 630)"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Linux x64 DEPS Release (NVIDIA)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Linux x64 DEPS Release (NVIDIA)"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Mac x64 DEPS Builder"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Mac x64 DEPS Builder"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Mac x64 DEPS Release (AMD)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Mac x64 DEPS Release (AMD)"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Mac x64 DEPS Release (Intel)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Mac x64 DEPS Release (Intel)"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Win10 x64 DEPS Builder"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Win10 x64 DEPS Builder"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Win10 x64 DEPS Release (Intel HD 630)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Win10 x64 DEPS Release (Intel HD 630)"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Win10 x64 DEPS Release (NVIDIA)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Win10 x64 DEPS Release (NVIDIA)"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Win10 x86 DEPS Builder"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Win10 x86 DEPS Builder"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Win10 x86 DEPS Release (Intel HD 630)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Win10 x86 DEPS Release (Intel HD 630)"
+  >
+>
+job: <
+  id: "ci-beta-Dawn Win10 x86 DEPS Release (NVIDIA)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Dawn Win10 x86 DEPS Release (NVIDIA)"
+  >
+>
+job: <
   id: "ci-beta-Fuchsia ARM64"
   acl_sets: "ci-beta"
   buildbucket: <
@@ -4321,6 +4513,15 @@
   >
 >
 job: <
+  id: "ci-beta-Linux Builder (dbg)"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Linux Builder (dbg)"
+  >
+>
+job: <
   id: "ci-beta-Linux Ozone Tester (Wayland)"
   acls: <
     role: TRIGGERER
@@ -4373,6 +4574,19 @@
   >
 >
 job: <
+  id: "ci-beta-Linux Tests (dbg)(1)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Linux Tests (dbg)(1)"
+  >
+>
+job: <
   id: "ci-beta-Mac Builder"
   acl_sets: "ci-beta"
   buildbucket: <
@@ -4495,6 +4709,54 @@
   >
 >
 job: <
+  id: "ci-beta-Marshmallow 64 bit Tester"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Marshmallow 64 bit Tester"
+  >
+>
+job: <
+  id: "ci-beta-Nougat Phone Tester"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Nougat Phone Tester"
+  >
+>
+job: <
+  id: "ci-beta-Oreo Phone Tester"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "Oreo Phone Tester"
+  >
+>
+job: <
+  id: "ci-beta-VR Linux"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "VR Linux"
+  >
+>
+job: <
   id: "ci-beta-WebKit Mac10.13 (retina)"
   acls: <
     role: TRIGGERER
@@ -4591,6 +4853,15 @@
   >
 >
 job: <
+  id: "ci-beta-android-cronet-arm-dbg"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "android-cronet-arm-dbg"
+  >
+>
+job: <
   id: "ci-beta-android-cronet-arm-rel"
   acl_sets: "ci-beta"
   buildbucket: <
@@ -4644,6 +4915,37 @@
   >
 >
 job: <
+  id: "ci-beta-android-pie-arm64-dbg"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "android-pie-arm64-dbg"
+  >
+>
+job: <
+  id: "ci-beta-android-pie-arm64-rel"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "android-pie-arm64-rel"
+  >
+>
+job: <
+  id: "ci-beta-chromeos-amd64-generic-dbg"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "chromeos-amd64-generic-dbg"
+  >
+>
+job: <
   id: "ci-beta-chromeos-amd64-generic-rel"
   acl_sets: "ci-beta"
   buildbucket: <
@@ -4662,6 +4964,51 @@
   >
 >
 job: <
+  id: "ci-beta-chromeos-kevin-rel"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "chromeos-kevin-rel"
+  >
+>
+job: <
+  id: "ci-beta-chromeos-kevin-rel-hw-tests"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "chromeos-kevin-rel-hw-tests"
+  >
+>
+job: <
+  id: "ci-beta-fuchsia-arm64-cast"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "fuchsia-arm64-cast"
+  >
+>
+job: <
+  id: "ci-beta-fuchsia-x64-cast"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "fuchsia-x64-cast"
+  >
+>
+job: <
+  id: "ci-beta-fuchsia-x64-dbg"
+  acl_sets: "ci-beta"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-beta"
+    builder: "fuchsia-x64-dbg"
+  >
+>
+job: <
   id: "ci-beta-ios-simulator"
   acl_sets: "ci-beta"
   buildbucket: <
@@ -4711,6 +5058,15 @@
   >
 >
 job: <
+  id: "ci-chromeos-amd64-generic-dbg"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "chromeos-amd64-generic-dbg"
+  >
+>
+job: <
   id: "ci-chromeos-amd64-generic-rel"
   acl_sets: "ci"
   buildbucket: <
@@ -4729,6 +5085,51 @@
   >
 >
 job: <
+  id: "ci-chromeos-kevin-rel"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "chromeos-kevin-rel"
+  >
+>
+job: <
+  id: "ci-chromeos-kevin-rel-hw-tests"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "chromeos-kevin-rel-hw-tests"
+  >
+>
+job: <
+  id: "ci-fuchsia-arm64-cast"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "fuchsia-arm64-cast"
+  >
+>
+job: <
+  id: "ci-fuchsia-x64-cast"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "fuchsia-x64-cast"
+  >
+>
+job: <
+  id: "ci-fuchsia-x64-dbg"
+  acl_sets: "ci"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "fuchsia-x64-dbg"
+  >
+>
+job: <
   id: "ci-ios-simulator"
   acl_sets: "ci"
   buildbucket: <
@@ -4787,6 +5188,51 @@
   >
 >
 job: <
+  id: "ci-stable-Android arm Builder (dbg)"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Android arm Builder (dbg)"
+  >
+>
+job: <
+  id: "ci-stable-Cast Android (dbg)"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Cast Android (dbg)"
+  >
+>
+job: <
+  id: "ci-stable-Cast Linux"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Cast Linux"
+  >
+>
+job: <
+  id: "ci-stable-Fuchsia ARM64"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Fuchsia ARM64"
+  >
+>
+job: <
+  id: "ci-stable-Fuchsia x64"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Fuchsia x64"
+  >
+>
+job: <
   id: "ci-stable-GPU Linux Builder"
   acl_sets: "ci-stable"
   buildbucket: <
@@ -4814,6 +5260,41 @@
   >
 >
 job: <
+  id: "ci-stable-Linux ASan LSan Builder"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Linux ASan LSan Builder"
+  >
+>
+job: <
+  id: "ci-stable-Linux ASan LSan Tests (1)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Linux ASan LSan Tests (1)"
+  >
+>
+job: <
+  id: "ci-stable-Linux ASan Tests (sandboxed)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Linux ASan Tests (sandboxed)"
+  >
+>
+job: <
   id: "ci-stable-Linux Builder"
   acl_sets: "ci-stable"
   buildbucket: <
@@ -4884,6 +5365,15 @@
   >
 >
 job: <
+  id: "ci-stable-Mac Builder (dbg)"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Mac Builder (dbg)"
+  >
+>
+job: <
   id: "ci-stable-Mac Release (Intel)"
   acls: <
     role: TRIGGERER
@@ -4962,6 +5452,19 @@
   >
 >
 job: <
+  id: "ci-stable-Mac10.13 Tests (dbg)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Mac10.13 Tests (dbg)"
+  >
+>
+job: <
   id: "ci-stable-Mac10.14 Tests"
   acls: <
     role: TRIGGERER
@@ -5001,6 +5504,15 @@
   >
 >
 job: <
+  id: "ci-stable-Win Builder (dbg)"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Win Builder (dbg)"
+  >
+>
+job: <
   id: "ci-stable-Win x64 Builder"
   acl_sets: "ci-stable"
   buildbucket: <
@@ -5049,6 +5561,54 @@
   >
 >
 job: <
+  id: "ci-stable-Win7 Tests (dbg)(1)"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "Win7 Tests (dbg)(1)"
+  >
+>
+job: <
+  id: "ci-stable-android-cronet-arm-rel"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "android-cronet-arm-rel"
+  >
+>
+job: <
+  id: "ci-stable-android-cronet-kitkat-arm-rel"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "android-cronet-kitkat-arm-rel"
+  >
+>
+job: <
+  id: "ci-stable-android-cronet-lollipop-arm-rel"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "android-cronet-lollipop-arm-rel"
+  >
+>
+job: <
   id: "ci-stable-android-kitkat-arm-rel"
   acl_sets: "ci-stable"
   buildbucket: <
@@ -5076,6 +5636,15 @@
   >
 >
 job: <
+  id: "ci-stable-chromeos-arm-generic-rel"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "chromeos-arm-generic-rel"
+  >
+>
+job: <
   id: "ci-stable-ios-simulator"
   acl_sets: "ci-stable"
   buildbucket: <
@@ -5085,6 +5654,15 @@
   >
 >
 job: <
+  id: "ci-stable-linux-chromeos-dbg"
+  acl_sets: "ci-stable"
+  buildbucket: <
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci-stable"
+    builder: "linux-chromeos-dbg"
+  >
+>
+job: <
   id: "ci-stable-linux-chromeos-rel"
   acl_sets: "ci-stable"
   buildbucket: <
@@ -5116,15 +5694,6 @@
   >
 >
 job: <
-  id: "fuchsia-arm64-cast"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "fuchsia-arm64-cast"
-  >
->
-job: <
   id: "fuchsia-fyi-arm64-rel"
   acl_sets: "ci"
   buildbucket: <
@@ -5152,24 +5721,6 @@
   >
 >
 job: <
-  id: "fuchsia-x64-cast"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "fuchsia-x64-cast"
-  >
->
-job: <
-  id: "fuchsia-x64-dbg"
-  acl_sets: "ci"
-  buildbucket: <
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "fuchsia-x64-dbg"
-  >
->
-job: <
   id: "ios-device"
   acl_sets: "ci"
   buildbucket: <
@@ -5880,7 +6431,7 @@
   >
 >
 job: <
-  id: "ANGLE GPU Linux Release (Intel HD 630)"
+  id: "ci-ANGLE GPU Linux Release (Intel HD 630)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5890,7 +6441,27 @@
   noop: <>
 >
 job: <
-  id: "ANGLE GPU Linux Release (NVIDIA)"
+  id: "ci-beta-ANGLE GPU Linux Release (Intel HD 630)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-ANGLE GPU Linux Release (Intel HD 630)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-ANGLE GPU Linux Release (NVIDIA)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5900,7 +6471,27 @@
   noop: <>
 >
 job: <
-  id: "ANGLE GPU Mac Release (Intel)"
+  id: "ci-beta-ANGLE GPU Linux Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-ANGLE GPU Linux Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-ANGLE GPU Mac Release (Intel)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5910,7 +6501,27 @@
   noop: <>
 >
 job: <
-  id: "ANGLE GPU Mac Retina Release (AMD)"
+  id: "ci-beta-ANGLE GPU Mac Release (Intel)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-ANGLE GPU Mac Release (Intel)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-ANGLE GPU Mac Retina Release (AMD)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5920,7 +6531,27 @@
   noop: <>
 >
 job: <
-  id: "ANGLE GPU Mac Retina Release (NVIDIA)"
+  id: "ci-beta-ANGLE GPU Mac Retina Release (AMD)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-ANGLE GPU Mac Retina Release (AMD)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-ANGLE GPU Mac Retina Release (NVIDIA)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5930,7 +6561,27 @@
   noop: <>
 >
 job: <
-  id: "ANGLE GPU Win10 x64 Release (Intel HD 630)"
+  id: "ci-beta-ANGLE GPU Mac Retina Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-ANGLE GPU Mac Retina Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-ANGLE GPU Win10 x64 Release (Intel HD 630)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5940,7 +6591,27 @@
   noop: <>
 >
 job: <
-  id: "ANGLE GPU Win10 x64 Release (NVIDIA)"
+  id: "ci-beta-ANGLE GPU Win10 x64 Release (Intel HD 630)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-ANGLE GPU Win10 x64 Release (Intel HD 630)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-ANGLE GPU Win10 x64 Release (NVIDIA)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5950,7 +6621,27 @@
   noop: <>
 >
 job: <
-  id: "Optional Linux Release (Intel HD 630)"
+  id: "ci-beta-ANGLE GPU Win10 x64 Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-ANGLE GPU Win10 x64 Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-Optional Linux Release (Intel HD 630)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5960,7 +6651,27 @@
   noop: <>
 >
 job: <
-  id: "Optional Linux Release (NVIDIA)"
+  id: "ci-beta-Optional Linux Release (Intel HD 630)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-Optional Linux Release (Intel HD 630)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-Optional Linux Release (NVIDIA)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5970,7 +6681,27 @@
   noop: <>
 >
 job: <
-  id: "Optional Mac Release (Intel)"
+  id: "ci-beta-Optional Linux Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-Optional Linux Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-Optional Mac Release (Intel)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5980,7 +6711,27 @@
   noop: <>
 >
 job: <
-  id: "Optional Mac Retina Release (AMD)"
+  id: "ci-beta-Optional Mac Release (Intel)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-Optional Mac Release (Intel)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-Optional Mac Retina Release (AMD)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -5990,7 +6741,27 @@
   noop: <>
 >
 job: <
-  id: "Optional Mac Retina Release (NVIDIA)"
+  id: "ci-beta-Optional Mac Retina Release (AMD)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-Optional Mac Retina Release (AMD)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-Optional Mac Retina Release (NVIDIA)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -6000,7 +6771,27 @@
   noop: <>
 >
 job: <
-  id: "Optional Win10 x64 Release (Intel HD 630)"
+  id: "ci-beta-Optional Mac Retina Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-Optional Mac Retina Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-Optional Win10 x64 Release (Intel HD 630)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -6010,7 +6801,27 @@
   noop: <>
 >
 job: <
-  id: "Optional Win10 x64 Release (NVIDIA)"
+  id: "ci-beta-Optional Win10 x64 Release (Intel HD 630)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-Optional Win10 x64 Release (Intel HD 630)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-Optional Win10 x64 Release (NVIDIA)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -6020,7 +6831,27 @@
   noop: <>
 >
 job: <
-  id: "Win7 ANGLE Tryserver (AMD)"
+  id: "ci-beta-Optional Win10 x64 Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-Optional Win10 x64 Release (NVIDIA)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
+  id: "ci-Win7 ANGLE Tryserver (AMD)"
   schedule: "triggered"
   acls: <
     role: TRIGGERER
@@ -6030,6 +6861,26 @@
   noop: <>
 >
 job: <
+  id: "ci-beta-Win7 ANGLE Tryserver (AMD)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-beta"
+  noop: <>
+>
+job: <
+  id: "ci-stable-Win7 ANGLE Tryserver (AMD)"
+  schedule: "triggered"
+  acls: <
+    role: TRIGGERER
+    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
+  >
+  acl_sets: "ci-stable"
+  noop: <>
+>
+job: <
   id: "ci-beta-Android WebView L (dbg)"
   schedule: "triggered"
   acls: <
@@ -6154,8 +7005,15 @@
   acl_sets: "ci-beta"
   triggers: "ci-beta-Android Release (Nexus 5X)"
   triggers: "ci-beta-Android arm Builder (dbg)"
+  triggers: "ci-beta-Android arm64 Builder (dbg)"
+  triggers: "ci-beta-Android x64 Builder (dbg)"
+  triggers: "ci-beta-Android x86 Builder (dbg)"
   triggers: "ci-beta-Cast Android (dbg)"
   triggers: "ci-beta-Cast Linux"
+  triggers: "ci-beta-Dawn Linux x64 DEPS Builder"
+  triggers: "ci-beta-Dawn Mac x64 DEPS Builder"
+  triggers: "ci-beta-Dawn Win10 x64 DEPS Builder"
+  triggers: "ci-beta-Dawn Win10 x86 DEPS Builder"
   triggers: "ci-beta-Fuchsia ARM64"
   triggers: "ci-beta-Fuchsia x64"
   triggers: "ci-beta-GPU Linux Builder"
@@ -6163,22 +7021,32 @@
   triggers: "ci-beta-GPU Win x64 Builder"
   triggers: "ci-beta-Linux ASan LSan Builder"
   triggers: "ci-beta-Linux Builder"
+  triggers: "ci-beta-Linux Builder (dbg)"
   triggers: "ci-beta-Mac Builder"
   triggers: "ci-beta-Mac Builder (dbg)"
+  triggers: "ci-beta-VR Linux"
   triggers: "ci-beta-Win Builder (dbg)"
   triggers: "ci-beta-Win x64 Builder"
+  triggers: "ci-beta-android-cronet-arm-dbg"
   triggers: "ci-beta-android-cronet-arm-rel"
   triggers: "ci-beta-android-kitkat-arm-rel"
   triggers: "ci-beta-android-marshmallow-arm64-rel"
+  triggers: "ci-beta-android-pie-arm64-rel"
+  triggers: "ci-beta-chromeos-amd64-generic-dbg"
   triggers: "ci-beta-chromeos-amd64-generic-rel"
   triggers: "ci-beta-chromeos-arm-generic-rel"
+  triggers: "ci-beta-chromeos-kevin-rel"
+  triggers: "ci-beta-chromeos-kevin-rel-hw-tests"
+  triggers: "ci-beta-fuchsia-arm64-cast"
+  triggers: "ci-beta-fuchsia-x64-cast"
+  triggers: "ci-beta-fuchsia-x64-dbg"
   triggers: "ci-beta-ios-simulator"
   triggers: "ci-beta-linux-chromeos-dbg"
   triggers: "ci-beta-linux-chromeos-rel"
   triggers: "ci-beta-linux-ozone-rel"
   gitiles: <
     repo: "https://chromium.googlesource.com/chromium/src"
-    refs: "regexp:refs/branch-heads/4044"
+    refs: "regexp:refs/branch-heads/4085"
   >
 >
 trigger: <
@@ -6212,9 +7080,9 @@
   triggers: "Android WebView P Blink-CORS FYI (rel)"
   triggers: "Android WebView P FYI (rel)"
   triggers: "ci-Android arm Builder (dbg)"
-  triggers: "Android arm64 Builder (dbg)"
-  triggers: "Android x64 Builder (dbg)"
-  triggers: "Android x86 Builder (dbg)"
+  triggers: "ci-Android arm64 Builder (dbg)"
+  triggers: "ci-Android x64 Builder (dbg)"
+  triggers: "ci-Android x86 Builder (dbg)"
   triggers: "CFI Linux CF"
   triggers: "CFI Linux ToT"
   triggers: "ci-Cast Android (dbg)"
@@ -6225,13 +7093,13 @@
   triggers: "CrWinAsan"
   triggers: "CrWinAsan(dll)"
   triggers: "Dawn Linux x64 Builder"
-  triggers: "Dawn Linux x64 DEPS Builder"
+  triggers: "ci-Dawn Linux x64 DEPS Builder"
   triggers: "Dawn Mac x64 Builder"
-  triggers: "Dawn Mac x64 DEPS Builder"
+  triggers: "ci-Dawn Mac x64 DEPS Builder"
   triggers: "Dawn Win10 x64 Builder"
-  triggers: "Dawn Win10 x64 DEPS Builder"
+  triggers: "ci-Dawn Win10 x64 DEPS Builder"
   triggers: "Dawn Win10 x86 Builder"
-  triggers: "Dawn Win10 x86 DEPS Builder"
+  triggers: "ci-Dawn Win10 x86 DEPS Builder"
   triggers: "Deterministic Android"
   triggers: "Deterministic Android (dbg)"
   triggers: "Deterministic Fuchsia (dbg)"
@@ -6278,7 +7146,7 @@
   triggers: "Libfuzzer Upload Windows ASan"
   triggers: "ci-Linux ASan LSan Builder"
   triggers: "ci-Linux Builder"
-  triggers: "Linux Builder (dbg)"
+  triggers: "ci-Linux Builder (dbg)"
   triggers: "Linux Builder (dbg)(32)"
   triggers: "Linux CFI"
   triggers: "Linux Chromium OS ASan LSan Builder"
@@ -6341,7 +7209,7 @@
   triggers: "UBSan Release"
   triggers: "UBSan vptr Release"
   triggers: "UBSanVptr Linux"
-  triggers: "VR Linux"
+  triggers: "ci-VR Linux"
   triggers: "WebKit Linux ASAN"
   triggers: "WebKit Linux Leak"
   triggers: "WebKit Linux MSAN"
@@ -6360,7 +7228,7 @@
   triggers: "android-asan"
   triggers: "android-bfcache-rel"
   triggers: "android-code-coverage-native"
-  triggers: "android-cronet-arm-dbg"
+  triggers: "ci-android-cronet-arm-dbg"
   triggers: "ci-android-cronet-arm-rel"
   triggers: "android-cronet-arm64-dbg"
   triggers: "android-cronet-arm64-rel"
@@ -6373,23 +7241,23 @@
   triggers: "android-lollipop-arm-rel"
   triggers: "ci-android-marshmallow-arm64-rel"
   triggers: "android-mojo-webview-rel"
-  triggers: "android-pie-arm64-rel"
+  triggers: "ci-android-pie-arm64-rel"
   triggers: "android-pie-x86-fyi-rel"
   triggers: "chromeos-amd64-generic-asan-rel"
   triggers: "chromeos-amd64-generic-cfi-thin-lto-rel"
-  triggers: "chromeos-amd64-generic-dbg"
+  triggers: "ci-chromeos-amd64-generic-dbg"
   triggers: "ci-chromeos-amd64-generic-rel"
   triggers: "chromeos-amd64-generic-rel-vm-tests"
   triggers: "chromeos-arm-generic-dbg"
   triggers: "ci-chromeos-arm-generic-rel"
-  triggers: "chromeos-kevin-rel"
-  triggers: "chromeos-kevin-rel-hw-tests"
-  triggers: "fuchsia-arm64-cast"
+  triggers: "ci-chromeos-kevin-rel"
+  triggers: "ci-chromeos-kevin-rel-hw-tests"
+  triggers: "ci-fuchsia-arm64-cast"
   triggers: "fuchsia-fyi-arm64-rel"
   triggers: "fuchsia-fyi-x64-dbg"
   triggers: "fuchsia-fyi-x64-rel"
-  triggers: "fuchsia-x64-cast"
-  triggers: "fuchsia-x64-dbg"
+  triggers: "ci-fuchsia-x64-cast"
+  triggers: "ci-fuchsia-x64-dbg"
   triggers: "ios-device"
   triggers: "ci-ios-simulator"
   triggers: "ios-simulator-code-coverage"
@@ -6527,21 +7395,32 @@
   id: "stable-gitiles-trigger"
   acl_sets: "ci-stable"
   triggers: "ci-stable-Android Release (Nexus 5X)"
+  triggers: "ci-stable-Android arm Builder (dbg)"
+  triggers: "ci-stable-Cast Android (dbg)"
+  triggers: "ci-stable-Cast Linux"
+  triggers: "ci-stable-Fuchsia ARM64"
+  triggers: "ci-stable-Fuchsia x64"
   triggers: "ci-stable-GPU Linux Builder"
   triggers: "ci-stable-GPU Mac Builder"
   triggers: "ci-stable-GPU Win x64 Builder"
+  triggers: "ci-stable-Linux ASan LSan Builder"
   triggers: "ci-stable-Linux Builder"
   triggers: "ci-stable-Mac Builder"
+  triggers: "ci-stable-Mac Builder (dbg)"
+  triggers: "ci-stable-Win Builder (dbg)"
   triggers: "ci-stable-Win x64 Builder"
+  triggers: "ci-stable-android-cronet-arm-rel"
   triggers: "ci-stable-android-kitkat-arm-rel"
   triggers: "ci-stable-android-marshmallow-arm64-rel"
   triggers: "ci-stable-chromeos-amd64-generic-rel"
+  triggers: "ci-stable-chromeos-arm-generic-rel"
   triggers: "ci-stable-ios-simulator"
+  triggers: "ci-stable-linux-chromeos-dbg"
   triggers: "ci-stable-linux-chromeos-rel"
   triggers: "ci-stable-linux-ozone-rel"
   gitiles: <
     repo: "https://chromium.googlesource.com/chromium/src"
-    refs: "regexp:refs/branch-heads/3987"
+    refs: "regexp:refs/branch-heads/4044"
   >
 >
 trigger: <
diff --git a/infra/config/generators/scheduler-noop-jobs.star b/infra/config/generators/scheduler-noop-jobs.star
index 4c4fa27..c411d96 100644
--- a/infra/config/generators/scheduler-noop-jobs.star
+++ b/infra/config/generators/scheduler-noop-jobs.star
@@ -2,9 +2,9 @@
 load('@stdlib//internal/luci/proto.star', 'scheduler_pb')
 
 _GPU_NOOP_JOBS = [scheduler_pb.Job(
-    id = builder,
+    id = '{}-{}'.format(bucket, builder),
     schedule = 'triggered',
-    acl_sets = ['ci'],
+    acl_sets = [bucket],
     acls = [scheduler_pb.Acl(
         role = scheduler_pb.Acl.TRIGGERER,
         granted_to = 'chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com',
@@ -26,6 +26,10 @@
     'Optional Win10 x64 Release (Intel HD 630)',
     'Optional Win10 x64 Release (NVIDIA)',
     'Win7 ANGLE Tryserver (AMD)',
+) for bucket in (
+    'ci',
+    'ci-beta',
+    'ci-stable',
 )]
 
 # Android testers which are triggered by Android arm Builder (dbg)
diff --git a/infra/config/versioned/milestones.star b/infra/config/versioned/milestones.star
index efa5cb5..450f75c 100644
--- a/infra/config/versioned/milestones.star
+++ b/infra/config/versioned/milestones.star
@@ -1,2 +1,2 @@
-beta = 'm81'
-stable = 'm80'
+beta = 'm82'
+stable = 'm81'
diff --git a/infra/config/versioned/milestones/m80/buckets/ci.star b/infra/config/versioned/milestones/m80/buckets/ci.star
deleted file mode 100644
index e7a393a..0000000
--- a/infra/config/versioned/milestones/m80/buckets/ci.star
+++ /dev/null
@@ -1,209 +0,0 @@
-load('//lib/builders.star', 'cpu', 'goma', 'os')
-load('//lib/ci.star', 'ci')
-load('//versioned/vars/ci.star', 'vars')
-# Load this using relative path so that the load statement doesn't
-# need to be changed when making a new milestone
-load('../vars.star', milestone_vars='vars')
-
-luci.bucket(
-    name = vars.bucket.get(),
-    acls = [
-        acl.entry(
-            roles = acl.BUILDBUCKET_READER,
-            groups = 'all',
-        ),
-        acl.entry(
-            roles = acl.BUILDBUCKET_TRIGGERER,
-            groups = 'project-chromium-ci-schedulers',
-        ),
-        acl.entry(
-            roles = acl.BUILDBUCKET_OWNER,
-            groups = 'google/luci-task-force@google.com',
-        ),
-    ],
-)
-
-luci.gitiles_poller(
-    name = vars.poller.get(),
-    bucket = vars.bucket.get(),
-    repo = 'https://chromium.googlesource.com/chromium/src',
-    refs = [milestone_vars.ref],
-)
-
-
-ci.defaults.bucket.set(vars.bucket.get())
-ci.defaults.bucketed_triggers.set(True)
-ci.defaults.triggered_by.set([vars.poller.get()])
-
-
-# Builders are sorted first lexicographically by the function used to define
-# them, then lexicographically by their name
-
-
-ci.android_builder(
-    name = 'android-kitkat-arm-rel',
-)
-
-ci.android_builder(
-    name = 'android-marshmallow-arm64-rel',
-)
-
-
-ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-rel',
-)
-
-ci.chromiumos_builder(
-    name = 'linux-chromeos-rel',
-)
-
-
-# This is launching & collecting entirely isolated tests.
-# OS shouldn't matter.
-ci.fyi_builder(
-    name = 'mac-osxbeta-rel',
-    goma_backend = None,
-    triggered_by = [vars.bucket.builder('Mac Builder')],
-)
-
-
-ci.fyi_windows_builder(
-    name = 'Win10 Tests x64 1803',
-    os = os.WINDOWS_10,
-    goma_backend = None,
-    triggered_by = [vars.bucket.builder('Win x64 Builder')],
-)
-
-
-ci.gpu_builder(
-    name = 'Android Release (Nexus 5X)',
-)
-
-ci.gpu_builder(
-    name = 'GPU Linux Builder',
-)
-
-ci.gpu_builder(
-    name = 'GPU Mac Builder',
-    cores = None,
-    os = os.MAC_ANY,
-)
-
-ci.gpu_builder(
-    name = 'GPU Win x64 Builder',
-    builderless = True,
-    os = os.WINDOWS_ANY,
-)
-
-
-ci.gpu_thin_tester(
-    name = 'Linux Release (NVIDIA)',
-    triggered_by = [vars.bucket.builder('GPU Linux Builder')],
-)
-
-ci.gpu_thin_tester(
-    name = 'Mac Release (Intel)',
-    triggered_by = [vars.bucket.builder('GPU Mac Builder')],
-)
-
-ci.gpu_thin_tester(
-    name = 'Mac Retina Release (AMD)',
-    triggered_by = [vars.bucket.builder('GPU Mac Builder')],
-)
-
-ci.gpu_thin_tester(
-    name = 'Win10 x64 Release (NVIDIA)',
-    triggered_by = [vars.bucket.builder('GPU Win x64 Builder')],
-)
-
-
-ci.linux_builder(
-    name = 'Linux Builder',
-)
-
-ci.linux_builder(
-    name = 'Linux Tests',
-    goma_backend = None,
-    triggered_by = [vars.bucket.builder('Linux Builder')],
-)
-
-ci.linux_builder(
-    name = 'linux-ozone-rel',
-)
-
-ci.linux_builder(
-    name = 'Linux Ozone Tester (Wayland)',
-    goma_backend = None,
-    triggered_by = [vars.bucket.builder('linux-ozone-rel')],
-)
-
-ci.linux_builder(
-    name = 'Linux Ozone Tester (X11)',
-    goma_backend = None,
-    triggered_by = [vars.bucket.builder('linux-ozone-rel')],
-)
-
-
-ci.mac_builder(
-    name = 'Mac Builder',
-    os = os.MAC_10_14,
-)
-
-# The build runs on 10.13, but triggers tests on 10.10 bots.
-ci.mac_builder(
-    name = 'Mac10.10 Tests',
-    triggered_by = [vars.bucket.builder('Mac Builder')],
-)
-
-# The build runs on 10.13, but triggers tests on 10.11 bots.
-ci.mac_builder(
-    name = 'Mac10.11 Tests',
-    triggered_by = [vars.bucket.builder('Mac Builder')],
-)
-
-ci.mac_builder(
-    name = 'Mac10.12 Tests',
-    os = os.MAC_10_12,
-    triggered_by = [vars.bucket.builder('Mac Builder')],
-)
-
-ci.mac_builder(
-    name = 'Mac10.13 Tests',
-    os = os.MAC_10_13,
-    triggered_by = [vars.bucket.builder('Mac Builder')],
-)
-
-ci.mac_builder(
-    name = 'Mac10.14 Tests',
-    os = os.MAC_10_14,
-    triggered_by = [vars.bucket.builder('Mac Builder')],
-)
-
-ci.mac_builder(
-    name = 'WebKit Mac10.13 (retina)',
-    os = os.MAC_10_13,
-    triggered_by = [vars.bucket.builder('Mac Builder')],
-)
-
-
-ci.mac_ios_builder(
-    name = 'ios-simulator',
-)
-
-
-ci.win_builder(
-    name = 'Win 7 Tests x64 (1)',
-    os = os.WINDOWS_7,
-    triggered_by = [vars.bucket.builder('Win x64 Builder')],
-)
-
-ci.win_builder(
-    name = 'Win x64 Builder',
-    cores = 32,
-    os = os.WINDOWS_ANY,
-)
-
-ci.win_builder(
-    name = 'Win10 Tests x64',
-    triggered_by = [vars.bucket.builder('Win x64 Builder')],
-)
diff --git a/infra/config/versioned/milestones/m80/buckets/try.star b/infra/config/versioned/milestones/m80/buckets/try.star
deleted file mode 100644
index a74315f..0000000
--- a/infra/config/versioned/milestones/m80/buckets/try.star
+++ /dev/null
@@ -1,135 +0,0 @@
-load('//lib/builders.star', 'cpu', 'goma', 'os')
-load('//lib/try.star', 'try_')
-load('//versioned/vars/try.star', 'vars')
-# Load this using relative path so that the load statement doesn't
-# need to be changed when making a new milestone
-load('../vars.star', milestone_vars='vars')
-
-luci.bucket(
-    name = vars.bucket.get(),
-    acls = [
-        acl.entry(
-            roles = acl.BUILDBUCKET_READER,
-            groups = 'all',
-        ),
-        acl.entry(
-            roles = acl.BUILDBUCKET_TRIGGERER,
-            users = [
-                'findit-for-me@appspot.gserviceaccount.com',
-                'tricium-prod@appspot.gserviceaccount.com',
-            ],
-            groups = [
-                'project-chromium-tryjob-access',
-                # Allow Pinpoint to trigger builds for bisection
-                'service-account-chromeperf',
-                'service-account-cq',
-            ],
-        ),
-        acl.entry(
-            roles = acl.BUILDBUCKET_OWNER,
-            groups = 'service-account-chromium-tryserver',
-        ),
-    ],
-)
-
-luci.cq_group(
-    name = vars.cq_group.get(),
-    cancel_stale_tryjobs = True,
-    retry_config = cq.RETRY_ALL_FAILURES,
-    watch = cq.refset(
-        repo = 'https://chromium.googlesource.com/chromium/src',
-        refs = [milestone_vars.cq_ref_regexp],
-    ),
-    acls = [
-        acl.entry(
-            acl.CQ_COMMITTER,
-            groups = 'project-chromium-committers',
-        ),
-        acl.entry(
-            acl.CQ_DRY_RUNNER,
-            groups = 'project-chromium-tryjob-access',
-        ),
-    ],
-)
-
-try_.defaults.bucket.set(vars.bucket.get())
-try_.defaults.cq_group.set(vars.cq_group.get())
-
-
-# Builders are sorted first lexicographically by the function used to define
-# them, then lexicographically by their name
-
-
-try_.chromium_android_builder(
-    name = 'android-kitkat-arm-rel',
-    goma_jobs = goma.jobs.J150,
-    tryjob = try_.job(),
-)
-
-try_.chromium_android_builder(
-    name = 'android-marshmallow-arm64-rel',
-    cores = 16,
-    goma_jobs = goma.jobs.J300,
-    ssd = True,
-    use_java_coverage = True,
-    tryjob = try_.job(),
-)
-
-
-try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-rel',
-    tryjob = try_.job(),
-)
-
-try_.chromium_chromiumos_builder(
-    name = 'linux-chromeos-rel',
-    goma_jobs = goma.jobs.J150,
-    tryjob = try_.job(),
-    use_clang_coverage = True,
-)
-
-
-try_.chromium_linux_builder(
-    name = 'chromium_presubmit',
-    executable = 'recipe:presubmit',
-    goma_backend = None,
-    properties = {
-        '$depot_tools/presubmit': {
-            'runhooks': True,
-            'timeout_s': 480,
-        },
-        'repo_name': 'chromium',
-    },
-    tryjob = try_.job(
-        disable_reuse = True,
-    ),
-)
-
-try_.chromium_linux_builder(
-    name = 'linux-rel',
-    goma_jobs = goma.jobs.J150,
-    tryjob = try_.job(),
-    use_clang_coverage = True,
-)
-
-
-try_.chromium_mac_builder(
-    name = 'mac-rel',
-    goma_jobs = goma.jobs.J150,
-    tryjob = try_.job(),
-)
-
-
-try_.chromium_mac_ios_builder(
-    name = 'ios-simulator',
-    tryjob = try_.job(),
-)
-
-
-try_.chromium_win_builder(
-    name = 'win10_chromium_x64_rel_ng',
-    goma_jobs = goma.jobs.J150,
-    os = os.WINDOWS_10,
-    ssd = True,
-    tryjob = try_.job(),
-)
diff --git a/infra/config/versioned/milestones/m80/vars.star b/infra/config/versioned/milestones/m80/vars.star
deleted file mode 100644
index ef5726d..0000000
--- a/infra/config/versioned/milestones/m80/vars.star
+++ /dev/null
@@ -1,4 +0,0 @@
-vars = struct(
-    ref = 'refs/branch-heads/3987',
-    cq_ref_regexp = 'refs/branch-heads/3987'
-)
diff --git a/infra/config/versioned/milestones/m82/buckets/ci.star b/infra/config/versioned/milestones/m82/buckets/ci.star
new file mode 100644
index 0000000..d22dcdf
--- /dev/null
+++ b/infra/config/versioned/milestones/m82/buckets/ci.star
@@ -0,0 +1,479 @@
+load('//lib/builders.star', 'cpu', 'goma', 'os')
+load('//lib/ci.star', 'ci')
+load('//versioned/vars/ci.star', 'vars')
+# Load this using relative path so that the load statement doesn't
+# need to be changed when making a new milestone
+load('../vars.star', milestone_vars='vars')
+
+luci.bucket(
+    name = vars.bucket.get(),
+    acls = [
+        acl.entry(
+            roles = acl.BUILDBUCKET_READER,
+            groups = 'all',
+        ),
+        acl.entry(
+            roles = acl.BUILDBUCKET_TRIGGERER,
+            groups = 'project-chromium-ci-schedulers',
+        ),
+        acl.entry(
+            roles = acl.BUILDBUCKET_OWNER,
+            groups = 'google/luci-task-force@google.com',
+        ),
+    ],
+)
+
+luci.gitiles_poller(
+    name = vars.poller.get(),
+    bucket = vars.bucket.get(),
+    repo = 'https://chromium.googlesource.com/chromium/src',
+    refs = [milestone_vars.ref],
+)
+
+
+ci.defaults.bucket.set(vars.bucket.get())
+ci.defaults.bucketed_triggers.set(True)
+ci.defaults.triggered_by.set([vars.poller.get()])
+
+
+# Builders are sorted first lexicographically by the function used to define
+# them, then lexicographically by their name
+
+
+ci.android_builder(
+    name = 'Android WebView M (dbg)',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Android WebView N (dbg)',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Android WebView O (dbg)',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Android WebView P (dbg)',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Android arm Builder (dbg)',
+    execution_timeout = 4 * time.hour,
+)
+
+ci.android_builder(
+    name = 'Android arm64 Builder (dbg)',
+    goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
+    execution_timeout = 4 * time.hour,
+)
+
+ci.android_builder(
+    name = 'Android x64 Builder (dbg)',
+    execution_timeout = 4 * time.hour,
+)
+
+ci.android_builder(
+    name = 'Android x86 Builder (dbg)',
+)
+
+ci.android_builder(
+    name = 'Cast Android (dbg)',
+)
+
+ci.android_builder(
+    name = 'Marshmallow 64 bit Tester',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Nougat Phone Tester',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Oreo Phone Tester',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'android-cronet-arm-dbg',
+    notifies = ['cronet'],
+)
+
+ci.android_builder(
+    name = 'android-cronet-arm-rel',
+    notifies = ['cronet'],
+)
+
+ci.android_builder(
+    name = 'android-cronet-kitkat-arm-rel',
+    notifies = ['cronet'],
+    triggered_by = [vars.bucket.builder('android-cronet-arm-rel')],
+)
+
+ci.android_builder(
+    name = 'android-cronet-lollipop-arm-rel',
+    notifies = ['cronet'],
+    triggered_by = [vars.bucket.builder('android-cronet-arm-rel')],
+)
+
+ci.android_builder(
+    name = 'android-kitkat-arm-rel',
+)
+
+ci.android_builder(
+    name = 'android-marshmallow-arm64-rel',
+)
+
+ci.android_builder(
+    name = 'android-pie-arm64-dbg',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'android-pie-arm64-rel',
+)
+
+
+ci.chromiumos_builder(
+    name = 'chromeos-amd64-generic-dbg',
+)
+
+ci.chromiumos_builder(
+    name = 'chromeos-amd64-generic-rel',
+)
+
+ci.chromiumos_builder(
+    name = 'chromeos-arm-generic-rel',
+)
+
+ci.chromiumos_builder(
+    name = 'chromeos-kevin-rel',
+)
+
+ci.fyi_builder(
+    name = 'chromeos-kevin-rel-hw-tests',
+)
+
+ci.chromiumos_builder(
+    name = 'linux-chromeos-dbg',
+)
+
+ci.chromiumos_builder(
+    name = 'linux-chromeos-rel',
+)
+
+
+ci.dawn_builder(
+    name = 'Dawn Linux x64 DEPS Builder',
+)
+
+ci.dawn_builder(
+    name = 'Dawn Linux x64 DEPS Release (Intel HD 630)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Linux x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Linux x64 DEPS Release (NVIDIA)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Linux x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Mac x64 DEPS Builder',
+    builderless = False,
+    cores = None,
+    os = os.MAC_ANY,
+)
+
+# Note that the Mac testers are all thin Linux VMs, triggering jobs on the
+# physical Mac hardware in the Swarming pool which is why they run on linux
+ci.dawn_builder(
+    name = 'Dawn Mac x64 DEPS Release (AMD)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Mac x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Mac x64 DEPS Release (Intel)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Mac x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x64 DEPS Builder',
+    os = os.WINDOWS_ANY,
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Win10 x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x64 DEPS Release (NVIDIA)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Win10 x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x86 DEPS Builder',
+    os = os.WINDOWS_ANY,
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Win10 x86 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x86 DEPS Release (NVIDIA)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Win10 x86 DEPS Builder')],
+)
+
+
+ci.fyi_builder(
+    name = 'VR Linux',
+)
+
+# This is launching & collecting entirely isolated tests.
+# OS shouldn't matter.
+ci.fyi_builder(
+    name = 'mac-osxbeta-rel',
+    goma_backend = None,
+    triggered_by = [vars.bucket.builder('Mac Builder')],
+)
+
+
+ci.fyi_windows_builder(
+    name = 'Win10 Tests x64 1803',
+    goma_backend = None,
+    os = os.WINDOWS_10,
+    triggered_by = [vars.bucket.builder('Win x64 Builder')],
+)
+
+
+ci.gpu_builder(
+    name = 'Android Release (Nexus 5X)',
+)
+
+ci.gpu_builder(
+    name = 'GPU Linux Builder',
+)
+
+ci.gpu_builder(
+    name = 'GPU Mac Builder',
+    cores = None,
+    os = os.MAC_ANY,
+)
+
+ci.gpu_builder(
+    name = 'GPU Win x64 Builder',
+    builderless = True,
+    os = os.WINDOWS_ANY,
+)
+
+
+ci.gpu_thin_tester(
+    name = 'Linux Release (NVIDIA)',
+    triggered_by = [vars.bucket.builder('GPU Linux Builder')],
+)
+
+ci.gpu_thin_tester(
+    name = 'Mac Release (Intel)',
+    triggered_by = [vars.bucket.builder('GPU Mac Builder')],
+)
+
+ci.gpu_thin_tester(
+    name = 'Mac Retina Release (AMD)',
+    triggered_by = [vars.bucket.builder('GPU Mac Builder')],
+)
+
+ci.gpu_thin_tester(
+    name = 'Win10 x64 Release (NVIDIA)',
+    triggered_by = [vars.bucket.builder('GPU Win x64 Builder')],
+)
+
+
+ci.linux_builder(
+    name = 'Cast Linux',
+    goma_jobs = goma.jobs.J50,
+)
+
+ci.linux_builder(
+    name = 'Fuchsia ARM64',
+    notifies = ['cr-fuchsia'],
+)
+
+ci.linux_builder(
+    name = 'Fuchsia x64',
+    notifies = ['cr-fuchsia'],
+)
+
+ci.linux_builder(
+    name = 'Linux Builder',
+)
+
+ci.linux_builder(
+    name = 'Linux Builder (dbg)',
+)
+
+ci.linux_builder(
+    name = 'Linux Tests',
+    goma_backend = None,
+    triggered_by = [vars.bucket.builder('Linux Builder')],
+)
+
+ci.linux_builder(
+    name = 'Linux Tests (dbg)(1)',
+    triggered_by = [vars.bucket.builder('Linux Builder (dbg)')],
+)
+
+ci.linux_builder(
+    name = 'fuchsia-arm64-cast',
+    notifies = ['cr-fuchsia'],
+)
+
+ci.linux_builder(
+    name = 'fuchsia-x64-cast',
+    notifies = ['cr-fuchsia'],
+)
+
+ci.linux_builder(
+    name = 'fuchsia-x64-dbg',
+    notifies = ['cr-fuchsia'],
+)
+
+ci.linux_builder(
+    name = 'linux-ozone-rel',
+)
+
+ci.linux_builder(
+    name = 'Linux Ozone Tester (Wayland)',
+    triggered_by = [vars.bucket.builder('linux-ozone-rel')],
+)
+
+ci.linux_builder(
+    name = 'Linux Ozone Tester (X11)',
+    triggered_by = [vars.bucket.builder('linux-ozone-rel')],
+)
+
+
+ci.mac_builder(
+    name = 'Mac Builder',
+    os = os.MAC_10_14,
+)
+
+ci.mac_builder(
+    name = 'Mac Builder (dbg)',
+    os = os.MAC_ANY,
+)
+
+# The build runs on 10.13, but triggers tests on 10.10 bots.
+ci.mac_builder(
+    name = 'Mac10.10 Tests',
+    triggered_by = [vars.bucket.builder('Mac Builder')],
+)
+
+# The build runs on 10.13, but triggers tests on 10.11 bots.
+ci.mac_builder(
+    name = 'Mac10.11 Tests',
+    triggered_by = [vars.bucket.builder('Mac Builder')],
+)
+
+ci.mac_builder(
+    name = 'Mac10.12 Tests',
+    os = os.MAC_10_12,
+    triggered_by = [vars.bucket.builder('Mac Builder')],
+)
+
+ci.mac_builder(
+    name = 'Mac10.13 Tests',
+    os = os.MAC_10_13,
+    triggered_by = [vars.bucket.builder('Mac Builder')],
+)
+
+ci.mac_builder(
+    name = 'Mac10.14 Tests',
+    os = os.MAC_10_14,
+    triggered_by = [vars.bucket.builder('Mac Builder')],
+)
+
+ci.mac_builder(
+    name = 'Mac10.13 Tests (dbg)',
+    os = os.MAC_ANY,
+    triggered_by = [vars.bucket.builder('Mac Builder (dbg)')],
+)
+
+ci.mac_builder(
+    name = 'WebKit Mac10.13 (retina)',
+    os = os.MAC_10_13,
+    triggered_by = [vars.bucket.builder('Mac Builder')],
+)
+
+
+ci.mac_ios_builder(
+    name = 'ios-simulator',
+)
+
+
+ci.memory_builder(
+    name = 'Linux ASan LSan Builder',
+    ssd = True,
+)
+
+ci.memory_builder(
+    name = 'Linux ASan LSan Tests (1)',
+    triggered_by = [vars.bucket.builder('Linux ASan LSan Builder')],
+)
+
+ci.memory_builder(
+    name = 'Linux ASan Tests (sandboxed)',
+    triggered_by = [vars.bucket.builder('Linux ASan LSan Builder')],
+)
+
+
+ci.win_builder(
+    name = 'Win7 Tests (dbg)(1)',
+    os = os.WINDOWS_7,
+    triggered_by = [vars.bucket.builder('Win Builder (dbg)')],
+)
+
+ci.win_builder(
+    name = 'Win 7 Tests x64 (1)',
+    os = os.WINDOWS_7,
+    triggered_by = [vars.bucket.builder('Win x64 Builder')],
+)
+
+ci.win_builder(
+    name = 'Win Builder (dbg)',
+    cores = 32,
+    os = os.WINDOWS_ANY,
+)
+
+ci.win_builder(
+    name = 'Win x64 Builder',
+    cores = 32,
+    os = os.WINDOWS_ANY,
+)
+
+ci.win_builder(
+    name = 'Win10 Tests x64',
+    triggered_by = [vars.bucket.builder('Win x64 Builder')],
+)
diff --git a/infra/config/versioned/milestones/m82/buckets/try.star b/infra/config/versioned/milestones/m82/buckets/try.star
new file mode 100644
index 0000000..a0da119
--- /dev/null
+++ b/infra/config/versioned/milestones/m82/buckets/try.star
@@ -0,0 +1,650 @@
+load('//lib/builders.star', 'cpu', 'goma', 'os')
+load('//lib/try.star', 'try_')
+load('//versioned/vars/try.star', 'vars')
+# Load this using relative path so that the load statement doesn't
+# need to be changed when making a new milestone
+load('../vars.star', milestone_vars='vars')
+
+luci.bucket(
+    name = vars.bucket.get(),
+    acls = [
+        acl.entry(
+            roles = acl.BUILDBUCKET_READER,
+            groups = 'all',
+        ),
+        acl.entry(
+            roles = acl.BUILDBUCKET_TRIGGERER,
+            users = [
+                'findit-for-me@appspot.gserviceaccount.com',
+                'tricium-prod@appspot.gserviceaccount.com',
+            ],
+            groups = [
+                'project-chromium-tryjob-access',
+                # Allow Pinpoint to trigger builds for bisection
+                'service-account-chromeperf',
+                'service-account-cq',
+            ],
+        ),
+        acl.entry(
+            roles = acl.BUILDBUCKET_OWNER,
+            groups = 'service-account-chromium-tryserver',
+        ),
+    ],
+)
+
+luci.cq_group(
+    name = vars.cq_group.get(),
+    cancel_stale_tryjobs = True,
+    retry_config = cq.RETRY_ALL_FAILURES,
+    tree_status_host = getattr(milestone_vars, 'tree_status_host', None),
+    watch = cq.refset(
+        repo = 'https://chromium.googlesource.com/chromium/src',
+        refs = [milestone_vars.cq_ref_regexp],
+    ),
+    acls = [
+        acl.entry(
+            acl.CQ_COMMITTER,
+            groups = 'project-chromium-committers',
+        ),
+        acl.entry(
+            acl.CQ_DRY_RUNNER,
+            groups = 'project-chromium-tryjob-access',
+        ),
+    ],
+)
+
+try_.defaults.bucket.set(vars.bucket.get())
+try_.defaults.cq_group.set(vars.cq_group.get())
+
+
+# Builders are sorted first lexicographically by the function used to define
+# them, then lexicographically by their name
+
+
+try_.blink_builder(
+    name = 'linux-blink-rel',
+    goma_backend = goma.backend.RBE_PROD,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/cc/.+',
+            '.+/[+]/third_party/blink/renderer/core/paint/.+',
+            '.+/[+]/third_party/blink/renderer/core/svg/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+        ],
+    ),
+)
+
+
+try_.chromium_android_builder(
+    name = 'android-binary-size',
+    executable = 'recipe:binary_size_trybot',
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+)
+
+try_.chromium_android_builder(
+    name = 'android-cronet-arm-dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/components/cronet/.+',
+            '.+/[+]/components/grpc_support/.+',
+            '.+/[+]/build/android/.+',
+            '.+/[+]/build/config/android/.+',
+        ],
+        location_regexp_exclude = [
+            '.+/[+]/components/cronet/ios/.+',
+        ],
+    ),
+)
+
+try_.chromium_android_builder(
+    name = 'android-kitkat-arm-rel',
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+)
+
+try_.chromium_android_builder(
+    name = 'android-marshmallow-arm64-rel',
+    cores = 16,
+    goma_jobs = goma.jobs.J300,
+    ssd = True,
+    use_java_coverage = True,
+    tryjob = try_.job(),
+)
+
+try_.chromium_android_builder(
+    name = 'android-pie-arm64-dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/android/features/vr/.+',
+            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
+            '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+',
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/third_party/gvr-android-sdk/.+',
+            '.+/[+]/third_party/arcore-android-sdk/.+',
+            '.+/[+]/third_party/arcore-android-sdk-client/.+',
+        ],
+    ),
+)
+
+try_.chromium_android_builder(
+    name = 'android-pie-arm64-rel',
+    cores = 16,
+    goma_jobs = goma.jobs.J300,
+    ssd = True,
+    tryjob = try_.job(),
+)
+
+try_.chromium_android_builder(
+    name = 'android_compile_dbg',
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+)
+
+try_.chromium_android_builder(
+    name = 'android_compile_x64_dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
+            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
+            '.+/[+]/sandbox/linux/system_headers/.+',
+            '.+/[+]/sandbox/linux/tests/.+',
+            '.+/[+]/third_party/gvr-android-sdk/.+',
+        ],
+    ),
+)
+
+try_.chromium_android_builder(
+    name = 'android_compile_x86_dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
+            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
+            '.+/[+]/sandbox/linux/system_headers/.+',
+            '.+/[+]/sandbox/linux/tests/.+',
+            '.+/[+]/third_party/gvr-android-sdk/.+',
+        ],
+    ),
+)
+
+try_.chromium_android_builder(
+    name = 'android_cronet',
+    tryjob = try_.job(),
+)
+
+try_.chromium_android_builder(
+    name = 'cast_shell_android',
+    tryjob = try_.job(),
+)
+
+
+try_.chromium_chromiumos_builder(
+    name = 'chromeos-amd64-generic-dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/content/gpu/.+',
+            '.+/[+]/media/.+',
+        ],
+    ),
+)
+
+try_.chromium_chromiumos_builder(
+    name = 'chromeos-amd64-generic-rel',
+    tryjob = try_.job(),
+)
+
+try_.chromium_chromiumos_builder(
+    name = 'chromeos-arm-generic-rel',
+    tryjob = try_.job(),
+)
+
+try_.chromium_chromiumos_builder(
+    name = 'chromeos-kevin-compile-rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chromeos/CHROMEOS_LKGM',
+        ],
+    ),
+)
+
+try_.chromium_chromiumos_builder(
+    name = 'chromeos-kevin-rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/build/chromeos/.+',
+            '.+/[+]/build/config/chromeos/.*',
+        ],
+    ),
+)
+
+try_.chromium_chromiumos_builder(
+    name = 'linux-chromeos-compile-dbg',
+    tryjob = try_.job(),
+)
+
+try_.chromium_chromiumos_builder(
+    name = 'linux-chromeos-rel',
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+    use_clang_coverage = True,
+)
+
+
+try_.chromium_dawn_builder(
+    name = 'dawn-linux-x64-deps-rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.dawn.json',
+            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
+            '.+/[+]/third_party/dawn/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/features.gni',
+        ],
+    ),
+)
+
+try_.chromium_dawn_builder(
+    name = 'dawn-mac-x64-deps-rel',
+    os = os.MAC_ANY,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.dawn.json',
+            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
+            '.+/[+]/third_party/dawn/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/features.gni',
+        ],
+    ),
+)
+
+try_.chromium_dawn_builder(
+    name = 'dawn-win10-x64-deps-rel',
+    os = os.WINDOWS_ANY,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.dawn.json',
+            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
+            '.+/[+]/third_party/dawn/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/features.gni',
+        ],
+    ),
+)
+
+try_.chromium_dawn_builder(
+    name = 'dawn-win10-x86-deps-rel',
+    os = os.WINDOWS_ANY,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.dawn.json',
+            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
+            '.+/[+]/third_party/dawn/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/features.gni',
+        ],
+    ),
+)
+
+
+try_.chromium_linux_builder(
+    name = 'cast_shell_linux',
+    tryjob = try_.job(),
+)
+
+try_.chromium_linux_builder(
+    name = 'closure_compilation',
+    executable = 'recipe:closure_compilation',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/third_party/closure_compiler/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'chromium_presubmit',
+    executable = 'recipe:presubmit',
+    goma_backend = None,
+    properties = {
+        '$depot_tools/presubmit': {
+            'runhooks': True,
+            'timeout_s': 480,
+        },
+        'repo_name': 'chromium',
+    },
+    tryjob = try_.job(
+        disable_reuse = True,
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'fuchsia-arm64-cast',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chromecast/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'fuchsia-compile-x64-dbg',
+    tryjob = try_.job(
+        experiment_percentage = 50,
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'fuchsia-x64-cast',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chromecast/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'fuchsia_arm64',
+    tryjob = try_.job(),
+)
+
+try_.chromium_linux_builder(
+    name = 'fuchsia_x64',
+    tryjob = try_.job(),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux-libfuzzer-asan-rel',
+    executable = 'recipe:chromium_libfuzzer_trybot',
+    tryjob = try_.job(),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux-ozone-rel',
+    tryjob = try_.job(),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux-ozone-x11-and-wayland-rel',
+    tryjob = try_.job(
+        experiment_percentage = 1,
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux-rel',
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+    use_clang_coverage = True,
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_chromium_asan_rel_ng',
+    goma_jobs = goma.jobs.J150,
+    ssd = True,
+    tryjob = try_.job(),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_chromium_compile_dbg_ng',
+    caches = [
+        swarming.cache(
+            name = 'builder',
+            path = 'linux_debug',
+        ),
+    ],
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_chromium_dbg_ng',
+    caches = [
+        swarming.cache(
+            name = 'builder',
+            path = 'linux_debug',
+        ),
+    ],
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/build/.*check_gn_headers.*',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_chromium_tsan_rel_ng',
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_layout_tests_composite_after_paint',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/third_party/blink/renderer/core/paint/.+',
+            '.+/[+]/third_party/blink/renderer/core/svg/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+            '.+/[+]/third_party/blink/web_tests/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_layout_tests_layout_ng_disabled',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/third_party/blink/renderer/core/editing/.+',
+            '.+/[+]/third_party/blink/renderer/core/layout/.+',
+            '.+/[+]/third_party/blink/renderer/core/paint/.+',
+            '.+/[+]/third_party/blink/renderer/core/svg/.+',
+            '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+            '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng',
+            '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_vr',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/browser/vr/.+',
+        ],
+    ),
+)
+
+
+try_.chromium_mac_builder(
+    name = 'mac-rel',
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+)
+
+try_.chromium_mac_builder(
+    name = 'mac-coverage-rel',
+    use_clang_coverage = True,
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(experiment_percentage = 3)
+)
+
+try_.chromium_mac_builder(
+    name = 'mac_chromium_compile_dbg_ng',
+    goma_jobs = goma.jobs.J150,
+    os = os.MAC_10_13,
+    tryjob = try_.job(),
+)
+
+
+try_.chromium_mac_ios_builder(
+    name = 'ios-simulator',
+    tryjob = try_.job(),
+)
+
+try_.chromium_mac_ios_builder(
+    name = 'ios-simulator-cronet',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/components/cronet/.+',
+            '.+/[+]/components/grpc_support/.+',
+            '.+/[+]/ios/.+',
+        ],
+        location_regexp_exclude = [
+            '.+/[+]/components/cronet/android/.+',
+        ],
+    ),
+)
+
+try_.chromium_mac_ios_builder(
+    name = 'ios-simulator-full-configs',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/ios/.+',
+        ],
+    ),
+)
+
+
+try_.chromium_win_builder(
+    name = 'win-libfuzzer-asan-rel',
+    builderless = False,
+    executable = 'recipe:chromium_libfuzzer_trybot',
+    os = os.WINDOWS_ANY,
+    tryjob = try_.job(),
+)
+
+try_.chromium_win_builder(
+    name = 'win_chromium_compile_dbg_ng',
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(),
+)
+
+try_.chromium_win_builder(
+    name = 'win10_chromium_x64_coverage_rel_ng',
+    os = os.WINDOWS_10,
+    use_clang_coverage = True,
+    goma_jobs = goma.jobs.J150,
+    ssd = True,
+    tryjob = try_.job(experiment_percentage = 3),
+)
+
+try_.chromium_win_builder(
+    name = 'win10_chromium_x64_rel_ng',
+    goma_jobs = goma.jobs.J150,
+    os = os.WINDOWS_10,
+    ssd = True,
+    use_clang_coverage = True,
+    tryjob = try_.job(),
+)
+
+
+try_.gpu_chromium_android_builder(
+    name = 'android_optional_gpu_tests_rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/cc/.+',
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/components/viz/.+',
+            '.+/[+]/content/test/gpu/.+',
+            '.+/[+]/gpu/.+',
+            '.+/[+]/media/audio/.+',
+            '.+/[+]/media/filters/.+',
+            '.+/[+]/media/gpu/.+',
+            '.+/[+]/services/viz/.+',
+            '.+/[+]/testing/trigger_scripts/.+',
+            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/.+',
+        ],
+    ),
+)
+
+
+try_.gpu_chromium_linux_builder(
+    name = 'linux_optional_gpu_tests_rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/content/test/gpu/.+',
+            '.+/[+]/gpu/.+',
+            '.+/[+]/media/audio/.+',
+            '.+/[+]/media/filters/.+',
+            '.+/[+]/media/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
+            '.+/[+]/testing/trigger_scripts/.+',
+            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/.+',
+        ],
+    ),
+)
+
+
+try_.gpu_chromium_mac_builder(
+    name = 'mac_optional_gpu_tests_rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/content/test/gpu/.+',
+            '.+/[+]/gpu/.+',
+            '.+/[+]/media/audio/.+',
+            '.+/[+]/media/filters/.+',
+            '.+/[+]/media/gpu/.+',
+            '.+/[+]/services/shape_detection/.+',
+            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
+            '.+/[+]/testing/trigger_scripts/.+',
+            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/.+',
+        ],
+    ),
+)
+
+
+try_.gpu_chromium_win_builder(
+    name = 'win_optional_gpu_tests_rel',
+    builderless = True,
+    os = os.WINDOWS_DEFAULT,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/content/test/gpu/.+',
+            '.+/[+]/device/vr/.+',
+            '.+/[+]/gpu/.+',
+            '.+/[+]/media/audio/.+',
+            '.+/[+]/media/filters/.+',
+            '.+/[+]/media/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
+            '.+/[+]/testing/trigger_scripts/.+',
+            '.+/[+]/third_party/blink/renderer/modules/vr/.+',
+            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
+            '.+/[+]/third_party/blink/renderer/modules/xr/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/.+',
+        ],
+    ),
+)
diff --git a/infra/config/versioned/milestones/m82/vars.star b/infra/config/versioned/milestones/m82/vars.star
new file mode 100644
index 0000000..fdbbdda
--- /dev/null
+++ b/infra/config/versioned/milestones/m82/vars.star
@@ -0,0 +1,4 @@
+vars = struct(
+    ref = 'refs/branch-heads/4085',
+    cq_ref_regexp = 'refs/branch-heads/4085',
+)
diff --git a/infra/config/versioned/trunk/buckets/ci.star b/infra/config/versioned/trunk/buckets/ci.star
index 0226a944..d22dcdf 100644
--- a/infra/config/versioned/trunk/buckets/ci.star
+++ b/infra/config/versioned/trunk/buckets/ci.star
@@ -41,15 +41,70 @@
 
 
 ci.android_builder(
+    name = 'Android WebView M (dbg)',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Android WebView N (dbg)',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Android WebView O (dbg)',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Android WebView P (dbg)',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
     name = 'Android arm Builder (dbg)',
     execution_timeout = 4 * time.hour,
 )
 
 ci.android_builder(
+    name = 'Android arm64 Builder (dbg)',
+    goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
+    execution_timeout = 4 * time.hour,
+)
+
+ci.android_builder(
+    name = 'Android x64 Builder (dbg)',
+    execution_timeout = 4 * time.hour,
+)
+
+ci.android_builder(
+    name = 'Android x86 Builder (dbg)',
+)
+
+ci.android_builder(
     name = 'Cast Android (dbg)',
 )
 
 ci.android_builder(
+    name = 'Marshmallow 64 bit Tester',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Nougat Phone Tester',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'Oreo Phone Tester',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'android-cronet-arm-dbg',
+    notifies = ['cronet'],
+)
+
+ci.android_builder(
     name = 'android-cronet-arm-rel',
     notifies = ['cronet'],
 )
@@ -74,6 +129,19 @@
     name = 'android-marshmallow-arm64-rel',
 )
 
+ci.android_builder(
+    name = 'android-pie-arm64-dbg',
+    triggered_by = [vars.bucket.builder('Android arm64 Builder (dbg)')],
+)
+
+ci.android_builder(
+    name = 'android-pie-arm64-rel',
+)
+
+
+ci.chromiumos_builder(
+    name = 'chromeos-amd64-generic-dbg',
+)
 
 ci.chromiumos_builder(
     name = 'chromeos-amd64-generic-rel',
@@ -84,6 +152,14 @@
 )
 
 ci.chromiumos_builder(
+    name = 'chromeos-kevin-rel',
+)
+
+ci.fyi_builder(
+    name = 'chromeos-kevin-rel-hw-tests',
+)
+
+ci.chromiumos_builder(
     name = 'linux-chromeos-dbg',
 )
 
@@ -92,6 +168,90 @@
 )
 
 
+ci.dawn_builder(
+    name = 'Dawn Linux x64 DEPS Builder',
+)
+
+ci.dawn_builder(
+    name = 'Dawn Linux x64 DEPS Release (Intel HD 630)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Linux x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Linux x64 DEPS Release (NVIDIA)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Linux x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Mac x64 DEPS Builder',
+    builderless = False,
+    cores = None,
+    os = os.MAC_ANY,
+)
+
+# Note that the Mac testers are all thin Linux VMs, triggering jobs on the
+# physical Mac hardware in the Swarming pool which is why they run on linux
+ci.dawn_builder(
+    name = 'Dawn Mac x64 DEPS Release (AMD)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Mac x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Mac x64 DEPS Release (Intel)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Mac x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x64 DEPS Builder',
+    os = os.WINDOWS_ANY,
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Win10 x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x64 DEPS Release (NVIDIA)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Win10 x64 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x86 DEPS Builder',
+    os = os.WINDOWS_ANY,
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Win10 x86 DEPS Builder')],
+)
+
+ci.dawn_builder(
+    name = 'Dawn Win10 x86 DEPS Release (NVIDIA)',
+    cores = 2,
+    os = os.LINUX_DEFAULT,
+    triggered_by = [vars.bucket.builder('Dawn Win10 x86 DEPS Builder')],
+)
+
+
+ci.fyi_builder(
+    name = 'VR Linux',
+)
+
 # This is launching & collecting entirely isolated tests.
 # OS shouldn't matter.
 ci.fyi_builder(
@@ -171,12 +331,36 @@
 )
 
 ci.linux_builder(
+    name = 'Linux Builder (dbg)',
+)
+
+ci.linux_builder(
     name = 'Linux Tests',
     goma_backend = None,
     triggered_by = [vars.bucket.builder('Linux Builder')],
 )
 
 ci.linux_builder(
+    name = 'Linux Tests (dbg)(1)',
+    triggered_by = [vars.bucket.builder('Linux Builder (dbg)')],
+)
+
+ci.linux_builder(
+    name = 'fuchsia-arm64-cast',
+    notifies = ['cr-fuchsia'],
+)
+
+ci.linux_builder(
+    name = 'fuchsia-x64-cast',
+    notifies = ['cr-fuchsia'],
+)
+
+ci.linux_builder(
+    name = 'fuchsia-x64-dbg',
+    notifies = ['cr-fuchsia'],
+)
+
+ci.linux_builder(
     name = 'linux-ozone-rel',
 )
 
diff --git a/infra/config/versioned/trunk/buckets/try.star b/infra/config/versioned/trunk/buckets/try.star
index a20bd94..a0da119 100644
--- a/infra/config/versioned/trunk/buckets/try.star
+++ b/infra/config/versioned/trunk/buckets/try.star
@@ -61,6 +61,20 @@
 # them, then lexicographically by their name
 
 
+try_.blink_builder(
+    name = 'linux-blink-rel',
+    goma_backend = goma.backend.RBE_PROD,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/cc/.+',
+            '.+/[+]/third_party/blink/renderer/core/paint/.+',
+            '.+/[+]/third_party/blink/renderer/core/svg/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+        ],
+    ),
+)
+
+
 try_.chromium_android_builder(
     name = 'android-binary-size',
     executable = 'recipe:binary_size_trybot',
@@ -69,6 +83,21 @@
 )
 
 try_.chromium_android_builder(
+    name = 'android-cronet-arm-dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/components/cronet/.+',
+            '.+/[+]/components/grpc_support/.+',
+            '.+/[+]/build/android/.+',
+            '.+/[+]/build/config/android/.+',
+        ],
+        location_regexp_exclude = [
+            '.+/[+]/components/cronet/ios/.+',
+        ],
+    ),
+)
+
+try_.chromium_android_builder(
     name = 'android-kitkat-arm-rel',
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
@@ -84,12 +113,65 @@
 )
 
 try_.chromium_android_builder(
+    name = 'android-pie-arm64-dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/android/features/vr/.+',
+            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
+            '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+',
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/third_party/gvr-android-sdk/.+',
+            '.+/[+]/third_party/arcore-android-sdk/.+',
+            '.+/[+]/third_party/arcore-android-sdk-client/.+',
+        ],
+    ),
+)
+
+try_.chromium_android_builder(
+    name = 'android-pie-arm64-rel',
+    cores = 16,
+    goma_jobs = goma.jobs.J300,
+    ssd = True,
+    tryjob = try_.job(),
+)
+
+try_.chromium_android_builder(
     name = 'android_compile_dbg',
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
+    name = 'android_compile_x64_dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
+            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
+            '.+/[+]/sandbox/linux/system_headers/.+',
+            '.+/[+]/sandbox/linux/tests/.+',
+            '.+/[+]/third_party/gvr-android-sdk/.+',
+        ],
+    ),
+)
+
+try_.chromium_android_builder(
+    name = 'android_compile_x86_dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
+            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
+            '.+/[+]/sandbox/linux/system_headers/.+',
+            '.+/[+]/sandbox/linux/tests/.+',
+            '.+/[+]/third_party/gvr-android-sdk/.+',
+        ],
+    ),
+)
+
+try_.chromium_android_builder(
     name = 'android_cronet',
     tryjob = try_.job(),
 )
@@ -101,8 +183,13 @@
 
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-arm-generic-rel',
-    tryjob = try_.job(),
+    name = 'chromeos-amd64-generic-dbg',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/content/gpu/.+',
+            '.+/[+]/media/.+',
+        ],
+    ),
 )
 
 try_.chromium_chromiumos_builder(
@@ -111,6 +198,30 @@
 )
 
 try_.chromium_chromiumos_builder(
+    name = 'chromeos-arm-generic-rel',
+    tryjob = try_.job(),
+)
+
+try_.chromium_chromiumos_builder(
+    name = 'chromeos-kevin-compile-rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chromeos/CHROMEOS_LKGM',
+        ],
+    ),
+)
+
+try_.chromium_chromiumos_builder(
+    name = 'chromeos-kevin-rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/build/chromeos/.+',
+            '.+/[+]/build/config/chromeos/.*',
+        ],
+    ),
+)
+
+try_.chromium_chromiumos_builder(
     name = 'linux-chromeos-compile-dbg',
     tryjob = try_.job(),
 )
@@ -123,12 +234,94 @@
 )
 
 
+try_.chromium_dawn_builder(
+    name = 'dawn-linux-x64-deps-rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.dawn.json',
+            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
+            '.+/[+]/third_party/dawn/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/features.gni',
+        ],
+    ),
+)
+
+try_.chromium_dawn_builder(
+    name = 'dawn-mac-x64-deps-rel',
+    os = os.MAC_ANY,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.dawn.json',
+            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
+            '.+/[+]/third_party/dawn/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/features.gni',
+        ],
+    ),
+)
+
+try_.chromium_dawn_builder(
+    name = 'dawn-win10-x64-deps-rel',
+    os = os.WINDOWS_ANY,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.dawn.json',
+            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
+            '.+/[+]/third_party/dawn/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/features.gni',
+        ],
+    ),
+)
+
+try_.chromium_dawn_builder(
+    name = 'dawn-win10-x86-deps-rel',
+    os = os.WINDOWS_ANY,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.dawn.json',
+            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
+            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
+            '.+/[+]/third_party/dawn/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/features.gni',
+        ],
+    ),
+)
+
+
 try_.chromium_linux_builder(
     name = 'cast_shell_linux',
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
+    name = 'closure_compilation',
+    executable = 'recipe:closure_compilation',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/third_party/closure_compiler/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
     name = 'chromium_presubmit',
     executable = 'recipe:presubmit',
     goma_backend = None,
@@ -145,6 +338,31 @@
 )
 
 try_.chromium_linux_builder(
+    name = 'fuchsia-arm64-cast',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chromecast/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'fuchsia-compile-x64-dbg',
+    tryjob = try_.job(
+        experiment_percentage = 50,
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'fuchsia-x64-cast',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chromecast/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
     name = 'fuchsia_arm64',
     tryjob = try_.job(),
 )
@@ -199,11 +417,63 @@
 )
 
 try_.chromium_linux_builder(
+    name = 'linux_chromium_dbg_ng',
+    caches = [
+        swarming.cache(
+            name = 'builder',
+            path = 'linux_debug',
+        ),
+    ],
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/build/.*check_gn_headers.*',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
     name = 'linux_chromium_tsan_rel_ng',
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
+try_.chromium_linux_builder(
+    name = 'linux_layout_tests_composite_after_paint',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/third_party/blink/renderer/core/paint/.+',
+            '.+/[+]/third_party/blink/renderer/core/svg/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+            '.+/[+]/third_party/blink/web_tests/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_layout_tests_layout_ng_disabled',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/third_party/blink/renderer/core/editing/.+',
+            '.+/[+]/third_party/blink/renderer/core/layout/.+',
+            '.+/[+]/third_party/blink/renderer/core/paint/.+',
+            '.+/[+]/third_party/blink/renderer/core/svg/.+',
+            '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+            '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng',
+            '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+',
+        ],
+    ),
+)
+
+try_.chromium_linux_builder(
+    name = 'linux_vr',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/browser/vr/.+',
+        ],
+    ),
+)
+
 
 try_.chromium_mac_builder(
     name = 'mac-rel',
@@ -212,6 +482,13 @@
 )
 
 try_.chromium_mac_builder(
+    name = 'mac-coverage-rel',
+    use_clang_coverage = True,
+    goma_jobs = goma.jobs.J150,
+    tryjob = try_.job(experiment_percentage = 3)
+)
+
+try_.chromium_mac_builder(
     name = 'mac_chromium_compile_dbg_ng',
     goma_jobs = goma.jobs.J150,
     os = os.MAC_10_13,
@@ -224,6 +501,29 @@
     tryjob = try_.job(),
 )
 
+try_.chromium_mac_ios_builder(
+    name = 'ios-simulator-cronet',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/components/cronet/.+',
+            '.+/[+]/components/grpc_support/.+',
+            '.+/[+]/ios/.+',
+        ],
+        location_regexp_exclude = [
+            '.+/[+]/components/cronet/android/.+',
+        ],
+    ),
+)
+
+try_.chromium_mac_ios_builder(
+    name = 'ios-simulator-full-configs',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/ios/.+',
+        ],
+    ),
+)
+
 
 try_.chromium_win_builder(
     name = 'win-libfuzzer-asan-rel',
@@ -240,6 +540,15 @@
 )
 
 try_.chromium_win_builder(
+    name = 'win10_chromium_x64_coverage_rel_ng',
+    os = os.WINDOWS_10,
+    use_clang_coverage = True,
+    goma_jobs = goma.jobs.J150,
+    ssd = True,
+    tryjob = try_.job(experiment_percentage = 3),
+)
+
+try_.chromium_win_builder(
     name = 'win10_chromium_x64_rel_ng',
     goma_jobs = goma.jobs.J150,
     os = os.WINDOWS_10,
@@ -247,3 +556,95 @@
     use_clang_coverage = True,
     tryjob = try_.job(),
 )
+
+
+try_.gpu_chromium_android_builder(
+    name = 'android_optional_gpu_tests_rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/cc/.+',
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/components/viz/.+',
+            '.+/[+]/content/test/gpu/.+',
+            '.+/[+]/gpu/.+',
+            '.+/[+]/media/audio/.+',
+            '.+/[+]/media/filters/.+',
+            '.+/[+]/media/gpu/.+',
+            '.+/[+]/services/viz/.+',
+            '.+/[+]/testing/trigger_scripts/.+',
+            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/.+',
+        ],
+    ),
+)
+
+
+try_.gpu_chromium_linux_builder(
+    name = 'linux_optional_gpu_tests_rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/content/test/gpu/.+',
+            '.+/[+]/gpu/.+',
+            '.+/[+]/media/audio/.+',
+            '.+/[+]/media/filters/.+',
+            '.+/[+]/media/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
+            '.+/[+]/testing/trigger_scripts/.+',
+            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/.+',
+        ],
+    ),
+)
+
+
+try_.gpu_chromium_mac_builder(
+    name = 'mac_optional_gpu_tests_rel',
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/content/test/gpu/.+',
+            '.+/[+]/gpu/.+',
+            '.+/[+]/media/audio/.+',
+            '.+/[+]/media/filters/.+',
+            '.+/[+]/media/gpu/.+',
+            '.+/[+]/services/shape_detection/.+',
+            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
+            '.+/[+]/testing/trigger_scripts/.+',
+            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/.+',
+        ],
+    ),
+)
+
+
+try_.gpu_chromium_win_builder(
+    name = 'win_optional_gpu_tests_rel',
+    builderless = True,
+    os = os.WINDOWS_DEFAULT,
+    tryjob = try_.job(
+        location_regexp = [
+            '.+/[+]/chrome/browser/vr/.+',
+            '.+/[+]/content/test/gpu/.+',
+            '.+/[+]/device/vr/.+',
+            '.+/[+]/gpu/.+',
+            '.+/[+]/media/audio/.+',
+            '.+/[+]/media/filters/.+',
+            '.+/[+]/media/gpu/.+',
+            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
+            '.+/[+]/testing/trigger_scripts/.+',
+            '.+/[+]/third_party/blink/renderer/modules/vr/.+',
+            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
+            '.+/[+]/third_party/blink/renderer/modules/xr/.+',
+            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
+            '.+/[+]/tools/clang/scripts/update.py',
+            '.+/[+]/ui/gl/.+',
+        ],
+    ),
+)
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 1d6c756..ca524305 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -357,7 +357,7 @@
 - (void)scheduleTasksRequiringBVCWithBrowserState;
 // Schedules the deletion of user downloaded files that might be leftover
 // from the last time Chrome was run.
-- (void)scheduleDeleteDownloadsDirectory;
+- (void)scheduleDeleteTempDownloadsDirectory;
 // Schedule the deletion of the temporary passwords files that might
 // be left over from incomplete export operations.
 - (void)scheduleDeleteTempPasswordsDirectory;
@@ -1001,7 +1001,7 @@
   [self scheduleAuthenticationServiceNotification];
   [self sendQueuedFeedback];
   [self scheduleSpotlightResync];
-  [self scheduleDeleteDownloadsDirectory];
+  [self scheduleDeleteTempDownloadsDirectory];
   [self scheduleDeleteTempPasswordsDirectory];
   [self scheduleStartupAttemptReset];
   [self startFreeMemoryMonitoring];
@@ -1022,11 +1022,11 @@
   }
 }
 
-- (void)scheduleDeleteDownloadsDirectory {
+- (void)scheduleDeleteTempDownloadsDirectory {
   [[DeferredInitializationRunner sharedInstance]
       enqueueBlockNamed:kDeleteDownloads
                   block:^{
-                    DeleteDownloadsDirectory();
+                    DeleteTempDownloadsDirectory();
                   }];
 }
 
diff --git a/ios/chrome/app/tab_opener_unittest.mm b/ios/chrome/app/tab_opener_unittest.mm
index 84ed59e..7b7e5987 100644
--- a/ios/chrome/app/tab_opener_unittest.mm
+++ b/ios/chrome/app/tab_opener_unittest.mm
@@ -8,7 +8,6 @@
 #import "ios/chrome/app/application_delegate/app_state.h"
 #import "ios/chrome/app/application_delegate/tab_opening.h"
 #import "ios/chrome/app/application_delegate/url_opener.h"
-#include "ios/chrome/app/main_controller_private.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
 #import "ios/chrome/browser/ui/main/scene_controller.h"
 #import "ios/chrome/browser/ui/main/scene_state.h"
@@ -35,7 +34,6 @@
 class TabOpenerTest : public PlatformTest {
  protected:
   void TearDown() override {
-    [main_controller_ stopChromeMain];
     PlatformTest::TearDown();
   }
 
@@ -53,7 +51,7 @@
           swizzle_block_executed_ = YES;
           EXPECT_EQ(expectedLaunchOptions, options);
           EXPECT_EQ(expectedStartupInformation, startupInformation);
-          EXPECT_EQ(main_controller_.sceneController, tabOpener);
+          EXPECT_EQ(scene_controller_, tabOpener);
           EXPECT_EQ(expectedAppState, appState);
         } copy];
     URL_opening_handle_launch_swizzler_.reset(new ScopedBlockSwizzler(
@@ -63,20 +61,15 @@
         swizzle_block_));
   }
 
-  MainController* GetMainController() {
-    if (!main_controller_) {
-      scene_state_ = [[SceneState alloc] init];
-      main_controller_ = [[MainController alloc] init];
+  SceneController* GetSceneController() {
+    if (!scene_controller_) {
       scene_controller_ =
           [[SceneController alloc] initWithSceneState:scene_state_];
-      main_controller_.sceneController = scene_controller_;
-      scene_controller_.mainController = main_controller_;
     }
-    return main_controller_;
+    return scene_controller_;
   }
 
  private:
-  MainController* main_controller_;
   SceneController* scene_controller_;
   SceneState* scene_state_;
 
@@ -102,7 +95,7 @@
   swizzleHandleLaunchOptions(launchOptions, startupInformationMock,
                              appStateMock);
 
-  id<TabOpening> tabOpener = GetMainController().sceneController;
+  id<TabOpening> tabOpener = GetSceneController();
 
   // Action.
   [tabOpener openTabFromLaunchOptions:launchOptions
@@ -122,7 +115,7 @@
 
   swizzleHandleLaunchOptions(nil, startupInformationMock, appStateMock);
 
-  id<TabOpening> tabOpener = GetMainController().sceneController;
+  id<TabOpening> tabOpener = GetSceneController();
 
   // Action.
   [tabOpener openTabFromLaunchOptions:nil
diff --git a/ios/chrome/browser/autofill/autofill_controller_unittest.mm b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
index 1d1bf3a..163024c 100644
--- a/ios/chrome/browser/autofill/autofill_controller_unittest.mm
+++ b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
@@ -448,7 +448,7 @@
 TEST_F(AutofillControllerTest, ProfileSuggestionsTwoAnonymousForms) {
   SetUpForSuggestions(
       [NSString stringWithFormat:@"%@%@", kProfileFormHtml, kProfileFormHtml],
-      2);
+      1);
   ForceViewRendering(web_state()->GetView());
   ExecuteJavaScript(@"document.forms[0].name.focus()");
   WaitForSuggestionRetrieval(/*wait_for_trigger=*/YES);
diff --git a/ios/chrome/browser/download/BUILD.gn b/ios/chrome/browser/download/BUILD.gn
index ecc7280e..0f03f89 100644
--- a/ios/chrome/browser/download/BUILD.gn
+++ b/ios/chrome/browser/download/BUILD.gn
@@ -79,6 +79,7 @@
     "//ios/chrome/browser/download",
     "//ios/chrome/browser/network_activity",
     "//ios/chrome/test/fakes",
+    "//ios/web/common:features",
     "//ios/web/public",
     "//ios/web/public/download",
     "//ios/web/public/test",
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
index 392da41..9167e2a 100644
--- a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
+++ b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
@@ -101,7 +101,7 @@
   LogHistogram(download_task.get());
 
   base::FilePath download_dir;
-  if (!GetDownloadsDirectory(&download_dir)) {
+  if (!GetTempDownloadsDirectory(&download_dir)) {
     return;
   }
 
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm
index d86cc33..1a8e04f 100644
--- a/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm
+++ b/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm
@@ -83,7 +83,7 @@
   base::FilePath file =
       task_ptr->GetResponseWriter()->AsFileWriter()->file_path();
   base::FilePath download_dir;
-  ASSERT_TRUE(GetDownloadsDirectory(&download_dir));
+  ASSERT_TRUE(GetTempDownloadsDirectory(&download_dir));
   EXPECT_TRUE(download_dir.IsParent(file));
 
   histogram_tester()->ExpectBucketCount(
@@ -121,7 +121,7 @@
   base::FilePath file =
       task_ptr->GetResponseWriter()->AsFileWriter()->file_path();
   base::FilePath download_dir;
-  ASSERT_TRUE(GetDownloadsDirectory(&download_dir));
+  ASSERT_TRUE(GetTempDownloadsDirectory(&download_dir));
   EXPECT_TRUE(download_dir.IsParent(file));
 
   histogram_tester()->ExpectBucketCount(
diff --git a/ios/chrome/browser/download/download_directory_util.h b/ios/chrome/browser/download/download_directory_util.h
index ff95d88..4af46c21 100644
--- a/ios/chrome/browser/download/download_directory_util.h
+++ b/ios/chrome/browser/download/download_directory_util.h
@@ -11,12 +11,16 @@
 class FilePath;
 }
 
-// Fills |directory_path| with the FilePath to the downloads directory. Returns
-// true if this is successful. This method does not create the directory, it
-// just returns the path.
-bool GetDownloadsDirectory(base::FilePath* directory_path);
+// Fills |directory_path| with the FilePath to the temporary downloads
+// directory. Returns true if this is successful. This method does not create
+// the directory, it just returns the path.
+bool GetTempDownloadsDirectory(base::FilePath* directory_path);
+
+// Fills |directory_path| with the FilePath to the downloads directory. This
+// method does not create the directory, it just updates the path.
+void GetDownloadsDirectory(base::FilePath* directory_path);
 
 // Asynchronously deletes downloads directory.
-void DeleteDownloadsDirectory();
+void DeleteTempDownloadsDirectory();
 
 #endif  // IOS_CHROME_BROWSER_DOWNLOAD_DOWNLOAD_DIRECTORY_UTIL_H_
diff --git a/ios/chrome/browser/download/download_directory_util.mm b/ios/chrome/browser/download/download_directory_util.mm
index b860000..0dbb943 100644
--- a/ios/chrome/browser/download/download_directory_util.mm
+++ b/ios/chrome/browser/download/download_directory_util.mm
@@ -21,23 +21,15 @@
 namespace {
 
 // Synchronously deletes downloads directory.
-void DeleteDownloadsDirectorySync() {
+void DeleteTempDownloadsDirectorySync() {
   base::FilePath downloads_directory;
-  if (GetDownloadsDirectory(&downloads_directory)) {
+  if (GetTempDownloadsDirectory(&downloads_directory)) {
     DeleteFile(downloads_directory, /*recursive=*/true);
   }
 }
 }  // namespace
 
-bool GetDownloadsDirectory(base::FilePath* directory_path) {
-  // If downloads manager's flag is enabled, moves the downloads folder to
-  // user's Documents.
-  if (base::FeatureList::IsEnabled(web::features::kEnablePersistentDownloads)) {
-    *directory_path =
-        base::mac::NSStringToFilePath([NSSearchPathForDirectoriesInDomains(
-            NSDocumentDirectory, NSAllDomainsMask, YES) objectAtIndex:0]);
-    return true;
-  }
+bool GetTempDownloadsDirectory(base::FilePath* directory_path) {
   if (!GetTempDir(directory_path)) {
     return false;
   }
@@ -45,10 +37,14 @@
   return true;
 }
 
-void DeleteDownloadsDirectory() {
-  // If downloads manager's flag is enabled, keeps downloads folder.
-  if (!base::FeatureList::IsEnabled(web::features::kEnablePersistentDownloads))
-    base::ThreadPool::PostTask(
-        FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-        base::BindOnce(&DeleteDownloadsDirectorySync));
+void GetDownloadsDirectory(base::FilePath* directory_path) {
+  *directory_path =
+      base::mac::NSStringToFilePath([NSSearchPathForDirectoriesInDomains(
+          NSDocumentDirectory, NSAllDomainsMask, YES) firstObject]);
+}
+
+void DeleteTempDownloadsDirectory() {
+  base::ThreadPool::PostTask(
+      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+      base::BindOnce(&DeleteTempDownloadsDirectorySync));
 }
diff --git a/ios/chrome/browser/download/download_directory_util_unittest.mm b/ios/chrome/browser/download/download_directory_util_unittest.mm
index 597e1505c..3110b588 100644
--- a/ios/chrome/browser/download/download_directory_util_unittest.mm
+++ b/ios/chrome/browser/download/download_directory_util_unittest.mm
@@ -20,20 +20,20 @@
 
 using DownloadDirectoryTest = PlatformTest;
 
-// Tests that DeleteDownloadsDirectory() actually deletes the directory.
+// Tests that DeleteTempDownloadsDirectory() actually deletes the directory.
 TEST_F(DownloadDirectoryTest, Deletion) {
   base::test::TaskEnvironment envoronment;
 
   // Create a new file in downloads directory.
   base::FilePath dir;
-  EXPECT_TRUE(GetDownloadsDirectory(&dir));
+  EXPECT_TRUE(GetTempDownloadsDirectory(&dir));
   EXPECT_TRUE(CreateDirectory(dir));
   base::FilePath file = dir.Append("file.txt");
   EXPECT_EQ(0, WriteFile(file, "", 0));
   ASSERT_TRUE(base::PathExists(file));
 
   // Delete download directory.
-  DeleteDownloadsDirectory();
+  DeleteTempDownloadsDirectory();
 
   // Verify download directory deletion.
   EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForFileOperationTimeout, ^{
diff --git a/ios/chrome/browser/download/download_manager_tab_helper.mm b/ios/chrome/browser/download/download_manager_tab_helper.mm
index aae48fa..db8c864 100644
--- a/ios/chrome/browser/download/download_manager_tab_helper.mm
+++ b/ios/chrome/browser/download/download_manager_tab_helper.mm
@@ -8,6 +8,7 @@
 #include "base/memory/ptr_util.h"
 #import "ios/chrome/browser/download/download_manager_tab_helper_delegate.h"
 #import "ios/chrome/browser/network_activity/network_activity_indicator_manager.h"
+#include "ios/web/common/features.h"
 #import "ios/web/public/download/download_task.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -40,7 +41,10 @@
 void DownloadManagerTabHelper::Download(
     std::unique_ptr<web::DownloadTask> task) {
   __block std::unique_ptr<web::DownloadTask> block_task = std::move(task);
-  if (!task_) {
+  // If downloads are persistent, they cannot be lost once completed.
+  if (!task_ || (base::FeatureList::IsEnabled(
+                     web::features::kEnablePersistentDownloads) &&
+                 task_->GetState() == web::DownloadTask::State::kComplete)) {
     // The task is the first download for this web state.
     DidCreateDownload(std::move(block_task));
     return;
diff --git a/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm b/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm
index ec2e067d..15074134 100644
--- a/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm
+++ b/ios/chrome/browser/download/download_manager_tab_helper_unittest.mm
@@ -6,8 +6,10 @@
 
 #include <memory>
 
+#include "base/test/scoped_feature_list.h"
 #import "ios/chrome/browser/network_activity/network_activity_indicator_manager.h"
 #import "ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h"
+#include "ios/web/common/features.h"
 #import "ios/web/public/test/fakes/fake_download_task.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
 #include "net/url_request/url_fetcher_response_writer.h"
@@ -251,3 +253,49 @@
   task_ptr->Cancel();
   EXPECT_FALSE(tab_helper()->has_download_task());
 }
+
+// Enables kEnablePersistentDownloads flag.
+// Tests creating a second download after the first download is completed.
+TEST_F(DownloadManagerTabHelperTest,
+       DownloadAcceptationOnceCompletedWithPersistentDownloads) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(web::features::kEnablePersistentDownloads);
+
+  web_state_->WasShown();
+  ASSERT_FALSE(delegate_.state);
+  auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
+  task->SetDone(true);
+  tab_helper()->Download(std::move(task));
+  EXPECT_EQ(web::DownloadTask::State::kComplete, *delegate_.state);
+
+  auto task2 = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
+  tab_helper()->Download(std::move(task2));
+
+  ASSERT_TRUE(delegate_.state);
+  EXPECT_EQ(web::DownloadTask::State::kNotStarted, *delegate_.state);
+}
+
+// Enables kEnablePersistentDownloads flag.
+// Tests creating the second download while the first download is still in
+// progress. Second download will be rejected by the delegate.
+TEST_F(DownloadManagerTabHelperTest,
+       DownloadRejectionViaDelegateWithPersistentDownloads) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(web::features::kEnablePersistentDownloads);
+
+  web_state_->WasShown();
+  ASSERT_FALSE(delegate_.state);
+  auto task = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
+  tab_helper()->Download(std::move(task));
+
+  auto task2 = std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kMimeType);
+  const web::FakeDownloadTask* task2_ptr = task2.get();
+  task2->SetTransitionType(ui::PAGE_TRANSITION_LINK);
+  tab_helper()->Download(std::move(task2));
+
+  ASSERT_TRUE(delegate_.state);
+  EXPECT_EQ(task2_ptr, delegate_.decidingPolicyForDownload);
+  // Ask the delegate to discard the new download.
+  BOOL discarded = [delegate_ decidePolicy:kNewDownloadPolicyDiscard];
+  ASSERT_TRUE(discarded);
+}
diff --git a/ios/chrome/browser/download/external_app_util.mm b/ios/chrome/browser/download/external_app_util.mm
index dd711cc7..2669868 100644
--- a/ios/chrome/browser/download/external_app_util.mm
+++ b/ios/chrome/browser/download/external_app_util.mm
@@ -29,9 +29,7 @@
 
 NSURL* GetFilesAppUrl() {
   base::FilePath download_dir;
-  if (!GetDownloadsDirectory(&download_dir)) {
-    return nil;
-  }
+  GetDownloadsDirectory(&download_dir);
 
   return [NSURL
       URLWithString:[NSString stringWithFormat:@"shareddocuments://%s",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index a2044d5e..3cef6651 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -422,10 +422,6 @@
     {"send-uma-cellular", flag_descriptions::kSendUmaOverAnyNetwork,
      flag_descriptions::kSendUmaOverAnyNetworkDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(kUmaCellular)},
-    {"enable-sync-uss-passwords",
-     flag_descriptions::kEnableSyncUSSPasswordsName,
-     flag_descriptions::kEnableSyncUSSPasswordsDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(switches::kSyncUSSPasswords)},
     {"autofill-no-local-save-on-upload-success",
      flag_descriptions::kAutofillNoLocalSaveOnUploadSuccessName,
      flag_descriptions::kAutofillNoLocalSaveOnUploadSuccessDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index ef5a921..dd15571 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -218,10 +218,6 @@
 const char kEnablePersistentDownloadsDescription[] =
     "Enables the new, experimental implementation of persistent downloads";
 
-const char kEnableSyncUSSPasswordsName[] = "Enable USS for passwords sync";
-const char kEnableSyncUSSPasswordsDescription[] =
-    "Enables the new, experimental implementation of password sync";
-
 const char kEnableSyncUSSNigoriName[] = "Enable USS for sync encryption keys";
 const char kEnableSyncUSSNigoriDescription[] =
     "Enables the new, experimental implementation of sync encryption keys";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index c64e21b..6dca4a1 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -185,9 +185,6 @@
 extern const char kEnablePersistentDownloadsName[];
 extern const char kEnablePersistentDownloadsDescription[];
 
-extern const char kEnableSyncUSSPasswordsName[];
-extern const char kEnableSyncUSSPasswordsDescription[];
-
 extern const char kEnableSyncUSSNigoriName[];
 extern const char kEnableSyncUSSNigoriDescription[];
 
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
index cb8b849..897c06e 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "base/strings/string16.h"
 #include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
 #include "components/password_manager/core/browser/password_feature_manager_impl.h"
 #import "components/password_manager/core/browser/password_manager_client.h"
@@ -124,7 +125,8 @@
   void NotifyStorePasswordCalled() override;
   void NotifyUserCredentialsWereLeaked(
       password_manager::CredentialLeakType leak_type,
-      const GURL& origin) override;
+      const GURL& origin,
+      const base::string16& username) override;
   bool IsSavingAndFillingEnabled(const GURL& url) const override;
   bool IsFillingEnabled(const GURL& url) const override;
   const GURL& GetLastCommittedEntryURL() const override;
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
index 15505f10..a4c5f3b5 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -201,7 +201,8 @@
 
 void IOSChromePasswordManagerClient::NotifyUserCredentialsWereLeaked(
     password_manager::CredentialLeakType leak_type,
-    const GURL& origin) {
+    const GURL& origin,
+    const base::string16& username) {
   [delegate_ showPasswordBreachForLeakType:leak_type URL:origin];
 }
 
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc
index 7dda681..9887218 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc
+++ b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc
@@ -27,7 +27,6 @@
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/sync/glue/sync_start_util.h"
 #include "ios/chrome/browser/sync/profile_sync_service_factory.h"
 #include "ios/chrome/browser/webdata_services/web_data_service_factory.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -96,9 +95,7 @@
 
   scoped_refptr<password_manager::PasswordStore> store =
       new password_manager::PasswordStoreDefault(std::move(login_db));
-  if (!store->Init(ios::sync_start_util::GetFlareForSyncableService(
-                       context->GetStatePath()),
-                   nullptr)) {
+  if (!store->Init(nullptr)) {
     // TODO(crbug.com/479725): Remove the LOG once this error is visible in the
     // UI.
     LOG(WARNING) << "Could not initialize password store.";
diff --git a/ios/chrome/browser/passwords/test/test_password_manager_client.mm b/ios/chrome/browser/passwords/test/test_password_manager_client.mm
index 0d8d6d6..9deed39 100644
--- a/ios/chrome/browser/passwords/test/test_password_manager_client.mm
+++ b/ios/chrome/browser/passwords/test/test_password_manager_client.mm
@@ -22,7 +22,7 @@
 TestPasswordManagerClient::TestPasswordManagerClient()
     : last_committed_url_(kHttpsWebOrigin), password_manager_(this) {
   store_ = base::MakeRefCounted<TestPasswordStore>();
-  store_->Init(syncer::SyncableService::StartSyncFlare(), nullptr);
+  store_->Init(nullptr);
   prefs_ = std::make_unique<TestingPrefServiceSimple>();
   prefs_->registry()->RegisterBooleanPref(
       password_manager::prefs::kCredentialsEnableAutosignin, true);
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
index 95c1029..8332f57 100644
--- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm
+++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -28,7 +28,6 @@
 #include "components/invalidation/impl/profile_invalidation_provider.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/password_manager/core/browser/password_store.h"
-#include "components/password_manager/core/browser/sync/password_model_worker.h"
 #include "components/reading_list/core/reading_list_model.h"
 #include "components/sync/base/report_unrecoverable_error.h"
 #include "components/sync/base/sync_base_switches.h"
@@ -37,8 +36,6 @@
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_util.h"
 #include "components/sync/engine/passive_model_worker.h"
-#include "components/sync/engine/sequenced_model_worker.h"
-#include "components/sync/engine/ui_model_worker.h"
 #include "components/sync_preferences/pref_service_syncable.h"
 #include "components/sync_sessions/favicon_cache.h"
 #include "components/sync_sessions/session_sync_service.h"
@@ -231,10 +228,6 @@
       return history ? history->GetDeleteDirectivesSyncableService()
                      : base::WeakPtr<syncer::SyncableService>();
     }
-    case syncer::PASSWORDS: {
-      return password_store_ ? password_store_->GetPasswordSyncableService()
-                             : base::WeakPtr<syncer::SyncableService>();
-    }
     default:
       NOTREACHED();
       return base::WeakPtr<syncer::SyncableService>();
@@ -283,16 +276,8 @@
 IOSChromeSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) {
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
   switch (group) {
-    case syncer::GROUP_UI:
-      return new syncer::UIModelWorker(
-          base::CreateSingleThreadTaskRunner({web::WebThread::UI}));
     case syncer::GROUP_PASSIVE:
       return new syncer::PassiveModelWorker();
-    case syncer::GROUP_PASSWORD: {
-      if (!password_store_)
-        return nullptr;
-      return new browser_sync::PasswordModelWorker(password_store_);
-    }
     default:
       return nullptr;
   }
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
index 4c088b7..05633aa 100644
--- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
+++ b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
@@ -73,6 +73,19 @@
 
 int IOSChromeSyncedTabDelegate::GetCurrentEntryIndex() const {
   if (GetSessionStorageIfNeeded()) {
+    NSInteger lastCommittedIndex = session_storage_.lastCommittedItemIndex;
+    if (lastCommittedIndex < 0 ||
+        lastCommittedIndex >=
+            static_cast<NSInteger>(session_storage_.itemStorages.count)) {
+      // It has been observed that lastCommittedIndex can be invalid (see
+      // crbug.com/1060553). Returning an invalid index will cause a crash.
+      // If lastCommittedIndex is invalid, consider the last index as the
+      // current one.
+      // As GetSessionStorageIfNeeded just returned true,
+      // session_storage_.itemStorages.count is not 0 and
+      // session_storage_.itemStorages.count - 1 is valid.
+      return session_storage_.itemStorages.count - 1;
+    }
     return session_storage_.lastCommittedItemIndex;
   }
   return web_state_->GetNavigationManager()->GetLastCommittedItemIndex();
diff --git a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index b99462e..1644fe04 100644
--- a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "base/command_line.h"
-#include "base/feature_list.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "components/browser_sync/browser_sync_switches.h"
 #include "components/sync/base/model_type.h"
@@ -49,7 +48,8 @@
 
     std::vector<syncer::ModelType> datatypes;
 
-    // Common types.
+    // Common types. This excludes PASSWORDS because the password store factory
+    // is null for testing and hence no controller gets instantiated.
     datatypes.push_back(syncer::AUTOFILL);
     datatypes.push_back(syncer::AUTOFILL_PROFILE);
     datatypes.push_back(syncer::AUTOFILL_WALLET_DATA);
@@ -57,12 +57,6 @@
     datatypes.push_back(syncer::BOOKMARKS);
     datatypes.push_back(syncer::DEVICE_INFO);
     datatypes.push_back(syncer::HISTORY_DELETE_DIRECTIVES);
-    if (!base::FeatureList::IsEnabled(switches::kSyncUSSPasswords)) {
-      // Password store factory is null for testing. For directory
-      // implementation, a controller was added anyway. For USS, no controller
-      // gets added, and hence the type isn't available.
-      datatypes.push_back(syncer::PASSWORDS);
-    }
     datatypes.push_back(syncer::PREFERENCES);
     datatypes.push_back(syncer::PRIORITY_PREFERENCES);
     datatypes.push_back(syncer::READING_LIST);
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
index 8a8d3b1..9c0db77 100644
--- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -526,7 +526,7 @@
   }
 
   base::FilePath download_dir;
-  if (!GetDownloadsDirectory(&download_dir)) {
+  if (!GetTempDownloadsDirectory(&download_dir)) {
     return;
   }
 
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm
index 4089834..ddba79d 100644
--- a/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_coordinator_unittest.mm
@@ -50,7 +50,7 @@
   feature_list.InitAndEnableFeature(kOpenDownloadsInFilesApp);
 
   base::FilePath download_dir;
-  ASSERT_TRUE(GetDownloadsDirectory(&download_dir));
+  GetDownloadsDirectory(&download_dir);
 
   NSURL* url = GetFilesAppUrl();
   ASSERT_TRUE(url);
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h
index 9f36622..429cc58 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h
@@ -55,13 +55,6 @@
 // Returns the fake omnibox.
 + (UIView*)fakeOmnibox;
 
-// Swizzles the callback for the search button tap action so it is recorded.
-+ (void)swizzleSearchButtonLogging;
-
-// Resets the swizzle for the search button tap, and return the whether the
-// swizzled method was called.
-+ (BOOL)resetSearchButtonLogging;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm
index 0ccac6b..75a50f8 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm
@@ -190,18 +190,6 @@
   return ntp_home::FakeOmnibox();
 }
 
-+ (void)swizzleSearchButtonLogging {
-  [[ContentSuggestionsTestSingleton sharedInstance]
-      swizzleLocationBarCoordinatorSearchButton];
-}
-
-+ (BOOL)resetSearchButtonLogging {
-  ContentSuggestionsTestSingleton* singleton =
-      [ContentSuggestionsTestSingleton sharedInstance];
-  [singleton resetSwizzle];
-  return singleton.locationBarCoordinatorSearchButtonMethodCalled;
-}
-
 #pragma mark - Helper
 
 + (MockContentSuggestionsProvider*)provider {
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
index f24db29..b9a5775a 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -461,29 +461,6 @@
   [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString];
 }
 
-// Tests that tapping the omnibox search button logs correctly.
-// It is important for ranking algorithm of omnibox that requests from the
-// search button and real omnibox are marked appropriately.
-- (void)testTapOmniboxSearchButtonLogsCorrectly {
-  if ([ChromeEarlGrey isRegularXRegularSizeClass]) {
-    // This logging only happens on iPhone, since on iPad there's no secondary
-    // toolbar.
-    return;
-  }
-  [ContentSuggestionsAppInterface swizzleSearchButtonLogging];
-
-  // Tap the search button.
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                          kToolbarSearchButtonIdentifier)]
-      performAction:grey_tap()];
-
-  BOOL tapped = [ContentSuggestionsAppInterface resetSearchButtonLogging];
-
-  // Check that the page is loaded.
-  GREYAssertTrue(tapped,
-                 @"The tap on the search button was not correctly logged.");
-}
-
 // Tests that tapping the fake omnibox moves the collection.
 - (void)testTapFakeOmniboxScroll {
   // Get the collection and its layout.
@@ -569,24 +546,6 @@
       @"The collection is not scrolled back to its previous position");
 }
 
-// Tests tapping the search button when the fake omnibox is scrolled.
-- (void)testTapSearchButtonFakeOmniboxScrolled {
-  if ([ChromeEarlGrey isRegularXRegularSizeClass]) {
-    // This only happens on iPhone, since on iPad there's no secondary toolbar.
-    return;
-  }
-
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::
-                                          ContentSuggestionCollectionView()]
-      performAction:grey_swipeFastInDirection(kGREYDirectionUp)];
-  // Tap the search button.
-  [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                          kToolbarSearchButtonIdentifier)]
-      performAction:grey_tap()];
-  [ChromeEarlGrey
-      waitForSufficientlyVisibleElementWithMatcher:chrome_test_util::Omnibox()];
-}
-
 - (void)testOpeningNewTab {
   [ChromeEarlGreyUI openNewTab];
 
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h
index ebf3b60..3d02332 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h
@@ -37,12 +37,6 @@
 - (void)registerArticleProvider:
     (ntp_snippets::ContentSuggestionsService*)service;
 
-// Enables the swizzling of the @"focusOmniboxFromSearchButton" selector on the
-// location bar coordinator.
-- (void)swizzleLocationBarCoordinatorSearchButton;
-// Resets the swizzling of the location bar coordinator.
-- (void)resetSwizzle;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_NTP_HOME_PROVIDER_TEST_SINGLETON_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm
index a6d1a97a..147d9f37 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm
@@ -56,18 +56,6 @@
   service->RegisterProvider(std::move(provider));
 }
 
-- (void)swizzleLocationBarCoordinatorSearchButton {
-  _tapped = NO;
-  _swizzler = std::make_unique<ScopedBlockSwizzler>(
-      NSClassFromString(@"LocationBarCoordinator"),
-      NSSelectorFromString(@"focusOmniboxFromSearchButton"), ^{
-        _tapped = YES;
-      });
-}
-- (void)resetSwizzle {
-  _swizzler.reset();
-}
-
 - (BOOL)locationBarCoordinatorSearchButtonMethodCalled {
   return _tapped;
 }
diff --git a/ios/chrome/browser/ui/download/BUILD.gn b/ios/chrome/browser/ui/download/BUILD.gn
index 42f2bbc..2ada01022 100644
--- a/ios/chrome/browser/ui/download/BUILD.gn
+++ b/ios/chrome/browser/ui/download/BUILD.gn
@@ -93,6 +93,7 @@
     "//ios/chrome/test:test_support",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/fakes",
+    "//ios/web/common:features",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
     "//net:test_support",
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator.mm b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
index 67dd59f..d6fed09f 100644
--- a/ios/chrome/browser/ui/download/download_manager_coordinator.mm
+++ b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
@@ -15,7 +15,9 @@
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
 #include "components/strings/grit/components_strings.h"
+#include "ios/chrome/browser/download/download_directory_util.h"
 #include "ios/chrome/browser/download/download_manager_metric_names.h"
 #import "ios/chrome/browser/download/download_manager_tab_helper.h"
 #import "ios/chrome/browser/download/external_app_util.h"
@@ -350,8 +352,7 @@
 
 - (void)presentOpenInForDownloadManagerViewController:
     (DownloadManagerViewController*)controller {
-  base::FilePath path =
-      _downloadTask->GetResponseWriter()->AsFileWriter()->file_path();
+  base::FilePath path = _mediator.GetDownloadPath();
   NSURL* URL = [NSURL fileURLWithPath:base::SysUTF8ToNSString(path.value())];
 
   NSArray* customActions = @[ URL ];
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
index 8778f7eb..bca4b33 100644
--- a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
@@ -234,7 +234,12 @@
 // one.
 TEST_F(DownloadManagerCoordinatorTest, DelegateReplacedDownload) {
   auto task = CreateTestTask();
+  base::FilePath path;
+  ASSERT_TRUE(base::GetTempDir(&path));
+  task->Start(std::make_unique<net::URLFetcherFileWriter>(
+      base::ThreadTaskRunnerHandle::Get(), path));
   task->SetDone(true);
+
   [coordinator_ downloadManagerTabHelper:&tab_helper_
                        didCreateDownload:task.get()
                        webStateIsVisible:YES];
@@ -438,12 +443,14 @@
     // These calls will retain coordinator, which should outlive thread bundle.
     [view_controller.delegate
         downloadManagerViewControllerDidStartDownload:view_controller];
+
+    // Complete the download before presenting Open In... menu.
+    task->SetDone(true);
+
     [view_controller.delegate
         presentOpenInForDownloadManagerViewController:view_controller];
   }
 
-  // Complete the download to log UMA.
-  task->SetDone(true);
   // Download task is destroyed without opening the file.
   task = nullptr;
   histogram_tester_.ExpectTotalCount("Download.IOSDownloadedFileNetError", 0);
@@ -649,7 +656,7 @@
   // Download file should be located in download directory.
   base::FilePath file = task.GetResponseWriter()->AsFileWriter()->file_path();
   base::FilePath download_dir;
-  ASSERT_TRUE(GetDownloadsDirectory(&download_dir));
+  ASSERT_TRUE(GetTempDownloadsDirectory(&download_dir));
   EXPECT_TRUE(download_dir.IsParent(file));
 
   histogram_tester_.ExpectTotalCount("Download.IOSDownloadFileInBackground", 0);
@@ -750,6 +757,12 @@
   ASSERT_EQ([DownloadManagerViewController class], [viewController class]);
 
   // Start the download.
+  base::FilePath path;
+  ASSERT_TRUE(base::GetTempDir(&path));
+  task.Start(std::make_unique<net::URLFetcherFileWriter>(
+      base::ThreadTaskRunnerHandle::Get(), path));
+
+  // Start the download.
   @autoreleasepool {
     // This call will retain coordinator, which should outlive thread bundle.
     [viewController.delegate
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.h b/ios/chrome/browser/ui/download/download_manager_mediator.h
index 0e9bcef..8e90eb0 100644
--- a/ios/chrome/browser/ui/download/download_manager_mediator.h
+++ b/ios/chrome/browser/ui/download/download_manager_mediator.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #import "ios/chrome/browser/ui/download/download_manager_consumer.h"
@@ -14,10 +15,6 @@
 
 @protocol DownloadManagerConsumer;
 
-namespace base {
-class FilePath;
-}  // namespace base
-
 namespace net {
 class URLFetcherFileWriter;
 }  // namespace net
@@ -39,6 +36,10 @@
   // Sets download task. Must be set to null when task is destroyed.
   void SetDownloadTask(web::DownloadTask* task);
 
+  // Returns the path of the downloaded file after download is completed.
+  // Returns empty path otherwise (f.e. download is still in progress).
+  base::FilePath GetDownloadPath();
+
   // Asynchronously starts download operation.
   void StartDowloading();
 
@@ -70,6 +71,7 @@
   void OnDownloadUpdated(web::DownloadTask* task) override;
   void OnDownloadDestroyed(web::DownloadTask* task) override;
 
+  base::FilePath download_path_;
   web::DownloadTask* task_ = nullptr;
   __weak id<DownloadManagerConsumer> consumer_ = nil;
   base::WeakPtrFactory<DownloadManagerMediator> weak_ptr_factory_;
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.mm b/ios/chrome/browser/ui/download/download_manager_mediator.mm
index 63af89f..066f06c2 100644
--- a/ios/chrome/browser/ui/download/download_manager_mediator.mm
+++ b/ios/chrome/browser/ui/download/download_manager_mediator.mm
@@ -16,6 +16,7 @@
 #include "ios/chrome/browser/download/download_directory_util.h"
 #import "ios/chrome/browser/download/external_app_util.h"
 #include "ios/chrome/grit/ios_strings.h"
+#include "ios/web/common/features.h"
 #import "ios/web/public/download/download_task.h"
 #include "net/base/net_errors.h"
 #include "net/url_request/url_fetcher_response_writer.h"
@@ -47,9 +48,13 @@
   }
 }
 
+base::FilePath DownloadManagerMediator::GetDownloadPath() {
+  return download_path_;
+}
+
 void DownloadManagerMediator::StartDowloading() {
   base::FilePath download_dir;
-  if (!GetDownloadsDirectory(&download_dir)) {
+  if (!GetTempDownloadsDirectory(&download_dir)) {
     [consumer_ setState:kDownloadManagerStateFailed];
     return;
   }
@@ -116,10 +121,32 @@
 
 void DownloadManagerMediator::UpdateConsumer() {
   DownloadManagerState state = GetDownloadManagerState();
+
+  if (state == kDownloadManagerStateSucceeded) {
+    download_path_ = task_->GetResponseWriter()->AsFileWriter()->file_path();
+
+    if (base::FeatureList::IsEnabled(
+            web::features::kEnablePersistentDownloads)) {
+      NSURL* temp_download_url = [NSURL
+          fileURLWithPath:base::SysUTF8ToNSString(download_path_.value())];
+
+      base::FilePath user_download_path;
+      GetDownloadsDirectory(&user_download_path);
+      user_download_path = user_download_path.Append(
+          base::UTF16ToUTF8(task_->GetSuggestedFilename()));
+      NSURL* download_url = [NSURL
+          fileURLWithPath:base::SysUTF8ToNSString(user_download_path.value())];
+
+      [[NSFileManager defaultManager] moveItemAtURL:temp_download_url
+                                              toURL:download_url
+                                              error:nil];
+      download_path_ = user_download_path;
+    }
+  }
+
   if (state == kDownloadManagerStateSucceeded && !IsGoogleDriveAppInstalled()) {
     [consumer_ setInstallDriveButtonVisible:YES animated:YES];
   }
-
   [consumer_ setState:state];
   [consumer_ setCountOfBytesReceived:task_->GetReceivedBytes()];
   [consumer_ setCountOfBytesExpectedToReceive:task_->GetTotalBytes()];
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm b/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm
index de2eac0..ebb26e9 100644
--- a/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/download/download_manager_mediator_unittest.mm
@@ -9,9 +9,11 @@
 #include "base/run_loop.h"
 #include "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "ios/chrome/browser/download/download_directory_util.h"
 #import "ios/chrome/browser/download/external_app_util.h"
 #import "ios/chrome/test/fakes/fake_download_manager_consumer.h"
+#include "ios/web/common/features.h"
 #import "ios/web/public/test/fakes/fake_download_task.h"
 #include "ios/web/public/test/web_task_environment.h"
 #include "net/base/net_errors.h"
@@ -70,8 +72,9 @@
 }
 
 // Tests starting the download. Verifies that download task is started and its
-// file writer is configured to write into download directory.
-TEST_F(DownloadManagerMediatorTest, Start) {
+// file writer is configured to write into Chrome's temporary download
+// directory.
+TEST_F(DownloadManagerMediatorTest, StartTempDownload) {
   task()->SetSuggestedFilename(
       base::SysNSStringToUTF16(kTestSuggestedFileName));
   mediator_.SetDownloadTask(task());
@@ -87,11 +90,43 @@
         return task()->GetState() == web::DownloadTask::State::kInProgress;
       }));
 
+  task()->SetDone(true);
+  EXPECT_EQ(kDownloadManagerStateSucceeded, consumer_.state);
   // Download file should be located in download directory.
-  base::FilePath file =
-      task()->GetResponseWriter()->AsFileWriter()->file_path();
+  base::FilePath file = mediator_.GetDownloadPath();
   base::FilePath download_dir;
-  ASSERT_TRUE(GetDownloadsDirectory(&download_dir));
+  ASSERT_TRUE(GetTempDownloadsDirectory(&download_dir));
+  EXPECT_TRUE(download_dir.IsParent(file));
+}
+
+// Tests starting the download. Verifies that download task is started and its
+// file writer is configured to write into Chrome's Documents download
+// directory.
+TEST_F(DownloadManagerMediatorTest, StartDownload) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(web::features::kEnablePersistentDownloads);
+
+  task()->SetSuggestedFilename(
+      base::SysNSStringToUTF16(kTestSuggestedFileName));
+  mediator_.SetDownloadTask(task());
+  mediator_.SetConsumer(consumer_);
+  mediator_.StartDowloading();
+
+  // Starting download is async for task and sync for consumer.
+  EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state);
+  EXPECT_FALSE(consumer_.installDriveButtonVisible);
+  ASSERT_TRUE(
+      WaitUntilConditionOrTimeout(base::test::ios::kWaitForDownloadTimeout, ^{
+        base::RunLoop().RunUntilIdle();
+        return task()->GetState() == web::DownloadTask::State::kInProgress;
+      }));
+
+  task()->SetDone(true);
+  EXPECT_EQ(kDownloadManagerStateSucceeded, consumer_.state);
+  // Download file should be located in download directory.
+  base::FilePath file = mediator_.GetDownloadPath();
+  base::FilePath download_dir;
+  GetDownloadsDirectory(&download_dir);
   EXPECT_TRUE(download_dir.IsParent(file));
 }
 
@@ -116,9 +151,21 @@
 TEST_F(DownloadManagerMediatorTest, ConsumerInstantUpdate) {
   OCMStub([application_ canOpenURL:GetGoogleDriveAppUrl()]).andReturn(YES);
 
-  task()->SetDone(true);
   task()->SetSuggestedFilename(
       base::SysNSStringToUTF16(kTestSuggestedFileName));
+  mediator_.SetDownloadTask(task());
+  mediator_.SetConsumer(consumer_);
+  mediator_.StartDowloading();
+
+  // Starting download is async for task and sync for consumer.
+  EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state);
+  ASSERT_TRUE(
+      WaitUntilConditionOrTimeout(base::test::ios::kWaitForDownloadTimeout, ^{
+        base::RunLoop().RunUntilIdle();
+        return task()->GetState() == web::DownloadTask::State::kInProgress;
+      }));
+
+  task()->SetDone(true);
   task()->SetTotalBytes(kTestTotalBytes);
   task()->SetReceivedBytes(kTestReceivedBytes);
   task()->SetPercentComplete(80);
@@ -151,8 +198,19 @@
 TEST_F(DownloadManagerMediatorTest, ConsumerSuceededStateUpdate) {
   OCMStub([application_ canOpenURL:GetGoogleDriveAppUrl()]).andReturn(YES);
 
+  task()->SetSuggestedFilename(
+      base::SysNSStringToUTF16(kTestSuggestedFileName));
   mediator_.SetDownloadTask(task());
   mediator_.SetConsumer(consumer_);
+  mediator_.StartDowloading();
+
+  // Starting download is async for task and sync for consumer.
+  EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state);
+  ASSERT_TRUE(
+      WaitUntilConditionOrTimeout(base::test::ios::kWaitForDownloadTimeout, ^{
+        base::RunLoop().RunUntilIdle();
+        return task()->GetState() == web::DownloadTask::State::kInProgress;
+      }));
 
   task()->SetDone(true);
   EXPECT_EQ(kDownloadManagerStateSucceeded, consumer_.state);
@@ -165,8 +223,19 @@
        ConsumerSuceededStateUpdateWithoutDriveAppInstalled) {
   OCMStub([application_ canOpenURL:GetGoogleDriveAppUrl()]).andReturn(NO);
 
+  task()->SetSuggestedFilename(
+      base::SysNSStringToUTF16(kTestSuggestedFileName));
   mediator_.SetDownloadTask(task());
   mediator_.SetConsumer(consumer_);
+  mediator_.StartDowloading();
+
+  // Starting download is async for task and sync for consumer.
+  EXPECT_EQ(kDownloadManagerStateInProgress, consumer_.state);
+  ASSERT_TRUE(
+      WaitUntilConditionOrTimeout(base::test::ios::kWaitForDownloadTimeout, ^{
+        base::RunLoop().RunUntilIdle();
+        return task()->GetState() == web::DownloadTask::State::kInProgress;
+      }));
 
   task()->SetDone(true);
   EXPECT_EQ(kDownloadManagerStateSucceeded, consumer_.state);
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
index acfffcc..95e5c1f 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
@@ -592,11 +592,13 @@
     EARL_GREY_TEST_SKIPPED(@"No omnibox button to tap.");
   }
 
+  [ChromeEarlGrey waitForMainTabCount:1];
+
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                           kToolbarSearchButtonIdentifier)]
       performAction:grey_tap()];
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
-      assertWithMatcher:firstResponder()];
+
+  [ChromeEarlGrey waitForMainTabCount:2];
 }
 
 // Tests share button is enabled only on pages that can be shared.
diff --git a/ios/chrome/browser/ui/toolbar/public/features.mm b/ios/chrome/browser/ui/toolbar/public/features.mm
index d75d2c9..d5a34b0 100644
--- a/ios/chrome/browser/ui/toolbar/public/features.mm
+++ b/ios/chrome/browser/ui/toolbar/public/features.mm
@@ -15,4 +15,4 @@
     "kChangeTabSwitcherPosition", base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kToolbarNewTabButton{"ToolbarNewTabButton",
-                                         base::FEATURE_DISABLED_BY_DEFAULT};
+                                         base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc
index 6a66979..fd8dcae 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.cc
+++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -33,3 +33,6 @@
 
 const base::Feature kClearSyncedData{"ClearSyncedData",
                                      base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kFirstResponderSendAction{
+    "FirstResponderSendAction", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h
index 430d4b2e4..d5f742c 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.h
+++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -38,4 +38,7 @@
 // device when signing out from a non-managed account.
 extern const base::Feature kClearSyncedData;
 
+// Verify if the crash in https://crbug.com/816427 is fixed on iOS 12.
+extern const base::Feature kFirstResponderSendAction;
+
 #endif  // IOS_CHROME_BROWSER_UI_UI_FEATURE_FLAGS_H_
diff --git a/ios/chrome/browser/ui/util/uikit_ui_util.mm b/ios/chrome/browser/ui/util/uikit_ui_util.mm
index b079cb2e..63c0ac51 100644
--- a/ios/chrome/browser/ui/util/uikit_ui_util.mm
+++ b/ios/chrome/browser/ui/util/uikit_ui_util.mm
@@ -65,8 +65,20 @@
   }
 }
 
+// Store a reference to the current first responder.
+UIResponder* g_first_responder = nil;
+
 }  // namespace
 
+// Category used to get the first responder.
+@implementation UIResponder (FirstResponder)
+
+- (void)cr_markSelfCurrentFirstResponder {
+  g_first_responder = self;
+}
+
+@end
+
 void SetA11yLabelAndUiAutomationName(
     NSObject<UIAccessibilityIdentification>* element,
     int idsAccessibilityLabel,
@@ -630,6 +642,18 @@
 
 UIResponder* GetFirstResponder() {
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
+  if (base::FeatureList::IsEnabled(kFirstResponderSendAction)) {
+    DCHECK_CURRENTLY_ON(web::WebThread::UI);
+    DCHECK(!g_first_responder);
+    [[UIApplication sharedApplication]
+        sendAction:@selector(cr_markSelfCurrentFirstResponder)
+                to:nil
+              from:nil
+          forEvent:nil];
+    UIResponder* firstResponder = g_first_responder;
+    g_first_responder = nil;
+    return firstResponder;
+  }
   return GetFirstResponderSubview([UIApplication sharedApplication].keyWindow);
 }
 
diff --git a/ios/chrome/browser/ui/webui/web_ui_egtest.mm b/ios/chrome/browser/ui/webui/web_ui_egtest.mm
index 1767920..c616b03b 100644
--- a/ios/chrome/browser/ui/webui/web_ui_egtest.mm
+++ b/ios/chrome/browser/ui/webui/web_ui_egtest.mm
@@ -127,8 +127,7 @@
 
 // Tests that back navigation functions properly after navigation via anchor
 // click.
-// TODO(crbug.com/1058028): This test is flaky.
-- (void)FLAKY_testChromeURLBackNavigationFromAnchorClick {
+- (void)testChromeURLBackNavigationFromAnchorClick {
   [ChromeEarlGrey loadURL:GURL(kChromeUIChromeURLsURL)];
 
   // Tap on chrome://version link on the page.
@@ -219,8 +218,7 @@
 }
 
 // Tests that repeated back/forward navigation from web URL is allowed.
-// TODO(crbug.com/1058028): This test is flaky.
-- (void)FLAKY_testBackForwardFromWebURL {
+- (void)testBackForwardFromWebURL {
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
 
   std::string chromeVersionWebText =
diff --git a/ios/web_view/internal/autofill/cwv_autofill_data_manager_unittest.mm b/ios/web_view/internal/autofill/cwv_autofill_data_manager_unittest.mm
index e76a30bc..b793b46 100644
--- a/ios/web_view/internal/autofill/cwv_autofill_data_manager_unittest.mm
+++ b/ios/web_view/internal/autofill/cwv_autofill_data_manager_unittest.mm
@@ -58,8 +58,7 @@
     personal_data_manager_->SetAutofillWalletImportEnabled(true);
 
     password_store_ = new password_manager::TestPasswordStore();
-    password_store_->Init(base::RepeatingCallback<void(syncer::ModelType)>(),
-                          nullptr);
+    password_store_->Init(nullptr);
 
     autofill_data_manager_ = [[CWVAutofillDataManager alloc]
         initWithPersonalDataManager:personal_data_manager_.get()
diff --git a/ios/web_view/internal/passwords/web_view_password_store_factory.mm b/ios/web_view/internal/passwords/web_view_password_store_factory.mm
index 5704025..a55964eb 100644
--- a/ios/web_view/internal/passwords/web_view_password_store_factory.mm
+++ b/ios/web_view/internal/passwords/web_view_password_store_factory.mm
@@ -97,8 +97,7 @@
 
   scoped_refptr<password_manager::PasswordStore> store =
       new password_manager::PasswordStoreDefault(std::move(login_db));
-  if (!store->Init(base::RepeatingCallback<void(syncer::ModelType)>(),
-                   nullptr)) {
+  if (!store->Init(nullptr)) {
     // TODO(crbug.com/479725): Remove the LOG once this error is visible in the
     // UI.
     LOG(WARNING) << "Could not initialize password store.";
diff --git a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
index d1a88c2..3143b04 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
@@ -97,8 +97,7 @@
         base::ThreadTaskRunnerHandle::Get());
 
     password_store_ = new password_manager::MockPasswordStore;
-    password_store_->Init(base::RepeatingCallback<void(syncer::ModelType)>(),
-                          nullptr);
+    password_store_->Init(nullptr);
 
     sync_controller_ = [[CWVSyncController alloc]
            initWithSyncService:mock_sync_service()
diff --git a/ios/web_view/internal/sync/web_view_sync_client.mm b/ios/web_view/internal/sync/web_view_sync_client.mm
index fe39b5d..20c0acb9 100644
--- a/ios/web_view/internal/sync/web_view_sync_client.mm
+++ b/ios/web_view/internal/sync/web_view_sync_client.mm
@@ -18,13 +18,10 @@
 #include "components/invalidation/impl/profile_invalidation_provider.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/password_manager/core/browser/password_store.h"
-#include "components/password_manager/core/browser/sync/password_model_worker.h"
 #include "components/sync/driver/data_type_controller.h"
 #include "components/sync/driver/sync_api_component_factory.h"
 #include "components/sync/driver/sync_util.h"
 #include "components/sync/engine/passive_model_worker.h"
-#include "components/sync/engine/sequenced_model_worker.h"
-#include "components/sync/engine/ui_model_worker.h"
 #include "components/sync_user_events/user_event_service.h"
 #include "components/version_info/version_info.h"
 #include "components/version_info/version_string.h"
@@ -179,14 +176,8 @@
 
 base::WeakPtr<syncer::SyncableService>
 WebViewSyncClient::GetSyncableServiceForType(syncer::ModelType type) {
-  switch (type) {
-    case syncer::PASSWORDS:
-      return password_store_ ? password_store_->GetPasswordSyncableService()
-                             : base::WeakPtr<syncer::SyncableService>();
-    default:
-      NOTREACHED();
-      return base::WeakPtr<syncer::SyncableService>();
-  }
+  NOTREACHED();
+  return base::WeakPtr<syncer::SyncableService>();
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
@@ -204,15 +195,8 @@
 WebViewSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) {
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
   switch (group) {
-    case syncer::GROUP_UI:
-      return new syncer::UIModelWorker(
-          base::CreateSingleThreadTaskRunner({web::WebThread::UI}));
     case syncer::GROUP_PASSIVE:
       return new syncer::PassiveModelWorker();
-    case syncer::GROUP_PASSWORD:
-      if (!password_store_)
-        return nullptr;
-      return new browser_sync::PasswordModelWorker(password_store_);
     default:
       return nullptr;
   }
diff --git a/media/base/android/android_cdm_factory.cc b/media/base/android/android_cdm_factory.cc
index 742d813..a2c20394f 100644
--- a/media/base/android/android_cdm_factory.cc
+++ b/media/base/android/android_cdm_factory.cc
@@ -92,11 +92,11 @@
       creation_id_,
       PendingCreation(std::move(factory), std::move(bound_cdm_created_cb)));
 
-  raw_factory->Create(
-      key_system, security_origin, cdm_config, session_message_cb,
-      session_closed_cb, session_keys_change_cb, session_expiration_update_cb,
-      base::BindRepeating(&AndroidCdmFactory::OnCdmCreated,
-                          weak_factory_.GetWeakPtr(), creation_id_));
+  raw_factory->Create(key_system, security_origin, cdm_config,
+                      session_message_cb, session_closed_cb,
+                      session_keys_change_cb, session_expiration_update_cb,
+                      base::BindOnce(&AndroidCdmFactory::OnCdmCreated,
+                                     weak_factory_.GetWeakPtr(), creation_id_));
 }
 
 void AndroidCdmFactory::OnCdmCreated(
diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc
index d647c96a..0fe171a 100644
--- a/media/base/android/media_drm_bridge.cc
+++ b/media/base/android/media_drm_bridge.cc
@@ -964,8 +964,8 @@
 
   provision_fetcher_->Retrieve(
       default_url, request_data,
-      base::Bind(&MediaDrmBridge::ProcessProvisionResponse,
-                 weak_factory_.GetWeakPtr()));
+      base::BindOnce(&MediaDrmBridge::ProcessProvisionResponse,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void MediaDrmBridge::ProcessProvisionResponse(bool success,
diff --git a/media/base/null_video_sink.h b/media/base/null_video_sink.h
index 1d5a31a..3b972a9a 100644
--- a/media/base/null_video_sink.h
+++ b/media/base/null_video_sink.h
@@ -43,9 +43,7 @@
   }
 
   // Sets |stop_cb_|, which will be fired when Stop() is called.
-  void set_stop_cb(const base::Closure& stop_cb) {
-    stop_cb_ = stop_cb;
-  }
+  void set_stop_cb(base::OnceClosure stop_cb) { stop_cb_ = std::move(stop_cb); }
 
   bool is_started() const { return started_; }
 
@@ -84,7 +82,7 @@
   const base::TickClock* tick_clock_;
 
   // If set, called when Stop() is called.
-  base::Closure stop_cb_;
+  base::OnceClosure stop_cb_;
 
   // Value passed to RenderCallback::Render().
   bool background_render_;
diff --git a/media/base/null_video_sink_unittest.cc b/media/base/null_video_sink_unittest.cc
index 33b3aea..4ead7a7 100644
--- a/media/base/null_video_sink_unittest.cc
+++ b/media/base/null_video_sink_unittest.cc
@@ -16,7 +16,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using base::test::RunClosure;
+using base::test::RunOnceClosure;
 using testing::_;
 using testing::DoAll;
 using testing::Return;
@@ -84,7 +84,7 @@
         .WillOnce(Return(test_frame));
     WaitableMessageLoopEvent event;
     EXPECT_CALL(*this, FrameReceived(test_frame))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     event.RunAndWait();
   }
 
@@ -103,7 +103,7 @@
         .WillOnce(Return(test_frame_2));
     EXPECT_CALL(*this, FrameReceived(test_frame)).Times(0);
     EXPECT_CALL(*this, FrameReceived(test_frame_2))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     event.RunAndWait();
   }
 
@@ -147,7 +147,7 @@
       EXPECT_CALL(*this, Render(current_time + i * interval,
                                 current_time + (i + 1) * interval, false))
           .WillOnce(
-              DoAll(RunClosure(event.GetClosure()), Return(test_frame_2)));
+              DoAll(RunOnceClosure(event.GetClosure()), Return(test_frame_2)));
     }
   }
   event.RunAndWait();
diff --git a/media/base/test_helpers.cc b/media/base/test_helpers.cc
index a59f98c..c815328 100644
--- a/media/base/test_helpers.cc
+++ b/media/base/test_helpers.cc
@@ -73,11 +73,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
-base::Closure WaitableMessageLoopEvent::GetClosure() {
+base::OnceClosure WaitableMessageLoopEvent::GetClosure() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return BindToCurrentLoop(
-      base::BindRepeating(&WaitableMessageLoopEvent::OnCallback,
-                          base::Unretained(this), PIPELINE_OK));
+  return BindToCurrentLoop(base::BindOnce(&WaitableMessageLoopEvent::OnCallback,
+                                          base::Unretained(this), PIPELINE_OK));
 }
 
 PipelineStatusCallback WaitableMessageLoopEvent::GetPipelineStatusCB() {
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h
index a5d01b0..3ab765b6 100644
--- a/media/base/test_helpers.h
+++ b/media/base/test_helpers.h
@@ -51,7 +51,7 @@
   ~WaitableMessageLoopEvent();
 
   // Returns a thread-safe closure that will signal |this| when executed.
-  base::Closure GetClosure();
+  base::OnceClosure GetClosure();
   PipelineStatusCallback GetPipelineStatusCB();
 
   // Runs the current message loop until |this| has been signaled.
diff --git a/media/gpu/android/codec_image_group.cc b/media/gpu/android/codec_image_group.cc
index 883458b..4521202 100644
--- a/media/gpu/android/codec_image_group.cc
+++ b/media/gpu/android/codec_image_group.cc
@@ -61,7 +61,7 @@
   // case, it doesn't need |surface_bundle_|, nor does it need to be notified
   // if the overlay is destroyed.
   image->AddUnusedCB(
-      base::BindRepeating(&CodecImageGroup::OnCodecImageUnused, this));
+      base::BindOnce(&CodecImageGroup::OnCodecImageUnused, this));
 }
 
 void CodecImageGroup::OnCodecImageUnused(CodecImage* image) {
diff --git a/media/gpu/android/codec_surface_bundle.cc b/media/gpu/android/codec_surface_bundle.cc
index 616d66f..48dca0a 100644
--- a/media/gpu/android/codec_surface_bundle.cc
+++ b/media/gpu/android/codec_surface_bundle.cc
@@ -45,8 +45,8 @@
   } else {
     task_runner->PostTask(
         FROM_HERE,
-        base::BindRepeating(&gpu::TextureOwner::ReleaseBackBuffers,
-                            codec_buffer_wait_coordinator_->texture_owner()));
+        base::BindOnce(&gpu::TextureOwner::ReleaseBackBuffers,
+                       codec_buffer_wait_coordinator_->texture_owner()));
   }
 }
 
diff --git a/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc
index 0d39aa9..a4769361 100644
--- a/media/gpu/android/media_codec_video_decoder.cc
+++ b/media/gpu/android/media_codec_video_decoder.cc
@@ -527,8 +527,8 @@
 
   if (overlay) {
     overlay->AddSurfaceDestroyedCallback(
-        base::Bind(&MediaCodecVideoDecoder::OnSurfaceDestroyed,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&MediaCodecVideoDecoder::OnSurfaceDestroyed,
+                       weak_factory_.GetWeakPtr()));
     target_surface_bundle_ = new CodecSurfaceBundle(std::move(overlay));
   } else {
     target_surface_bundle_ = texture_owner_bundle_;
@@ -899,8 +899,8 @@
     if (eos_decode_cb_) {
       // Schedule the EOS DecodeCB to run after all previous frames.
       video_frame_factory_->RunAfterPendingVideoFrames(
-          base::Bind(&MediaCodecVideoDecoder::RunEosDecodeCb,
-                     weak_factory_.GetWeakPtr(), reset_generation_));
+          base::BindOnce(&MediaCodecVideoDecoder::RunEosDecodeCb,
+                         weak_factory_.GetWeakPtr(), reset_generation_));
     }
     if (drain_type_)
       OnCodecDrained();
diff --git a/media/gpu/test/BUILD.gn b/media/gpu/test/BUILD.gn
index 0b53449..5dd95ec1 100644
--- a/media/gpu/test/BUILD.gn
+++ b/media/gpu/test/BUILD.gn
@@ -27,6 +27,7 @@
     "//media:test_support",
     "//media/gpu",
     "//mojo/core/embedder:embedder",
+    "//third_party/ffmpeg",
     "//third_party/libyuv",
   ]
   public_deps = [ "//testing/gtest" ]
diff --git a/media/gpu/test/image_quality_metrics.cc b/media/gpu/test/image_quality_metrics.cc
index 70e87c3..e90025b 100644
--- a/media/gpu/test/image_quality_metrics.cc
+++ b/media/gpu/test/image_quality_metrics.cc
@@ -51,7 +51,7 @@
     frame1 = converted_frame1.get();
   }
   if (frame2->format() != PIXEL_FORMAT_I420) {
-    converted_frame2 = ConvertVideoFrame(frame1, PIXEL_FORMAT_I420);
+    converted_frame2 = ConvertVideoFrame(frame2, PIXEL_FORMAT_I420);
     frame2 = converted_frame2.get();
   }
 
diff --git a/media/gpu/test/video.cc b/media/gpu/test/video.cc
index 7d9e847..6364c14 100644
--- a/media/gpu/test/video.cc
+++ b/media/gpu/test/video.cc
@@ -7,12 +7,25 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
 #include "base/numerics/safe_conversions.h"
+#include "base/run_loop.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
+#include "base/threading/thread.h"
 #include "base/values.h"
-
-#define VLOGF(level) VLOG(level) << __func__ << "(): "
+#include "media/base/decoder_buffer.h"
+#include "media/base/media.h"
+#include "media/base/video_decoder_config.h"
+#include "media/ffmpeg/ffmpeg_common.h"
+#include "media/filters/ffmpeg_demuxer.h"
+#include "media/filters/in_memory_url_protocol.h"
+#include "media/filters/vpx_video_decoder.h"
+#include "media/gpu/macros.h"
+#include "testing/gtest/include/gtest/gtest.h"
 
 namespace media {
 namespace test {
@@ -67,6 +80,41 @@
   return true;
 }
 
+bool Video::Decode() {
+  if (codec_ != VideoCodec::kCodecVP9) {
+    LOG(ERROR) << "Decoding is currently only supported for VP9 videos";
+    return false;
+  }
+
+  // The VpxVideoDecoder requires running on a SequencedTaskRunner, so we can't
+  // decode the video on the main test thread.
+  base::Thread decode_thread("DecodeThread");
+  if (!decode_thread.Start()) {
+    LOG(ERROR) << "Failed to start decode thread";
+    return false;
+  }
+
+  std::vector<uint8_t> decompressed_data;
+  bool success = false;
+  base::WaitableEvent done;
+  decode_thread.task_runner()->PostTask(
+      FROM_HERE, base::BindOnce(&Video::DecodeTask, std::move(data_),
+                                &decompressed_data, &success, &done));
+  done.Wait();
+  decode_thread.Stop();
+
+  if (!success)
+    return false;
+
+  // Set the video's pixel format and clear the profile and codec as the encoded
+  // data will be replaced with the decompressed video stream.
+  pixel_format_ = VideoPixelFormat::PIXEL_FORMAT_I420;
+  profile_ = VIDEO_CODEC_PROFILE_UNKNOWN;
+  codec_ = kUnknownVideoCodec;
+  data_ = std::move(decompressed_data);
+  return true;
+}
+
 bool Video::IsLoaded() const {
   return data_.size() > 0;
 }
@@ -297,6 +345,90 @@
 }
 
 // static
+void Video::DecodeTask(const std::vector<uint8_t> data,
+                       std::vector<uint8_t>* decompressed_data,
+                       bool* success,
+                       base::WaitableEvent* done) {
+  *success = false;
+  InitializeMediaLibrary();
+
+  // Initialize ffmpeg with the compressed video data.
+  InMemoryUrlProtocol protocol(&data[0], data.size(), false);
+  FFmpegGlue glue(&protocol);
+  ASSERT_TRUE(glue.OpenContext());
+
+  // Find the first VP9 stream in the file.
+  int stream_index = -1;
+  VideoDecoderConfig config;
+  for (size_t i = 0; i < glue.format_context()->nb_streams; ++i) {
+    AVStream* stream = glue.format_context()->streams[i];
+    const AVCodecParameters* codec_parameters = stream->codecpar;
+    const AVMediaType codec_type = codec_parameters->codec_type;
+    const AVCodecID codec_id = codec_parameters->codec_id;
+    if (codec_type == AVMEDIA_TYPE_VIDEO && codec_id == AV_CODEC_ID_VP9) {
+      *success = AVStreamToVideoDecoderConfig(stream, &config) &&
+                 config.IsValidConfig();
+      stream_index = i;
+      break;
+    }
+  }
+  if (!*success) {
+    done->Signal();
+    return;
+  }
+
+  // Setup the VP9 decoder.
+  VpxVideoDecoder decoder(
+      media::OffloadableVideoDecoder::OffloadState::kOffloaded);
+  media::VideoDecoder::InitCB init_cb = base::BindOnce(
+      [](bool* success, bool init_success) { *success = init_success; },
+      success);
+  decoder.Initialize(
+      config, false, nullptr, std::move(init_cb),
+      base::BindRepeating(&Video::OnFrameDecoded, decompressed_data),
+      base::NullCallback());
+  if (!*success) {
+    done->Signal();
+    return;
+  }
+
+  // Start decoding and wait until all frames are ready.
+  AVPacket packet = {};
+  while (av_read_frame(glue.format_context(), &packet) >= 0) {
+    if (packet.stream_index == stream_index) {
+      media::VideoDecoder::DecodeCB decode_cb = base::BindOnce(
+          [](bool* success, media::DecodeStatus status) {
+            *success = (status == media::DecodeStatus::OK);
+          },
+          success);
+      decoder.Decode(DecoderBuffer::CopyFrom(packet.data, packet.size),
+                     std::move(decode_cb));
+      if (!*success)
+        break;
+    }
+    av_packet_unref(&packet);
+  }
+
+  done->Signal();
+}
+
+// static
+void Video::OnFrameDecoded(std::vector<uint8_t>* data,
+                           scoped_refptr<VideoFrame> frame) {
+  ASSERT_EQ(frame->format(), VideoPixelFormat::PIXEL_FORMAT_I420);
+  size_t num_planes = VideoFrame::NumPlanes(frame->format());
+  for (size_t plane = 0; plane < num_planes; ++plane) {
+    size_t current_pos = data->size();
+    size_t plane_size =
+        VideoFrame::PlaneSize(frame->format(), plane, frame->coded_size())
+            .GetArea();
+    // TODO(dstaessens): Avoid resizing.
+    data->resize(data->size() + plane_size);
+    std::memcpy(&data->at(current_pos), frame->data(plane), plane_size);
+  }
+}
+
+// static
 base::Optional<VideoCodecProfile> Video::ConvertStringtoProfile(
     const std::string& profile) {
   if (profile == "H264PROFILE_BASELINE") {
diff --git a/media/gpu/test/video.h b/media/gpu/test/video.h
index c85897b..5dbd260 100644
--- a/media/gpu/test/video.h
+++ b/media/gpu/test/video.h
@@ -9,14 +9,18 @@
 #include <vector>
 
 #include "base/files/file_path.h"
-#include "base/macros.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/optional.h"
+#include "base/synchronization/waitable_event.h"
 #include "base/time/time.h"
 #include "media/base/video_codecs.h"
 #include "media/base/video_types.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace media {
+
+class VideoFrame;
+
 namespace test {
 
 // The video class provides functionality to load video files and manage their
@@ -39,6 +43,11 @@
   // Get the video data, will be empty if the video hasn't been loaded yet.
   const std::vector<uint8_t>& Data() const;
 
+  // Decode the video, replacing the video stream data in |data_| with raw video
+  // data. This is currently only supported for VP9 videos. Returns whether
+  // decoding was successful.
+  bool Decode();
+
   // Get the video's codec.
   VideoCodec Codec() const;
   // Get the video's codec profile.
@@ -88,6 +97,16 @@
   base::Optional<base::FilePath> ResolveFilePath(
       const base::FilePath& file_path);
 
+  // Decode the video on a separate thread.
+  static void DecodeTask(const std::vector<uint8_t> data,
+                         std::vector<uint8_t>* decompressed_data,
+                         bool* success,
+                         base::WaitableEvent* done);
+  // Called each time a |frame| is decoded while decoding a video. The decoded
+  // frame will be appended to the specified |data|.
+  static void OnFrameDecoded(std::vector<uint8_t>* data,
+                             scoped_refptr<VideoFrame> frame);
+
   // The path where all test video files are stored.
   // TODO(dstaessens@) Avoid using a static data path here.
   static base::FilePath test_data_path_;
diff --git a/media/gpu/test/video_encoder/video_encoder_client.cc b/media/gpu/test/video_encoder/video_encoder_client.cc
index 1361b138..3920672 100644
--- a/media/gpu/test/video_encoder/video_encoder_client.cc
+++ b/media/gpu/test/video_encoder/video_encoder_client.cc
@@ -22,7 +22,6 @@
 
 namespace {
 
-// TODO(crbug.com/1045825): Check IsFlushSupported() before flushing encoder.
 // TODO(crbug.com/1045825): Support encoding parameter changes.
 
 // Callbacks can be called from any thread, but WeakPtrs are not thread-safe.
@@ -296,6 +295,13 @@
   // Changing the state to flushing will abort any pending encodes.
   encoder_client_state_ = VideoEncoderClientState::kFlushing;
 
+  // If the encoder does not support flush, immediately consider flushing done.
+  if (!encoder_->IsFlushSupported()) {
+    FireEvent(VideoEncoder::EncoderEvent::kFlushing);
+    FlushDoneTask(true);
+    return;
+  }
+
   auto flush_done_cb = base::BindOnce(
       CallbackThunk<decltype(&VideoEncoderClient::FlushDoneTask), bool>,
       weak_this_, encoder_client_task_runner_,
diff --git a/media/gpu/test/video_encoder/video_encoder_test_environment.cc b/media/gpu/test/video_encoder/video_encoder_test_environment.cc
index 6a2d825b..42f011dd 100644
--- a/media/gpu/test/video_encoder/video_encoder_test_environment.cc
+++ b/media/gpu/test/video_encoder/video_encoder_test_environment.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "gpu/ipc/service/gpu_memory_buffer_factory.h"
+#include "media/gpu/macros.h"
 #include "media/gpu/test/video.h"
 
 namespace media {
@@ -28,6 +29,24 @@
     return nullptr;
   }
 
+  // If the video file has the .webm format it needs to be decoded first.
+  // TODO(b/151134705): Add support to cache decompressed video files.
+  if (video->FilePath().MatchesExtension(FILE_PATH_LITERAL(".webm"))) {
+    VLOGF(1) << "Test video " << video->FilePath()
+             << " is compressed, decoding...";
+    if (!video->Decode()) {
+      LOG(ERROR) << "Failed to decode " << video->FilePath();
+      return nullptr;
+    }
+  }
+
+  if (video->PixelFormat() == VideoPixelFormat::PIXEL_FORMAT_UNKNOWN) {
+    LOG(ERROR) << "Test video " << video->FilePath()
+               << " has an invalid video pixel format "
+               << VideoPixelFormatToString(video->PixelFormat());
+    return nullptr;
+  }
+
   return new VideoEncoderTestEnvironment(std::move(video), output_folder);
 }
 
diff --git a/media/gpu/test/video_frame_validator.cc b/media/gpu/test/video_frame_validator.cc
index 93ddd604..4257f5a 100644
--- a/media/gpu/test/video_frame_validator.cc
+++ b/media/gpu/test/video_frame_validator.cc
@@ -12,6 +12,7 @@
 #include "base/strings/stringprintf.h"
 #include "build/build_config.h"
 #include "media/base/video_frame.h"
+#include "media/gpu/macros.h"
 #include "media/gpu/test/image_quality_metrics.h"
 #include "media/gpu/test/video_test_helpers.h"
 #include "media/gpu/video_frame_mapper.h"
@@ -313,7 +314,8 @@
   auto model_frame = get_model_frame_cb_.Run(frame_index);
   CHECK(model_frame);
   double psnr = ComputePSNR(*frame, *model_frame);
-  if (psnr > tolerance_)
+  DVLOGF(4) << "frame_index: " << frame_index << ", psnr: " << psnr;
+  if (psnr < tolerance_)
     return std::make_unique<PSNRMismatchedFrameInfo>(frame_index, psnr);
   return nullptr;
 }
@@ -362,7 +364,8 @@
   auto model_frame = get_model_frame_cb_.Run(frame_index);
   CHECK(model_frame);
   double ssim = ComputeSSIM(*frame, *model_frame);
-  if (ssim > tolerance_)
+  DVLOGF(4) << "frame_index: " << frame_index << ", ssim: " << ssim;
+  if (ssim < tolerance_)
     return std::make_unique<SSIMMismatchedFrameInfo>(frame_index, ssim);
   return nullptr;
 }
diff --git a/media/gpu/test/video_frame_validator.h b/media/gpu/test/video_frame_validator.h
index dde57ae..cb2cd5f 100644
--- a/media/gpu/test/video_frame_validator.h
+++ b/media/gpu/test/video_frame_validator.h
@@ -179,7 +179,7 @@
 // |tolerance_|, the validation on the frame passes.
 class PSNRVideoFrameValidator : public VideoFrameValidator {
  public:
-  constexpr static double kDefaultTolerance = 0.70;
+  constexpr static double kDefaultTolerance = 20.0;
 
   static std::unique_ptr<PSNRVideoFrameValidator> Create(
       const GetModelFrameCB& get_model_frame_cb,
@@ -208,7 +208,7 @@
 // |tolerance_|, the validation on the frame passes.
 class SSIMVideoFrameValidator : public VideoFrameValidator {
  public:
-  constexpr static double kDefaultTolerance = 45.0;
+  constexpr static double kDefaultTolerance = 0.70;
 
   static std::unique_ptr<SSIMVideoFrameValidator> Create(
       const GetModelFrameCB& get_model_frame_cb,
diff --git a/media/gpu/video_encode_accelerator_perf_tests.cc b/media/gpu/video_encode_accelerator_perf_tests.cc
index cc38d9e..24eb0e26 100644
--- a/media/gpu/video_encode_accelerator_perf_tests.cc
+++ b/media/gpu/video_encode_accelerator_perf_tests.cc
@@ -37,7 +37,7 @@
 constexpr const char* help_msg =
     "Run the video encode accelerator performance tests on the video\n"
     "specified by <video path>. If no <video path> is given the default\n"
-    "\"puppets-320x180.nv12.yuv\" video will be used.\n"
+    "\"bear_320x192_40frames.yuv.webm\" video will be used.\n"
     "\nThe <video metadata path> should specify the location of a json file\n"
     "containing the video's metadata. By default <video path>.json will be\n"
     "used.\n"
@@ -52,7 +52,7 @@
 
 // Default video to be used if no test video was specified.
 constexpr base::FilePath::CharType kDefaultTestVideoPath[] =
-    FILE_PATH_LITERAL("puppets-320x180.nv12.yuv");
+    FILE_PATH_LITERAL("bear_320x192_40frames.yuv.webm");
 
 media::test::VideoEncoderTestEnvironment* g_env;
 
diff --git a/media/gpu/video_encode_accelerator_tests.cc b/media/gpu/video_encode_accelerator_tests.cc
index 272bb07..155a602 100644
--- a/media/gpu/video_encode_accelerator_tests.cc
+++ b/media/gpu/video_encode_accelerator_tests.cc
@@ -30,7 +30,7 @@
 constexpr const char* help_msg =
     "Run the video encoder accelerator tests on the video specified by\n"
     "<video path>. If no <video path> is given the default\n"
-    "\"puppets-320x180.nv12.yuv\" video will be used.\n"
+    "\"bear_320x192_40frames.yuv.webm\" video will be used.\n"
     "\nThe <video metadata path> should specify the location of a json file\n"
     "containing the video's metadata, such as frame checksums. By default\n"
     "<video path>.json will be used.\n"
@@ -43,7 +43,7 @@
 
 // Default video to be used if no test video was specified.
 constexpr base::FilePath::CharType kDefaultTestVideoPath[] =
-    FILE_PATH_LITERAL("puppets-320x180.nv12.yuv");
+    FILE_PATH_LITERAL("bear_320x192_40frames.yuv.webm");
 
 media::test::VideoEncoderTestEnvironment* g_env;
 
@@ -71,7 +71,6 @@
 // - Vary bitrate
 // - Flush midstream
 // - Forcing key frames
-// - Add support for webm files
 
 // Encode video from start to end. Wait for the kFlushDone event at the end of
 // the stream, that notifies us all frames have been encoded.
diff --git a/media/mojo/clients/mojo_android_overlay_unittest.cc b/media/mojo/clients/mojo_android_overlay_unittest.cc
index 914c020b4..5de8033 100644
--- a/media/mojo/clients/mojo_android_overlay_unittest.cc
+++ b/media/mojo/clients/mojo_android_overlay_unittest.cc
@@ -115,7 +115,7 @@
     overlay_client_.reset(
         new MojoAndroidOverlay(provider_receiver_.BindNewPipeAndPassRemote(),
                                std::move(config_), routing_token));
-    overlay_client_->AddSurfaceDestroyedCallback(base::Bind(
+    overlay_client_->AddSurfaceDestroyedCallback(base::BindOnce(
         &MockClientCallbacks::OnDestroyed, base::Unretained(&callbacks_)));
     base::RunLoop().RunUntilIdle();
   }
diff --git a/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc
index f09203e..03f3eea 100644
--- a/media/renderers/audio_renderer_impl_unittest.cc
+++ b/media/renderers/audio_renderer_impl_unittest.cc
@@ -566,7 +566,7 @@
   std::unique_ptr<AudioTimestampHelper> next_timestamp_;
 
   // Run during DecodeDecoder() to unblock WaitForPendingRead().
-  base::Closure wait_for_pending_decode_cb_;
+  base::OnceClosure wait_for_pending_decode_cb_;
 
   AudioDecoder::InitCB init_decoder_cb_;
   bool expected_init_result_;
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc
index a9b8450..5e5778de 100644
--- a/media/renderers/video_renderer_impl_unittest.cc
+++ b/media/renderers/video_renderer_impl_unittest.cc
@@ -39,6 +39,7 @@
 
 using ::base::test::RunClosure;
 using ::base::test::RunOnceCallback;
+using ::base::test::RunOnceClosure;
 using ::testing::_;
 using ::testing::AnyNumber;
 using ::testing::Combine;
@@ -234,7 +235,8 @@
     SCOPED_TRACE("WaitForEnded()");
 
     WaitableMessageLoopEvent event;
-    EXPECT_CALL(mock_cb_, OnEnded()).WillOnce(RunClosure(event.GetClosure()));
+    EXPECT_CALL(mock_cb_, OnEnded())
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     event.RunAndWait();
   }
 
@@ -421,7 +423,7 @@
       // Buffering state changes must happen before end of stream.
       testing::InSequence in_sequence;
       EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       EXPECT_CALL(mock_cb_, OnEnded());
     }
     SatisfyPendingDecodeWithEndOfStream();
@@ -452,7 +454,7 @@
       // Buffering state changes must happen before end of stream.
       testing::InSequence in_sequence;
       EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       EXPECT_CALL(mock_cb_, OnEnded());
     }
     SatisfyPendingDecode();
@@ -518,10 +520,10 @@
 // we should be able to call other renderer methods from the Flush callback.
 static void VideoRendererImplTest_FlushDoneCB(VideoRendererImplTest* test,
                                               VideoRenderer* renderer,
-                                              const base::Closure& success_cb) {
+                                              base::OnceClosure success_cb) {
   test->QueueFrames("0 10 20 30");
   renderer->StartPlayingFrom(base::TimeDelta::FromSeconds(0));
-  success_cb.Run();
+  std::move(success_cb).Run();
 }
 
 TEST_F(VideoRendererImplTest, FlushCallbackNoLock) {
@@ -637,7 +639,7 @@
 
   WaitableMessageLoopEvent event;
   EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(20)))
-      .WillOnce(RunClosure(event.GetClosure()));
+      .WillOnce(RunOnceClosure(event.GetClosure()));
   AdvanceTimeInMs(20);
   event.RunAndWait();
 
@@ -677,7 +679,7 @@
     WaitableMessageLoopEvent event;
 
     EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(0)))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     StartPlayingFrom(0);
 
     EXPECT_TRUE(IsReadPending());
@@ -733,7 +735,7 @@
   {
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_))
         .Times(4)
         .WillRepeatedly(SaveArg<0>(&last_pipeline_statistics));
@@ -804,7 +806,7 @@
     SCOPED_TRACE("Waiting for BUFFERING_HAVE_ENOUGH");
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     EXPECT_CALL(mock_cb_, FrameReceived(_)).Times(AnyNumber());
     EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
     EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
@@ -817,7 +819,7 @@
     SCOPED_TRACE("Waiting for BUFFERING_HAVE_NOTHING");
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, _))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     renderer_->OnTimeProgressing();
     time_source_.StartTicking();
     // Jump time far enough forward that no frames are valid.
@@ -846,7 +848,7 @@
     SCOPED_TRACE("Waiting for BUFFERING_HAVE_ENOUGH");
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     EXPECT_CALL(mock_cb_, FrameReceived(_)).Times(AnyNumber());
     EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
     EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
@@ -864,7 +866,7 @@
     AdvanceTimeInMs(1000);
     renderer_->OnTimeProgressing();
     EXPECT_CALL(mock_cb_, FrameReceived(_))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     event.RunAndWait();
     ASSERT_EQ(renderer_->effective_frames_queued_for_testing(), 0u);
   }
@@ -874,7 +876,7 @@
     SCOPED_TRACE("Waiting for BUFFERING_HAVE_NOTHING");
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING, _))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     renderer_->OnTimeStopped();
     event.RunAndWait();
   }
@@ -889,7 +891,7 @@
   WaitableMessageLoopEvent event;
   EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(0)));
   EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, _))
-      .WillOnce(RunClosure(event.GetClosure()));
+      .WillOnce(RunOnceClosure(event.GetClosure()));
   EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
   EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
   EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
@@ -936,7 +938,7 @@
   WaitableMessageLoopEvent event;
   // Frame "10" should not have been expired.
   EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(10)))
-      .WillOnce(RunClosure(event.GetClosure()));
+      .WillOnce(RunOnceClosure(event.GetClosure()));
   AdvanceTimeInMs(10);
   event.RunAndWait();
 
@@ -1008,7 +1010,7 @@
     EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(larger_size));
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(10)))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     AdvanceTimeInMs(10);
     event.RunAndWait();
   }
@@ -1016,7 +1018,7 @@
     // Called is not fired because frame size does not change.
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(20)))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     AdvanceTimeInMs(10);
     event.RunAndWait();
   }
@@ -1025,7 +1027,7 @@
     EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(initial_size));
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(30)))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     AdvanceTimeInMs(10);
     event.RunAndWait();
   }
@@ -1073,7 +1075,7 @@
     // Callback is not fired because opacity does not change.
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(10)))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     AdvanceTimeInMs(10);
     event.RunAndWait();
   }
@@ -1082,7 +1084,7 @@
     EXPECT_CALL(mock_cb_, OnVideoOpacityChange(true));
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(20)))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     AdvanceTimeInMs(10);
     event.RunAndWait();
   }
@@ -1090,7 +1092,7 @@
     // Callback is not fired because opacity does not change.
     WaitableMessageLoopEvent event;
     EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(30)))
-        .WillOnce(RunClosure(event.GetClosure()));
+        .WillOnce(RunOnceClosure(event.GetClosure()));
     AdvanceTimeInMs(10);
     event.RunAndWait();
   }
@@ -1203,7 +1205,7 @@
       EXPECT_CALL(mock_cb_,
                   OnBufferingStateChange(BUFFERING_HAVE_ENOUGH,
                                          BUFFERING_CHANGE_REASON_UNKNOWN))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
       EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
       EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
@@ -1229,7 +1231,7 @@
 
       EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(60))).Times(0);
       EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(90)))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
       AdvanceTimeInMs(91);
 
@@ -1246,7 +1248,7 @@
           .WillOnce(Return(underflow_type == DEMUXER_UNDERFLOW));
       EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING,
                                                    underflow_type))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       AdvanceTimeInMs(30);
       event.RunAndWait();
       Mock::VerifyAndClearExpectations(&mock_cb_);
@@ -1264,7 +1266,7 @@
       EXPECT_CALL(mock_cb_,
                   OnBufferingStateChange(BUFFERING_HAVE_ENOUGH,
                                          BUFFERING_CHANGE_REASON_UNKNOWN))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       EXPECT_CALL(mock_cb_, OnEnded());
       SatisfyPendingDecodeWithEndOfStream();
       event.RunAndWait();
@@ -1286,7 +1288,7 @@
       EXPECT_CALL(mock_cb_,
                   OnBufferingStateChange(BUFFERING_HAVE_ENOUGH,
                                          BUFFERING_CHANGE_REASON_UNKNOWN))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
       EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
       EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
@@ -1306,7 +1308,7 @@
           .WillOnce(Return(underflow_type == DEMUXER_UNDERFLOW));
       EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING,
                                                    underflow_type))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       EXPECT_CALL(mock_cb_, FrameReceived(HasTimestampMatcher(60))).Times(1);
       EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
       AdvanceTimeInMs(79);
@@ -1330,7 +1332,7 @@
       EXPECT_CALL(mock_cb_,
                   OnBufferingStateChange(BUFFERING_HAVE_ENOUGH,
                                          BUFFERING_CHANGE_REASON_UNKNOWN))
-          .WillOnce(RunClosure(event.GetClosure()));
+          .WillOnce(RunOnceClosure(event.GetClosure()));
       EXPECT_CALL(mock_cb_, OnVideoFrameRateChange(base::Optional<int>(50)));
 
       // Note: In the normal underflow case we queue 5 frames here instead of
diff --git a/media/test/data/bear_320x192_40frames.yuv.webm.json b/media/test/data/bear_320x192_40frames.yuv.webm.json
new file mode 100644
index 0000000..87e55c5
--- /dev/null
+++ b/media/test/data/bear_320x192_40frames.yuv.webm.json
@@ -0,0 +1,7 @@
+{
+  "profile": "VP9PROFILE_PROFILE0",
+  "width": 320,
+  "height": 192,
+  "num_frames": 40,
+  "frame_rate": 30
+}
diff --git a/remoting/host/chromeos/message_box.cc b/remoting/host/chromeos/message_box.cc
index df543e6..1575911 100644
--- a/remoting/host/chromeos/message_box.cc
+++ b/remoting/host/chromeos/message_box.cc
@@ -72,8 +72,8 @@
       message_box_view_(new views::MessageBoxView(
           views::MessageBoxView::InitParams(message_label))) {
   DCHECK(message_box_);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK, ok_label);
-  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL, cancel_label);
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK, ok_label);
+  DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, cancel_label);
 }
 
 void MessageBox::Core::Show() {
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index 06be207..9de85c2 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -399,6 +399,7 @@
     "//services/network/public/cpp:buildflags",
     "//services/network/public/mojom",
     "//services/network/trust_tokens",
+    "//services/network/trust_tokens:tests",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/cpp/test:test_support",
     "//testing/gtest",
@@ -416,10 +417,6 @@
   if (!is_ios) {
     deps += [ "//services/proxy_resolver:lib" ]
   }
-
-  if (is_trust_tokens_supported) {
-    deps += [ "//services/network/trust_tokens:tests" ]
-  }
 }
 
 jumbo_source_set("test_support") {
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 05bd6dc..059dea47 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -96,6 +96,9 @@
 #include "services/network/throttling/network_conditions.h"
 #include "services/network/throttling/throttling_controller.h"
 #include "services/network/throttling/throttling_network_transaction_factory.h"
+#include "services/network/trust_tokens/sqlite_trust_token_persister.h"
+#include "services/network/trust_tokens/trust_token_parameterization.h"
+#include "services/network/trust_tokens/trust_token_store.h"
 #include "services/network/url_loader.h"
 #include "services/network/url_request_context_builder_mojo.h"
 
@@ -142,12 +145,6 @@
 #include "services/network/mdns_responder.h"
 #endif  // BUILDFLAG(ENABLE_MDNS)
 
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
-#include "services/network/trust_tokens/sqlite_trust_token_persister.h"
-#include "services/network/trust_tokens/trust_token_parameterization.h"
-#include "services/network/trust_tokens/trust_token_store.h"
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
-
 #if defined(USE_NSS_CERTS)
 #include "net/cert_net/nss_ocsp.h"
 #include "net/cert_net/nss_ocsp_session_url_request.h"
@@ -1823,7 +1820,6 @@
     DCHECK(!params_->persist_session_cookies);
   }
 
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
   if (base::FeatureList::IsEnabled(features::kTrustTokens)) {
     if (params_->trust_token_path) {
       SQLiteTrustTokenPersister::CreateForFilePath(
@@ -1837,7 +1833,6 @@
       trust_token_store_ = TrustTokenStore::CreateInMemory();
     }
   }
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 
   std::unique_ptr<net::StaticHttpUserAgentSettings> user_agent_settings =
       std::make_unique<net::StaticHttpUserAgentSettings>(
@@ -2366,13 +2361,11 @@
   }
 }
 
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 void NetworkContext::FinishConstructingTrustTokenStore(
     std::unique_ptr<SQLiteTrustTokenPersister> persister) {
   DCHECK(!trust_token_store_);
   trust_token_store_ = std::make_unique<TrustTokenStore>(std::move(persister));
 }
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 
 void NetworkContext::GetOriginPolicyManager(
     mojo::PendingReceiver<mojom::OriginPolicyManager> receiver) {
diff --git a/services/network/network_context.h b/services/network/network_context.h
index 8e52d22..d2480f9 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -94,15 +94,12 @@
 class NSSTempCertsCacheChromeOS;
 class P2PSocketManager;
 class ProxyLookupRequest;
+class QuicTransport;
 class ResourceScheduler;
 class ResourceSchedulerClient;
-class QuicTransport;
-class WebSocketFactory;
-
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 class SQLiteTrustTokenPersister;
 class TrustTokenStore;
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
+class WebSocketFactory;
 
 namespace cors {
 class CorsURLLoaderFactory;
@@ -479,7 +476,6 @@
     return url_loader_factories_.size();
   }
 
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
   // Maintains Trust Tokens protocol state
   // (https://github.com/WICG/trust-token-api). Used by URLLoader to check
   // preconditions before annotating requests with protocol-related headers
@@ -487,7 +483,6 @@
   //
   // Initialized asynchronously and may be null until initialized.
   TrustTokenStore* trust_token_store() { return trust_token_store_.get(); }
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 
  private:
   URLRequestContextOwner MakeURLRequestContext();
@@ -538,14 +533,12 @@
 
   void InitializeCorsParams();
 
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
   // If |trust_token_store_| is backed by an asynchronously-constructed (e.g.,
   // SQL-based) persistence layer, |FinishConstructingTrustTokenStore|
   // constructs and populates |trust_token_store_| once the persister's
   // asynchronous initialization has finished.
   void FinishConstructingTrustTokenStore(
       std::unique_ptr<SQLiteTrustTokenPersister> persister);
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 
   NetworkService* const network_service_;
 
@@ -582,10 +575,8 @@
   mojo::UniqueReceiverSet<mojom::ProxyResolvingSocketFactory>
       proxy_resolving_socket_factories_;
 
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
   // See the comment for |trust_token_store()|.
   std::unique_ptr<TrustTokenStore> trust_token_store_;
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 
 #if !defined(OS_IOS)
   std::unique_ptr<WebSocketFactory> websocket_factory_;
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index 26077a8..d77d2b0 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -114,6 +114,8 @@
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "services/network/public/mojom/proxy_config.mojom.h"
 #include "services/network/test/test_url_loader_client.h"
+#include "services/network/trust_tokens/trust_token_parameterization.h"
+#include "services/network/trust_tokens/trust_token_store.h"
 #include "services/network/udp_socket_test_util.h"
 #include "test_mojo_proxy_resolver_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -144,11 +146,6 @@
 #include "services/network/mock_mojo_dhcp_wpad_url_client.h"
 #endif  // defined(OS_CHROMEOS)
 
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
-#include "services/network/trust_tokens/trust_token_parameterization.h"
-#include "services/network/trust_tokens/trust_token_store.h"
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
-
 namespace network {
 
 namespace {
@@ -6901,7 +6898,6 @@
       true /* was_cached */, true /* is_navigation */);
 }
 
-#if BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 TEST_F(NetworkContextTest, EnableTrustTokens) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(features::kTrustTokens);
@@ -6968,7 +6964,6 @@
 
   EXPECT_FALSE(network_context->trust_token_store());
 }
-#endif  // BUILDFLAG(IS_TRUST_TOKENS_SUPPORTED)
 
 }  // namespace
 
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn
index 2c02d3ae..ee5cce19 100644
--- a/services/network/public/cpp/BUILD.gn
+++ b/services/network/public/cpp/BUILD.gn
@@ -10,10 +10,7 @@
 
 buildflag_header("buildflags") {
   header = "network_service_buildflags.h"
-  flags = [
-    "IS_CT_SUPPORTED=$is_ct_supported",
-    "IS_TRUST_TOKENS_SUPPORTED=$is_trust_tokens_supported",
-  ]
+  flags = [ "IS_CT_SUPPORTED=$is_ct_supported" ]
 }
 
 jumbo_component("cpp") {
diff --git a/services/network/public/cpp/features.gni b/services/network/public/cpp/features.gni
index 9f8e6e1..18fef913 100644
--- a/services/network/public/cpp/features.gni
+++ b/services/network/public/cpp/features.gni
@@ -8,7 +8,4 @@
   # Certificate transparency is not supported on iOS.
   # TODO(mmenke): It's actually not supported on Android, either.
   is_ct_supported = !is_ios
-
-  # Trust Tokens is a Web Platform feature, so it isn't supported on iOS.
-  is_trust_tokens_supported = !is_ios
 }
diff --git a/services/service_manager/embedder/main.cc b/services/service_manager/embedder/main.cc
index 53e9e0a..1b713d5 100644
--- a/services/service_manager/embedder/main.cc
+++ b/services/service_manager/embedder/main.cc
@@ -13,6 +13,7 @@
 #include "base/debug/stack_trace.h"
 #include "base/i18n/icu_util.h"
 #include "base/logging.h"
+#include "base/memory/shared_memory_hooks.h"
 #include "base/message_loop/message_pump_type.h"
 #include "base/optional.h"
 #include "base/process/launch.h"
@@ -31,6 +32,7 @@
 #include "mojo/core/embedder/configuration.h"
 #include "mojo/core/embedder/embedder.h"
 #include "mojo/core/embedder/scoped_ipc_support.h"
+#include "mojo/public/cpp/base/shared_memory_utils.h"
 #include "services/service_manager/embedder/main_delegate.h"
 #include "services/service_manager/embedder/process_type.h"
 #include "services/service_manager/embedder/set_process_title.h"
@@ -39,6 +41,7 @@
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/cpp/service_executable/service_executable_environment.h"
 #include "services/service_manager/public/cpp/service_executable/switches.h"
+#include "services/service_manager/sandbox/sandbox_type.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
 #include "ui/base/ui_base_switches.h"
@@ -374,6 +377,38 @@
       return exit_code;
     }
 
+    // Note #1: the installed shared memory hooks require a live instance of
+    // mojo::core::ScopedIPCSupport to function, which is instantiated below by
+    // the process type's main function. However, some implementations of the
+    // service_manager::MainDelegate::Initialize() delegate method allocate
+    // shared memory, so the hooks cannot be installed before the Initialize()
+    // call above, or the shared memory allocation will simply fail.
+    //
+    // Note #2: some platforms can directly allocated shared memory in a
+    // sandboxed process. The defines below must be in sync with the
+    // implementation of mojo::NodeController::CreateSharedBuffer().
+#if !defined(OS_MACOSX) && !defined(OS_NACL_SFI) && !defined(OS_FUCHSIA)
+    // TODO(dcheng): The separate check for |is_broker_process| should not be
+    // required, but avoid changing the behavior of IsUnsandboxedSandboxType()
+    // for now.
+    if (mojo_config.is_broker_process ||
+        service_manager::IsUnsandboxedSandboxType(
+            service_manager::SandboxTypeFromCommandLine(command_line))) {
+      // Unsandboxed processes don't need shared memory brokering... because
+      // they're not sandboxed.
+    } else if (mojo_config.force_direct_shared_memory_allocation) {
+      // Don't bother with hooks if direct shared memory allocation has been
+      // requested.
+    } else {
+      // Otherwise, this is a sandboxed process that will need brokering to
+      // allocate shared memory.
+      base::SharedMemoryHooks::SetCreateHooks(
+          &mojo::CreateReadOnlySharedMemoryRegion,
+          &mojo::CreateUnsafeSharedMemoryRegion,
+          &mojo::CreateWritableSharedMemoryRegion);
+    }
+#endif  // !defined(OS_MACOSX) && !defined(OS_NACL_SFI) && !defined(OS_FUCHSIA)
+
 #if defined(OS_WIN)
     // Route stdio to parent console (if any) or create one.
     if (base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/testing/buildbot/OWNERS b/testing/buildbot/OWNERS
index db4513d..74ea8134 100644
--- a/testing/buildbot/OWNERS
+++ b/testing/buildbot/OWNERS
@@ -12,8 +12,8 @@
 per-file *chromium.perf*.json=crouleau@chromium.org
 per-file *chromium.perf*.json=wenbinzhang@google.com
 per-file *chromium.perf*.json=hypan@google.com
-per-file chromium.webrtc.json=phoglund@chromium.org
-per-file chromium.webrtc.fyi.json=phoglund@chromium.org
+per-file chromium.webrtc.json=mbonadei@chromium.org
+per-file chromium.webrtc.fyi.json=mbonadei@chromium.org
 
 # TEAM: infra-dev@chromium.org
 # COMPONENT: Infra>Client>Chrome
diff --git a/testing/buildbot/chromium.ci.json b/testing/buildbot/chromium.ci.json
index 31e5cda6..7dd70a6 100644
--- a/testing/buildbot/chromium.ci.json
+++ b/testing/buildbot/chromium.ci.json
@@ -190522,6 +190522,36 @@
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_target": "//:blink_web_tests"
+      },
+      {
+        "args": [
+          "hardware_accelerated_feature",
+          "--show-stdout",
+          "--browser=web-engine-shell",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--target-cpu=x64"
+        ],
+        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "hardware_accelerated_feature_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "kvm": "1",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//content/test:fuchsia_telemetry_gpu_integration_test"
       }
     ]
   },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index a3f648f..da4e636 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -12645,6 +12645,36 @@
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_target": "//:blink_web_tests"
+      },
+      {
+        "args": [
+          "hardware_accelerated_feature",
+          "--show-stdout",
+          "--browser=web-engine-shell",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--target-cpu=x64"
+        ],
+        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "hardware_accelerated_feature_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "kvm": "1",
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//content/test:fuchsia_telemetry_gpu_integration_test"
       }
     ]
   },
diff --git a/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
index 01833ff7..3b73acd8 100644
--- a/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
@@ -67,7 +67,7 @@
 -org.chromium.chrome.browser.offlinepages.indicator.OfflineIndicatorControllerTest.testDoNotShowOfflineIndicatorWhenTemporarilyPaused
 
 # crbug.com/1061198
--org.chromium.chrome.browser.settings.password.PasswordSettingsTest.testExportMenuDisabled
+-org.chromium.chrome.browser.password_manager.settings.PasswordSettingsTest.testExportMenuDisabled
 
 # crbug.com/1061201
 -org.chromium.chrome.browser.history.HistoryActivityTest.testOpenSelectedItems
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index e8c0c715..51025b3d 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -787,7 +787,8 @@
       waterfall, tester_name, tester_config, step_name, test_config)
     if not result:
       return None
-    result['isolate_name'] = 'telemetry_gpu_integration_test'
+    result['isolate_name'] = test_config.get(
+      'isolate_name', 'telemetry_gpu_integration_test')
     args = result.get('args', [])
     test_to_run = result.pop('telemetry_test_name', test_name)
 
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 09176ab..04a0e7f 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -799,6 +799,15 @@
     "script": "//testing/scripts/run_flatbuffers_unittests.py",
     "type": "script",
   },
+  "fuchsia_telemetry_gpu_integration_test": {
+    "args": [
+      "../../content/test/gpu/run_gpu_integration_test_fuchsia.py",
+      "--output-directory=.",
+    ],
+    "label": "//content/test:fuchsia_telemetry_gpu_integration_test",
+    "script": "//testing/scripts/run_isolated_script_test.py",
+    "type": "script",
+  },
   "gcm_unit_tests": {
     "label": "//google_apis/gcm:gcm_unit_tests",
     "type": "console_test_launcher",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 404e2611..ed9d2e3 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1118,6 +1118,14 @@
     'remove_from': [
       'Android FYI Release (Pixel 2)',
     ],
+    # TODO(https://crbug.com/1061094): Remove once argument is not required.
+    'modifications': {
+      'fuchsia-fyi-x64-rel': {
+        'args': [
+          '--target-cpu=x64',
+        ],
+      },
+    },
   },
   'headless_browsertests': {
     'remove_from': [
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 162aa72..fd5d65d 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -1220,6 +1220,12 @@
       'openscreen_unittests': {}
     },
 
+    'fuchsia_gpu_telemetry_tests': {
+      'hardware_accelerated_feature': {
+        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
+      }
+    },
+
     'fuchsia_gtests': {
       'angle_unittests': {},
       'base_unittests': {},
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 7994b6ab..58c4bc36 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1794,6 +1794,8 @@
         'additional_compile_targets': [
           'all',
         ],
+        'browser_config': 'web-engine-shell',
+        'os_type': 'linux',
         'mixins': [
           'linux-xenial',
         ],
@@ -1807,6 +1809,7 @@
         'test_suites': {
           'gtest_tests': 'fuchsia_gtests',
           'isolated_scripts': 'chromium_webkit_isolated_scripts',
+          'gpu_telemetry_tests': 'fuchsia_gpu_telemetry_tests',
         },
       },
       'ios-simulator-code-coverage': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 34b7dd3..dd440ce 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1185,6 +1185,26 @@
             ]
         }
     ],
+    "CSSOMViewScrollCoordinates": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "EnableCSSOMViewScrollCoordinates",
+                    "enable_features": [
+                        "CSSOMViewScrollCoordinates"
+                    ]
+                }
+            ]
+        }
+    ],
     "CacheStorageEagerReading": [
         {
             "platforms": [
@@ -5390,26 +5410,6 @@
             ]
         }
     ],
-    "SyncUssPasswords'": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "ios",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "SyncUSSPasswords"
-                    ]
-                }
-            ]
-        }
-    ],
     "TabGridLayoutAndroid": [
         {
             "platforms": [
diff --git a/third_party/android_crazy_linker/BUILD.gn b/third_party/android_crazy_linker/BUILD.gn
index e31e6a4..8a949512 100644
--- a/third_party/android_crazy_linker/BUILD.gn
+++ b/third_party/android_crazy_linker/BUILD.gn
@@ -152,6 +152,11 @@
       configs -= [ "//build/config/compiler:chromium_code" ]
       configs += [ "//build/config/compiler:no_chromium_code" ]
 
+      # Disable orderfile instrumentation. Code in this target is in a different
+      # .so, cannot call unexported instrumentation functions from another one
+      # (link time error).
+      configs -= [ "//build/config/android:default_orderfile_instrumentation" ]
+
       # This is used to allow shared memory regions to work on Android Q+
       # See http://crbug.com/949804
       deps = [ "//third_party/ashmem" ]
diff --git a/third_party/ashmem/BUILD.gn b/third_party/ashmem/BUILD.gn
index 5e92b377..e5bd683 100644
--- a/third_party/ashmem/BUILD.gn
+++ b/third_party/ashmem/BUILD.gn
@@ -9,4 +9,6 @@
     "ashmem-dev.c",
     "ashmem.h",
   ]
+
+  configs -= [ "//build/config/android:default_orderfile_instrumentation" ]
 }
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index e135de6..7f9f00d 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -159,6 +159,11 @@
 const base::Feature kRTCOfferExtmapAllowMixed{
     "RTCOfferExtmapAllowMixed", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Prevents workers from sending IsolateInBackgroundNotification to V8
+// and thus instructs V8 to favor performance over memory on workers.
+const base::Feature kV8OptimizeWorkersForPerformance{
+    "V8OptimizeWorkersForPerformance", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables negotiation of experimental multiplex codec in SDP.
 const base::Feature kWebRtcMultiplexCodec{"WebRTC-MultiplexCodec",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 96c6068..48ba4bd 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -45,6 +45,7 @@
 BLINK_COMMON_EXPORT extern const base::Feature kRTCGetDisplayMedia;
 BLINK_COMMON_EXPORT extern const base::Feature kRTCUnifiedPlanByDefault;
 BLINK_COMMON_EXPORT extern const base::Feature kRTCOfferExtmapAllowMixed;
+BLINK_COMMON_EXPORT extern const base::Feature kV8OptimizeWorkersForPerformance;
 BLINK_COMMON_EXPORT extern const base::Feature kWebRtcMultiplexCodec;
 BLINK_COMMON_EXPORT extern const base::Feature kWebRtcHideLocalIpsWithMdns;
 
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index 2511123..7b71841 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -632,8 +632,8 @@
   # Set permission settings for given origin.
   experimental command setPermission
     parameters
-      # Origin the permission applies to.
-      string origin
+      # Origin the permission applies to, all origins if not specified.
+      optional string origin
       # Descriptor of permission to override.
       PermissionDescriptor permission
       # Setting of the permission.
@@ -644,7 +644,8 @@
   # Grant specific permissions to the given origin and reject all others.
   experimental command grantPermissions
     parameters
-      string origin
+      # Origin the permission applies to, all origins if not specified.
+      optional string origin
       array of PermissionType permissions
       # BrowserContext to override permissions. When omitted, default browser context is used.
       optional BrowserContextID browserContextId
diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom
index f46f457..17d11c19 100644
--- a/third_party/blink/public/mojom/page/page.mojom
+++ b/third_party/blink/public/mojom/page/page.mojom
@@ -3,9 +3,21 @@
 // found in the LICENSE file.
 
 module blink.mojom;
+import "mojo/public/mojom/base/time.mojom";
+
+// We need this structure to be able to atomically update the state of the page
+// to avoid it being in an inconsistent state (e.g. frozen but visible).
+// TODO(yuzus): Replace
+// third_party/blink/renderer/platform/scheduler/public/page_lifecycle_state.h
+// with this struct.
+struct PageLifecycleState {
+  bool is_frozen;
+};
 
 // Used for broadcast messages from browser to renderer for messages that need
 // to go to all blink::WebViewImpls for a given content::WebContents. There may
 // be multiple blink::WebViewImpls when there are out-of-process iframes.
 interface PageBroadcast {
+  // Notifies the renderer about a change in the lifecycle state of the page.
+  SetPageLifecycleState(PageLifecycleState state) => ();
 };
diff --git a/third_party/blink/public/web/web_widget.h b/third_party/blink/public/web/web_widget.h
index eb89afd..2200b9e 100644
--- a/third_party/blink/public/web/web_widget.h
+++ b/third_party/blink/public/web/web_widget.h
@@ -114,14 +114,6 @@
     return nullptr;
   }
 
-  // Methods called to mark the beginning and end of input processing work
-  // before rAF scripts are executed. Only called when gathering main frame
-  // UMA and UKM. That is, when RecordStartOfFrameMetrics has been called, and
-  // before RecordEndOfFrameMetrics has been called. Only implement if the
-  // rAF input update will be called as part of a layer tree view main frame
-  // update.
-  virtual void BeginRafAlignedInput() {}
-  virtual void EndRafAlignedInput() {}
 
   // Methods called to mark the beginning and end of the
   // LayerTreeHost::UpdateLayers method. Only called when gathering main frame
diff --git a/third_party/blink/public/web/web_widget_client.h b/third_party/blink/public/web/web_widget_client.h
index 645e689..3b000661 100644
--- a/third_party/blink/public/web/web_widget_client.h
+++ b/third_party/blink/public/web/web_widget_client.h
@@ -243,6 +243,10 @@
                                           float minimum,
                                           float maximum) {}
 
+  // Dispatch any pending input. This method will called before
+  // dispatching a RequestAnimationFrame to the widget.
+  virtual void DispatchRafAlignedInput(base::TimeTicks frame_time) {}
+
   // Requests an image decode and will have the |callback| run asynchronously
   // when it completes. Forces a new main frame to occur that will trigger
   // pushing the decode through the compositor.
diff --git a/third_party/blink/renderer/bindings/core/v8/dictionary.h b/third_party/blink/renderer/bindings/core/v8/dictionary.h
index 6fc37ee..fdd06431 100644
--- a/third_party/blink/renderer/bindings/core/v8/dictionary.h
+++ b/third_party/blink/renderer/bindings/core/v8/dictionary.h
@@ -26,6 +26,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_DICTIONARY_H_
 #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_DICTIONARY_H_
 
+#include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -44,9 +45,14 @@
 
  public:
   Dictionary() : isolate_(nullptr) {}
-  Dictionary(v8::Isolate*,
-             v8::Local<v8::Value> dictionary_object,
-             ExceptionState&);
+  explicit Dictionary(v8::Isolate*,
+                      v8::Local<v8::Value> dictionary_object,
+                      ExceptionState&);
+  explicit Dictionary(const ScriptValue& script_value)
+      : isolate_(script_value.GetIsolate()) {
+    CHECK(script_value.IsObject());
+    dictionary_object_ = script_value.V8Value().As<v8::Object>();
+  }
 
   Dictionary& operator=(const Dictionary&) = default;
 
diff --git a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h
index c705881d..be11f06 100644
--- a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h
+++ b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h
@@ -100,12 +100,13 @@
 
 namespace bindings {
 
-template <typename T>
+template <typename T, typename... ExtraArgs>
 typename IDLSequence<T>::ImplType VariadicArgumentsToNativeValues(
     v8::Isolate* isolate,
     const v8::FunctionCallbackInfo<v8::Value>& info,
     int start_index,
-    ExceptionState& exception_state) {
+    ExceptionState& exception_state,
+    ExtraArgs... extra_args) {
   using VectorType = typename IDLSequence<T>::ImplType;
 
   const int length = info.Length();
@@ -116,7 +117,7 @@
   result.ReserveInitialCapacity(length - start_index);
   for (int i = start_index; i < length; ++i) {
     result.UncheckedAppend(NativeValueTraits<T>::ArgumentValue(
-        isolate, i, info[i], exception_state));
+        isolate, i, info[i], exception_state, extra_args...));
     if (exception_state.HadException())
       return VectorType();
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/idl_types.h b/third_party/blink/renderer/bindings/core/v8/idl_types.h
index aec6f39d..2974ff8 100644
--- a/third_party/blink/renderer/bindings/core/v8/idl_types.h
+++ b/third_party/blink/renderer/bindings/core/v8/idl_types.h
@@ -189,7 +189,7 @@
 template <bindings::IDLStringConvMode mode>
 struct IDLStringBaseV2 final : public IDLBaseHelper<String> {};
 using IDLStringV2 = IDLStringBaseV2<bindings::IDLStringConvMode::kDefault>;
-using IDLStringTreatNullAsV2 =
+using IDLStringTreatNullAsEmptyStringV2 =
     IDLStringBaseV2<bindings::IDLStringConvMode::kTreatNullAsEmptyString>;
 
 // USVString
@@ -198,6 +198,36 @@
 using IDLUSVStringV2 =
     IDLUSVStringBaseV2<bindings::IDLStringConvMode::kDefault>;
 
+// [StringContext=TrustedHTML] DOMString
+template <bindings::IDLStringConvMode mode>
+struct IDLStringStringContextTrustedHTMLBaseV2 final
+    : public IDLBaseHelper<String> {};
+using IDLStringStringContextTrustedHTMLV2 =
+    IDLStringStringContextTrustedHTMLBaseV2<
+        bindings::IDLStringConvMode::kDefault>;
+using IDLStringStringContextTrustedHTMLTreatNullAsEmptyStringV2 =
+    IDLStringStringContextTrustedHTMLBaseV2<
+        bindings::IDLStringConvMode::kTreatNullAsEmptyString>;
+
+// [StringContext=TrustedScript] DOMString
+template <bindings::IDLStringConvMode mode>
+struct IDLStringStringContextTrustedScriptBaseV2 final
+    : public IDLBaseHelper<String> {};
+using IDLStringStringContextTrustedScriptV2 =
+    IDLStringStringContextTrustedScriptBaseV2<
+        bindings::IDLStringConvMode::kDefault>;
+using IDLStringStringContextTrustedScriptTreatNullAsEmptyStringV2 =
+    IDLStringStringContextTrustedScriptBaseV2<
+        bindings::IDLStringConvMode::kTreatNullAsEmptyString>;
+
+// [StringContext=TrustedScriptURL] USVString
+template <bindings::IDLStringConvMode mode>
+struct IDLUSVStringStringContextTrustedScriptURLBaseV2 final
+    : public IDLBaseHelper<String> {};
+using IDLUSVStringStringContextTrustedScriptURLV2 =
+    IDLUSVStringStringContextTrustedScriptURLBaseV2<
+        bindings::IDLStringConvMode::kDefault>;
+
 // object
 struct IDLObject final : public IDLBaseHelper<ScriptValue> {};
 
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
index 51b8fc1..db3c7bcaa 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h
@@ -87,12 +87,15 @@
   static constexpr bool has_null_value =
       bindings::NativeValueTraitsHasNullValue<ImplType>::value;
 
+  template <typename... ExtraArgs>
   static decltype(auto) ArgumentValue(v8::Isolate* isolate,
                                       int argument_index,
                                       v8::Local<v8::Value> value,
-                                      ExceptionState& exception_state) {
+                                      ExceptionState& exception_state,
+                                      ExtraArgs... extra_args) {
     return NativeValueTraits<std::remove_pointer_t<T>>::NativeValue(
-        isolate, value, exception_state);
+        isolate, value, exception_state,
+        std::forward<ExtraArgs>(extra_args)...);
   }
 };
 
@@ -107,12 +110,15 @@
   static constexpr bool has_null_value =
       bindings::NativeValueTraitsHasNullValue<ImplType>::value;
 
+  template <typename... ExtraArgs>
   static decltype(auto) ArgumentValue(v8::Isolate* isolate,
                                       int argument_index,
                                       v8::Local<v8::Value> value,
-                                      ExceptionState& exception_state) {
+                                      ExceptionState& exception_state,
+                                      ExtraArgs... extra_args) {
     return NativeValueTraits<std::remove_pointer_t<T>>::NativeValue(
-        isolate, value, exception_state);
+        isolate, value, exception_state,
+        std::forward<ExtraArgs>(extra_args)...);
   }
 };
 
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
index 9f2cb82c..67abed0c 100644
--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
+++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
@@ -294,7 +294,7 @@
 //   const NativeValueTraitsStringAdapter& x = ...;
 //   F(x);  // ToBlinkString<AtomicString> is used.
 //   G(x);  // ToBlinkString<String> is used.
-class NativeValueTraitsStringAdapter {
+class CORE_EXPORT NativeValueTraitsStringAdapter {
  public:
   NativeValueTraitsStringAdapter() = default;
   NativeValueTraitsStringAdapter(const NativeValueTraitsStringAdapter&) =
@@ -457,6 +457,116 @@
   }
 };
 
+template <bindings::IDLStringConvMode mode>
+struct NativeValueTraits<IDLStringStringContextTrustedHTMLBaseV2<mode>>
+    : public NativeValueTraitsBase<
+          IDLStringStringContextTrustedHTMLBaseV2<mode>> {
+  static String NativeValue(v8::Isolate* isolate,
+                            v8::Local<v8::Value> value,
+                            ExceptionState& exception_state,
+                            ExecutionContext* execution_context) {
+    if (TrustedHTML* trusted_html =
+            V8TrustedHTML::ToImplWithTypeCheck(isolate, value)) {
+      return trusted_html->toString();
+    }
+
+    auto&& string = NativeValueTraits<IDLStringBaseV2<mode>>::NativeValue(
+        isolate, value, exception_state);
+    if (exception_state.HadException())
+      return String();
+    return TrustedTypesCheckForHTML(string, execution_context, exception_state);
+  }
+};
+
+template <>
+struct CORE_EXPORT
+    NativeValueTraits<IDLNullable<IDLStringStringContextTrustedHTMLV2>>
+    : public NativeValueTraitsBase<
+          IDLNullable<IDLStringStringContextTrustedHTMLV2>> {
+  static String NativeValue(v8::Isolate* isolate,
+                            v8::Local<v8::Value> value,
+                            ExceptionState& exception_state,
+                            ExecutionContext* execution_context) {
+    return NativeValueTraits<IDLStringStringContextTrustedHTMLBaseV2<
+        bindings::IDLStringConvMode::kNullable>>::
+        NativeValue(isolate, value, exception_state, execution_context);
+  }
+};
+
+template <bindings::IDLStringConvMode mode>
+struct NativeValueTraits<IDLStringStringContextTrustedScriptBaseV2<mode>>
+    : public NativeValueTraitsBase<
+          IDLStringStringContextTrustedScriptBaseV2<mode>> {
+  static String NativeValue(v8::Isolate* isolate,
+                            v8::Local<v8::Value> value,
+                            ExceptionState& exception_state,
+                            ExecutionContext* execution_context) {
+    if (TrustedScript* trusted_script =
+            V8TrustedScript::ToImplWithTypeCheck(isolate, value)) {
+      return trusted_script->toString();
+    }
+
+    auto&& string = NativeValueTraits<IDLStringBaseV2<mode>>::NativeValue(
+        isolate, value, exception_state);
+    if (exception_state.HadException())
+      return String();
+    return TrustedTypesCheckForScript(string, execution_context,
+                                      exception_state);
+  }
+};
+
+template <>
+struct CORE_EXPORT
+    NativeValueTraits<IDLNullable<IDLStringStringContextTrustedScriptV2>>
+    : public NativeValueTraitsBase<
+          IDLNullable<IDLStringStringContextTrustedScriptV2>> {
+  static String NativeValue(v8::Isolate* isolate,
+                            v8::Local<v8::Value> value,
+                            ExceptionState& exception_state,
+                            ExecutionContext* execution_context) {
+    return NativeValueTraits<IDLStringStringContextTrustedScriptBaseV2<
+        bindings::IDLStringConvMode::kNullable>>::
+        NativeValue(isolate, value, exception_state, execution_context);
+  }
+};
+
+template <bindings::IDLStringConvMode mode>
+struct NativeValueTraits<IDLUSVStringStringContextTrustedScriptURLBaseV2<mode>>
+    : public NativeValueTraitsBase<
+          IDLUSVStringStringContextTrustedScriptURLBaseV2<mode>> {
+  static String NativeValue(v8::Isolate* isolate,
+                            v8::Local<v8::Value> value,
+                            ExceptionState& exception_state,
+                            ExecutionContext* execution_context) {
+    if (TrustedScriptURL* trusted_script_url =
+            V8TrustedScriptURL::ToImplWithTypeCheck(isolate, value)) {
+      return trusted_script_url->toString();
+    }
+
+    auto&& string = NativeValueTraits<IDLUSVStringBaseV2<mode>>::NativeValue(
+        isolate, value, exception_state);
+    if (exception_state.HadException())
+      return String();
+    return TrustedTypesCheckForScriptURL(string, execution_context,
+                                         exception_state);
+  }
+};
+
+template <>
+struct CORE_EXPORT
+    NativeValueTraits<IDLNullable<IDLUSVStringStringContextTrustedScriptURLV2>>
+    : public NativeValueTraitsBase<
+          IDLNullable<IDLUSVStringStringContextTrustedScriptURLV2>> {
+  static String NativeValue(v8::Isolate* isolate,
+                            v8::Local<v8::Value> value,
+                            ExceptionState& exception_state,
+                            ExecutionContext* execution_context) {
+    return NativeValueTraits<IDLUSVStringStringContextTrustedScriptURLBaseV2<
+        bindings::IDLStringConvMode::kNullable>>::
+        NativeValue(isolate, value, exception_state, execution_context);
+  }
+};
+
 // Buffer source types
 template <>
 struct CORE_EXPORT NativeValueTraits<DOMArrayBuffer>
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index d60d18c..65633c3f 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -609,10 +609,6 @@
           "//third_party/blink/renderer/modules/shapedetection/face_detector_options.idl",
           "//third_party/blink/renderer/modules/shapedetection/landmark.idl",
           "//third_party/blink/renderer/modules/shapedetection/text_detector.idl",
-          "//third_party/blink/renderer/modules/sms/navigator_sms.idl",
-          "//third_party/blink/renderer/modules/sms/sms.idl",
-          "//third_party/blink/renderer/modules/sms/sms_receiver.idl",
-          "//third_party/blink/renderer/modules/sms/sms_receiver_options.idl",
           "//third_party/blink/renderer/modules/speech/speech_grammar.idl",
           "//third_party/blink/renderer/modules/speech/speech_grammar_list.idl",
           "//third_party/blink/renderer/modules/speech/speech_recognition.idl",
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
index b92b1629..9c651b6 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
@@ -226,10 +226,12 @@
 
     if (real_type.is_boolean or real_type.is_numeric or real_type.is_any
             or real_type.is_object):
-        return "IDL{}".format(real_type.type_name)
+        return "IDL{}".format(
+            idl_type.type_name_with_extended_attribute_key_values)
 
     if real_type.is_string:
-        return "IDL{}V2".format(real_type.type_name)
+        return "IDL{}V2".format(
+            idl_type.type_name_with_extended_attribute_key_values)
 
     if real_type.is_array_buffer:
         return blink_type_info(real_type).typename
@@ -417,22 +419,23 @@
 
     def create_definition(symbol_node):
         if argument_index is None:
+            func_name = "NativeValue"
             arguments = ["${isolate}", v8_value_expr, "${exception_state}"]
-            blink_value_expr = _format(
-                "NativeValueTraits<{_1}>::NativeValue({_2})",
-                _1=native_value_tag(idl_type),
-                _2=", ".join(arguments))
         else:
+            func_name = "ArgumentValue"
             arguments = [
                 "${isolate}",
                 str(argument_index),
                 v8_value_expr,
                 "${exception_state}",
             ]
-            blink_value_expr = _format(
-                "NativeValueTraits<{_1}>::ArgumentValue({_2})",
-                _1=native_value_tag(idl_type),
-                _2=", ".join(arguments))
+        if "StringContext" in idl_type.effective_annotations:
+            arguments.append("${execution_context}")
+        blink_value_expr = _format(
+            "NativeValueTraits<{_1}>::{_2}({_3})",
+            _1=native_value_tag(idl_type),
+            _2=func_name,
+            _3=", ".join(arguments))
 
         if default_value is None:
             return SymbolDefinitionNode(symbol_node, [
@@ -489,13 +492,17 @@
 
     pattern = ("auto&& ${{{_1}}} = "
                "bindings::VariadicArgumentsToNativeValues<{_2}>({_3});")
-    _1 = blink_var_name
-    _2 = native_value_tag(idl_type.element_type)
-    _3 = [
+    arguments = [
         "${isolate}", v8_array,
         str(v8_array_start_index), "${exception_state}"
     ]
-    text = _format(pattern, _1=_1, _2=_2, _3=", ".join(_3))
+    if "StringContext" in idl_type.element_type.effective_annotations:
+        arguments.append("${execution_context}")
+    text = _format(
+        pattern,
+        _1=blink_var_name,
+        _2=native_value_tag(idl_type.element_type),
+        _3=", ".join(arguments))
 
     def create_definition(symbol_node):
         return SymbolDefinitionNode(symbol_node, [
diff --git a/third_party/blink/renderer/bindings/scripts/v8_attributes.py b/third_party/blink/renderer/bindings/scripts/v8_attributes.py
index 256afc7..2619a99 100644
--- a/third_party/blink/renderer/bindings/scripts/v8_attributes.py
+++ b/third_party/blink/renderer/bindings/scripts/v8_attributes.py
@@ -181,6 +181,10 @@
 
     internal_name = cpp_encoded_property_name(attribute)
 
+    cpp_type = idl_type.cpp_type
+    if idl_type.is_explicit_nullable:
+        cpp_type = v8_types.cpp_template_type('base::Optional', cpp_type)
+
     context = {
         # [ActivityLogging]
         'activity_logging_world_list_for_getter':
@@ -202,7 +206,7 @@
         'context_enabled_feature_name':
         v8_utilities.context_enabled_feature_name(attribute),
         'cpp_name': cpp_name(attribute),
-        'cpp_type': idl_type.cpp_type,
+        'cpp_type': cpp_type,
         'cpp_type_initializer': idl_type.cpp_type_initializer,
         'deprecate_as': deprecate_as,
         'does_generate_getter': does_generate_getter,
@@ -412,6 +416,11 @@
         if (context['is_keep_alive_for_gc']
                 or 'CachedAttribute' in extended_attributes):
             return 'V8SetReturnValue(info, v8_value)'
+        if idl_type.is_explicit_nullable:
+            cpp_return_value = 'cpp_value.value()'
+            if idl_type.is_frozen_array:
+                cpp_return_value = 'FreezeV8Object(ToV8(cpp_value.value(), info.Holder(), info.GetIsolate()), info.GetIsolate())'
+            return 'V8SetReturnValue(info, {})'.format(cpp_return_value)
         return idl_type.v8_set_return_value(
             cpp_value,
             extended_attributes=extended_attributes,
@@ -457,8 +466,6 @@
             and not attribute.is_static):
         arguments.append('*impl')
     arguments.extend(extra_arguments)
-    if attribute.idl_type.is_explicit_nullable:
-        arguments.append('is_null')
     if context['is_getter_raises_exception']:
         arguments.append('exception_state')
     if attribute.idl_type.use_output_parameter_for_result:
@@ -649,8 +656,6 @@
         arguments.append('std::move(cpp_value)')
     else:
         arguments.append('cpp_value')
-    if idl_type.is_explicit_nullable:
-        arguments.append('is_null')
     if context['is_setter_raises_exception']:
         arguments.append('exception_state')
     if context['use_common_reflection_setter']:
diff --git a/third_party/blink/renderer/bindings/scripts/v8_types.py b/third_party/blink/renderer/bindings/scripts/v8_types.py
index 5a3acbe..55422ee 100644
--- a/third_party/blink/renderer/bindings/scripts/v8_types.py
+++ b/third_party/blink/renderer/bindings/scripts/v8_types.py
@@ -312,6 +312,8 @@
 
     if idl_type.native_array_element_type:
         return ''
+    if idl_type.is_explicit_nullable:
+        return ''
     if idl_type.is_numeric_type:
         return ' = 0'
     if base_idl_type == 'boolean':
@@ -865,11 +867,12 @@
 
     if (idl_type.is_explicit_nullable
             and code_generation_target == 'attribute_set'):
+        this_cpp_type = cpp_template_type('base::Optional', this_cpp_type)
+        expr = '{cpp_type}({expr})'.format(
+            cpp_type=this_cpp_type, expr=assign_expression)
         assign_expression = ("is_null "
-                             "? {cpp_type}() "
-                             ": {expr}".format(
-                                 cpp_type=this_cpp_type,
-                                 expr=assign_expression))
+                             "? base::nullopt "
+                             ": {expr}".format(expr=expr))
 
     return {
         'assign_expression': assign_expression,
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py b/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
index ea9a5b9..7e4d9af 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
@@ -202,6 +202,16 @@
                 sorted(self.effective_annotations.keys())))
 
     @property
+    def type_name_with_extended_attribute_key_values(self):
+        name_pieces = []
+        name_pieces.append(self.type_name_without_extended_attributes)
+        annotations = self.effective_annotations
+        for key in sorted(annotations.keys()):
+            name_pieces.append(key)
+            name_pieces.extend(annotations.values_of(key))
+        return ''.join(name_pieces)
+
+    @property
     def type_name_without_extended_attributes(self):
         raise exceptions.NotImplementedError()
 
diff --git a/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl b/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl
index 2768fc4..1db515e 100644
--- a/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl
+++ b/third_party/blink/renderer/bindings/templates/attributes.cc.tmpl
@@ -138,9 +138,6 @@
   {% if attribute.is_getter_raises_exception %}
   {{define_exception_state}}
   {% endif %}
-  {% if attribute.is_explicit_nullable %}
-  bool is_null = false;
-  {% endif %}
 
   {% if attribute.cpp_value_original %}
   {{attribute.cpp_type}} {{attribute.cpp_value}}({{attribute.cpp_value_original}});
@@ -163,19 +160,23 @@
       | trim | indent(2)}}
   {% endif %}
 
+  {% if attribute.is_explicit_nullable %}
+  if (!{{attribute.cpp_value}}.has_value()) {
+    {% if attribute.cached_attribute_validation_method %}
+    // [CachedAttribute]
+    property_symbol.Set(holder, v8::Null(info.GetIsolate()));
+    {% endif %}
+    V8SetReturnValueNull(info);
+    return;
+  }
+  {% endif %}
+
   {% if attribute.cached_attribute_validation_method %}
   // [CachedAttribute]
   v8::Local<v8::Value> v8_value({{attribute.cpp_value_to_v8_value}});
   property_symbol.Set(holder, v8_value);
   {% endif %}
 
-  {% if attribute.is_explicit_nullable %}
-  if (is_null) {
-    V8SetReturnValueNull(info);
-    return;
-  }
-  {% endif %}
-
   {% if attribute.is_keep_alive_for_gc %}
   // Keep the wrapper object for the return value alive as long as |this|
   // object is alive in order to save creation time of the wrapper object.
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc b/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc
index 90c0cd5..d58c677 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_object.cc
@@ -1364,16 +1364,14 @@
 
   TestObject* impl = V8TestObject::ToImpl(holder);
 
-  bool is_null = false;
+  base::Optional<bool> cpp_value(impl->booleanOrNullAttribute());
 
-  bool cpp_value(impl->booleanOrNullAttribute(is_null));
-
-  if (is_null) {
+  if (!cpp_value.has_value()) {
     V8SetReturnValueNull(info);
     return;
   }
 
-  V8SetReturnValueBool(info, cpp_value);
+  V8SetReturnValue(info, cpp_value.value());
 }
 
 static void BooleanOrNullAttributeAttributeSetter(
@@ -1391,11 +1389,11 @@
   bool is_null = IsUndefinedOrNull(v8_value);
 
   // Prepare the value to be set.
-  bool cpp_value = is_null ? bool() : NativeValueTraits<IDLBoolean>::NativeValue(info.GetIsolate(), v8_value, exception_state);
+  base::Optional<bool> cpp_value = is_null ? base::nullopt : base::Optional<bool>(NativeValueTraits<IDLBoolean>::NativeValue(info.GetIsolate(), v8_value, exception_state));
   if (exception_state.HadException())
     return;
 
-  impl->setBooleanOrNullAttribute(cpp_value, is_null);
+  impl->setBooleanOrNullAttribute(cpp_value);
 }
 
 static void StringOrNullAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
@@ -1429,16 +1427,14 @@
 
   TestObject* impl = V8TestObject::ToImpl(holder);
 
-  bool is_null = false;
+  base::Optional<int32_t> cpp_value(impl->longOrNullAttribute());
 
-  int32_t cpp_value(impl->longOrNullAttribute(is_null));
-
-  if (is_null) {
+  if (!cpp_value.has_value()) {
     V8SetReturnValueNull(info);
     return;
   }
 
-  V8SetReturnValueInt(info, cpp_value);
+  V8SetReturnValue(info, cpp_value.value());
 }
 
 static void LongOrNullAttributeAttributeSetter(
@@ -1456,11 +1452,11 @@
   bool is_null = IsUndefinedOrNull(v8_value);
 
   // Prepare the value to be set.
-  int32_t cpp_value = is_null ? int32_t() : NativeValueTraits<IDLLong>::NativeValue(info.GetIsolate(), v8_value, exception_state);
+  base::Optional<int32_t> cpp_value = is_null ? base::nullopt : base::Optional<int32_t>(NativeValueTraits<IDLLong>::NativeValue(info.GetIsolate(), v8_value, exception_state));
   if (exception_state.HadException())
     return;
 
-  impl->setLongOrNullAttribute(cpp_value, is_null);
+  impl->setLongOrNullAttribute(cpp_value);
 }
 
 static void TestInterfaceOrNullAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 033ce50..d81629a 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1051,7 +1051,6 @@
     "css/css_uri_value_test.cc",
     "css/css_value_test_helper.h",
     "css/mock_css_paint_image_generator.h",
-    "display_lock/display_lock_budget_test.cc",
     "display_lock/display_lock_context_test.cc",
     "display_lock/display_lock_utilities_test.cc",
     "dom/attr_test.cc",
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.idl b/third_party/blink/renderer/core/animation/animation_timeline.idl
index 0c36488..19013b3 100644
--- a/third_party/blink/renderer/core/animation/animation_timeline.idl
+++ b/third_party/blink/renderer/core/animation/animation_timeline.idl
@@ -9,6 +9,7 @@
     RuntimeEnabled=WebAnimationsAPI,
     Exposed=Window
 ] interface AnimationTimeline {
-    readonly attribute double? currentTime;
+    // TODO(crbug.com/1060971): Remove ImplementedAs.
+    [ImplementedAs=CurrentTime] readonly attribute double? currentTime;
     [RuntimeEnabled=ScrollTimeline] readonly attribute TimelinePhase phase;
 };
diff --git a/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc b/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc
index c28611f..f03deda 100644
--- a/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc
+++ b/third_party/blink/renderer/core/css/cssom/computed_style_property_map.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/core/css/css_identifier_value.h"
 #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
 #include "third_party/blink/renderer/core/css/css_variable_data.h"
+#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
 #include "third_party/blink/renderer/core/css/properties/css_property_ref.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/pseudo_element.h"
@@ -248,6 +249,8 @@
   switch (property_id) {
     case CSSPropertyID::kTransform:
       return ComputedTransform(*style);
+    case CSSPropertyID::kLineHeight:
+      return ComputedStyleUtils::ComputedValueForLineHeight(*style);
     default:
       return CSSProperty::Get(property_id)
           .CSSValueFromComputedStyle(*style, nullptr /* layout_object */,
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
index 2cac7dee..c2d04d1 100644
--- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -162,11 +162,10 @@
     return ZoomAdjustedPixelValueForLength(fill_size.size.Width(), style);
   }
 
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*ZoomAdjustedPixelValueForLength(fill_size.size.Width(), style));
-  list->Append(
-      *ZoomAdjustedPixelValueForLength(fill_size.size.Height(), style));
-  return list;
+  return MakeGarbageCollected<CSSValuePair>(
+      ZoomAdjustedPixelValueForLength(fill_size.size.Width(), style),
+      ZoomAdjustedPixelValueForLength(fill_size.size.Height(), style),
+      CSSValuePair::kKeepIdenticalValues);
 }
 
 const CSSValue* ComputedStyleUtils::BackgroundImageOrWebkitMaskSize(
@@ -738,6 +737,22 @@
       style);
 }
 
+CSSValue* ComputedStyleUtils::ComputedValueForLineHeight(
+    const ComputedStyle& style) {
+  const Length& length = style.LineHeight();
+  if (length.IsNegative())
+    return CSSIdentifierValue::Create(CSSValueID::kNormal);
+
+  if (length.IsPercent()) {
+    return CSSNumericLiteralValue::Create(length.GetFloatValue() / 100.0,
+                                          CSSPrimitiveValue::UnitType::kNumber);
+  } else {
+    return ZoomAdjustedPixelValue(
+        FloatValueForLength(length, style.GetFontDescription().ComputedSize()),
+        style);
+  }
+}
+
 CSSValueID IdentifierForFamily(const AtomicString& family) {
   if (family == font_family_names::kWebkitCursive)
     return CSSValueID::kCursive;
@@ -1687,13 +1702,13 @@
   return list;
 }
 
-const CSSValue& ComputedStyleUtils::ValueForBorderRadiusCorner(
+CSSValue* ComputedStyleUtils::ValueForBorderRadiusCorner(
     const LengthSize& radius,
     const ComputedStyle& style) {
-  CSSValueList& list = *ValuesForBorderRadiusCorner(radius, style);
-  if (list.Item(0) == list.Item(1))
-    return list.Item(0);
-  return list;
+  return MakeGarbageCollected<CSSValuePair>(
+      ZoomAdjustedPixelValueForLength(radius.Width(), style),
+      ZoomAdjustedPixelValueForLength(radius.Height(), style),
+      CSSValuePair::kDropIdenticalValues);
 }
 
 CSSFunctionValue* ValueForMatrixTransform(
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.h b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
index eeeaaae6..5ae6563a 100644
--- a/third_party/blink/renderer/core/css/properties/computed_style_utils.h
+++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
@@ -99,6 +99,7 @@
   ValueForContentPositionAndDistributionWithOverflowAlignment(
       const StyleContentAlignmentData&);
   static CSSValue* ValueForLineHeight(const ComputedStyle&);
+  static CSSValue* ComputedValueForLineHeight(const ComputedStyle&);
   static CSSValueList* ValueForFontFamily(const ComputedStyle&);
   static CSSPrimitiveValue* ValueForFontSize(const ComputedStyle&);
   static CSSPrimitiveValue* ValueForFontStretch(const ComputedStyle&);
@@ -135,8 +136,8 @@
   static CSSValue* ValueForAnimationTimingFunction(const CSSTimingData*);
   static CSSValueList* ValuesForBorderRadiusCorner(const LengthSize&,
                                                    const ComputedStyle&);
-  static const CSSValue& ValueForBorderRadiusCorner(const LengthSize&,
-                                                    const ComputedStyle&);
+  static CSSValue* ValueForBorderRadiusCorner(const LengthSize&,
+                                              const ComputedStyle&);
   // TODO(fs): For some properties ('transform') we use the pixel snapped
   // border-box as the reference box. In other cases ('transform-origin') we use
   // the "unsnapped" border-box. Maybe use the same (the "unsnapped") in both
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
index 27203a0..7f21a7de 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -730,7 +730,7 @@
     const SVGComputedStyle&,
     const LayoutObject*,
     bool allow_visited_style) const {
-  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
+  return ComputedStyleUtils::ValueForBorderRadiusCorner(
       style.BorderBottomLeftRadius(), style);
 }
 
@@ -746,7 +746,7 @@
     const SVGComputedStyle&,
     const LayoutObject*,
     bool allow_visited_style) const {
-  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
+  return ComputedStyleUtils::ValueForBorderRadiusCorner(
       style.BorderBottomRightRadius(), style);
 }
 const CSSValue* BorderBottomStyle::CSSValueFromComputedStyleInternal(
@@ -1082,7 +1082,7 @@
     const SVGComputedStyle&,
     const LayoutObject*,
     bool allow_visited_style) const {
-  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
+  return ComputedStyleUtils::ValueForBorderRadiusCorner(
       style.BorderTopLeftRadius(), style);
 }
 
@@ -1098,7 +1098,7 @@
     const SVGComputedStyle&,
     const LayoutObject*,
     bool allow_visited_style) const {
-  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
+  return ComputedStyleUtils::ValueForBorderRadiusCorner(
       style.BorderTopRightRadius(), style);
 }
 
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 2eef12a..b136374 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -574,57 +574,21 @@
 }
 
 static void AdjustStateForSubtreeVisibility(ComputedStyle& style,
-                                        Element* element) {
+                                            Element* element) {
   if (!element)
     return;
-
-  bool should_be_visible = style.SubtreeVisibility() == ESubtreeVisibility::kVisible;
   auto* context = element->GetDisplayLockContext();
-  if (!context) {
-    // Return early if there is no context and we should be visible.
-    if (should_be_visible)
-      return;
+  // The common case for most elements is that we don't have a context and have
+  // the default (visible) subtree-visibility value.
+  if (LIKELY(!context &&
+             style.SubtreeVisibility() == ESubtreeVisibility::kVisible)) {
+    return;
+  }
+
+  if (!context)
     context = &element->EnsureDisplayLockContext();
-  }
-
-  uint16_t activation_mask =
-      static_cast<uint16_t>(DisplayLockActivationReason::kAny);
-  switch (style.SubtreeVisibility()) {
-    case ESubtreeVisibility::kVisible:
-    case ESubtreeVisibility::kAuto:
-      break;
-    case ESubtreeVisibility::kHidden:
-      activation_mask = 0;
-      break;
-    case ESubtreeVisibility::kHiddenMatchable:
-      activation_mask &=
-          ~static_cast<uint16_t>(DisplayLockActivationReason::kViewport);
-      break;
-  }
-
-  // Propagate activatable style to context.
-  context->SetActivatable(activation_mask);
-
-  if (!should_be_visible) {
-    // Add containment to style if we're invisible.
-    auto contain = style.Contain() | kContainsStyle | kContainsLayout;
-    // If we haven't activated, then we should also contain size. This means
-    // that if we are rendering the element's subtree (i.e. it is either
-    // unlocked or activated), then we do not have size containment.
-    if (!context->IsActivated())
-      contain |= kContainsSize;
-    style.SetContain(contain);
-
-    // If we're unlocked and unactivated, then we should lock the context. Note
-    // that we do this here, since locking the element means we can skip styling
-    // the subtree.
-    if (!context->IsLocked() && !context->IsActivated())
-      context->StartAcquire();
-  } else {
-    context->ClearActivated();
-    if (context->IsLocked())
-      context->StartCommit();
-  }
+  context->SetRequestedState(style.SubtreeVisibility());
+  context->AdjustElementStyle(&style);
 }
 
 void StyleAdjuster::AdjustComputedStyle(StyleResolverState& state,
diff --git a/third_party/blink/renderer/core/display_lock/BUILD.gn b/third_party/blink/renderer/core/display_lock/BUILD.gn
index d7a7d40..b331bb2 100644
--- a/third_party/blink/renderer/core/display_lock/BUILD.gn
+++ b/third_party/blink/renderer/core/display_lock/BUILD.gn
@@ -6,20 +6,12 @@
 
 blink_core_sources("display_lock") {
   sources = [
-    "display_lock_budget.cc",
-    "display_lock_budget.h",
     "display_lock_context.cc",
     "display_lock_context.h",
     "display_lock_utilities.cc",
     "display_lock_utilities.h",
     "render_subtree_activation_event.cc",
     "render_subtree_activation_event.h",
-    "strict_yielding_display_lock_budget.cc",
-    "strict_yielding_display_lock_budget.h",
-    "unyielding_display_lock_budget.cc",
-    "unyielding_display_lock_budget.h",
-    "yielding_display_lock_budget.cc",
-    "yielding_display_lock_budget.h",
   ]
 
   public_deps = [
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget.cc
deleted file mode 100644
index 35a62be..0000000
--- a/third_party/blink/renderer/core/display_lock/display_lock_budget.cc
+++ /dev/null
@@ -1,50 +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.
-
-#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h"
-
-#include "base/time/default_tick_clock.h"
-#include "third_party/blink/renderer/core/display_lock/display_lock_context.h"
-
-namespace blink {
-
-DisplayLockBudget::DisplayLockBudget(DisplayLockContext* context)
-    : clock_(base::DefaultTickClock::GetInstance()), context_(context) {}
-
-bool DisplayLockBudget::MarkDirtyForPhaseIfNeeded(Phase phase) {
-  switch (phase) {
-    case Phase::kStyle:
-      return context_->MarkForStyleRecalcIfNeeded();
-    case Phase::kLayout:
-      return context_->MarkForLayoutIfNeeded();
-    case Phase::kPrePaint:
-      return context_->MarkAncestorsForPrePaintIfNeeded();
-  }
-  NOTREACHED();
-  return false;
-}
-
-bool DisplayLockBudget::IsElementDirtyForPhase(Phase phase) const {
-  switch (phase) {
-    case Phase::kStyle:
-      return context_->IsElementDirtyForStyleRecalc();
-    case Phase::kLayout:
-      return context_->IsElementDirtyForLayout();
-    case Phase::kPrePaint:
-      return context_->IsElementDirtyForPrePaint();
-  }
-  NOTREACHED();
-  return false;
-}
-
-void DisplayLockBudget::MarkPhaseAsDirty(Phase marking_phase) {
-  // Mark the next phase we're scheduled to run.
-  for (auto phase = static_cast<unsigned>(marking_phase);
-       phase <= static_cast<unsigned>(Phase::kLast); ++phase) {
-    if (MarkDirtyForPhaseIfNeeded(static_cast<Phase>(phase)))
-      break;
-  }
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget.h b/third_party/blink/renderer/core/display_lock/display_lock_budget.h
deleted file mode 100644
index aeea5fa3..0000000
--- a/third_party/blink/renderer/core/display_lock/display_lock_budget.h
+++ /dev/null
@@ -1,73 +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 THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_BUDGET_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_BUDGET_H_
-
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/platform/heap/member.h"
-
-namespace base {
-class TickClock;
-}
-
-namespace blink {
-
-class DisplayLockContext;
-struct LifecycleData;
-
-class CORE_EXPORT DisplayLockBudget {
- public:
-  enum class Phase : unsigned {
-    kStyle,
-    kLayout,
-    kPrePaint,
-    kFirst = kStyle,
-    kLast = kPrePaint
-  };
-
-  DisplayLockBudget(DisplayLockContext*);
-  virtual ~DisplayLockBudget() = default;
-
-  // Returns true if the given phase is allowed to proceed under the current
-  // budget.
-  virtual bool ShouldPerformPhase(Phase, const LifecycleData&) = 0;
-
-  // Called just before any calls to ShouldPerformPhase for a new lifecycle.
-  virtual void OnLifecycleChange(const LifecycleData&) = 0;
-
-  // Notifies the budget that the given phase was completed.
-  virtual void DidPerformPhase(Phase) = 0;
-
-  // Returns true if according to this budget, we still need a lifecycle update.
-  // For example, if a budget blocked a needed phase, then it this will return
-  // true indicating that another frame is needed.
-  virtual bool NeedsLifecycleUpdates() const = 0;
-
-  // The caller is the owner of the |clock|. The |clock| must outlive the
-  // DisplayLockBudget.
-  void SetTickClockForTesting(const base::TickClock* clock) { clock_ = clock; }
-
- protected:
-  // Returns true if there is likely to be work for the given phase.
-  bool IsElementDirtyForPhase(Phase) const;
-
-  void MarkPhaseAsDirty(Phase marking_phase);
-
-  // Marks the element and ancestor chain dirty for the given phase if it's
-  // needed. Returns true if the ancestors were marked dirty and false
-  // otherwise.
-  bool MarkDirtyForPhaseIfNeeded(Phase);
-
-  const base::TickClock* clock_;
-
- private:
-  // This is a backpointer to the context, which should always outlive this
-  // budget, so it's untraced.
-  UntracedMember<DisplayLockContext> context_;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_BUDGET_H_
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
deleted file mode 100644
index bc87d4ef..0000000
--- a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
+++ /dev/null
@@ -1,608 +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.
-
-#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/test/test_mock_time_task_runner.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_function.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
-#include "third_party/blink/renderer/core/display_lock/display_lock_context.h"
-#include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h"
-#include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h"
-#include "third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h"
-#include "third_party/blink/renderer/core/html_names.h"
-#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
-
-namespace blink {
-
-class DisplayLockBudgetTest : public RenderingTest,
-                              private ScopedCSSSubtreeVisibilityHiddenMatchableForTest {
- public:
-  DisplayLockBudgetTest() : ScopedCSSSubtreeVisibilityHiddenMatchableForTest(true) {}
-  void SetUp() override {
-    RenderingTest::SetUp();
-    test_task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
-  }
-
-  base::TimeDelta GetBudget(const YieldingDisplayLockBudget& budget,
-                            const LifecycleData& lifecycle_data) const {
-    return budget.GetCurrentBudget(lifecycle_data);
-  }
-
-  void ResetDeadlineForTesting(YieldingDisplayLockBudget& budget,
-                               const LifecycleData& lifecycle_data) {
-    budget.deadline_ =
-        base::TimeTicks::Now() + budget.GetCurrentBudget(lifecycle_data);
-  }
-
-  void ResetBudget(std::unique_ptr<DisplayLockBudget> budget,
-                   DisplayLockContext* context) {
-    ASSERT_TRUE(context->update_budget_);
-    context->update_budget_ = std::move(budget);
-  }
-
-  void LockElement(Element& element) {
-    element.setAttribute(html_names::kStyleAttr,
-                         "subtree-visibility: hidden");
-    UpdateAllLifecyclePhasesForTest();
-  }
-
-  void CommitElement(Element& element) {
-    element.setAttribute(html_names::kStyleAttr, "");
-    UpdateAllLifecyclePhasesForTest();
-  }
-
- protected:
-  scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner_;
-
- private:
-  base::Optional<RuntimeEnabledFeatures::Backup> features_backup_;
-};
-
-TEST_F(DisplayLockBudgetTest, UnyieldingBudget) {
-  // Note that we're not testing the display lock here, just the budget so we
-  // can do minimal work to ensure we have a context, ignoring containment and
-  // other requirements.
-  SetHtmlInnerHTML(R"HTML(
-    <style>
-      div {
-        contain: style layout;
-      }
-    </style>
-    <div id="container"></div>
-  )HTML");
-
-  auto* element = GetDocument().getElementById("container");
-  LockElement(*element);
-
-  ASSERT_TRUE(element->GetDisplayLockContext());
-  UnyieldingDisplayLockBudget budget(element->GetDisplayLockContext());
-
-  // When acquiring, we need to update the layout with the locked size, so we
-  // need an update.
-  EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-
-  LifecycleData lifecycle_data;
-
-  // Check everything twice since it shouldn't matter how many times we ask the
-  // unyielding budget, the results should always be the same.
-  for (int i = 0; i < 2; ++i) {
-    // Note that although we only dirtied layout, all phases "should" complete,
-    // since the budget should never be responsible for blocking phases for any
-    // reason other than we're out of budget.
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle);
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout);
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint);
-  }
-}
-
-TEST_F(DisplayLockBudgetTest, StrictYieldingBudget) {
-  // Note that we're not testing the display lock here, just the budget so we
-  // can do minimal work to ensure we have a context, ignoring containment and
-  // other requirements.
-  SetBodyInnerHTML(R"HTML(
-    <style>
-      div {
-        contain: style layout;
-      }
-    </style>
-    <div id="container"></div>
-  )HTML");
-
-  auto* element = GetDocument().getElementById("container");
-  LockElement(*element);
-
-  ASSERT_TRUE(element->GetDisplayLockContext());
-  StrictYieldingDisplayLockBudget budget(element->GetDisplayLockContext());
-
-  // When acquiring, we need to update the layout with the locked size, so we
-  // need an update.
-  EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-
-  LifecycleData lifecycle_data;
-
-  {
-    // Initially all of the phase checks should return true, since we don't know
-    // which phase the system wants to process next.
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    // Not doing anything should ensure that we schedule another animation by
-    // returning true here.
-    EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-  }
-  {
-    lifecycle_data.count++;
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    // Once we perform a phase, its check should remain true, but the rest
-    // will be false for this cycle.
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle);
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                           lifecycle_data));
-    EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                           lifecycle_data));
-    if (true)
-      return;
-
-    // We would need at least one more run to finish everything.
-    EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-  }
-  {
-    lifecycle_data.count++;
-    // Run the previous block again, now everything will always return true
-    // since the phase we complete here (style) has already been completed
-    // before, and we are open to complete a new phase.
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    // Since we already befored style before, no new phase has been processed
-    // and all phases are allowed to finish.
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle);
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    // We would need at least one more run to finish everything.
-    EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-  }
-  {
-    lifecycle_data.count++;
-    // On the next run, the checks for phases completed before should always
-    // return true, and as before since we haven't completed a new phase, the
-    // remainder of the phases should return true for now.
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    // This check is the same as in the previous block, but is here to verify
-    // that going through NeedsLifecycleUpdates() and then
-    // WillStartLifecycleUpdate() again doesn't change the fact that we should
-    // still perform all of the phases at this point.
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle);
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    // Let's say layout was clean and we jumped and did prepaint instead, now
-    // every phase before and including prepaint should be true, the rest are
-    // locked from completing.
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint);
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    // Note that since we processed everything, we no longer need lifecycle
-    // updates.
-    EXPECT_FALSE(budget.NeedsLifecycleUpdates());
-  }
-  {
-    // Do one more run to ensure everything is still returning true.
-    lifecycle_data.count++;
-    // On the last run, we'll complete all phases. Since there is only one
-    // remaining phase we haven't done, all of the checks should always return
-    // true (it's either an old phase or a first uncompleted phase).
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle);
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout);
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint);
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-
-    // Since we completed everything, we should now be returning false here (no
-    // more updates needed).
-    EXPECT_FALSE(budget.NeedsLifecycleUpdates());
-  }
-}
-
-TEST_F(DisplayLockBudgetTest,
-       StrictYieldingBudgetOnlyNeedsUpdatesForDirtyPhases) {
-  // Note that we're not testing the display lock here, just the budget so we
-  // can do minimal work to ensure we have a context, ignoring containment and
-  // other requirements.
-  SetHtmlInnerHTML(R"HTML(
-    <style>
-      div {
-        contain: style layout;
-      }
-    </style>
-    <div id="container"></div>
-  )HTML");
-
-  auto* element = GetDocument().getElementById("container");
-  LockElement(*element);
-
-  ASSERT_TRUE(element->GetDisplayLockContext());
-  StrictYieldingDisplayLockBudget budget(element->GetDisplayLockContext());
-
-  // When acquiring, we need to update the layout with the locked size, so we
-  // need an update.
-  EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-
-  LifecycleData lifecycle_data;
-  budget.OnLifecycleChange(lifecycle_data);
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                        lifecycle_data));
-  budget.DidPerformPhase(DisplayLockBudget::Phase::kLayout);
-  EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-
-  lifecycle_data.count++;
-  budget.OnLifecycleChange(lifecycle_data);
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                        lifecycle_data));
-  budget.DidPerformPhase(DisplayLockBudget::Phase::kPrePaint);
-
-  // Note that since the layout was indicated as done (from the budget
-  // perspective), it will no longer need updates even though the true layout is
-  // dirty. This is because it will no longer block layout from synchronously
-  // completing whenever necessary.
-  EXPECT_FALSE(budget.NeedsLifecycleUpdates());
-}
-
-TEST_F(DisplayLockBudgetTest, YieldingBudget) {
-  // Note that we're not testing the display lock here, just the budget so we
-  // can do minimal work to ensure we have a context, ignoring containment and
-  // other requirements.
-  SetBodyInnerHTML(R"HTML(
-    <style>
-      div {
-        contain: style layout;
-      }
-    </style>
-    <div id="container"></div>
-  )HTML");
-
-  auto* element = GetDocument().getElementById("container");
-  LockElement(*element);
-
-  ASSERT_TRUE(element->GetDisplayLockContext());
-  YieldingDisplayLockBudget budget(element->GetDisplayLockContext());
-  budget.SetTickClockForTesting(test_task_runner_->GetMockTickClock());
-
-  // When acquiring, we need to update the layout with the locked size, so we
-  // need an update.
-  EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-  LifecycleData lifecycle_data;
-  budget.OnLifecycleChange(lifecycle_data);
-
-  // Initially all of the phase checks should return true, since we don't know
-  // which phase the system wants to process next.
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                        lifecycle_data));
-
-  // Not doing anything should ensure that we schedule another animation by
-  // returning true here.
-  EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-
-  // Advancing the clock a bit will make us still want to the phases.
-  test_task_runner_->FastForwardBy(GetBudget(budget, lifecycle_data) / 2);
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                        lifecycle_data));
-
-  // However, once we're out of budget, we will only do the next phase.
-  test_task_runner_->FastForwardBy(GetBudget(budget, lifecycle_data));
-
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                        lifecycle_data));
-  EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                         lifecycle_data));
-  EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                         lifecycle_data));
-
-  // Starting a new lifecycle will reset the budget.
-  lifecycle_data.count++;
-  lifecycle_data.start_time = test_task_runner_->NowTicks();
-  budget.OnLifecycleChange(lifecycle_data);
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                        lifecycle_data));
-
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                        lifecycle_data));
-
-  // Performing a phase still keeps the rest of the phases available for work
-  // since we haven't advanced the clock.
-  budget.DidPerformPhase(DisplayLockBudget::Phase::kStyle);
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                        lifecycle_data));
-
-  // Now that we're out of budget, phases performed previously should remain
-  // true.
-  test_task_runner_->FastForwardBy(GetBudget(budget, lifecycle_data) * 2);
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                        lifecycle_data));
-  EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                         lifecycle_data));
-  EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                         lifecycle_data));
-
-  // Sanity check here: the element still needs layout.
-  EXPECT_TRUE(budget.NeedsLifecycleUpdates());
-
-  // Resetting the budget, and advancing again should yield the same results as
-  // before, except that we will process at least one more phase.
-  lifecycle_data.count++;
-  lifecycle_data.start_time = test_task_runner_->NowTicks();
-  budget.OnLifecycleChange(lifecycle_data);
-
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                        lifecycle_data));
-  test_task_runner_->FastForwardBy(GetBudget(budget, lifecycle_data) * 2);
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                        lifecycle_data));
-  EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                        lifecycle_data));
-  EXPECT_FALSE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                         lifecycle_data));
-
-  // Eventually the budget becomes essentially infinite.
-  lifecycle_data.count += 60;
-  budget.OnLifecycleChange(lifecycle_data);
-
-  EXPECT_GT(GetBudget(budget, lifecycle_data),
-            base::TimeDelta::FromMilliseconds(1e6));
-  for (int i = 0; i < 60; ++i) {
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                          lifecycle_data));
-    EXPECT_TRUE(budget.ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                          lifecycle_data));
-    test_task_runner_->FastForwardBy(base::TimeDelta::FromMillisecondsD(10000));
-  }
-}
-
-TEST_F(DisplayLockBudgetTest, YieldingBudgetMarksNextPhase) {
-  // Note that we're not testing the display lock here, just the budget so we
-  // can do minimal work to ensure we have a context, ignoring containment and
-  // other requirements.
-  SetHtmlInnerHTML(R"HTML(
-    <style>
-      #container {
-        contain: style layout;
-      }
-    </style>
-    <div id="parent"><div id="container"><div id="child"></div></div></div>
-  )HTML");
-
-  auto* element = GetDocument().getElementById("container");
-  LockElement(*element);
-
-  ASSERT_TRUE(element->GetDisplayLockContext());
-  ASSERT_TRUE(element->GetDisplayLockContext()->IsLocked());
-
-  auto budget_owned = base::WrapUnique(
-      new YieldingDisplayLockBudget(element->GetDisplayLockContext()));
-  auto* budget = budget_owned.get();
-  budget->SetTickClockForTesting(test_task_runner_->GetMockTickClock());
-  {
-    auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame());
-    ScriptState::Scope scope(script_state);
-    element->GetDisplayLockContext()->UpdateRendering(script_state);
-    ResetBudget(std::move(budget_owned), element->GetDisplayLockContext());
-  }
-
-  // When acquiring, we need to update the layout with the locked size, so we
-  // need an update.
-  EXPECT_TRUE(budget->NeedsLifecycleUpdates());
-
-  // Dirtying the element will cause us to do updates.
-  GetDocument().getElementById("child")->setInnerHTML("a");
-
-  auto* parent = GetDocument().getElementById("parent");
-  EXPECT_TRUE(budget->NeedsLifecycleUpdates());
-
-  LifecycleData lifecycle_data;
-  budget->OnLifecycleChange(lifecycle_data);
-
-  GetDocument().View()->SetInLifecycleUpdateForTest(true);
-  GetDocument().View()->SetLifecycleDataForTesting(lifecycle_data);
-
-  // Initially all of the phase checks should return true, since we don't know
-  // which phase the system wants to process next.
-  EXPECT_TRUE(
-      budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                 GetDocument().View()->CurrentLifecycleData()));
-  EXPECT_TRUE(
-      budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                 GetDocument().View()->CurrentLifecycleData()));
-  EXPECT_TRUE(
-      budget->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                 GetDocument().View()->CurrentLifecycleData()));
-
-  EXPECT_TRUE(parent->NeedsStyleRecalc() || parent->ChildNeedsStyleRecalc());
-  EXPECT_TRUE(element->NeedsStyleRecalc() || element->ChildNeedsStyleRecalc());
-
-  test_task_runner_->FastForwardBy(
-      GetBudget(*budget, GetDocument().View()->CurrentLifecycleData()) * 2);
-  EXPECT_TRUE(
-      budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                 GetDocument().View()->CurrentLifecycleData()));
-  EXPECT_FALSE(
-      budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                 GetDocument().View()->CurrentLifecycleData()));
-
-  GetDocument().UpdateStyleAndLayoutTree();
-  EXPECT_FALSE(
-      budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                 GetDocument().View()->CurrentLifecycleData()));
-
-  EXPECT_FALSE(parent->NeedsStyleRecalc() || parent->ChildNeedsStyleRecalc());
-  EXPECT_FALSE(element->NeedsStyleRecalc() || element->ChildNeedsStyleRecalc());
-
-  EXPECT_TRUE(parent->GetLayoutObject()->NeedsLayout());
-  EXPECT_TRUE(element->GetLayoutObject()->NeedsLayout());
-
-  ResetDeadlineForTesting(*budget,
-                          GetDocument().View()->CurrentLifecycleData());
-  EXPECT_TRUE(
-      budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                 GetDocument().View()->CurrentLifecycleData()));
-
-  GetDocument().View()->SetInLifecycleUpdateForTest(false);
-}
-
-TEST_F(DisplayLockBudgetTest, UpdateHappensInLifecycleOnly) {
-  // Note that we're not testing the display lock here, just the budget so we
-  // can do minimal work to ensure we have a context, ignoring containment and
-  // other requirements.
-  SetHtmlInnerHTML(R"HTML(
-    <style>
-      #container {
-        contain: style layout;
-      }
-    </style>
-    <div id="parent"><div id="container"><div id="child"></div></div></div>
-  )HTML");
-
-  auto* element = GetDocument().getElementById("container");
-  LockElement(*element);
-
-  ASSERT_TRUE(element->GetDisplayLockContext());
-  ASSERT_TRUE(element->GetDisplayLockContext()->IsLocked());
-
-  auto budget_owned = base::WrapUnique(
-      new UnyieldingDisplayLockBudget(element->GetDisplayLockContext()));
-  auto* budget = budget_owned.get();
-  {
-    auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame());
-    ScriptState::Scope scope(script_state);
-    element->GetDisplayLockContext()->UpdateRendering(script_state);
-    ResetBudget(std::move(budget_owned), element->GetDisplayLockContext());
-  }
-
-  // When acquiring, we need to update the layout with the locked size, so we
-  // need an update.
-  EXPECT_TRUE(budget->NeedsLifecycleUpdates());
-
-  LifecycleData lifecycle_data;
-  budget->OnLifecycleChange(lifecycle_data);
-
-  auto* context = element->GetDisplayLockContext();
-  EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kStyle,
-                                         lifecycle_data));
-  EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kLayout,
-                                         lifecycle_data));
-  EXPECT_TRUE(budget->ShouldPerformPhase(DisplayLockBudget::Phase::kPrePaint,
-                                         lifecycle_data));
-
-  // Since we're not in a lifecycle, the budget itself should not want to do any
-  // phases, even though the budget allows it.
-  EXPECT_FALSE(context->ShouldStyle(DisplayLockLifecycleTarget::kChildren));
-  EXPECT_FALSE(context->ShouldLayout(DisplayLockLifecycleTarget::kChildren));
-  EXPECT_FALSE(context->ShouldPrePaint(DisplayLockLifecycleTarget::kChildren));
-
-  GetDocument().GetFrame()->View()->SetInLifecycleUpdateForTest(true);
-
-  EXPECT_TRUE(context->ShouldStyle(DisplayLockLifecycleTarget::kChildren));
-  EXPECT_TRUE(context->ShouldLayout(DisplayLockLifecycleTarget::kChildren));
-  EXPECT_TRUE(context->ShouldPrePaint(DisplayLockLifecycleTarget::kChildren));
-
-  GetDocument().GetFrame()->View()->SetInLifecycleUpdateForTest(false);
-
-  EXPECT_FALSE(context->ShouldStyle(DisplayLockLifecycleTarget::kChildren));
-  EXPECT_FALSE(context->ShouldLayout(DisplayLockLifecycleTarget::kChildren));
-  EXPECT_FALSE(context->ShouldPrePaint(DisplayLockLifecycleTarget::kChildren));
-
-  // Ensure to flush any tasks scheduled by context calls.
-  test::RunPendingTasks();
-}
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
index 990f321..a0a27a2b 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -13,9 +13,6 @@
 #include "third_party/blink/renderer/core/css/style_recalc.h"
 #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h"
 #include "third_party/blink/renderer/core/display_lock/render_subtree_activation_event.h"
-#include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h"
-#include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h"
-#include "third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/dom/element.h"
@@ -35,13 +32,10 @@
 
 namespace {
 namespace rejection_names {
-const char* kExecutionContextDestroyed = "Execution context destroyed.";
 const char* kContainmentNotSatisfied =
     "Containment requirement is not satisfied.";
 const char* kUnsupportedDisplay =
     "Element has unsupported display type (display: contents).";
-const char* kElementIsDisconnected = "Element is disconnected.";
-const char* kElementIsNested = "Element is nested under a locked element.";
 }  // namespace rejection_names
 
 void RecordActivationReason(DisplayLockActivationReason reason) {
@@ -87,62 +81,51 @@
   UMA_HISTOGRAM_ENUMERATION("Blink.Render.DisplayLockActivationReason",
                             ordered_reason, number_of_reasons);
 }
-
-// Helper function that returns an immediately rejected promise.
-ScriptPromise GetRejectedPromise(ScriptState* script_state,
-                                 const char* rejection_reason) {
-  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
-  auto promise = resolver->Promise();
-  resolver->Reject(MakeGarbageCollected<DOMException>(
-      DOMExceptionCode::kNotAllowedError, rejection_reason));
-  return promise;
-}
-
-// Helper function that returns an immediately resolved promise.
-ScriptPromise GetResolvedPromise(ScriptState* script_state) {
-  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
-  auto promise = resolver->Promise();
-  resolver->Resolve();
-  return promise;
-}
-
 }  // namespace
 
-DisplayLockContext::DisplayLockContext(Element* element,
-                                       ExecutionContext* context)
-    : ExecutionContextLifecycleObserver(context),
-      element_(element),
-      document_(&element_->GetDocument()),
-      state_(this) {
+DisplayLockContext::DisplayLockContext(Element* element)
+    : element_(element), document_(&element_->GetDocument()) {
   document_->AddDisplayLockContext(this);
 }
 
-DisplayLockContext::~DisplayLockContext() {
-  DCHECK_EQ(state_, kUnlocked);
+void DisplayLockContext::SetRequestedState(ESubtreeVisibility state) {
+  if (state_ == state)
+    return;
+  state_ = state;
+  switch (state_) {
+    case ESubtreeVisibility::kVisible:
+      RequestUnlock();
+      break;
+    case ESubtreeVisibility::kAuto:
+      RequestLock(static_cast<uint16_t>(DisplayLockActivationReason::kAny));
+      break;
+    case ESubtreeVisibility::kHidden:
+      RequestLock(0u);
+      break;
+    case ESubtreeVisibility::kHiddenMatchable:
+      RequestLock(
+          static_cast<uint16_t>(DisplayLockActivationReason::kAny) &
+          ~static_cast<uint16_t>(DisplayLockActivationReason::kViewport));
+      break;
+  }
+}
+
+void DisplayLockContext::AdjustElementStyle(ComputedStyle* style) const {
+  if (state_ == ESubtreeVisibility::kVisible)
+    return;
+  // If not visible, element gains style and layout containment. If skipped, it
+  // also gains size containment.
+  // https://wicg.github.io/display-locking/#subtree-visibility
+  auto contain = style->Contain() | kContainsStyle | kContainsLayout;
+  if (IsLocked())
+    contain |= kContainsSize;
+  style->SetContain(contain);
 }
 
 void DisplayLockContext::Trace(Visitor* visitor) {
-  visitor->Trace(update_resolver_);
   visitor->Trace(element_);
   visitor->Trace(document_);
   visitor->Trace(whitespace_reattach_set_);
-  ExecutionContextLifecycleObserver::Trace(visitor);
-}
-
-void DisplayLockContext::Dispose() {
-  // Note that if we have any resolvers at dispose time, then it's too late to
-  // reject the promise, since we are not allowed to create new strong
-  // references to objects already set for destruction (and rejecting would do
-  // this since the rejection has to be deferred). We need to detach instead.
-  // TODO(vmpstr): See if there is another earlier time we can detect that we're
-  // going to be disposed.
-  FinishUpdateResolver(kDetach);
-  state_ = kUnlocked;
-}
-
-void DisplayLockContext::ContextDestroyed() {
-  FinishUpdateResolver(kReject, rejection_names::kExecutionContextDestroyed);
-  state_ = kUnlocked;
 }
 
 void DisplayLockContext::UpdateActivationObservationIfNeeded() {
@@ -160,7 +143,7 @@
   // 2. We're activated (in the CSS version), which means that we need to know
   //    when we stop intersecting the viewport so that we can re-lock.
   bool should_observe =
-      (IsLocked() || IsActivated()) &&
+      lock_requested_ &&
       IsActivatable(DisplayLockActivationReason::kViewportIntersection) &&
       ConnectedToView();
   if (should_observe && !is_observed_) {
@@ -176,7 +159,7 @@
 }
 
 bool DisplayLockContext::NeedsLifecycleNotifications() const {
-  return HasResolver() || needs_intersection_lock_check_;
+  return needs_intersection_lock_check_;
 }
 
 void DisplayLockContext::UpdateLifecycleNotificationRegistration() {
@@ -197,36 +180,52 @@
   }
 }
 
-void DisplayLockContext::SetActivatable(uint16_t activatable_mask) {
-  if (IsLocked()) {
-    // If we're locked, the activatable mask might change the activation
-    // blocking lock count. If we're not locked, the activation blocking lock
-    // count will be updated when we changed the state.
-    // Note that we record this only if we're blocking all activation. That is,
-    // the lock is considered activatable if any bit is set.
-    state_.UpdateActivationBlockingCount(activatable_mask_, activatable_mask);
+void DisplayLockContext::UpdateActivationBlockingCount(bool was_activatable,
+                                                       bool is_activatable) {
+  DCHECK(document_);
+  if (was_activatable != is_activatable) {
+    if (was_activatable)
+      document_->IncrementDisplayLockBlockingAllActivation();
+    else
+      document_->DecrementDisplayLockBlockingAllActivation();
   }
+}
+
+void DisplayLockContext::SetActivatable(uint16_t activatable_mask) {
+  if (activatable_mask == activatable_mask_)
+    return;
+  // If we're locked, the activatable mask might change the activation
+  // blocking lock count. If we're not locked, the activation blocking lock
+  // count will be updated when we lock.
+  // Note that we record this only if we're blocking all activation. That is,
+  // the lock is considered activatable if any bit is set.
+  if (IsLocked())
+    UpdateActivationBlockingCount(activatable_mask_, activatable_mask);
+
   activatable_mask_ = activatable_mask;
   UpdateActivationObservationIfNeeded();
 
-  // If we're no longer activatable, make sure we clear any existing activation.
-  // TODO(vmpstr): Figure out if we should clear activation on any activation
-  // changes not just "something" -> "nothing".
-  if (!IsActivatable(DisplayLockActivationReason::kAny))
-    ClearActivated();
+  ClearActivated();
 }
 
 void DisplayLockContext::StartAcquire() {
+  DCHECK(lock_requested_);
   DCHECK(!IsLocked());
-  update_budget_.reset();
-  state_ = kLocked;
+
+  is_locked_ = true;
+  document_->AddLockedDisplayLock();
+  if (!activatable_mask_)
+    document_->IncrementDisplayLockBlockingAllActivation();
+  UpdateActivationObservationIfNeeded();
 
   needs_intersection_lock_check_ = false;
   UpdateLifecycleNotificationRegistration();
 
-  // We're no longer activated, so if the signal didn't run yet, we should
-  // cancel it.
-  weak_factory_.InvalidateWeakPtrs();
+  if (RuntimeEnabledFeatures::CSSSubtreeVisibilityActivationEventEnabled()) {
+    // We're no longer activated, so if the signal didn't run yet, we should
+    // cancel it.
+    weak_factory_.InvalidateWeakPtrs();
+  }
 
   // If we're already connected then we need to ensure that we update our style
   // to check for containment later, layout size based on the options, and
@@ -251,8 +250,8 @@
   // lifecycle update, this will be a no-op.
   ScheduleAnimation();
 
-  // We need to notify the AX cache (if it exists) to update the  childrens
-  // of |element_| in the AX cache.
+  // We need to notify the AX cache (if it exists) to update |element_|'s
+  // children in the AX cache.
   if (AXObjectCache* cache = element_->GetDocument().ExistingAXObjectCache())
     cache->ChildrenChanged(element_);
 
@@ -266,6 +265,7 @@
       layout_invalidation_reason::kDisplayLock);
 
   is_horizontal_writing_mode_ = layout_object->IsHorizontalWritingMode();
+
   // GraphicsLayer collection would normally skip layers if paint is blocked
   // by display-locking (see: CollectDrawableLayersForLayerListRecursively
   // in LocalFrameView). However, if we don't trigger this collection, then
@@ -277,116 +277,14 @@
   MarkPaintLayerNeedsRepaint();
 }
 
-ScriptPromise DisplayLockContext::UpdateRendering(ScriptState* script_state) {
-  // Immediately resolve if we're unlocked or disconnected.
-  if (state_ == kUnlocked || !ConnectedToView())
-    return GetResolvedPromise(script_state);
-
-  // If we have a resolver, then we're at least updating already, just return
-  // the same promise.
-  if (update_resolver_) {
-    DCHECK(state_ == kUpdating || state_ == kCommitting) << state_;
-    return update_resolver_->Promise();
-  }
-
-  if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*element_)) {
-    return GetRejectedPromise(script_state, rejection_names::kElementIsNested);
-  }
-
-  MakeResolver(script_state, &update_resolver_);
-  StartUpdateIfNeeded();
-  return update_resolver_->Promise();
-}
-
-bool DisplayLockContext::CleanupAndRejectCommitIfNotConnected() {
-  // If we're not connected, then the process of committing is the same as just
-  // unlocking the element. Early out if this conditions *doesn't* hold.
-  if (ConnectedToView())
-    return false;
-
-  state_ = kUnlocked;
-  update_budget_.reset();
-  // Note that we reject the update, but resolve the commit.
-  FinishUpdateResolver(kReject, rejection_names::kElementIsDisconnected);
-  return true;
-}
-
-void DisplayLockContext::MakeResolver(ScriptState* script_state,
-                                      Member<ScriptPromiseResolver>* resolver) {
-  DCHECK(ConnectedToView());
-  *resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
-  UpdateLifecycleNotificationRegistration();
-}
-
-bool DisplayLockContext::HasResolver() const {
-  return update_resolver_;
-}
-
-void DisplayLockContext::FinishUpdateResolver(ResolverState state,
-                                              const char* rejection_reason) {
-  FinishResolver(&update_resolver_, state, rejection_reason);
-}
-
-void DisplayLockContext::FinishResolver(Member<ScriptPromiseResolver>* resolver,
-                                        ResolverState state,
-                                        const char* rejection_reason) {
-  if (!*resolver)
-    return;
-  switch (state) {
-    case kResolve:
-      // In order to avoid script doing work as a part of the lifecycle update,
-      // we delay the resolution to be in a task.
-      GetExecutionContext()
-          ->GetTaskRunner(TaskType::kMiscPlatformAPI)
-          ->PostTask(FROM_HERE, WTF::Bind(
-                                    +[](ScriptPromiseResolver* resolver) {
-                                      resolver->Resolve();
-                                    },
-                                    WrapPersistent(resolver->Get())));
-      break;
-    case kReject:
-      DCHECK(rejection_reason);
-      (*resolver)->Reject(MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kNotAllowedError, rejection_reason));
-      break;
-    case kDetach:
-      (*resolver)->Detach();
-      break;
-  }
-  *resolver = nullptr;
-  UpdateLifecycleNotificationRegistration();
-}
-
-bool DisplayLockContext::ShouldPerformUpdatePhase(
-    DisplayLockBudget::Phase phase) const {
-  DCHECK(document_);
-  if (state_ != kUpdating)
-    return false;
-  auto* view = document_->View();
-  return view && view->InLifecycleUpdate() &&
-         update_budget_->ShouldPerformPhase(phase,
-                                            view->CurrentLifecycleData());
-}
-
 bool DisplayLockContext::ShouldStyle(DisplayLockLifecycleTarget target) const {
-  return target == DisplayLockLifecycleTarget::kSelf || update_forced_ ||
-         state_ > kUpdating ||
+  return !is_locked_ || target == DisplayLockLifecycleTarget::kSelf ||
+         update_forced_ ||
          (document_->ActivatableDisplayLocksForced() &&
-          IsActivatable(DisplayLockActivationReason::kAny)) ||
-         ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kStyle);
+          IsActivatable(DisplayLockActivationReason::kAny));
 }
 
 void DisplayLockContext::DidStyle(DisplayLockLifecycleTarget target) {
-  if (state_ == kUnlocked) {
-    // If we're committing without finishing the acquire() first, it's possible
-    // for the state to be kUnlocked instead of kCommitting. We should still
-    // mark child reattachment & whitespace reattachment in that case.
-    MarkElementsForWhitespaceReattachment();
-    if (element_->ChildNeedsReattachLayoutTree())
-      element_->MarkAncestorsWithChildNeedsReattachLayoutTree();
-    return;
-  }
-
   if (target == DisplayLockLifecycleTarget::kSelf) {
     if (ForceUnlockIfNeeded())
       return;
@@ -399,29 +297,17 @@
     return;
   }
 
-  bool update_forced =
-      update_forced_ || (document_->ActivatableDisplayLocksForced() &&
-                         IsActivatable(DisplayLockActivationReason::kAny));
-  if (state_ != kCommitting && state_ != kUpdating && !update_forced)
-    return;
-
   if (element_->ChildNeedsReattachLayoutTree())
     element_->MarkAncestorsWithChildNeedsReattachLayoutTree();
-
   blocked_style_traversal_type_ = kStyleUpdateNotRequired;
-
   MarkElementsForWhitespaceReattachment();
-
-  if (state_ == kUpdating)
-    update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kStyle);
 }
 
 bool DisplayLockContext::ShouldLayout(DisplayLockLifecycleTarget target) const {
-  return target == DisplayLockLifecycleTarget::kSelf || update_forced_ ||
-         state_ > kUpdating ||
+  return !is_locked_ || target == DisplayLockLifecycleTarget::kSelf ||
+         update_forced_ ||
          (document_->ActivatableDisplayLocksForced() &&
-          IsActivatable(DisplayLockActivationReason::kAny)) ||
-         ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kLayout);
+          IsActivatable(DisplayLockActivationReason::kAny));
 }
 
 void DisplayLockContext::DidLayout(DisplayLockLifecycleTarget target) {
@@ -430,31 +316,16 @@
 
   // Since we did layout on children already, we'll clear this.
   child_layout_was_blocked_ = false;
-  if (state_ == kUpdating)
-    update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kLayout);
 }
 
 bool DisplayLockContext::ShouldPrePaint(
     DisplayLockLifecycleTarget target) const {
-  return target == DisplayLockLifecycleTarget::kSelf || update_forced_ ||
-         state_ > kUpdating ||
-         ShouldPerformUpdatePhase(DisplayLockBudget::Phase::kPrePaint);
+  return !is_locked_ || target == DisplayLockLifecycleTarget::kSelf ||
+         update_forced_;
 }
 
 void DisplayLockContext::DidPrePaint(DisplayLockLifecycleTarget target) {
-  if (target == DisplayLockLifecycleTarget::kSelf)
-    return;
-
-  if (state_ == kUpdating)
-    update_budget_->DidPerformPhase(DisplayLockBudget::Phase::kPrePaint);
-
-#if DCHECK_IS_ON()
-  if (state_ == kUpdating || state_ == kCommitting) {
-    // Since we should be under containment, we should have a layer. If we
-    // don't, then paint might not happen and we'll never resolve.
-    DCHECK(element_->GetLayoutObject()->HasLayer());
-  }
-#endif
+  // This is here for symmetry, but could be removed if necessary.
 }
 
 bool DisplayLockContext::ShouldPaint(DisplayLockLifecycleTarget target) const {
@@ -462,8 +333,7 @@
   // check |update_forced_| here. In other words, although |update_forced_|
   // could be true here, we still should not paint. This also holds for
   // kUpdating state, since updates should not paint.
-  return target == DisplayLockLifecycleTarget::kSelf || state_ == kCommitting ||
-         state_ == kUnlocked;
+  return !is_locked_ || target == DisplayLockLifecycleTarget::kSelf;
 }
 
 void DisplayLockContext::DidPaint(DisplayLockLifecycleTarget) {
@@ -502,7 +372,7 @@
   if (reason_for_metrics == DisplayLockActivationReason::kFindInPage)
     document_->MarkHasFindInPageSubtreeVisibilityActiveMatch();
 
-  css_is_activated_ = true;
+  is_activated_ = true;
   // Since size containment depends on the activatability state, we should
   // invalidate the style for this element, so that the style adjuster can
   // properly remove the containment.
@@ -512,11 +382,11 @@
 }
 
 bool DisplayLockContext::IsActivated() const {
-  return css_is_activated_;
+  return is_activated_;
 }
 
 void DisplayLockContext::ClearActivated() {
-  css_is_activated_ = false;
+  is_activated_ = false;
   // If we are no longer activated, then we're either committing or acquiring a
   // lock. In either case, we don't need to rely on lifecycle observations to
   // become hidden.
@@ -570,22 +440,42 @@
   }
 }
 
+bool DisplayLockContext::RequestLock(uint16_t activation_mask) {
+  SetActivatable(activation_mask);
+
+  if (IsLocked()) {
+    DCHECK(lock_requested_);
+    return true;
+  }
+  lock_requested_ = true;
+
+  if (IsActivated())
+    return false;
+
+  StartAcquire();
+  return true;
+}
+
+void DisplayLockContext::RequestUnlock() {
+  lock_requested_ = false;
+  ClearActivated();
+  if (IsLocked())
+    StartCommit();
+}
+
 bool DisplayLockContext::ShouldCommitForActivation(
     DisplayLockActivationReason reason) const {
   return IsActivatable(reason) && IsLocked();
 }
 
 void DisplayLockContext::DidAttachLayoutTree() {
-  if (state_ >= kUnlocked)
-    return;
-
   if (auto* layout_object = element_->GetLayoutObject())
     is_horizontal_writing_mode_ = layout_object->IsHorizontalWritingMode();
 }
 
 DisplayLockContext::ScopedForcedUpdate
 DisplayLockContext::GetScopedForcedUpdate() {
-  if (state_ >= kCommitting)
+  if (!is_locked_)
     return ScopedForcedUpdate(nullptr);
 
   DCHECK(!update_forced_);
@@ -614,25 +504,23 @@
 
 void DisplayLockContext::StartCommit() {
   DCHECK(IsLocked());
-  if (CleanupAndRejectCommitIfNotConnected())
+  if (!ConnectedToView()) {
+    is_locked_ = false;
+    UpdateActivationObservationIfNeeded();
     return;
+  }
 
-  if (state_ != kUpdating)
-    ScheduleAnimation();
-
-  // We might already be unlocked due to above, but we should still mark
-  // ancestor chains for updates below.
-  if (state_ < kCommitting)
-    state_ = kCommitting;
-
-  update_budget_.reset();
+  ScheduleAnimation();
+  is_locked_ = false;
+  document_->RemoveLockedDisplayLock();
+  if (!activatable_mask_)
+    document_->DecrementDisplayLockBlockingAllActivation();
+  UpdateActivationObservationIfNeeded();
 
   // We skip updating the style dirtiness if we're within style recalc. This is
   // instead handled by a call to AdjustStyleRecalcChangeForChildren().
-  if (!document_->InStyleRecalc()) {
-    // We're committing without a budget, so ensure we can reach style.
+  if (!document_->InStyleRecalc())
     MarkForStyleRecalcIfNeeded();
-  }
 
   // We also need to notify the AX cache (if it exists) to update the childrens
   // of |element_| in the AX cache.
@@ -654,35 +542,6 @@
       layout_invalidation_reason::kDisplayLock);
 }
 
-void DisplayLockContext::StartUpdateIfNeeded() {
-  // We should not be calling this if we're unlocked.
-  DCHECK_NE(state_, kUnlocked);
-  // Any state other than kLocked means that we are already in the process of
-  // updating/committing, so we can piggy back on that process without kicking
-  // off any new updates.
-  if (state_ != kLocked)
-    return;
-
-  // We don't need to mark anything dirty since the budget will take care of
-  // that for us.
-  update_budget_ = CreateNewBudget();
-  state_ = kUpdating;
-  ScheduleAnimation();
-}
-
-std::unique_ptr<DisplayLockBudget> DisplayLockContext::CreateNewBudget() {
-  switch (BudgetType::kDefault) {
-    case BudgetType::kDoNotYield:
-      return base::WrapUnique(new UnyieldingDisplayLockBudget(this));
-    case BudgetType::kStrictYieldBetweenLifecyclePhases:
-      return base::WrapUnique(new StrictYieldingDisplayLockBudget(this));
-    case BudgetType::kYieldBetweenLifecyclePhases:
-      return base::WrapUnique(new YieldingDisplayLockBudget(this));
-  }
-  NOTREACHED();
-  return nullptr;
-}
-
 void DisplayLockContext::AddToWhitespaceReattachSet(Element& element) {
   whitespace_reattach_set_.insert(&element);
 }
@@ -898,8 +757,11 @@
   if (is_registered_for_lifecycle_notifications_) {
     if (old_document.View())
       old_document.View()->UnregisterFromLifecycleNotifications(this);
+
     if (document_->View())
       document_->View()->RegisterForLifecycleNotifications(this);
+    else
+      is_registered_for_lifecycle_notifications_ = false;
   }
 
   if (IsLocked()) {
@@ -914,11 +776,6 @@
 
 void DisplayLockContext::WillStartLifecycleUpdate(const LocalFrameView& view) {
   DCHECK(NeedsLifecycleNotifications());
-  // If we have an update budget, then forward the call to it, so that it can
-  // prepare for the lifecycle by propagating the next phase's dirty bits.
-  if (update_budget_)
-    update_budget_->OnLifecycleChange(view.CurrentLifecycleData());
-
   // We might have delayed processing intersection observation update (signal
   // that we were not intersecting) because this context was nested in another
   // locked context. At the start of the lifecycle, we should check whether
@@ -934,43 +791,6 @@
 }
 
 void DisplayLockContext::DidFinishLifecycleUpdate(const LocalFrameView& view) {
-  DCHECK(NeedsLifecycleNotifications());
-  if (state_ == kCommitting) {
-    FinishUpdateResolver(kResolve);
-    state_ = kUnlocked;
-    return;
-  }
-
-  if (state_ != kUpdating)
-    return;
-
-  // If we became disconnected for any reason, then we should reject the
-  // update promise and go back to the locked state.
-  if (!ConnectedToView()) {
-    FinishUpdateResolver(kReject, rejection_names::kElementIsDisconnected);
-    update_budget_.reset();
-
-    if (state_ == kCommitting) {
-      state_ = kUnlocked;
-    } else {
-      state_ = kLocked;
-    }
-    return;
-  }
-
-  if (update_budget_->NeedsLifecycleUpdates()) {
-    // Note that we post a task to schedule an animation, since rAF requests can
-    // be ignored if they happen from within a lifecycle update.
-    GetExecutionContext()
-        ->GetTaskRunner(TaskType::kMiscPlatformAPI)
-        ->PostTask(FROM_HERE, WTF::Bind(&DisplayLockContext::ScheduleAnimation,
-                                        WrapWeakPersistent(this)));
-    return;
-  }
-
-  FinishUpdateResolver(kResolve);
-  update_budget_.reset();
-  state_ = kLocked;
 }
 
 void DisplayLockContext::NotifyWillDisconnect() {
@@ -995,16 +815,8 @@
 
 void DisplayLockContext::ScheduleAnimation() {
   DCHECK(element_);
-  // We could have posted a task to run ScheduleAnimation if we're updating.
-  // However, before that task runs, we could have disconnected the element
-  // already. If that's the case and we don't need to finalize update, then we
-  // can skip scheduling animation. If we do need to finalize update (ie reset
-  // update_budget_), then we should still schedule an animation just in case
-  // one was not scheduled.
-  if ((!ConnectedToView() && !update_budget_) || !document_ ||
-      !document_->GetPage()) {
+  if (!ConnectedToView() || !document_ || !document_->GetPage())
     return;
-  }
 
   // Schedule an animation to perform the lifecycle phases.
   document_->GetPage()->Animator().ScheduleVisualUpdate(document_->GetFrame());
@@ -1073,8 +885,7 @@
   // commit() isn't in progress, the web author won't know that the element
   // got unlocked. Figure out how to notify the author.
   if (auto* reason = ShouldForceUnlock()) {
-    FinishUpdateResolver(kReject, reason);
-    state_ = kUnlocked;
+    is_locked_ = false;
     return true;
   }
   return false;
@@ -1086,7 +897,6 @@
 
 // Scoped objects implementation
 // -----------------------------------------------
-
 DisplayLockContext::ScopedForcedUpdate::ScopedForcedUpdate(
     DisplayLockContext* context)
     : context_(context) {}
@@ -1102,57 +912,4 @@
     context_->NotifyForcedUpdateScopeEnded();
 }
 
-// StateChangeHelper implementation
-// -----------------------------------------------
-DisplayLockContext::StateChangeHelper::StateChangeHelper(
-    DisplayLockContext* context)
-    : context_(context) {}
-
-DisplayLockContext::StateChangeHelper& DisplayLockContext::StateChangeHelper::
-operator=(State new_state) {
-  if (new_state == state_)
-    return *this;
-
-  bool was_activatable =
-      context_->IsActivatable(DisplayLockActivationReason::kAny);
-  bool was_locked = context_->IsLocked();
-
-  state_ = new_state;
-
-  if (!context_->document_)
-    return *this;
-
-  bool is_activatable =
-      context_->IsActivatable(DisplayLockActivationReason::kAny);
-  bool is_locked = context_->IsLocked();
-
-  UpdateActivationBlockingCount(!was_locked || was_activatable,
-                                !is_locked || is_activatable);
-
-  // Adjust the total number of locked display locks.
-  auto& document = *context_->document_;
-  if (is_locked != was_locked) {
-    if (was_locked)
-      document.RemoveLockedDisplayLock();
-    else
-      document.AddLockedDisplayLock();
-  }
-
-  context_->UpdateActivationObservationIfNeeded();
-  return *this;
-}
-
-void DisplayLockContext::StateChangeHelper::UpdateActivationBlockingCount(
-    bool old_activatable,
-    bool new_activatable) {
-  auto& document = *context_->document_;
-  // Adjust activation blocking lock counts.
-  if (old_activatable != new_activatable) {
-    if (old_activatable)
-      document.IncrementDisplayLockBlockingAllActivation();
-    else
-      document.DecrementDisplayLockBlockingAllActivation();
-  }
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h
index 83c80cd..4ff7b1e3 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context.h
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h
@@ -5,12 +5,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_CONTEXT_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_DISPLAY_LOCK_CONTEXT_H_
 
-#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cancellable_task.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
@@ -66,40 +62,10 @@
 
 class CORE_EXPORT DisplayLockContext final
     : public GarbageCollected<DisplayLockContext>,
-      public ExecutionContextLifecycleObserver,
       public LocalFrameView::LifecycleNotificationObserver {
   USING_GARBAGE_COLLECTED_MIXIN(DisplayLockContext);
-  USING_PRE_FINALIZER(DisplayLockContext, Dispose);
 
  public:
-  // Determines what type of budget to use. This can be overridden via
-  // DisplayLockContext::SetBudgetType().
-  // - kDoNotYield:
-  //     This will effectively do all of the lifecycle phases when we're
-  //     committing. That is, this is the "no budget" option.
-  // - kStrictYieldBetweenLifecyclePhases:
-  //     This type always yields between each lifecycle phase, even if that
-  //     phase was quick (note that it still skips phases that don't need any
-  //     updates).
-  // - kYieldBetweenLifecyclePhases:
-  //     This type will only yield between lifecycle phases (not in the middle
-  //     of one). However, if there is sufficient time left (TODO(vmpstr):
-  //     define this), then it will continue on to the next lifecycle phase.
-  enum class BudgetType {
-    kDoNotYield,
-    kStrictYieldBetweenLifecyclePhases,
-    kYieldBetweenLifecyclePhases,
-    kDefault = kYieldBetweenLifecyclePhases
-  };
-
-  // The current state of the lock. Note that the order of these matters.
-  enum State {
-    kLocked,
-    kUpdating,
-    kCommitting,
-    kUnlocked,
-  };
-
   // The type of style that was blocked by this display lock.
   enum StyleType {
     kStyleUpdateNotRequired,
@@ -125,36 +91,26 @@
     UntracedMember<DisplayLockContext> context_ = nullptr;
   };
 
-  DisplayLockContext(Element*, ExecutionContext*);
-  ~DisplayLockContext();
+  explicit DisplayLockContext(Element*);
+  ~DisplayLockContext() = default;
 
-  // GC functions.
-  void Trace(Visitor*) override;
-  void Dispose();
-
-  // ExecutionContextLifecycleObserver overrides.
-  void ContextDestroyed() override;
-
-  // Set which reasons activate, as a mask of DisplayLockActivationReason enums.
-  void SetActivatable(uint16_t activatable_mask);
-
-  // Returns true if this lock has been activated and the activation has not yet
-  // been cleared.
-  bool IsActivated() const;
-  // Clear the activated flag.
-  void ClearActivated();
+  // Called by style to update the current state of subtree-visibility.
+  void SetRequestedState(ESubtreeVisibility state);
+  // Called by style to adjust the element's style based on the current state.
+  void AdjustElementStyle(ComputedStyle* style) const;
 
   // Is called by the intersection observer callback to inform us of the
   // intersection state.
   void NotifyIsIntersectingViewport();
   void NotifyIsNotIntersectingViewport();
 
-  // Acquire the lock, should only be called when unlocked.
-  void StartAcquire();
-  // Initiate a commit.
-  void StartCommit();
-  // Update rendering of the subtree.
-  ScriptPromise UpdateRendering(ScriptState*);
+  // Request that this context be locked. Called when style determines that the
+  // subtree rooted at this element should be skipped, unless things like
+  // viewport intersection prevent it from doing so.
+  bool RequestLock(uint16_t activation_mask);
+  // Request that this context be unlocked. Called when style determines that
+  // the subtree rooted at this element should be rendered.
+  void RequestUnlock();
 
   // Lifecycle observation / state functions.
   bool ShouldStyle(DisplayLockLifecycleTarget) const;
@@ -176,25 +132,6 @@
   // from and activatable by a specified reason. Note that passing
   // kAny will return true if the lock is activatable for any
   // reason.
-  //
-  // Important note: This returns the correct value even if the context is not
-  // currently locked. The implications of this is that the value returned here
-  // may depend on the method the context was unlocked. For example, in an
-  // attribute version activation we set the attribute to an empty string,
-  // making this value be true for all reasons. With a CSS version, however, we
-  // set |activated_| to true, but retain the style hence IsActivatable values
-  // don't change on activation. This is important since with a CSS version, we
-  // re-lock elements that have kViewport activatability and thus need to know
-  // if kViewport activatability is present even if activation has happened. To
-  // put this differently, the value returned here should always be consistent
-  // with either the current value of the attribute or the current value of the
-  // CSS property that generated this context; the UA can change the attribute
-  // value, but it cannot change the CSS property value, hence we observe the
-  // above behavior.
-  //
-  // In the common case, if the caller needs to know whether to activate the
-  // context, it should check whether the context is, in fact, locked in
-  // addition to this activatability check.
   bool IsActivatable(DisplayLockActivationReason reason) const;
 
   // Trigger commit because of activation from tab order, url fragment,
@@ -208,12 +145,10 @@
 
   bool ShouldCommitForActivation(DisplayLockActivationReason reason) const;
 
-  // Returns true if this lock is locked. Note from the outside perspective, the
-  // lock is locked any time the state is not kUnlocked or kCommitting.
-  bool IsLocked() const { return state_ != kUnlocked && state_ != kCommitting; }
+  // Returns true if this context is locked.
+  bool IsLocked() const { return is_locked_; }
 
-  // Called when the layout tree is attached. This is used to verify
-  // containment.
+  // Called when the layout tree is attached.
   void DidAttachLayoutTree();
 
   // Returns a ScopedForcedUpdate object which for the duration of its lifetime
@@ -286,34 +221,28 @@
     }
   }
 
+  // GC functions.
+  void Trace(Visitor*) override;
+
  private:
   // Test friends.
-  friend class DisplayLockBudgetTest;
   friend class DisplayLockContextRenderingTest;
   friend class DisplayLockContextTest;
 
   // Production friends.
-  friend class DisplayLockBudget;
   friend class DisplayLockSuspendedHandle;
 
-  class StateChangeHelper {
-    DISALLOW_NEW();
+  // Returns true if this lock has been activated and the activation has not yet
+  // been cleared.
+  bool IsActivated() const;
 
-   public:
-    explicit StateChangeHelper(DisplayLockContext*);
+  void UpdateActivationBlockingCount(bool was_activatable, bool is_activatable);
 
-    operator State() const { return state_; }
-    StateChangeHelper& operator=(State);
-    void UpdateActivationBlockingCount(bool old_activatable,
-                                       bool new_activatable);
+  // Set which reasons activate, as a mask of DisplayLockActivationReason enums.
+  void SetActivatable(uint16_t activatable_mask);
 
-   private:
-    State state_ = kUnlocked;
-    UntracedMember<DisplayLockContext> context_;
-  };
-
-  // Initiate an update.
-  void StartUpdateIfNeeded();
+  // Clear the activated flag.
+  void ClearActivated();
 
   // Marks ancestors of elements in |whitespace_reattach_set_| with
   // ChildNeedsReattachLayoutTree and clears the set.
@@ -337,26 +266,10 @@
   // GetScopedForcedUpdate() for more information.
   void NotifyForcedUpdateScopeEnded();
 
-  // Creates a new update budget based on the BudgetType::kDefault enum. In
-  // other words, it will create a budget of that type.
-  // TODO(vmpstr): In tests, we will probably switch the value to test other
-  // budgets. As well, this makes it easier to change the budget right in the
-  // enum definitions.
-  std::unique_ptr<DisplayLockBudget> CreateNewBudget();
-
   // Helper to schedule an animation to delay lifecycle updates for the next
   // frame.
   void ScheduleAnimation();
 
-  // Helper functions to resolve the update/commit promises.
-  enum ResolverState { kResolve, kReject, kDetach };
-  void MakeResolver(ScriptState*, Member<ScriptPromiseResolver>*);
-  bool HasResolver() const;
-  void FinishUpdateResolver(ResolverState, const char* reject_reason = nullptr);
-  void FinishResolver(Member<ScriptPromiseResolver>*,
-                      ResolverState,
-                      const char* reject_reason);
-
   // Checks whether we should force unlock the lock (due to not meeting
   // containment/display requirements), returns a string from rejection_names
   // if we should, nullptr if not. Note that this can only be called if the
@@ -374,8 +287,6 @@
   // when acquiring this lock should immediately resolve the acquire promise.
   bool ConnectedToView() const;
 
-  bool ShouldPerformUpdatePhase(DisplayLockBudget::Phase phase) const;
-
   // During an attempt to commit, clean up state and reject pending resolver
   // promises if the lock is not connected to the tree.
   bool CleanupAndRejectCommitIfNotConnected();
@@ -396,11 +307,14 @@
   // the notifications.
   void UpdateLifecycleNotificationRegistration();
 
-  std::unique_ptr<DisplayLockBudget> update_budget_;
+  // Acquire the lock, should only be called when unlocked.
+  void StartAcquire();
+  // Initiate a commit.
+  void StartCommit();
 
-  Member<ScriptPromiseResolver> update_resolver_;
   WeakMember<Element> element_;
   WeakMember<Document> document_;
+  ESubtreeVisibility state_ = ESubtreeVisibility::kVisible;
 
   // See StyleEngine's |whitespace_reattach_set_|.
   // Set of elements that had at least one rendered children removed
@@ -411,8 +325,6 @@
   // style recalc on them.
   HeapHashSet<Member<Element>> whitespace_reattach_set_;
 
-  StateChangeHelper state_;
-
   bool update_forced_ = false;
 
   StyleType blocked_style_traversal_type_ = kStyleUpdateNotRequired;
@@ -440,9 +352,8 @@
   uint16_t activatable_mask_ =
       static_cast<uint16_t>(DisplayLockActivationReason::kAny);
 
-  // State that tracks whether we've been activated. Note that this is only
-  // valid for CSS version of subtree-visibility.
-  bool css_is_activated_ = false;
+  // State that tracks whether we've been activated.
+  bool is_activated_ = false;
 
   // Is set to true if we are registered for lifecycle notifications.
   bool is_registered_for_lifecycle_notifications_ = false;
@@ -453,6 +364,10 @@
   // if we are still nested.
   bool needs_intersection_lock_check_ = false;
 
+  // Lock has been requested.
+  bool lock_requested_ = false;
+  bool is_locked_ = false;
+
   // TODO(vmpstr): This is only needed while we're still sending activation
   // events.
   base::WeakPtrFactory<DisplayLockContext> weak_factory_{this};
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
index bfc8ec75..e8a9771 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -12,7 +12,6 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
-#include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h"
 #include "third_party/blink/renderer/core/dom/dom_token_list.h"
 #include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
@@ -162,12 +161,6 @@
     test::RunPendingTasks();
   }
 
-  void ResetBudget(std::unique_ptr<DisplayLockBudget> budget,
-                   DisplayLockContext* context) {
-    ASSERT_TRUE(context->update_budget_);
-    context->update_budget_ = std::move(budget);
-  }
-
   bool ReattachWasBlocked(DisplayLockContext* context) {
     return context->reattach_layout_tree_was_blocked_;
   }
@@ -223,7 +216,7 @@
       MakeRGB(255, 0, 0));
   // Manually commit the lock so that we can verify which dirty bits get
   // propagated.
-  element->GetDisplayLockContext()->StartCommit();
+  element->GetDisplayLockContext()->RequestUnlock();
   element->setAttribute(html_names::kStyleAttr, "color: red;");
 
   auto* child = GetDocument().getElementById("child");
@@ -253,7 +246,7 @@
       child->GetComputedStyle()->VisitedDependentColor(GetCSSPropertyColor()),
       MakeRGB(0, 0, 255));
 
-  child->GetDisplayLockContext()->StartCommit();
+  child->GetDisplayLockContext()->RequestUnlock();
   child->setAttribute(html_names::kStyleAttr, "color: blue;");
   EXPECT_TRUE(GetDocument().body()->ChildNeedsStyleRecalc());
   EXPECT_FALSE(element->NeedsStyleRecalc());
@@ -717,7 +710,7 @@
 
   // Manually start commit, so that we can verify which dirty bits get
   // propagated.
-  element->GetDisplayLockContext()->StartCommit();
+  element->GetDisplayLockContext()->RequestUnlock();
   EXPECT_TRUE(element->ChildNeedsStyleRecalc());
   EXPECT_FALSE(element->NeedsReattachLayoutTree());
   EXPECT_FALSE(element->ChildNeedsReattachLayoutTree());
@@ -1105,15 +1098,11 @@
   EXPECT_FALSE(non_activatable->GetDisplayLockContext()->IsActivatable(
       DisplayLockActivationReason::kAny));
 
-  // Now commit the lock for |non_ctivatable|.
+  // Now commit the lock for |non_activatable|.
   CommitElement(*non_activatable);
 
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 1);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 0);
-  EXPECT_TRUE(activatable->GetDisplayLockContext()->IsActivatable(
-      DisplayLockActivationReason::kAny));
-  EXPECT_TRUE(non_activatable->GetDisplayLockContext()->IsActivatable(
-      DisplayLockActivationReason::kAny));
 
   // Re-acquire the lock for |activatable| again with the activatable flag.
   LockElement(*activatable, true);
@@ -1315,7 +1304,7 @@
   // Manually commit the lock so that we can verify which dirty bits get
   // propagated.
   CommitElement(*locked_element, false);
-  locked_element->GetDisplayLockContext()->StartCommit();
+  locked_element->GetDisplayLockContext()->RequestUnlock();
 
   EXPECT_FALSE(ancestor_object->EffectiveAllowedTouchActionChanged());
   EXPECT_FALSE(handler_object->EffectiveAllowedTouchActionChanged());
@@ -1459,7 +1448,7 @@
   // Manually commit the lock so that we can verify which dirty bits get
   // propagated.
   CommitElement(*locked_element, false);
-  locked_element->GetDisplayLockContext()->StartCommit();
+  locked_element->GetDisplayLockContext()->RequestUnlock();
 
   EXPECT_FALSE(ancestor_object->EffectiveAllowedTouchActionChanged());
   EXPECT_FALSE(descendant_object->EffectiveAllowedTouchActionChanged());
@@ -1613,7 +1602,7 @@
   // Manually commit the lock so that we can verify which dirty bits get
   // propagated.
   CommitElement(*locked_element, false);
-  locked_element->GetDisplayLockContext()->StartCommit();
+  locked_element->GetDisplayLockContext()->RequestUnlock();
 
   EXPECT_FALSE(ancestor_object->NeedsPaintPropertyUpdate());
   EXPECT_FALSE(descendant_object->NeedsPaintPropertyUpdate());
@@ -1638,62 +1627,6 @@
   EXPECT_FALSE(handler_object->DescendantNeedsPaintPropertyUpdate());
 }
 
-TEST_F(DisplayLockContextTest, DisconnectedWhileUpdating) {
-  SetHtmlInnerHTML(R"HTML(
-    <style>
-    #container {
-      contain: style layout;
-    }
-    </style>
-    <div id="container"></div>
-  )HTML");
-
-  auto* container = GetDocument().getElementById("container");
-  LockElement(*container, false);
-
-  EXPECT_TRUE(container->GetDisplayLockContext()->IsLocked());
-  EXPECT_FALSE(container->GetDisplayLockContext()->ShouldStyle(
-      DisplayLockLifecycleTarget::kChildren));
-  EXPECT_FALSE(container->GetDisplayLockContext()->ShouldLayout(
-      DisplayLockLifecycleTarget::kChildren));
-  EXPECT_FALSE(container->GetDisplayLockContext()->ShouldPrePaint(
-      DisplayLockLifecycleTarget::kChildren));
-
-  auto* script_state = ToScriptStateForMainWorld(GetDocument().GetFrame());
-  {
-    ScriptState::Scope scope(script_state);
-    container->GetDisplayLockContext()->UpdateRendering(script_state);
-  }
-  auto budget = base::WrapUnique(
-      new StrictYieldingDisplayLockBudget(container->GetDisplayLockContext()));
-  ResetBudget(std::move(budget), container->GetDisplayLockContext());
-
-  // This should style and allow layout, but not actually do layout (thus
-  // pre-paint would be blocked). Furthermore, this should schedule a task to
-  // run DisplayLockLifecycleTarget::ScheduleAnimation (since we can't directly
-  // schedule it from within a lifecycle).
-  UpdateAllLifecyclePhasesForTest();
-
-  ASSERT_FALSE(GetDocument().View()->InLifecycleUpdate());
-  GetDocument().View()->SetInLifecycleUpdateForTest(true);
-  EXPECT_TRUE(container->GetDisplayLockContext()->IsLocked());
-  EXPECT_TRUE(container->GetDisplayLockContext()->ShouldStyle(
-      DisplayLockLifecycleTarget::kChildren));
-  EXPECT_TRUE(container->GetDisplayLockContext()->ShouldLayout(
-      DisplayLockLifecycleTarget::kChildren));
-  EXPECT_FALSE(container->GetDisplayLockContext()->ShouldPrePaint(
-      DisplayLockLifecycleTarget::kChildren));
-  GetDocument().View()->SetInLifecycleUpdateForTest(false);
-
-  // Now disconnect the element.
-  container->remove();
-
-  // Flushing the pending tasks would call ScheduleAnimation, but since we're no
-  // longer connected and can't schedule from within the element, we should
-  // gracefully exit (and not crash).
-  test::RunPendingTasks();
-}
-
 class DisplayLockContextRenderingTest : public RenderingTest,
                                         private ScopedCSSSubtreeVisibilityHiddenMatchableForTest {
  public:
@@ -1704,6 +1637,9 @@
   bool IsObservingLifecycle(DisplayLockContext* context) const {
     return context->is_registered_for_lifecycle_notifications_;
   }
+  bool IsActivated(DisplayLockContext* context) const {
+    return context->IsActivated();
+  }
 };
 
 TEST_F(DisplayLockContextRenderingTest, FrameDocumentRemovedWhileAcquire) {
@@ -1722,7 +1658,7 @@
   auto* target = ChildDocument().getElementById("target");
   GetDocument().getElementById("frame")->remove();
 
-  target->EnsureDisplayLockContext().StartAcquire();
+  target->EnsureDisplayLockContext().RequestLock(0);
 }
 
 TEST_F(DisplayLockContextRenderingTest,
@@ -1871,7 +1807,7 @@
   // Verify lock state.
   auto* inner_context = inner_element->GetDisplayLockContext();
   ASSERT_TRUE(inner_context);
-  EXPECT_TRUE(inner_context->IsActivated());
+  EXPECT_TRUE(IsActivated(inner_context));
   EXPECT_FALSE(inner_context->IsLocked());
 
   // Lock outer.
@@ -1946,7 +1882,7 @@
   EXPECT_FALSE(IsObservingLifecycle(inner_context));
 
   // Also we should still be activated and unlocked.
-  EXPECT_TRUE(inner_context->IsActivated());
+  EXPECT_TRUE(IsActivated(inner_context));
   EXPECT_FALSE(inner_context->IsLocked());
 
   // Everything should be layout clean.
@@ -2005,7 +1941,7 @@
   // Verify lock state.
   auto* inner_context = inner_element->GetDisplayLockContext();
   ASSERT_TRUE(inner_context);
-  EXPECT_TRUE(inner_context->IsActivated());
+  EXPECT_TRUE(IsActivated(inner_context));
   EXPECT_FALSE(inner_context->IsLocked());
 
   // Lock outer.
@@ -2082,7 +2018,7 @@
   EXPECT_TRUE(IsObservingLifecycle(inner_context));
 
   // We're unlocked for now.
-  EXPECT_TRUE(inner_context->IsActivated());
+  EXPECT_TRUE(IsActivated(inner_context));
   EXPECT_FALSE(inner_context->IsLocked());
 
   // Everything should be layout clean.
@@ -2100,7 +2036,7 @@
   EXPECT_FALSE(IsObservingLifecycle(inner_context));
 
   // We're locked.
-  EXPECT_FALSE(inner_context->IsActivated());
+  EXPECT_FALSE(IsActivated(inner_context));
   EXPECT_TRUE(inner_context->IsLocked());
 }
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc
deleted file mode 100644
index 3f319b9..0000000
--- a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.cc
+++ /dev/null
@@ -1,76 +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.
-
-#include "third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h"
-
-#include <algorithm>
-#include "third_party/blink/renderer/core/frame/local_frame_view.h"
-
-namespace blink {
-
-StrictYieldingDisplayLockBudget::StrictYieldingDisplayLockBudget(
-    DisplayLockContext* context)
-    : DisplayLockBudget(context) {}
-
-bool StrictYieldingDisplayLockBudget::ShouldPerformPhase(
-    Phase phase,
-    const LifecycleData& lifecycle_data) {
-  // We should perform any phase earlier than the one we already completed.
-  // Also, we should complete a new phase once per cycle.
-  return (last_completed_phase_ && phase <= *last_completed_phase_) ||
-         !completed_new_phase_this_cycle_;
-}
-
-void StrictYieldingDisplayLockBudget::DidPerformPhase(Phase phase) {
-  if (!completed_new_phase_this_cycle_ &&
-      (!last_completed_phase_ || phase > *last_completed_phase_)) {
-    last_completed_phase_ = phase;
-    completed_new_phase_this_cycle_ = true;
-  }
-
-#if DCHECK_IS_ON()
-  // If we completed a new phase this cycle, then we should not complete any
-  // later phases in the same cycle.
-  if (completed_new_phase_this_cycle_) {
-    DCHECK(last_completed_phase_);
-    DCHECK(phase <= *last_completed_phase_);
-  }
-#endif
-}
-
-void StrictYieldingDisplayLockBudget::OnLifecycleChange(
-    const LifecycleData& lifecycle_data) {
-  // Figure out the next phase we would run. If we had completed a phase before,
-  // then we should try to complete the next one, otherwise we'll start with the
-  // first phase.
-  Phase next_phase =
-      last_completed_phase_
-          ? static_cast<Phase>(
-                std::min(static_cast<unsigned>(*last_completed_phase_) + 1,
-                         static_cast<unsigned>(Phase::kLast)))
-          : Phase::kFirst;
-
-  // Mark the next phase we're scheduled to run.
-  MarkPhaseAsDirty(next_phase);
-  completed_new_phase_this_cycle_ = false;
-}
-
-bool StrictYieldingDisplayLockBudget::NeedsLifecycleUpdates() const {
-  if (last_completed_phase_ && *last_completed_phase_ == Phase::kLast)
-    return false;
-
-  auto next_phase = last_completed_phase_
-                        ? static_cast<Phase>(
-                              static_cast<unsigned>(*last_completed_phase_) + 1)
-                        : Phase::kFirst;
-  // Check if any future phase needs updates.
-  for (auto phase = static_cast<unsigned>(next_phase);
-       phase <= static_cast<unsigned>(Phase::kLast); ++phase) {
-    if (IsElementDirtyForPhase(static_cast<Phase>(phase)))
-      return true;
-  }
-  return false;
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h
deleted file mode 100644
index c0b9cba..0000000
--- a/third_party/blink/renderer/core/display_lock/strict_yielding_display_lock_budget.h
+++ /dev/null
@@ -1,42 +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 THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_STRICT_YIELDING_DISPLAY_LOCK_BUDGET_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_STRICT_YIELDING_DISPLAY_LOCK_BUDGET_H_
-
-#include "base/optional.h"
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h"
-
-namespace blink {
-
-// This budget yields between lifecycle phases even if that phase is quick. In
-// other words, it will only do one new lifecycle phase at a time, and block the
-// future ones. Any lifecycle phases that have already been allowed by this
-// budget in the past are not blocked.
-class CORE_EXPORT StrictYieldingDisplayLockBudget final
-    : public DisplayLockBudget {
- public:
-  StrictYieldingDisplayLockBudget(DisplayLockContext*);
-  ~StrictYieldingDisplayLockBudget() override = default;
-
-  bool ShouldPerformPhase(Phase, const LifecycleData&) override;
-  void DidPerformPhase(Phase) override;
-  void OnLifecycleChange(const LifecycleData&) override;
-  // Returns true if any of the lifecycles that have been previously blocked by
-  // this budget need updates. Note that this does not check lifecycle phases
-  // that have already completed by this budget even if they are now dirty
-  // again. This is done to prevent starvation (ie, it is possible for the
-  // budget to always schedule more work if something in rAF keeps dirtying
-  // layout, for example).
-  bool NeedsLifecycleUpdates() const override;
-
- protected:
-  base::Optional<Phase> last_completed_phase_;
-  bool completed_new_phase_this_cycle_ = false;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_STRICT_YIELDING_DISPLAY_LOCK_BUDGET_H_
diff --git a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc
deleted file mode 100644
index 8ed458b..0000000
--- a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h"
-
-#include "third_party/blink/renderer/core/frame/local_frame_view.h"
-
-namespace blink {
-
-UnyieldingDisplayLockBudget::UnyieldingDisplayLockBudget(
-    DisplayLockContext* context)
-    : DisplayLockBudget(context) {}
-
-bool UnyieldingDisplayLockBudget::ShouldPerformPhase(
-    Phase,
-    const LifecycleData& lifecycle_data) {
-  return true;
-}
-
-void UnyieldingDisplayLockBudget::DidPerformPhase(Phase) {}
-
-void UnyieldingDisplayLockBudget::OnLifecycleChange(
-    const LifecycleData& lifecycle_data) {
-  // Mark all the phases dirty since we have no intention of yielding.
-  for (auto phase = static_cast<unsigned>(Phase::kFirst);
-       phase <= static_cast<unsigned>(Phase::kLast); ++phase) {
-    MarkDirtyForPhaseIfNeeded(static_cast<Phase>(phase));
-  }
-}
-
-bool UnyieldingDisplayLockBudget::NeedsLifecycleUpdates() const {
-  for (auto phase = static_cast<unsigned>(Phase::kFirst);
-       phase <= static_cast<unsigned>(Phase::kLast); ++phase) {
-    if (IsElementDirtyForPhase(static_cast<Phase>(phase)))
-      return true;
-  }
-  return false;
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h
deleted file mode 100644
index 7b3351a..0000000
--- a/third_party/blink/renderer/core/display_lock/unyielding_display_lock_budget.h
+++ /dev/null
@@ -1,29 +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 THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_UNYIELDING_DISPLAY_LOCK_BUDGET_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_UNYIELDING_DISPLAY_LOCK_BUDGET_H_
-
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h"
-
-namespace blink {
-
-// This budget never yields. That is, this is essentially infinite budget that
-// will finish all of the lifecycle phases for the locked subtree if given the
-// chance.
-class CORE_EXPORT UnyieldingDisplayLockBudget final : public DisplayLockBudget {
- public:
-  UnyieldingDisplayLockBudget(DisplayLockContext*);
-  ~UnyieldingDisplayLockBudget() override = default;
-
-  bool ShouldPerformPhase(Phase, const LifecycleData&) override;
-  void DidPerformPhase(Phase) override;
-  void OnLifecycleChange(const LifecycleData&) override;
-  bool NeedsLifecycleUpdates() const override;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_UNYIELDING_DISPLAY_LOCK_BUDGET_H_
diff --git a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc b/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc
deleted file mode 100644
index 431f2fcf..0000000
--- a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.cc
+++ /dev/null
@@ -1,97 +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.
-
-#include "third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h"
-
-#include "base/time/tick_clock.h"
-#include "third_party/blink/renderer/core/frame/local_frame_view.h"
-
-#include <algorithm>
-
-namespace blink {
-
-YieldingDisplayLockBudget::YieldingDisplayLockBudget(
-    DisplayLockContext* context)
-    : DisplayLockBudget(context) {}
-
-bool YieldingDisplayLockBudget::ShouldPerformPhase(
-    Phase phase,
-    const LifecycleData& lifecycle_data) {
-  // Always perform at least one more phase.
-  if (phase <= next_phase_from_start_of_lifecycle_)
-    return true;
-
-  // We should perform any phase earlier than the one we already completed.
-  if (last_completed_phase_ && phase <= *last_completed_phase_)
-    return true;
-
-  // Otherwise, we can still do work while we're not past the deadline.
-  return clock_->NowTicks() < deadline_;
-}
-
-void YieldingDisplayLockBudget::DidPerformPhase(Phase phase) {
-  if (!last_completed_phase_ || phase > *last_completed_phase_)
-    last_completed_phase_ = phase;
-
-  // Mark the next phase as dirty so that we can reach it if we need to.
-  MarkPhaseAsDirty(
-      static_cast<Phase>(static_cast<unsigned>(*last_completed_phase_) + 1));
-}
-
-void YieldingDisplayLockBudget::OnLifecycleChange(
-    const LifecycleData& lifecycle_data) {
-  if (first_lifecycle_count_ == 0)
-    first_lifecycle_count_ = lifecycle_data.count;
-  deadline_ = lifecycle_data.start_time + GetCurrentBudget(lifecycle_data);
-
-  // Figure out the next phase we would run. If we had completed a phase before,
-  // then we should try to complete the next one, otherwise we'll start with the
-  // first phase.
-  next_phase_from_start_of_lifecycle_ =
-      last_completed_phase_
-          ? static_cast<Phase>(
-                std::min(static_cast<unsigned>(*last_completed_phase_) + 1,
-                         static_cast<unsigned>(Phase::kLast)))
-          : Phase::kFirst;
-  MarkPhaseAsDirty(next_phase_from_start_of_lifecycle_);
-}
-
-bool YieldingDisplayLockBudget::NeedsLifecycleUpdates() const {
-  if (last_completed_phase_ && *last_completed_phase_ == Phase::kLast)
-    return false;
-
-  auto next_phase = last_completed_phase_
-                        ? static_cast<Phase>(
-                              static_cast<unsigned>(*last_completed_phase_) + 1)
-                        : Phase::kFirst;
-  // Check if any future phase needs updates.
-  for (auto phase = static_cast<unsigned>(next_phase);
-       phase <= static_cast<unsigned>(Phase::kLast); ++phase) {
-    if (IsElementDirtyForPhase(static_cast<Phase>(phase)))
-      return true;
-  }
-  return false;
-}
-
-base::TimeDelta YieldingDisplayLockBudget::GetCurrentBudget(
-    const LifecycleData& lifecycle_data) const {
-  int lifecycle_count = lifecycle_data.count - first_lifecycle_count_ + 1;
-  if (base::TimeTicks::IsHighResolution()) {
-    if (lifecycle_count < 3)
-      return base::TimeDelta::FromMilliseconds(4);
-    if (lifecycle_count < 10)
-      return base::TimeDelta::FromMilliseconds(8);
-    if (lifecycle_count < 60)
-      return base::TimeDelta::FromMilliseconds(16);
-  } else {
-    // Without a high resolution clock, the resolution can be as bad as 15ms, so
-    // increase the budgets accordingly to ensure we don't abort before doing
-    // any phases.
-    if (lifecycle_count < 60)
-      return base::TimeDelta::FromMilliseconds(16);
-  }
-  return base::TimeDelta::FromMilliseconds(1e9);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h b/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h
deleted file mode 100644
index 5b1893f..0000000
--- a/third_party/blink/renderer/core/display_lock/yielding_display_lock_budget.h
+++ /dev/null
@@ -1,48 +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 THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_YIELDING_DISPLAY_LOCK_BUDGET_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_YIELDING_DISPLAY_LOCK_BUDGET_H_
-
-#include "base/optional.h"
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/display_lock/display_lock_budget.h"
-
-namespace blink {
-
-// This budget yields between lifecycle phases even if that phase is quick. In
-// other words, it will only do one new lifecycle phase at a time, and block the
-// future ones. Any lifecycle phases that have already been allowed by this
-// budget in the past are not blocked.
-class CORE_EXPORT YieldingDisplayLockBudget final : public DisplayLockBudget {
- public:
-  YieldingDisplayLockBudget(DisplayLockContext*);
-  ~YieldingDisplayLockBudget() override = default;
-
-  bool ShouldPerformPhase(Phase, const LifecycleData& lifecycle_data) override;
-  void DidPerformPhase(Phase) override;
-  void OnLifecycleChange(const LifecycleData& lifecycle_data) override;
-  // Returns true if any of the lifecycles that have been previously blocked by
-  // this budget need updates. Note that this does not check lifecycle phases
-  // that have already completed by this budget even if they are now dirty
-  // again. This is done to prevent starvation (ie, it is possible for the
-  // budget to always schedule more work if something in rAF keeps dirtying
-  // layout, for example).
-  bool NeedsLifecycleUpdates() const override;
-
- protected:
-  friend class DisplayLockBudgetTest;
-
-  base::TimeDelta GetCurrentBudget(const LifecycleData& lifecycle_data) const;
-
- private:
-  unsigned first_lifecycle_count_ = 0;
-  base::TimeTicks deadline_;
-  base::Optional<Phase> last_completed_phase_;
-  Phase next_phase_from_start_of_lifecycle_ = Phase::kFirst;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_DISPLAY_LOCK_YIELDING_DISPLAY_LOCK_BUDGET_H_
diff --git a/third_party/blink/renderer/core/dom/character_data.cc b/third_party/blink/renderer/core/dom/character_data.cc
index 945ae86..55a99d7 100644
--- a/third_party/blink/renderer/core/dom/character_data.cc
+++ b/third_party/blink/renderer/core/dom/character_data.cc
@@ -228,7 +228,9 @@
   if (parentNode()) {
     ContainerNode::ChildrenChange change = {
         ContainerNode::ChildrenChangeType::kTextChanged,
-        ContainerNode::ChildrenChangeSource::kAPI,
+        source == kUpdateFromParser
+            ? ContainerNode::ChildrenChangeSource::kParser
+            : ContainerNode::ChildrenChangeSource::kAPI,
         this,
         previousSibling(),
         nextSibling(),
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 0afa82a..c9adb0b 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -4798,8 +4798,7 @@
 }
 
 DisplayLockContext& Element::EnsureDisplayLockContext() {
-  return *EnsureElementRareData().EnsureDisplayLockContext(
-      this, GetExecutionContext());
+  return *EnsureElementRareData().EnsureDisplayLockContext(this);
 }
 
 // Step 1 of http://domparsing.spec.whatwg.org/#insertadjacenthtml()
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h
index e72d697..21c5a80 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data.h
+++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -192,11 +192,9 @@
   }
   ResizeObserverDataMap& EnsureResizeObserverData();
 
-  DisplayLockContext* EnsureDisplayLockContext(Element* element,
-                                               ExecutionContext* context) {
+  DisplayLockContext* EnsureDisplayLockContext(Element* element) {
     if (!display_lock_context_) {
-      display_lock_context_ =
-          MakeGarbageCollected<DisplayLockContext>(element, context);
+      display_lock_context_ = MakeGarbageCollected<DisplayLockContext>(element);
     }
     return display_lock_context_.Get();
   }
diff --git a/third_party/blink/renderer/core/exported/web_external_widget_impl.h b/third_party/blink/renderer/core/exported/web_external_widget_impl.h
index 60ad34f..6cac767a 100644
--- a/third_party/blink/renderer/core/exported/web_external_widget_impl.h
+++ b/third_party/blink/renderer/core/exported/web_external_widget_impl.h
@@ -9,10 +9,12 @@
 
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/renderer/platform/widget/widget_base.h"
+#include "third_party/blink/renderer/platform/widget/widget_base_client.h"
 
 namespace blink {
 
-class WebExternalWidgetImpl : public WebExternalWidget {
+class WebExternalWidgetImpl : public WebExternalWidget,
+                              public WidgetBaseClient {
  public:
   WebExternalWidgetImpl(WebExternalWidgetClient* client,
                         const WebURL& debug_url);
@@ -31,11 +33,15 @@
   // WebExternalWidget overrides:
   void SetRootLayer(scoped_refptr<cc::Layer>) override;
 
+  // WidgetBaseClient overrides:
+  void DispatchRafAlignedInput(base::TimeTicks frame_time) override {}
+  void BeginMainFrame(base::TimeTicks last_frame_time) override {}
+
  private:
   WebExternalWidgetClient* const client_;
   const WebURL debug_url_;
   WebSize size_;
-  WidgetBase widget_base_;
+  WidgetBase widget_base_{this};
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc
index 88ec1ff..ece42ca 100644
--- a/third_party/blink/renderer/core/exported/web_frame_test.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -13083,7 +13083,7 @@
   ASSERT_TRUE(widget);
   gfx::Point viewport_offset(7, -11);
   WebRect viewport_intersection(0, 11, 200, 89);
-  WebRect mainframe_intersection(0, 0, 200, 140);
+  WebRect mainframe_intersection(7, -11, 200, 140);
   FrameOcclusionState occlusion_state = FrameOcclusionState::kUnknown;
   widget->SetRemoteViewportIntersection(
       {viewport_offset, viewport_intersection, mainframe_intersection,
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
index 55ddaa7..cfe80a28 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -378,11 +378,7 @@
 }
 
 void WebPagePopupImpl::BeginFrame(base::TimeTicks last_frame_time) {
-  if (!page_)
-    return;
-  // FIXME: This should use lastFrameTimeMonotonic but doing so
-  // breaks tests.
-  PageWidgetDelegate::Animate(*page_, base::TimeTicks::Now());
+  widget_base_.BeginMainFrame(last_frame_time);
 }
 
 void WebPagePopupImpl::UpdateLifecycle(LifecycleUpdate requested_update,
@@ -431,6 +427,18 @@
   return MainFrame().GetEventHandler().KeyEvent(event);
 }
 
+void WebPagePopupImpl::BeginMainFrame(base::TimeTicks last_frame_time) {
+  if (!page_)
+    return;
+  // FIXME: This should use lastFrameTimeMonotonic but doing so
+  // breaks tests.
+  PageWidgetDelegate::Animate(*page_, base::TimeTicks::Now());
+}
+
+void WebPagePopupImpl::DispatchRafAlignedInput(base::TimeTicks frame_time) {
+  WidgetClient()->DispatchRafAlignedInput(frame_time);
+}
+
 WebInputEventResult WebPagePopupImpl::HandleCharEvent(
     const WebKeyboardEvent& event) {
   if (suppress_next_keypress_event_) {
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.h b/third_party/blink/renderer/core/exported/web_page_popup_impl.h
index 881ad471..f41fd66 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.h
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.h
@@ -38,6 +38,7 @@
 #include "third_party/blink/renderer/core/page/page_widget_delegate.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/widget/widget_base.h"
+#include "third_party/blink/renderer/platform/widget/widget_base_client.h"
 #include "third_party/blink/renderer/platform/wtf/casting.h"
 #include "third_party/blink/renderer/platform/wtf/ref_counted.h"
 
@@ -56,7 +57,8 @@
 class CORE_EXPORT WebPagePopupImpl final : public WebPagePopup,
                                            public PageWidgetEventHandler,
                                            public PagePopup,
-                                           public RefCounted<WebPagePopupImpl> {
+                                           public RefCounted<WebPagePopupImpl>,
+                                           public WidgetBaseClient {
   USING_FAST_MALLOC(WebPagePopupImpl);
 
  public:
@@ -108,6 +110,10 @@
   // PageWidgetEventHandler implementation.
   WebInputEventResult HandleKeyEvent(const WebKeyboardEvent&) override;
 
+  // WidgetBaseClient overrides:
+  void DispatchRafAlignedInput(base::TimeTicks frame_time) override;
+  void BeginMainFrame(base::TimeTicks last_frame_time) override;
+
  private:
   // WebWidget implementation.
   // NOTE: The WebWidget may still be used after requesting the popup to be
@@ -170,7 +176,7 @@
 
   // Base functionality all widgets have. This is a member as to avoid
   // complicated inheritance structures.
-  WidgetBase widget_base_;
+  WidgetBase widget_base_{this};
 
   friend class WebPagePopup;
   friend class PagePopupChromeClient;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index bcf5d6b..64bc18e 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -1527,21 +1527,6 @@
   }
 }
 
-void WebViewImpl::BeginRafAlignedInput() {
-  if (MainFrameImpl() && WebFrameWidgetBase::ShouldRecordMainFrameMetrics())
-    raf_aligned_input_start_time_.emplace(base::TimeTicks::Now());
-}
-
-void WebViewImpl::EndRafAlignedInput() {
-  if (MainFrameImpl() && WebFrameWidgetBase::ShouldRecordMainFrameMetrics()) {
-    DCHECK(raf_aligned_input_start_time_);
-    MainFrameImpl()->GetFrame()->View()->EnsureUkmAggregator().RecordSample(
-        LocalFrameUkmAggregator::kHandleInputEvents,
-        raf_aligned_input_start_time_.value(), base::TimeTicks::Now());
-  }
-  raf_aligned_input_start_time_.reset();
-}
-
 void WebViewImpl::BeginUpdateLayers() {
   if (MainFrameImpl())
     update_layers_start_time_.emplace(base::TimeTicks::Now());
@@ -2467,6 +2452,18 @@
   SetZoomLevel(zoom_level_);
 }
 
+void WebViewImpl::SetPageLifecycleState(
+    mojom::blink::PageLifecycleStatePtr state,
+    SetPageLifecycleStateCallback callback) {
+  Page* page = GetPage();
+  if (!page)
+    return;
+  Scheduler()->SetPageFrozen(state->is_frozen);
+
+  // Tell the browser that the freezing or resuming was successful.
+  std::move(callback).Run();
+}
+
 void WebViewImpl::EnableAutoResizeMode(const WebSize& min_size,
                                        const WebSize& max_size) {
   should_auto_resize_ = true;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index ea6325c..1604c38 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -219,6 +219,10 @@
   // Requests a page-scale animation based on the specified point/rect.
   void AnimateDoubleTapZoom(const gfx::Point&, const WebRect& block_bounds);
 
+  // mojom::blink::PageBroadcast method:
+  void SetPageLifecycleState(mojom::blink::PageLifecycleStatePtr state,
+                             SetPageLifecycleStateCallback callback) override;
+
   float DefaultMinimumPageScaleFactor() const;
   float DefaultMaximumPageScaleFactor() const;
   float ClampPageScaleFactorToLimits(float) const;
@@ -451,8 +455,6 @@
   void SetSuppressFrameRequestsWorkaroundFor704763Only(bool);
   void BeginFrame(base::TimeTicks last_frame_time);
   void DidBeginFrame();
-  void BeginRafAlignedInput();
-  void EndRafAlignedInput();
   void BeginUpdateLayers();
   void EndUpdateLayers();
   void BeginCommitCompositorFrame();
@@ -722,7 +724,6 @@
       local_main_frame_host_remote_;
 
   // Set when a measurement begins, reset when the measurement is taken.
-  base::Optional<base::TimeTicks> raf_aligned_input_start_time_;
   base::Optional<base::TimeTicks> update_layers_start_time_;
   base::Optional<base::TimeTicks> commit_compositor_frame_start_time_;
 
diff --git a/third_party/blink/renderer/core/frame/frame_view.cc b/third_party/blink/renderer/core/frame/frame_view.cc
index 1855e03..38e4322 100644
--- a/third_party/blink/renderer/core/frame/frame_view.cc
+++ b/third_party/blink/renderer/core/frame/frame_view.cc
@@ -159,20 +159,8 @@
       }
     }
 
-    PhysicalRect mainframe_intersection_rect;
-    if (!geometry.UnclippedIntersectionRect().IsEmpty()) {
-      mainframe_intersection_rect = PhysicalRect::EnclosingRect(
-          matrix.ProjectQuad(FloatRect(geometry.UnclippedIntersectionRect()))
-              .BoundingBox());
-
-      if (mainframe_intersection_rect.IsEmpty()) {
-        mainframe_document_intersection = IntRect(
-            FlooredIntPoint(mainframe_intersection_rect.offset), IntSize());
-      } else {
-        mainframe_document_intersection =
-            EnclosingIntRect(mainframe_intersection_rect);
-      }
-    }
+    mainframe_document_intersection =
+        EnclosingIntRect(geometry.UnclippedIntersectionRect());
   } else if (occlusion_state == FrameOcclusionState::kGuaranteedNotOccluded) {
     // If the parent LocalFrameView is throttled and out-of-date, then we can't
     // get any useful information.
@@ -184,6 +172,11 @@
        WebRect(), occlusion_state, frame.GetMainFrameViewportSize(),
        frame.GetMainFrameScrollOffset(), can_skip_sticky_frame_tracking});
 
+  if (ShouldReportMainFrameIntersection()) {
+    GetFrame().Client()->OnMainFrameDocumentIntersectionChanged(
+        mainframe_document_intersection);
+  }
+
   UpdateFrameVisibility(!viewport_intersection.IsEmpty());
 
   // We don't throttle 0x0 or display:none iframes, because in practice they are
diff --git a/third_party/blink/renderer/core/frame/frame_view.h b/third_party/blink/renderer/core/frame/frame_view.h
index 73d183d22..0ab1d06 100644
--- a/third_party/blink/renderer/core/frame/frame_view.h
+++ b/third_party/blink/renderer/core/frame/frame_view.h
@@ -57,6 +57,7 @@
   bool RectInParentIsStable(const base::TimeTicks& timestamp) const;
 
  protected:
+  virtual bool ShouldReportMainFrameIntersection() const { return false; }
   virtual bool NeedsViewportOffset() const { return false; }
   virtual void SetViewportIntersection(
       const ViewportIntersectionState& intersection_state) = 0;
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index bd3e6c8..ca79027e 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1481,8 +1481,14 @@
   // Notify the render frame observers when the main frame intersection changes.
   if (intersection_state_.main_frame_document_intersection !=
       intersection_state.main_frame_document_intersection) {
+    // Put the main frame document intersection in the coordinate system of the
+    // viewport.
+    IntRect offset_main_frame_intersection =
+        intersection_state.main_frame_document_intersection;
+    offset_main_frame_intersection.MoveBy(
+        IntPoint(intersection_state.viewport_offset));
     Client()->OnMainFrameDocumentIntersectionChanged(
-        intersection_state.main_frame_document_intersection);
+        offset_main_frame_intersection);
   }
 
   bool can_skip_sticky_frame_tracking =
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index edbd25d..5887569 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -3641,12 +3641,6 @@
   }
 }
 
-void LocalFrameView::SetViewportIntersection(
-    const ViewportIntersectionState& intersection_state) {
-  GetFrame().Client()->OnMainFrameDocumentIntersectionChanged(
-      intersection_state.main_frame_document_intersection);
-}
-
 PhysicalOffset LocalFrameView::ViewportToFrame(
     const PhysicalOffset& point_in_viewport) const {
   PhysicalOffset point_in_root_frame = PhysicalOffset::FromFloatPointRound(
@@ -4357,11 +4351,22 @@
   // This is the top-level frame, so no mapping necessary.
   if (frame_->IsMainFrame())
     return true;
-  bool result = rect.InclusiveIntersect(PhysicalRect(
-      apply_overflow_clip ? frame_->RemoteViewportIntersection()
-                          : frame_->RemoteMainFrameDocumentIntersection()));
-  if (result)
+  bool result;
+  if (apply_overflow_clip) {
+    result = rect.InclusiveIntersect(
+        PhysicalRect(frame_->RemoteViewportIntersection()));
+    if (result)
+      rect.Move(PhysicalOffset(GetFrame().RemoteViewportOffset()));
+  } else {
+    // If we are not applying the overflow clip, the mapping should be in the
+    // remote viewport's coordinate system. Map rect to the remote viewport's
+    // coordinate system prior to intersecting.
+    // RemoteMainFrameDocumentIntersection is in the remote viewport's
+    // coordinate system.
     rect.Move(PhysicalOffset(GetFrame().RemoteViewportOffset()));
+    result = rect.InclusiveIntersect(
+        PhysicalRect(frame_->RemoteMainFrameDocumentIntersection()));
+  }
   return result;
 }
 
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index d07e3c35..c66dd9c 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -684,12 +684,13 @@
   void UnregisterFromLifecycleNotifications(LifecycleNotificationObserver*);
 
  protected:
+  bool ShouldReportMainFrameIntersection() const override { return true; }
   void FrameRectsChanged(const IntRect&) override;
   void SelfVisibleChanged() override;
   void ParentVisibleChanged() override;
   void NotifyFrameRectsChangedIfNeeded();
   void SetViewportIntersection(
-      const ViewportIntersectionState& intersection_state) override;
+      const ViewportIntersectionState& intersection_state) override {}
   void VisibilityForThrottlingChanged() override;
   bool LifecycleUpdatesThrottled() const override {
     return lifecycle_updates_throttled_;
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
index 806c356..c6e0e1ab 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/core/events/web_input_event_conversion.h"
 #include "third_party/blink/renderer/core/events/wheel_event.h"
 #include "third_party/blink/renderer/core/exported/web_view_impl.h"
+#include "third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
 #include "third_party/blink/renderer/core/frame/visual_viewport.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
@@ -529,6 +530,25 @@
                                       GetLocalFrameViewForAnimationScrolling());
 }
 
+void WebFrameWidgetBase::BeginFrame(base::TimeTicks frame_time) {
+  widget_base_.BeginMainFrame(frame_time);
+}
+
+void WebFrameWidgetBase::DispatchRafAlignedInput(base::TimeTicks frame_time) {
+  base::TimeTicks raf_aligned_input_start_time;
+  if (LocalRootImpl() && ShouldRecordMainFrameMetrics()) {
+    raf_aligned_input_start_time = base::TimeTicks::Now();
+  }
+
+  Client()->DispatchRafAlignedInput(frame_time);
+
+  if (LocalRootImpl() && ShouldRecordMainFrameMetrics()) {
+    LocalRootImpl()->GetFrame()->View()->EnsureUkmAggregator().RecordSample(
+        LocalFrameUkmAggregator::kHandleInputEvents,
+        raf_aligned_input_start_time, base::TimeTicks::Now());
+  }
+}
+
 void WebFrameWidgetBase::ApplyViewportChangesForTesting(
     const ApplyViewportChangesArgs& args) {
   // TODO(dtapuska): Temporarily just call ApplyViewportChanges.
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_base.h b/third_party/blink/renderer/core/frame/web_frame_widget_base.h
index 4e317b6..e63d1ad 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_base.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_base.h
@@ -22,6 +22,7 @@
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/timer.h"
 #include "third_party/blink/renderer/platform/widget/widget_base.h"
+#include "third_party/blink/renderer/platform/widget/widget_base_client.h"
 #include "third_party/blink/renderer/platform/wtf/casting.h"
 
 namespace cc {
@@ -47,7 +48,8 @@
 
 class CORE_EXPORT WebFrameWidgetBase
     : public GarbageCollected<WebFrameWidgetBase>,
-      public WebFrameWidget {
+      public WebFrameWidget,
+      public WidgetBaseClient {
  public:
   explicit WebFrameWidgetBase(WebWidgetClient&);
   virtual ~WebFrameWidgetBase();
@@ -133,6 +135,10 @@
   void DidNotAcquirePointerLock() override;
   void DidLosePointerLock() override;
   void ShowContextMenu(WebMenuSourceType) override;
+  void BeginFrame(base::TimeTicks frame_time) final;
+
+  // WidgetBaseClient methods.
+  void DispatchRafAlignedInput(base::TimeTicks frame_time) override;
 
   // Image decode functionality.
   void RequestDecode(const PaintImage&, base::OnceCallback<void(bool)>);
@@ -279,7 +285,7 @@
 
   // Base functionality all widgets have. This is a member as to avoid
   // complicated inheritance structures.
-  WidgetBase widget_base_;
+  WidgetBase widget_base_{this};
 
  private:
   void CancelDrag();
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index 86d1e455..3adf286b 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -251,7 +251,7 @@
   GetPage()->Animator().SetSuppressFrameRequestsWorkaroundFor704763Only(
       suppress_frame_requests);
 }
-void WebFrameWidgetImpl::BeginFrame(base::TimeTicks last_frame_time) {
+void WebFrameWidgetImpl::BeginMainFrame(base::TimeTicks last_frame_time) {
   TRACE_EVENT1("blink", "WebFrameWidgetImpl::beginFrame", "frameTime",
                last_frame_time);
   DCHECK(!last_frame_time.is_null());
@@ -261,7 +261,7 @@
 
   DocumentLifecycle::AllowThrottlingScope throttling_scope(
       LocalRootImpl()->GetFrame()->GetDocument()->Lifecycle());
-  if (WebFrameWidgetBase::ShouldRecordMainFrameMetrics()) {
+  if (ShouldRecordMainFrameMetrics()) {
     SCOPED_UMA_AND_UKM_TIMER(
         LocalRootImpl()->GetFrame()->View()->EnsureUkmAggregator(),
         LocalFrameUkmAggregator::kAnimate);
@@ -279,22 +279,6 @@
   PageWidgetDelegate::DidBeginFrame(*LocalRootImpl()->GetFrame());
 }
 
-void WebFrameWidgetImpl::BeginRafAlignedInput() {
-  if (LocalRootImpl()) {
-    raf_aligned_input_start_time_.emplace(base::TimeTicks::Now());
-  }
-}
-
-void WebFrameWidgetImpl::EndRafAlignedInput() {
-  if (LocalRootImpl()) {
-    DCHECK(raf_aligned_input_start_time_);
-    LocalRootImpl()->GetFrame()->View()->EnsureUkmAggregator().RecordSample(
-        LocalFrameUkmAggregator::kHandleInputEvents,
-        raf_aligned_input_start_time_.value(), base::TimeTicks::Now());
-  }
-  raf_aligned_input_start_time_.reset();
-}
-
 void WebFrameWidgetImpl::BeginUpdateLayers() {
   if (LocalRootImpl())
     update_layers_start_time_.emplace(base::TimeTicks::Now());
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index 8a8eae68e..bdeb135 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -80,10 +80,7 @@
   void DidEnterFullscreen() override;
   void DidExitFullscreen() override;
   void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) final;
-  void BeginFrame(base::TimeTicks last_frame_time) override;
   void DidBeginFrame() override;
-  void BeginRafAlignedInput() override;
-  void EndRafAlignedInput() override;
   void BeginUpdateLayers() override;
   void EndUpdateLayers() override;
   void BeginCommitCompositorFrame() override;
@@ -134,6 +131,9 @@
   HitTestResult CoreHitTestResultAt(const gfx::Point&) override;
   void ZoomToFindInPageRect(const WebRect& rect_in_root_frame) override;
 
+  // WidgetBaseClient overrides:
+  void BeginMainFrame(base::TimeTicks last_frame_time) override;
+
   void UpdateMainFrameLayoutSize();
 
   // Event related methods:
@@ -180,7 +180,6 @@
   Member<HTMLPlugInElement> mouse_capture_element_;
 
   // Metrics gathering timing information
-  base::Optional<base::TimeTicks> raf_aligned_input_start_time_;
   base::Optional<base::TimeTicks> update_layers_start_time_;
   base::Optional<base::TimeTicks> commit_compositor_frame_start_time_;
 
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
index 686ccce..b478bb67 100644
--- a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
+++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
@@ -6,6 +6,7 @@
 
 #include "third_party/blink/renderer/core/exported/web_view_impl.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
+#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 
 namespace blink {
 
@@ -51,20 +52,13 @@
   web_view_->SetSuppressFrameRequestsWorkaroundFor704763Only(
       suppress_frame_requests);
 }
-void WebViewFrameWidget::BeginFrame(base::TimeTicks last_frame_time) {
-  web_view_->BeginFrame(last_frame_time);
-}
 
 void WebViewFrameWidget::DidBeginFrame() {
   web_view_->DidBeginFrame();
 }
 
-void WebViewFrameWidget::BeginRafAlignedInput() {
-  web_view_->BeginRafAlignedInput();
-}
-
-void WebViewFrameWidget::EndRafAlignedInput() {
-  web_view_->EndRafAlignedInput();
+void WebViewFrameWidget::BeginMainFrame(base::TimeTicks last_frame_time) {
+  web_view_->BeginFrame(last_frame_time);
 }
 
 void WebViewFrameWidget::BeginUpdateLayers() {
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.h b/third_party/blink/renderer/core/frame/web_view_frame_widget.h
index b9487ab..9cfac00 100644
--- a/third_party/blink/renderer/core/frame/web_view_frame_widget.h
+++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.h
@@ -51,10 +51,7 @@
   void DidEnterFullscreen() override;
   void DidExitFullscreen() override;
   void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) final;
-  void BeginFrame(base::TimeTicks last_frame_time) override;
   void DidBeginFrame() override;
-  void BeginRafAlignedInput() override;
-  void EndRafAlignedInput() override;
   void BeginUpdateLayers() override;
   void EndUpdateLayers() override;
   void BeginCommitCompositorFrame() override;
@@ -96,6 +93,9 @@
   HitTestResult CoreHitTestResultAt(const gfx::Point&) override;
   void ZoomToFindInPageRect(const WebRect& rect_in_root_frame) override;
 
+  // WidgetBaseClient overrides:
+  void BeginMainFrame(base::TimeTicks last_frame_time) override;
+
   void Trace(Visitor*) override;
 
  private:
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
index 586abe8f..7527e93 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
@@ -335,9 +335,6 @@
               .Inverse();
       intersection_rect_ = PhysicalRect::EnclosingRect(
           matrix.ProjectQuad(FloatRect(intersection_rect_)).BoundingBox());
-      unclipped_intersection_rect_ = PhysicalRect::EnclosingRect(
-          matrix.ProjectQuad(FloatRect(unclipped_intersection_rect_))
-              .BoundingBox());
       // intersection_rect_ is in the coordinate system of the implicit root;
       // map it down the to absolute coordinates for the target's document.
     } else {
@@ -348,10 +345,6 @@
           root_geometry.root_to_document_transform
               .MapQuad(FloatQuad(FloatRect(intersection_rect_)))
               .BoundingBox());
-      unclipped_intersection_rect_ = PhysicalRect::EnclosingRect(
-          root_geometry.root_to_document_transform
-              .MapQuad(FloatQuad(FloatRect(unclipped_intersection_rect_)))
-              .BoundingBox());
     }
   } else {
     intersection_rect_ = PhysicalRect();
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h
index 35e33f4..854c98c 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h
@@ -100,6 +100,9 @@
 
   PhysicalRect TargetRect() const { return target_rect_; }
   PhysicalRect IntersectionRect() const { return intersection_rect_; }
+
+  // The intersection rect without applying viewport clipping in the coordinate
+  // system of the root's viewport.
   PhysicalRect UnclippedIntersectionRect() const {
     return unclipped_intersection_rect_;
   }
diff --git a/third_party/blink/renderer/core/loader/font_preload_manager.cc b/third_party/blink/renderer/core/loader/font_preload_manager.cc
index 0901ccd0..66ffa3c 100644
--- a/third_party/blink/renderer/core/loader/font_preload_manager.cc
+++ b/third_party/blink/renderer/core/loader/font_preload_manager.cc
@@ -196,6 +196,11 @@
   render_delay_timeout_ = timeout;
 }
 
+void FontPreloadManager::DisableTimeoutForTest() {
+  if (render_delay_timer_.IsActive())
+    render_delay_timer_.Stop();
+}
+
 void FontPreloadManager::Trace(Visitor* visitor) {
   visitor->Trace(finish_observers_);
   visitor->Trace(document_);
diff --git a/third_party/blink/renderer/core/loader/font_preload_manager.h b/third_party/blink/renderer/core/loader/font_preload_manager.h
index 6d3b0c29..a7e4871 100644
--- a/third_party/blink/renderer/core/loader/font_preload_manager.h
+++ b/third_party/blink/renderer/core/loader/font_preload_manager.h
@@ -49,6 +49,8 @@
  private:
   friend class FontPreloadManagerTest;
 
+  void DisableTimeoutForTest();
+
   // State of font preloading before lifecycle updates begin
   enum class State {
     // Rendering hasn't begun. No font preloading yet.
diff --git a/third_party/blink/renderer/core/loader/font_preload_manager_test.cc b/third_party/blink/renderer/core/loader/font_preload_manager_test.cc
index ef68d5fd..8a25406 100644
--- a/third_party/blink/renderer/core/loader/font_preload_manager_test.cc
+++ b/third_party/blink/renderer/core/loader/font_preload_manager_test.cc
@@ -38,6 +38,10 @@
   using State = FontPreloadManager::State;
   State GetState() { return GetFontPreloadManager().state_; }
 
+  void DisableFontPreloadManagerTimeout() {
+    GetFontPreloadManager().DisableTimeoutForTest();
+  }
+
   Element* GetTarget() { return GetDocument().getElementById("target"); }
 
   const Font& GetTargetFont() {
@@ -369,6 +373,10 @@
   EXPECT_TRUE(GetFontPreloadManager().HasPendingRenderBlockingFonts());
   EXPECT_EQ(State::kLoading, GetState());
 
+  // There are test flakes due to FontPreloadManager timeout firing before the
+  // ResourceFinishObserver gets notified. So we disable the timeout.
+  DisableFontPreloadManagerTimeout();
+
   font_resource.Complete(ReadAhemWoff2());
   test::RunPendingTasks();
 
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 1bd9250..61275b91 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -700,8 +700,7 @@
   mojo::PendingRemote<mojom::blink::NavigationInitiator> navigation_initiator;
   WTF::Vector<network::mojom::blink::ContentSecurityPolicyPtr> initiator_csp;
   network::mojom::blink::CSPSourcePtr initiator_self_source;
-  if (origin_document && origin_document->GetContentSecurityPolicy()
-                             ->ExperimentalFeaturesEnabled()) {
+  if (origin_document) {
     initiator_csp = origin_document->GetContentSecurityPolicy()
                         ->ExposeForNavigationalChecks();
     initiator_self_source = origin_document->GetContentSecurityPolicy()
diff --git a/third_party/blink/renderer/core/workers/worker_backing_thread.cc b/third_party/blink/renderer/core/workers/worker_backing_thread.cc
index ea7ba504..d0313a3 100644
--- a/third_party/blink/renderer/core/workers/worker_backing_thread.cc
+++ b/third_party/blink/renderer/core/workers/worker_backing_thread.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/location.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/web/blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
@@ -83,7 +84,8 @@
   V8PerIsolateData::From(isolate_)->SetThreadDebugger(
       std::make_unique<WorkerThreadDebugger>(isolate_));
 
-  if (!RuntimeEnabledFeatures::V8OptimizeWorkersForPerformanceEnabled()) {
+  if (!base::FeatureList::IsEnabled(
+          features::kV8OptimizeWorkersForPerformance)) {
     // Optimize for memory usage instead of latency for the worker isolate.
     // Service Workers that have the fetch event handler run with the Isolate
     // in foreground notification regardless of this configuration.
diff --git a/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc b/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc
index 92e9f73..5de26fc 100644
--- a/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc
+++ b/third_party/blink/renderer/core/xml/parser/xml_document_parser.cc
@@ -377,7 +377,7 @@
   if (!leaf_text_node_)
     return true;
 
-  leaf_text_node_->appendData(
+  leaf_text_node_->ParserAppendData(
       ToString(buffered_text_.data(), buffered_text_.size()));
   buffered_text_.clear();
   leaf_text_node_ = nullptr;
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index 3fea420..fbbf704 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -135,7 +135,6 @@
     "//third_party/blink/renderer/modules/sensor",
     "//third_party/blink/renderer/modules/service_worker",
     "//third_party/blink/renderer/modules/shapedetection",
-    "//third_party/blink/renderer/modules/sms",
     "//third_party/blink/renderer/modules/speech",
     "//third_party/blink/renderer/modules/srcobject",
     "//third_party/blink/renderer/modules/storage",
diff --git a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc
index 007bc122..27c3ffa 100644
--- a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc
@@ -242,19 +242,16 @@
                   Vector<NameValueStringConstraint>& mandatory) {
   Vector<NameValueStringConstraint> mandatory_constraints_vector;
   if (constraints_in->hasMandatory()) {
-    bool ok = ParseMandatoryConstraintsDictionary(constraints_in->mandatory(),
-                                                  mandatory);
+    bool ok = ParseMandatoryConstraintsDictionary(
+        Dictionary(constraints_in->mandatory()), mandatory);
     if (!ok)
       return false;
   }
 
   if (constraints_in->hasOptional()) {
-    const Vector<Dictionary>& optional_constraints = constraints_in->optional();
-
-    for (const auto& constraint : optional_constraints) {
-      if (constraint.IsUndefinedOrNull())
-        return false;
-      bool ok = ParseOptionalConstraintsVectorElement(constraint, optional);
+    for (const auto& constraint : constraints_in->optional()) {
+      bool ok = ParseOptionalConstraintsVectorElement(Dictionary(constraint),
+                                                      optional);
       if (!ok)
         return false;
     }
diff --git a/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl b/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl
index 64ec474..3368c0a 100644
--- a/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl
+++ b/third_party/blink/renderer/modules/mediastream/media_track_constraint_set.idl
@@ -54,6 +54,6 @@
     ConstrainBoolean   torch;
     // The "mandatory" and "_optional" members are retained for conformance
     // with https://www.w3.org/TR/2013/WD-mediacapture-streams-20130903/
-    Dictionary mandatory;
-    sequence<Dictionary> _optional;
+    object mandatory;
+    sequence<object> _optional;
 };
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
index 1d30194..771dab9b 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
@@ -190,7 +190,7 @@
  public:
   ReusableMessageLoopEvent() : event_(new media::WaitableMessageLoopEvent()) {}
 
-  base::RepeatingClosure GetClosure() const { return event_->GetClosure(); }
+  base::OnceClosure GetClosure() const { return event_->GetClosure(); }
 
   media::PipelineStatusCallback GetPipelineStatusCB() const {
     return event_->GetPipelineStatusCB();
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni
index c23e2dd4..60366fc8 100644
--- a/third_party/blink/renderer/modules/modules_idl_files.gni
+++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -107,7 +107,6 @@
   "//third_party/blink/renderer/modules/sensor/idls.gni",
   "//third_party/blink/renderer/modules/service_worker/idls.gni",
   "//third_party/blink/renderer/modules/shapedetection/idls.gni",
-  "//third_party/blink/renderer/modules/sms/idls.gni",
   "//third_party/blink/renderer/modules/speech/idls.gni",
   "//third_party/blink/renderer/modules/srcobject/idls.gni",
   "//third_party/blink/renderer/modules/storage/idls.gni",
diff --git a/third_party/blink/renderer/modules/sms/BUILD.gn b/third_party/blink/renderer/modules/sms/BUILD.gn
deleted file mode 100644
index 6e270728..0000000
--- a/third_party/blink/renderer/modules/sms/BUILD.gn
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2019 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/blink/renderer/modules/modules.gni")
-
-blink_modules_sources("sms") {
-  sources = [
-    "navigator_sms.cc",
-    "navigator_sms.h",
-    "sms.cc",
-    "sms.h",
-    "sms_metrics.cc",
-    "sms_metrics.h",
-    "sms_receiver.cc",
-    "sms_receiver.h",
-  ]
-}
diff --git a/third_party/blink/renderer/modules/sms/DEPS b/third_party/blink/renderer/modules/sms/DEPS
deleted file mode 100644
index c7b1c0d..0000000
--- a/third_party/blink/renderer/modules/sms/DEPS
+++ /dev/null
@@ -1,9 +0,0 @@
-include_rules = [
-    "+services/metrics/public/cpp/ukm_builders.h",
-    "+services/metrics/public/cpp/ukm_source_id.h",
-    "-third_party/blink/renderer/modules",
-    "+third_party/blink/renderer/modules/event_modules.h",
-    "+third_party/blink/renderer/modules/event_target_modules.h",
-    "+third_party/blink/renderer/modules/modules_export.h",
-    "+third_party/blink/renderer/modules/sms",
-]
diff --git a/third_party/blink/renderer/modules/sms/OWNERS b/third_party/blink/renderer/modules/sms/OWNERS
deleted file mode 100644
index 39f063f..0000000
--- a/third_party/blink/renderer/modules/sms/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-file://content/browser/sms/OWNERS
-
-# COMPONENT: Blink>SMS
-# TEAM: fugu-dev@chromium.org
diff --git a/third_party/blink/renderer/modules/sms/README.md b/third_party/blink/renderer/modules/sms/README.md
deleted file mode 100644
index b2f0832..0000000
--- a/third_party/blink/renderer/modules/sms/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# SMS Receiver API
-
-This directory contains code for the renderer side implementation of the SMS Receiver API. For more details, refer to [this README file](https://cs.chromium.org/chromium/src/content/browser/sms/README.md).
diff --git a/third_party/blink/renderer/modules/sms/idls.gni b/third_party/blink/renderer/modules/sms/idls.gni
deleted file mode 100644
index a2491bc4..0000000
--- a/third_party/blink/renderer/modules/sms/idls.gni
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2020 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-modules_idl_files = [
-  "sms.idl",
-  "sms_receiver.idl",
-]
-
-modules_dictionary_idl_files = [ "sms_receiver_options.idl" ]
-
-modules_dependency_idl_files = [ "navigator_sms.idl" ]
diff --git a/third_party/blink/renderer/modules/sms/navigator_sms.cc b/third_party/blink/renderer/modules/sms/navigator_sms.cc
deleted file mode 100644
index f6a81ef..0000000
--- a/third_party/blink/renderer/modules/sms/navigator_sms.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/modules/sms/navigator_sms.h"
-
-#include "third_party/blink/renderer/core/frame/navigator.h"
-#include "third_party/blink/renderer/modules/sms/sms_receiver.h"
-#include "third_party/blink/renderer/platform/bindings/script_state.h"
-
-namespace blink {
-
-NavigatorSMS::NavigatorSMS(Navigator& navigator)
-    : Supplement<Navigator>(navigator) {}
-
-const char NavigatorSMS::kSupplementName[] = "NavigatorSMS";
-
-NavigatorSMS& NavigatorSMS::From(Navigator& navigator) {
-  NavigatorSMS* supplement =
-      Supplement<Navigator>::From<NavigatorSMS>(navigator);
-  if (!supplement) {
-    supplement = MakeGarbageCollected<NavigatorSMS>(navigator);
-    Supplement<Navigator>::ProvideTo(navigator, supplement);
-  }
-  return *supplement;
-}
-
-SMSReceiver* NavigatorSMS::GetSMSReceiver(ScriptState* script_state) {
-  if (!sms_receiver_) {
-    sms_receiver_ =
-        MakeGarbageCollected<SMSReceiver>(ExecutionContext::From(script_state));
-  }
-  return sms_receiver_.Get();
-}
-
-SMSReceiver* NavigatorSMS::sms(ScriptState* script_state,
-                               Navigator& navigator) {
-  return NavigatorSMS::From(navigator).GetSMSReceiver(script_state);
-}
-
-void NavigatorSMS::Trace(Visitor* visitor) {
-  visitor->Trace(sms_receiver_);
-  Supplement<Navigator>::Trace(visitor);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/modules/sms/navigator_sms.h b/third_party/blink/renderer/modules/sms/navigator_sms.h
deleted file mode 100644
index 4f1a700..0000000
--- a/third_party/blink/renderer/modules/sms/navigator_sms.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_NAVIGATOR_SMS_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_NAVIGATOR_SMS_H_
-
-#include "third_party/blink/renderer/core/frame/navigator.h"
-#include "third_party/blink/renderer/platform/heap/handle.h"
-#include "third_party/blink/renderer/platform/supplementable.h"
-
-namespace blink {
-
-class Navigator;
-class ScriptState;
-class SMSReceiver;
-
-class NavigatorSMS final : public GarbageCollected<NavigatorSMS>,
-                           public Supplement<Navigator> {
-  USING_GARBAGE_COLLECTED_MIXIN(NavigatorSMS);
-
- public:
-  static const char kSupplementName[];
-
-  static NavigatorSMS& From(Navigator&);
-
-  static SMSReceiver* sms(ScriptState*, Navigator&);
-
-  explicit NavigatorSMS(Navigator&);
-
-  void Trace(Visitor*) override;
-
- private:
-  SMSReceiver* GetSMSReceiver(ScriptState*);
-
-  Member<SMSReceiver> sms_receiver_;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_NAVIGATOR_SMS_H_
diff --git a/third_party/blink/renderer/modules/sms/navigator_sms.idl b/third_party/blink/renderer/modules/sms/navigator_sms.idl
deleted file mode 100644
index b979116..0000000
--- a/third_party/blink/renderer/modules/sms/navigator_sms.idl
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// https://github.com/samuelgoto/sms-receiver
-
-[
-  SecureContext,
-  Exposed=Window,
-  ImplementedAs=NavigatorSMS,
-  RuntimeEnabled=SmsReceiver
-] partial interface Navigator {
-  [CallWith=ScriptState] readonly attribute SMSReceiver sms;
-};
diff --git a/third_party/blink/renderer/modules/sms/sms.cc b/third_party/blink/renderer/modules/sms/sms.cc
deleted file mode 100644
index 9bdcc1a..0000000
--- a/third_party/blink/renderer/modules/sms/sms.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/modules/sms/sms.h"
-
-#include <utility>
-
-namespace blink {
-
-SMS::SMS(const WTF::String& content) : content_(content) {}
-
-SMS::~SMS() = default;
-
-const String& SMS::content() const {
-  return content_;
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/modules/sms/sms.h b/third_party/blink/renderer/modules/sms/sms.h
deleted file mode 100644
index 3fac1377..0000000
--- a/third_party/blink/renderer/modules/sms/sms.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_H_
-
-#include "base/macros.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
-
-namespace blink {
-
-class SMS final : public ScriptWrappable {
-  DEFINE_WRAPPERTYPEINFO();
-
- public:
-  // |content| is the raw content of the SMS message.
-  explicit SMS(const WTF::String& content);
-
-  ~SMS() override;
-
-  // Sms IDL interface.
-  const String& content() const;
-
- private:
-  const String content_;
-
-  DISALLOW_COPY_AND_ASSIGN(SMS);
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_H_
diff --git a/third_party/blink/renderer/modules/sms/sms.idl b/third_party/blink/renderer/modules/sms/sms.idl
deleted file mode 100644
index a3c624b..0000000
--- a/third_party/blink/renderer/modules/sms/sms.idl
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// https://github.com/samuelgoto/sms-receiver
-
-[
-  SecureContext,
-  Exposed=(Window,DedicatedWorker),
-  RuntimeEnabled=SmsReceiver]
-interface SMS {
-  readonly attribute DOMString content;
-};
diff --git a/third_party/blink/renderer/modules/sms/sms_metrics.cc b/third_party/blink/renderer/modules/sms/sms_metrics.cc
deleted file mode 100644
index 2c966476..0000000
--- a/third_party/blink/renderer/modules/sms/sms_metrics.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/modules/sms/sms_metrics.h"
-
-#include "base/metrics/histogram_macros.h"
-#include "services/metrics/public/cpp/ukm_builders.h"
-
-namespace blink {
-
-void RecordSMSOutcome(SMSReceiverOutcome outcome,
-                      ukm::SourceId source_id,
-                      ukm::UkmRecorder* ukm_recorder) {
-  DCHECK_NE(source_id, ukm::kInvalidSourceId);
-  DCHECK(ukm_recorder);
-
-  ukm::builders::SMSReceiver builder(source_id);
-  builder.SetOutcome(static_cast<int>(outcome));
-  builder.Record(ukm_recorder);
-
-  UMA_HISTOGRAM_ENUMERATION("Blink.Sms.Receive.Outcome", outcome);
-}
-
-void RecordSMSSuccessTime(base::TimeDelta duration) {
-  UMA_HISTOGRAM_MEDIUM_TIMES("Blink.Sms.Receive.TimeSuccess", duration);
-}
-
-void RecordSMSCancelTime(base::TimeDelta duration) {
-  UMA_HISTOGRAM_MEDIUM_TIMES("Blink.Sms.Receive.TimeCancel", duration);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/modules/sms/sms_metrics.h b/third_party/blink/renderer/modules/sms/sms_metrics.h
deleted file mode 100644
index 526da7e..0000000
--- a/third_party/blink/renderer/modules/sms/sms_metrics.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_METRICS_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_METRICS_H_
-
-#include <stdint.h>
-
-#include "services/metrics/public/cpp/ukm_source_id.h"
-#include "third_party/blink/public/common/sms/sms_receiver_outcome.h"
-
-namespace base {
-class TimeDelta;
-}  // namespace base
-
-namespace ukm {
-class UkmRecorder;
-}  // namespace ukm
-
-namespace blink {
-
-// Records the result of a call to the SMSReceiver API.
-void RecordSMSOutcome(SMSReceiverOutcome outcome,
-                      ukm::SourceId source_id,
-                      ukm::UkmRecorder* ukm_recorder);
-
-// Records the time from when the API is called to when the user successfully
-// receives the SMS and presses continue to move on with the verification flow.
-void RecordSMSSuccessTime(base::TimeDelta duration);
-
-// Records the time from when the API is called to when the user presses the
-// cancel button to abort SMS retrieval.
-void RecordSMSCancelTime(base::TimeDelta duration);
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_METRICS_H_
diff --git a/third_party/blink/renderer/modules/sms/sms_receiver.cc b/third_party/blink/renderer/modules/sms/sms_receiver.cc
deleted file mode 100644
index 60f7ad31..0000000
--- a/third_party/blink/renderer/modules/sms/sms_receiver.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include "third_party/blink/renderer/modules/sms/sms_receiver.h"
-
-#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
-#include "third_party/blink/public/mojom/sms/sms_receiver.mojom-blink.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
-#include "third_party/blink/renderer/bindings/modules/v8/v8_sms_receiver_options.h"
-#include "third_party/blink/renderer/core/dom/abort_signal.h"
-#include "third_party/blink/renderer/core/dom/document.h"
-#include "third_party/blink/renderer/core/dom/dom_exception.h"
-#include "third_party/blink/renderer/core/frame/local_frame.h"
-#include "third_party/blink/renderer/modules/sms/sms.h"
-#include "third_party/blink/renderer/modules/sms/sms_metrics.h"
-#include "third_party/blink/renderer/platform/bindings/name_client.h"
-#include "third_party/blink/renderer/platform/bindings/script_state.h"
-#include "third_party/blink/renderer/platform/heap/heap.h"
-#include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/wtf/functional.h"
-
-namespace blink {
-
-SMSReceiver::SMSReceiver(ExecutionContext* context)
-    : ExecutionContextClient(context) {}
-
-SMSReceiver::~SMSReceiver() = default;
-
-ScriptPromise SMSReceiver::receive(ScriptState* script_state,
-                                   const SMSReceiverOptions* options,
-                                   ExceptionState& exception_state) {
-  ExecutionContext* context = ExecutionContext::From(script_state);
-  DCHECK(context->IsContextThread());
-
-  LocalFrame* frame = GetFrame();
-  if (!frame) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError,
-                                      "Script context has shut down.");
-    return ScriptPromise();
-  }
-
-  if (!frame->IsMainFrame() && frame->IsCrossOriginToMainFrame()) {
-    exception_state.ThrowDOMException(
-        DOMExceptionCode::kNotAllowedError,
-        "Must have the same origin as the top-level frame.");
-    return ScriptPromise();
-  }
-
-  if (options->hasSignal() && options->signal()->aborted()) {
-    RecordSMSOutcome(SMSReceiverOutcome::kAborted, GetDocument()->UkmSourceID(),
-                     GetDocument()->UkmRecorder());
-    exception_state.ThrowDOMException(DOMExceptionCode::kAbortError,
-                                      "Request has been aborted.");
-    return ScriptPromise();
-  }
-
-  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
-
-  if (options->hasSignal()) {
-    options->signal()->AddAlgorithm(WTF::Bind(&SMSReceiver::Abort,
-                                              WrapWeakPersistent(this),
-                                              WrapPersistent(resolver)));
-  }
-
-  requests_.insert(resolver);
-
-  // See https://bit.ly/2S0zRAS for task types.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner =
-      GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI);
-
-  if (!service_) {
-    GetExecutionContext()->GetBrowserInterfaceBroker().GetInterface(
-        service_.BindNewPipeAndPassReceiver(task_runner));
-    service_.set_disconnect_handler(WTF::Bind(
-        &SMSReceiver::OnSMSReceiverConnectionError, WrapWeakPersistent(this)));
-  }
-
-  service_->Receive(
-      WTF::Bind(&SMSReceiver::OnReceive, WrapPersistent(this),
-                WrapPersistent(resolver), base::TimeTicks::Now()));
-
-  return resolver->Promise();
-}
-
-void SMSReceiver::Abort(ScriptPromiseResolver* resolver) {
-  RecordSMSOutcome(SMSReceiverOutcome::kAborted, GetDocument()->UkmSourceID(),
-                   GetDocument()->UkmRecorder());
-  service_->Abort();
-
-  resolver->Reject(
-      MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
-
-  requests_.erase(resolver);
-}
-
-void SMSReceiver::OnReceive(ScriptPromiseResolver* resolver,
-                            base::TimeTicks start_time,
-                            mojom::blink::SmsStatus status,
-                            const WTF::String& otp,
-                            const WTF::String& sms) {
-  requests_.erase(resolver);
-
-  ukm::SourceId source_id = GetDocument()->UkmSourceID();
-  ukm::UkmRecorder* recorder = GetDocument()->UkmRecorder();
-
-  if (status == mojom::blink::SmsStatus::kTimeout) {
-    resolver->Reject(MakeGarbageCollected<DOMException>(
-        DOMExceptionCode::kTimeoutError, "SMSReceiver timed out."));
-    RecordSMSOutcome(SMSReceiverOutcome::kTimeout, source_id, recorder);
-    return;
-  } else if (status == mojom::blink::SmsStatus::kCancelled) {
-    resolver->Reject(MakeGarbageCollected<DOMException>(
-        DOMExceptionCode::kAbortError, "SMSReceiver was aborted."));
-    RecordSMSCancelTime(base::TimeTicks::Now() - start_time);
-    RecordSMSOutcome(SMSReceiverOutcome::kCancelled, source_id, recorder);
-    return;
-  }
-
-  RecordSMSSuccessTime(base::TimeTicks::Now() - start_time);
-  RecordSMSOutcome(SMSReceiverOutcome::kSuccess, source_id, recorder);
-
-  resolver->Resolve(MakeGarbageCollected<blink::SMS>(sms));
-}
-
-void SMSReceiver::OnSMSReceiverConnectionError() {
-  service_.reset();
-  for (ScriptPromiseResolver* request : requests_) {
-    request->Reject(MakeGarbageCollected<DOMException>(
-        DOMExceptionCode::kNotFoundError, "SMSReceiver not available."));
-    RecordSMSOutcome(SMSReceiverOutcome::kConnectionError,
-                     GetDocument()->UkmSourceID(),
-                     GetDocument()->UkmRecorder());
-  }
-  requests_.clear();
-}
-
-void SMSReceiver::Trace(Visitor* visitor) {
-  ScriptWrappable::Trace(visitor);
-  ExecutionContextClient::Trace(visitor);
-  visitor->Trace(requests_);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/modules/sms/sms_receiver.h b/third_party/blink/renderer/modules/sms/sms_receiver.h
deleted file mode 100644
index 65a535d0..0000000
--- a/third_party/blink/renderer/modules/sms/sms_receiver.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_RECEIVER_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_RECEIVER_H_
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "third_party/blink/public/mojom/sms/sms_receiver.mojom-blink.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
-#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
-
-namespace blink {
-
-class SMSReceiverOptions;
-class ScriptPromiseResolver;
-
-class SMSReceiver final : public ScriptWrappable,
-                          public ExecutionContextClient {
-  USING_GARBAGE_COLLECTED_MIXIN(SMSReceiver);
-  DEFINE_WRAPPERTYPEINFO();
-
- public:
-  explicit SMSReceiver(ExecutionContext*);
-
-  ~SMSReceiver() override;
-
-  // SMSReceiver IDL interface.
-  ScriptPromise receive(ScriptState*,
-                        const SMSReceiverOptions*,
-                        ExceptionState&);
-
-  void Trace(Visitor*) override;
-
- private:
-  HeapHashSet<Member<ScriptPromiseResolver>> requests_;
-
-  void Abort(ScriptPromiseResolver* resolver);
-
-  void OnReceive(ScriptPromiseResolver* resolver,
-                 base::TimeTicks start_time,
-                 mojom::blink::SmsStatus status,
-                 const WTF::String& otp,
-                 const WTF::String& sms);
-
-  void OnSMSReceiverConnectionError();
-
-  mojo::Remote<mojom::blink::SmsReceiver> service_;
-
-  DISALLOW_COPY_AND_ASSIGN(SMSReceiver);
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_SMS_SMS_RECEIVER_H_
diff --git a/third_party/blink/renderer/modules/sms/sms_receiver.idl b/third_party/blink/renderer/modules/sms/sms_receiver.idl
deleted file mode 100644
index de97504..0000000
--- a/third_party/blink/renderer/modules/sms/sms_receiver.idl
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// https://github.com/samuelgoto/sms-receiver
-
-[
-  SecureContext,
-  Exposed=Window,
-  RuntimeEnabled=SmsReceiver
-] interface SMSReceiver {
-  [CallWith=ScriptState, RaisesException, MeasureAs=SMSReceiverStart]
-  Promise<SMS> receive(optional SMSReceiverOptions options = {});
-};
diff --git a/third_party/blink/renderer/modules/sms/sms_receiver_options.idl b/third_party/blink/renderer/modules/sms/sms_receiver_options.idl
deleted file mode 100644
index c77820d9..0000000
--- a/third_party/blink/renderer/modules/sms/sms_receiver_options.idl
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// https://github.com/samuelgoto/sms-receiver
-
-dictionary SMSReceiverOptions {
-  AbortSignal signal;
-};
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index 56e35749..b136fb2e 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1444,6 +1444,7 @@
     "webrtc/webrtc_video_utils.h",
     "widget/widget_base.cc",
     "widget/widget_base.h",
+    "widget/widget_base_client.h",
     "windows_keyboard_codes.h",
   ]
 
diff --git a/third_party/blink/renderer/platform/bindings/v8_binding.h b/third_party/blink/renderer/platform/bindings/v8_binding.h
index c11a8996..ba23a62 100644
--- a/third_party/blink/renderer/platform/bindings/v8_binding.h
+++ b/third_party/blink/renderer/platform/bindings/v8_binding.h
@@ -103,6 +103,11 @@
 }
 
 template <typename CallbackInfo>
+inline void V8SetReturnValue(const CallbackInfo& info, uint64_t value) {
+  info.GetReturnValue().Set(static_cast<double>(value));
+}
+
+template <typename CallbackInfo>
 inline void V8SetReturnValueBool(const CallbackInfo& info, bool v) {
   info.GetReturnValue().Set(v);
 }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 0b0d7499..ee459895 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -246,7 +246,7 @@
     },
     {
       name: "BlockingDownloadsInSandbox",
-      status: "test",
+      status: "stable",
     },
     {
       name: "BlockingFocusWithoutUserActivation",
@@ -1740,10 +1740,6 @@
       name: "V8IdleTasks",
     },
     {
-      name: "V8OptimizeWorkersForPerformance",
-      status: "experimental",
-    },
-    {
       // Whether a video element should automatically play fullscreen unless
       // 'playsinline' is set.
       name: "VideoAutoFullscreen",
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc
index 97205f6..e5b50445 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.cc
+++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -4,9 +4,11 @@
 
 #include "third_party/blink/renderer/platform/widget/widget_base.h"
 
+#include "third_party/blink/renderer/platform/widget/widget_base_client.h"
+
 namespace blink {
 
-WidgetBase::WidgetBase() = default;
+WidgetBase::WidgetBase(WidgetBaseClient* client) : client_(client) {}
 
 WidgetBase::~WidgetBase() = default;
 
@@ -24,4 +26,9 @@
   return animation_host_;
 }
 
+void WidgetBase::BeginMainFrame(base::TimeTicks frame_time) {
+  client_->DispatchRafAlignedInput(frame_time);
+  client_->BeginMainFrame(frame_time);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h
index 5733406..a4bc0c3 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.h
+++ b/third_party/blink/renderer/platform/widget/widget_base.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_H_
 
+#include "base/time/time.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 
 namespace cc {
@@ -13,6 +14,7 @@
 }  // namespace cc
 
 namespace blink {
+class WidgetBaseClient;
 
 // This class is the foundational class for all widgets that blink creates.
 // (WebPagePopupImpl, WebFrameWidgetBase) will contain an instance of this
@@ -21,7 +23,7 @@
 // https://docs.google.com/document/d/10uBnSWBaitGsaROOYO155Wb83rjOPtrgrGTrQ_pcssY/edit?ts=5e3b26f7
 class PLATFORM_EXPORT WidgetBase {
  public:
-  WidgetBase();
+  explicit WidgetBase(WidgetBaseClient* client);
   virtual ~WidgetBase();
 
   // Set the current compositor hosts.
@@ -30,10 +32,15 @@
   cc::AnimationHost* AnimationHost() const;
   cc::LayerTreeHost* LayerTreeHost() const;
 
+  // Called to update the document lifecycle, advance the state of animations
+  // and dispatch rAF.
+  void BeginMainFrame(base::TimeTicks frame_time);
+
  private:
   // Not owned, they are owned by the RenderWidget.
   cc::LayerTreeHost* layer_tree_host_ = nullptr;
   cc::AnimationHost* animation_host_ = nullptr;
+  WidgetBaseClient* client_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/widget/widget_base_client.h b/third_party/blink/renderer/platform/widget/widget_base_client.h
new file mode 100644
index 0000000..ed9fde5a
--- /dev/null
+++ b/third_party/blink/renderer/platform/widget/widget_base_client.h
@@ -0,0 +1,28 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_CLIENT_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_CLIENT_H_
+
+#include "base/time/time.h"
+
+namespace blink {
+
+// This class is part of the foundation of all widgets. It provides
+// callbacks from the compositing infrastructure that the individual widgets
+// will need to implement.
+class WidgetBaseClient {
+ public:
+  // Dispatch any pending input. This method will called before
+  // dispatching a RequestAnimationFrame to the widget.
+  virtual void DispatchRafAlignedInput(base::TimeTicks frame_time) = 0;
+
+  // Called to update the document lifecycle, advance the state of animations
+  // and dispatch rAF.
+  virtual void BeginMainFrame(base::TimeTicks frame_time) = 0;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WIDGET_WIDGET_BASE_CLIENT_H_
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set.h b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
index a9b8031..257d2d6 100644
--- a/third_party/blink/renderer/platform/wtf/linked_hash_set.h
+++ b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
@@ -1088,11 +1088,20 @@
   template <typename IncomingValueType>
   AddResult insert(IncomingValueType&&);
 
+  template <typename IncomingValueType>
+  AddResult AppendOrMoveToLast(IncomingValueType&&);
+
+  template <typename IncomingValueType>
+  AddResult PrependOrMoveToFirst(IncomingValueType&&);
+
   // TODO(keinakashima): implement functions related to erase
 
   // TODO(keinakashima): implement clear (,RemoveAll, Trace)
 
  private:
+  template <typename IncomingValueType>
+  AddResult InsertOrMoveBefore(const_iterator, IncomingValueType&&);
+
   HashMap<Value, wtf_size_t> value_to_index_;
   VectorBackedLinkedList<Value> list_;
 };
@@ -1149,6 +1158,41 @@
   return AddResult(stored_position_iterator.Get(), false);
 }
 
+template <typename T>
+template <typename IncomingValueType>
+typename NewLinkedHashSet<T>::AddResult NewLinkedHashSet<T>::AppendOrMoveToLast(
+    IncomingValueType&& value) {
+  return InsertOrMoveBefore(end(), std::forward<IncomingValueType>(value));
+}
+
+template <typename T>
+template <typename IncomingValueType>
+typename NewLinkedHashSet<T>::AddResult
+NewLinkedHashSet<T>::PrependOrMoveToFirst(IncomingValueType&& value) {
+  return InsertOrMoveBefore(begin(), std::forward<IncomingValueType>(value));
+}
+
+template <typename T>
+template <typename IncomingValueType>
+typename NewLinkedHashSet<T>::AddResult NewLinkedHashSet<T>::InsertOrMoveBefore(
+    const_iterator position,
+    IncomingValueType&& value) {
+  typename Map::AddResult result = value_to_index_.insert(value, kNotFound);
+
+  if (result.is_new_entry) {
+    const_iterator stored_position_iterator =
+        list_.insert(position, std::forward<IncomingValueType>(value));
+    result.stored_value->value = stored_position_iterator.GetIndex();
+    return AddResult(stored_position_iterator.Get(), true);
+  }
+
+  const_iterator stored_position_iterator =
+      list_.MakeConstIterator(result.stored_value->value);
+  const_iterator moved_position_iterator =
+      list_.MoveTo(stored_position_iterator, position);
+  return AddResult(moved_position_iterator.Get(), false);
+}
+
 }  // namespace WTF
 
 using WTF::LinkedHashSet;
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc b/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc
index 0506316..905f96f 100644
--- a/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc
+++ b/third_party/blink/renderer/platform/wtf/linked_hash_set_test.cc
@@ -54,4 +54,58 @@
   EXPECT_TRUE(it == set.end());
 }
 
+TEST(NewLinkedHashSetTest, AppendOrMoveToLast) {
+  using Set = NewLinkedHashSet<int>;
+  Set set;
+  Set::AddResult result = set.AppendOrMoveToLast(1);
+  EXPECT_TRUE(result.is_new_entry);
+  EXPECT_EQ(*result.stored_value, 1);
+
+  result = set.AppendOrMoveToLast(2);
+  EXPECT_TRUE(result.is_new_entry);
+  EXPECT_EQ(*result.stored_value, 2);
+
+  result = set.AppendOrMoveToLast(1);
+  EXPECT_FALSE(result.is_new_entry);
+  EXPECT_EQ(*result.stored_value, 1);
+
+  result = set.AppendOrMoveToLast(3);
+  EXPECT_TRUE(result.is_new_entry);
+  EXPECT_EQ(*result.stored_value, 3);
+
+  Set::const_iterator it = set.begin();
+  EXPECT_EQ(*it, 2);
+  ++it;
+  EXPECT_EQ(*it, 1);
+  ++it;
+  EXPECT_EQ(*it, 3);
+}
+
+TEST(NewLinkedHashSetTest, PrependOrMoveToFirst) {
+  using Set = NewLinkedHashSet<int>;
+  Set set;
+  Set::AddResult result = set.PrependOrMoveToFirst(1);
+  EXPECT_TRUE(result.is_new_entry);
+  EXPECT_EQ(*result.stored_value, 1);
+
+  result = set.PrependOrMoveToFirst(2);
+  EXPECT_TRUE(result.is_new_entry);
+  EXPECT_EQ(*result.stored_value, 2);
+
+  result = set.PrependOrMoveToFirst(1);
+  EXPECT_FALSE(result.is_new_entry);
+  EXPECT_EQ(*result.stored_value, 1);
+
+  result = set.PrependOrMoveToFirst(3);
+  EXPECT_TRUE(result.is_new_entry);
+  EXPECT_EQ(*result.stored_value, 3);
+
+  Set::const_iterator it = set.begin();
+  EXPECT_EQ(*it, 3);
+  ++it;
+  EXPECT_EQ(*it, 1);
+  ++it;
+  EXPECT_EQ(*it, 2);
+}
+
 }  // namespace WTF
diff --git a/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h b/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h
index e87d48c..91cbb31 100644
--- a/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h
+++ b/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h
@@ -127,7 +127,7 @@
 
   // Moves |target| right before |new_position| in a linked list. This operation
   // is executed by just updating indices of related nodes.
-  void MoveTo(const_iterator target, const_iterator new_position);
+  iterator MoveTo(const_iterator target, const_iterator new_position);
 
   iterator erase(const_iterator);
 
@@ -472,21 +472,23 @@
 }
 
 template <typename T>
-void VectorBackedLinkedList<T>::MoveTo(const_iterator target,
-                                       const_iterator new_position) {
+typename VectorBackedLinkedList<T>::iterator VectorBackedLinkedList<T>::MoveTo(
+    const_iterator target,
+    const_iterator new_position) {
   DCHECK(target != end());
   RegisterModification();
-  if (target == new_position)
-    return;
 
   wtf_size_t target_index = target.GetIndex();
+  if (target == new_position)
+    return MakeIterator(target_index);
+
   Node& target_node = nodes_[target_index];
   wtf_size_t new_position_index = new_position.GetIndex();
   Node& new_position_node = nodes_[new_position_index];
   wtf_size_t prev_index = new_position_node.prev_index_;
 
   if (prev_index == target_index)
-    return;
+    return MakeIterator(target_index);
 
   Unlink(target_node);
 
@@ -494,6 +496,7 @@
   new_position_node.prev_index_ = target_index;
   target_node.prev_index_ = prev_index;
   target_node.next_index_ = new_position_index;
+  return MakeIterator(target_index);
 }
 
 template <typename T>
diff --git a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
index d87ac39..2a05d2ee6 100644
--- a/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
+++ b/third_party/blink/web_tests/FlagExpectations/layout-ng-fragment-item
@@ -1007,253 +1007,7 @@
 crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ Failure ]
 crbug.com/982194 virtual/gpu/fast/canvas/canvas-ellipse-circumference.html [ Failure ]
 crbug.com/866850 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Failure Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/fieldset-001.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/floats-and-text-narrow-and-short-dynamic.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-001.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-002.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-003.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-004.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-005.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/inline-block-and-column-span-all.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multcol-gap-000.xht [ Crash Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-000.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-001.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-000.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-001.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-002.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-003.html [ Failure ]
-crbug.com/481431 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-005.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-000.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-001.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-002.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-003.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-004.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-breaking-nobackground-005.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-000.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-001.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-001.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-001.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-002.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-000.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-001.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-fraction-002.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-list-item-001.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-margin-002.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-nested-column-rule-001.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-overflow-000.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-000.xht [ Failure ]
-crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-001.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-nested-balancing-002.html [ Failure ]
-crbug.com/792437 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-px-001.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-rule-stacking-001.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-shorthand-001.xht [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-000.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-005.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-006.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-007.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-008.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-010.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-011.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-children-height-001.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-002.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-003.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-004.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-dynamic-add-007.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-rule-001.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-004.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-005.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-zero-height-001.xht [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/nested-with-too-tall-line.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/abspos-after-break-after.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-in-inline.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-with-margin-top-and-line-after-break-2.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-with-margin-top-and-line-after-break-3.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-line-overflow.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/basic-rtl.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/change-height.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/column-break-with-balancing.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/column-count-with-rules.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/column-rules.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/columns-shorthand-parsing.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-inner-multicol.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-opacity-2nd-and-3rd-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-clipped.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-in-clipped.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-overlapping-will-change.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-resize.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-relpos.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-child-layer-in-next-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/composited-with-overflow-in-next-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/doubly-nested-with-top-padding-crossing-row-boundaries.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-display.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-parent-display.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-among-text-in-anonymous-wrapper.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner-before-content.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-before-spanner.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-between-spanners.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-into-content.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-content.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-after-spanner-before-content.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-between-out-of-flow.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-into-content.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-before-spanner.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-after-spanner.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-before-spanner.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-block-from-content-between-spanners.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-spanner-in-content.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-after-content-becomes-regular-block.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-becomes-regular-block.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-before-content-becomes-regular-block.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-in-content-becomes-regular-block.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset-complex-tree.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/event-offset.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/filter-in-second-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/fixedpos-child-becomes-static.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/flipped-blocks-hit-test.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-after-break-after.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-avoidance.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-big-line.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-break.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-content-break.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-edge.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-paginate.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/float-truncation.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-after-empty-block-after-spanner.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/forced-break-too-short-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/inline-block-baseline.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inline-getclientrects.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/inner-multicol-in-second-column.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/layers-in-multicol.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/line-in-next-row-in-fourth-inner-multicol.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-pushed-down-by-float.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/line-too-tall-for-second-outer-row.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/many-lines-overflow-in-single-row-inner.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-3-multicols-fixed-height.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-extra-block-inbetween.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-short-first-row.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-column-count-1-with-forced-break.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks-2.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-with-strut-before-first-line.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-columns.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-fixed-height-with-struts.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-outer-fixed-height.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-clipped-first-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-padding.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-empty-block.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-with-single-tall-line.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/break-before.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/breaks-2-columns-3.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/fixed-height-fill-balance-2.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/fixed-height-fill-balance.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/list-item.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/newmulticol/orphans-and-widows-balance.html [ Failure ]
-crbug.com/797591 virtual/layout_ng_block_frag/fast/multicol/newmulticol/regular-block-becomes-multicol.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-at-boundary.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line-rtl.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-on-line.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/abspos-auto-position-small-on-line-at-boundary.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/out-of-flow/nested-multicol.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/outlines-at-column-boundaries.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-across-columns.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-content.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/overflow-unsplittable.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/paginate-block-replaced.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/positive-leading.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/pushed-line-affected-by-float.html [ Failure ]
-crbug.com/797591 virtual/layout_ng_block_frag/fast/multicol/regular-block-becomes-multicol.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/relayout-and-push-float.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/relpos-inside-inline-block.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_block_frag/fast/multicol/scale-transform-text.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/scrollable-basic.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/shadow-breaking.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/single-line.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/after-float.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/as-inner-multicol.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-exact-fit.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-extra-height.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-after-spanner-some-extra-height.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-before-and-after-spanner.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/balance-before-spanner-extra-height.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-exact-fit.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/fill-after-spanner-extra-height.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/float.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/height-increase.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-hard-breaks.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/in-nested-multicol-with-soft-breaks-inside.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/inside-block-with-fixed-height.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-abspos.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/invalid-spanner-in-transform.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/list-multi-column-crash.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-2.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner-and-float.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/outer-column-break-after-inner-spanner.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/overflow-on-multicol.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/remaining-space-in-last-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/span-between-text.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/spanner-first.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-img.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-last.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/span/spanner-with-margin.html [ Pass ]
-crbug.com/824918 virtual/layout_ng_block_frag/fast/multicol/span/trailing-margin-around-spanner.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/two-rows-then-spanner-then-two-rows.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-lr.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/span/vertical-rl.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/svg-change-column-crash.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/table-cell-content-change.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/table-multicolumn-caption.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/tall-float1.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/tall-float2.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/unbreakable-block-too-tall-to-fit.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/unsplittable-inline-block.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/column-rules.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-avoidance.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-big-line.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-break.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-content-break.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-edge.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-paginate.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-truncation.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/nested-columns.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/abspos-auto-position-on-line.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/column-break-with-balancing.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-big-line.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-truncation.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/nested-columns.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/unsplittable-inline-block.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/widows.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/auto-scrollbar-shrink-to-fit.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/block-after-float-first-child.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/change-fragmentainer-height-inline-float.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/change-fragmentainer-height-line-float.html [ Pass ]
-crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/forced-break-clearance-unsplittable-content.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fragmentation/remove-unbreakable-block-in-line-float.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/repeating-thead-under-repeating-thead.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/fragmentation/transformed-clip-before-second-column.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/printing/frameset.html [ Failure ]
-crbug.com/982194 virtual/layout_ng_block_frag/printing/setPrinting.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/* [ Skip ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-layout-017.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-005.html [ Failure ]
 crbug.com/982194 virtual/layout_ng_fieldset/external/wpt/css/css-contain/contain-paint-006.html [ Failure ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index de273b6..c744a1a 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -74,10 +74,6 @@
 [ Mac ] fast/forms/calendar-picker/month-open-picker-with-f4-key.html [ Skip ]
 [ Mac ] fast/forms/calendar-picker/week-open-picker-with-f4-key.html [ Skip ]
 
-# These tests are specific to Windows.
-crbug.com/1012590 [ Mac ] fast/overflow/rtl-scrollbar-drag-origin.html [ Skip ]
-crbug.com/1012590 [ Linux ] fast/overflow/rtl-scrollbar-drag-origin.html [ Skip ]
-
 # Mac does not have menu key.
 [ Mac ] editing/spelling/spelling-on-context-menu-key.html [ Skip ]
 [ Mac ] fast/events/context-menu-key-shift-f10-modifiers.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 4f952fc..090dd6d8 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -373,6 +373,11 @@
 crbug.com/1042783 external/wpt/css/css-backgrounds/background-size/background-size-near-zero-png.html [ Failure ]
 crbug.com/1042783 external/wpt/css/css-backgrounds/background-size/background-size-near-zero-svg.html [ Failure ]
 
+# Failures due to pointerMove building synthetic events without button information (main thread only).
+crbug.com/1056778 virtual/scroll_customization/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html [ Failure ]
+crbug.com/1056778 fast/scrolling/scrollbars/scrollbar-thumb-snapping.html [ Failure ]
+crbug.com/1056778 virtual/percent-based-scrolling/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html [ Failure ]
+
 # Most of these fail due to subpixel differences, but a couple are real failures.
 crbug.com/1044742 [ Win ] external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-animation.html [ Failure ]
 crbug.com/1044742 [ Mac ] external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-animation.html [ Failure ]
@@ -1396,6 +1401,36 @@
 crbug.com/829804 virtual/layout_ng_block_frag/printing/webgl-oversized-printing.html [ Skip ]
 virtual/layout_ng_block_frag/fragmentation/scrolling-contents-scroll.html [ Crash Failure ]
 
+### With LayoutNGBlockFragmentation and LayoutNGFragmentItem enabled:
+crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-break/widows-orphans-005.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-000.xht [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-break-001.xht [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-span-all-children-height-001.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/composited-relpos-in-clipped.html [ Failure ]
+crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/flipped-blocks-hit-test.html [ Failure ]
+crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/float-truncation.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-with-many-breaks.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/paginate-block-replaced.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/relpos-inside-inline-block.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/table-multicolumn-caption.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/unbreakable-block-too-tall-to-fit.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/change-spanner-parent-display.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-block-between-spanners.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-before-content.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-between-out-of-flow.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-after-spanner.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-and-insert-block-between-spanners.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/dynamic/spanner-becomes-regular-block.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/span/height-increase.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/span/remaining-space-in-last-column.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/span/spanner-first.html [ Failure ]
+crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/float-truncation.html [ Failure ]
+crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-truncation.html [ Failure ]
+crbug.com/829028 virtual/layout_ng_block_frag/fragmentation/transformed-clip-before-second-column.html [ Failure ]
+
 ### With LayoutNGFragmentTraversal (and LayoutNGFragmentItem) enabled:
 
 crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/CSS2/floats/float-nowrap-3-ref.html [ Crash ]
@@ -1800,6 +1835,9 @@
 
 crbug.com/1054509 external/wpt/css/css-transitions/non-rendered-element-004.tentative.html [ Skip ]
 
+crbug.com/1058822 virtual/dark-color-scheme/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-alpha.html [ Failure ]
+crbug.com/1058822 virtual/dark-color-scheme/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-opaque.html [ Failure ]
+
 # ====== Style team owned tests to here ======
 
 # ====== OOPIF-mode failures from here ======
@@ -4667,9 +4705,6 @@
 crbug.com/678493 http/tests/permissions/chromium/test-request-window.html [ Timeout Pass ]
 crbug.com/678499 http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-preload-allowed.php [ Failure Pass ]
 
-# Also crbug.com/1044496
-crbug.com/747751 [ Win ] http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Failure Pass Timeout ]
-
 crbug.com/747751 http/tests/devtools/application-panel/storage-view-reports-quota.js [ Pass Timeout ]
 
 crbug.com/689781 external/wpt/media-source/mediasource-duration.html [ Failure Pass ]
@@ -5257,10 +5292,6 @@
 crbug.com/850358 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Pass Failure Timeout ]
 crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Pass Failure Timeout ]
 
-# Origin Policy: Skip tests that rely on --feature-enabled=OriginPolicy, so
-#   they can be run via virtual/origin-policy instead.
-crbug.com/751996 external/wpt/origin-policy/* [ Skip ]
-
 crbug.com/854538 [ Win7 ] http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect.html [ Skip ]
 
 # Sheriff 2018-06-21
@@ -5683,7 +5714,6 @@
 crbug.com/946699 [ Release ] http/tests/devtools/network/network-filter-service-worker.js [ Pass Timeout ]
 crbug.com/946711 [ Release ] http/tests/devtools/editor/text-editor-search-switch-editor.js [ Crash Pass Timeout ]
 crbug.com/946712 [ Release ] http/tests/devtools/elements/styles-2/paste-property.js [ Crash Pass Timeout ]
-crbug.com/946713 [ Release ] http/tests/devtools/extensions/extensions-resources.js [ Crash Pass Timeout ]
 crbug.com/848799 [ Win7 ] http/tests/devtools/coverage/multiple-instances-merge.js [ Pass Timeout ]
 crbug.com/947383 inspector-protocol/css/reattach-after-editing-styles.js [ Pass Timeout ]
 
@@ -6190,8 +6220,6 @@
 
 # Sheriff 2019-12-02
 crbug.com/1029528 [ Linux ] http/tests/devtools/network/oopif-content.js [ Pass Failure ]
-crbug.com/1028477 [ Mac ] http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js [ Pass Timeout ]
-crbug.com/1028477 [ Win ] http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js [ Pass Timeout ]
 
 crbug.com/833100 [ Mac ] external/wpt/battery-status/battery-full-manual.https.html [ Pass Failure ]
 
@@ -6221,7 +6249,6 @@
 crbug.com/1029489 http/tests/devtools/elements/elements-linkify-attributes.js [ Pass Failure Timeout ]
 crbug.com/1029521 virtual/threaded/external/wpt/web-animations/timing-model/animations/updating-the-finished-state.html [ Pass Failure Timeout ]
 crbug.com/1030258 http/tests/devtools/network/network-cookies-pane.js [ Pass Failure ]
-crbug.com/1035309 http/tests/devtools/throttling/mobile-throttling.js [ Pass Failure ]
 
 # Enable scroll-snap tests on impl thread
 # These are currently failing on Mac which needs more investigation, snap-scrolls-visual-viewport seems flaky
@@ -6342,7 +6369,6 @@
 crbug.com/1042694 fast/forms/form-control-with-state-eager-tracing-crashTest.html [ Pass Timeout ]
 crbug.com/1042689 [ Linux ] http/tests/devtools/coverage/gutter-css.js [ Pass Timeout ]
 crbug.com/1042689 [ Win ] http/tests/devtools/coverage/gutter-css.js [ Pass Timeout ]
-crbug.com/1042688 http/tests/devtools/elements/highlight/highlight-dom-updates.js [ Pass Timeout ]
 
 # Sheriff 2020-01-20
 crbug.com/1043357 http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html [ Pass Timeout Failure ]
@@ -6430,7 +6456,6 @@
 crbug.com/1044429 [ Release ] http/tests/devtools/oopif/oopif-navigator.js [ Pass Timeout ]
 crbug.com/1044430 [ Release ] http/tests/devtools/elements/elements-panel-styles.js [ Pass Timeout ]
 crbug.com/1044433 [ Release ] http/tests/devtools/editor/text-editor-search-replace.js [ Pass Timeout ]
-crbug.com/1044454 [ Release ] http/tests/devtools/changes/changes-highlighter.js [ Pass Timeout ]
 crbug.com/1044459 [ Release ] http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Pass Timeout ]
 crbug.com/1044505 http/tests/devtools/tracing-session-id.js [ Pass Failure Timeout ]
 crbug.com/1044506 [ Release Win ] http/tests/devtools/tracing-model-storage.js [ Pass Timeout ]
@@ -6456,8 +6481,6 @@
 crbug.com/1043847 [ Release Win ] virtual/threaded/fast/scroll-snap/snaps-for-different-key-granularity.html [ Pass Timeout ]
 crbug.com/1043901 [ Release Win ] external/wpt/preload/preload-with-type.html [ Pass Timeout ]
 crbug.com/1044569 [ Release Linux ] virtual/audio-service/media/controls/doubletap-to-jump-backwards.html [ Pass Failure ]
-crbug.com/1044496 [ Release Mac ] http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Pass Timeout ]
-crbug.com/1044496 [ Release Linux ] http/tests/devtools/application-panel/resources-panel-resource-preview.js [ Pass Timeout ]
 crbug.com/1044418 [ Release Mac ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Pass Timeout ]
 
 crbug.com/1045472 external/wpt/WebCryptoAPI/wrapKey_unwrapKey/test_wrapKey_unwrapKey.https.html [ Pass Failure ]
@@ -6470,20 +6493,17 @@
 crbug.com/1045329 external/wpt/animation-worklet/idlharness.any.worker.html [ Pass Timeout ]
 crbug.com/1045329 virtual/threaded/external/wpt/animation-worklet/idlharness.any.worker.html [ Pass Timeout ]
 
-crbug.com/1046784 http/tests/devtools/elements/event-listeners-framework-with-service-worker.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/styles-4/styles-formatting.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/search/search-in-sourcemap.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/animation/animation-after-navigation.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/search/search-in-script.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Pass Timeout ]
-crbug.com/1046784 http/tests/devtools/appcache/appcache-iframe-manifests.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/fragment.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/coverage/coverage-view.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/editor/text-editor-toggle-tab-moves-focus.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/edit/set-outer-html-body.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Pass Timeout ]
-crbug.com/1046784 http/tests/devtools/elements/accessibility/edit-aria-attributes.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Pass Timeout ]
@@ -6504,20 +6524,16 @@
 crbug.com/1046784 http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/editor/text-editor-block-indent.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/edit/set-outer-html.js [ Pass Timeout ]
-crbug.com/1046784 http/tests/devtools/search/source-frame-replace-3.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/editor/text-editor-reveal-line.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/network/failed-request-response-mimetype.js [ Pass Timeout ]
-crbug.com/1046784 http/tests/devtools/search/source-frame-replace-4.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/elements/selected-element-changes-execution-context.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/editor/text-editor-auto-whitespace-removing.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/filtered-item-selection-dialog-rendering.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/coverage/reveal-autoformat.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/file-system-project.js [ Pass Timeout ]
-crbug.com/1046784 http/tests/devtools/search/source-frame-replace-1.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/forced-layout-in-microtask.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/application-panel/resources-panel-iframe-idb.js [ Pass Timeout ]
-crbug.com/1046784 http/tests/devtools/application-panel/resources-panel-on-navigation.js [ Pass Timeout ]
 crbug.com/1046784 http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Pass Timeout ]
 
 # Sheriff 2020-01-28
@@ -7025,3 +7041,10 @@
 crbug.com/1061131 [ Linux ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-with-scroll-timeline.https.html [ Pass Crash ]
 crbug.com/1061131 [ Linux ] virtual/threaded-prefer-compositing/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Pass Failure Timeout ]
 crbug.com/1061131 [ Mac ] virtual/threaded/external/wpt/scroll-animations/two-animations-attach-to-same-scroll-timeline-cancel-one.html [ Pass Failure ]
+
+# Sheriff 2020-03-13
+crbug.com/1061159 [ Fuchsia ] fast/inspector-support/cssURLQuotes.html [ Pass Failure ]
+crbug.com/1061118 fast/loader/subframe-removes-itself.html [ Pass Failure ]
+crbug.com/1061043 fast/plugins/keypress-event.html [ Pass Failure ]
+crbug.com/1061328 http/tests/loading/onreadystatechange-detach.html [ Pass Failure ]
+crbug.com/1061097 http/tests/security/promise-access-control-allow.htm [ Pass Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index bbca432..7df1e1d 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -194,7 +194,7 @@
               "fast/multicol",
               "fragmentation",
               "printing"],
-    "args": ["--enable-blink-features=LayoutNGBlockFragmentation,LayoutNGFieldset"]
+    "args": ["--enable-blink-features=LayoutNGBlockFragmentation,LayoutNGFieldset,LayoutNGFragmentItem"]
   },
   {
     "prefix": "layout_ng_fragment_traversal",
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
index d3d60d2..e9d9cb3 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
@@ -163222,6 +163222,9 @@
    "fonts/math/largeop-displayoperatorminheight5000.woff": [
     []
    ],
+   "fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff": [
+    []
+   ],
    "fonts/math/limits-lowerlimitbaselinedropmin3000.woff": [
     []
    ],
@@ -499168,6 +499171,10 @@
    "53fcc13a1603621c0985dd8ea8d956fd01c974f4",
    "support"
   ],
+  "fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff": [
+   "601a424a94b3090c1a1796c18f6557abe716c5d0",
+   "support"
+  ],
   "fonts/math/limits-lowerlimitbaselinedropmin3000.woff": [
    "76395db141ced4560ed7164c6f09bf50fe771d3d",
    "support"
@@ -524733,7 +524740,7 @@
    "testharness"
   ],
   "lint.whitelist": [
-   "99a6309956e807a4459d36b94fe13574688d6c67",
+   "65494c70cfbf446011b404b5b657564b2ec61e35",
    "support"
   ],
   "loading/preloader-css-import-no-quote.tentative.html": [
@@ -525417,7 +525424,7 @@
    "testharness"
   ],
   "mathml/presentation-markup/scripts/subsup-parameters-2.html": [
-   "da7574ac4d0db19cd3174f42be161fbf6d7490bb",
+   "021512f940f97b7d8071b754ec2775a2c9c9868f",
    "testharness"
   ],
   "mathml/presentation-markup/scripts/underover-1.html": [
@@ -526169,7 +526176,7 @@
    "support"
   ],
   "mathml/tools/largeop.py": [
-   "73d967689bb7dc1101632a883aa08059bf5d7979",
+   "58ce7aebcf415eed9f5b161dc869dedc0d3e3e61",
    "support"
   ],
   "mathml/tools/limits.py": [
@@ -526225,7 +526232,7 @@
    "support"
   ],
   "mathml/tools/utils/mathfont.py": [
-   "7664c6d2434406090020f20e9ec35e513d0390c6",
+   "53633c915047413b2a4651ad215f559068bdeb91",
    "support"
   ],
   "mathml/tools/utils/misc.py": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-alpha.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-alpha.html
new file mode 100644
index 0000000..26c5819
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-alpha.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<title>CSS Color Adjustment Test: iframe element with light color-scheme, frame document with dark color-scheme, :root background with alpha</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect">
+<link rel="match" href="support/dark-frame-alpha.html">
+<link rel="stylesheet" href="support/assert-preferred-dark.css">
+<style>
+  html, body {
+    margin: 0;
+    height: 100%;
+  }
+  iframe {
+    margin: 0;
+    border: 0;
+    padding: 0;
+    width: 100%;
+    height: 100%;
+    display: block;
+  }
+</style>
+<iframe src="support/dark-frame-alpha.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-opaque.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-opaque.html
new file mode 100644
index 0000000..9e39c0b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-mismatch-opaque.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<title>CSS Color Adjustment Test: Frames with a dark color-scheme should get an opaque background when embedding element and embedded root color-schemes do not match</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect">
+<link rel="match" href="support/dark-frame-opaque.html">
+<link rel="stylesheet" href="support/assert-preferred-dark.css">
+<style>
+  html, body {
+    margin: 0;
+    height: 100%;
+  }
+  iframe {
+    margin: 0;
+    border: 0;
+    padding: 0;
+    width: 100%;
+    height: 100%;
+    display: block;
+  }
+</style>
+<iframe src="support/dark-frame-opaque.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html
index ee0f006b..591044f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html
@@ -1,6 +1,6 @@
 <!doctype html>
-<title>CSS Color Adjustment Test: Frames with a dark color-scheme should still be transparent</title>
-<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-processing">
+<title>CSS Color Adjustment Test: Frames with a dark color-scheme should still be transparent when embedding element and embedded root color-schemes match</title>
+<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-effect">
 <link rel="match" href="color-scheme-iframe-background-ref.html">
 <link rel="stylesheet" href="support/assert-preferred-dark.css">
-<iframe width="600" height="400" src="support/dark-frame.html"></iframe>
+<iframe width="600" height="400" style="color-scheme:dark" src="support/dark-frame.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-alpha.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-alpha.html
new file mode 100644
index 0000000..cb5e6d6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-alpha.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<style>
+  :root {
+    color-scheme: dark;
+    background-color: rgba(0, 128, 0, 0.5);
+  }
+  p { color: lime }
+</style>
+<p>This text should be lime and the background should be green blended with a dark canvas.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-opaque.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-opaque.html
new file mode 100644
index 0000000..ca845ea
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-opaque.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<style>
+  :root { color-scheme: dark }
+  p { color: green }
+</style>
+<p>This text should be green and the background should be dark opaque.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height.html
index 4e35eaf..c09c404 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/line-height.html
@@ -23,7 +23,7 @@
   {
     syntax: '<number>',
     specified: assert_is_equal_with_range_handling,
-    computed: (_, result) => assert_is_unit('px', result)
+    computed: (_, result) => assert_is_unit('number', result)
   },
   {
     syntax: '<percentage>',
diff --git a/third_party/blink/web_tests/external/wpt/fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff b/third_party/blink/web_tests/external/wpt/fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff
new file mode 100644
index 0000000..601a424a94
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html
index da7574a..021512f 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/scripts/subsup-parameters-2.html
@@ -20,6 +20,10 @@
     font-family: largeop-displayoperatorminheight2000-2AFF-italiccorrection3000;
     src: url("/fonts/math/largeop-displayoperatorminheight2000-2AFF-italiccorrection3000.woff");
   }
+  @font-face {
+    font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;
+    src: url("/fonts/math/largeop-displayoperatorminheight7000-2AFF-italiccorrection5000.woff");
+  }
 </style>
 <script>
   function getBox(aId) {
@@ -38,6 +42,7 @@
     - In mmultiscripts, prescript pairs are vertically aligned.
   */
   var epsilon = 1;
+  var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
   function runTests() {
     test(function() {
       assert_true(MathMLFeatureDetection.has_mspace());
@@ -52,14 +57,23 @@
     test(function() {
       assert_true(MathMLFeatureDetection.has_mspace());
 
-      var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
       var v = 3000 * emToPx;
       assert_approx_equals(getBox("base011").right - getBox("sub011").left, v, epsilon, "msub");
       assert_approx_equals(getBox("sup012").left, getBox("base012").right, epsilon, "msup");
       assert_approx_equals(getBox("sup013").left - getBox("sub013").left, v, epsilon, "msubsup");
       assert_approx_equals(getBox("sup014").left - getBox("sub014").left, v, epsilon, "mmultiscripts postscripts");
       assert_approx_equals(getBox("sup015").left - getBox("sub015").left, 0, epsilon, "mmultiscripts prescripts");
-    }, "NonNull Italic Correction");
+    }, "NonNull Italic Correction (MathGlyphVariantRecord)");
+    test(function() {
+      assert_true(MathMLFeatureDetection.has_mspace());
+
+      var v = 5000 * emToPx;
+      assert_approx_equals(getBox("base021").right - getBox("sub021").left, v, epsilon, "msub");
+      assert_approx_equals(getBox("sup022").left, getBox("base022").right, epsilon, "msup");
+      assert_approx_equals(getBox("sup023").left - getBox("sub023").left, v, epsilon, "msubsup");
+      assert_approx_equals(getBox("sup024").left - getBox("sub024").left, v, epsilon, "mmultiscripts postscripts");
+      assert_approx_equals(getBox("sup025").left - getBox("sub025").left, 0, epsilon, "mmultiscripts prescripts");
+    }, "NonNull Italic Correction (GlyphAssembly)");
     done();
   }
 </script>
@@ -98,7 +112,7 @@
       </mmultiscripts>
     </math>
   </p>
-  <h2>NonNull Italic Correction</h2>
+  <h2>NonNull Italic Correction (MathGlyphVariantRecord)</h2>
   <p>
     <math displaystyle="true" style="font-family: largeop-displayoperatorminheight2000-2AFF-italiccorrection3000;">
       <msub>
@@ -130,5 +144,37 @@
       </mmultiscripts>
     </math>
   </p>
+  <h2>NonNull Italic Correction (GlyphAssembly)</h2>
+  <p>
+    <math displaystyle="true" style="font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;">
+      <msub>
+        <mo id="base021" lspace="0px" rspace="0px">&#x2AFF;</mo>
+        <mspace id="sub021" height="1em" width="1em" style="background: blue"/>
+      </msub>
+    </math>
+    <math displaystyle="true" style="font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;">
+      <msup>
+        <mo id="base022" lspace="0px" rspace="0px">&#x2AFF;</mo>
+        <mspace id="sup022" height="1em" width="1em" style="background: blue"/>
+      </msup>
+    </math>
+    <math displaystyle="true" style="font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;">
+      <msubsup>
+        <mo lspace="0px" rspace="0px">&#x2AFF;</mo>
+        <mspace id="sub023" height="1em" width="1em" style="background: blue"/>
+        <mspace id="sup023" height="1em" width="1em" style="background: green"/>
+      </msubsup>
+    </math>
+    <math displaystyle="true" style="font-family: largeop-displayoperatorminheight7000-2AFF-italiccorrection5000;">
+      <mmultiscripts>
+        <mo lspace="0px" rspace="0px">&#x2AFF;</mo>
+        <mspace id="sub024" height="1em" width="1em" style="background: blue"/>
+        <mspace id="sup024" height="1em" width="1em" style="background: green"/>
+        <mprescripts/>
+        <mspace id="sub025" height="1em" width="1em" style="background: magenta"/>
+        <mspace id="sup025" height="1em" width="1em" style="background: cyan"/>
+      </mmultiscripts>
+    </math>
+  </p>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/tools/largeop.py b/third_party/blink/web_tests/external/wpt/mathml/tools/largeop.py
index 73d967689..58ce7ae 100755
--- a/third_party/blink/web_tests/external/wpt/mathml/tools/largeop.py
+++ b/third_party/blink/web_tests/external/wpt/mathml/tools/largeop.py
@@ -30,3 +30,34 @@
 g.italicCorrection = v2
 f[nAryWhiteVerticalBarCodePoint].verticalVariants = "uni2AFF uni2AFF.display"
 mathfont.save(f)
+
+v1 = 7 * mathfont.em
+v2 = 5 * mathfont.em
+f = mathfont.create("largeop-displayoperatorminheight%d-2AFF-italiccorrection%d" % (v1, v2))
+f.copyright = "Copyright (c) 2020 Igalia S.L."
+f.math.DisplayOperatorMinHeight = v1
+f.math.MinConnectorOverlap = 0
+mathfont.createSquareGlyph(f, nAryWhiteVerticalBarCodePoint)
+g = f.createChar(-1, "uni2AFF.bot")
+mathfont.drawRectangleGlyph(g,
+                            width = 2 * mathfont.em,
+                            ascent = mathfont.em)
+g = f.createChar(-1, "uni2AFF.ext")
+mathfont.drawRectangleGlyph(g,
+                            width = mathfont.em,
+                            ascent = 2 * mathfont.em,
+                            padding_left = mathfont.em)
+g = f.createChar(-1, "uni2AFF.top")
+mathfont.drawRectangleGlyph(g,
+                            width = v2 + mathfont.em,
+                            ascent = mathfont.em,
+                            padding_left = mathfont.em)
+f[nAryWhiteVerticalBarCodePoint].verticalVariants = "uni2AFF"
+# Part: (glyphName, isExtender, startConnector, endConnector, fullAdvance)
+f[nAryWhiteVerticalBarCodePoint].verticalComponents = \
+  (("uni2AFF.bot", False, 0, mathfont.em / 2, mathfont.em),
+   ("uni2AFF.ext", True, mathfont.em / 2, mathfont.em / 2, 2 * mathfont.em),
+   ("uni2AFF.top", False, mathfont.em / 2, 0, mathfont.em)
+  );
+f[nAryWhiteVerticalBarCodePoint].verticalComponentItalicCorrection = v2
+mathfont.save(f)
diff --git a/third_party/blink/web_tests/external/wpt/mathml/tools/utils/mathfont.py b/third_party/blink/web_tests/external/wpt/mathml/tools/utils/mathfont.py
index 7664c6d..53633c91 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/tools/utils/mathfont.py
+++ b/third_party/blink/web_tests/external/wpt/mathml/tools/utils/mathfont.py
@@ -27,14 +27,14 @@
     mathFont[ord(" ")].verticalVariants = "space"
     return mathFont
 
-def drawRectangleGlyph(aGlyph, aWidth, aAscent, aDescent):
-    p = aGlyph.glyphPen()
-    p.moveTo(0, -aDescent)
-    p.lineTo(0, aAscent)
-    p.lineTo(aWidth, aAscent)
-    p.lineTo(aWidth, -aDescent)
+def drawRectangleGlyph(glyph, width, ascent, descent = 0, padding_left = 0):
+    p = glyph.glyphPen()
+    p.moveTo(padding_left, -descent)
+    p.lineTo(padding_left, ascent)
+    p.lineTo(padding_left + width, ascent)
+    p.lineTo(padding_left + width, -descent)
     p.closePath();
-    aGlyph.width = aWidth
+    glyph.width = padding_left + width
 
 def createSquareGlyph(aFont, aCodePoint):
     g = aFont.createChar(aCodePoint)
diff --git a/third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-404.https.html b/third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-404.https.html
similarity index 64%
rename from third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-404.https.html
rename to third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-404.https.html
index be738cc..51436be6 100644
--- a/third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-404.https.html
+++ b/third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-404.https.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML>
 <meta charset="utf-8">
-<title>Missing manifest file.</title>
+<title>Origin policy manifests delivered with a 404 status code must be ignored</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/origin-policy-test-runner.js"></script>
@@ -9,9 +9,9 @@
 
 <script>
 "use strict";
-<!-- Manifests delivered with 404 status code must be ignored. -->
 runTestsInSubframe({
   hostname: "op99",
-  testJS: "resources/allow-unsafe-eval.mjs"
+  testJS: "../content-security/resources/allow-unsafe-eval.mjs",
+  expectedIds: []
 });
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-mimetype.https.html b/third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-mimetype.https.html
similarity index 64%
rename from third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-mimetype.https.html
rename to third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-mimetype.https.html
index 1a45077..5231a43 100644
--- a/third_party/blink/web_tests/external/wpt/origin-policy/content-security/manifest-mimetype.https.html
+++ b/third_party/blink/web_tests/external/wpt/origin-policy/bad-server/manifest-mimetype.https.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML>
 <meta charset="utf-8">
-<title>Valid "content_security/policies" member must be ignored</title>
+<title>Origin policy manifests served with the wrong MIME type must be ignored</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/origin-policy-test-runner.js"></script>
@@ -11,6 +11,7 @@
 "use strict";
 runTestsInSubframe({
   hostname: "op100",
-  testJS: "resources/allow-unsafe-eval.mjs"
+  testJS: "../content-security/resources/allow-unsafe-eval.mjs",
+  expectedIds: []
 });
 </script>
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/content-security/comma-in-policy.https-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/content-security/comma-in-policy.https-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/content-security/comma-in-policy.https-expected.txt
rename to third_party/blink/web_tests/external/wpt/origin-policy/content-security/comma-in-policy.https-expected.txt
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/features/comma-in-policy.https-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/features/comma-in-policy.https-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/features/comma-in-policy.https-expected.txt
rename to third_party/blink/web_tests/external/wpt/origin-policy/features/comma-in-policy.https-expected.txt
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.serviceworker-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.serviceworker-expected.txt
rename to third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.serviceworker-expected.txt
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.sharedworker-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.sharedworker-expected.txt
rename to third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.sharedworker-expected.txt
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.worker-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/idlharness.any.worker-expected.txt
rename to third_party/blink/web_tests/external/wpt/origin-policy/idlharness.any.worker-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/sms_mock.js b/third_party/blink/web_tests/external/wpt/resources/chromium/sms_mock.js
deleted file mode 100644
index 13d12da..0000000
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/sms_mock.js
+++ /dev/null
@@ -1,52 +0,0 @@
-'use strict';
-
-const SmsProvider = (() => {
-
-  class MockSmsReceiver {
-
-    constructor() {
-      this.mojoReceiver_ = new blink.mojom.SmsReceiverReceiver(this);
-
-      this.interceptor_ =
-          new MojoInterfaceInterceptor(blink.mojom.SmsReceiver.$interfaceName);
-
-      this.interceptor_.oninterfacerequest = (e) => {
-        this.mojoReceiver_.$.bindHandle(e.handle);
-      }
-      this.interceptor_.start();
-
-      this.returnValues_ = {};
-    }
-
-    async receive() {
-      let call = this.returnValues_.receive ?
-          this.returnValues_.receive.shift() : null;
-      if (!call)
-        return;
-      return call();
-    }
-
-    async abort() {}
-
-    pushReturnValuesForTesting(callName, value) {
-      this.returnValues_[callName] = this.returnValues_[callName] || [];
-      this.returnValues_[callName].push(value);
-      return this;
-    }
-
-  }
-
-  const mockSmsReceiver = new MockSmsReceiver();
-
-  class SmsProviderChromium {
-    constructor() {
-      Object.freeze(this); // Make it immutable.
-    }
-
-    pushReturnValuesForTesting(callName, callback) {
-      mockSmsReceiver.pushReturnValuesForTesting(callName, callback);
-    }
-  }
-
-  return SmsProviderChromium;
-})();
diff --git a/third_party/blink/web_tests/external/wpt/sms/README.md b/third_party/blink/web_tests/external/wpt/sms/README.md
deleted file mode 100644
index 1f34178..0000000
--- a/third_party/blink/web_tests/external/wpt/sms/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# SMS Receiver API
-
-This directory contains tests for the SMS Receiver API. For more details, refer to [this README file](https://cs.chromium.org/chromium/src/content/browser/sms/README.md).
diff --git a/third_party/blink/web_tests/external/wpt/sms/detached-iframe.https.html b/third_party/blink/web_tests/external/wpt/sms/detached-iframe.https.html
deleted file mode 100644
index bde6e25b..0000000
--- a/third_party/blink/web_tests/external/wpt/sms/detached-iframe.https.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>sms on DOMWindow of detached iframe</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<iframe id="iframe"></iframe>
-<script>
-'use strict';
-
-promise_test(async t => {
-  const iframe = document.getElementById('iframe');
-  const smsReceiver = iframe.contentWindow.navigator.sms;
-  iframe.parentNode.removeChild(iframe);
-
-  try {
-    await smsReceiver.receive();
-    assert_unreached('Expected NotSupportedError to be thrown.');
-  } catch (error) {
-    assert_equals(error.name, 'NotSupportedError');
-  }
-}, 'Return error when frame is inaccessible');
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/sms/idlharness.https.any.js b/third_party/blink/web_tests/external/wpt/sms/idlharness.https.any.js
deleted file mode 100644
index 0c31744..0000000
--- a/third_party/blink/web_tests/external/wpt/sms/idlharness.https.any.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// META: script=/resources/WebIDLParser.js
-// META: script=/resources/idlharness.js
-
-// https://github.com/samuelgoto/sms-receiver
-
-'use strict';
-
-promise_test(async (t) => {
-  const srcs = ['./sms_receiver.idl',
-                '/interfaces/dom.idl',
-                '/interfaces/html.idl'];
-
-  const [sms, dom, html] = await Promise.all(
-    srcs.map(i => fetch(i).then(r => r.text()))
-  );
-
-  const idl_array = new IdlArray();
-  idl_array.add_idls(sms);
-  idl_array.add_dependency_idls(dom);
-  idl_array.add_dependency_idls(html);
-
-  idl_array.add_objects({
-    SmsReceiver: ['navigator.sms'],
-  });
-
-  idl_array.add_objects({ Navigator: ['navigator'] })
-
-  idl_array.test();
-}, 'Test IDL implementation of the SMS Receiver API');
-
diff --git a/third_party/blink/web_tests/external/wpt/sms/interceptor.https.html b/third_party/blink/web_tests/external/wpt/sms/interceptor.https.html
deleted file mode 100644
index 6dff7903..0000000
--- a/third_party/blink/web_tests/external/wpt/sms/interceptor.https.html
+++ /dev/null
@@ -1,134 +0,0 @@
-<!DOCTYPE html>
-<link rel="help" href="https://github.com/samuelgoto/sms-receiver">
-<title>Tests the SMS Receiver API</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<!--
- sms_provider.js is a testing framework that enables engines to test the sms
- receiver API by intercepting the connection between the browser and the
- underlying operating system and mock its behavior.
-
- Usage:
-
- 1) Include <script src="./resources/helper.js"></script> in your test.
- 2) Set expectations
-  await expect(receive).andReturn(() => {
-    // mock behavior
-  })
- 3) Call navigator.sms.receive()
- 4) Verify results
-
- The mocking API is browser agnostic and is designed such that other engines
- could implement it too.
-
- Here are the symbols that are exposed to tests that need to be implemented
- per engine:
-
- - function receive(): the main/only function that can be mocked.
- - function expect(): the main/only function that enables us to mock it.
- - enum State {kSuccess, kTimeout}: allows you to mock success/failures.
-
-  -->
-<script src="./resources/helper.js"></script>
-<script>
-'use strict';
-
-promise_test(async t => {
-  await expect(receive).andReturn(() => {
-      return Promise.resolve({
-        status: Status.kSuccess,
-        message: "hello",
-      });
-  });
-
-  let sms = await navigator.sms.receive();
-
-  assert_equals(sms.content, "hello");
-}, 'Basic usage');
-
-promise_test(async t => {
-  await expect(receive).andReturn(() => {
-      return Promise.resolve({
-        status: Status.kSuccess,
-        message: "hello1",
-      });
-  });
-  await expect(receive).andReturn(() => {
-      return Promise.resolve({
-        status: Status.kSuccess,
-        message: "hello2",
-      });
-  });
-
-  let sms1 = navigator.sms.receive();
-  let sms2 = navigator.sms.receive();
-
-  let msg2 = await sms2;
-  let msg1 = await sms1;
-
-  assert_equals(msg1.content, "hello1");
-  assert_equals(msg2.content, "hello2");
-}, 'Handle multiple requests in different order.');
-
-promise_test(async t => {
-  await expect(receive).andReturn(() => {
-      return Promise.resolve({
-        status: Status.kCancelled,
-      });
-  });
-  await expect(receive).andReturn(() => {
-      return Promise.resolve({
-        status: Status.kSuccess,
-        message: "success",
-      });
-  });
-
-  let cancelled_sms = navigator.sms.receive();
-  let successful_sms = navigator.sms.receive();
-
-  let successful_msg = await successful_sms;
-  assert_equals(successful_msg.content, "success");
-
-  try {
-    await cancelled_sms;
-    assert_unreached('Expected AbortError to be thrown.');
-  } catch (error) {
-    assert_equals(error.name, "AbortError");
-    assert_equals(error.message, "SMSReceiver was aborted.");
-  }
-}, 'Handle multiple requests with success and error.');
-
-promise_test(async t => {
-  await expect(receive).andReturn(() => {
-      return Promise.resolve({
-        status: Status.kCancelled,
-      });
-  });
-
-  try {
-    await navigator.sms.receive();
-    assert_unreached('Expected CancelledError to be thrown.');
-  } catch (error) {
-    assert_equals(error.name, "AbortError");
-    assert_equals(error.message, "SMSReceiver was aborted.");
-  }
-}, 'Deal with cancelled requests');
-
-promise_test(async t => {
-  const controller = new AbortController();
-  const signal = controller.signal;
-
-  controller.abort();
-  await promise_rejects_dom(t, 'AbortError', navigator.sms.receive({signal}));
-}, 'Should abort request');
-
-promise_test(async t => {
-  const controller = new AbortController();
-  const signal = controller.signal;
-
-  let error = navigator.sms.receive({signal});
-  controller.abort();
-  await promise_rejects_dom(t, 'AbortError', error);
-}, 'Should abort request even while request is in progress.');
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/sms/resources/helper.js b/third_party/blink/web_tests/external/wpt/sms/resources/helper.js
deleted file mode 100644
index d34d6db..0000000
--- a/third_party/blink/web_tests/external/wpt/sms/resources/helper.js
+++ /dev/null
@@ -1,66 +0,0 @@
-'use strict';
-
-// These tests rely on the User Agent providing an implementation of
-// the sms retriever.
-//
-// In Chromium-based browsers this implementation is provided by a polyfill
-// in order to reduce the amount of test-only code shipped to users. To enable
-// these tests the browser must be run with these options:
-//
-//   --enable-blink-features=MojoJS,MojoJSTest
-
-const loadChromiumResources = async () => {
-  if (!window.MojoInterfaceInterceptor) {
-    // Do nothing on non-Chromium-based browsers or when the Mojo bindings are
-    // not present in the global namespace.
-    return;
-  }
-
-  const resources = [
-    '/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js',
-    '/gen/mojo/public/mojom/base/time.mojom-lite.js',
-    '/gen/third_party/blink/public/mojom/sms/sms_receiver.mojom-lite.js',
-    '/resources/chromium/sms_mock.js',
-  ];
-
-  await Promise.all(resources.map(path => {
-    const script = document.createElement('script');
-    script.src = path;
-    script.async = false;
-    const promise = new Promise((resolve, reject) => {
-      script.onload = resolve;
-      script.onerror = reject;
-    });
-    document.head.appendChild(script);
-    return promise;
-  }));
-
-  Status.kSuccess = blink.mojom.SmsStatus.kSuccess;
-  Status.kTimeout = blink.mojom.SmsStatus.kTimeout;
-  Status.kCancelled = blink.mojom.SmsStatus.kCancelled;
-};
-
-const Status = {};
-
-async function create_sms_provider() {
-  if (typeof SmsProvider === 'undefined') {
-    await loadChromiumResources();
-  }
-  if (typeof SmsProvider == 'undefined') {
-    throw new Error('Mojo testing interface is not available.');
-  }
-  return new SmsProvider();
-}
-
-function receive() {
-  throw new Error("expected to be overriden by tests");
-}
-
-function expect(call) {
-  return {
-    async andReturn(callback) {
-      const mock = await create_sms_provider();
-      mock.pushReturnValuesForTesting(call.name, callback);
-    }
-  }
-}
diff --git a/third_party/blink/web_tests/external/wpt/sms/resources/iframe.html b/third_party/blink/web_tests/external/wpt/sms/resources/iframe.html
deleted file mode 100644
index 38efb15a..0000000
--- a/third_party/blink/web_tests/external/wpt/sms/resources/iframe.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<script src="./helper.js"></script>
-<script>
-'use strict';
-
-// Intercept successful calls and return mocked value.
-(async function() {
-  await expect(receive).andReturn(() => {
-      return Promise.resolve({
-        status: Status.kSuccess,
-        message: "hello",
-      });
-  });
-}());
-
-window.onload = function() {
-  navigator.sms.receive()
-   .then(sms => {
-     window.parent.postMessage({result: "Pass", sms: sms.content}, '*');
-   })
-   .catch(error => {
-     window.parent.postMessage({result: "Fail", errorType: error.name}, '*');
-   });
-}
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/sms/sms-iframe.https.html b/third_party/blink/web_tests/external/wpt/sms/sms-iframe.https.html
deleted file mode 100644
index 0809f24..0000000
--- a/third_party/blink/web_tests/external/wpt/sms/sms-iframe.https.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-
-<body>
-
-<script>
-'use strict';
-
-const host = get_host_info();
-const remoteBaseURL = host.HTTPS_REMOTE_ORIGIN + window.location.pathname.replace(/\/[^\/]*$/, '/') ;
-const localBaseURL = host.HTTPS_ORIGIN + window.location.pathname.replace(/\/[^\/]*$/, '/') ;
-
-promise_test(async t => {
-  const messageWatcher = new EventWatcher(t, window, "message");
-  var iframe = document.createElement("iframe");
-  iframe.src = localBaseURL + "resources/iframe.html";
-
-  document.body.appendChild(iframe);
-
-  const message = await messageWatcher.wait_for("message");
-  assert_equals(message.data.result, "Pass");
-  assert_equals(message.data.sms, "hello");
-
-}, "Test SMSReceiver API enabled in same origin iframes");
-
-promise_test(async t => {
-  const messageWatcher = new EventWatcher(t, window, "message");
-  var iframe = document.createElement("iframe");
-  iframe.src = remoteBaseURL + "resources/iframe.html"
-  document.body.appendChild(iframe);
-
-  const message = await messageWatcher.wait_for("message");
-  assert_equals(message.data.result, "Fail");
-  assert_equals(message.data.errorType, "NotAllowedError");
-
-}, "Test SMSReceiver API disabled in cross origin iframes");
-
-</script>
-</body>
diff --git a/third_party/blink/web_tests/external/wpt/sms/sms_receiver.idl b/third_party/blink/web_tests/external/wpt/sms/sms_receiver.idl
deleted file mode 100644
index ca8cfdd7..0000000
--- a/third_party/blink/web_tests/external/wpt/sms/sms_receiver.idl
+++ /dev/null
@@ -1,24 +0,0 @@
-[SecureContext]
-interface mixin NavigatorSMS {
-  readonly attribute SMSReceiver sms;
-};
-
-Navigator includes NavigatorSMS;
-
-[
-  SecureContext,
-  Exposed=(Window,DedicatedWorker)]
-interface SMS {
-  readonly attribute DOMString content;
-};
-
-dictionary SMSReceiverOptions {
-  AbortSignal signal;
-};
-
-[
-  SecureContext,
-  Exposed=Window
-] interface SMSReceiver {
-  Promise<SMS> receive(optional SMSReceiverOptions options);
-};
diff --git a/third_party/blink/web_tests/external/wpt/trusted-types/HTMLScriptElement-in-xhtml-document.tentative.https.xhtml b/third_party/blink/web_tests/external/wpt/trusted-types/HTMLScriptElement-in-xhtml-document.tentative.https.xhtml
new file mode 100644
index 0000000..6cf49f9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/trusted-types/HTMLScriptElement-in-xhtml-document.tentative.https.xhtml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'"/>
+</head>
+<body>
+<script>
+  // This this a regresion test that verifies that in-tree script element in
+  // an xhtml document still works correctly. The test itself doesn't do much.
+  test(t => {
+    t.done();
+  }, "Test whether a script element still executes for XHTML documents.");
+</script>
+</body>
+</html>
+
diff --git a/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin-expected.txt b/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin-expected.txt
deleted file mode 100644
index 7cac4da..0000000
--- a/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-PASS container.scrollLeft is -715
-PASS container.scrollLeft is -365
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
-This test verifies scroll position restores correctly when a thumb drag has been cancelled in RTL mode.
-This test is expected to fail on Mac and Linux because those platforms don't cancel scrolling when mouse cursor is out of a certain range. It is Windows-specific behavior.
diff --git a/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin.html b/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin.html
deleted file mode 100644
index c8087a7..0000000
--- a/third_party/blink/web_tests/fast/overflow/rtl-scrollbar-drag-origin.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html>
-<style>
-#container {
-    position: absolute;
-    left: 100px;
-    top: 0;
-    width: 300px;
-    height: 200px;
-    direction: rtl;
-    overflow: scroll;
-}
-
-#content {
-    width: 1000px;
-    height: 1px;
-}
-</style>
-<div id="container">
-    <div id="content">
-    </div>
-</div>
-This test verifies scroll position restores correctly when a thumb drag has been cancelled in RTL mode.<br/>
-This test is expected to fail on Mac and Linux because those platforms don't cancel scrolling when mouse cursor is out of a certain range. It is Windows-specific behavior.
-<script src="../../resources/js-test.js"></script>
-<script>
-    window.jsTestIsAsync = true;
-    var container = document.getElementById("container");
-    container.scrollLeft = -365;
-
-    if (window.eventSender) {
-        eventSender.dragMode = false;
-        eventSender.mouseMoveTo(250, 195);
-        eventSender.mouseDown();
-
-        eventSender.mouseMoveTo(100, 195);
-        requestAnimationFrame(function() {
-            shouldBe("container.scrollLeft" , "-715");
-            eventSender.mouseMoveTo(100, 700);
-            requestAnimationFrame(function() {
-              shouldBe("container.scrollLeft" , "-365");
-              finishJSTest();
-            });
-        });
-    }
-</script>
diff --git a/third_party/blink/web_tests/fast/parser/resources/xhtml-overwrite-frame.xhtml b/third_party/blink/web_tests/fast/parser/resources/xhtml-overwrite-frame.xhtml
deleted file mode 100644
index 75e7c09..0000000
--- a/third_party/blink/web_tests/fast/parser/resources/xhtml-overwrite-frame.xhtml
+++ /dev/null
@@ -1,12 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
-<script>
-function overwrite() {
-    var testRunner = window.parent.testRunner;
-    window.frameElement.outerHTML = "PASS (no crash)";
-    if (testRunner)
-        testRunner.notifyDone();
-}
-
-document.addEventListener("DOMCharacterDataModified", overwrite);
-</script>
-</html>
diff --git a/third_party/blink/web_tests/fast/parser/xhtml-dom-character-data-modified-crash.html b/third_party/blink/web_tests/fast/parser/xhtml-dom-character-data-modified-crash.html
deleted file mode 100644
index eb5bdec..0000000
--- a/third_party/blink/web_tests/fast/parser/xhtml-dom-character-data-modified-crash.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE html>
-<script>
-if (window.testRunner) {
-    testRunner.dumpAsText();
-    testRunner.waitUntilDone();
-}
-</script>
-<iframe src="resources/xhtml-overwrite-frame.xhtml"></iframe>
diff --git a/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html b/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html
index f2698ae..2fb045c9 100644
--- a/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html
+++ b/third_party/blink/web_tests/fast/scrolling/scrollbars/scrollbar-thumb-snapping.html
@@ -11,72 +11,91 @@
   overflow: scroll;
   border: 1px solid black;
 }
-.standardLocation {
+.ltrLocation {
   position: absolute;
   top: 100px;
   left: 100px;
 }
-.customLocation {
-  position: absolute;
-  top: 250px;
-  left: 100px;
-}
 .space {
   height: 1000px;
   width: 1000px;
 }
+
+.rtlLocation {
+  position: absolute;
+  top: 100px;
+  left: 300px;
+}
+.direction_rtl {
+  direction: rtl;
+}
 </style>
+
+<!-- Non-custom ltr scroller -->
+<div id="standard_ltr" class="appearance ltrLocation">
+  <div class="space"></div>
+</div>
+
+<!-- Non-custom rtl scroller -->
+<div id="standard_rtl" class="appearance rtlLocation direction_rtl">
+  <div class="space"></div>
+</div>
+
 <script>
-  if (window.internals)
-    internals.settings.setScrollAnimatorEnabled(false);
+window.onload = () => {
+  const TRACK_WIDTH = calculateScrollbarThickness();
+  const BUTTON_WIDTH = TRACK_WIDTH;
+  const MSG = "Horizontal thumb drag beyond the gutter (around the track)" +
+              " should cause the thumb to snap back to the drag origin.";
 
-  let scroll_threshold_crossed = false;
-  var testThumbSnapBack = async_test('Tests that the thumb snaps back.');
-  function pointerActionsCallback() {
-    const scroller = document.getElementById("standard");
-    testThumbSnapBack.step(() => {
-      assert_true(scroll_threshold_crossed, 'scroll threashold should be crossed');
-      assert_equals(scroller.scrollTop, 20, 'scroll offset should snap back');
-    });
-    testThumbSnapBack.done();
-  }
-
-  function inject_input() {
-    if (!(window.chrome && chrome.gpuBenchmarking))
+  promise_test (async () => {
+    // Scrollbar thumb snapping is a Windows only feature.
+    if(!navigator.userAgent.includes("Windows"))
       return;
 
-    const standardDivFast = document.getElementById("standard");
-    const standardRectFast = standardDivFast.getBoundingClientRect();
-    const TRACK_WIDTH = calculateScrollbarThickness();
-    const BUTTON_WIDTH = TRACK_WIDTH;
-    const X = standardRectFast.right - TRACK_WIDTH / 2;
-    const Y = standardRectFast.top + BUTTON_WIDTH + 5;
+    const ltrDiv = document.getElementById("standard_ltr");
+    const ltrRect = ltrDiv.getBoundingClientRect();
+    await waitForCompositorCommit();
+    const DRAG_ORIGIN = 10;
+    ltrDiv.scrollLeft = DRAG_ORIGIN;
 
-    // Verify that scrolling occured.
-    standardDivFast.addEventListener("scroll", function() {
-      if (standardDivFast.scrollTop == 505)
-        scroll_threshold_crossed = true;
-    });
+    // Testing the horizontal scrollbar thumb.
+    const x = ltrRect.left + BUTTON_WIDTH + 2;
+    const y = ltrRect.bottom - TRACK_WIDTH / 2;
 
-    // Testing the vertical scrollbar thumb.
-    standardDivFast.scrollTop = 20;
-    var pointerActions =
-      [{source: "mouse", id: 0,
-          actions: [
-            { name: "pointerDown", x: X, y: Y },
-            { name: "pause", duration: 100},
-            { name: 'pointerMove', x: X, y: Y + 20 },
-            { name: "pause", duration: 100},
-            { name: 'pointerMove', x: X + 500, y: Y + 20 },
-            { name: "pointerUp", x: X + 500, y: Y + 20 },
-          ]
-      }];
-    chrome.gpuBenchmarking.pointerActionSequence(pointerActions, pointerActionsCallback);
-  }
+    await mouseMoveTo(x, y);
+    await mouseDownAt(x, y);
+    await mouseMoveTo(x + 10, y);
+    assert_true(ltrDiv.scrollLeft > 200, "Thumb drag should cause a scroll.");
+
+    await mouseMoveTo(x + 10, y + 200);
+    assert_equals(ltrDiv.scrollLeft, DRAG_ORIGIN, MSG);
+    await mouseUpAt(x + 10, y + 200);
+  }, "Tests that the thumb snaps back for ltr direction.");
+
+  promise_test (async () => {
+    // Scrollbar thumb snapping is a Windows only feature.
+    if(!navigator.userAgent.includes("Windows"))
+      return;
+
+    const rtlDiv = document.getElementById("standard_rtl");
+    const rtlRect = rtlDiv.getBoundingClientRect();
+    await waitForCompositorCommit();
+    const DRAG_ORIGIN = -40;
+    rtlDiv.scrollLeft = DRAG_ORIGIN;
+
+    // Testing the horizontal scrollbar thumb.
+    const x = rtlRect.right - BUTTON_WIDTH - 5;
+    const y = rtlRect.bottom - TRACK_WIDTH / 2;
+
+    await mouseMoveTo(x, y);
+    await mouseDownAt(x, y);
+    await mouseMoveTo(x - 10, y);
+    assert_true(rtlDiv.scrollLeft < -200, "Thumb drag should cause a scroll.");
+
+    await mouseMoveTo(x - 10, y + 200);
+    assert_equals(rtlDiv.scrollLeft, DRAG_ORIGIN, MSG);
+    await mouseUpAt(x - 10, y + 200);
+  }, "Tests that the thumb snaps back for rtl direction.");
+}
 </script>
-<body id="target" onload="inject_input()">
-  <!-- Composited non-custom fast scroller -->
-  <div id="standard" class="appearance standardLocation fast">
-    <div class="space"></div>
-  </div>
-</body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-iframe-manifests.js b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-iframe-manifests.js
index 32cedac..9651666 100644
--- a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-iframe-manifests.js
+++ b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-iframe-manifests.js
@@ -15,7 +15,7 @@
   var frameId2;
   var frameId3;
 
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
   ApplicationTestRunner.dumpApplicationCache();
   ApplicationTestRunner.createAndNavigateIFrame('resources/page-with-manifest.php?manifestId=1', step1);
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js
index e1c3413..a40a295 100644
--- a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js
+++ b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-manifest-with-non-existing-file.js
@@ -15,7 +15,7 @@
   var frameId2;
   var frameId3;
 
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
   ApplicationTestRunner.startApplicationCacheStatusesRecording();
   ApplicationTestRunner.dumpApplicationCache();
   ApplicationTestRunner.createAndNavigateIFrame(
diff --git a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-swap.js b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-swap.js
index f3b9596..e070b97 100644
--- a/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-swap.js
+++ b/third_party/blink/web_tests/http/tests/devtools/appcache/appcache-swap.js
@@ -15,7 +15,7 @@
   var frameId1;
   var frameId2;
 
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
   ApplicationTestRunner.startApplicationCacheStatusesRecording();
   ApplicationTestRunner.dumpApplicationCache();
   ApplicationTestRunner.createAndNavigateIFrame('resources/with-versioned-manifest.php', step1);
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-on-navigation.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-on-navigation.js
index 2a508bb..2859995 100644
--- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-on-navigation.js
+++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-on-navigation.js
@@ -44,7 +44,7 @@
 
   await new Promise(createIndexedDB);
   await ApplicationTestRunner.createWebSQLDatabase('database-for-test');
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
   UI.panels.resources._sidebar.databasesListTreeElement.firstChild().select(false, true);
   dumpCurrentState('Initial state:');
   await TestRunner.reloadPagePromise();
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-resource-preview.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-resource-preview.js
index 959bbef..54b38e9 100644
--- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-resource-preview.js
+++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-resource-preview.js
@@ -67,7 +67,7 @@
     dumpCurrentState('Revealed ' + name + ':');
   }
 
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
   dumpCurrentState('Initial state:');
   await revealResourceWithDisplayName('json-value.js');
   await revealResourceWithDisplayName('image.png');
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-selection-on-reload.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-selection-on-reload.js
index c120296a..372ff00 100644
--- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-selection-on-reload.js
+++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-selection-on-reload.js
@@ -45,7 +45,7 @@
 
   await new Promise(createIndexedDB);
   await ApplicationTestRunner.createWebSQLDatabase('database-for-test');
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
   UI.panels.resources._sidebar.cookieListTreeElement.firstChild().select(false, true);
   dumpCurrentState('Initial state:');
   await TestRunner.reloadPagePromise();
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js
index 67799797..99406bf7 100644
--- a/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js
+++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/resources-panel-websql.js
@@ -35,7 +35,7 @@
     await queryView.once(Resources.DatabaseQueryView.Events.SchemaUpdated);
     return new Promise(resolve => setTimeout(resolve));
   }
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
   dumpCurrentState('Initial state:');
 
   await TestRunner.evaluateInPagePromise(
diff --git a/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js b/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js
index b53663f..c6d4eae6 100644
--- a/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js
+++ b/third_party/blink/web_tests/http/tests/devtools/application-panel/storage-view-reports-quota.js
@@ -28,7 +28,7 @@
 
   async function dumpWhenMatches(view, predicate) {
     await new Promise(resolve => {
-      function sniffer(usage, quota) {
+      function sniffer(usage, quota, breakdown) {
         if (usage !== null && (!predicate || predicate(usage, quota)))
           resolve();
         else
@@ -60,7 +60,7 @@
       TestRunner.addResult(typeUsage);
     }
   }
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
 
   var parent = UI.panels.resources._sidebar._applicationTreeElement;
   var clearStorageElement = parent.children().find(child => child.title === 'Clear storage');
diff --git a/third_party/blink/web_tests/http/tests/devtools/changes/changes-highlighter.js b/third_party/blink/web_tests/http/tests/devtools/changes/changes-highlighter.js
index b518d412..265f412 100644
--- a/third_party/blink/web_tests/http/tests/devtools/changes/changes-highlighter.js
+++ b/third_party/blink/web_tests/http/tests/devtools/changes/changes-highlighter.js
@@ -12,10 +12,10 @@
 
   TestRunner.waitForUISourceCode('after.css').then(uiSourceCode => uiSourceCode.requestContent()).then(onAfterContent);
 
-  function onAfterContent({ content, error, isEncoded }) {
+  async function onAfterContent({ content, error, isEncoded }) {
     SourcesTestRunner.waitForScriptSource('before.css', uiSourceCode => uiSourceCode.setWorkingCopy(content));
     TestRunner.addSniffer(Changes.ChangesView.prototype, '_renderDiffRows', rowsRendered, true);
-    UI.viewManager.showView('changes.changes');
+    await UI.viewManager.showView('changes.changes');
   }
 
   function rowsRendered() {
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/autocomplete-attribute.js b/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/autocomplete-attribute.js
index c50f61ba48..0ff04fc 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/autocomplete-attribute.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/autocomplete-attribute.js
@@ -11,7 +11,7 @@
       <span id="inspected" aria-checked="true" role="checkbox"></span>
     `);
 
-  UI.viewManager.showView('accessibility.view')
+  await UI.viewManager.showView('accessibility.view')
       .then(() => AccessibilityTestRunner.selectNodeAndWaitForAccessibility('inspected'))
       .then(runTests);
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/edit-aria-attributes.js b/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/edit-aria-attributes.js
index 41bc4b7..8b29730 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/edit-aria-attributes.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/accessibility/edit-aria-attributes.js
@@ -11,7 +11,7 @@
       <button id="inspected" role="checkbox" aria-checked="true">ARIA checkbox</button>
     `);
 
-  UI.viewManager.showView('accessibility.view')
+  await UI.viewManager.showView('accessibility.view')
       .then(() => AccessibilityTestRunner.selectNodeAndWaitForAccessibility('inspected'))
       .then(editAriaChecked);
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js
index 82866ed..b0382d0 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js
@@ -23,7 +23,7 @@
     `);
 
   // Save time on style updates.
-  UI.viewManager.showView('elements');
+  await UI.viewManager.showView('elements');
 
   Elements.StylesSidebarPane.prototype.update = function() {};
   Elements.MetricsSidebarPane.prototype.update = function() {};
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js
index 2f8b559..4b9bb25 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js
@@ -24,7 +24,7 @@
     `);
 
   // Save time on style updates.
-  UI.viewManager.showView('elements');
+  await UI.viewManager.showView('elements');
 
   Elements.StylesSidebarPane.prototype.update = function() {};
   Elements.MetricsSidebarPane.prototype.update = function() {};
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker.js b/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker.js
index 494b5b80..bffa926 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/event-listeners-framework-with-service-worker.js
@@ -38,12 +38,12 @@
     SourcesTestRunner.waitForExecutionContextInTarget(target, step2);
   }
 
-  function step2(executionContext) {
+  async function step2(executionContext) {
     TestRunner.addResult('Selecting service worker thread');
     SourcesTestRunner.selectThread(executionContext.target());
     TestRunner.addResult('Context is service worker: ' + isServiceWorker());
     TestRunner.addResult('Dumping listeners');
-    UI.viewManager.showView('sources.globalListeners').then(() => {
+    await UI.viewManager.showView('sources.globalListeners').then(() => {
       objectEventListenersPane.update();
       ElementsTestRunner.expandAndDumpEventListeners(objectEventListenersPane._eventListenersView, step3);
     });
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-dom-updates.js b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-dom-updates.js
index cccd5d7..266f683 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-dom-updates.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-dom-updates.js
@@ -125,8 +125,8 @@
       runAndDumpHighlights('setFirstChildTextContent(\'textTest\', \'\')', textTestNode, next);
     },
 
-    function testAppendChildWhenHidden(next) {
-      UI.viewManager.showView('console');
+    async function testAppendChildWhenHidden(next) {
+      await UI.viewManager.showView('console');
       runAndDumpHighlights('appendChild(\'childTest\', \'child1\')', childTestNode, next);
     }
   ]);
diff --git a/third_party/blink/web_tests/http/tests/devtools/extensions/extensions-resources.js b/third_party/blink/web_tests/http/tests/devtools/extensions/extensions-resources.js
index e5dacc5..08bc2e9 100644
--- a/third_party/blink/web_tests/http/tests/devtools/extensions/extensions-resources.js
+++ b/third_party/blink/web_tests/http/tests/devtools/extensions/extensions-resources.js
@@ -8,8 +8,8 @@
   await TestRunner.loadModule('extensions_test_runner');
   await TestRunner.loadModule('sources_test_runner');
 
-  TestRunner.clickOnURL = function() {
-    UI.viewManager.showView("console").then(() => {
+  TestRunner.clickOnURL = async function() {
+    await UI.viewManager.showView("console").then(() => {
       Console.ConsoleView.instance()._updateMessageList();
 
       // Trigger link creation so we can properly await pending live location updates. Needed so we can
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-1.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-1.js
index a812e79..67201337 100644
--- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-1.js
+++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-1.js
@@ -8,7 +8,7 @@
   await TestRunner.showPanel('sources');
   await TestRunner.addScriptTag('resources/search.js');
 
-  UI.viewManager.showView('sources');
+  await UI.viewManager.showView('sources');
   SourcesTestRunner.showScriptSource('search.js', didShowScriptSource);
 
   function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-2.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-2.js
index a860e74..1ea595f 100644
--- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-2.js
+++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-2.js
@@ -8,7 +8,8 @@
   await TestRunner.showPanel('sources');
   await TestRunner.addScriptTag('resources/search.js');
 
-  UI.viewManager.showView('sources');
+  await UI.viewManager.showView('sources');
+
   SourcesTestRunner.showScriptSource('search.js', didShowScriptSource);
 
   function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-3.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-3.js
index 4d2b02d23..e971ca9 100644
--- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-3.js
+++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-3.js
@@ -8,7 +8,7 @@
   await TestRunner.showPanel('sources');
   await TestRunner.addScriptTag('resources/search.js');
 
-  UI.viewManager.showView('sources');
+  await UI.viewManager.showView('sources');
   SourcesTestRunner.showScriptSource('search.js', didShowScriptSource);
 
   function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-4.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-4.js
index 49c5f67..8b0be3c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-4.js
+++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-replace-4.js
@@ -8,7 +8,7 @@
   await TestRunner.showPanel('sources');
   await TestRunner.addScriptTag('resources/search.js');
 
-  UI.viewManager.showView('sources');
+  await UI.viewManager.showView('sources');
   SourcesTestRunner.showScriptSource('search.js', didShowScriptSource);
 
   function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-search.js b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-search.js
index 9e946be..a2bea14 100644
--- a/third_party/blink/web_tests/http/tests/devtools/search/source-frame-search.js
+++ b/third_party/blink/web_tests/http/tests/devtools/search/source-frame-search.js
@@ -32,7 +32,7 @@
     }
   }
 
-  UI.viewManager.showView('sources');
+  await UI.viewManager.showView('sources');
   SourcesTestRunner.showScriptSource('search.js', didShowScriptSource);
 
   function didShowScriptSource(sourceFrame) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/source-frame.js b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/source-frame.js
index 506a2ee..4dc43cd 100644
--- a/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/source-frame.js
+++ b/third_party/blink/web_tests/http/tests/devtools/sources/debugger-ui/source-frame.js
@@ -24,7 +24,7 @@
   await TestRunner.addScriptTag('source-frame.js');
   await TestRunner.addScriptTag('../resources/script.js');
 
-  UI.viewManager.showView('resources');
+  await UI.viewManager.showView('resources');
   SourcesTestRunner.runDebuggerTestSuite([
     function testConsoleMessage(next) {
       SourcesTestRunner.showScriptSource('source-frame.js', didShowScriptSource);
@@ -57,8 +57,8 @@
       }
     },
 
-    function testShowResource(next) {
-      UI.viewManager.showView('network');
+    async function testShowResource(next) {
+      await UI.viewManager.showView('network');
       TestRunner.addSniffer(SourceFrame.SourceFrame.prototype, 'show', didShowSourceFrame);
 
       TestRunner.resourceTreeModel.forAllResources(visit);
diff --git a/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling-expected.txt b/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling-expected.txt
index d85dabc..dad28858 100644
--- a/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling-expected.txt
@@ -24,7 +24,7 @@
 
 Change to low-end mobile in device mode
 === THROTTLING STATE ===
-Network throttling - download: 50000 upload: 50000 latency: 2000
+Network throttling - download: 51200 upload: 51200 latency: 2000
 CPU throttling rate: 6
 Device mode throttling: Low-end mobile
 Network panel throttling: Slow 3G
@@ -35,7 +35,7 @@
 
 Change network to Fast 3G
 === THROTTLING STATE ===
-Network throttling - download: 180000 upload: 84375 latency: 562.5
+Network throttling - download: 188744 upload: 86400 latency: 562.5
 CPU throttling rate: 6
 Device mode throttling: Custom
 Network panel throttling: Fast 3G
@@ -46,7 +46,7 @@
 
 Change to mid-tier mobile in device mode
 === THROTTLING STATE ===
-Network throttling - download: 180000 upload: 84375 latency: 562.5
+Network throttling - download: 188744 upload: 86400 latency: 562.5
 CPU throttling rate: 4
 Device mode throttling: Mid-tier mobile
 Network panel throttling: Fast 3G
@@ -57,7 +57,7 @@
 
 Change CPU throttling to low-end mobile
 === THROTTLING STATE ===
-Network throttling - download: 180000 upload: 84375 latency: 562.5
+Network throttling - download: 188744 upload: 86400 latency: 562.5
 CPU throttling rate: 6
 Device mode throttling: Custom
 Network panel throttling: Fast 3G
@@ -68,7 +68,7 @@
 
 Change CPU throttling to mid-tier mobile
 === THROTTLING STATE ===
-Network throttling - download: 180000 upload: 84375 latency: 562.5
+Network throttling - download: 188744 upload: 86400 latency: 562.5
 CPU throttling rate: 4
 Device mode throttling: Mid-tier mobile
 Network panel throttling: Fast 3G
diff --git a/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling.js b/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling.js
index 18da20b..769155f 100644
--- a/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling.js
+++ b/third_party/blink/web_tests/http/tests/devtools/throttling/mobile-throttling.js
@@ -6,7 +6,7 @@
   TestRunner.addResult(`Tests that mobile, network, and CPU throttling interact with each other logically.\n`);
   await TestRunner.showPanel("network");
   await TestRunner.showPanel("timeline");
-  UI.viewManager.showView("network.config");
+  await UI.viewManager.showView("network.config");
 
   var deviceModeView = new Emulation.DeviceModeView();
 
@@ -21,7 +21,7 @@
   function dumpThrottlingState() {
     TestRunner.addResult('=== THROTTLING STATE ===');
     var {download, upload, latency} = SDK.multitargetNetworkManager.networkConditions();
-    TestRunner.addResult(`Network throttling - download: ${download} upload: ${upload} latency: ${latency}`);
+    TestRunner.addResult(`Network throttling - download: ${Math.round(download)} upload: ${Math.round(upload)} latency: ${latency}`);
     TestRunner.addResult('CPU throttling rate: ' + MobileThrottling.throttlingManager().cpuThrottlingRate());
     TestRunner.addResult('Device mode throttling: ' + deviceModeThrottling._text);
     TestRunner.addResult('Network panel throttling: ' + networkPanelThrottling.selectedOption().text);
diff --git a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-receive-response-event.js b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-receive-response-event.js
index ef95ff8..a8716ee 100644
--- a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-receive-response-event.js
+++ b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-receive-response-event.js
@@ -27,7 +27,7 @@
       }
   `);
 
-  UI.viewManager.showView('timeline');
+  await UI.viewManager.showView('timeline');
   const panel = UI.panels.timeline;
   panel._disableCaptureJSProfileSetting.set(true);
   await PerformanceTestRunner.invokeAsyncWithTimeline('performActions');
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions-expected.txt
new file mode 100644
index 0000000..f7e4d08
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions-expected.txt
@@ -0,0 +1,22 @@
+Test that permissions could be granted to all origins
+Grant geolocation audioCapture to all
+    Granted: ["geolocation","audioCapture"]
+Query geolocation
+    => granted
+Query microphone
+    => granted
+Resetting all permissions
+Query geolocation
+    => denied
+Query microphone
+    => denied
+Testing local permissions override global permissions
+Grant geolocation to all
+    Granted: ["geolocation"]
+Grant audioCapture to http://devtools.test:8000
+    Granted: ["audioCapture"]
+Query geolocation
+    => denied
+Query microphone
+    => granted
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions.js b/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions.js
new file mode 100644
index 0000000..41b2a87
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/browser-grant-global-permissions.js
@@ -0,0 +1,44 @@
+(async function(testRunner) {
+  const {page, session, dp} = await testRunner.startBlank(
+      `Test that permissions could be granted to all origins`);
+
+  // Reset all permissions initially.
+  await dp.Browser.resetPermissions();
+
+  await page.navigate('http://devtools.test:8000/inspector-protocol/resources/empty.html');
+
+  await grant(undefined, 'geolocation', 'audioCapture');
+  await dumpPermission('geolocation');
+  await dumpPermission('microphone');
+
+  testRunner.log('Resetting all permissions');
+  await dp.Browser.resetPermissions();
+  await dumpPermission('geolocation');
+  await dumpPermission('microphone');
+
+  testRunner.log('Testing local permissions override global permissions');
+  await grant(undefined, 'geolocation');
+  await grant('http://devtools.test:8000', 'audioCapture');
+  await dumpPermission('geolocation');
+  await dumpPermission('microphone');
+
+  testRunner.completeTest();
+
+  async function grant(origin, ...permissions) {
+    testRunner.log(`Grant ${permissions.join(' ')} to ${origin || 'all'}`);
+    const response = await dp.Browser.grantPermissions({ origin, permissions });
+    if (response.error)
+      testRunner.log('    Failed to grant: ' + JSON.stringify(permissions) + '  error: ' + response.error.message);
+    else
+      testRunner.log('    Granted: ' + JSON.stringify(permissions));
+  }
+
+  async function dumpPermission(name) {
+    testRunner.log(`Query ${name}`);
+    const result = await session.evaluateAsync(async (permission) => {
+      const result = await navigator.permissions.query({name: permission});
+      return result.state;
+    }, name);
+    testRunner.log(`    => ${result}`);
+  }
+})
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/sms-receiver-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/sms-receiver-origin-trial-interfaces.html
deleted file mode 100644
index e0097d9..0000000
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/sms-receiver-origin-trial-interfaces.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<!-- Generate token with the command:
-generate_token.py http://127.0.0.1:8000 SmsReceiver --expire-timestamp=2000000000
--- -->
-<meta http-equiv="origin-trial" content="AqptJAocypqw+Nd2rdevpkjUlMBz2si2im0MOtLpKsztHb0CaV25R8qpoQn9Loe/FrswYNlSZSM+8SKwocAUtwoAAABTeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiU21zUmVjZWl2ZXIiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0=" />
-<title>SmsReceiver - interfaces exposed by origin trial</title>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/origin-trials-helper.js"></script>
-<script>
-test(t => {
-  OriginTrialsHelper.check_properties_exist(this,
-      {
-        'Navigator': ['sms'],
-        'SMSReceiver': ['receive'],
-        'SMS': ['content'],
-      },
-  );
-}, "Sms related interfaces in Origin-Trial enabled document.");
-
-</script>
diff --git a/third_party/blink/web_tests/typedcssom/computedstyle/line-height.html b/third_party/blink/web_tests/typedcssom/computedstyle/line-height.html
index 9edb1e1..2c2e1c8 100644
--- a/third_party/blink/web_tests/typedcssom/computedstyle/line-height.html
+++ b/third_party/blink/web_tests/typedcssom/computedstyle/line-height.html
@@ -32,21 +32,21 @@
   var result = computedStyleMap.get('line-height');
   assert_equals(result.constructor.name, CSSUnitValue.name);
   assert_equals(result.toString(), '10px');
-}, 'Getting a 10% lineHeight results in a CSSUnitValue');
+}, 'Getting a 10% lineHeight results in a px CSSUnitValue');
 
 test(function() {
   testElement.style.lineHeight = '0.2';
   var result = computedStyleMap.get('line-height');
   assert_equals(result.constructor.name, CSSUnitValue.name);
-  assert_equals(result.toString(), '20px');
-}, 'Getting a number lineHeight results in a CSSUnitValue');
+  assert_equals(result.toString(), '0.2');
+}, 'Getting a number lineHeight results in a number CSSUnitValue');
 
 test(function() {
   testElement.style.lineHeight = 'calc(10px + 10%)';
   var result = computedStyleMap.get('line-height');
   assert_equals(result.constructor.name, CSSUnitValue.name);
   assert_equals(result.toString(), '20px');
-}, 'Getting a calc lineHeight results in a CSSUnitValue');
+}, 'Getting a calc lineHeight results in a px CSSUnitValue');
 
 test(function() {
   testElement.style.lineHeight = 'normal';
diff --git a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/README.txt b/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/README.txt
deleted file mode 100644
index 309d6722..0000000
--- a/third_party/blink/web_tests/virtual/origin-policy/external/wpt/origin-policy/README.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# This suite runs the tests in external/wpt/origin-policy with
-# --enable-blink-features=OriginPolicy.
-# Origin Policy is being standardized here: https://github.com/WICG/origin-policy
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 79aceb8..d7605cc0 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1213,10 +1213,6 @@
 [Worker]     method formData
 [Worker]     method json
 [Worker]     method text
-[Worker] interface SMS
-[Worker]     attribute @@toStringTag
-[Worker]     getter content
-[Worker]     method constructor
 [Worker] interface SecurityPolicyViolationEvent : Event
 [Worker]     attribute @@toStringTag
 [Worker]     getter blockedURI
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index 02fbcb288..e2efdc1b 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -5438,7 +5438,6 @@
     getter scheduling
     getter serial
     getter serviceWorker
-    getter sms
     getter storage
     getter usb
     getter userActivation
@@ -6694,14 +6693,6 @@
     method formData
     method json
     method text
-interface SMS
-    attribute @@toStringTag
-    getter content
-    method constructor
-interface SMSReceiver
-    attribute @@toStringTag
-    method constructor
-    method receive
 interface SVGAElement : SVGGraphicsElement
     attribute @@toStringTag
     getter href
diff --git a/third_party/webrtc_overrides/BUILD.gn b/third_party/webrtc_overrides/BUILD.gn
index 878cd94..4f44c48d2 100644
--- a/third_party/webrtc_overrides/BUILD.gn
+++ b/third_party/webrtc_overrides/BUILD.gn
@@ -92,6 +92,7 @@
       "//third_party/webrtc/api/audio:audio_frame_api",
       "//third_party/webrtc/api/task_queue",
       "//third_party/webrtc/api/video:encoded_image",
+      "//third_party/webrtc/media:rtc_h264_profile_id",
       "//third_party/webrtc/media:rtc_media_engine_defaults",
       "//third_party/webrtc/modules/audio_device:audio_device_default",
       "//third_party/webrtc/modules/audio_mixer:audio_mixer_impl",
diff --git a/tools/OWNERS b/tools/OWNERS
index 53418bb..39d98bf3 100644
--- a/tools/OWNERS
+++ b/tools/OWNERS
@@ -47,7 +47,7 @@
 per-file roll_webgl_conformance.py=kbr@chromium.org
 per-file roll_webgl_conformance.py=geofflang@chromium.org
 per-file roll_webgl_conformance.py=zmo@chromium.org
-per-file roll_webrtc.py=phoglund@chromium.org
+per-file roll_webrtc.py=mbonadei@chromium.org
 
 per-file sort-headers.py=satorux@chromium.org
 per-file sort-sources.py=satorux@chromium.org
diff --git a/tools/binary_size/libsupersize/parallel_test.py b/tools/binary_size/libsupersize/parallel_test.py
index 28fd4b10..449d4d2d 100755
--- a/tools/binary_size/libsupersize/parallel_test.py
+++ b/tools/binary_size/libsupersize/parallel_test.py
@@ -9,7 +9,7 @@
 import threading
 import unittest
 
-import parallel as concurrent
+import parallel
 
 
 def _ForkTestHelper(arg1, arg2, pickle_me_not, test_instance, parent_pid):
@@ -28,61 +28,61 @@
 class ConcurrentTest(unittest.TestCase):
   def testEncodeDictOfLists_Empty(self):
     test_dict = {}
-    encoded = concurrent.EncodeDictOfLists(test_dict)
-    decoded = concurrent.DecodeDictOfLists(encoded)
+    encoded = parallel.EncodeDictOfLists(test_dict)
+    decoded = parallel.DecodeDictOfLists(encoded)
     self.assertEquals(test_dict, decoded)
 
   def testEncodeDictOfLists_EmptyValue(self):
     test_dict = {'foo': []}
-    encoded = concurrent.EncodeDictOfLists(test_dict)
-    decoded = concurrent.DecodeDictOfLists(encoded)
+    encoded = parallel.EncodeDictOfLists(test_dict)
+    decoded = parallel.DecodeDictOfLists(encoded)
     self.assertEquals(test_dict, decoded)
 
   def testEncodeDictOfLists_AllStrings(self):
     test_dict = {'foo': ['a', 'b', 'c'], 'foo2': ['a', 'b']}
-    encoded = concurrent.EncodeDictOfLists(test_dict)
-    decoded = concurrent.DecodeDictOfLists(encoded)
+    encoded = parallel.EncodeDictOfLists(test_dict)
+    decoded = parallel.DecodeDictOfLists(encoded)
     self.assertEquals(test_dict, decoded)
 
   def testEncodeDictOfLists_KeyTransform(self):
     test_dict = {0: ['a', 'b', 'c'], 9: ['a', 'b']}
-    encoded = concurrent.EncodeDictOfLists(test_dict, key_transform=str)
-    decoded = concurrent.DecodeDictOfLists(encoded, key_transform=int)
+    encoded = parallel.EncodeDictOfLists(test_dict, key_transform=str)
+    decoded = parallel.DecodeDictOfLists(encoded, key_transform=int)
     self.assertEquals(test_dict, decoded)
 
   def testEncodeDictOfLists_ValueTransform(self):
     test_dict = {'a': ['0', '1', '2'], 'b': ['3', '4']}
     expected = {'a': [0, 1, 2], 'b': [3, 4]}
-    encoded = concurrent.EncodeDictOfLists(test_dict)
-    decoded = concurrent.DecodeDictOfLists(encoded, value_transform=int)
+    encoded = parallel.EncodeDictOfLists(test_dict)
+    decoded = parallel.DecodeDictOfLists(encoded, value_transform=int)
     self.assertEquals(expected, decoded)
 
   def testEncodeDictOfLists_Join_Empty(self):
     test_dict1 = {}
     test_dict2 = {}
     expected = {}
-    encoded1 = concurrent.EncodeDictOfLists(test_dict1)
-    encoded2 = concurrent.EncodeDictOfLists(test_dict2)
-    encoded = concurrent.JoinEncodedDictOfLists([encoded1, encoded2])
-    decoded = concurrent.DecodeDictOfLists(encoded)
+    encoded1 = parallel.EncodeDictOfLists(test_dict1)
+    encoded2 = parallel.EncodeDictOfLists(test_dict2)
+    encoded = parallel.JoinEncodedDictOfLists([encoded1, encoded2])
+    decoded = parallel.DecodeDictOfLists(encoded)
     self.assertEquals(expected, decoded)
 
   def testEncodeDictOfLists_Join_Singl(self):
     test_dict1 = {'key1': ['a']}
-    encoded1 = concurrent.EncodeDictOfLists(test_dict1)
-    encoded = concurrent.JoinEncodedDictOfLists([encoded1])
-    decoded = concurrent.DecodeDictOfLists(encoded)
+    encoded1 = parallel.EncodeDictOfLists(test_dict1)
+    encoded = parallel.JoinEncodedDictOfLists([encoded1])
+    decoded = parallel.DecodeDictOfLists(encoded)
     self.assertEquals(test_dict1, decoded)
 
   def testEncodeDictOfLists_JoinMultiple(self):
     test_dict1 = {'key1': ['a']}
     test_dict2 = {'key2': ['b']}
     expected = {'key1': ['a'], 'key2': ['b']}
-    encoded1 = concurrent.EncodeDictOfLists(test_dict1)
-    encoded2 = concurrent.EncodeDictOfLists({})
-    encoded3 = concurrent.EncodeDictOfLists(test_dict2)
-    encoded = concurrent.JoinEncodedDictOfLists([encoded1, encoded2, encoded3])
-    decoded = concurrent.DecodeDictOfLists(encoded)
+    encoded1 = parallel.EncodeDictOfLists(test_dict1)
+    encoded2 = parallel.EncodeDictOfLists({})
+    encoded3 = parallel.EncodeDictOfLists(test_dict2)
+    encoded = parallel.JoinEncodedDictOfLists([encoded1, encoded2, encoded3])
+    decoded = parallel.DecodeDictOfLists(encoded)
     self.assertEquals(expected, decoded)
 
   def testCallOnThread(self):
@@ -95,35 +95,35 @@
       self.assertNotEquals(my_thread, main_thread)
       return 3
 
-    result = concurrent.CallOnThread(callback, 1, arg2=2)
+    result = parallel.CallOnThread(callback, 1, arg2=2)
     self.assertEquals(3, result.get())
 
   def testForkAndCall_normal(self):
     parent_pid = os.getpid()
-    result = concurrent.ForkAndCall(_ForkTestHelper,
-                                    (1, 2, Unpicklable(), self, parent_pid))
+    result = parallel.ForkAndCall(_ForkTestHelper,
+                                  (1, 2, Unpicklable(), self, parent_pid))
     self.assertEquals(3, result.get())
 
   def testForkAndCall_exception(self):
     parent_pid = os.getpid()
-    result = concurrent.ForkAndCall(_ForkTestHelper,
-                                    (1, 'a', None, self, parent_pid))
+    result = parallel.ForkAndCall(_ForkTestHelper,
+                                  (1, 'a', None, self, parent_pid))
     self.assertRaises(TypeError, result.get)
 
   def testBulkForkAndCall_none(self):
-    results = concurrent.BulkForkAndCall(_ForkTestHelper, [])
+    results = parallel.BulkForkAndCall(_ForkTestHelper, [])
     self.assertEquals([], list(results))
 
   def testBulkForkAndCall_few(self):
     parent_pid = os.getpid()
-    results = concurrent.BulkForkAndCall(
-        _ForkTestHelper, [(1, 2, Unpicklable(), self, parent_pid),
-                          (3, 4, None, self, parent_pid)])
+    results = parallel.BulkForkAndCall(_ForkTestHelper,
+                                       [(1, 2, Unpicklable(), self, parent_pid),
+                                        (3, 4, None, self, parent_pid)])
     self.assertEquals({3, 7}, set(results))
 
   def testBulkForkAndCall_few_kwargs(self):
     parent_pid = os.getpid()
-    results = concurrent.BulkForkAndCall(
+    results = parallel.BulkForkAndCall(
         _ForkTestHelper, [(1, 2, Unpicklable()), (3, 4, None)],
         test_instance=self,
         parent_pid=parent_pid)
@@ -132,13 +132,13 @@
   def testBulkForkAndCall_many(self):
     parent_pid = os.getpid()
     args = [(1, 2, Unpicklable(), self, parent_pid) for _ in xrange(100)]
-    results = concurrent.BulkForkAndCall(_ForkTestHelper, args)
+    results = parallel.BulkForkAndCall(_ForkTestHelper, args)
     self.assertEquals([3] * 100, list(results))
 
   def testBulkForkAndCall_many_kwargs(self):
     parent_pid = os.getpid()
     args = [(1, 2) for _ in xrange(100)]
-    results = concurrent.BulkForkAndCall(
+    results = parallel.BulkForkAndCall(
         _ForkTestHelper,
         args,
         pickle_me_not=Unpicklable(),
@@ -148,8 +148,8 @@
 
   def testBulkForkAndCall_exception(self):
     parent_pid = os.getpid()
-    results = concurrent.BulkForkAndCall(_ForkTestHelper,
-                                         [(1, 'a', self, parent_pid)])
+    results = parallel.BulkForkAndCall(_ForkTestHelper,
+                                       [(1, 'a', self, parent_pid)])
     self.assertRaises(TypeError, results.next)
 
 
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index 240146e..09202544 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -487,9 +487,10 @@
 
     # Require zlib compression.
     zlib_dir = AddZlibToPath()
-    base_cmake_args.append('-DLLVM_ENABLE_ZLIB=FORCE_ON')
+    base_cmake_args.append('-DLLVM_ENABLE_ZLIB=ON')
     cflags.append('-I' + zlib_dir)
     cxxflags.append('-I' + zlib_dir)
+    ldflags.append('-LIBPATH:' + zlib_dir)
 
   if sys.platform == 'darwin':
     # Use the system libc++abi.
@@ -528,9 +529,12 @@
         '-DCMAKE_INSTALL_PREFIX=' + LLVM_BOOTSTRAP_INSTALL_DIR,
         '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
         '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
+        '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
+        '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
+        '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags),
         # Ignore args.disable_asserts for the bootstrap compiler.
         '-DLLVM_ENABLE_ASSERTIONS=ON',
-        ]
+    ]
     if sys.platform == 'darwin':
       # On macOS, the bootstrap toolchain needs to have compiler-rt because
       # dsymutil's link needs libclang_rt.osx.a. Only the x86_64 osx
@@ -614,9 +618,12 @@
         '-DLLVM_ENABLE_PROJECTS=' + projects,
         '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
         '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
+        '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
+        '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
+        '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags),
         # Build with instrumentation.
         '-DLLVM_BUILD_INSTRUMENTED=IR',
-        ]
+    ]
     # Build with the bootstrap compiler.
     if cc is not None:  instrument_args.append('-DCMAKE_C_COMPILER=' + cc)
     if cxx is not None: instrument_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
@@ -789,13 +796,16 @@
     compiler_rt_args = base_cmake_args + [
         '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
         '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
+        '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
+        '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
+        '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags),
         '-DCOMPILER_RT_BUILD_BUILTINS=OFF',
         '-DCOMPILER_RT_BUILD_CRT=OFF',
         '-DCOMPILER_RT_BUILD_LIBFUZZER=OFF',
         '-DCOMPILER_RT_BUILD_PROFILE=ON',
         '-DCOMPILER_RT_BUILD_SANITIZERS=OFF',
         '-DCOMPILER_RT_BUILD_XRAY=OFF',
-        ]
+    ]
     RunCommand(['cmake'] + compiler_rt_args +
                [os.path.join(LLVM_DIR, 'llvm')],
                msvc_arch='x86', env=deployment_env)
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index abc059b0..88df096 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -41,7 +41,7 @@
 # Reverting problematic clang rolls is safe, though.
 CLANG_REVISION = '9284abd0040afecfd619dbcf1b244a8b533291c9'
 CLANG_SVN_REVISION = 'n344329'
-CLANG_SUB_REVISION = 5
+CLANG_SUB_REVISION = 6
 
 PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8],
                                 CLANG_SUB_REVISION)
diff --git a/tools/clang/scripts/upload_revision.py b/tools/clang/scripts/upload_revision.py
index 0aa73fc..aa85505 100755
--- a/tools/clang/scripts/upload_revision.py
+++ b/tools/clang/scripts/upload_revision.py
@@ -92,14 +92,10 @@
   clang_svn_revision = 'n' + GetCommitCount(clang_git_revision)
   clang_sub_revision = args.clang_sub_revision
 
-  # Needs shell=True on Windows due to git.bat in depot_tools.
   os.chdir(CHROMIUM_DIR)
-  git_revision = subprocess.check_output(
-      ["git", "rev-parse", "origin/master"], shell=is_win).strip()
 
   print("Making a patch for Clang {}-{}-{}".format(
       clang_svn_revision, clang_git_revision[:8], clang_sub_revision))
-  print("Chrome revision: {}".format(git_revision))
 
   clang_old_git_revision, clang_old_svn_revision, clang_old_sub_revision = \
       PatchRevision(clang_git_revision, clang_svn_revision, clang_sub_revision)
@@ -107,7 +103,7 @@
   rev_string = "{}-{}-{}".format(clang_svn_revision,
                                  clang_git_revision[:8],
                                  clang_sub_revision)
-  Git(["checkout", "-b", "clang-{}".format(rev_string)])
+  Git(["checkout", "origin/master", "-b", "clang-{}".format(rev_string)])
   Git(["add", UPDATE_PY_PATH])
 
   old_rev_string = "{}-{}-{}".format(clang_old_svn_revision,
@@ -119,11 +115,10 @@
       old_rev_string, rev_string, commit_message)])
 
   Git(["cl", "upload", "-f", "--bypass-hooks"])
-  Git(["cl", "try", "-B", "chromium/try",
-       "-b", "linux_upload_clang",
-       "-b", "mac_upload_clang",
-       "-b", "win_upload_clang",
-       "-r", git_revision])
+  Git([
+      "cl", "try", "-B", "chromium/try", "-b", "linux_upload_clang", "-b",
+      "mac_upload_clang", "-b", "win_upload_clang"
+  ])
 
   print ("Please, wait until the try bots succeeded "
          "and then push the binaries to goma.")
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index aa52890..e35d1d8 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -27991,6 +27991,9 @@
   <int value="21" label="EXTERNAL_MEDIA"/>
   <int value="22" label="DOCUMENTS_PROVIDER"/>
   <int value="23" label="SMB"/>
+  <int value="24" label="RECENT_AUDIO"/>
+  <int value="25" label="RECENT_IMAGES"/>
+  <int value="26" label="RECENT_VIDEOS"/>
 </enum>
 
 <enum name="FileManagerTaskType">
@@ -53719,6 +53722,15 @@
   <int value="3" label="Profile deleted"/>
 </enum>
 
+<enum name="ProfileAvatarState">
+  <int value="0" label="Signed In: Gaia avatar"/>
+  <int value="1" label="Signed In: Modern avatar"/>
+  <int value="2" label="Signed In: Old avatar"/>
+  <int value="3" label="Signed Out: Default avatar (Grey silhouette)"/>
+  <int value="4" label="Signed Out: Modern avatar"/>
+  <int value="5" label="Signed Out: Old avatar"/>
+</enum>
+
 <enum name="ProfileCreateResult">
   <int value="0" label="Failed locally"/>
   <int value="1" label="Failed remotely"/>
@@ -53843,6 +53855,14 @@
   <int value="17" label="Edit profile button"/>
 </enum>
 
+<enum name="ProfileNameState">
+  <int value="0" label="Gaia name"/>
+  <int value="1" label="Gaia name and custom name"/>
+  <int value="2" label="Gaia name and default name (for unambiguity)"/>
+  <int value="3" label="Custom name only (signed-out)"/>
+  <int value="4" label="Default name only (signed-out)"/>
+</enum>
+
 <enum name="ProfileNetUserCount">
   <int value="0" label="Added new user"/>
   <int value="1" label="Deleted a profile"/>
@@ -53953,6 +53973,13 @@
   <int value="1" label="Secondary (user-created) profile"/>
 </enum>
 
+<enum name="ProfileUnconsentedPrimaryAccountType">
+  <int value="0" label="Consumer account"/>
+  <int value="1" label="Enterprise account"/>
+  <int value="2" label="Child account"/>
+  <int value="3" label="No account (signed-out)"/>
+</enum>
+
 <enum name="ProfileUpgradeEnrollment">
   <int value="0" label="User viewed the Upgrade promo card in the user menu."/>
   <int value="1" label="User selected to view the intro tutorial."/>
@@ -59840,6 +59867,9 @@
 </enum>
 
 <enum name="SigninDiceMigrationStatus">
+  <obsolete>
+    Removed 03/2020.
+  </obsolete>
   <int value="0" label="Enabled"/>
   <int value="1" label="Disabled, ready for migration"/>
   <int value="2" label="Disabled, not ready for migration"/>
@@ -66107,6 +66137,17 @@
   <int value="1" label="Was used in draw"/>
 </enum>
 
+<enum name="UsedMimeTypeHandler">
+  <summary>
+    Reports the default MIME type handler that is being used to display a file.
+  </summary>
+  <int value="0" label="PdfExtension"/>
+  <int value="1" label="QuickOfficeComponentExtension"/>
+  <int value="2" label="QuickOfficeInternalExtension"/>
+  <int value="3" label="QuickOfficeExtension"/>
+  <int value="4" label="TestExtension"/>
+</enum>
+
 <enum name="UsedOmnibox">
   <int value="0" label="Used Omnibox"/>
 </enum>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index d536fbe4..8ad50e22 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -55048,6 +55048,17 @@
   <summary>Updates grouped by Extension::HistogramType.</summary>
 </histogram>
 
+<histogram name="Extensions.UsedMimeTypeHandler" enum="UsedMimeTypeHandler"
+    expires_after="2021-03-01">
+  <owner>apotapchuk@chromium.org</owner>
+  <owner>anqing@chromium.org</owner>
+  <summary>
+    Tracks the usage of different MIME type handlers used to view files. It is
+    recorded when the browser intercepts navigation with one of the type
+    handlers.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.WebRequest.EventListenerFlag"
     enum="WebRequestEventListenerFlag" expires_after="never">
 <!-- expires-never: For monitoring Web Request API usage statistics. -->
@@ -116813,7 +116824,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the flow was completed when CanMakePayment was not called by the
     merchant.
@@ -116825,7 +116836,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the merchant used the CanMakePayment method during a Payment
     Request.
@@ -116837,7 +116848,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     The effect of the CanMakePayment return value on whether Show was called.
   </summary>
@@ -116849,7 +116860,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the flow was completed when CanMakePayment was called by the
     merchant and returned false.
@@ -116862,7 +116873,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the flow was completed when CanMakePayment was called by the
     merchant and returned true.
@@ -116871,7 +116882,8 @@
 
 <histogram name="PaymentRequest.CheckoutFunnel.Aborted"
     enum="PaymentRequestAbortReason" expires_after="M85">
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
+  <owner>web-payments-team@google.com</owner>
   <summary>The reason that lead to an abort of the Payment Request.</summary>
 </histogram>
 
@@ -116880,7 +116892,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>When the merchant has processed the user's Payment Request.</summary>
 </histogram>
 
@@ -116889,13 +116901,14 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>When a Payment Request gets initiated by the user.</summary>
 </histogram>
 
 <histogram name="PaymentRequest.CheckoutFunnel.NoShow"
     enum="PaymentRequestNoShowReason" expires_after="2020-05-24">
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
+  <owner>web-payments-team@google.com</owner>
   <summary>
     The reason that leads to the Payment Request not being shown to the user.
   </summary>
@@ -116906,7 +116919,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     When the user clicks the &quot;pay&quot; button in the Payment Request UI.
   </summary>
@@ -116917,7 +116930,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     When the browser retrieves the instrument details from the payment app to
     complete a purchase.
@@ -116929,7 +116942,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     When the Payment Request UI gets shown after initialization.
   </summary>
@@ -116940,7 +116953,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     When the Payment Request UI gets skipped to go directly to the payment app.
   </summary>
@@ -116948,7 +116961,8 @@
 
 <histogram name="PaymentRequest.Events" units="bitfield value"
     expires_after="2020-07-26">
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
+  <owner>web-payments-team@google.com</owner>
   <summary>
     A bitfield representing the different events that happened during the
     Payment Request.
@@ -117014,7 +117028,8 @@
 
 <histogram name="PaymentRequest.NumberOfSelectionAdds" units="units"
     expires_after="2020-07-26">
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
+  <owner>web-payments-team@google.com</owner>
   <summary>
     The number of times the user added an entry during a Payment Request.
   </summary>
@@ -117022,23 +117037,26 @@
 
 <histogram name="PaymentRequest.NumberOfSelectionChanges" units="units"
     expires_after="2020-07-26">
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
+  <owner>web-payments-team@google.com</owner>
   <summary>
     The number of times the user changed an entry during a Payment Request.
   </summary>
 </histogram>
 
 <histogram name="PaymentRequest.NumberOfSelectionEdits" units="units"
-    expires_after="2020-03-22">
-  <owner>sebsg@chromium.org</owner>
+    expires_after="2020-10-22">
+  <owner>danyao@chromium.org</owner>
+  <owner>web-payments-team@google.com</owner>
   <summary>
     The number of times the user edited an entry during a Payment Request.
   </summary>
 </histogram>
 
 <histogram name="PaymentRequest.NumberOfSuggestionsShown" units="units"
-    expires_after="2020-03-22">
-  <owner>sebsg@chromium.org</owner>
+    expires_after="2020-10-22">
+  <owner>danyao@chromium.org</owner>
+  <owner>web-payments-team@google.com</owner>
   <summary>
     The number of suggestions shown to the user during a payment request.
   </summary>
@@ -117049,7 +117067,7 @@
   <obsolete>
     M62+ Included in PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Tracks what user information is required by merchants to complete a Payment
     Request.
@@ -117061,7 +117079,7 @@
   <obsolete>
     M62+ Included in PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Tracks what payment method was used to complete a transaction in Payment
     Request.
@@ -117156,7 +117174,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the flow was completed when the user did not have a complete
     suggestion offered for each requested information.
@@ -117170,7 +117188,7 @@
     Replaced by PaymentRequest.NumberOfSuggestionsShown.PaymentMethod on July
     19th 2017.
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the flow was completed when the user did not have a a form of
     payment on file when the Payment Request was shown.
@@ -117183,7 +117201,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the flow was completed when the user did not have suggestions
     offered for each requested information.
@@ -117196,7 +117214,7 @@
   <obsolete>
     M62+ Part of PaymentRequest.Events
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the flow was completed when the user had at least one complete
     suggestion offered for each requested information.
@@ -117209,7 +117227,7 @@
     Replaced by PaymentRequest.NumberOfSuggestionsShown.PaymentMethod on July
     19th 2017.
   </obsolete>
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
   <summary>
     Whether the flow was completed when the user had a form of payment on file
     when the Payment Request was shown.
@@ -117219,7 +117237,8 @@
 <histogram
     name="PaymentRequest.UserHadSuggestionsForEverything.EffectOnCompletion"
     enum="PaymentRequestFlowCompletionStatus" expires_after="M85">
-  <owner>sebsg@chromium.org</owner>
+  <owner>danyao@chromium.org</owner>
+  <owner>web-payments-team@google.com</owner>
   <summary>
     Whether the flow was completed when the user had suggestions offered for
     each requested information.
@@ -127707,6 +127726,48 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="Profile.State.Avatar" enum="ProfileAvatarState"
+    expires_after="2021-03-11">
+  <owner>jkrcal@chromium.org</owner>
+  <owner>droger@chromium.org</owner>
+  <summary>
+    The state of profile avatars as would be displayed to the user in the
+    profile picker. Recorded on startup of Chrome and whenever Chrome is used
+    after at least 30 minutes of inactivity.
+  </summary>
+</histogram>
+
+<histogram base="true" name="Profile.State.LastUsed" units="days"
+    expires_after="2021-03-11">
+  <owner>jkrcal@chromium.org</owner>
+  <owner>droger@chromium.org</owner>
+  <summary>
+    The number of days since a profile was last used. Recorded on startup of
+    Chrome and whenever Chrome is used after at least 30 minutes of inactivity.
+  </summary>
+</histogram>
+
+<histogram base="true" name="Profile.State.Name" enum="ProfileNameState"
+    expires_after="2021-03-11">
+  <owner>jkrcal@chromium.org</owner>
+  <owner>droger@chromium.org</owner>
+  <summary>
+    The state of profile name as would be displayed to the user in the profile
+    picker. Recorded on startup of Chrome and whenever Chrome is used after at
+    least 30 minutes of inactivity.
+  </summary>
+</histogram>
+
+<histogram base="true" name="Profile.State.UnconsentedPrimaryAccountType"
+    enum="ProfileUnconsentedPrimaryAccountType" expires_after="2021-03-11">
+  <owner>jkrcal@chromium.org</owner>
+  <owner>droger@chromium.org</owner>
+  <summary>
+    The type of profile's unconsented primary account. Recorded on startup of
+    Chrome and whenever Chrome is used after at least 30 minutes of inactivity.
+  </summary>
+</histogram>
+
 <histogram name="Profile.SupervisedProfileCreateError"
     enum="GoogleServiceAuthError" expires_after="2019-02-12">
   <obsolete>
@@ -140702,6 +140763,10 @@
 
 <histogram name="Scheduling.Renderer.PendingTreeDuration" units="microseconds"
     expires_after="M81">
+  <obsolete>
+    This duration is reported in EndCommitToActivation and Activation of
+    CompositorLatency metrics, and is removeded as of 03/2020.
+  </obsolete>
   <owner>ericrk@chromium.org</owner>
   <summary>
     Time between creating a pending tree and activating that tree. This differs
@@ -148180,6 +148245,16 @@
   </summary>
 </histogram>
 
+<histogram name="SharedMemory.MapBlockedForSecurity" enum="BooleanBlocked"
+    expires_after="M85">
+  <owner>dcheng@chromium.org</owner>
+  <owner>rsesek@chromium.org</owner>
+  <summary>
+    Tracks whether an attempt to map shared memory was blocked due to too much
+    shared memory already being mapped into the address space.
+  </summary>
+</histogram>
+
 <histogram name="SharedMemory.TimeSpentMakingAnonymousMemory" units="ms"
     expires_after="2015-06-03">
   <obsolete>
@@ -149527,6 +149602,9 @@
 
 <histogram name="Signin.DiceMigrationStatus" enum="SigninDiceMigrationStatus"
     expires_after="2020-04-19">
+  <obsolete>
+    Removed 03/2020, as it was equivalent to Signin.SigninAllowed.
+  </obsolete>
   <owner>droger@chromium.org</owner>
   <summary>
     The Dice migration status, recorded at startup for each profile.
@@ -194569,6 +194647,24 @@
   <affected-histogram name="UserImage.ProfileDownloadTime"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="ProfileStateGroup" separator="_">
+  <suffix name="ActiveMultiProfile"
+      label="Recorded only for users with &gt;=2 active profiles; recorded
+             for all their profiles."/>
+  <suffix name="All" label="Recorded for every profile of every user."/>
+  <suffix name="LatentMultiProfileActive"
+      label="Recorded only for users with &gt;=2 profiles but only one
+             active; recorded only for the one active profile."/>
+  <suffix name="LatentMultiProfileOthers"
+      label="Recorded only for users with &gt;=2 profiles but only one
+             active; recorded only for the non-active profiles."/>
+  <suffix name="SingleProfile" label="Recorded only for single-profile users."/>
+  <affected-histogram name="Profile.State.Avatar"/>
+  <affected-histogram name="Profile.State.LastUsed"/>
+  <affected-histogram name="Profile.State.Name"/>
+  <affected-histogram name="Profile.State.UnconsentedPrimaryAccountType"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="ProgressiveScan" separator="_">
   <suffix name="33Percent_4MinMax"
       label="Progressive scan @ 33%, 4 frequency bins."/>
diff --git a/ui/accessibility/ax_language_detection.cc b/ui/accessibility/ax_language_detection.cc
index 7a5f844a..0229b26 100644
--- a/ui/accessibility/ax_language_detection.cc
+++ b/ui/accessibility/ax_language_detection.cc
@@ -414,7 +414,7 @@
           attr_value, kMaxDetectedLanguagesPerPage);
   // Create vector of AXLanguageSpans.
   for (const auto& result : top_languages) {
-    std::vector<SpanInfo> ranges = result.byte_ranges;
+    const std::vector<SpanInfo>& ranges = result.byte_ranges;
     for (const auto& span_info : ranges) {
       language_annotation.push_back(
           AXLanguageSpan{span_info.start_index, span_info.end_index,
diff --git a/ui/accessibility/mojom/ax_tree_update_mojom_traits.h b/ui/accessibility/mojom/ax_tree_update_mojom_traits.h
index d9ee995b..18a8bb8a 100644
--- a/ui/accessibility/mojom/ax_tree_update_mojom_traits.h
+++ b/ui/accessibility/mojom/ax_tree_update_mojom_traits.h
@@ -17,14 +17,14 @@
   static bool has_tree_data(const ui::AXTreeUpdate& p) {
     return p.has_tree_data;
   }
-  static ui::AXTreeData tree_data(const ui::AXTreeUpdate& p) {
+  static const ui::AXTreeData& tree_data(const ui::AXTreeUpdate& p) {
     return p.tree_data;
   }
   static int32_t node_id_to_clear(const ui::AXTreeUpdate& p) {
     return p.node_id_to_clear;
   }
   static int32_t root_id(const ui::AXTreeUpdate& p) { return p.root_id; }
-  static std::vector<ui::AXNodeData> nodes(const ui::AXTreeUpdate& p) {
+  static const std::vector<ui::AXNodeData>& nodes(const ui::AXTreeUpdate& p) {
     return p.nodes;
   }
   static ax::mojom::EventFrom event_from(const ui::AXTreeUpdate& p) {
diff --git a/ui/chromeos/ime/candidate_window_view.cc b/ui/chromeos/ime/candidate_window_view.cc
index 7e887a0..52027104 100644
--- a/ui/chromeos/ime/candidate_window_view.cc
+++ b/ui/chromeos/ime/candidate_window_view.cc
@@ -151,7 +151,7 @@
       should_show_upper_side_(false),
       was_candidate_window_open_(false),
       window_shell_id_(window_shell_id) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   SetCanActivate(false);
   DCHECK(parent);
   set_parent_window(parent);
diff --git a/ui/chromeos/ime/infolist_window.cc b/ui/chromeos/ime/infolist_window.cc
index 14739f0..7aafeca 100644
--- a/ui/chromeos/ime/infolist_window.cc
+++ b/ui/chromeos/ime/infolist_window.cc
@@ -173,7 +173,7 @@
       title_font_list_(gfx::Font(kJapaneseFontName, kFontSizeDelta + 15)),
       description_font_list_(
           gfx::Font(kJapaneseFontName, kFontSizeDelta + 11)) {
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   SetCanActivate(false);
   set_accept_events(false);
   set_margins(gfx::Insets());
diff --git a/ui/file_manager/base/js/volume_manager_types.js b/ui/file_manager/base/js/volume_manager_types.js
index b39305e..c39fbd9 100644
--- a/ui/file_manager/base/js/volume_manager_types.js
+++ b/ui/file_manager/base/js/volume_manager_types.js
@@ -126,6 +126,15 @@
 
   // Root directory of an SMB file share.
   SMB: 'smb',
+
+  // Root directory of recently-modified audio files.
+  RECENT_AUDIO: 'recent_audio',
+
+  // Root directory of recently-modified image files.
+  RECENT_IMAGES: 'recent_images',
+
+  // Root directory of recently-modified video files.
+  RECENT_VIDEOS: 'recent_videos',
 };
 Object.freeze(VolumeManagerCommon.RootType);
 
@@ -163,6 +172,9 @@
   VolumeManagerCommon.RootType.EXTERNAL_MEDIA,                    // 21
   VolumeManagerCommon.RootType.DOCUMENTS_PROVIDER,                // 22
   VolumeManagerCommon.RootType.SMB,                               // 23
+  VolumeManagerCommon.RootType.RECENT_AUDIO,                      // 24
+  VolumeManagerCommon.RootType.RECENT_IMAGES,                     // 25
+  VolumeManagerCommon.RootType.RECENT_VIDEOS,                     // 26
 ];
 console.assert(
     Object.keys(VolumeManagerCommon.RootType).length ===
diff --git a/ui/file_manager/base/js/volume_manager_types_unittest.js b/ui/file_manager/base/js/volume_manager_types_unittest.js
index 843af9c2..30fdaef 100644
--- a/ui/file_manager/base/js/volume_manager_types_unittest.js
+++ b/ui/file_manager/base/js/volume_manager_types_unittest.js
@@ -34,6 +34,9 @@
     // TODO(tapted): Validate this against util.isFakeEntry(..) when
     // files_app_entry_types is moved to file_manager/base.
     if (rootType === VolumeManagerCommon.RootType.RECENT ||
+        rootType === VolumeManagerCommon.RootType.RECENT_AUDIO ||
+        rootType === VolumeManagerCommon.RootType.RECENT_IMAGES ||
+        rootType === VolumeManagerCommon.RootType.RECENT_VIDEOS ||
         rootType === VolumeManagerCommon.RootType.DRIVE_FAKE_ROOT ||
         rootType ===
             VolumeManagerCommon.RootType.DEPRECATED_ADD_NEW_SERVICES_MENU) {
diff --git a/ui/file_manager/file_manager/background/js/entry_location_impl.js b/ui/file_manager/file_manager/background/js/entry_location_impl.js
index 9c369a7..6e7c301 100644
--- a/ui/file_manager/file_manager/background/js/entry_location_impl.js
+++ b/ui/file_manager/file_manager/background/js/entry_location_impl.js
@@ -30,7 +30,7 @@
         this.rootType === VolumeManagerCommon.RootType.DRIVE_OFFLINE ||
         this.rootType === VolumeManagerCommon.RootType.DRIVE_SHARED_WITH_ME ||
         this.rootType === VolumeManagerCommon.RootType.DRIVE_RECENT ||
-        this.rootType === VolumeManagerCommon.RootType.RECENT;
+        util.isRecentRootType(this.rootType);
 
     /** @override */
     this.isDriveBased = this.rootType === VolumeManagerCommon.RootType.DRIVE ||
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js
index 69db0e1..d935c93 100644
--- a/ui/file_manager/file_manager/common/js/util.js
+++ b/ui/file_manager/file_manager/common/js/util.js
@@ -575,13 +575,24 @@
 };
 
 /**
+ * Returns true if the given root type is for a container of recent files.
+ * @param {VolumeManagerCommon.RootType|null} rootType
+ * @return {boolean}
+ */
+util.isRecentRootType = rootType => {
+  return rootType == VolumeManagerCommon.RootType.RECENT ||
+      rootType == VolumeManagerCommon.RootType.RECENT_AUDIO ||
+      rootType == VolumeManagerCommon.RootType.RECENT_IMAGES ||
+      rootType == VolumeManagerCommon.RootType.RECENT_VIDEOS;
+};
+
+/**
  * Returns true if the given entry is the root folder of recent files.
  * @param {!Entry|!FilesAppEntry} entry Entry or a fake entry.
  * @returns {boolean}
  */
 util.isRecentRoot = entry => {
-  return util.isFakeEntry(entry) &&
-      entry.rootType == VolumeManagerCommon.RootType.RECENT;
+  return util.isFakeEntry(entry) && util.isRecentRootType(entry.rootType);
 };
 
 /**
@@ -1119,6 +1130,12 @@
       return str('DRIVE_DIRECTORY_LABEL');
     case VolumeManagerCommon.RootType.RECENT:
       return str('RECENT_ROOT_LABEL');
+    case VolumeManagerCommon.RootType.RECENT_AUDIO:
+      return str('MEDIA_VIEW_AUDIO_ROOT_LABEL');
+    case VolumeManagerCommon.RootType.RECENT_IMAGES:
+      return str('MEDIA_VIEW_IMAGES_ROOT_LABEL');
+    case VolumeManagerCommon.RootType.RECENT_VIDEOS:
+      return str('MEDIA_VIEW_VIDEOS_ROOT_LABEL');
     case VolumeManagerCommon.RootType.CROSTINI:
       return str('LINUX_FILES_ROOT_LABEL');
     case VolumeManagerCommon.RootType.MY_FILES:
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.js b/ui/file_manager/file_manager/foreground/js/directory_model.js
index 17b9514..f175b896 100644
--- a/ui/file_manager/file_manager/foreground/js/directory_model.js
+++ b/ui/file_manager/file_manager/foreground/js/directory_model.js
@@ -209,8 +209,7 @@
    */
   isCurrentRootVolumeType_(volumeType) {
     const rootType = this.getCurrentRootType();
-    return rootType != null &&
-        rootType != VolumeManagerCommon.RootType.RECENT &&
+    return rootType != null && !util.isRecentRootType(rootType) &&
         VolumeManagerCommon.getVolumeTypeFromRootType(rootType) === volumeType;
   }
 
@@ -1308,7 +1307,7 @@
             chrome.fileManagerPrivate.DriveConnectionStateType.OFFLINE &&
         (locationInfo && locationInfo.isDriveBased);
 
-    if (entry.rootType == VolumeManagerCommon.RootType.RECENT) {
+    if (util.isRecentRootType(entry.rootType)) {
       return DirectoryContents.createForRecent(
           context, /** @type {!FakeEntry} */ (entry), query);
     }
diff --git a/ui/file_manager/file_manager/foreground/js/last_modified_controller.js b/ui/file_manager/file_manager/foreground/js/last_modified_controller.js
index 0b0f6c7..c27d078 100644
--- a/ui/file_manager/file_manager/foreground/js/last_modified_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/last_modified_controller.js
@@ -29,8 +29,7 @@
     // If the current directory is Recent root, request FileTable to use
     // modificationByMeTime instead of modificationTime in last modified column.
     const useModificationByMeTime =
-        this.directoryModel_.getCurrentRootType() ===
-        VolumeManagerCommon.RootType.RECENT;
+        util.isRecentRootType(this.directoryModel_.getCurrentRootType());
     this.fileTable_.setUseModificationByMeTime(useModificationByMeTime);
     this.directoryModel_.getFileList().setUseModificationByMeTime(
         useModificationByMeTime);
diff --git a/ui/file_manager/file_manager/foreground/js/main_window_component.js b/ui/file_manager/file_manager/foreground/js/main_window_component.js
index a7dc7c4..e9d3bf1d 100644
--- a/ui/file_manager/file_manager/foreground/js/main_window_component.js
+++ b/ui/file_manager/file_manager/foreground/js/main_window_component.js
@@ -487,8 +487,7 @@
   onWindowFocus_() {
     // When the window have got a focus while the current directory is Recent
     // root, refresh the contents.
-    if (this.directoryModel_.getCurrentRootType() ===
-        VolumeManagerCommon.RootType.RECENT) {
+    if (util.isRecentRootType(this.directoryModel_.getCurrentRootType())) {
       this.directoryModel_.rescan(true /* refresh */);
       // Do not start the spinner here to silently refresh the contents.
     }
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
index 21faa38..23e8c9e 100644
--- a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
+++ b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
@@ -548,12 +548,14 @@
      * their file types.
      * @param {string} label
      * @param {chrome.fileManagerPrivate.RecentFileType} fileType
+     * @param {VolumeManagerCommon.RootType} rootType
      * @return {!NavigationModelFakeItem}
      */
-    const createFilteredRecentModelItem = (label, fileType) => {
+    const createFilteredRecentModelItem = (label, fileType, rootType) => {
       const entry = /** @type {!FakeEntry} */ (Object.assign(
           Object.create(FakeEntry.prototype), this.recentModelItem_.entry));
       entry.recentFileType = fileType;
+      entry.rootType = rootType;
       return new NavigationModelFakeItem(
           label, NavigationModelItemType.RECENT, entry);
     };
@@ -567,13 +569,16 @@
         // Unified Media View (Images, Videos and Audio).
         this.navigationItems_.push(createFilteredRecentModelItem(
             str('MEDIA_VIEW_AUDIO_ROOT_LABEL'),
-            chrome.fileManagerPrivate.RecentFileType.AUDIO));
+            chrome.fileManagerPrivate.RecentFileType.AUDIO,
+            VolumeManagerCommon.RootType.RECENT_AUDIO));
         this.navigationItems_.push(createFilteredRecentModelItem(
             str('MEDIA_VIEW_IMAGES_ROOT_LABEL'),
-            chrome.fileManagerPrivate.RecentFileType.IMAGE));
+            chrome.fileManagerPrivate.RecentFileType.IMAGE,
+            VolumeManagerCommon.RootType.RECENT_IMAGES));
         this.navigationItems_.push(createFilteredRecentModelItem(
             str('MEDIA_VIEW_VIDEOS_ROOT_LABEL'),
-            chrome.fileManagerPrivate.RecentFileType.VIDEO));
+            chrome.fileManagerPrivate.RecentFileType.VIDEO,
+            VolumeManagerCommon.RootType.RECENT_VIDEOS));
       }
     }
 
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
index 9252f65..a199ded1 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -1845,7 +1845,7 @@
     icon.classList.add('item-icon');
     icon.setAttribute('root-type-icon', rootType);
 
-    if (rootType === VolumeManagerCommon.RootType.RECENT) {
+    if (util.isRecentRootType(rootType)) {
       if (this.dirEntry_.recentFileType) {
         icon.setAttribute('recent-file-type', this.dirEntry_.recentFileType);
       } else {  // Recent tab scroll fix: crbug.com/1027973.
diff --git a/ui/file_manager/integration_tests/file_manager/directory_tree.js b/ui/file_manager/integration_tests/file_manager/directory_tree.js
index 9411c85..d99ef6c 100644
--- a/ui/file_manager/integration_tests/file_manager/directory_tree.js
+++ b/ui/file_manager/integration_tests/file_manager/directory_tree.js
@@ -312,13 +312,11 @@
     chrome.test.assertTrue(await remoteCall.callRemoteTestUtil(
         'requestAnimationFrame', appId, []));
 
-    // Get the scroll limits: see crbug.com/721759 for RTL |scrollRight|.
     const scrolled = await remoteCall.waitForElementStyles(
         appId, directoryTree, ['scrollLeft']);
-    const scrollRight = scrolled.scrollWidth - scrolled.renderedWidth;
 
     // Check: the directory tree should not be horizontally scrolled.
-    const notScrolled = scrolled.scrollLeft === scrollRight;
+    const notScrolled = scrolled.scrollLeft === 0;
     chrome.test.assertTrue(notScrolled, 'Tree should not scroll right');
   };
 
diff --git a/ui/file_manager/integration_tests/file_manager/recents.js b/ui/file_manager/integration_tests/file_manager/recents.js
index 90f2bac..9aa99baa 100644
--- a/ui/file_manager/integration_tests/file_manager/recents.js
+++ b/ui/file_manager/integration_tests/file_manager/recents.js
@@ -68,6 +68,12 @@
   await verifyCurrentEntries(appId, expectedEntries);
 }
 
+async function verifyBreadcrumbsPath(appId, expectedPath) {
+  const path =
+      await remoteCall.callRemoteTestUtil('getBreadcrumbPath', appId, []);
+  chrome.test.assertEq(expectedPath, path);
+}
+
 testcase.recentsDownloads = async () => {
   // Populate downloads.
   const appId = await setupAndWaitUntilReady(
@@ -119,6 +125,9 @@
       RootPath.DOWNLOADS, BASIC_LOCAL_ENTRY_SET, []);
   // ENTRIES.beautiful is recently-modified and has .ogg file extension.
   await verifyRecentAudio(appId, [ENTRIES.beautiful]);
+
+  // Breadcrumbs path should be '/Audio'.
+  await verifyBreadcrumbsPath(appId, '/Audio');
 };
 
 testcase.recentAudioDownloadsAndDrive = async () => {
@@ -136,6 +145,9 @@
       RootPath.DOWNLOADS, BASIC_LOCAL_ENTRY_SET, []);
   // ENTRIES.desktop is recently-modified and has .png file extension.
   await verifyRecentImages(appId, [ENTRIES.desktop]);
+
+  // Breadcrumbs path should be '/Images'.
+  await verifyBreadcrumbsPath(appId, '/Images');
 };
 
 testcase.recentImagesDownloadsAndDrive = async () => {
@@ -152,6 +164,9 @@
       RootPath.DOWNLOADS,
       BASIC_LOCAL_ENTRY_SET.concat([RECENTLY_MODIFIED_VIDEO]), []);
   await verifyRecentVideos(appId, [RECENTLY_MODIFIED_VIDEO]);
+
+  // Breadcrumbs path should be '/Videos'.
+  await verifyBreadcrumbsPath(appId, '/Videos');
 };
 
 testcase.recentVideosDownloadsAndDrive = async () => {
diff --git a/ui/gfx/range/range_f.cc b/ui/gfx/range/range_f.cc
index b3bfc69..553e511 100644
--- a/ui/gfx/range/range_f.cc
+++ b/ui/gfx/range/range_f.cc
@@ -14,16 +14,6 @@
 
 namespace gfx {
 
-RangeF RangeF::Intersect(const RangeF& range) const {
-  float min = std::max(GetMin(), range.GetMin());
-  float max = std::min(GetMax(), range.GetMax());
-
-  if (min >= max)  // No intersection.
-    return InvalidRange();
-
-  return RangeF(min, max);
-}
-
 RangeF RangeF::Intersect(const Range& range) const {
   RangeF range_f(range.start(), range.end());
   return Intersect(range_f);
diff --git a/ui/gfx/range/range_f.h b/ui/gfx/range/range_f.h
index 1d58ad4..1d51b29 100644
--- a/ui/gfx/range/range_f.h
+++ b/ui/gfx/range/range_f.h
@@ -65,20 +65,35 @@
 
   // Returns true if this range intersects the specified |range|.
   constexpr bool Intersects(const RangeF& range) const {
-    return IsValid() && range.IsValid() &&
-           !(range.GetMax() < GetMin() || range.GetMin() >= GetMax());
+    return Intersect(range).IsValid();
+  }
+
+  // Returns true if this range is contained by the specified |range| or it is
+  // an empty range and ending the range |range|. (copied from gfx::Range)
+  constexpr bool IsBoundedBy(const RangeF& range) const {
+    return IsValid() && range.IsValid() && GetMin() >= range.GetMin() &&
+           GetMax() <= range.GetMax();
   }
 
   // Returns true if this range contains the specified |range|.
   constexpr bool Contains(const RangeF& range) const {
-    return IsValid() && range.IsValid() && GetMin() <= range.GetMin() &&
-           range.GetMax() <= GetMax();
+    return range.IsBoundedBy(*this) &&
+           // A non-empty range doesn't contain the range [max, max).
+           (range.GetMax() != GetMax() || range.is_empty() == is_empty());
   }
 
   // Computes the intersection of this range with the given |range|.
   // If they don't intersect, it returns an InvalidRange().
   // The returned range is always empty or forward (never reversed).
-  RangeF Intersect(const RangeF& range) const;
+  constexpr RangeF Intersect(const RangeF& range) const {
+    const float min = std::max(GetMin(), range.GetMin());
+    const float max = std::min(GetMax(), range.GetMax());
+
+    return (min < max || Contains(range) || range.Contains(*this))
+               ? RangeF(min, max)
+               : InvalidRange();
+  }
+
   RangeF Intersect(const Range& range) const;
 
   // Floor/Ceil/Round the start and end values of the given RangeF.
diff --git a/ui/gfx/range/range_unittest.cc b/ui/gfx/range/range_unittest.cc
index 42fc5aa97..55fbbcb 100644
--- a/ui/gfx/range/range_unittest.cc
+++ b/ui/gfx/range/range_unittest.cc
@@ -311,6 +311,63 @@
   }
 }
 
+TEST(RangeTest, RangeFOperations) {
+  constexpr gfx::RangeF invalid_range = gfx::RangeF::InvalidRange();
+  constexpr gfx::RangeF ranges[] = {{0.f, 0.f}, {0.f, 1.f}, {0.f, 2.f},
+                                    {1.f, 0.f}, {1.f, 1.f}, {1.f, 2.f},
+                                    {2.f, 0.f}, {2.f, 1.f}, {2.f, 2.f}};
+
+  // Ensures valid behavior over same range.
+  for (const auto& range : ranges) {
+    SCOPED_TRACE(range.ToString());
+    // A range should contain itself.
+    EXPECT_TRUE(range.Contains(range));
+    // A ranges should intersect with itself.
+    EXPECT_TRUE(range.Intersects(range));
+  }
+
+  // Ensures valid behavior with an invalid range.
+  for (const auto& range : ranges) {
+    SCOPED_TRACE(range.ToString());
+    EXPECT_FALSE(invalid_range.Contains(range));
+    EXPECT_FALSE(invalid_range.Intersects(range));
+    EXPECT_FALSE(range.Contains(invalid_range));
+    EXPECT_FALSE(range.Intersects(invalid_range));
+  }
+  EXPECT_FALSE(invalid_range.Contains(invalid_range));
+  EXPECT_FALSE(invalid_range.Intersects(invalid_range));
+
+  // Ensures consistent operations between Contains(...) and Intersects(...).
+  for (const auto& range1 : ranges) {
+    for (const auto& range2 : ranges) {
+      SCOPED_TRACE(testing::Message()
+                   << "range1=" << range1 << " range2=" << range2);
+      if (range1.Contains(range2)) {
+        EXPECT_TRUE(range1.Intersects(range2));
+        EXPECT_EQ(range2.Contains(range1),
+                  range1.EqualsIgnoringDirection(range2));
+      }
+      EXPECT_EQ(range2.Intersects(range1), range1.Intersects(range2));
+
+      EXPECT_EQ(range1.Intersect(range2) != invalid_range,
+                range1.Intersects(range2));
+    }
+  }
+
+  // Ranges should behave the same way no matter the direction.
+  for (const auto& range1 : ranges) {
+    for (const auto& range2 : ranges) {
+      SCOPED_TRACE(testing::Message()
+                   << "range1=" << range1 << " range2=" << range2);
+      EXPECT_EQ(range1.Contains(range2),
+                range1.Contains(gfx::RangeF(range2.GetMax(), range2.GetMin())));
+      EXPECT_EQ(
+          range1.Intersects(range2),
+          range1.Intersects(gfx::RangeF(range2.GetMax(), range2.GetMin())));
+    }
+  }
+}
+
 TEST(RangeTest, ContainsAndIntersects) {
   constexpr gfx::Range r1(0, 0);
   constexpr gfx::Range r2(0, 1);
@@ -373,6 +430,68 @@
   EXPECT_TRUE(r8.Intersects(r8));
 }
 
+TEST(RangeTest, ContainsAndIntersectsRangeF) {
+  constexpr gfx::RangeF r1(0.f, 0.f);
+  constexpr gfx::RangeF r2(0.f, 1.f);
+  constexpr gfx::RangeF r3(1.f, 2.f);
+  constexpr gfx::RangeF r4(1.f, 0.f);
+  constexpr gfx::RangeF r5(2.f, 1.f);
+  constexpr gfx::RangeF r6(0.f, 2.f);
+  constexpr gfx::RangeF r7(2.f, 0.f);
+  constexpr gfx::RangeF r8(1.f, 1.f);
+
+  // Ensures Contains(...) handle the open range.
+  EXPECT_TRUE(r2.Contains(r1));
+  EXPECT_TRUE(r4.Contains(r1));
+  EXPECT_TRUE(r3.Contains(r5));
+  EXPECT_TRUE(r5.Contains(r3));
+
+  // Ensures larger ranges contains smaller ranges.
+  EXPECT_TRUE(r6.Contains(r1));
+  EXPECT_TRUE(r6.Contains(r2));
+  EXPECT_TRUE(r6.Contains(r3));
+  EXPECT_TRUE(r6.Contains(r4));
+  EXPECT_TRUE(r6.Contains(r5));
+
+  EXPECT_TRUE(r7.Contains(r1));
+  EXPECT_TRUE(r7.Contains(r2));
+  EXPECT_TRUE(r7.Contains(r3));
+  EXPECT_TRUE(r7.Contains(r4));
+  EXPECT_TRUE(r7.Contains(r5));
+
+  // Ensures Intersects(...) handle the open range.
+  EXPECT_TRUE(r2.Intersects(r1));
+  EXPECT_TRUE(r4.Intersects(r1));
+
+  // Ensures larger ranges intersects smaller ranges.
+  EXPECT_TRUE(r6.Intersects(r1));
+  EXPECT_TRUE(r6.Intersects(r2));
+  EXPECT_TRUE(r6.Intersects(r3));
+  EXPECT_TRUE(r6.Intersects(r4));
+  EXPECT_TRUE(r6.Intersects(r5));
+
+  EXPECT_TRUE(r7.Intersects(r1));
+  EXPECT_TRUE(r7.Intersects(r2));
+  EXPECT_TRUE(r7.Intersects(r3));
+  EXPECT_TRUE(r7.Intersects(r4));
+  EXPECT_TRUE(r7.Intersects(r5));
+
+  // Ensures adjacent ranges don't overlap.
+  EXPECT_FALSE(r2.Intersects(r3));
+  EXPECT_FALSE(r5.Intersects(r4));
+
+  // Ensures empty ranges are handled correctly.
+  EXPECT_FALSE(r1.Contains(r8));
+  EXPECT_FALSE(r2.Contains(r8));
+  EXPECT_TRUE(r3.Contains(r8));
+  EXPECT_TRUE(r8.Contains(r8));
+
+  EXPECT_FALSE(r1.Intersects(r8));
+  EXPECT_FALSE(r2.Intersects(r8));
+  EXPECT_TRUE(r3.Intersects(r8));
+  EXPECT_TRUE(r8.Intersects(r8));
+}
+
 TEST(RangeTest, Intersect) {
   EXPECT_EQ(gfx::Range(0, 1).Intersect({0, 1}), gfx::Range(0, 1));
   EXPECT_EQ(gfx::Range(0, 1).Intersect({0, 0}), gfx::Range(0, 0));
@@ -388,6 +507,32 @@
   EXPECT_EQ(gfx::Range(2, 1).Intersect({1, 0}), gfx::Range::InvalidRange());
 }
 
+TEST(RangeTest, IntersectRangeF) {
+  EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(0.f, 1.f)),
+            gfx::RangeF(0.f, 1.f));
+  EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(0.f, 0.f)),
+            gfx::RangeF(0.f, 0.f));
+  EXPECT_EQ(gfx::RangeF(0.f, 0.f).Intersect(gfx::RangeF(1.f, 0.f)),
+            gfx::RangeF(0.f, 0.f));
+  EXPECT_EQ(gfx::RangeF(0.f, 4.f).Intersect(gfx::RangeF(2.f, 3.f)),
+            gfx::RangeF(2.f, 3.f));
+  EXPECT_EQ(gfx::RangeF(0.f, 4.f).Intersect(gfx::RangeF(2.f, 7.f)),
+            gfx::RangeF(2.f, 4.f));
+  EXPECT_EQ(gfx::RangeF(0.f, 4.f).Intersect(gfx::RangeF(3.f, 4.f)),
+            gfx::RangeF(3.f, 4.f));
+
+  EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(1.f, 1.f)),
+            gfx::RangeF::InvalidRange());
+  EXPECT_EQ(gfx::RangeF(1.f, 1.f).Intersect(gfx::RangeF(1.f, 0.f)),
+            gfx::RangeF::InvalidRange());
+  EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(1.f, 2.f)),
+            gfx::RangeF::InvalidRange());
+  EXPECT_EQ(gfx::RangeF(0.f, 1.f).Intersect(gfx::RangeF(2.f, 1.f)),
+            gfx::RangeF::InvalidRange());
+  EXPECT_EQ(gfx::RangeF(2.f, 1.f).Intersect(gfx::RangeF(1.f, 0.f)),
+            gfx::RangeF::InvalidRange());
+}
+
 TEST(RangeTest, IsBoundedBy) {
   constexpr gfx::Range r1(0, 0);
   constexpr gfx::Range r2(0, 1);
diff --git a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
index fcd35c5..fd97e46 100644
--- a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
+++ b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
@@ -73,7 +73,7 @@
   void show_close_button() { should_show_close_button_ = true; }
   void hide_buttons() {
     should_show_close_button_ = false;
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   }
   void set_should_show_window_title(bool should_show_window_title) {
     should_show_window_title_ = should_show_window_title;
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc
index c16f93e..e17664e6 100644
--- a/ui/views/bubble/bubble_frame_view_unittest.cc
+++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -907,7 +907,7 @@
       : BubbleDialogDelegateView(nullptr, BubbleBorder::NONE) {
     set_shadow(BubbleBorder::NO_ASSETS);
     SetAnchorRect(gfx::Rect());
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   }
   ~TestBubbleDialogDelegateView() override = default;
 
@@ -978,7 +978,7 @@
 class TestWidthSnapDelegate : public TestBubbleDialogDelegateView {
  public:
   TestWidthSnapDelegate(TestAnchor* anchor, bool should_snap) {
-    DialogDelegate::set_buttons(should_snap ? ui::DIALOG_BUTTON_OK
+    DialogDelegate::SetButtons(should_snap ? ui::DIALOG_BUTTON_OK
                                             : ui::DIALOG_BUTTON_NONE);
     SetAnchorView(anchor->widget().GetContentsView());
     set_margins(gfx::Insets());
diff --git a/ui/views/bubble/info_bubble.cc b/ui/views/bubble/info_bubble.cc
index dbf137a..9bcded0 100644
--- a/ui/views/bubble/info_bubble.cc
+++ b/ui/views/bubble/info_bubble.cc
@@ -51,7 +51,7 @@
   DCHECK(anchor_);
   SetAnchorView(anchor_);
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
   set_margins(LayoutProvider::Get()->GetInsetsMetric(
       InsetsMetric::INSETS_TOOLTIP_BUBBLE));
diff --git a/ui/views/examples/bubble_example.cc b/ui/views/examples/bubble_example.cc
index 4778ab2..7ee00600 100644
--- a/ui/views/examples/bubble_example.cc
+++ b/ui/views/examples/bubble_example.cc
@@ -69,7 +69,7 @@
  public:
   ExampleBubble(View* anchor, BubbleBorder::Arrow arrow)
       : BubbleDialogDelegateView(anchor, arrow) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   }
 
  protected:
diff --git a/ui/views/examples/dialog_example.cc b/ui/views/examples/dialog_example.cc
index 614f7bcc..3261305 100644
--- a/ui/views/examples/dialog_example.cc
+++ b/ui/views/examples/dialog_example.cc
@@ -37,10 +37,10 @@
 class DialogExample::Delegate : public virtual DialogType {
  public:
   explicit Delegate(DialogExample* parent) : parent_(parent) {
-    DialogDelegate::set_buttons(parent_->GetDialogButtons());
-    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+    DialogDelegate::SetButtons(parent_->GetDialogButtons());
+    DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                      parent_->ok_button_label_->GetText());
-    DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+    DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
                                      parent_->cancel_button_label_->GetText());
   }
 
diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc
index bd8d5da..0463acc 100644
--- a/ui/views/focus/focus_manager_unittest.cc
+++ b/ui/views/focus/focus_manager_unittest.cc
@@ -877,7 +877,7 @@
  public:
   explicit TestBubbleDialogDelegateView(View* anchor)
       : BubbleDialogDelegateView(anchor, BubbleBorder::NONE) {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   }
   ~TestBubbleDialogDelegateView() override = default;
 
diff --git a/ui/views/touchui/touch_selection_menu_views.cc b/ui/views/touchui/touch_selection_menu_views.cc
index 4d5f9bc4..c41d4ae 100644
--- a/ui/views/touchui/touch_selection_menu_views.cc
+++ b/ui/views/touchui/touch_selection_menu_views.cc
@@ -41,7 +41,7 @@
   DCHECK(owner_);
   DCHECK(client_);
 
-  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+  DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   set_shadow(BubbleBorder::SMALL_SHADOW);
   set_parent_window(context);
   constexpr gfx::Insets kMenuMargins = gfx::Insets(1);
diff --git a/ui/views/widget/native_widget_mac_unittest.mm b/ui/views/widget/native_widget_mac_unittest.mm
index e6767db..90c1111 100644
--- a/ui/views/widget/native_widget_mac_unittest.mm
+++ b/ui/views/widget/native_widget_mac_unittest.mm
@@ -1109,7 +1109,7 @@
       : modal_type_(modal_type) {}
 
   void SetButtons(int buttons) {
-    DialogDelegate::set_buttons(buttons);
+    DialogDelegate::SetButtons(buttons);
     DialogModelChanged();
   }
 
diff --git a/ui/views/widget/root_view_unittest.cc b/ui/views/widget/root_view_unittest.cc
index 3d4238d..679f2af 100644
--- a/ui/views/widget/root_view_unittest.cc
+++ b/ui/views/widget/root_view_unittest.cc
@@ -732,7 +732,7 @@
  public:
   RootViewTestDialogDelegate() {
     // Ensure that buttons don't influence the layout.
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
   }
   ~RootViewTestDialogDelegate() override = default;
 
diff --git a/ui/views/window/dialog_client_view_unittest.cc b/ui/views/window/dialog_client_view_unittest.cc
index fd7be9f..390eac2 100644
--- a/ui/views/window/dialog_client_view_unittest.cc
+++ b/ui/views/window/dialog_client_view_unittest.cc
@@ -41,7 +41,7 @@
     WidgetTest::SetUp();
 
     DialogDelegate::set_use_custom_frame(false);
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_NONE);
 
     // Note: not using DialogDelegate::CreateDialogWidget(..), since that can
     // alter the frame type according to the platform.
@@ -86,7 +86,7 @@
 
   // Sets the buttons to show in the dialog and refreshes the dialog.
   void SetDialogButtons(int dialog_buttons) {
-    DialogDelegate::set_buttons(dialog_buttons);
+    DialogDelegate::SetButtons(dialog_buttons);
     DialogModelChanged();
   }
 
@@ -119,7 +119,7 @@
   // exceeded. The resulting width is around 160 pixels, but depends on system
   // fonts.
   void SetLongCancelLabel() {
-    DialogDelegate::set_button_label(
+    DialogDelegate::SetButtonLabel(
         ui::DIALOG_BUTTON_CANCEL, base::ASCIIToUTF16("Cancel Cancel Cancel"));
     DialogModelChanged();
   }
@@ -336,7 +336,7 @@
 
   // Ensure there is no default button since getting a bold font can throw off
   // the cached sizes.
-  set_default_button(ui::DIALOG_BUTTON_NONE);
+  SetDefaultButton(ui::DIALOG_BUTTON_NONE);
 
   SetDialogButtons(ui::DIALOG_BUTTON_OK);
   CheckContentsIsSetToPreferredSize();
@@ -383,7 +383,7 @@
 
   // Ensure there is no default button since getting a bold font can throw off
   // the cached sizes.
-  set_default_button(ui::DIALOG_BUTTON_NONE);
+  SetDefaultButton(ui::DIALOG_BUTTON_NONE);
 
   SetDialogButtons(ui::DIALOG_BUTTON_OK);
   CheckContentsIsSetToPreferredSize();
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc
index caf94e2..f0fcd58 100644
--- a/ui/views/window/dialog_delegate.cc
+++ b/ui/views/window/dialog_delegate.cc
@@ -321,6 +321,31 @@
     observer.OnDialogChanged();
 }
 
+void DialogDelegate::SetDefaultButton(int button) {
+  params_.default_button = button;
+}
+
+void DialogDelegate::SetButtons(int buttons) {
+  params_.buttons = buttons;
+}
+
+void DialogDelegate::SetButtonLabel(ui::DialogButton button,
+    base::string16 label) {
+  params_.button_labels[button] = label;
+}
+
+void DialogDelegate::SetAcceptCallback(base::OnceClosure callback) {
+  accept_callback_ = std::move(callback);
+}
+
+void DialogDelegate::SetCancelCallback(base::OnceClosure callback) {
+  cancel_callback_ = std::move(callback);
+}
+
+void DialogDelegate::SetCloseCallback(base::OnceClosure callback) {
+  close_callback_ = std::move(callback);
+}
+
 std::unique_ptr<View> DialogDelegate::DisownExtraView() {
   return std::move(extra_view_);
 }
diff --git a/ui/views/window/dialog_delegate.h b/ui/views/window/dialog_delegate.h
index 38d54e83c8..54ea673 100644
--- a/ui/views/window/dialog_delegate.h
+++ b/ui/views/window/dialog_delegate.h
@@ -56,7 +56,7 @@
 
     // Text labels for the buttons on this dialog. Any button without a label
     // here will get the default text for its type from GetDialogButtonLabel.
-    // Prefer to use this field (via set_button_label) rather than override
+    // Prefer to use this field (via SetButtonLabel) rather than override
     // GetDialogButtonLabel - see https://crbug.com/1011446
     base::string16 button_labels[ui::DIALOG_BUTTON_LAST + 1];
   };
@@ -114,7 +114,7 @@
   // overridden. This function should return true if the window can be closed
   // after it returns, or false if it must remain open. By default, return true
   // without doing anything.
-  // DEPRECATED: use |set_cancel_callback| instead.
+  // DEPRECATED: use |SetCancelCallback| instead.
   virtual bool Cancel();
 
   // For Dialog boxes, this is called when the user presses the "OK" button,
@@ -122,7 +122,7 @@
   // has not been overridden. This function should return true if the window
   // can be closed after it returns, or false if it must remain open. By
   // default, return true without doing anything.
-  // DEPRECATED: use |set_accept_callback| instead.
+  // DEPRECATED: use |SetAcceptCallback| instead.
   virtual bool Accept();
 
   // Overridden from WidgetDelegate:
@@ -172,27 +172,18 @@
   // Notifies observers when the result of the DialogModel overrides changes.
   void DialogModelChanged();
 
-  void set_default_button(int button) { params_.default_button = button; }
   void set_use_round_corners(bool round) { params_.round_corners = round; }
   void set_draggable(bool draggable) { params_.draggable = draggable; }
   bool draggable() const { return params_.draggable; }
   void set_use_custom_frame(bool use) { params_.custom_frame = use; }
   bool use_custom_frame() const { return params_.custom_frame; }
-  void set_buttons(int buttons) { params_.buttons = buttons; }
 
-  void set_button_label(ui::DialogButton button, base::string16 label) {
-    params_.button_labels[button] = label;
-  }
-
-  void set_accept_callback(base::OnceClosure callback) {
-    accept_callback_ = std::move(callback);
-  }
-  void set_cancel_callback(base::OnceClosure callback) {
-    cancel_callback_ = std::move(callback);
-  }
-  void set_close_callback(base::OnceClosure callback) {
-    close_callback_ = std::move(callback);
-  }
+  void SetDefaultButton(int button);
+  void SetButtons(int buttons);
+  void SetButtonLabel(ui::DialogButton button, base::string16 label);
+  void SetAcceptCallback(base::OnceClosure callback);
+  void SetCancelCallback(base::OnceClosure callback);
+  void SetCloseCallback(base::OnceClosure callback);
 
   // Returns ownership of the extra view for this dialog, if one was provided
   // via SetExtraView(). This is only for use by DialogClientView; don't call
diff --git a/ui/views/window/dialog_delegate_unittest.cc b/ui/views/window/dialog_delegate_unittest.cc
index ace06841..eeaf5cd 100644
--- a/ui/views/window/dialog_delegate_unittest.cc
+++ b/ui/views/window/dialog_delegate_unittest.cc
@@ -113,11 +113,11 @@
     dialog_ = new TestDialog();
     dialog_->Init();
 
-    dialog_->set_accept_callback(
+    dialog_->SetAcceptCallback(
         base::BindLambdaForTesting([&]() { accepted_ = true; }));
-    dialog_->set_cancel_callback(
+    dialog_->SetCancelCallback(
         base::BindLambdaForTesting([&]() { cancelled_ = true; }));
-    dialog_->set_close_callback(
+    dialog_->SetCloseCallback(
         base::BindLambdaForTesting([&]() { closed_ = true; }));
   }
 
@@ -363,7 +363,7 @@
 class InitialFocusTestDialog : public DialogDelegateView {
  public:
   InitialFocusTestDialog() {
-    DialogDelegate::set_buttons(ui::DIALOG_BUTTON_OK);
+    DialogDelegate::SetButtons(ui::DIALOG_BUTTON_OK);
   }
   ~InitialFocusTestDialog() override = default;
 
@@ -435,9 +435,9 @@
   bool cancelled = false;
   bool accepted = false;
 
-  dialog.set_cancel_callback(
+  dialog.SetCancelCallback(
       base::BindLambdaForTesting([&]() { cancelled = true; }));
-  dialog.set_accept_callback(
+  dialog.SetAcceptCallback(
       base::BindLambdaForTesting([&]() { accepted = true; }));
 
   // At this point DefaultClose() would invoke either Accept() or Cancel().
@@ -454,9 +454,9 @@
   bool closed = false;
   bool accepted = false;
 
-  dialog.set_close_callback(
+  dialog.SetCloseCallback(
       base::BindLambdaForTesting([&]() { closed = true; }));
-  dialog.set_accept_callback(base::BindLambdaForTesting([&]() {
+  dialog.SetAcceptCallback(base::BindLambdaForTesting([&]() {
     accepted = true;
     dialog.Close();
   }));
diff --git a/weblayer/public/java/org/chromium/weblayer/WebViewCompatibilityHelper.java b/weblayer/public/java/org/chromium/weblayer/WebViewCompatibilityHelper.java
index 750e609..927c910d 100644
--- a/weblayer/public/java/org/chromium/weblayer/WebViewCompatibilityHelper.java
+++ b/weblayer/public/java/org/chromium/weblayer/WebViewCompatibilityHelper.java
@@ -33,12 +33,15 @@
             return Pair.create(
                     null, WebLayer.WebViewCompatibilityResult.FAILURE_UNSUPPORTED_VERSION);
         }
-        // Prepend "/." to all library paths. This changes the library path while still pointing to
-        // the same directory, allowing us to get around a check in the JVM.
         String[] libraryPaths = getLibraryPaths(remoteContext.getClassLoader());
-        for (int i = 0; i < libraryPaths.length; i++) {
-            assert libraryPaths[i].startsWith("/");
-            libraryPaths[i] = "/." + libraryPaths[i];
+        // Prepend "/." to all library paths. This changes the library path while still pointing to
+        // the same directory, allowing us to get around a check in the JVM. This is only necessary
+        // for N+, where we rely on linker namespaces.
+        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
+            for (int i = 0; i < libraryPaths.length; i++) {
+                assert libraryPaths[i].startsWith("/");
+                libraryPaths[i] = "/." + libraryPaths[i];
+            }
         }
         ClassLoader classLoader = new PathClassLoader(getAllApkPaths(info.applicationInfo),
                 TextUtils.join(File.pathSeparator, libraryPaths),
diff --git a/weblayer/public/javatests/org/chromium/weblayer/WebViewCompatibilityHelperTest.java b/weblayer/public/javatests/org/chromium/weblayer/WebViewCompatibilityHelperTest.java
index b74cf6c..5a1c2b1 100644
--- a/weblayer/public/javatests/org/chromium/weblayer/WebViewCompatibilityHelperTest.java
+++ b/weblayer/public/javatests/org/chromium/weblayer/WebViewCompatibilityHelperTest.java
@@ -15,6 +15,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
 
 /**
  * Tests for (@link WebViewCompatibilityHelper}.
@@ -23,6 +24,7 @@
 public class WebViewCompatibilityHelperTest {
     @Test
     @SmallTest
+    @MinAndroidSdkLevel(Build.VERSION_CODES.N)
     public void testLibraryPaths() throws Exception {
         Context appContext = InstrumentationRegistry.getTargetContext();
         Context remoteContext = WebLayer.getOrCreateRemoteContext(appContext);
diff --git a/weblayer/shell/android/BUILD.gn b/weblayer/shell/android/BUILD.gn
index 18bc3e3..d2fb6f4 100644
--- a/weblayer/shell/android/BUILD.gn
+++ b/weblayer/shell/android/BUILD.gn
@@ -5,6 +5,7 @@
 import("//android_webview/system_webview_apk_tmpl.gni")
 import("//build/config/android/config.gni")
 import("//build/config/android/rules.gni")
+import("//build/config/python.gni")
 import("//third_party/icu/config.gni")
 import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
 import("//weblayer/variables.gni")
@@ -193,16 +194,15 @@
 
   shared_libraries = [ "//weblayer:libweblayer" ]
 }
-group("weblayer_shell_wpt") {
+
+python_library("weblayer_shell_wpt") {
   testonly = true
+  pydeps_file = "//testing/scripts/run_android_wpt.pydeps"
   data_deps = [
     ":weblayer_shell_apk",
     ":weblayer_support_apk",
     "//build/android:test_runner_py",
     "//chrome/test/chromedriver:chromedriver($host_toolchain)",
   ]
-  set_sources_assignment_filter([ "#*" ])
-  sources = read_file("//testing/scripts/run_android_wpt.pydeps", "list lines")
-  data = sources
-  data += [ "//third_party/blink/web_tests/external/" ]
+  data = [ "//third_party/blink/web_tests/external/" ]
 }