diff --git a/BUILD.gn b/BUILD.gn
index 7962cb55..a221d1c 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -695,16 +695,7 @@
   }
 
   if (is_win || is_linux) {
-    deps += [
-      "//media/mojo/services:media_service_unittests",
-      "//mojo",
-    ]
-
-    # crbug.com/676055: media_service_unittests fails to link under Windows
-    # component builds, due to duplicate symbol definitions.
-    if (is_win && is_component_build) {
-      deps -= [ "//media/mojo/services:media_service_unittests" ]
-    }
+    deps += [ "//mojo" ]
   }
 
   if (is_mac || is_linux || is_android || is_fuchsia) {
@@ -1017,9 +1008,7 @@
         "//chrome:chrome",
         "//chrome/test/chromedriver",
       ]
-      deps = [
-        "//third_party/blink/tools:wpt_tests_isolate",
-      ]
+      deps = [ "//third_party/blink/tools:wpt_tests_isolate" ]
     }
   }
 
diff --git a/DEPS b/DEPS
index 340eb5c..e5976dc 100644
--- a/DEPS
+++ b/DEPS
@@ -175,11 +175,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '2cae3b05ea2bf31989001341ff6c21eb18c4b8a3',
+  'skia_revision': '7363af8c513675e67df2729f8463b6828c80d776',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '276eb74c90e69a33cae6e3e881060204e08aebbf',
+  'v8_revision': 'b9280b4dcba2321067300294596bca946f137551',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -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': '7e0699a25089fe3436413aee24ec20abe9795cfa',
+  'angle_revision': 'd03b15b2f9f546fb984aa78c174d180d4326d628',
   # 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': 'c8974b38bff1b64cc9f90376224fe1ef2353a254',
+  'swiftshader_revision': 'de3f38a72c486c14a5cfe0810af9871acb7dec9a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -222,7 +222,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': '41820cd74f31806536462a20b286defcbe5b199d',
+  'nacl_revision': 'ebf11aaad97fde7f91b1c72e0dddaf1653d41f77',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -238,7 +238,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'a0519c6734935e8d36e22b3e1e313bf9a874ea2f',
+  'catapult_revision': '395a627b8ad8b48dc4119fb6d309d29ec5d5fda0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # 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': 'a35ca2b5e91d9652eab8e272c7adc663028733ff',
+  'devtools_frontend_revision': 'ca9a03f92fbd213b17466a9393ae3490b3eb1806',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -302,7 +302,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '3665d28e6e7146625c92f7054efae9e2a3c07628',
+  'dawn_revision': '81431f5034b4ce3a0cdc339709bd8ca8856fe427',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -521,7 +521,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '3b7dfcd48c53292284d3759e3cb71e4d45414d9b',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '8c7be049e94b0da2843869888281fdf115e2da7f',
       'condition': 'checkout_ios',
   },
 
@@ -867,7 +867,7 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'f8ab3f27194758f2489786547bc4cadd8bd1fd7f',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '06db03ca54cf979f9fd0624aa1dd38abc8c6803b',
       'condition': 'checkout_linux',
   },
 
@@ -877,7 +877,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0dd5482c5254e0457062aad7b93954918ced54fd',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'b73f8a96ec6daa0a6cfe5dfdab1c7249761a4b7d',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -933,7 +933,7 @@
     Var('chromium_git') + '/codecs/libgav1.git' + '@' + 'fa1c3c4e673cf12ffa22b8fbe4a7c79314571f1b',
 
   'src/third_party/glslang/src':
-    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '99508c1ce389e678a79b00159fe0c0d13f08f213',
+    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '4d7c749b7610c891db4fbe49a25fbd54afe374e5',
 
   'src/third_party/google_toolbox_for_mac/src': {
       'url': Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'),
@@ -1211,7 +1211,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '6f26bce0b1c4e8ce0e13332f7c0083788def5fdf',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + '058444fabc78d42219d58f2b3d5c0ee6e41983ba',
+    Var('chromium_git') + '/openscreen' + '@' + 'e5b4b11496a0bbf88317e4c58099dfd7a01cf4ca',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '9e97b73e7dd2bfc07745489d728f6a36665c648f',
@@ -1228,7 +1228,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '4502a63609965dfb3f0a3fb07e323de35a219e6e',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd1dae2a33653ee6648f179eeb28244840fb3f248',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1523,7 +1523,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@774019051243b9b6eecc926bc0711537e8d5dfd2',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@0935127287847942e9c8193e03a4442ad34857c9',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsFragment.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsFragment.java
index 4e8a2a4..843a43a 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsFragment.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/FlagsFragment.java
@@ -86,13 +86,34 @@
             mOverriddenFlags = DeveloperModeUtils.getFlagOverrides(mContext.getPackageName());
         }
 
-        mListAdapter = new FlagsListAdapter();
+        mListAdapter = new FlagsListAdapter(sortFlagList(ProductionSupportedFlagList.sFlagList));
         flagsListView.setAdapter(mListAdapter);
 
         Button resetFlagsButton = view.findViewById(R.id.reset_flags_button);
         resetFlagsButton.setOnClickListener((View flagButton) -> { resetAllFlags(); });
     }
 
+    /**
+     * Sorts the flag list so enabled/disabled flags are at the beginning and default flags are at
+     * the end.
+     */
+    private Flag[] sortFlagList(Flag[] unsorted) {
+        Flag[] sortedFlags = new Flag[unsorted.length];
+        int i = 0;
+        for (Flag flag : unsorted) {
+            if (mOverriddenFlags.containsKey(flag.getName())) {
+                sortedFlags[i++] = flag;
+            }
+        }
+        for (Flag flag : unsorted) {
+            if (!mOverriddenFlags.containsKey(flag.getName())) {
+                sortedFlags[i++] = flag;
+            }
+        }
+        assert sortedFlags.length == unsorted.length : "arrays should be same length";
+        return sortedFlags;
+    }
+
     private static int booleanToState(Boolean b) {
         if (b == null) {
             return /* STATE_DEFAULT */ 0;
@@ -148,8 +169,8 @@
      * Adapter to create rows of toggleable Flags.
      */
     private class FlagsListAdapter extends ArrayAdapter<Flag> {
-        public FlagsListAdapter() {
-            super(mContext, R.layout.toggleable_flag, ProductionSupportedFlagList.sFlagList);
+        public FlagsListAdapter(Flag[] sortedFlags) {
+            super(mContext, R.layout.toggleable_flag, sortedFlags);
         }
 
         @Override
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 69fd594..089ce17c 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -162,6 +162,8 @@
     "ambient/ambient_constants.h",
     "ambient/ambient_controller.cc",
     "ambient/ambient_controller.h",
+    "ambient/ambient_view_delegate_impl.cc",
+    "ambient/ambient_view_delegate_impl.h",
     "ambient/model/photo_model.cc",
     "ambient/model/photo_model.h",
     "ambient/model/photo_model_observer.h",
@@ -171,6 +173,7 @@
     "ambient/ui/ambient_assistant_dialog_plate.h",
     "ambient/ui/ambient_container_view.cc",
     "ambient/ui/ambient_container_view.h",
+    "ambient/ui/ambient_view_delegate.h",
     "ambient/ui/assistant_response_container_view.cc",
     "ambient/ui/assistant_response_container_view.h",
     "ambient/ui/photo_view.cc",
diff --git a/ash/ambient/ambient_controller.cc b/ash/ambient/ambient_controller.cc
index 048db42f..0fcf3d3 100644
--- a/ash/ambient/ambient_controller.cc
+++ b/ash/ambient/ambient_controller.cc
@@ -4,6 +4,8 @@
 
 #include "ash/ambient/ambient_controller.h"
 
+#include <string>
+
 #include "ash/ambient/ambient_constants.h"
 #include "ash/ambient/model/photo_model_observer.h"
 #include "ash/ambient/ui/ambient_container_view.h"
@@ -28,6 +30,15 @@
          !ambient::util::IsShowing(LockScreen::ScreenType::kLogin);
 }
 
+void CloseAssistantUi() {
+  auto* assistant_controller = Shell::Get()->assistant_controller();
+  // |AssistantController| is initiated before the |AmbientController| in shell.
+  DCHECK(assistant_controller);
+
+  assistant_controller->ui_controller()->CloseUi(
+      chromeos::assistant::mojom::AssistantExitPoint::kUnspecified);
+}
+
 }  // namespace
 
 // static
@@ -46,8 +57,7 @@
   }
 }
 
-AmbientController::AmbientController(AssistantController* assistant_controller)
-    : assistant_controller_(assistant_controller) {
+AmbientController::AmbientController() {
   ambient_state_.AddObserver(this);
   // |SessionController| is initialized before |this| in Shell.
   Shell::Get()->session_controller()->AddObserver(this);
@@ -58,7 +68,8 @@
   Shell::Get()->session_controller()->RemoveObserver(this);
   ambient_state_.RemoveObserver(this);
 
-  DestroyContainerView();
+  if (container_view_)
+    DestroyContainerView();
 }
 
 void AmbientController::OnWidgetDestroying(views::Widget* widget) {
@@ -66,15 +77,10 @@
   container_view_->GetWidget()->RemoveObserver(this);
   container_view_ = nullptr;
 
-  // If our widget is being destroyed, Assistant UI is no longer visible.
-  // If Assistant UI was already closed, this is a no-op.
-  assistant_controller_->ui_controller()->CloseUi(
-      chromeos::assistant::mojom::AssistantExitPoint::kUnspecified);
-
-  // We need to update the mode when the widget gets destroyed as this may have
-  // caused by AmbientContainerView directly closed the widget without calling
-  // Stop() after an outside press.
-  ambient_state_.SetAmbientModeEnabled(false);
+  // Call CloseUi() explicitly to sync states to |AssistantUiController|.
+  // This is a no-op if the UI has already been closed before the widget gets
+  // destroyed.
+  CloseAssistantUi();
 }
 
 void AmbientController::OnAmbientModeEnabled(bool enabled) {
@@ -101,33 +107,17 @@
   Start();
 }
 
-void AmbientController::Toggle() {
-  if (container_view_)
-    Stop();
-  else
-    Start();
-}
-
-void AmbientController::AddPhotoModelObserver(PhotoModelObserver* observer) {
-  model_.AddObserver(observer);
-}
-
-void AmbientController::RemovePhotoModelObserver(PhotoModelObserver* observer) {
-  model_.RemoveObserver(observer);
-}
-
 void AmbientController::Start() {
   if (!CanStartAmbientMode()) {
     // TODO(wutao): Show a toast to indicate that Ambient mode is not ready.
     return;
   }
 
-  // CloseUi to ensure standalone Assistant UI doesn't exist when entering
-  // Ambient mode to avoid strange behavior caused by standalone UI was
+  // CloseUi to ensure the embedded Assistant UI doesn't exist when entering
+  // Ambient mode to avoid strange behavior caused by the embedded UI was
   // only hidden at that time. This will be a no-op if UI was already closed.
   // TODO(meilinw): Handle embedded UI.
-  assistant_controller_->ui_controller()->CloseUi(
-      chromeos::assistant::mojom::AssistantExitPoint::kUnspecified);
+  CloseAssistantUi();
 
   ambient_state_.SetAmbientModeEnabled(true);
 }
@@ -135,16 +125,22 @@
 void AmbientController::Stop() {
   ambient_state_.SetAmbientModeEnabled(false);
 }
+void AmbientController::Toggle() {
+  if (container_view_)
+    Stop();
+  else
+    Start();
+}
 
 void AmbientController::CreateContainerView() {
   DCHECK(!container_view_);
-  container_view_ = new AmbientContainerView(this);
+  container_view_ = new AmbientContainerView(&delegate_);
   container_view_->GetWidget()->AddObserver(this);
 }
 
 void AmbientController::DestroyContainerView() {
   // |container_view_|'s widget is owned by its native widget. After calling
-  // CloseNow(), it will trigger |OnWidgetDestroying|, where it will set the
+  // |CloseNow|, |OnWidgetDestroying| will be triggered immediately to reset
   // |container_view_| to nullptr.
   if (container_view_)
     container_view_->GetWidget()->CloseNow();
@@ -154,7 +150,7 @@
   if (!PhotoController::Get())
     return;
 
-  if (model_.ShouldFetchImmediately()) {
+  if (photo_model_.ShouldFetchImmediately()) {
     // TODO(b/140032139): Defer downloading image if it is animating.
     base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
@@ -162,14 +158,14 @@
                        weak_factory_.GetWeakPtr()),
         kAnimationDuration);
   } else {
-    model_.ShowNextImage();
+    photo_model_.ShowNextImage();
     ScheduleRefreshImage();
   }
 }
 
 void AmbientController::ScheduleRefreshImage() {
   base::TimeDelta refresh_interval;
-  if (!model_.ShouldFetchImmediately()) {
+  if (!photo_model_.ShouldFetchImmediately()) {
     // TODO(b/139953713): Change to a correct time interval.
     refresh_interval = base::TimeDelta::FromSeconds(5);
   }
@@ -191,7 +187,7 @@
     return;
 
   DCHECK(!image.isNull());
-  model_.AddNextImage(image);
+  photo_model_.AddNextImage(image);
   ScheduleRefreshImage();
 }
 
diff --git a/ash/ambient/ambient_controller.h b/ash/ambient/ambient_controller.h
index 8feb32c..43af2ffb 100644
--- a/ash/ambient/ambient_controller.h
+++ b/ash/ambient/ambient_controller.h
@@ -5,6 +5,7 @@
 #ifndef ASH_AMBIENT_AMBIENT_CONTROLLER_H_
 #define ASH_AMBIENT_AMBIENT_CONTROLLER_H_
 
+#include "ash/ambient/ambient_view_delegate_impl.h"
 #include "ash/ambient/model/photo_model.h"
 #include "ash/ash_export.h"
 #include "ash/public/cpp/ambient/ambient_mode_state.h"
@@ -12,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/timer/timer.h"
+#include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 
 class PrefRegistrySimple;
@@ -23,8 +25,6 @@
 namespace ash {
 
 class AmbientContainerView;
-class AssistantController;
-class PhotoModelObserver;
 
 // Class to handle all ambient mode functionalities.
 class ASH_EXPORT AmbientController : public views::WidgetObserver,
@@ -33,7 +33,7 @@
  public:
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
-  explicit AmbientController(AssistantController* assistant_controller);
+  AmbientController();
   ~AmbientController() override;
 
   // views::WidgetObserver:
@@ -45,12 +45,11 @@
   // SessionObserver:
   void OnLockStateChanged(bool locked) override;
 
+  void Start();
+  void Stop();
   void Toggle();
 
-  void AddPhotoModelObserver(PhotoModelObserver* observer);
-  void RemovePhotoModelObserver(PhotoModelObserver* observer);
-
-  const PhotoModel& model() const { return model_; }
+  PhotoModel* photo_model() { return &photo_model_; }
 
   AmbientContainerView* get_container_view_for_testing() {
     return container_view_;
@@ -60,13 +59,9 @@
     return refresh_timer_;
   }
 
-  AssistantController* assistant_controller() { return assistant_controller_; }
-
   bool is_showing() const { return !!container_view_; }
 
  private:
-  void Start();
-  void Stop();
   void CreateContainerView();
   void DestroyContainerView();
   void RefreshImage();
@@ -74,9 +69,9 @@
   void GetNextImage();
   void OnPhotoDownloaded(bool success, const gfx::ImageSkia& image);
 
-  AssistantController* const assistant_controller_;  // Owned by Shell.
+  AmbientViewDelegateImpl delegate_{this};
   AmbientContainerView* container_view_ = nullptr;   // Owned by view hierarchy.
-  PhotoModel model_;
+  PhotoModel photo_model_;
   AmbientModeState ambient_state_;
   base::OneShotTimer refresh_timer_;
   base::WeakPtrFactory<AmbientController> weak_factory_{this};
diff --git a/ash/ambient/ambient_view_delegate_impl.cc b/ash/ambient/ambient_view_delegate_impl.cc
new file mode 100644
index 0000000..863107a
--- /dev/null
+++ b/ash/ambient/ambient_view_delegate_impl.cc
@@ -0,0 +1,38 @@
+// 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 "ash/ambient/ambient_view_delegate_impl.h"
+
+#include "ash/ambient/ambient_controller.h"
+#include "base/bind.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+
+namespace ash {
+
+AmbientViewDelegateImpl::AmbientViewDelegateImpl(
+    AmbientController* ambient_controller)
+    : ambient_controller_(ambient_controller) {}
+
+AmbientViewDelegateImpl::~AmbientViewDelegateImpl() = default;
+
+PhotoModel* AmbientViewDelegateImpl::GetPhotoModel() {
+  return ambient_controller_->photo_model();
+}
+
+void AmbientViewDelegateImpl::OnBackgroundPhotoEvents() {
+  // Exit ambient mode by closing the widget when user interacts with the
+  // background photo using mouse or gestures. We do this asynchronously to
+  // ensure that for a mouse moved event, the widget will be destroyed *after*
+  // its cursor has been updated in |RootView::OnMouseMoved|.
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(
+          [](const base::WeakPtr<AmbientViewDelegateImpl>& weak_ptr) {
+            if (weak_ptr)
+              weak_ptr->ambient_controller_->Stop();
+          },
+          weak_factory_.GetWeakPtr()));
+}
+
+}  // namespace ash
diff --git a/ash/ambient/ambient_view_delegate_impl.h b/ash/ambient/ambient_view_delegate_impl.h
new file mode 100644
index 0000000..af96e8f
--- /dev/null
+++ b/ash/ambient/ambient_view_delegate_impl.h
@@ -0,0 +1,35 @@
+// 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 ASH_AMBIENT_AMBIENT_VIEW_DELEGATE_IMPL_H_
+#define ASH_AMBIENT_AMBIENT_VIEW_DELEGATE_IMPL_H_
+
+#include "ash/ambient/ui/ambient_view_delegate.h"
+
+#include "base/memory/weak_ptr.h"
+
+namespace ash {
+
+class AmbientController;
+
+class AmbientViewDelegateImpl : public AmbientViewDelegate {
+ public:
+  explicit AmbientViewDelegateImpl(AmbientController* ambient_controller);
+  AmbientViewDelegateImpl(const AmbientViewDelegateImpl&) = delete;
+  AmbientViewDelegateImpl& operator=(AmbientViewDelegateImpl&) = delete;
+  ~AmbientViewDelegateImpl() override;
+
+  // AmbientViewDelegate:
+  PhotoModel* GetPhotoModel() override;
+  void OnBackgroundPhotoEvents() override;
+
+ private:
+  AmbientController* const ambient_controller_;  // Owned by Shell.
+
+  base::WeakPtrFactory<AmbientViewDelegateImpl> weak_factory_{this};
+};
+
+}  // namespace ash
+
+#endif  // ASH_AMBIENT_AMBIENT_VIEW_DELEGATE_IMPL_H_
diff --git a/ash/ambient/ui/ambient_assistant_container_view.cc b/ash/ambient/ui/ambient_assistant_container_view.cc
index 402250e..055ffcb 100644
--- a/ash/ambient/ui/ambient_assistant_container_view.cc
+++ b/ash/ambient/ui/ambient_assistant_container_view.cc
@@ -9,6 +9,7 @@
 
 #include "ash/ambient/ui/ambient_assistant_dialog_plate.h"
 #include "ash/ambient/ui/assistant_response_container_view.h"
+#include "ash/assistant/assistant_controller.h"
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "ash/assistant/ui/assistant_view_delegate.h"
 #include "ash/assistant/util/assistant_util.h"
@@ -38,12 +39,12 @@
 
 }  // namespace
 
-AmbientAssistantContainerView::AmbientAssistantContainerView(
-    AssistantViewDelegate* delegate)
-    : delegate_(delegate) {
+AmbientAssistantContainerView::AmbientAssistantContainerView()
+    : delegate_(Shell::Get()->assistant_controller()->view_delegate()) {
+  DCHECK(delegate_);
   InitLayout();
 
-  // The AssistantViewDelegate should outlive AmbientAssistantContainerView.
+  // |delegate_| must outlive |this|.
   delegate_->AddUiModelObserver(this);
 }
 
diff --git a/ash/ambient/ui/ambient_assistant_container_view.h b/ash/ambient/ui/ambient_assistant_container_view.h
index a0183fe..bc09b5f 100644
--- a/ash/ambient/ui/ambient_assistant_container_view.h
+++ b/ash/ambient/ui/ambient_assistant_container_view.h
@@ -23,7 +23,7 @@
 class AmbientAssistantContainerView : public views::View,
                                       public AssistantUiModelObserver {
  public:
-  explicit AmbientAssistantContainerView(AssistantViewDelegate* delegate);
+  AmbientAssistantContainerView();
   ~AmbientAssistantContainerView() override;
 
   // views::View:
@@ -39,7 +39,8 @@
  private:
   void InitLayout();
 
-  AssistantViewDelegate* const delegate_;  // Owned by AssistantController.
+  // Owned by |AssistantController|, so it should always outlive |this|.
+  AssistantViewDelegate* const delegate_;
 
   // Owned by view hierarchy.
   AmbientAssistantDialogPlate* ambient_assistant_dialog_plate_ = nullptr;
diff --git a/ash/ambient/ui/ambient_container_view.cc b/ash/ambient/ui/ambient_container_view.cc
index e5b5ba88..3027243 100644
--- a/ash/ambient/ui/ambient_container_view.cc
+++ b/ash/ambient/ui/ambient_container_view.cc
@@ -7,8 +7,8 @@
 #include <memory>
 #include <utility>
 
-#include "ash/ambient/ambient_controller.h"
 #include "ash/ambient/ui/ambient_assistant_container_view.h"
+#include "ash/ambient/ui/ambient_view_delegate.h"
 #include "ash/ambient/ui/photo_view.h"
 #include "ash/ambient/util/ambient_util.h"
 #include "ash/assistant/assistant_controller.h"
@@ -50,9 +50,8 @@
 
 }  // namespace
 
-AmbientContainerView::AmbientContainerView(
-    AmbientController* ambient_controller)
-    : ambient_controller_(ambient_controller) {
+AmbientContainerView::AmbientContainerView(AmbientViewDelegate* delegate)
+    : delegate_(delegate) {
   Init();
 }
 
@@ -77,30 +76,15 @@
                 kAmbientAssistantContainerViewPreferredHeightDip));
 }
 
-void AmbientContainerView::OnMouseEvent(ui::MouseEvent* event) {
-  if (event->type() == ui::ET_MOUSE_PRESSED) {
-    event->SetHandled();
-    GetWidget()->Close();
-  }
-}
-
-void AmbientContainerView::OnGestureEvent(ui::GestureEvent* event) {
-  if (event->type() == ui::ET_GESTURE_TAP) {
-    event->SetHandled();
-    GetWidget()->Close();
-  }
-}
-
 void AmbientContainerView::Init() {
   CreateWidget(this);
   // TODO(b/139954108): Choose a better dark mode theme color.
   SetBackground(views::CreateSolidBackground(SK_ColorBLACK));
 
-  photo_view_ = AddChildView(std::make_unique<PhotoView>(ambient_controller_));
+  photo_view_ = AddChildView(std::make_unique<PhotoView>(delegate_));
 
   ambient_assistant_container_view_ =
-      AddChildView(std::make_unique<AmbientAssistantContainerView>(
-          ambient_controller_->assistant_controller()->view_delegate()));
+      AddChildView(std::make_unique<AmbientAssistantContainerView>());
   ambient_assistant_container_view_->SetVisible(false);
 }
 
diff --git a/ash/ambient/ui/ambient_container_view.h b/ash/ambient/ui/ambient_container_view.h
index 26f8cfa9..be5308c 100644
--- a/ash/ambient/ui/ambient_container_view.h
+++ b/ash/ambient/ui/ambient_container_view.h
@@ -12,26 +12,24 @@
 namespace ash {
 
 class AmbientAssistantContainerView;
-class AmbientController;
+class AmbientViewDelegate;
 class PhotoView;
 
 // Container view for ambient mode.
 class ASH_EXPORT AmbientContainerView : public views::WidgetDelegateView {
  public:
-  explicit AmbientContainerView(AmbientController* ambient_controller);
+  explicit AmbientContainerView(AmbientViewDelegate* delegate);
   ~AmbientContainerView() override;
 
   // views::View:
   const char* GetClassName() const override;
   gfx::Size CalculatePreferredSize() const override;
   void Layout() override;
-  void OnMouseEvent(ui::MouseEvent* event) override;
-  void OnGestureEvent(ui::GestureEvent* event) override;
 
  private:
   void Init();
 
-  AmbientController* ambient_controller_ = nullptr;
+  AmbientViewDelegate* delegate_ = nullptr;
 
   // Owned by view hierarchy.
   PhotoView* photo_view_ = nullptr;
diff --git a/ash/ambient/ui/ambient_view_delegate.h b/ash/ambient/ui/ambient_view_delegate.h
new file mode 100644
index 0000000..9a23080
--- /dev/null
+++ b/ash/ambient/ui/ambient_view_delegate.h
@@ -0,0 +1,27 @@
+// 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 ASH_AMBIENT_UI_AMBIENT_VIEW_DELEGATE_H_
+#define ASH_AMBIENT_UI_AMBIENT_VIEW_DELEGATE_H_
+
+#include "ash/ash_export.h"
+
+namespace ash {
+
+class PhotoModel;
+
+class ASH_EXPORT AmbientViewDelegate {
+ public:
+  virtual ~AmbientViewDelegate() = default;
+
+  virtual PhotoModel* GetPhotoModel() = 0;
+
+  // Invoked when user interacts with the background photo using mouse,
+  // touchpad, or touchscreen.
+  virtual void OnBackgroundPhotoEvents() = 0;
+};
+
+}  // namespace ash
+
+#endif  // ASH_AMBIENT_UI_AMBIENT_VIEW_DELEGATE_H_
diff --git a/ash/ambient/ui/photo_view.cc b/ash/ambient/ui/photo_view.cc
index 0b87b25..4f30a54 100644
--- a/ash/ambient/ui/photo_view.cc
+++ b/ash/ambient/ui/photo_view.cc
@@ -5,9 +5,11 @@
 #include "ash/ambient/ui/photo_view.h"
 
 #include <algorithm>
+#include <memory>
 
 #include "ash/ambient/ambient_constants.h"
-#include "ash/ambient/ambient_controller.h"
+#include "ash/ambient/model/photo_model.h"
+#include "ash/ambient/ui/ambient_view_delegate.h"
 #include "ui/aura/window.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
@@ -18,14 +20,53 @@
 
 namespace ash {
 
-PhotoView::PhotoView(AmbientController* ambient_controller)
-    : ambient_controller_(ambient_controller) {
+// AmbientBackgroundImageView--------------------------------------------------
+// A custom ImageView for ambient mode to handle specific mouse/gesture events
+// when user interacting with the background photos.
+class AmbientBackgroundImageView : public views::ImageView {
+ public:
+  explicit AmbientBackgroundImageView(AmbientViewDelegate* delegate)
+      : delegate_(delegate) {
+    DCHECK(delegate_);
+  }
+  AmbientBackgroundImageView(const AmbientBackgroundImageView&) = delete;
+  AmbientBackgroundImageView& operator=(AmbientBackgroundImageView&) = delete;
+  ~AmbientBackgroundImageView() override = default;
+
+  // views::View:
+  const char* GetClassName() const override {
+    return "AmbientBackgroundImageView";
+  }
+
+  bool OnMousePressed(const ui::MouseEvent& event) override {
+    delegate_->OnBackgroundPhotoEvents();
+    return true;
+  }
+
+  void OnMouseMoved(const ui::MouseEvent& event) override {
+    delegate_->OnBackgroundPhotoEvents();
+  }
+
+  void OnGestureEvent(ui::GestureEvent* event) override {
+    if (event->type() == ui::ET_GESTURE_TAP) {
+      delegate_->OnBackgroundPhotoEvents();
+      event->SetHandled();
+    }
+  }
+
+ private:
+  // Owned by |AmbientController| and should always outlive |this|.
+  AmbientViewDelegate* delegate_ = nullptr;
+};
+
+// PhotoView ------------------------------------------------------------------
+PhotoView::PhotoView(AmbientViewDelegate* delegate) : delegate_(delegate) {
+  DCHECK(delegate_);
   Init();
 }
 
 PhotoView::~PhotoView() {
-  // |ambient_controller_| outlives this view.
-  ambient_controller_->RemovePhotoModelObserver(this);
+  delegate_->GetPhotoModel()->RemoveObserver(this);
 }
 
 const char* PhotoView::GetClassName() const {
@@ -60,21 +101,23 @@
   layout->set_cross_axis_alignment(
       views::BoxLayout::CrossAxisAlignment::kStart);
 
-  image_view_prev_ = AddChildView(std::make_unique<views::ImageView>());
-  image_view_curr_ = AddChildView(std::make_unique<views::ImageView>());
-  image_view_next_ = AddChildView(std::make_unique<views::ImageView>());
+  image_view_prev_ =
+      AddChildView(std::make_unique<AmbientBackgroundImageView>(delegate_));
+  image_view_curr_ =
+      AddChildView(std::make_unique<AmbientBackgroundImageView>(delegate_));
+  image_view_next_ =
+      AddChildView(std::make_unique<AmbientBackgroundImageView>(delegate_));
 
-  // |ambient_controller_| outlives this view.
-  ambient_controller_->AddPhotoModelObserver(this);
+  delegate_->GetPhotoModel()->AddObserver(this);
 }
 
 void PhotoView::UpdateImages() {
   // TODO(b/140193766): Investigate a more efficient way to update images and do
   // layer animation.
-  auto& model = ambient_controller_->model();
-  image_view_prev_->SetImage(model.GetPrevImage());
-  image_view_curr_->SetImage(model.GetCurrImage());
-  image_view_next_->SetImage(model.GetNextImage());
+  auto* model = delegate_->GetPhotoModel();
+  image_view_prev_->SetImage(model->GetPrevImage());
+  image_view_curr_->SetImage(model->GetCurrImage());
+  image_view_next_->SetImage(model->GetNextImage());
 }
 
 void PhotoView::StartSlideAnimation() {
diff --git a/ash/ambient/ui/photo_view.h b/ash/ambient/ui/photo_view.h
index 970a2b3..9adc353 100644
--- a/ash/ambient/ui/photo_view.h
+++ b/ash/ambient/ui/photo_view.h
@@ -10,18 +10,15 @@
 #include "base/macros.h"
 #include "ui/views/view.h"
 
-namespace views {
-class ImageView;
-}  // namespace views
-
 namespace ash {
 
-class AmbientController;
+class AmbientBackgroundImageView;
+class AmbientViewDelegate;
 
 // View to display photos in ambient mode.
 class ASH_EXPORT PhotoView : public views::View, public PhotoModelObserver {
  public:
-  explicit PhotoView(AmbientController* ambient_controller);
+  explicit PhotoView(AmbientViewDelegate* delegate);
   ~PhotoView() override;
 
   // views::View:
@@ -37,12 +34,15 @@
   void StartSlideAnimation();
   bool CanAnimate() const;
 
-  AmbientController* ambient_controller_ = nullptr;
+  // Note that we should be careful when using |delegate_|, as there is no
+  // strong guarantee on the life cycle, especially given that the widget |this|
+  // lived in is destroyed asynchronously.
+  AmbientViewDelegate* delegate_ = nullptr;
 
-  // Image containers. Used for layer animation.
-  views::ImageView* image_view_prev_ = nullptr;  // Owned by view hierarchy.
-  views::ImageView* image_view_curr_ = nullptr;  // Owned by view hierarchy.
-  views::ImageView* image_view_next_ = nullptr;  // Owned by view hierarchy.
+  // Image containers used for animation. Owned by view hierarchy.
+  AmbientBackgroundImageView* image_view_prev_ = nullptr;
+  AmbientBackgroundImageView* image_view_curr_ = nullptr;
+  AmbientBackgroundImageView* image_view_next_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(PhotoView);
 };
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc
index 6fc6039f..12d1e07 100644
--- a/ash/app_list/views/app_list_view.cc
+++ b/ash/app_list/views/app_list_view.cc
@@ -147,10 +147,12 @@
   explicit SearchBoxFocusHost(views::Widget* search_box_widget)
       : search_box_widget_(search_box_widget) {}
 
-  ~SearchBoxFocusHost() override {}
+  ~SearchBoxFocusHost() override = default;
 
   views::FocusTraversable* GetFocusTraversable() override {
-    return search_box_widget_;
+    if (search_box_widget_->IsVisible())
+      return search_box_widget_;
+    return nullptr;
   }
 
   // views::View:
diff --git a/ash/app_list/views/assistant/assistant_page_view_unittest.cc b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
index 967bc279..368fbe2 100644
--- a/ash/app_list/views/assistant/assistant_page_view_unittest.cc
+++ b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
@@ -33,8 +33,7 @@
 // nice error message indicating which view has the focus instead.
 #define EXPECT_HAS_FOCUS(expected_)                                           \
   ({                                                                          \
-    const views::View* actual =                                               \
-        main_view()->GetFocusManager()->GetFocusedView();                     \
+    const views::View* actual = GetFocusedView();                             \
     EXPECT_TRUE(expected_->HasFocus())                                        \
         << "Expected focus on '" << expected_->GetClassName()                 \
         << "' but it is on '" << (actual ? actual->GetClassName() : "<null>") \
@@ -176,6 +175,15 @@
     GetEventGenerator()->PressKey(key_code, /*flags=*/ui::EF_NONE);
   }
 
+  void PressKeyAndWait(ui::KeyboardCode key_code) {
+    PressKey(key_code);
+    base::RunLoop().RunUntilIdle();
+  }
+
+  const views::View* GetFocusedView() {
+    return main_view()->GetFocusManager()->GetFocusedView();
+  }
+
  private:
   DISALLOW_COPY_AND_ASSIGN(AssistantPageViewTest);
 };
@@ -276,6 +284,27 @@
   EXPECT_HAS_FOCUS(input_text_field());
 }
 
+TEST_F(AssistantPageViewTest, FocusShouldRemainInAssistantViewWhenPressingTab) {
+  constexpr int kMaxIterations = 100;
+  ShowAssistantUi();
+
+  const views::View* initial_focused_view = GetFocusedView();
+  const views::View* focused_view;
+  int num_views = 0;
+
+  do {
+    PressKeyAndWait(ui::KeyboardCode::VKEY_TAB);
+    focused_view = GetFocusedView();
+    EXPECT_TRUE(page_view()->Contains(focused_view))
+        << "Focus advanced to view '" << focused_view->GetClassName()
+        << "' which is not a part of the Assistant UI";
+
+    // Sanity check to ensure we do not loop forever
+    num_views++;
+    ASSERT_LT(num_views, kMaxIterations);
+  } while (focused_view != initial_focused_view);
+}
+
 TEST_F(AssistantPageViewTest, ShouldFocusMicWhenOpeningWithHotword) {
   ShowAssistantUi(AssistantEntryPoint::kHotword);
 
diff --git a/ash/assistant/ui/assistant_web_container_view.cc b/ash/assistant/ui/assistant_web_container_view.cc
index eae3264..6a6bcf6c 100644
--- a/ash/assistant/ui/assistant_web_container_view.cc
+++ b/ash/assistant/ui/assistant_web_container_view.cc
@@ -125,6 +125,7 @@
 
   AssistantWebView::InitParams contents_params;
   contents_params.suppress_navigation = true;
+  contents_params.minimize_on_back_key = true;
 
   contents_view_ = AssistantWebViewFactory::Get()->Create(contents_params);
 
diff --git a/ash/policy/policy_recommendation_restorer_unittest.cc b/ash/policy/policy_recommendation_restorer_unittest.cc
index 7fb4360..eadc02c 100644
--- a/ash/policy/policy_recommendation_restorer_unittest.cc
+++ b/ash/policy/policy_recommendation_restorer_unittest.cc
@@ -24,9 +24,10 @@
   PolicyRecommendationRestorerTest()
       : recommended_prefs_(new TestingPrefStore),
         prefs_(new sync_preferences::TestingPrefServiceSyncable(
-            new TestingPrefStore,
-            new TestingPrefStore,
-            new TestingPrefStore,
+            /*managed_prefs=*/new TestingPrefStore,
+            /*supervised_user_prefs=*/new TestingPrefStore,
+            /*extension_prefs=*/new TestingPrefStore,
+            /*user_prefs=*/new TestingPrefStore,
             recommended_prefs_,
             new user_prefs::PrefRegistrySyncable,
             new PrefNotifierImpl)) {}
diff --git a/ash/public/cpp/assistant/assistant_web_view.h b/ash/public/cpp/assistant/assistant_web_view.h
index 060b72be..3840322 100644
--- a/ash/public/cpp/assistant/assistant_web_view.h
+++ b/ash/public/cpp/assistant/assistant_web_view.h
@@ -37,6 +37,10 @@
     // embedded WebContents. When navigation suppression occurs,
     // Observer::DidSuppressNavigation() will be invoked.
     bool suppress_navigation = false;
+
+    // If enabled, AssistantWebView can be minimized once we received a ash
+    // synthesized back event when we're at the bottom of the stack.
+    bool minimize_on_back_key = false;
   };
 
   // An observer which receives AssistantWebView events.
diff --git a/ash/public/cpp/window_properties.cc b/ash/public/cpp/window_properties.cc
index 99107658..51a20f44b 100644
--- a/ash/public/cpp/window_properties.cc
+++ b/ash/public/cpp/window_properties.cc
@@ -17,6 +17,7 @@
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(ASH_PUBLIC_EXPORT, ash::WindowPinType)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(ASH_PUBLIC_EXPORT, ash::WindowStateType)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(ASH_PUBLIC_EXPORT, ash::WindowBackdrop*)
+DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(ASH_PUBLIC_EXPORT, bool*)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(ASH_PUBLIC_EXPORT, float*)
 DEFINE_EXPORTED_UI_CLASS_PROPERTY_TYPE(ASH_PUBLIC_EXPORT, SkRegion*)
 
@@ -49,6 +50,7 @@
                              kPrePipWindowStateTypeKey,
                              WindowStateType::kDefault)
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kWindowManagerManagesOpacityKey, false)
+DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(bool, kMinimizeOnBackKey, nullptr)
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kPipOriginalWindowKey, false)
 DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(float, kPipSnapFractionKey, nullptr)
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kRenderTitleAreaProperty, false)
diff --git a/ash/public/cpp/window_properties.h b/ash/public/cpp/window_properties.h
index 625880f..1de87133 100644
--- a/ash/public/cpp/window_properties.h
+++ b/ash/public/cpp/window_properties.h
@@ -126,6 +126,12 @@
 ASH_PUBLIC_EXPORT extern const aura::WindowProperty<bool>* const
     kWindowManagerManagesOpacityKey;
 
+// A property key to store whether we should minimize a window when a system
+// synthesized back event (back gesture, back button) is processed by this
+// window and when this window is at the bottom of its navigation stack.
+ASH_PUBLIC_EXPORT extern const aura::WindowProperty<bool*>* const
+    kMinimizeOnBackKey;
+
 // A property key to store the window state the window had before entering PIP.
 ASH_PUBLIC_EXPORT extern const aura::WindowProperty<WindowStateType>* const
     kPrePipWindowStateTypeKey;
diff --git a/ash/shell.cc b/ash/shell.cc
index e9f0a6a7f..1ca5e94 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -1076,8 +1076,7 @@
   // |assistant_controller_| is put before |ambient_controller_| as it will be
   // used by the latter.
   if (chromeos::features::IsAmbientModeEnabled()) {
-    ambient_controller_ =
-        std::make_unique<AmbientController>(assistant_controller_.get());
+    ambient_controller_ = std::make_unique<AmbientController>();
   }
 
   home_screen_controller_ = std::make_unique<HomeScreenController>();
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 1367750..6094fba2 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -212,7 +212,7 @@
 <translation id="3593646411856133110">برای دیدن برنامه‌های باز، تند به بالا بکشید و نگه دارید</translation>
 <translation id="3595596368722241419">باتری پر است</translation>
 <translation id="3604801046548457007">میز <ph name="DESK_TITILE" /> ایجاد شد</translation>
-<translation id="3606978283550408104">صفحه‌نمایش بریل متصل شد.</translation>
+<translation id="3606978283550408104">نمایشگر بریل متصل شد.</translation>
 <translation id="3621202678540785336">ورودی</translation>
 <translation id="3621712662352432595">تنظیمات صوتی</translation>
 <translation id="3626281679859535460">روشنایی</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 7c97282..b08c317 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -530,6 +530,7 @@
 <translation id="79341161159229895">கணக்கை நிர்வகிப்பது: <ph name="FIRST_PARENT_EMAIL" /> மற்றும் <ph name="SECOND_PARENT_EMAIL" /></translation>
 <translation id="7955885781510802139">அதிக ஒளி மாறுபாட்டுப் பயன்முறை</translation>
 <translation id="7977927628060636163">மொபைல் நெட்வொர்க்குகளைத் தேடுகிறது...</translation>
+<translation id="7980780401175799550">Chrome OSஸை வழிசெலுத்த புதிய வழிகளைப் பயன்படுத்திப் பாருங்கள்</translation>
 <translation id="7982789257301363584">நெட்வொர்க்</translation>
 <translation id="7984197416080286869">கைரேகையை அதிகபட்சம் முயன்றுவிட்டீர்கள்</translation>
 <translation id="7994370417837006925">பல உள்நுழைவு</translation>
@@ -551,6 +552,7 @@
 <translation id="8167567890448493835"><ph name="LOCALE_NAME" />ஐப் பயன்படுத்துகிறது</translation>
 <translation id="8190698733819146287">மொழிகள் மற்றும்  உள்ளீடைப் பிரத்தியேகமாக்கு...</translation>
 <translation id="8192202700944119416">அறிவிப்புகள் மறைக்கப்பட்டுள்ளன.</translation>
+<translation id="8196787716797768628">ஆப்ஸுக்கு இடையே விரைவாக மாறுவதற்கும் டேப்லெட் பயன்முறையில் உங்கள் Chromebookகை அணுகுவதற்கும் சைகைகளைப் பயன்படுத்தலாம்.</translation>
 <translation id="8203795194971602413">வலது கிளிக் செய்யும்</translation>
 <translation id="8236042855478648955">இடைவேளைக்கான நேரம்</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, சிக்னல் வலிமை: <ph name="SIGNAL_STRENGTH" />, மொபைல் பேட்டரி: <ph name="BATTERY_STATUS" /></translation>
diff --git a/ash/system/audio/unified_volume_slider_controller.cc b/ash/system/audio/unified_volume_slider_controller.cc
index 8e297703..34a2fb96 100644
--- a/ash/system/audio/unified_volume_slider_controller.cc
+++ b/ash/system/audio/unified_volume_slider_controller.cc
@@ -15,16 +15,6 @@
 using chromeos::CrasAudioHandler;
 
 namespace ash {
-namespace {
-
-void LogUserVolumeEvent(const int previous_level, const int current_level) {
-  auto* logger = ml::UserSettingsEventLogger::Get();
-  if (logger) {
-    logger->LogVolumeUkmEvent(previous_level, current_level);
-  }
-}
-
-}  // namespace
 
 UnifiedVolumeSliderController::UnifiedVolumeSliderController(
     UnifiedVolumeSliderController::Delegate* delegate)
@@ -44,12 +34,9 @@
                                                   const ui::Event& event) {
   if (sender == slider_->button()) {
     bool mute_on = !CrasAudioHandler::Get()->IsOutputMuted();
-    const int volume_level = CrasAudioHandler::Get()->GetOutputVolumePercent();
     if (mute_on) {
-      LogUserVolumeEvent(volume_level, 0);
       base::RecordAction(base::UserMetricsAction("StatusArea_Audio_Muted"));
     } else {
-      LogUserVolumeEvent(0, volume_level);
       base::RecordAction(base::UserMetricsAction("StatusArea_Audio_Unmuted"));
     }
     CrasAudioHandler::Get()->SetOutputMute(mute_on);
@@ -73,7 +60,6 @@
         UMA_STATUS_AREA_CHANGED_VOLUME_MENU);
   }
 
-  LogUserVolumeEvent(CrasAudioHandler::Get()->GetOutputVolumePercent(), level);
   CrasAudioHandler::Get()->SetOutputVolumePercent(level);
 
   // If the volume is above certain level and it's muted, it should be unmuted.
diff --git a/ash/system/machine_learning/user_settings_event_logger.cc b/ash/system/machine_learning/user_settings_event_logger.cc
index a639cb5..35f378d 100644
--- a/ash/system/machine_learning/user_settings_event_logger.cc
+++ b/ash/system/machine_learning/user_settings_event_logger.cc
@@ -56,10 +56,15 @@
       is_playing_audio_(false),
       is_playing_video_(false),
       clock_(base::DefaultClock::GetInstance()) {
-  chromeos::CrasAudioHandler::Get()->AddAudioObserver(this);
+  chromeos::CrasAudioHandler* audio_handler = chromeos::CrasAudioHandler::Get();
+  DCHECK(audio_handler);
+
+  audio_handler->AddAudioObserver(this);
   chromeos::PowerManagerClient::Get()->AddObserver(this);
   Shell::Get()->AddShellObserver(this);
   Shell::Get()->video_detector()->AddObserver(this);
+
+  volume_ = audio_handler->GetOutputVolumePercent();
 }
 
 UserSettingsEventLogger::~UserSettingsEventLogger() {
@@ -183,12 +188,22 @@
   SendToUkmAndAppList(settings_event);
 }
 
-void UserSettingsEventLogger::LogVolumeUkmEvent(const int previous_level,
-                                                const int current_level) {
+void UserSettingsEventLogger::OnOutputNodeVolumeChanged(uint64_t /*node*/,
+                                                        const int volume) {
   if (!volume_timer_.IsRunning()) {
-    previous_volume_ = previous_level;
+    volume_before_user_change_ = volume_;
   }
-  current_volume_ = current_level;
+  volume_ = volume;
+  volume_before_mute_ = volume;
+  volume_timer_.Start(FROM_HERE, kSliderDelay, this,
+                      &UserSettingsEventLogger::OnVolumeTimerEnded);
+}
+
+void UserSettingsEventLogger::OnOutputMuteChanged(const bool mute_on) {
+  if (!volume_timer_.IsRunning()) {
+    volume_before_user_change_ = volume_;
+  }
+  volume_ = mute_on ? 0 : volume_before_mute_;
   volume_timer_.Start(FROM_HERE, kSliderDelay, this,
                       &UserSettingsEventLogger::OnVolumeTimerEnded);
 }
@@ -199,8 +214,8 @@
 
   event->set_setting_id(UserSettingsEvent::Event::VOLUME);
   event->set_setting_type(UserSettingsEvent::Event::QUICK_SETTINGS);
-  event->set_previous_value(previous_volume_);
-  event->set_current_value(current_volume_);
+  event->set_previous_value(volume_before_user_change_);
+  event->set_current_value(volume_);
 
   PopulateSharedFeatures(&settings_event);
   SendToUkmAndAppList(settings_event);
diff --git a/ash/system/machine_learning/user_settings_event_logger.h b/ash/system/machine_learning/user_settings_event_logger.h
index 11b5daf..db7161d2 100644
--- a/ash/system/machine_learning/user_settings_event_logger.h
+++ b/ash/system/machine_learning/user_settings_event_logger.h
@@ -65,10 +65,9 @@
   void LogAccessibilityUkmEvent(UserSettingsEvent::Event::AccessibilityId id,
                                 bool enabled);
 
-  // Logs an event to UKM that the user has changed the volume from the tray.
-  void LogVolumeUkmEvent(int previous_level, int current_level);
-
   // chromeos::CrasAudioHandler::AudioObserver overrides:
+  void OnOutputNodeVolumeChanged(uint64_t node, int volume) override;
+  void OnOutputMuteChanged(bool mute_on) override;
   void OnOutputStarted() override;
   void OnOutputStopped() override;
 
@@ -105,8 +104,9 @@
 
   // Timer to ensure that volume is only recorded after a pause.
   base::OneShotTimer volume_timer_;
-  int previous_volume_;
-  int current_volume_;
+  int volume_;
+  int volume_before_mute_;
+  int volume_before_user_change_;
 
   // Timer to ensure that brightness is only recorded after a pause.
   base::OneShotTimer brightness_timer_;
diff --git a/ash/system/machine_learning/user_settings_event_logger_unittest.cc b/ash/system/machine_learning/user_settings_event_logger_unittest.cc
index 4828c36..3ab024b 100644
--- a/ash/system/machine_learning/user_settings_event_logger_unittest.cc
+++ b/ash/system/machine_learning/user_settings_event_logger_unittest.cc
@@ -121,19 +121,24 @@
   }
 
   // Volume features are logged at the end of the timer delay.
-  void LogVolumeAndWait(const int previous_level, const int current_level) {
-    logger_->LogVolumeUkmEvent(previous_level, current_level);
+  void LogVolumeAndWait(const int volume) {
+    logger_->OnOutputNodeVolumeChanged(0, volume);
     task_environment()->FastForwardBy(kSliderDelay);
   }
 
-  void LogBrightness(const int current_level,
+  void SetMuteAndWait(const bool mute_on) {
+    logger_->OnOutputMuteChanged(mute_on);
+    task_environment()->FastForwardBy(kSliderDelay);
+  }
+
+  void LogBrightness(const int brightness,
                      const bool initiated_by_user = true) {
     power_manager::BacklightBrightnessChange change;
     change.set_cause(
         initiated_by_user
             ? power_manager::BacklightBrightnessChange_Cause_USER_REQUEST
             : power_manager::BacklightBrightnessChange_Cause_OTHER);
-    change.set_percent(current_level);
+    change.set_percent(brightness);
 
     logger_->ScreenBrightnessChanged(change);
   }
@@ -342,42 +347,55 @@
 }
 
 TEST_F(UserSettingsEventLoggerTest, TestLogVolumeFeatures) {
-  LogVolumeAndWait(23, 98);
+  LogVolumeAndWait(23);
+  LogVolumeAndWait(98);
+  SetMuteAndWait(true);
+  SetMuteAndWait(false);
+  LogVolumeAndWait(20);
+  SetMuteAndWait(true);
+  LogVolumeAndWait(50);
 
   const auto& entries = GetUkmEntries();
-  ASSERT_EQ(1ul, entries.size());
+  ASSERT_EQ(7ul, entries.size());
 
   const auto* entry = entries[0];
   TestUkmRecorder::ExpectEntryMetric(entry, "SettingId",
                                      UserSettingsEvent::Event::VOLUME);
   TestUkmRecorder::ExpectEntryMetric(entry, "SettingType",
                                      UserSettingsEvent::Event::QUICK_SETTINGS);
-  TestUkmRecorder::ExpectEntryMetric(entry, "PreviousValue", 23);
-  TestUkmRecorder::ExpectEntryMetric(entry, "CurrentValue", 98);
-  TestUkmRecorder::ExpectEntryMetric(entry, "IsPlayingAudio", false);
+  TestUkmRecorder::ExpectEntryMetric(entry, "CurrentValue", 23);
+
+  TestUkmRecorder::ExpectEntryMetric(entries[1], "PreviousValue", 23);
+  TestUkmRecorder::ExpectEntryMetric(entries[1], "CurrentValue", 98);
+  TestUkmRecorder::ExpectEntryMetric(entries[2], "PreviousValue", 98);
+  TestUkmRecorder::ExpectEntryMetric(entries[2], "CurrentValue", 0);
+  TestUkmRecorder::ExpectEntryMetric(entries[3], "PreviousValue", 0);
+  TestUkmRecorder::ExpectEntryMetric(entries[3], "CurrentValue", 98);
+  TestUkmRecorder::ExpectEntryMetric(entries[4], "PreviousValue", 98);
+  TestUkmRecorder::ExpectEntryMetric(entries[4], "CurrentValue", 20);
+  TestUkmRecorder::ExpectEntryMetric(entries[5], "PreviousValue", 20);
+  TestUkmRecorder::ExpectEntryMetric(entries[5], "CurrentValue", 0);
+  TestUkmRecorder::ExpectEntryMetric(entries[6], "PreviousValue", 0);
+  TestUkmRecorder::ExpectEntryMetric(entries[6], "CurrentValue", 50);
 }
 
 TEST_F(UserSettingsEventLoggerTest, TestVolumeDelay) {
+  LogVolumeAndWait(10);
+
   // Only log an event if there is a pause of |kSliderDelay|.
-  logger_->LogVolumeUkmEvent(10, 11);
+  logger_->OnOutputNodeVolumeChanged(0, 11);
   task_environment()->FastForwardBy(kSliderDelay / 2);
-  logger_->LogVolumeUkmEvent(11, 12);
-  logger_->LogVolumeUkmEvent(12, 13);
-  logger_->LogVolumeUkmEvent(13, 14);
+  logger_->OnOutputNodeVolumeChanged(0, 12);
   task_environment()->FastForwardBy(kSliderDelay / 2);
-  logger_->LogVolumeUkmEvent(14, 15);
+  logger_->OnOutputNodeVolumeChanged(0, 13);
   task_environment()->FastForwardBy(kSliderDelay);
 
   const auto& entries = GetUkmEntries();
-  ASSERT_EQ(1ul, entries.size());
+  ASSERT_EQ(2ul, entries.size());
 
-  const auto* entry = entries[0];
-  TestUkmRecorder::ExpectEntryMetric(entry, "SettingId",
-                                     UserSettingsEvent::Event::VOLUME);
-  TestUkmRecorder::ExpectEntryMetric(entry, "SettingType",
-                                     UserSettingsEvent::Event::QUICK_SETTINGS);
-  TestUkmRecorder::ExpectEntryMetric(entry, "PreviousValue", 10);
-  TestUkmRecorder::ExpectEntryMetric(entry, "CurrentValue", 15);
+  TestUkmRecorder::ExpectEntryMetric(entries[0], "CurrentValue", 10);
+  TestUkmRecorder::ExpectEntryMetric(entries[1], "PreviousValue", 10);
+  TestUkmRecorder::ExpectEntryMetric(entries[1], "CurrentValue", 13);
 }
 
 TEST_F(UserSettingsEventLoggerTest, TestLogBrightnessReason) {
diff --git a/ash/wm/gestures/back_gesture/back_gesture_event_handler_unittest.cc b/ash/wm/gestures/back_gesture/back_gesture_event_handler_unittest.cc
index 04aad14..2c3a81a 100644
--- a/ash/wm/gestures/back_gesture/back_gesture_event_handler_unittest.cc
+++ b/ash/wm/gestures/back_gesture/back_gesture_event_handler_unittest.cc
@@ -640,4 +640,23 @@
   EXPECT_TRUE(window_state->IsMinimized());
 }
 
+TEST_F(BackGestureEventHandlerTestCantGoBack, NonAppAndSystemApps) {
+  RecreateTopWindow(AppType::NON_APP);
+  GenerateBackSequence();
+  EXPECT_TRUE(WindowState::Get(top_window())->IsMinimized());
+
+  RecreateTopWindow(AppType::SYSTEM_APP);
+  GenerateBackSequence();
+  EXPECT_TRUE(WindowState::Get(top_window())->IsMinimized());
+}
+
+// Tests that the back gesture will force minimize even non minimizeable apps.
+TEST_F(BackGestureEventHandlerTestCantGoBack, NonMinimizeableApp) {
+  // Make the top window non minimizeable.
+  top_window()->SetProperty(aura::client::kResizeBehaviorKey,
+                            aura::client::kResizeBehaviorNone);
+  GenerateBackSequence();
+  EXPECT_TRUE(WindowState::Get(top_window())->IsMinimized());
+}
+
 }  // namespace ash
diff --git a/ash/wm/window_util.cc b/ash/wm/window_util.cc
index 5406392..0a86f09 100644
--- a/ash/wm/window_util.cc
+++ b/ash/wm/window_util.cc
@@ -373,17 +373,19 @@
     return false;
   }
 
+  // ARC and crostini apps will handle the back event that follows on the client
+  // side and will minimize/close the window there.
   const int app_type = window->GetProperty(aura::client::kAppType);
-  if (app_type != static_cast<int>(AppType::BROWSER) &&
-      app_type != static_cast<int>(AppType::CHROME_APP)) {
+  if (app_type == static_cast<int>(AppType::ARC_APP) ||
+      app_type == static_cast<int>(AppType::CROSTINI_APP)) {
     return false;
   }
 
-  WindowState* window_state = WindowState::Get(window);
-  if (!window_state || !window_state->CanMinimize() ||
-      window_state->IsMinimized()) {
-    return false;
-  }
+  // Use the value of |kMinimizeOnBackKey| if it is provided. It can be provided
+  // by windows with custom web contents.
+  bool* can_minimize_on_back_key = window->GetProperty(kMinimizeOnBackKey);
+  if (can_minimize_on_back_key)
+    return *can_minimize_on_back_key;
 
   // Minimize the window if it is at the bottom page.
   return !shell->shell_delegate()->CanGoBack(window);
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py
index 8bd8390..64a1188c 100755
--- a/build/android/apk_operations.py
+++ b/build/android/apk_operations.py
@@ -33,12 +33,14 @@
 from devil.android import device_utils
 from devil.android import flag_changer
 from devil.android.sdk import adb_wrapper
+from devil.android.sdk import build_tools
 from devil.android.sdk import intent
 from devil.android.sdk import version_codes
 from devil.utils import run_tests_helper
 
 _DIR_SOURCE_ROOT = os.path.normpath(
     os.path.join(os.path.dirname(__file__), '..', '..'))
+_JAVA_HOME = os.path.join(_DIR_SOURCE_ROOT, 'third_party', 'jdk', 'current')
 
 with devil_env.SysPath(
     os.path.join(_DIR_SOURCE_ROOT, 'third_party', 'colorama', 'src')):
@@ -1568,6 +1570,73 @@
                    self.args.compilation_filter)
 
 
+class _PrintCertsCommand(_Command):
+  name = 'print-certs'
+  description = 'Print info about certificates used to sign this APK.'
+  need_device_args = False
+  needs_apk_helper = True
+
+  def _RegisterExtraArgs(self, group):
+    group.add_argument(
+        '--full-cert',
+        action='store_true',
+        help=("Print the certificate's full signature, Base64-encoded. "
+              "Useful when configuring an Android image's "
+              "config_webview_packages.xml."))
+
+  def Run(self):
+    keytool = os.path.join(_JAVA_HOME, 'bin', 'keytool')
+    if self.is_bundle:
+      # Bundles are not signed until converted to .apks. The wrapper scripts
+      # record which key will be used to sign though.
+      with tempfile.NamedTemporaryFile() as f:
+        logging.warning('Bundles are not signed until turned into .apk files.')
+        logging.warning('Showing signing info based on associated keystore.')
+        cmd = [
+            keytool, '-exportcert', '-keystore',
+            self.bundle_generation_info.keystore_path, '-storepass',
+            self.bundle_generation_info.keystore_password, '-alias',
+            self.bundle_generation_info.keystore_alias, '-file', f.name
+        ]
+        subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+        cmd = [keytool, '-printcert', '-file', f.name]
+        logging.warning('Running: %s', ' '.join(cmd))
+        subprocess.check_call(cmd)
+        if self.args.full_cert:
+          # Redirect stderr to hide a keytool warning about using non-standard
+          # keystore format.
+          full_output = subprocess.check_output(
+              cmd + ['-rfc'], stderr=subprocess.STDOUT)
+    else:
+      cmd = [
+          build_tools.GetPath('apksigner'), 'verify', '--print-certs',
+          '--verbose', self.apk_helper.path
+      ]
+      logging.warning('Running: %s', ' '.join(cmd))
+      stdout = subprocess.check_output(cmd)
+      print(stdout)
+      if self.args.full_cert:
+        if 'v1 scheme (JAR signing): true' not in stdout:
+          raise Exception(
+              'Cannot print full certificate because apk is not V1 signed.')
+
+        cmd = [keytool, '-printcert', '-jarfile', '-rfc', self.apk_helper.path]
+        # Redirect stderr to hide a keytool warning about using non-standard
+        # keystore format.
+        full_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+
+    if self.args.full_cert:
+      m = re.search(
+          r'-+BEGIN CERTIFICATE-+([\r\n0-9A-Za-z+/=]+)-+END CERTIFICATE-+',
+          full_output, re.MULTILINE)
+      if not m:
+        raise Exception('Unable to parse certificate:\n{}'.format(full_output))
+      signature = re.sub(r'[\r\n]+', '', m.group(1))
+      print()
+      print('Full Signature:')
+      print(signature)
+
+
 class _ProfileCommand(_Command):
   name = 'profile'
   description = ('Run the simpleperf sampling CPU profiler on the currently-'
@@ -1715,6 +1784,7 @@
     _MemUsageCommand,
     _ShellCommand,
     _CompileDexCommand,
+    _PrintCertsCommand,
     _ProfileCommand,
     _RunCommand,
     _StackCommand,
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 11e0a21..6f5d5f12 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -276,7 +276,7 @@
 # - is_android, is_chromeos, is_ios, and is_win should be obvious.
 # - is_mac is set only for desktop Mac. It is not set on iOS.
 # - is_posix is true for mac and any Unix-like system (basically everything
-#   except Windows).
+#   except Fuchsia and Windows).
 # - is_linux is true for desktop Linux and ChromeOS, but not Android (which is
 #   generally too different despite being based on the Linux kernel).
 #
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 363853b..69d448a 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1592,8 +1592,7 @@
     # TODO(thakis): Enable this more often, https://crbug.com/346399
     # use_libfuzzer: https://crbug.com/1063180
     if (!is_nacl && !use_libfuzzer &&
-        (target_os == "android" || target_os == "chromeos" ||
-         target_os == "fuchsia" || target_os == "linux" || target_os == "win")) {
+        (target_os != "ios" && target_os != "mac")) {
       cflags += [ "-Wunreachable-code" ]
     }
 
diff --git a/build/config/linux/gtk/BUILD.gn b/build/config/linux/gtk/BUILD.gn
index 27cf4bb3..8bfa559 100644
--- a/build/config/linux/gtk/BUILD.gn
+++ b/build/config/linux/gtk/BUILD.gn
@@ -22,8 +22,8 @@
 
 group("gtk") {
   visibility = [
-    # This is the only target in Chrome that should depend on GTK.
-    "//chrome/browser/ui/gtk:*",
+    # This is the only target that should depend on GTK.
+    "//ui/gtk:*",
 
     # These are all for WebRTC.
     "//examples:peerconnection_client",
diff --git a/build/config/sanitizers/BUILD.gn b/build/config/sanitizers/BUILD.gn
index f7bc1ce..d1d1283 100644
--- a/build/config/sanitizers/BUILD.gn
+++ b/build/config/sanitizers/BUILD.gn
@@ -53,7 +53,7 @@
   }
 }
 
-assert(!(is_win && is_asan && target_cpu == "x86"),
+assert(!(is_win && is_asan && current_cpu == "x86"),
        "ASan is only supported in 64-bit builds on Windows.")
 
 if ((is_mac || is_win || (is_ios && !use_xcode_clang)) && is_asan) {
@@ -61,7 +61,7 @@
     _clang_rt_dso_path = "darwin/libclang_rt.asan_osx_dynamic.dylib"
   } else if (is_ios) {
     _clang_rt_dso_path = "darwin/libclang_rt.asan_iossim_dynamic.dylib"
-  } else if (is_win && target_cpu == "x64") {
+  } else if (is_win && current_cpu == "x64") {
     _clang_rt_dso_path = "windows/clang_rt.asan_dynamic-x86_64.dll"
   }
 
@@ -222,14 +222,14 @@
       # In the static-library build, ASan libraries are different for
       # executables and dlls, see link_executable and link_shared_library below.
       # This here handles only the component build.
-      if (target_cpu == "x64") {
+      if (current_cpu == "x64") {
         # Windows 64-bit.
         libs = [
           "clang_rt.asan_dynamic-x86_64.lib",
           "clang_rt.asan_dynamic_runtime_thunk-x86_64.lib",
         ]
       } else {
-        assert(target_cpu == "x86", "WinASan unsupported architecture")
+        assert(current_cpu == "x86", "WinASan unsupported architecture")
         libs = [
           "clang_rt.asan_dynamic-i386.lib",
           "clang_rt.asan_dynamic_runtime_thunk-i386.lib",
@@ -237,7 +237,7 @@
       }
     }
     if (use_libfuzzer) {
-      assert(target_cpu == "x64", "LibFuzzer unsupported architecture")
+      assert(current_cpu == "x64", "LibFuzzer unsupported architecture")
       assert(!is_component_build,
              "LibFuzzer only supports non-component builds on Windows")
 
@@ -308,10 +308,10 @@
 
 config("link_executable") {
   if (is_asan && is_win && !is_component_build) {
-    if (target_cpu == "x64") {
+    if (current_cpu == "x64") {
       ldflags = [ "-wholearchive:clang_rt.asan-x86_64.lib" ]
     } else {
-      assert(target_cpu == "x86", "WinASan unsupported architecture")
+      assert(current_cpu == "x86", "WinASan unsupported architecture")
       ldflags = [ "-wholearchive:clang_rt.asan-i386.lib" ]
     }
   }
@@ -319,10 +319,10 @@
 
 config("link_shared_library") {
   if (is_asan && is_win && !is_component_build) {
-    if (target_cpu == "x64") {
+    if (current_cpu == "x64") {
       libs = [ "clang_rt.asan_dll_thunk-x86_64.lib" ]
     } else {
-      assert(target_cpu == "x86", "WinASan unsupported architecture")
+      assert(current_cpu == "x86", "WinASan unsupported architecture")
       libs = [ "clang_rt.asan_dll_thunk-i386.lib" ]
     }
   }
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 025c776..789f48f 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20200327.1.1
\ No newline at end of file
+0.20200327.2.4
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 025c776..789f48f 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20200327.1.1
\ No newline at end of file
+0.20200327.2.4
\ No newline at end of file
diff --git a/cc/metrics/frame_sequence_metrics_unittest.cc b/cc/metrics/frame_sequence_metrics_unittest.cc
index e72c0a0..353c337 100644
--- a/cc/metrics/frame_sequence_metrics_unittest.cc
+++ b/cc/metrics/frame_sequence_metrics_unittest.cc
@@ -10,6 +10,22 @@
 
 namespace cc {
 
+TEST(FrameSequenceMetricsTest, SlowerThread) {
+  base::HistogramTester histogram_tester;
+
+  FrameSequenceMetrics first(FrameSequenceTrackerType::kTouchScroll, nullptr);
+  first.impl_throughput().frames_expected = 200;
+  first.impl_throughput().frames_produced = 190;
+  first.main_throughput().frames_expected = 100;
+  first.main_throughput().frames_produced = 50;
+
+  // slower thread throughput is computed at ReportMetrics().
+  first.ReportMetrics();
+  std::string metric =
+      "Graphics.Smoothness.PercentDroppedFrames.SlowerThread.TouchScroll";
+  EXPECT_EQ(histogram_tester.GetBucketCount(metric, 50), 1);
+}
+
 TEST(FrameSequenceMetricsTest, MergeMetrics) {
   // Create a metric with only a small number of frames. It shouldn't report any
   // metrics.
diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc
index d47241a2..5dc64f7 100644
--- a/cc/metrics/frame_sequence_tracker.cc
+++ b/cc/metrics/frame_sequence_tracker.cc
@@ -203,14 +203,16 @@
   if (should_report_slower_thread) {
     base::Optional<ThroughputData> slower_throughput;
     base::Optional<int> slower_throughput_percent;
+    // The value is percent of dropped frames, slower throughput should have
+    // larger value.
     if (impl_throughput_percent &&
         (!main_throughput_percent ||
-         impl_throughput_percent.value() <= main_throughput_percent.value())) {
+         impl_throughput_percent.value() >= main_throughput_percent.value())) {
       slower_throughput = impl_throughput_;
     }
     if (main_throughput_percent &&
         (!impl_throughput_percent ||
-         main_throughput_percent.value() < impl_throughput_percent.value())) {
+         main_throughput_percent.value() > impl_throughput_percent.value())) {
       slower_throughput = main_throughput_;
     }
     if (slower_throughput.has_value()) {
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 694021b..750bf3d1 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -65,6 +65,7 @@
   "javatests/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncTest.java",
   "javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java",
+  "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkEditTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
index e5660e8..f8eba5f 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
@@ -5,6 +5,7 @@
 <translation id="1699570257714336246">தகவல் முழுமையாக இல்லை</translation>
 <translation id="1932278019417741381">உங்கள் பணிகளை நிறைவு செய்வதில் உதவும் பொருட்டு, நீங்கள் Assistantடைப் பயன்படுத்தும் தளங்களின் URLகளையும் உள்ளடக்கங்களையும் நீங்கள் Assistant மூலம் சமர்ப்பிக்கும் தகவலையும் Google பெறும். இந்தத் தகவல் உங்கள் Google கணக்கில் சேமிக்கப்பட்டிருக்கக்கூடும். Chrome அமைப்புகளில் நீங்கள் Assistantடை முடக்கலாம். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">மதிப்பைக் குறைக்கும்</translation>
+<translation id="3353437022146208653">Google Assistantடில் \n சில தட்டுதல்கள் மூலம் \n காரை வாடகைக்கு எடுக்கலாம்.</translation>
 <translation id="4130750466177569591">நான் ஏற்கிறேன்</translation>
 <translation id="4437727785356380473">’Chromeமில் Google அசிஸ்டண்ட்’ மூடப்பட்டது.</translation>
 <translation id="4517854969512651305">மதிப்பை அதிகரிக்கும்</translation>
@@ -12,8 +13,10 @@
 <translation id="4952448020231702394">இணையத்தில் தேடல், செக் அவுட் போன்றவற்றைச் செய்ய உதவுவதன் மூலம் Google அசிஸ்டண்ட் உங்கள் நேரத்தை மிச்சப்படுத்தும்.</translation>
 <translation id="5267269112080050255">'Chromeமில் Google அசிஸ்டண்ட்' திரையின் முழு அளவிற்குத் திறக்கப்பட்டுள்ளது.</translation>
 <translation id="6555233628095991027">'Chromeமில் Google அசிஸ்டண்ட்' திரையின் பாதி அளவிற்குத் திறக்கப்பட்டுள்ளது.</translation>
+<translation id="6620345200476149840">Google Assistantடை \n Chromeமில் பயன்படுத்திப் பாருங்கள்</translation>
 <translation id="6973932557599545801">மன்னிக்கவும், என்னால் உதவ இயலவில்லை. நீங்களே செய்யுங்கள்.</translation>
 <translation id="7658239707568436148">ரத்து செய்</translation>
 <translation id="8253702004019660079">Chromeமில் Google அசிஸ்டண்ட்</translation>
+<translation id="8323517642730821247">சில தட்டுதல்கள் மூலம் \n Google Assistantடில் \n திரைப்பட டிக்கெட்டுகளை வாங்கலாம்.</translation>
 <translation id="945522503751344254">பின்னூட்டம் அனுப்புக</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/BLEHandler.java b/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/BLEHandler.java
index d828c86..851cbf31 100644
--- a/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/BLEHandler.java
+++ b/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/BLEHandler.java
@@ -195,9 +195,17 @@
                 mTaskRunner.postTask(() -> {
                     Integer mtu = mKnownMtus.get(client);
                     if (mtu == null) {
-                        mtu = 512;
+                        // If no MTU is negotiated, the GATT default is just 23 bytes.
+                        mtu = 23;
                     }
-                    // TODO: should the MTU be trimmed to account for overhead?
+                    if (mtu < 4) {
+                        Log.i(TAG, "MTU unusably small");
+                        mServer.sendResponse(
+                                device, requestId, BluetoothGatt.GATT_FAILURE, 0, null);
+                        return;
+                    }
+                    // The (G)ATT op-code and attribute handle take three bytes.
+                    mtu -= 3;
                     byte[] mtuBytes = {(byte) (mtu >> 8), (byte) (mtu & 0xff)};
                     mServer.sendResponse(
                             device, requestId, BluetoothGatt.GATT_SUCCESS, 0, mtuBytes);
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
index 1beb3fc..84ad42a 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
@@ -1431,6 +1431,8 @@
 
     @Test
     @MediumTest
+    // Disable TAB_TO_GTS_ANIMATION to make it less flaky.
+    @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study")
     @CommandLineFlags.Add({BASE_PARAMS + "/enable_search_term_chip/true"})
     public void testSearchTermChip_noChip() throws InterruptedException {
         assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue());
@@ -1443,6 +1445,8 @@
 
     @Test
     @MediumTest
+    // Disable TAB_TO_GTS_ANIMATION to make it less flaky.
+    @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study")
     @CommandLineFlags.Add({BASE_PARAMS + "/enable_search_term_chip/true"})
     public void testSearchTermChip_withChip() throws InterruptedException {
         assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue());
@@ -1518,6 +1522,8 @@
     @Test
     @MediumTest
     // clang-format off
+    // Disable TAB_TO_GTS_ANIMATION to make it less flaky.
+    @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study")
     @CommandLineFlags.Add({BASE_PARAMS +
             "/enable_search_term_chip/true/enable_search_term_chip_adaptive_icon/true"})
     public void testSearchTermChip_adaptiveIcon() throws InterruptedException {
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
index 16eac76..e8c786f 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
@@ -28,7 +28,7 @@
 <translation id="7792771145871471484">Revisa els suggeriments.</translation>
 <translation id="7885132941432959125">Mou la pestanya cap a la dreta</translation>
 <translation id="7966321538264951561">Ignora els suggeriments.</translation>
-<translation id="814503310257431685">Mostra tot</translation>
+<translation id="814503310257431685">Mostra-ho tot</translation>
 <translation id="8205266828577616993">Mou la pestanya cap amunt</translation>
 <translation id="83556505225171773">{TABS_COUNT,plural, =1{Tanca <ph name="TABS_COUNT_ONE" /> pestanya seleccionada}other{Tanca les <ph name="TABS_COUNT_MANY" /> pestanyes seleccionades}}</translation>
 <translation id="9150694013019234766">Canvia de pestanya al grup de pestanyes de la part inferior de la pantalla</translation>
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/TasksViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/TasksViewBinderTest.java
index fb1d58ec..44b6417 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/TasksViewBinderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/TasksViewBinderTest.java
@@ -56,11 +56,8 @@
 public class TasksViewBinderTest extends DummyUiActivityTestCase {
     private TasksView mTasksView;
     private PropertyModel mTasksViewPropertyModel;
-    private PropertyModelChangeProcessor mTasksViewMCP;
     private AtomicBoolean mViewClicked = new AtomicBoolean();
-    private View.OnClickListener mViewOnClickListener = (v) -> {
-        mViewClicked.set(true);
-    };
+    private View.OnClickListener mViewOnClickListener = (v) -> mViewClicked.set(true);
     @Mock
     private IncognitoCookieControlsManager mCookieControlsManager;
 
@@ -73,11 +70,11 @@
             mTasksView = (TasksView) getActivity().getLayoutInflater().inflate(
                     R.layout.tasks_view_layout, null);
             getActivity().setContentView(mTasksView);
-        });
 
-        mTasksViewPropertyModel = new PropertyModel(TasksSurfaceProperties.ALL_KEYS);
-        mTasksViewMCP = PropertyModelChangeProcessor.create(
-                mTasksViewPropertyModel, mTasksView, TasksViewBinder::bind);
+            mTasksViewPropertyModel = new PropertyModel(TasksSurfaceProperties.ALL_KEYS);
+            PropertyModelChangeProcessor.create(
+                    mTasksViewPropertyModel, mTasksView, TasksViewBinder::bind);
+        });
     }
 
     private boolean isViewVisible(int viewId) {
@@ -101,7 +98,7 @@
     @SmallTest
     public void testSetFakeboxVisibilityClickListenerAndTextWatcher() {
         TestThreadUtils.runOnUiThreadBlocking(
-                () -> { mTasksViewPropertyModel.set(IS_FAKE_SEARCH_BOX_VISIBLE, true); });
+                () -> mTasksViewPropertyModel.set(IS_FAKE_SEARCH_BOX_VISIBLE, true));
         assertTrue(isViewVisible(R.id.search_box));
 
         AtomicBoolean textChanged = new AtomicBoolean();
@@ -133,12 +130,12 @@
         onView(withId(R.id.search_box_text)).perform(replaceText("test"));
         assertFalse(textChanged.get());
         TestThreadUtils.runOnUiThreadBlocking(
-                () -> { mTasksViewPropertyModel.set(FAKE_SEARCH_BOX_TEXT_WATCHER, textWatcher); });
+                () -> mTasksViewPropertyModel.set(FAKE_SEARCH_BOX_TEXT_WATCHER, textWatcher));
         onView(withId(R.id.search_box_text)).perform(replaceText("test2"));
         assertTrue(textChanged.get());
 
         TestThreadUtils.runOnUiThreadBlocking(
-                () -> { mTasksViewPropertyModel.set(IS_FAKE_SEARCH_BOX_VISIBLE, false); });
+                () -> mTasksViewPropertyModel.set(IS_FAKE_SEARCH_BOX_VISIBLE, false));
         assertFalse(isViewVisible(R.id.search_box));
     }
 
@@ -161,7 +158,7 @@
         assertTrue(mViewClicked.get());
 
         TestThreadUtils.runOnUiThreadBlocking(
-                () -> { mTasksViewPropertyModel.set(IS_VOICE_RECOGNITION_BUTTON_VISIBLE, false); });
+                () -> mTasksViewPropertyModel.set(IS_VOICE_RECOGNITION_BUTTON_VISIBLE, false));
         assertFalse(isViewVisible(R.id.voice_search_button));
     }
 
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java
index 3aab66d..fec5643 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java
@@ -44,7 +44,7 @@
  * Integration tests for TabGridMessageCardProvider component.
  */
 public class MessageCardProviderTest extends DummyUiActivityTestCase {
-    static final int SUGGESTED_TAB_COUNT = 2;
+    private static final int SUGGESTED_TAB_COUNT = 2;
 
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
@@ -148,7 +148,7 @@
         when(mTabSuggestionMessageData.getSize()).thenReturn(SUGGESTED_TAB_COUNT);
         mSuggestionService.sendAvailabilityNotification(mTabSuggestionMessageData);
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mRecyclerView.startShowing(false); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mRecyclerView.startShowing(false));
 
         CriteriaHelper.pollUiThread(
                 () -> mRecyclerView.getVisibility() == View.VISIBLE && mFinishedShowing.get());
@@ -165,7 +165,7 @@
                 .thenReturn(() -> reviewed.set(true));
         mSuggestionService.sendAvailabilityNotification(mTabSuggestionMessageData);
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mRecyclerView.startShowing(false); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mRecyclerView.startShowing(false));
 
         CriteriaHelper.pollUiThread(
                 () -> mRecyclerView.getVisibility() == View.VISIBLE && mFinishedShowing.get());
@@ -186,7 +186,7 @@
                 .thenReturn((type) -> dismissed.set(true));
         mSuggestionService.sendAvailabilityNotification(mTabSuggestionMessageData);
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mRecyclerView.startShowing(false); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mRecyclerView.startShowing(false));
 
         CriteriaHelper.pollUiThread(
                 () -> mRecyclerView.getVisibility() == View.VISIBLE && mFinishedShowing.get());
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java
index 8a6715e..530be0d 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java
@@ -43,19 +43,14 @@
     private AtomicBoolean mMessageServiceReviewCallbackRan = new AtomicBoolean();
     private AtomicBoolean mMessageServiceDismissCallbackRan = new AtomicBoolean();
 
-    private MessageCardView.ReviewActionProvider mUiReviewHandler = () -> {
-        mReviewButtonClicked.set(true);
-    };
-    private MessageCardView.DismissActionProvider mUiDismissHandler = (int messageType) -> {
-        mDismissButtonClicked.set(true);
-    };
-    private MessageCardView.ReviewActionProvider mMessageServiceActionHandler = () -> {
-        mMessageServiceReviewCallbackRan.set(true);
-    };
+    private MessageCardView.ReviewActionProvider mUiReviewHandler =
+            () -> mReviewButtonClicked.set(true);
+    private MessageCardView.DismissActionProvider mUiDismissHandler =
+            (int messageType) -> mDismissButtonClicked.set(true);
+    private MessageCardView.ReviewActionProvider mMessageServiceActionHandler =
+            () -> mMessageServiceReviewCallbackRan.set(true);
     private MessageCardView.DismissActionProvider mMessageServiceDismissHandler =
-            (int messageType) -> {
-        mMessageServiceDismissCallbackRan.set(true);
-    };
+            (int messageType) -> mMessageServiceDismissCallbackRan.set(true);
 
     @Override
     public void setUpTest() throws Exception {
@@ -69,15 +64,16 @@
             mItemView = (ViewGroup) getActivity().getLayoutInflater().inflate(
                     R.layout.tab_grid_message_card_item, null);
             view.addView(mItemView);
+
+            mItemViewModel =
+                    new PropertyModel.Builder(MessageCardViewProperties.ALL_KEYS)
+                            .with(MessageCardViewProperties.ACTION_TEXT, ACTION_TEXT)
+                            .with(MessageCardViewProperties.DESCRIPTION_TEXT, DESCRIPTION_TEXT)
+                            .build();
+
+            mItemMCP = PropertyModelChangeProcessor.create(
+                    mItemViewModel, mItemView, MessageCardViewBinder::bind);
         });
-
-        mItemViewModel = new PropertyModel.Builder(MessageCardViewProperties.ALL_KEYS)
-                                 .with(MessageCardViewProperties.ACTION_TEXT, ACTION_TEXT)
-                                 .with(MessageCardViewProperties.DESCRIPTION_TEXT, DESCRIPTION_TEXT)
-                                 .build();
-
-        mItemMCP = PropertyModelChangeProcessor.create(
-                mItemViewModel, mItemView, MessageCardViewBinder::bind);
     }
 
     private String getDescriptionText() {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
index 6ead748..44ca2a4 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
@@ -105,9 +105,8 @@
 
     @Test
     @MediumTest
-    @SuppressWarnings("unchecked")
     @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP)
-    public void testGetPotentialActionsForView() throws InterruptedException {
+    public void testGetPotentialActionsForView() {
         // clang-format on
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         final AccessibilityActionChecker checker = new AccessibilityActionChecker(cta);
@@ -162,7 +161,6 @@
                 .check((v, noMatchingViewException) -> {
                     assertTrue(v instanceof RecyclerView);
                     RecyclerView recyclerView = (RecyclerView) v;
-                    List<Object> actionObjects;
 
                     View item1 = getItemViewForPosition(recyclerView, 0);
                     checker.verifyListOfAccessibilityAction(
@@ -197,7 +195,7 @@
 
     @Test
     @MediumTest
-    public void testGetPositionsOfReorderAction() throws InterruptedException {
+    public void testGetPositionsOfReorderAction() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         int leftActionId = R.id.move_tab_left;
         int rightActionId = R.id.move_tab_right;
@@ -219,21 +217,21 @@
 
                     View item1 = getItemViewForPosition(recyclerView, 0);
                     positions = helper.getPositionsOfReorderAction(item1, rightActionId);
-                    assertTrue(0 == positions.first);
-                    assertTrue(1 == positions.second);
+                    assertEquals(0, (int) positions.first);
+                    assertEquals(1, (int) positions.second);
 
                     positions = helper.getPositionsOfReorderAction(item1, downActionId);
-                    assertTrue(0 == positions.first);
-                    assertTrue(2 == positions.second);
+                    assertEquals(0, (int) positions.first);
+                    assertEquals(2, (int) positions.second);
 
                     View item4 = getItemViewForPosition(recyclerView, 3);
                     positions = helper.getPositionsOfReorderAction(item4, leftActionId);
-                    assertTrue(3 == positions.first);
-                    assertTrue(2 == positions.second);
+                    assertEquals(3, (int) positions.first);
+                    assertEquals(2, (int) positions.second);
 
                     positions = helper.getPositionsOfReorderAction(item4, upActionId);
-                    assertTrue(3 == positions.first);
-                    assertTrue(1 == positions.second);
+                    assertEquals(3, (int) positions.first);
+                    assertEquals(1, (int) positions.second);
                 });
 
         rotateDeviceToOrientation(cta, Configuration.ORIENTATION_LANDSCAPE);
@@ -246,25 +244,25 @@
 
                     View item2 = getItemViewForPosition(recyclerView, 1);
                     positions = helper.getPositionsOfReorderAction(item2, leftActionId);
-                    assertTrue(1 == positions.first);
-                    assertTrue(0 == positions.second);
+                    assertEquals(1, (int) positions.first);
+                    assertEquals(0, (int) positions.second);
 
                     positions = helper.getPositionsOfReorderAction(item2, rightActionId);
-                    assertTrue(1 == positions.first);
-                    assertTrue(2 == positions.second);
+                    assertEquals(1, (int) positions.first);
+                    assertEquals(2, (int) positions.second);
 
                     positions = helper.getPositionsOfReorderAction(item2, downActionId);
-                    assertTrue(1 == positions.first);
-                    assertTrue(4 == positions.second);
+                    assertEquals(1, (int) positions.first);
+                    assertEquals(4, (int) positions.second);
 
                     View item5 = getItemViewForPosition(recyclerView, 4);
                     positions = helper.getPositionsOfReorderAction(item5, leftActionId);
-                    assertTrue(4 == positions.first);
-                    assertTrue(3 == positions.second);
+                    assertEquals(4, (int) positions.first);
+                    assertEquals(3, (int) positions.second);
 
                     positions = helper.getPositionsOfReorderAction(item5, upActionId);
-                    assertTrue(4 == positions.first);
-                    assertTrue(1 == positions.second);
+                    assertEquals(4, (int) positions.first);
+                    assertEquals(1, (int) positions.second);
                 });
     }
 
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java
index c3eacdb..e32efa3 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java
@@ -45,7 +45,7 @@
     private View mBackgroundFrameView;
     private TextView mUngroupBarTextView;
     private RelativeLayout mTabGridDialogContainer;
-    private PopupWindow mPopoupWindow;
+    private PopupWindow mPopupWindow;
     private FrameLayout.LayoutParams mContainerParams;
     private TabGridDialogParent mTabGridDialogParent;
 
@@ -56,7 +56,7 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mDummyParent = new FrameLayout(getActivity());
             mTabGridDialogParent = new TabGridDialogParent(getActivity(), mDummyParent);
-            mPopoupWindow = mTabGridDialogParent.getPopupWindowForTesting();
+            mPopupWindow = mTabGridDialogParent.getPopupWindowForTesting();
             FrameLayout tabGridDialogParentView =
                     mTabGridDialogParent.getTabGridDialogParentViewForTesting();
 
@@ -88,7 +88,7 @@
 
         Assert.assertEquals(mTopMargin, mContainerParams.topMargin);
         Assert.assertEquals(mSideMargin, mContainerParams.leftMargin);
-        Assert.assertFalse(mPopoupWindow.isShowing());
+        Assert.assertFalse(mPopupWindow.isShowing());
 
         mockDialogStatus(false);
 
@@ -97,7 +97,7 @@
 
         Assert.assertEquals(mSideMargin, mContainerParams.topMargin);
         Assert.assertEquals(mTopMargin, mContainerParams.leftMargin);
-        Assert.assertFalse(mPopoupWindow.isShowing());
+        Assert.assertFalse(mPopupWindow.isShowing());
 
         mockDialogStatus(true);
 
@@ -106,7 +106,7 @@
 
         Assert.assertEquals(mTopMargin, mContainerParams.topMargin);
         Assert.assertEquals(mSideMargin, mContainerParams.leftMargin);
-        Assert.assertTrue(mPopoupWindow.isShowing());
+        Assert.assertTrue(mPopupWindow.isShowing());
 
         mockDialogStatus(true);
 
@@ -115,7 +115,7 @@
 
         Assert.assertEquals(mSideMargin, mContainerParams.topMargin);
         Assert.assertEquals(mTopMargin, mContainerParams.leftMargin);
-        Assert.assertTrue(mPopoupWindow.isShowing());
+        Assert.assertTrue(mPopupWindow.isShowing());
     }
 
     @Test
@@ -280,21 +280,21 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mTabGridDialogParent.showDialog();
             if (areAnimatorsEnabled()) {
-                Assert.assertTrue(mAnimationCardView.getAlpha() == 1f);
+                Assert.assertEquals(1f, mAnimationCardView.getAlpha(), 0.0);
                 // At the very beginning of showing animation, the animation card should be on the
                 // top and the background frame should be the view below it.
-                Assert.assertTrue(
-                        mAnimationCardView == parent.getChildAt(parent.getChildCount() - 1));
-                Assert.assertTrue(
-                        mBackgroundFrameView == parent.getChildAt(parent.getChildCount() - 2));
+                Assert.assertSame(
+                        mAnimationCardView, parent.getChildAt(parent.getChildCount() - 1));
+                Assert.assertSame(
+                        mBackgroundFrameView, parent.getChildAt(parent.getChildCount() - 2));
             }
             Assert.assertNotNull(mTabGridDialogParent.getCurrentDialogAnimatorForTesting());
-            Assert.assertTrue(mPopoupWindow.isShowing());
+            Assert.assertTrue(mPopupWindow.isShowing());
         });
         // When the card fades out, the dialog should be brought to the top.
         CriteriaHelper.pollUiThread(Criteria.equals(
                 mTabGridDialogContainer, () -> parent.getChildAt(parent.getChildCount() - 1)));
-        Assert.assertTrue(mAnimationCardView.getAlpha() == 0f);
+        Assert.assertEquals(0f, mAnimationCardView.getAlpha(), 0.0);
         CriteriaHelper.pollUiThread(
                 Criteria.checkThat(mTabGridDialogParent::getCurrentUngroupBarAnimatorForTesting,
                         Matchers.nullValue()));
@@ -303,14 +303,14 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mTabGridDialogParent.hideDialog();
             if (areAnimatorsEnabled()) {
-                Assert.assertTrue(mTabGridDialogContainer.getAlpha() == 1f);
+                Assert.assertEquals(1f, mTabGridDialogContainer.getAlpha(), 0.0);
                 // At the very beginning of hiding animation, the dialog view should be on the top.
-                Assert.assertTrue(
-                        mTabGridDialogContainer == parent.getChildAt(parent.getChildCount() - 1));
+                Assert.assertSame(
+                        mTabGridDialogContainer, parent.getChildAt(parent.getChildCount() - 1));
             }
             Assert.assertNotNull(mTabGridDialogParent.getCurrentDialogAnimatorForTesting());
             // PopupWindow is still showing for the hide animation.
-            Assert.assertTrue(mPopoupWindow.isShowing());
+            Assert.assertTrue(mPopupWindow.isShowing());
         });
         // When the dialog fades out, the animation card and the background frame should be brought
         // to the top.
@@ -318,12 +318,12 @@
                 ()
                         -> mAnimationCardView == parent.getChildAt(parent.getChildCount() - 1)
                         && mBackgroundFrameView == parent.getChildAt(parent.getChildCount() - 2));
-        Assert.assertTrue(mTabGridDialogContainer.getAlpha() == 0f);
+        Assert.assertEquals(0f, mTabGridDialogContainer.getAlpha(), 0.0);
         // When the animation completes, the PopupWindow should be dismissed.
         CriteriaHelper.pollUiThread(
                 Criteria.checkThat(mTabGridDialogParent::getCurrentUngroupBarAnimatorForTesting,
                         Matchers.nullValue()));
-        Assert.assertFalse(mPopoupWindow.isShowing());
+        Assert.assertFalse(mPopupWindow.isShowing());
     }
 
     @Test
@@ -341,20 +341,20 @@
             if (areAnimatorsEnabled()) {
                 // At the very beginning of hiding animation, alpha of background frame and
                 // animation card should both be set to 0f.
-                Assert.assertTrue(mBackgroundFrameView.getAlpha() == 0f);
-                Assert.assertTrue(mAnimationCardView.getAlpha() == 0f);
+                Assert.assertEquals(0f, mBackgroundFrameView.getAlpha(), 0.0);
+                Assert.assertEquals(0f, mAnimationCardView.getAlpha(), 0.0);
             }
             Assert.assertNotNull(mTabGridDialogParent.getCurrentDialogAnimatorForTesting());
-            Assert.assertTrue(mPopoupWindow.isShowing());
+            Assert.assertTrue(mPopupWindow.isShowing());
         });
         // When the animation completes, alpha of background frame and animation card should both
         // restore to 1f. Also, the PopupWindow should be dismissed.
         CriteriaHelper.pollUiThread(
                 Criteria.checkThat(mTabGridDialogParent::getCurrentUngroupBarAnimatorForTesting,
                         Matchers.nullValue()));
-        Assert.assertFalse(mPopoupWindow.isShowing());
-        Assert.assertTrue(mBackgroundFrameView.getAlpha() == 1f);
-        Assert.assertTrue(mAnimationCardView.getAlpha() == 1f);
+        Assert.assertFalse(mPopupWindow.isShowing());
+        Assert.assertEquals(1f, mBackgroundFrameView.getAlpha(), 0.0);
+        Assert.assertEquals(1f, mAnimationCardView.getAlpha(), 0.0);
     }
 
     @Test
@@ -375,17 +375,17 @@
             if (areAnimatorsEnabled()) {
                 // At the very beginning of showing animation, alpha of background frame and
                 // animation card should both be set to 0f.
-                Assert.assertTrue(mAnimationCardView.getAlpha() == 0f);
-                Assert.assertTrue(mBackgroundFrameView.getAlpha() == 0f);
+                Assert.assertEquals(0f, mAnimationCardView.getAlpha(), 0.0);
+                Assert.assertEquals(0f, mBackgroundFrameView.getAlpha(), 0.0);
             }
             Assert.assertNotNull(mTabGridDialogParent.getCurrentDialogAnimatorForTesting());
-            Assert.assertTrue(mPopoupWindow.isShowing());
+            Assert.assertTrue(mPopupWindow.isShowing());
         });
         CriteriaHelper.pollUiThread(
                 Criteria.checkThat(mTabGridDialogParent::getCurrentUngroupBarAnimatorForTesting,
                         Matchers.nullValue()));
-        Assert.assertTrue(mAnimationCardView.getAlpha() == 0f);
-        Assert.assertTrue(mBackgroundFrameView.getAlpha() == 0f);
+        Assert.assertEquals(0f, mAnimationCardView.getAlpha(), 0.0);
+        Assert.assertEquals(0f, mBackgroundFrameView.getAlpha(), 0.0);
 
         // Restore alpha of animation-related views.
         TestThreadUtils.runOnUiThreadBlocking(() -> {
@@ -399,30 +399,30 @@
             if (areAnimatorsEnabled()) {
                 // At the very beginning of hiding animation, alpha of background frame and
                 // animation card should both be set to 0f.
-                Assert.assertTrue(mAnimationCardView.getAlpha() == 0f);
-                Assert.assertTrue(mBackgroundFrameView.getAlpha() == 0f);
+                Assert.assertEquals(0f, mAnimationCardView.getAlpha(), 0.0);
+                Assert.assertEquals(0f, mBackgroundFrameView.getAlpha(), 0.0);
             }
             Assert.assertNotNull(mTabGridDialogParent.getCurrentDialogAnimatorForTesting());
-            Assert.assertTrue(mPopoupWindow.isShowing());
+            Assert.assertTrue(mPopupWindow.isShowing());
         });
         // When the animation completes, alpha of background frame and animation card should both
         // restore to 1f. Also, the PopupWindow should be dismissed.
         CriteriaHelper.pollUiThread(
                 Criteria.checkThat(mTabGridDialogParent::getCurrentUngroupBarAnimatorForTesting,
                         Matchers.nullValue()));
-        Assert.assertFalse(mPopoupWindow.isShowing());
-        Assert.assertTrue(mAnimationCardView.getAlpha() == 1f);
-        Assert.assertTrue(mBackgroundFrameView.getAlpha() == 1f);
+        Assert.assertFalse(mPopupWindow.isShowing());
+        Assert.assertEquals(1f, mAnimationCardView.getAlpha(), 0.0);
+        Assert.assertEquals(1f, mBackgroundFrameView.getAlpha(), 0.0);
     }
 
     private void mockDialogStatus(boolean isShowing) {
         mContainerParams.setMargins(0, 0, 0, 0);
         if (isShowing) {
-            mPopoupWindow.showAtLocation(mDummyParent, Gravity.CENTER, 0, 0);
-            Assert.assertTrue(mPopoupWindow.isShowing());
+            mPopupWindow.showAtLocation(mDummyParent, Gravity.CENTER, 0, 0);
+            Assert.assertTrue(mPopupWindow.isShowing());
         } else {
-            mPopoupWindow.dismiss();
-            Assert.assertFalse(mPopoupWindow.isShowing());
+            mPopupWindow.dismiss();
+            Assert.assertFalse(mPopupWindow.isShowing());
         }
     }
 
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
index c4be3cac..b69ef5b 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -131,7 +131,7 @@
 
     @Test
     @MediumTest
-    public void testBackPressCloseDialog() throws InterruptedException {
+    public void testBackPressCloseDialog() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
@@ -163,7 +163,7 @@
 
     @Test
     @MediumTest
-    public void testDisableTabGroupsContinuation() throws InterruptedException {
+    public void testDisableTabGroupsContinuation() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
@@ -183,7 +183,7 @@
     @Test
     @MediumTest
     @Features.EnableFeatures(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
-    public void testEnableTabGroupsContinuation() throws InterruptedException {
+    public void testEnableTabGroupsContinuation() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
@@ -202,7 +202,7 @@
 
     @Test
     @MediumTest
-    public void testTabGridDialogAnimation() throws InterruptedException {
+    public void testTabGridDialogAnimation() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
@@ -219,7 +219,7 @@
         ViewGroup.MarginLayoutParams params =
                 (ViewGroup.MarginLayoutParams) recyclerView.getLayoutParams();
         params.topMargin += deltaTopMargin;
-        TestThreadUtils.runOnUiThreadBlocking(() -> { recyclerView.setLayoutParams(params); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> recyclerView.setLayoutParams(params));
         CriteriaHelper.pollUiThread(() -> !recyclerView.isComputingLayout());
 
         // Calculate expected values of animation source rect.
@@ -240,9 +240,9 @@
                 layout.getStartSurfaceForTesting().getTabDialogDelegate();
         delegation.setSourceRectCallbackForTesting((result -> {
             mHasReceivedSourceRect = true;
-            assertTrue(expectedTop == result.top);
-            assertTrue(expectedHeight == result.height());
-            assertTrue(expectedWidth == result.width());
+            assertEquals(expectedTop, result.top, 0.0);
+            assertEquals(expectedHeight, result.height(), 0.0);
+            assertEquals(expectedWidth, result.width(), 0.0);
         }));
 
         TabUiTestHelper.clickFirstCardFromTabSwitcher(cta);
@@ -252,7 +252,7 @@
 
     @Test
     @MediumTest
-    public void testUndoClosureInDialog_GTS() throws InterruptedException {
+    public void testUndoClosureInDialog_GTS() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
@@ -284,7 +284,7 @@
 
     @Test
     @MediumTest
-    public void testUndoClosureInDialog_TabStrip() throws InterruptedException {
+    public void testUndoClosureInDialog_TabStrip() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
@@ -319,7 +319,7 @@
     @Test
     @MediumTest
     @Features.EnableFeatures(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
-    public void testDialogToolbarMenuShareGroup() throws InterruptedException {
+    public void testDialogToolbarMenuShareGroup() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
@@ -342,7 +342,7 @@
     @Test
     @MediumTest
     @Features.EnableFeatures(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
-    public void testSelectionEditorShowHide() throws InterruptedException {
+    public void testSelectionEditorShowHide() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
@@ -380,7 +380,7 @@
     @Test
     @MediumTest
     @Features.EnableFeatures(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
-    public void testSelectionEditorUngroup() throws InterruptedException {
+    public void testSelectionEditorUngroup() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         assertTrue(cta.getTabModelSelector().getTabModelFilterProvider().getCurrentTabModelFilter()
                            instanceof TabGroupModelFilter);
@@ -435,7 +435,7 @@
 
     @Test
     @MediumTest
-    public void testSwipeToDismiss_Dialog() throws InterruptedException {
+    public void testSwipeToDismiss_Dialog() {
         ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         // Create 2 tabs and merge them into one group.
         createTabs(cta, false, 2);
@@ -461,7 +461,7 @@
     @Test
     @MediumTest
     @Features.EnableFeatures(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
-    public void testSelectionEditorPosition() throws InterruptedException {
+    public void testSelectionEditorPosition() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         View parentView = cta.getCompositorViewHolder();
         createTabs(cta, false, 3);
@@ -495,7 +495,7 @@
     @Test
     @MediumTest
     @Features.EnableFeatures(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
-    public void testTabGroupNaming() throws InterruptedException {
+    public void testTabGroupNaming() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 2);
         enterTabSwitcher(cta);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
index f791d45..3c77338 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
@@ -100,7 +100,7 @@
 
     @Test
     @MediumTest
-    public void testShowAndHideIphDialog() throws InterruptedException {
+    public void testShowAndHideIphDialog() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
 
         enterTabSwitcher(cta);
@@ -191,7 +191,7 @@
 
     @Test
     @MediumTest
-    public void testIphItemChangeWithLastTab() throws Exception {
+    public void testIphItemChangeWithLastTab() {
         ChromeTabbedActivity cta = mActivityTestRule.getActivity();
 
         enterTabSwitcher(cta);
@@ -225,7 +225,7 @@
 
     @Test
     @MediumTest
-    public void testSwipeToDismiss_IPH() throws InterruptedException {
+    public void testSwipeToDismiss_IPH() {
         ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         enterTabSwitcher(cta);
         onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed()));
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
index ab69bbf..985424e 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
@@ -90,7 +90,7 @@
 
     @Test
     @MediumTest
-    public void testOnAnchorViewChanged_HOME_SEARCH_TAB_SWITCHER() throws InterruptedException {
+    public void testOnAnchorViewChanged_HOME_SEARCH_TAB_SWITCHER() {
         launchActivity(Variations.HOME_SEARCH_TAB_SWITCHER);
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         // Tab strip should show automatically when entering tab group.
@@ -111,7 +111,7 @@
 
     @Test
     @MediumTest
-    public void testOnAnchorViewChanged_HOME_SEARCH_SHARE() throws InterruptedException {
+    public void testOnAnchorViewChanged_HOME_SEARCH_SHARE() {
         launchActivity(Variations.HOME_SEARCH_SHARE);
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         // Tab strip should show automatically when entering tab group.
@@ -132,7 +132,7 @@
 
     @Test
     @MediumTest
-    public void testOnAnchorViewChanged_NEW_TAB_SEARCH_SHARE() throws InterruptedException {
+    public void testOnAnchorViewChanged_NEW_TAB_SEARCH_SHARE() {
         launchActivity(Variations.NEW_TAB_SEARCH_SHARE);
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         // Tab strip should show automatically when entering tab group.
@@ -153,7 +153,7 @@
 
     @Test
     @MediumTest
-    public void testTabStripShowHide() throws InterruptedException {
+    public void testTabStripShowHide() {
         launchActivity();
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         // Try to trigger tab strip in a single tab page.
@@ -186,7 +186,7 @@
 
     @Test
     @MediumTest
-    public void testTabStripUpdate() throws InterruptedException {
+    public void testTabStripUpdate() {
         launchActivity();
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
 
@@ -223,7 +223,7 @@
     @Test
     @MediumTest
     @CommandLineFlags.Add({ChromeSwitches.DISABLE_MINIMUM_SHOW_DURATION})
-    public void testTabStripChangeWithScrolling() throws InterruptedException {
+    public void testTabStripChangeWithScrolling() {
         launchActivity();
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         FullscreenManagerTestUtils.disableBrowserOverrides();
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
index 9cbc0a1..d87ca09 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
@@ -81,7 +81,7 @@
     @Test
     @MediumTest
     @Feature({"RenderTest"})
-    public void testRenderStrip_Select5thTabIn10Tabs() throws InterruptedException, IOException {
+    public void testRenderStrip_Select5thTabIn10Tabs() throws IOException {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 10);
         enterTabSwitcher(cta);
@@ -94,15 +94,14 @@
         clickNthTabInDialog(cta, 4);
 
         ViewGroup bottomToolbar = cta.findViewById(R.id.bottom_controls);
-        RecyclerView stripRecyclerView =
-                (RecyclerView) bottomToolbar.findViewById(R.id.tab_list_view);
+        RecyclerView stripRecyclerView = bottomToolbar.findViewById(R.id.tab_list_view);
         mRenderTestRule.render(stripRecyclerView, "5th_tab_selected");
     }
 
     @Test
     @MediumTest
     @Feature({"RenderTest"})
-    public void testRenderStrip_Select10thTabIn10Tabs() throws InterruptedException, IOException {
+    public void testRenderStrip_Select10thTabIn10Tabs() throws IOException {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 10);
         enterTabSwitcher(cta);
@@ -115,15 +114,14 @@
         clickNthTabInDialog(cta, 9);
 
         ViewGroup bottomToolbar = cta.findViewById(R.id.bottom_controls);
-        RecyclerView stripRecyclerView =
-                (RecyclerView) bottomToolbar.findViewById(R.id.tab_list_view);
+        RecyclerView stripRecyclerView = bottomToolbar.findViewById(R.id.tab_list_view);
         mRenderTestRule.render(stripRecyclerView, "10th_tab_selected");
     }
 
     @Test
     @MediumTest
     @Feature({"RenderTest"})
-    public void testRenderStrip_AddTab() throws InterruptedException, IOException {
+    public void testRenderStrip_AddTab() throws IOException {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 10);
         enterTabSwitcher(cta);
@@ -135,8 +133,7 @@
         clickFirstCardFromTabSwitcher(cta);
         clickNthTabInDialog(cta, 0);
         ViewGroup bottomToolbar = cta.findViewById(R.id.bottom_controls);
-        RecyclerView stripRecyclerView =
-                (RecyclerView) bottomToolbar.findViewById(R.id.tab_list_view);
+        RecyclerView stripRecyclerView = bottomToolbar.findViewById(R.id.tab_list_view);
         stripRecyclerView.setItemAnimator(null);
         onView(allOf(withId(R.id.toolbar_right_button), withParent(withId(R.id.main_content))))
                 .perform(click());
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
index 0e567bc..0d98141 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
@@ -65,11 +65,8 @@
     private ViewGroup mSelectableTabGridView;
     private PropertyModel mSelectableModel;
     private PropertyModelChangeProcessor mSelectableMCP;
-    private SelectionDelegate<Integer> mSelectionDelegate;
-    private int mSelectedTabBackgroundDrawableId = R.drawable.selected_tab_background;
 
     private ViewGroup mSelectableTabListView;
-    private PropertyModelChangeProcessor mSelectableListMCP;
 
     private TabListMediator.ThumbnailFetcher mMockThumbnailProvider =
             new TabListMediator.ThumbnailFetcher(new TabListMediator.ThumbnailProvider() {
@@ -144,8 +141,9 @@
             view.addView(mSelectableTabListView);
         });
 
-        mSelectionDelegate = new SelectionDelegate<>();
+        SelectionDelegate<Integer> mSelectionDelegate = new SelectionDelegate<>();
 
+        int mSelectedTabBackgroundDrawableId = R.drawable.selected_tab_background;
         mGridModel = new PropertyModel.Builder(TabProperties.ALL_KEYS_TAB_GRID)
                              .with(TabProperties.TAB_ID, TAB1_ID)
                              .with(TabProperties.TAB_SELECTED_LISTENER, mMockSelectedListener)
@@ -172,23 +170,23 @@
                     mStripModel, mTabStripView, TabStripViewBinder::bind);
             mSelectableMCP = PropertyModelChangeProcessor.create(
                     mSelectableModel, mSelectableTabGridView, TabGridViewBinder::bindSelectableTab);
-            mSelectableListMCP = PropertyModelChangeProcessor.create(mSelectableModel,
-                    mSelectableTabListView, TabListViewBinder::bindSelectableListTab);
+            PropertyModelChangeProcessor.create(mSelectableModel, mSelectableTabListView,
+                    TabListViewBinder::bindSelectableListTab);
         });
     }
 
     private void testGridSelected(ViewGroup holder, PropertyModel model) {
         if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
             model.set(TabProperties.IS_SELECTED, true);
-            Assert.assertTrue(holder.getForeground() != null);
+            Assert.assertNotNull(holder.getForeground());
             model.set(TabProperties.IS_SELECTED, false);
-            Assert.assertFalse(holder.getForeground() != null);
+            Assert.assertNull(holder.getForeground());
         } else {
             model.set(TabProperties.IS_SELECTED, true);
             View selectedView = holder.findViewById(R.id.selected_view_below_lollipop);
-            Assert.assertTrue(selectedView.getVisibility() == View.VISIBLE);
+            Assert.assertEquals(View.VISIBLE, selectedView.getVisibility());
             model.set(TabProperties.IS_SELECTED, false);
-            Assert.assertTrue(selectedView.getVisibility() == View.GONE);
+            Assert.assertEquals(View.GONE, selectedView.getVisibility());
         }
     }
 
@@ -219,30 +217,30 @@
         testGridSelected(mTabGridView, mGridModel);
 
         mStripModel.set(TabProperties.IS_SELECTED, true);
-        Assert.assertTrue(((FrameLayout) mTabStripView).getForeground() != null);
+        Assert.assertNotNull(((FrameLayout) mTabStripView).getForeground());
         mStripModel.set(TabProperties.IS_SELECTED, false);
-        Assert.assertFalse(((FrameLayout) mTabStripView).getForeground() != null);
+        Assert.assertNull(((FrameLayout) mTabStripView).getForeground());
 
         testGridSelected(mSelectableTabGridView, mSelectableModel);
         mSelectableModel.set(TabProperties.IS_SELECTED, true);
         ImageView actionButton = mSelectableTabGridView.findViewById(R.id.action_button);
-        Assert.assertTrue(actionButton.getBackground().getLevel() == 1);
-        Assert.assertTrue(actionButton.getDrawable() != null);
+        Assert.assertEquals(1, actionButton.getBackground().getLevel());
+        Assert.assertNotNull(actionButton.getDrawable());
         Assert.assertEquals(255, actionButton.getDrawable().getAlpha());
 
         mSelectableModel.set(TabProperties.IS_SELECTED, false);
-        Assert.assertTrue(actionButton.getBackground().getLevel() == 0);
+        Assert.assertEquals(0, actionButton.getBackground().getLevel());
         Assert.assertEquals(0, actionButton.getDrawable().getAlpha());
 
         testGridSelected(mSelectableTabListView, mSelectableModel);
         mSelectableModel.set(TabProperties.IS_SELECTED, true);
         ImageView actionButtonList = mSelectableTabListView.findViewById(R.id.action_button);
-        Assert.assertTrue(actionButtonList.getBackground().getLevel() == 1);
-        Assert.assertTrue(actionButtonList.getDrawable() != null);
+        Assert.assertEquals(1, actionButtonList.getBackground().getLevel());
+        Assert.assertNotNull(actionButtonList.getDrawable());
         Assert.assertEquals(255, actionButton.getDrawable().getAlpha());
 
         mSelectableModel.set(TabProperties.IS_SELECTED, false);
-        Assert.assertTrue(actionButtonList.getBackground().getLevel() == 0);
+        Assert.assertEquals(0, actionButtonList.getBackground().getLevel());
         Assert.assertEquals(0, actionButtonList.getDrawable().getAlpha());
     }
 
@@ -259,10 +257,10 @@
         CriteriaHelper.pollUiThread(
                 () -> !((ClosableTabGridView) mTabGridView).getIsAnimatingForTesting());
 
-        Assert.assertTrue(backgroundView.getVisibility() == View.GONE);
+        Assert.assertEquals(View.GONE, backgroundView.getVisibility());
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
             View selectedView = mTabGridView.findViewById(R.id.selected_view_below_lollipop);
-            Assert.assertTrue(selectedView.getVisibility() == View.VISIBLE);
+            Assert.assertEquals(View.VISIBLE, selectedView.getVisibility());
         } else {
             Drawable selectedDrawable = mTabGridView.getForeground();
             Assert.assertNotNull(selectedDrawable);
@@ -275,11 +273,11 @@
         });
         CriteriaHelper.pollUiThread(
                 () -> !((ClosableTabGridView) mTabGridView).getIsAnimatingForTesting());
-        Assert.assertTrue(backgroundView.getVisibility() == View.GONE);
+        Assert.assertEquals(View.GONE, backgroundView.getVisibility());
 
         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
             View selectedView = mTabGridView.findViewById(R.id.selected_view_below_lollipop);
-            Assert.assertTrue(selectedView.getVisibility() == View.GONE);
+            Assert.assertEquals(View.GONE, selectedView.getVisibility());
         } else {
             Drawable selectedDrawable = mTabGridView.getForeground();
             Assert.assertNull(selectedDrawable);
@@ -318,6 +316,7 @@
         Assert.assertEquals(2, mThumbnailFetchedCount.get());
     }
 
+    @SuppressWarnings("UnusedAssignment") // Intentionally set to null for garbage collection.
     @Test
     @MediumTest
     @UiThreadTest
@@ -338,6 +337,7 @@
         Assert.assertEquals(2, mThumbnailFetchedCount.get());
     }
 
+    @SuppressWarnings("UnusedAssignment") // Intentionally set to null for garbage collection.
     @Test
     @MediumTest
     @UiThreadTest
@@ -357,6 +357,7 @@
         Assert.assertEquals(2, mThumbnailFetchedCount.get());
     }
 
+    @SuppressWarnings("UnusedAssignment") // Intentionally set to null for garbage collection.
     @Test
     @MediumTest
     @UiThreadTest
@@ -375,6 +376,7 @@
         Assert.assertTrue(canBeGarbageCollected(ref));
     }
 
+    @SuppressWarnings("UnusedAssignment") // Intentionally set to null for garbage collection.
     @Test
     @MediumTest
     @UiThreadTest
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinderTest.java
index b9385eb..b23a0af 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinderTest.java
@@ -40,6 +40,7 @@
 /**
  * Tests for {@link TabSelectionEditorLayoutBinder}.
  */
+@SuppressWarnings("ArraysAsListWithZeroOrOneArgument")
 @RunWith(ChromeJUnit4ClassRunner.class)
 public class TabSelectionEditorLayoutBinderTest extends DummyUiActivityTestCase {
     private TabSelectionEditorLayout mEditorLayoutView;
@@ -60,6 +61,7 @@
                     (TabSelectionEditorLayout) getActivity().getLayoutInflater().inflate(
                             R.layout.tab_selection_editor_layout, null);
             mEditorLayoutView.initialize(mParentView, null, new RecyclerView.Adapter() {
+                @SuppressWarnings("ConstantConditions")
                 @NonNull
                 @Override
                 public RecyclerView.ViewHolder onCreateViewHolder(
@@ -75,9 +77,10 @@
                     return 0;
                 }
             }, mSelectionDelegate);
+
+            mMCP = PropertyModelChangeProcessor.create(
+                    mModel, mEditorLayoutView, TabSelectionEditorLayoutBinder::bind);
         });
-        mMCP = PropertyModelChangeProcessor.create(
-                mModel, mEditorLayoutView, TabSelectionEditorLayoutBinder::bind);
     }
 
     @Override
@@ -104,7 +107,7 @@
     public void testBindActionButtonClickListener() {
         AtomicBoolean actionButtonClicked = new AtomicBoolean(false);
         mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_LISTENER,
-                v -> { actionButtonClicked.set(true); });
+                v -> actionButtonClicked.set(true));
         mEditorLayoutView.findViewById(R.id.action_button).performClick();
         assertTrue(actionButtonClicked.get());
     }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
index 09428175..299c124 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
@@ -103,7 +103,7 @@
     public void testShowTabs() {
         List<Tab> tabs = getTabsInCurrentTabModel();
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mTabSelectionEditorController.show(tabs); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mTabSelectionEditorController.show(tabs));
 
         mRobot.resultRobot.verifyTabSelectionEditorIsVisible()
                 .verifyToolbarActionButtonDisabled()
@@ -119,7 +119,7 @@
     public void testToggleItem() {
         List<Tab> tabs = getTabsInCurrentTabModel();
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mTabSelectionEditorController.show(tabs); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mTabSelectionEditorController.show(tabs));
 
         mRobot.resultRobot.verifyItemNotSelectedAtAdapterPosition(0);
 
@@ -138,7 +138,7 @@
     public void testToolbarNavigationButtonHideTabSelectionEditor() {
         List<Tab> tabs = getTabsInCurrentTabModel();
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mTabSelectionEditorController.show(tabs); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mTabSelectionEditorController.show(tabs));
 
         mRobot.resultRobot.verifyTabSelectionEditorIsVisible();
 
@@ -151,7 +151,7 @@
     public void testToolbarGroupButtonEnabledState() {
         List<Tab> tabs = getTabsInCurrentTabModel();
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mTabSelectionEditorController.show(tabs); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mTabSelectionEditorController.show(tabs));
 
         mRobot.resultRobot.verifyToolbarActionButtonDisabled()
                 .verifyToolbarActionButtonWithResourceId(R.string.tab_selection_editor_group);
@@ -171,7 +171,7 @@
     public void testToolbarGroupButton() {
         List<Tab> tabs = getTabsInCurrentTabModel();
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mTabSelectionEditorController.show(tabs); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mTabSelectionEditorController.show(tabs));
 
         mRobot.resultRobot.verifyToolbarActionButtonWithResourceId(
                 R.string.tab_selection_editor_group);
@@ -216,7 +216,7 @@
         List<Tab> tabs = getTabsInCurrentTabModel();
         int preSelectedTabCount = 1;
         TestThreadUtils.runOnUiThreadBlocking(
-                () -> { mTabSelectionEditorController.show(tabs, preSelectedTabCount); });
+                () -> mTabSelectionEditorController.show(tabs, preSelectedTabCount));
 
         mRobot.resultRobot.verifyTabSelectionEditorIsVisible()
                 .verifyToolbarActionButtonDisabled()
@@ -243,7 +243,7 @@
         List<Tab> tabs = getTabsInCurrentTabModel();
 
         TestThreadUtils.runOnUiThreadBlocking(
-                () -> { mTabSelectionEditorController.show(tabs, preSelectedTabCount); });
+                () -> mTabSelectionEditorController.show(tabs, preSelectedTabCount));
 
         mRobot.resultRobot.verifyToolbarSelectionText("10 selected")
                 .verifyHasItemViewTypeAtAdapterPosition(
@@ -257,7 +257,7 @@
         List<Tab> tabs = getTabsInCurrentTabModel();
         int preSelectedTabCount = 1;
         TestThreadUtils.runOnUiThreadBlocking(
-                () -> { mTabSelectionEditorController.show(tabs, preSelectedTabCount); });
+                () -> mTabSelectionEditorController.show(tabs, preSelectedTabCount));
 
         mRobot.resultRobot.verifyDividerNotClickableNotFocusable();
     }
@@ -270,7 +270,7 @@
     public void testListViewAppearance() throws IOException {
         List<Tab> tabs = getTabsInCurrentTabModel();
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mTabSelectionEditorController.show(tabs); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mTabSelectionEditorController.show(tabs));
 
         mRenderTestRule.render(mTabSelectionEditorLayout, "list_view");
     }
@@ -283,7 +283,7 @@
     public void testListViewAppearance_oneSelectedTab() throws IOException {
         List<Tab> tabs = getTabsInCurrentTabModel();
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> { mTabSelectionEditorController.show(tabs); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> mTabSelectionEditorController.show(tabs));
 
         mRobot.actionRobot.clickItemAtAdapterPosition(0);
 
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTestingRobot.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTestingRobot.java
index 909085f..ecb7cc2 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTestingRobot.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTestingRobot.java
@@ -135,14 +135,14 @@
     public final TabSelectionEditorTestingRobot.Action actionRobot;
 
     public TabSelectionEditorTestingRobot() {
-        resultRobot = new TabSelectionEditorTestingRobot.Result();
-        actionRobot = new TabSelectionEditorTestingRobot.Action();
+        resultRobot = new Result();
+        actionRobot = new Action();
     }
 
     /**
      * This Robot is used to perform action within the TabSelectionEditor.
      */
-    public class Action {
+    public static class Action {
         public TabSelectionEditorTestingRobot.Action clickItemAtAdapterPosition(int position) {
             onView(withId(org.chromium.chrome.tab_ui.R.id.tab_list_view))
                     .inRoot(isTabSelectionEditorPopup())
@@ -170,7 +170,7 @@
     /**
      * This Robot is used to verify result within the TabSelectionEditor.
      */
-    public class Result {
+    public static class Result {
         public TabSelectionEditorTestingRobot.Result verifyTabSelectionEditorIsVisible() {
             onView(withId(org.chromium.chrome.tab_ui.R.id.selectable_list))
                     .inRoot(isTabSelectionEditorPopup())
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
index 5634eb0ba..0aa976c 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.tasks.tab_management;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -79,7 +78,7 @@
     @MediumTest
     @TargetApi(Build.VERSION_CODES.N)
     @DisableIf.Build(message = "crbug.com/1017141", sdk_is_less_than = Build.VERSION_CODES.P)
-    public void testMoveTabsAcrossWindow_GTS_WithoutGroup() throws InterruptedException {
+    public void testMoveTabsAcrossWindow_GTS_WithoutGroup() {
         final ChromeTabbedActivity cta1 = mActivityTestRule.getActivity();
         // Initially, we have 4 normal tabs and 3 incognito tabs in cta1.
         initializeTabModel(cta1, false, 4);
@@ -136,7 +135,7 @@
             ViewGroup toggleButtons = (ViewGroup) toggleTabLayout.getChildAt(0);
             toggleButtons.getChildAt(0).performClick();
         });
-        assertEquals(false, cta1.getTabModelSelector().getCurrentModel().isIncognito());
+        assertFalse(cta1.getTabModelSelector().getCurrentModel().isIncognito());
 
         // Move 3 normal tabs to cta2.
         clickFirstCardFromTabSwitcher(cta1);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediatorUnitTest.java
index 89ddb88..70d518d 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediatorUnitTest.java
@@ -7,6 +7,7 @@
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
@@ -104,8 +105,8 @@
                 .set(eq(INCOGNITO_LEARN_MORE_CLICK_LISTENER),
                         mLearnMoreOnClickListenerCaptor.capture());
         assertEquals(mLearnMoreOnClickListener, mLearnMoreOnClickListenerCaptor.getValue());
-        assertEquals(mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), false);
-        assertEquals(mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED), false);
+        assertFalse(mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE));
+        assertFalse(mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED));
     }
 
     @Test
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
index 05cbb7f..f1021b5 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
@@ -35,6 +35,7 @@
 /**
  * Unit tests for {@link PseudoTab}.
  */
+@SuppressWarnings({"ResultOfMethodCallIgnored", "deprecation"})
 @RunWith(BaseRobolectricTestRunner.class)
 public class PseudoTabUnitTest {
     @Rule
@@ -132,8 +133,7 @@
 
     @Test
     public void getListOfPseudoTab_listOfTab_null() {
-        List<Tab> tabs = null;
-        List<PseudoTab> list = PseudoTab.getListOfPseudoTab(tabs);
+        List<PseudoTab> list = PseudoTab.getListOfPseudoTab((List<Tab>) null);
         Assert.assertNull(list);
     }
 
@@ -153,8 +153,7 @@
 
     @Test
     public void getListOfPseudoTab_TabList_null() {
-        TabList tabs = null;
-        List<PseudoTab> list = PseudoTab.getListOfPseudoTab(tabs);
+        List<PseudoTab> list = PseudoTab.getListOfPseudoTab((TabList) null);
         Assert.assertNull(list);
     }
 
@@ -178,10 +177,8 @@
 
     @Test
     public void getTitle_nullProvider() {
-        PseudoTab.TitleProvider provider = null;
-
         PseudoTab tab = PseudoTab.fromTabId(TAB1_ID);
-        Assert.assertEquals(tab.getTitle(), tab.getTitle(provider));
+        Assert.assertEquals(tab.getTitle(), tab.getTitle(null));
     }
 
     @Test
@@ -339,7 +336,7 @@
         TabAttributeCache.setRootIdForTesting(TAB1_ID, TAB1_ID);
         TabAttributeCache.setRootIdForTesting(TAB2_ID, TAB1_ID);
         PseudoTab tab1 = PseudoTab.fromTabId(TAB1_ID);
-        PseudoTab tab2 = PseudoTab.fromTabId(TAB2_ID);
+        PseudoTab.fromTabId(TAB2_ID);
 
         List<PseudoTab> related = PseudoTab.getRelatedTabs(tab1, mTabModelFilterProvider);
         Assert.assertEquals(2, related.size());
@@ -356,8 +353,8 @@
         TabAttributeCache.setRootIdForTesting(TAB2_ID, Tab.INVALID_TAB_ID);
         TabAttributeCache.setRootIdForTesting(TAB3_ID, TAB3_ID);
         PseudoTab tab1 = PseudoTab.fromTabId(TAB1_ID);
-        PseudoTab tab2 = PseudoTab.fromTabId(TAB2_ID);
-        PseudoTab tab3 = PseudoTab.fromTabId(TAB3_ID);
+        PseudoTab.fromTabId(TAB2_ID);
+        PseudoTab.fromTabId(TAB3_ID);
 
         List<PseudoTab> related = PseudoTab.getRelatedTabs(tab1, mTabModelFilterProvider);
         Assert.assertEquals(1, related.size());
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java
index 165c065d..07f5836 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java
@@ -51,6 +51,7 @@
 /**
  * Unit tests for {@link TabAttributeCache}.
  */
+@SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabAttributeCacheUnitTest {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java
index ab9a733..60865a1 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java
@@ -30,8 +30,6 @@
 import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.metrics.RecordHistogram;
@@ -51,6 +49,7 @@
 /**
  * Tests for {@link TabGroupModelFilter}.
  */
+@SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabGroupModelFilterUnitTest {
@@ -104,13 +103,10 @@
     private TabImpl prepareTab(int tabId, int rootId, int parentTabId) {
         TabImpl tab = mock(TabImpl.class);
 
-        doAnswer(new Answer() {
-            @Override
-            public Object answer(InvocationOnMock invocation) {
-                int newRootId = invocation.getArgument(0);
-                doReturn(newRootId).when(tab).getRootId();
-                return null;
-            }
+        doAnswer(invocation -> {
+            int newRootId = invocation.getArgument(0);
+            doReturn(newRootId).when(tab).getRootId();
+            return null;
         })
                 .when(tab)
                 .setRootId(anyInt());
@@ -132,66 +128,47 @@
     }
 
     private void setUpTabModel() {
-        doAnswer(new Answer() {
-            @Override
-            public Object answer(InvocationOnMock invocation) {
-                Tab tab = invocation.getArgument(0);
-                int index = invocation.getArgument(1);
-                index = index == -1 ? mTabs.size() : index;
-                mTabs.add(index, tab);
-                return null;
-            }
+        doAnswer(invocation -> {
+            Tab tab = invocation.getArgument(0);
+            int index = invocation.getArgument(1);
+            index = index == -1 ? mTabs.size() : index;
+            mTabs.add(index, tab);
+            return null;
         })
                 .when(mTabModel)
                 .addTab(any(Tab.class), anyInt(), anyInt(), anyInt());
 
-        doAnswer(new Answer() {
-            @Override
-            public Object answer(InvocationOnMock invocation) {
-                int movedTabId = invocation.getArgument(0);
-                int newIndex = invocation.getArgument(1);
+        doAnswer(invocation -> {
+            int movedTabId = invocation.getArgument(0);
+            int newIndex = invocation.getArgument(1);
 
-                int oldIndex = TabModelUtils.getTabIndexById(mTabModel, movedTabId);
-                Tab tab = TabModelUtils.getTabById(mTabModel, movedTabId);
+            int oldIndex = TabModelUtils.getTabIndexById(mTabModel, movedTabId);
+            Tab tab = TabModelUtils.getTabById(mTabModel, movedTabId);
 
-                mTabs.remove(tab);
-                if (oldIndex < newIndex) --newIndex;
-                mTabs.add(newIndex, tab);
-                mTabModelObserverCaptor.getValue().didMoveTab(tab, newIndex, oldIndex);
-                return null;
-            }
+            mTabs.remove(tab);
+            if (oldIndex < newIndex) --newIndex;
+            mTabs.add(newIndex, tab);
+            mTabModelObserverCaptor.getValue().didMoveTab(tab, newIndex, oldIndex);
+            return null;
         })
                 .when(mTabModel)
                 .moveTab(anyInt(), anyInt());
 
-        doAnswer(new Answer() {
-            @Override
-            public Tab answer(InvocationOnMock invocation) {
-                int index = invocation.getArgument(0);
-                return mTabs.get(index);
-            }
+        doAnswer(invocation -> {
+            int index = invocation.getArgument(0);
+            return mTabs.get(index);
         })
                 .when(mTabModel)
                 .getTabAt(anyInt());
 
-        doAnswer(new Answer() {
-            @Override
-            public Integer answer(InvocationOnMock invocation) {
-                Tab tab = invocation.getArgument(0);
-                return mTabs.indexOf(tab);
-            }
+        doAnswer(invocation -> {
+            Tab tab = invocation.getArgument(0);
+            return mTabs.indexOf(tab);
         })
                 .when(mTabModel)
                 .indexOf(any(Tab.class));
 
-        doAnswer(new Answer() {
-            @Override
-            public Integer answer(InvocationOnMock invocation) {
-                return mTabs.size();
-            }
-        })
-                .when(mTabModel)
-                .getCount();
+        doAnswer(invocation -> mTabs.size()).when(mTabModel).getCount();
 
         doReturn(0).when(mTabModel).index();
         doNothing().when(mTabModel).addObserver(mTabModelObserverCaptor.capture());
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtilsUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtilsUnitTest.java
index eb83cfc..19676aa0 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtilsUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtilsUnitTest.java
@@ -43,6 +43,7 @@
 /**
  * Tests for {@link TabGroupUtils}.
  */
+@SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabGroupUtilsUnitTest {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediatorUnitTest.java
index 598fd81..9861d6d 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediatorUnitTest.java
@@ -26,7 +26,7 @@
  */
 @RunWith(LocalRobolectricTestRunner.class)
 public class MessageCardProviderMediatorUnitTest {
-    static final int SUGGESTED_TAB_COUNT = 2;
+    private static final int SUGGESTED_TAB_COUNT = 2;
 
     private MessageCardProviderMediator mMediator;
 
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java
index 4008165a..2f78a6d 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java
@@ -24,7 +24,6 @@
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.graphics.Rect;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.MotionEvent;
@@ -74,6 +73,7 @@
 /**
  * Tests for {@link TabGridDialogMediator}.
  */
+@SuppressWarnings({"ArraysAsListWithZeroOrOneArgument", "ResultOfMethodCallIgnored"})
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 // clang-format off
@@ -102,8 +102,6 @@
     @Mock
     Resources mResources;
     @Mock
-    Rect mRect;
-    @Mock
     View mView;
     @Mock
     TabGridDialogMediator.DialogController mDialogController;
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
index 1e70db1..4656ea9 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
@@ -64,6 +64,7 @@
 /**
  * Tests for {@link TabGridItemTouchHelperCallback}.
  */
+@SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
@@ -112,10 +113,6 @@
     @Mock
     GridLayoutManager mGridLayoutManager;
 
-    private Tab mTab1;
-    private Tab mTab2;
-    private Tab mTab3;
-    private Tab mTab4;
     private SimpleRecyclerViewAdapter.ViewHolder mMockViewHolder1;
     private SimpleRecyclerViewAdapter.ViewHolder mMockViewHolder2;
     private RecyclerView.ViewHolder mDummyViewHolder1;
@@ -135,10 +132,10 @@
 
         MockitoAnnotations.initMocks(this);
 
-        mTab1 = prepareTab(TAB1_ID, TAB1_TITLE);
-        mTab2 = prepareTab(TAB2_ID, TAB2_TITLE);
-        mTab3 = prepareTab(TAB3_ID, TAB3_TITLE);
-        mTab4 = prepareTab(TAB4_ID, TAB4_TITLE);
+        Tab tab1 = prepareTab(TAB1_ID, TAB1_TITLE);
+        Tab tab2 = prepareTab(TAB2_ID, TAB2_TITLE);
+        Tab tab3 = prepareTab(TAB3_ID, TAB3_TITLE);
+        Tab tab4 = prepareTab(TAB4_ID, TAB4_TITLE);
         mMockViewHolder1 = prepareMockViewHolder(TAB1_ID, POSITION1);
         mMockViewHolder2 = prepareMockViewHolder(TAB2_ID, POSITION2);
         // Mock four cards in a grid layout. Each card is of width 4 and height 4. Both the side
@@ -158,15 +155,15 @@
         doReturn(tabModelList).when(mTabModelSelector).getModels();
         doReturn(mTabModelFilterProvider).when(mTabModelSelector).getTabModelFilterProvider();
         doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
-        doReturn(mTab1).when(mTabModel).getTabAt(POSITION1);
-        doReturn(mTab2).when(mTabModel).getTabAt(POSITION2);
-        doReturn(mTab3).when(mTabModel).getTabAt(POSITION3);
-        doReturn(mTab4).when(mTabModel).getTabAt(POSITION4);
+        doReturn(tab1).when(mTabModel).getTabAt(POSITION1);
+        doReturn(tab2).when(mTabModel).getTabAt(POSITION2);
+        doReturn(tab3).when(mTabModel).getTabAt(POSITION3);
+        doReturn(tab4).when(mTabModel).getTabAt(POSITION4);
         doReturn(4).when(mTabModel).getCount();
-        doReturn(mTab1).when(mTabGroupModelFilter).getTabAt(POSITION1);
-        doReturn(mTab2).when(mTabGroupModelFilter).getTabAt(POSITION2);
-        doReturn(mTab3).when(mTabGroupModelFilter).getTabAt(POSITION3);
-        doReturn(mTab4).when(mTabGroupModelFilter).getTabAt(POSITION4);
+        doReturn(tab1).when(mTabGroupModelFilter).getTabAt(POSITION1);
+        doReturn(tab2).when(mTabGroupModelFilter).getTabAt(POSITION2);
+        doReturn(tab3).when(mTabGroupModelFilter).getTabAt(POSITION3);
+        doReturn(tab4).when(mTabGroupModelFilter).getTabAt(POSITION4);
         setupRecyclerView();
 
         mModel = new TabListModel();
@@ -856,11 +853,10 @@
     private SimpleRecyclerViewAdapter.ViewHolder prepareMockViewHolder(int id, int position) {
         SimpleRecyclerViewAdapter.ViewHolder viewHolder =
                 mock(SimpleRecyclerViewAdapter.ViewHolder.class);
-        PropertyModel model = new PropertyModel.Builder(TabProperties.ALL_KEYS_TAB_GRID)
-                                      .with(TabProperties.TAB_ID, id)
-                                      .with(CARD_TYPE, TAB)
-                                      .build();
-        viewHolder.model = model;
+        viewHolder.model = new PropertyModel.Builder(TabProperties.ALL_KEYS_TAB_GRID)
+                                   .with(TabProperties.TAB_ID, id)
+                                   .with(CARD_TYPE, TAB)
+                                   .build();
         doReturn(position).when(viewHolder).getAdapterPosition();
         return viewHolder;
     }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiMediatorUnitTest.java
index 3041a30..1c4c04e 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiMediatorUnitTest.java
@@ -56,6 +56,7 @@
 /**
  * Tests for {@link TabGroupPopupUiMediator}.
  */
+@SuppressWarnings({"ResultOfMethodCallIgnored", "ArraysAsListWithZeroOrOneArgument"})
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabGroupPopupUiMediatorUnitTest {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupTitleEditorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupTitleEditorUnitTest.java
index c6f417c..0853b18 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupTitleEditorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupTitleEditorUnitTest.java
@@ -43,6 +43,7 @@
 /**
  * Tests for {@link TabGroupTitleEditor}.
  */
+@SuppressWarnings({"ArraysAsListWithZeroOrOneArgument", "ResultOfMethodCallIgnored"})
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabGroupTitleEditorUnitTest {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java
index e3e04e7..fd6b060 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java
@@ -66,6 +66,7 @@
 /**
  * Tests for {@link TabGroupUiMediator}.
  */
+@SuppressWarnings({"ResultOfMethodCallIgnored", "ArraysAsListWithZeroOrOneArgument", "unchecked"})
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabGroupUiMediatorUnitTest {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
index af57697..03eb333 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -100,7 +100,6 @@
 import org.chromium.chrome.browser.tasks.pseudotab.TabAttributeCache;
 import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
 import org.chromium.chrome.browser.tasks.tab_management.TabProperties.UiType;
-import org.chromium.chrome.browser.ui.favicon.FaviconHelper;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.components.embedder_support.util.UrlUtilities;
@@ -126,6 +125,8 @@
 /**
  * Tests for {@link TabListMediator}.
  */
+@SuppressWarnings(
+        {"ArraysAsListWithZeroOrOneArgument", "ResultOfMethodCallIgnored", "ConstantConditions"})
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 // clang-format off
@@ -219,8 +220,6 @@
     @Captor
     ArgumentCaptor<TabModelObserver> mTabModelObserverCaptor;
     @Captor
-    ArgumentCaptor<FaviconHelper.FaviconImageCallback> mFaviconCallbackCaptor;
-    @Captor
     ArgumentCaptor<TabObserver> mTabObserverCaptor;
     @Captor
     ArgumentCaptor<Callback<Drawable>> mCallbackCaptor;
@@ -2029,11 +2028,10 @@
     private SimpleRecyclerViewAdapter.ViewHolder prepareViewHolder(int id, int position) {
         SimpleRecyclerViewAdapter.ViewHolder viewHolder =
                 mock(SimpleRecyclerViewAdapter.ViewHolder.class);
-        PropertyModel model = new PropertyModel.Builder(TabProperties.ALL_KEYS_TAB_GRID)
-                                      .with(TabProperties.TAB_ID, id)
-                                      .with(CARD_TYPE, TAB)
-                                      .build();
-        viewHolder.model = model;
+        viewHolder.model = new PropertyModel.Builder(TabProperties.ALL_KEYS_TAB_GRID)
+                                   .with(TabProperties.TAB_ID, id)
+                                   .with(CARD_TYPE, TAB)
+                                   .build();
         doReturn(position).when(viewHolder).getAdapterPosition();
         return viewHolder;
     }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProviderUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProviderUnitTest.java
index 1abac1fc..302629c 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProviderUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProviderUnitTest.java
@@ -43,6 +43,7 @@
 /**
  * Tests for {@link TabSelectionEditorActionProvider}.
  */
+@SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabSelectionEditorActionProviderUnitTest {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageServiceUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageServiceUnitTest.java
index 05d6238..da1d8d8f 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageServiceUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSuggestionMessageServiceUnitTest.java
@@ -48,6 +48,7 @@
 /**
  * Unit tests for {@link TabSuggestionMessageService}.
  */
+@SuppressWarnings({"ResultOfMethodCallIgnored", "ArraysAsListWithZeroOrOneArgument"})
 @RunWith(LocalRobolectricTestRunner.class)
 public class TabSuggestionMessageServiceUnitTest {
     private static final int TAB1_ID = 456;
@@ -100,9 +101,9 @@
         mocker.mock(ProfileJni.TEST_HOOKS, mMockProfileNatives);
 
         // Set up Tabs.
-        mTab1 = TabUiUnitTestUtils.prepareTab(TAB1_ID, TAB1_ROOT_ID, null, "");
-        mTab2 = TabUiUnitTestUtils.prepareTab(TAB2_ID, TAB2_ROOT_ID, null, "");
-        mTab3 = TabUiUnitTestUtils.prepareTab(TAB3_ID, TAB3_ROOT_ID, null, "");
+        mTab1 = TabUiUnitTestUtils.prepareTab(TAB1_ID, TAB1_ROOT_ID, "");
+        mTab2 = TabUiUnitTestUtils.prepareTab(TAB2_ID, TAB2_ROOT_ID, "");
+        mTab3 = TabUiUnitTestUtils.prepareTab(TAB3_ID, TAB3_ROOT_ID, "");
 
         // Set up TabModelSelector.
         doReturn(mTabModel).when(mTabModelSelector).getCurrentModel();
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
index a366e8c..d24dccf 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -71,6 +71,7 @@
 /**
  * Tests for {@link TabSwitcherMediator}.
  */
+@SuppressWarnings({"ResultOfMethodCallIgnored", "ArraysAsListWithZeroOrOneArgument", "unchecked"})
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowRecordHistogram.class})
 @DisableFeatures(
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiUnitTestUtils.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiUnitTestUtils.java
index bcbfacb..41c2eb82 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiUnitTestUtils.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiUnitTestUtils.java
@@ -7,7 +7,6 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
-import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.url.GURL;
@@ -16,6 +15,7 @@
  * This is a util class for TabUi unit tests.
  */
 // TODO(crbug.com/1023701): Generalize all prepareTab method from tab_ui/junit directory.
+@SuppressWarnings("ResultOfMethodCallIgnored")
 public class TabUiUnitTestUtils {
     public static TabImpl prepareTab() {
         return mock(TabImpl.class);
@@ -33,7 +33,7 @@
         return tab;
     }
 
-    public static TabImpl prepareTab(int tabId, int rootId, Profile profile, String visibleUrl) {
+    public static TabImpl prepareTab(int tabId, int rootId, String visibleUrl) {
         TabImpl tab = prepareTab(tabId, rootId);
         WebContents webContents = mock(WebContents.class);
         GURL gurl = mock(GURL.class);
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 279238a3..5a57966 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
@@ -31,6 +31,7 @@
 /**
  * Tests the provider which identifies Tabs which have not been used in a long time
  */
+@SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class StaleTabSuggestionProviderTest {
@@ -82,7 +83,7 @@
         doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
 
         List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
-        Assert.assertTrue(staleSuggestions.size() == 1);
+        Assert.assertEquals(1, staleSuggestions.size());
         TabSuggestion staleSuggestion = staleSuggestions.get(0);
         Assert.assertEquals("mock_stale_title", staleSuggestion.getTabsInfo().get(0).title);
         Assert.assertEquals(TabSuggestion.TabSuggestionAction.CLOSE, staleSuggestion.getAction());
@@ -117,7 +118,7 @@
         doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
 
         List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
-        Assert.assertTrue(staleSuggestions.size() == 1);
+        Assert.assertEquals(1, staleSuggestions.size());
         TabSuggestion staleSuggestion = staleSuggestions.get(0);
         Assert.assertEquals("mock_stale_title", staleSuggestion.getTabsInfo().get(0).title);
         Assert.assertEquals(TabSuggestion.TabSuggestionAction.CLOSE, staleSuggestion.getAction());
@@ -151,7 +152,7 @@
         doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
 
         List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
-        Assert.assertTrue(staleSuggestions.size() == 1);
+        Assert.assertEquals(1, staleSuggestions.size());
         TabSuggestion staleSuggestion = staleSuggestions.get(0);
         Assert.assertEquals("mock_low_engaged_title", staleSuggestion.getTabsInfo().get(0).title);
         Assert.assertEquals(TabSuggestion.TabSuggestionAction.CLOSE, staleSuggestion.getAction());
@@ -185,13 +186,13 @@
                 "mock_stale_referrer_url", CURRENT_TIME_MILLIS - TimeUnit.DAYS.toMillis(4), 1.0));
         tabInfos.add(getMockTab(5, "mock_stale_title_highly_engaged",
                 "mock_stale_url_highly_engaged", "mock_stale_original_url_highly_engaged",
-                "mock_stale_referrer_urlj_highly_engaged",
+                "mock_stale_referrer_url_highly_engaged",
                 CURRENT_TIME_MILLIS - TimeUnit.DAYS.toMillis(4), 20.0));
 
         doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
 
         List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
-        Assert.assertTrue(staleSuggestions.size() == 1);
+        Assert.assertEquals(1, staleSuggestions.size());
         TabSuggestion staleSuggestion = staleSuggestions.get(0);
         Assert.assertEquals("mock_stale_title", staleSuggestion.getTabsInfo().get(0).title);
         Assert.assertEquals(TabSuggestion.TabSuggestionAction.CLOSE, staleSuggestion.getAction());
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java
index a595b7a..a9853ea 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java
@@ -39,6 +39,7 @@
 /**
  * Tests functionality related to TabContext
  */
+@SuppressWarnings({"ResultOfMethodCallIgnored", "ArraysAsListWithZeroOrOneArgument"})
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabContextTest {
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 645270f..893cdd8 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
@@ -35,6 +35,7 @@
 /**
  * Test TabSuggestionsClientFetcher
  */
+@SuppressWarnings("ResultOfMethodCallIgnored")
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabSuggestionsClientFetcherTest {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java
index a03567e5..402df824 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java
@@ -49,6 +49,7 @@
 /**
  * Tests functionality of {@link TabSuggestionsOrchestrator}.
  */
+@SuppressWarnings({"ResultOfMethodCallIgnored", "ArraysAsListWithZeroOrOneArgument"})
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class TabSuggestionsOrchestratorTest {
@@ -73,9 +74,6 @@
     private TabModelFilter mTabModelFilter;
 
     @Mock
-    private TabSuggestionsOrchestrator mTabSuggestionsOrchestrator;
-
-    @Mock
     private ActivityLifecycleDispatcher mDispatcher;
 
     private static Tab[] sTabs = {mockTab(TAB_IDS[0]), mockTab(TAB_IDS[1]), mockTab(TAB_IDS[2])};
@@ -159,6 +157,7 @@
                 mTabModelSelector, mDispatcher, new InMemorySharedPreferences());
         tabSuggestionsOrchestrator.setUseBaselineTabSuggestionsForTesting();
         List<TabSuggestion> suggestions = new LinkedList<>();
+        @SuppressWarnings("unused")
         TabSuggestionsObserver tabSuggestionsObserver = new TabSuggestionsObserver() {
             @Override
             public void onNewSuggestion(List<TabSuggestion> tabSuggestions,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkEditActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkEditActivity.java
index ddad1aa..978407a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkEditActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkEditActivity.java
@@ -4,13 +4,13 @@
 
 package org.chromium.chrome.browser.bookmarks;
 
-import android.content.Intent;
 import android.os.Bundle;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.widget.TextView;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.widget.Toolbar;
 
 import org.chromium.base.Log;
@@ -166,17 +166,23 @@
         super.onDestroy();
     }
 
-    private void openBookmark() {
-        // TODO(kkimlabs): Refactor this out to handle the intent in ChromeActivity.
-        // If this activity was started via startActivityForResult(), set the result. Otherwise,
-        // launch the bookmark directly.
-        if (getCallingActivity() != null) {
-            Intent intent = new Intent();
-            intent.putExtra(BookmarkActivity.INTENT_VISIT_BOOKMARK_ID, mBookmarkId.toString());
-            setResult(RESULT_OK, intent);
-        } else {
-            BookmarkUtils.openBookmark(mModel, this, mBookmarkId);
-        }
-        finish();
+    @VisibleForTesting
+    BookmarkTextInputLayout getTitleEditText() {
+        return mTitleEditText;
+    }
+
+    @VisibleForTesting
+    BookmarkTextInputLayout getUrlEditText() {
+        return mUrlEditText;
+    }
+
+    @VisibleForTesting
+    MenuItem getDeleteButton() {
+        return mDeleteButton;
+    }
+
+    @VisibleForTesting
+    TextView getFolderTextView() {
+        return mFolderTextView;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
index 5473173..f5d4eef6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -1101,15 +1101,6 @@
     }
 
     /**
-     * Extracts the creator package name from the intent.
-     * @param intent The intent to get the package name from.
-     * @return the package name which can be null.
-     */
-    String extractCreatorPackage(Intent intent) {
-        return null;
-    }
-
-    /**
      * Shows a toast about any possible sign in issues encountered during custom tab startup.
      * @param session The session that corresponding custom tab is assigned.
      * @param intent The intent that launched the custom tab.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
index d2defe0..401b66c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
@@ -428,7 +428,7 @@
             return;
         }
 
-        ReaderModeInfoBar.showReaderModeInfoBar(mTabModelSelector.getCurrentTab());
+        ReaderModeInfoBar.showReaderModeInfoBar(mTabModelSelector.getCurrentTab(), this);
     }
 
     public void activateReaderMode() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java
index 00409f2..274d827 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java
@@ -25,7 +25,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tab.TabImpl;
+import org.chromium.chrome.browser.tab.TabUtils;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.widget.Toast;
 
@@ -294,7 +294,7 @@
                 == SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) {
             systemUiVisibility = applyEnterFullscreenUIFlags(systemUiVisibility);
         } else {
-            Activity activity = ((TabImpl) tab).getActivity();
+            Activity activity = TabUtils.getActivity(tab);
             boolean isMultiWindow = MultiWindowUtils.getInstance().isLegacyMultiWindow(activity)
                     || MultiWindowUtils.getInstance().isInMultiWindowMode(activity);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java
index 2fcc78a..a52f066f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/ReaderModeInfoBar.java
@@ -20,7 +20,6 @@
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
 import org.chromium.chrome.browser.dom_distiller.ReaderModeManager;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.browser.ui.messages.infobar.InfoBarCompactLayout;
 import org.chromium.components.browser_ui.widget.text.AccessibleTextView;
 
@@ -97,19 +96,14 @@
      * Create and show the Reader Mode {@link InfoBar}.
      * @param tab The tab that the {@link InfoBar} should be shown in.
      */
-    public static void showReaderModeInfoBar(Tab tab) {
-        ReaderModeInfoBarJni.get().create(tab);
+    public static void showReaderModeInfoBar(Tab tab, ReaderModeManager manager) {
+        ReaderModeInfoBarJni.get().create(tab, manager);
     }
 
-    /**
-     * @return The {@link ReaderModeManager} for this infobar.
-     */
+    /** @return The {@link ReaderModeManager} for this infobar. */
     private ReaderModeManager getReaderModeManager() {
         if (getNativeInfoBarPtr() == 0) return null;
-        Tab tab = ReaderModeInfoBarJni.get().getTab(getNativeInfoBarPtr(), ReaderModeInfoBar.this);
-
-        if (tab == null || ((TabImpl) tab).getActivity() == null) return null;
-        return ((TabImpl) tab).getActivity().getReaderModeManager();
+        return ReaderModeInfoBarJni.get().getReaderModeManager(getNativeInfoBarPtr());
     }
 
     /**
@@ -122,7 +116,7 @@
 
     @NativeMethods
     interface Natives {
-        void create(Tab tab);
-        Tab getTab(long nativeReaderModeInfoBar, ReaderModeInfoBar caller);
+        void create(Tab tab, ReaderModeManager manager);
+        ReaderModeManager getReaderModeManager(long nativeReaderModeInfoBar);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java
index 1f02722..c100790 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab_activity_glue/ActivityTabWebContentsDelegateAndroid.java
@@ -46,6 +46,7 @@
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modaldialog.SimpleModalDialogController;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.mojom.WindowOpenDisposition;
 
@@ -374,36 +375,22 @@
         }
 
         ModalDialogManager modalDialogManager = mActivity.getModalDialogManager();
-
-        ModalDialogProperties.Controller dialogController = new ModalDialogProperties.Controller() {
-            @Override
-            public void onClick(PropertyModel model, int buttonType) {
-                if (buttonType == ModalDialogProperties.ButtonType.POSITIVE) {
-                    modalDialogManager.dismissDialog(
-                            model, DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
-                } else if (buttonType == ModalDialogProperties.ButtonType.NEGATIVE) {
-                    modalDialogManager.dismissDialog(
-                            model, DialogDismissalCause.NEGATIVE_BUTTON_CLICKED);
-                }
-            }
-
-            @Override
-            public void onDismiss(PropertyModel model, int dismissalCause) {
-                if (!mTab.isInitialized()) return;
-                switch (dismissalCause) {
-                    case DialogDismissalCause.POSITIVE_BUTTON_CLICKED:
-                        mTab.getWebContents().getNavigationController().continuePendingReload();
-                        break;
-                    case DialogDismissalCause.ACTIVITY_DESTROYED:
-                    case DialogDismissalCause.TAB_DESTROYED:
-                        // Intentionally ignored as the tab object is gone.
-                        break;
-                    default:
-                        mTab.getWebContents().getNavigationController().cancelPendingReload();
-                        break;
-                }
-            }
-        };
+        ModalDialogProperties.Controller dialogController =
+                new SimpleModalDialogController(modalDialogManager, (Integer dismissalCause) -> {
+                    if (!mTab.isInitialized()) return;
+                    switch (dismissalCause) {
+                        case DialogDismissalCause.POSITIVE_BUTTON_CLICKED:
+                            mTab.getWebContents().getNavigationController().continuePendingReload();
+                            break;
+                        case DialogDismissalCause.ACTIVITY_DESTROYED:
+                        case DialogDismissalCause.TAB_DESTROYED:
+                            // Intentionally ignored as the tab object is gone.
+                            break;
+                        default:
+                            mTab.getWebContents().getNavigationController().cancelPendingReload();
+                            break;
+                    }
+                });
 
         Resources resources = mActivity.getResources();
         PropertyModel dialogModel =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
index fdc63014..5f2e11d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -31,7 +31,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.ssl.ChromeSecurityStateModelDelegate;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tab.TabImpl;
+import org.chromium.chrome.browser.tab.TabUtils;
 import org.chromium.chrome.browser.tab.TrustedCdn;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
@@ -483,7 +483,7 @@
     @Override
     public String getDisplaySearchTerms() {
         if (mNativeLocationBarModelAndroid == 0) return null;
-        if (mTab != null && !(((TabImpl) mTab).getActivity() instanceof ChromeTabbedActivity)) {
+        if (mTab != null && !(TabUtils.getActivity(mTab) instanceof ChromeTabbedActivity)) {
             return null;
         }
         if (isPreview()) return null;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkEditTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkEditTest.java
new file mode 100644
index 0000000..09045e1
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkEditTest.java
@@ -0,0 +1,235 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.bookmarks;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.view.MenuItem;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+
+import org.chromium.base.ActivityState;
+import org.chromium.base.ApplicationStatus;
+import org.chromium.base.ApplicationStatus.ActivityStateListener;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
+import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.test.ChromeBrowserTestRule;
+import org.chromium.chrome.test.util.BookmarkTestUtil;
+import org.chromium.components.bookmarks.BookmarkId;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Tests functionality in BookmarkEditActivity.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class BookmarkEditTest {
+    private static final String TITLE_A = "a";
+    private static final String TITLE_B = "b";
+    private static final String URL_A = "http://a.com/";
+    private static final String URL_B = "http://b.com/";
+
+    @Rule
+    public final ChromeBrowserTestRule mChromeBrowserTestRule = new ChromeBrowserTestRule();
+
+    private BookmarkModel mBookmarkModel;
+    private BookmarkModel.BookmarkModelObserver mModelObserver;
+    private CallbackHelper mModelChangedCallback = new CallbackHelper();
+    private BookmarkId mBookmarkId;
+    private BookmarkId mMobileNode;
+    private BookmarkId mOtherNode;
+    private BookmarkEditActivity mBookmarkEditActivity;
+
+    private CallbackHelper mDestroyedCallback = new CallbackHelper();
+    private ActivityStateListener mActivityStateListener = new ActivityStateListener() {
+        @Override
+        public void onActivityStateChange(Activity activity, int newState) {
+            if (newState == ActivityState.DESTROYED) mDestroyedCallback.notifyCalled();
+        }
+    };
+
+    @Before
+    public void setUp() throws TimeoutException {
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Profile profile = Profile.getLastUsedRegularProfile();
+            mBookmarkModel = new BookmarkModel(profile);
+            mBookmarkModel.loadEmptyPartnerBookmarkShimForTesting();
+        });
+
+        BookmarkTestUtil.waitForBookmarkModelLoaded();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mMobileNode = mBookmarkModel.getMobileFolderId();
+            mOtherNode = mBookmarkModel.getOtherFolderId();
+        });
+        mBookmarkId = BookmarkModelTest.addBookmark(mBookmarkModel, mMobileNode, 0, TITLE_A, URL_A);
+
+        mModelObserver = new BookmarkModelObserver() {
+            @Override
+            public void bookmarkModelChanged() {
+                mModelChangedCallback.notifyCalled();
+            }
+        };
+        mBookmarkModel.addObserver(mModelObserver);
+
+        startEditActivity(mBookmarkId);
+        ApplicationStatus.registerStateListenerForActivity(
+                mActivityStateListener, mBookmarkEditActivity);
+    }
+
+    @After
+    public void tearDown() {
+        ApplicationStatus.unregisterActivityStateListener(mActivityStateListener);
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"Bookmark"})
+    public void testEditTitleAndUrl() throws ExecutionException, TimeoutException {
+        Assert.assertEquals("Incorrect title.", TITLE_A,
+                mBookmarkEditActivity.getTitleEditText().getEditText().getText().toString());
+        Assert.assertEquals("Incorrect url.", URL_A,
+                mBookmarkEditActivity.getUrlEditText().getEditText().getText().toString());
+
+        int currentModelChangedCount = mModelChangedCallback.getCallCount();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mBookmarkEditActivity.getTitleEditText().getEditText().setText(TITLE_B);
+            mBookmarkEditActivity.getUrlEditText().getEditText().setText(URL_B);
+            mBookmarkEditActivity.finish();
+        });
+        mDestroyedCallback.waitForCallback(0);
+
+        BookmarkItem bookmarkItem = getBookmarkItem(mBookmarkId);
+        Assert.assertEquals("Incorrect title after edit.", TITLE_B, bookmarkItem.getTitle());
+        Assert.assertEquals("Incorrect url after edit.", URL_B, bookmarkItem.getUrl());
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"Bookmark"})
+    public void testEditEmptyInputRejected() throws ExecutionException, TimeoutException {
+        Assert.assertEquals("Incorrect title.", TITLE_A,
+                mBookmarkEditActivity.getTitleEditText().getEditText().getText().toString());
+        Assert.assertEquals("Incorrect url.", URL_A,
+                mBookmarkEditActivity.getUrlEditText().getEditText().getText().toString());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mBookmarkEditActivity.getTitleEditText().getEditText().setText("");
+            mBookmarkEditActivity.getUrlEditText().getEditText().setText("");
+            mBookmarkEditActivity.finish();
+        });
+        mDestroyedCallback.waitForCallback(0);
+
+        BookmarkItem bookmarkItem = getBookmarkItem(mBookmarkId);
+        Assert.assertEquals("Incorrect title after edit.", TITLE_A, bookmarkItem.getTitle());
+        Assert.assertEquals("Incorrect url after edit.", URL_A, bookmarkItem.getUrl());
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"Bookmark"})
+    public void testInvalidUrlRejected() throws ExecutionException, TimeoutException {
+        Assert.assertEquals("Incorrect url.", URL_A,
+                mBookmarkEditActivity.getUrlEditText().getEditText().getText().toString());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mBookmarkEditActivity.getUrlEditText().getEditText().setText("http:://?foo=bar");
+            mBookmarkEditActivity.finish();
+        });
+        mDestroyedCallback.waitForCallback(0);
+
+        BookmarkItem bookmarkItem = getBookmarkItem(mBookmarkId);
+        Assert.assertEquals("Incorrect url after edit.", URL_A, bookmarkItem.getUrl());
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"Bookmark"})
+    public void testEditActivityDeleteButton() throws ExecutionException, TimeoutException {
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mBookmarkEditActivity.onOptionsItemSelected(mBookmarkEditActivity.getDeleteButton());
+        });
+        mDestroyedCallback.waitForCallback(0);
+
+        BookmarkItem bookmarkItem = getBookmarkItem(mBookmarkId);
+        Assert.assertNull("Bookmark item should have been deleted.", bookmarkItem);
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"Bookmark"})
+    public void testEditActivityHomeButton() throws ExecutionException {
+        MenuItem item = Mockito.mock(MenuItem.class);
+        Mockito.when(item.getItemId()).thenReturn(android.R.id.home);
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> mBookmarkEditActivity.onOptionsItemSelected(item));
+
+        Assert.assertTrue("BookmarkActivity should be finishing or destroyed.",
+                mBookmarkEditActivity.isFinishing() || mBookmarkEditActivity.isDestroyed());
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"Bookmark"})
+    public void testEditActivityReflectsModelChanges() throws TimeoutException, ExecutionException {
+        Assert.assertEquals("Incorrect title.", TITLE_A,
+                mBookmarkEditActivity.getTitleEditText().getEditText().getText().toString());
+        Assert.assertEquals("Incorrect folder.", getBookmarkItem(mMobileNode).getTitle(),
+                mBookmarkEditActivity.getFolderTextView().getText());
+
+        int currentModelChangedCount = mModelChangedCallback.getCallCount();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mBookmarkModel.setBookmarkTitle(mBookmarkId, TITLE_B);
+            mBookmarkModel.moveBookmark(mBookmarkId, mOtherNode, 0);
+        });
+        mModelChangedCallback.waitForCallback(currentModelChangedCount);
+
+        Assert.assertEquals("Title shouldn't change after model update.", TITLE_A,
+                mBookmarkEditActivity.getTitleEditText().getEditText().getText().toString());
+        Assert.assertEquals("Folder should change after model update.",
+                getBookmarkItem(mOtherNode).getTitle(),
+                mBookmarkEditActivity.getFolderTextView().getText());
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"Bookmark"})
+    public void testEditActivityFinishesWhenBookmarkDeleted() throws TimeoutException {
+        int currentModelChangedCount = mModelChangedCallback.getCallCount();
+        TestThreadUtils.runOnUiThreadBlocking(() -> mBookmarkModel.deleteBookmark(mBookmarkId));
+        mModelChangedCallback.waitForCallback(currentModelChangedCount);
+
+        Assert.assertTrue("BookmarkActivity should be finishing or destroyed.",
+                mBookmarkEditActivity.isFinishing() || mBookmarkEditActivity.isDestroyed());
+    }
+
+    private BookmarkItem getBookmarkItem(BookmarkId bookmarkId) throws ExecutionException {
+        return TestThreadUtils.runOnUiThreadBlocking(
+                () -> mBookmarkModel.getBookmarkById(bookmarkId));
+    }
+
+    private void startEditActivity(BookmarkId bookmarkId) {
+        Context context = InstrumentationRegistry.getTargetContext();
+        Intent intent = new Intent(context, BookmarkEditActivity.class);
+        intent.putExtra(BookmarkEditActivity.INTENT_BOOKMARK_ID, bookmarkId.toString());
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mBookmarkEditActivity = (BookmarkEditActivity) InstrumentationRegistry.getInstrumentation()
+                                        .startActivitySync(intent);
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java
index be76ea7..bf1c4df0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java
@@ -255,12 +255,17 @@
         verifyBookmark(folderAA, "faa", null, true, folderA);
     }
 
-    private BookmarkId addBookmark(final BookmarkId parent, final int index, final String title,
-            final String url) {
+    private BookmarkId addBookmark(
+            final BookmarkId parent, final int index, final String title, final String url) {
+        return addBookmark(mBookmarkModel, parent, index, title, url);
+    }
+
+    public static BookmarkId addBookmark(BookmarkModel model, final BookmarkId parent,
+            final int index, final String title, final String url) {
         final AtomicReference<BookmarkId> result = new AtomicReference<BookmarkId>();
         final Semaphore semaphore = new Semaphore(0);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            result.set(mBookmarkModel.addBookmark(parent, index, title, url));
+            result.set(model.addBookmark(parent, index, title, url));
             semaphore.release();
         });
         try {
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 0236471..47181ac 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1702,6 +1702,7 @@
 <translation id="3264544094376351444">Sans-Serif ቅርጸ ቁምፊ፦</translation>
 <translation id="3264582393905923483">አውድ</translation>
 <translation id="3265459715026181080">መስኮት ዝጋ</translation>
+<translation id="3266274118485960573">የደህንነት ፍተሻ በማሄድ ላይ ነው።</translation>
 <translation id="3267726687589094446">በርካታ ፋይሎችን በራስ ሰር ማውረድን መፍቀድ ቀጥል</translation>
 <translation id="3268451620468152448">ክፍት ትሮች</translation>
 <translation id="3269069891205016797">ዘግተው ሲወጡ የእርስዎ መረጃ ከመሣሪያው ይወገዳል።</translation>
@@ -1807,6 +1808,7 @@
 <translation id="3412265149091626468">ወደ ተመረጠው ዝለል</translation>
 <translation id="3413122095806433232">CA ሰጪዎች፦ <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">መጠን፦</translation>
+<translation id="3416468988018290825">ሁልጊዜ ሙሉ ዩአርኤሎችን አሳይ</translation>
 <translation id="3420501302812554910">ውስጣዊ ደህንነት ቅይልፍ ዳግም መቀናበር ይፈልጋል</translation>
 <translation id="3421387094817716717">ሞላላ ጥምዝ ይፋዊ ቁልፍ</translation>
 <translation id="3422291238483866753">አንድ ጣቢያ የዙሪያዎ የ3ል ካርታ መፍጠር ወይም የካሜራ ቦታ መከታተል ሲፈልግ ጠይቅ (የሚመከር)</translation>
@@ -4161,6 +4163,7 @@
 <translation id="6586451623538375658">የዋና መዳፊት አዘራር ይቀይሩ</translation>
 <translation id="6586604979641883411">ቢያንስ <ph name="REQUIRED_SPACE" /> ከነጻ ዲስክ ባዶ ቦታ Linuxን ደረጃ ለማሻሻል ያስፈልጋል። በእርስዎ መሣሪያ ላይ እባክዎ የተወሰነ ባዶ ቦታ ያስለቅቁ እና እንደገና ይሞክሩ።</translation>
 <translation id="6588043302623806746">ደህንነቱ የተጠበቀ ዲኤንኤስ የለም</translation>
+<translation id="659005207229852190">የደህንነት ፍተሻ ተጠናቅቋል።</translation>
 <translation id="6590458744723262880">አቃፊን ዳግም ሰይም</translation>
 <translation id="6592267180249644460">የWebRTC ምዝግብ ማስታወሻ <ph name="WEBRTC_LOG_CAPTURE_TIME" /> ላይ ተቀርጸዋል</translation>
 <translation id="6592808042417736307">የጣት አሻራዎ ተመዝግቧል</translation>
@@ -5425,6 +5428,7 @@
 <translation id="8249672078237421304">በሚያነብቡት ቋንቋ ያልሆኑ ገፆችን እንዲተረጎሙ ሐሳብ ያቅርብ</translation>
 <translation id="8251441930213048644">አሁንኑ አድስ</translation>
 <translation id="8251578425305135684">ድንክዬ ተወግዷል።</translation>
+<translation id="825238165904109940">ሁልጊዜ ሙሉ ዩአርኤሎችን አሳይ</translation>
 <translation id="8252569384384439529">በመስቀል ላይ…</translation>
 <translation id="8253198102038551905">የአውታረ መረብ ባህሪያትን ለማግኘት «+»ን ጠቅ ያድርጉ።</translation>
 <translation id="8254954272268479918">Linux (ቅድመ-ይሁንታ)ን ዝጋ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 0dafce7..2ce544d 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">‏خط Sans-serif</translation>
 <translation id="3264582393905923483">السياق</translation>
 <translation id="3265459715026181080">إغلاق الإطار</translation>
+<translation id="3266274118485960573">"تأكيد السلامة" قيد التشغيل.</translation>
 <translation id="3267726687589094446">متابعة السماح بعمليات التنزيل التلقائية لعدة ملفات</translation>
 <translation id="3268451620468152448">علامات التبويب المفتوحة</translation>
 <translation id="3269069891205016797">ستتم إزالة معلوماتك من الجهاز عند الخروج.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">انتقال سريع إلى التحديد</translation>
 <translation id="3413122095806433232">‏جهات إصدار المرجع المصدق (CA): <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">الحجم:</translation>
+<translation id="3416468988018290825">‏عرض عناوين URL الكاملة دائمًا</translation>
 <translation id="3420501302812554910">يتطلب مفتاح الأمان الداخلي إعادة ضبط</translation>
 <translation id="3421387094817716717">المفتاح العام لمنحنى ناقص المقطع</translation>
 <translation id="3422291238483866753">طلب الإذن عند محاولة موقع إلكتروني إنشاء خريطة ثلاثية الأبعاد للبيئة المحيطة بك أو تتبُّع موضع الكاميرا (مقترَح)</translation>
@@ -4163,6 +4165,7 @@
 <translation id="6586451623538375658">تبديل زر الماوس الرئيسي</translation>
 <translation id="6586604979641883411">‏يجب توفّر <ph name="REQUIRED_SPACE" /> على الأقل من المساحة الخالية لترقية نظام التشغيل Linux. يُرجى إخلاء بعض المساحة وإعادة المحاولة.</translation>
 <translation id="6588043302623806746">‏استخدام "نظام أسماء النطاقات" (DNS) الآمن</translation>
+<translation id="659005207229852190">اكتمل إعداد "تأكيد السلامة".</translation>
 <translation id="6590458744723262880">إعادة تسمية المجلد</translation>
 <translation id="6592267180249644460">‏تم التقاط سجلات WebRTC في <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">تم حِفظ بصمة الإصبع.</translation>
@@ -5423,6 +5426,7 @@
 <translation id="8249672078237421304">عرض ترجمة الصفحات المكتوبة بلغة غير لغتك</translation>
 <translation id="8251441930213048644">إعادة التحميل الآن</translation>
 <translation id="8251578425305135684">تمت إزالة الصورة المصغّرة.</translation>
+<translation id="825238165904109940">‏عرض عناوين URL الكاملة دائمًا</translation>
 <translation id="8252569384384439529">جارٍ التحميل...</translation>
 <translation id="8253198102038551905">انقر '+' للحصول على خصائص الشبكة</translation>
 <translation id="8254954272268479918">‏إيقاف تطبيق Linux (إصدار تجريبي)</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index ff6979f..2b0f2ad 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1698,6 +1698,7 @@
 <translation id="3264544094376351444">Sans-serif şrifti</translation>
 <translation id="3264582393905923483">Məzmun</translation>
 <translation id="3265459715026181080">Pəncərəni Bağlayın</translation>
+<translation id="3266274118485960573">Təhlükəsizlik yoxlanışı icra olunur.</translation>
 <translation id="3267726687589094446">Çoxsaylı faylların avtomatik endirilməsinə icazə verməyə davam edin</translation>
 <translation id="3268451620468152448">Panelləri Açın</translation>
 <translation id="3269069891205016797">Hesabdan çıxarkən məlumatınız bu cihazdan silinəcək.</translation>
@@ -1803,6 +1804,7 @@
 <translation id="3412265149091626468">Seçimə Keçin</translation>
 <translation id="3413122095806433232">CA emitentləri: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Ölçü:</translation>
+<translation id="3416468988018290825">Həmişə tam URL'ləri göstərin</translation>
 <translation id="3420501302812554910">Daxili təhlükəsizlik açarı sıfırlanma tələb edir</translation>
 <translation id="3421387094817716717">Oval Əyrisi İctimai Açarı</translation>
 <translation id="3422291238483866753">Sayt ətrafınızdakı sahələrin 3D xəritəsini yaratmaq və ya kamera mövqeyini izləmək istədikdə icazə tələb edin (tövsiyə edilir)</translation>
@@ -4155,6 +4157,7 @@
 <translation id="6586451623538375658">Əsas siçan düyməsini Swap</translation>
 <translation id="6586604979641883411">Linux'u təkmilləşdirmək üçün yaddaşda minimum <ph name="REQUIRED_SPACE" /> boş yer tələb edilir. Cihazda yer boşaldın və yenidən cəhd edin.</translation>
 <translation id="6588043302623806746">Güvənli DNS yoxdur</translation>
+<translation id="659005207229852190">Təhlükəsizlik yoxlanışı tamamlanıb.</translation>
 <translation id="6590458744723262880">Qovluq adını dəyişin</translation>
 <translation id="6592267180249644460">WebRTC <ph name="WEBRTC_LOG_CAPTURE_TIME" /> çəkdi</translation>
 <translation id="6592808042417736307">Barmaq iziniz qeydə alınıb</translation>
@@ -5413,6 +5416,7 @@
 <translation id="8249672078237421304">Anladığınız dildə olmayan səhifələrin tərcüməsini təklif edin</translation>
 <translation id="8251441930213048644">İndi yeniləyin</translation>
 <translation id="8251578425305135684">Eskiz silindi.</translation>
+<translation id="825238165904109940">Həmişə Tam URL'ləri Göstərin</translation>
 <translation id="8252569384384439529">Yüklənir...</translation>
 <translation id="8253198102038551905">Şəbəkə xüsusiyyətlərini əldə etmək üçün '+' klikləyin</translation>
 <translation id="8254954272268479918">Linux'u (Beta) bağlayın</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 2ca4ca7..62f78cb 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Шрыфт без засечак</translation>
 <translation id="3264582393905923483">Кантэкст</translation>
 <translation id="3265459715026181080">Закрыць акно</translation>
+<translation id="3266274118485960573">Праверка бяспекі выконваецца.</translation>
 <translation id="3267726687589094446">І далей дазваляць аўтаматычнае спампоўванне некалькіх файлаў</translation>
 <translation id="3268451620468152448">Адкрытыя ўкладкі</translation>
 <translation id="3269069891205016797">Ваша інфармацыя будзе выдалена з прылады, калі вы выйдзеце.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Перайсці да вылучэння</translation>
 <translation id="3413122095806433232">Выдаўцы ЦС: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Памер:</translation>
+<translation id="3416468988018290825">Заўсёды паказваць поўныя URL-адрасы</translation>
 <translation id="3420501302812554910">Неабходна скінуць унутраны ключ бяспекі</translation>
 <translation id="3421387094817716717">Эліптычны адкрыты ключ</translation>
 <translation id="3422291238483866753">Пытацца, калі сайт запытвае дазвол стварыць 3D-карту вашага асяроддзя і адсочваць становішча камеры (рэкамендуецца)</translation>
@@ -3533,7 +3535,7 @@
 <translation id="5734362860645681824">Размовы</translation>
 <translation id="5734697361979786483">Дадаць файлаабменнік</translation>
 <translation id="5736796278325406685">Увядзіце сапраўднае імя карыстальніка</translation>
-<translation id="5739017626473506901">Каб дапамагчы дзіцяці (<ph name="USER_NAME" />) дадаць навучальны ўліковы запіс, увайдзіце</translation>
+<translation id="5739017626473506901">Увайдзіце, каб дапамагчы дзіцяці (<ph name="USER_NAME" />) дадаць навучальны ўліковы запіс</translation>
 <translation id="5739235828260127894">Чаканне спраўджання. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
 <translation id="5739458112391494395">Вельмі вялікі</translation>
 <translation id="574209121243317957">Вышыня голасу</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Змяніць асноўную кнопку мышы</translation>
 <translation id="6586604979641883411">Для абнаўлення сістэмы Linux неабходна мець як мінімум <ph name="REQUIRED_SPACE" />. Вызваліце месца на прыладзе і паўтарыце спробу.</translation>
 <translation id="6588043302623806746">Выкарыстоўваць абароненую DNS</translation>
+<translation id="659005207229852190">Праверка бяспекі завершана.</translation>
 <translation id="6590458744723262880">Перайменаванне папкі</translation>
 <translation id="6592267180249644460">Журнал WebRTC запісаны <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Адбітак пальца дададзены</translation>
@@ -5423,6 +5426,7 @@
 <translation id="8249672078237421304">Прапаноўваць перакладаць старонкі на мовах, якія вы не ведаеце</translation>
 <translation id="8251441930213048644">Абнавіць</translation>
 <translation id="8251578425305135684">Мініяцюра выдалена.</translation>
+<translation id="825238165904109940">Заўсёды паказваць поўныя URL-адрасы</translation>
 <translation id="8252569384384439529">Ідзе запампоўванне...</translation>
 <translation id="8253198102038551905">Націсніце "+", каб праглядзець параметры сеткі</translation>
 <translation id="8254954272268479918">Выключыць Linux (бэта-версія)</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 1ca996d..3b083eef 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1700,6 +1700,7 @@
 <translation id="3264544094376351444">Безсерифен шрифт</translation>
 <translation id="3264582393905923483">Контекст</translation>
 <translation id="3265459715026181080">Затваряне на прозореца</translation>
+<translation id="3266274118485960573">Извършва се проверка на безопасността.</translation>
 <translation id="3267726687589094446">Автоматичното изтегляне на няколко файла да остане разрешено</translation>
 <translation id="3268451620468152448">Отворени раздели</translation>
 <translation id="3269069891205016797">Информацията ви ще бъде премахната от устройството, когато излезете от профила си.</translation>
@@ -1805,6 +1806,7 @@
 <translation id="3412265149091626468">Преминаване към избраното</translation>
 <translation id="3413122095806433232">Издатели сертифициращи органи: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Размер:</translation>
+<translation id="3416468988018290825">Пълните URL адреси да се показват винаги</translation>
 <translation id="3420501302812554910">Вътрешният ключ за сигурност трябва да бъде нулиран</translation>
 <translation id="3421387094817716717">Публичен ключ за алгоритъм, основан на елиптични криви</translation>
 <translation id="3422291238483866753">Извеждане на запитване, когато сайт иска да създаде триизмерна карта на заобикалящата ви среда или да следи позицията на камерата (препоръчително)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Да се размени основният бутон на мишката</translation>
 <translation id="6586604979641883411">За надстройването на Linux е необходимо свободно дисково пространство от поне <ph name="REQUIRED_SPACE" />. Моля, освободете място на устройството си и опитайте отново.</translation>
 <translation id="6588043302623806746">Използване на сигурен DNS</translation>
+<translation id="659005207229852190">Проверката на безопасността завърши.</translation>
 <translation id="6590458744723262880">Преименуване на папка</translation>
 <translation id="6592267180249644460">Записан е регистрационен файл за WebRTC: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Отпечатъкът ви бе записан</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Извеждане на предложение за превод на страниците, които не са на четим от вас език</translation>
 <translation id="8251441930213048644">Опресняване сега</translation>
 <translation id="8251578425305135684">Миниизображението е премахнато.</translation>
+<translation id="825238165904109940">Пълните URL адреси да се показват винаги</translation>
 <translation id="8252569384384439529">Качва се...</translation>
 <translation id="8253198102038551905">Кликнете върху „+“, за да получите свойствата на мрежата</translation>
 <translation id="8254954272268479918">Изключване на Linux (бета)</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 1c6596b..9969346 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -680,7 +680,7 @@
 <translation id="1887850431809612466">Revisió de maquinari</translation>
 <translation id="1890674179660343635">&lt;span&gt;Identificador: &lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
 <translation id="189210018541388520">Obre en pantalla completa</translation>
-<translation id="1892341345406963517">Hola, <ph name="PARENT_NAME" />,</translation>
+<translation id="1892341345406963517">Hola, <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">Altres idiomes</translation>
 <translation id="1895252664692693738">Temps restant: <ph name="TIME_LEFT" /></translation>
 <translation id="1895658205118569222">Aturada</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index c22681e..0a1dc29 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1702,6 +1702,7 @@
 <translation id="3264544094376351444">Bezpatkové písmo</translation>
 <translation id="3264582393905923483">Kontext</translation>
 <translation id="3265459715026181080">Zavřít okno</translation>
+<translation id="3266274118485960573">Bezpečnostní kontrola je spuštěna.</translation>
 <translation id="3267726687589094446">I nadále povolovat automatické stahování několika souborů</translation>
 <translation id="3268451620468152448">Otevřené karty</translation>
 <translation id="3269069891205016797">Když se odhlásíte, budou vaše informace ze zařízení odstraněny.</translation>
@@ -1807,6 +1808,7 @@
 <translation id="3412265149091626468">Přejít na výběr</translation>
 <translation id="3413122095806433232">Vydavatelé CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Velikost:</translation>
+<translation id="3416468988018290825">Vždy zobrazovat úplné adresy URL</translation>
 <translation id="3420501302812554910">Interní bezpečnostní klíč je potřeba resetovat</translation>
 <translation id="3421387094817716717">Veřejný klíč založený na eliptické křivce</translation>
 <translation id="3422291238483866753">Zeptat se, když chce web vytvořit 3D mapu vašeho okolí nebo sledovat polohu kamery</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">Zaměnit primární tlačítko myši</translation>
 <translation id="6586604979641883411">K upgradování Linuxu je potřeba alespoň <ph name="REQUIRED_SPACE" /> volného místa na disku. Uvolněte v zařízení nějaké místo a zkuste to znovu.</translation>
 <translation id="6588043302623806746">Používat zabezpečené DNS</translation>
+<translation id="659005207229852190">Bezpečnostní kontrola byla dokončena.</translation>
 <translation id="6590458744723262880">Přejmenovat složku</translation>
 <translation id="6592267180249644460">Protokol WebRTC zaznamenaný <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Otisk prstu byl sejmut</translation>
@@ -5421,6 +5424,7 @@
 <translation id="8249672078237421304">Nabízet překlad stránek v jazycích, kterým byste nemuseli rozumět</translation>
 <translation id="8251441930213048644">Obnovit</translation>
 <translation id="8251578425305135684">Miniatura byla odstraněna.</translation>
+<translation id="825238165904109940">Vždy zobrazovat úplné adresy URL</translation>
 <translation id="8252569384384439529">Nahrávání...</translation>
 <translation id="8253198102038551905">Vlastnosti sítě otevřete kliknutím na +.</translation>
 <translation id="8254954272268479918">Ukončit Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 6f3b5bd..b17d3bc 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-serif-skrifttype</translation>
 <translation id="3264582393905923483">Kontekst</translation>
 <translation id="3265459715026181080">Luk vindue</translation>
+<translation id="3266274118485960573">Der udføres et sikkerhedstjek.</translation>
 <translation id="3267726687589094446">Fortsæt med at tillade automatiske downloads af flere filer</translation>
 <translation id="3268451620468152448">Åbne faner</translation>
 <translation id="3269069891205016797">Dine oplysninger fjernes fra enheden, når du logger ud.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Hop til valg</translation>
 <translation id="3413122095806433232">CA-udstedere: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Størrelse:</translation>
+<translation id="3416468988018290825">Vis altid komplette webadresser</translation>
 <translation id="3420501302812554910">Den interne sikkerhedsnøgle skal nulstilles</translation>
 <translation id="3421387094817716717">Offentlig nøgle med elliptisk kurve</translation>
 <translation id="3422291238483866753">Spørg, når et website gerne vil oprette et 3D-kort over dine omgivelser eller registrere kamerapositionen (anbefales)</translation>
@@ -4165,6 +4167,7 @@
 <translation id="6586451623538375658">Skift primær museknap</translation>
 <translation id="6586604979641883411">Der kræves mindst <ph name="REQUIRED_SPACE" /> ledig diskplads for at opgradere Linux. Frigør mere plads på din enhed, og prøv igen.</translation>
 <translation id="6588043302623806746">Brug et sikkert DNS</translation>
+<translation id="659005207229852190">Sikkerhedstjekket blev udført.</translation>
 <translation id="6590458744723262880">Omdøb mappe</translation>
 <translation id="6592267180249644460">WebRTC-logfil blev registreret <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Dit fingeraftryk blev registreret</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Tilbyd at oversætte sider, der ikke er på et sprog, du kan læse</translation>
 <translation id="8251441930213048644">Opdater nu</translation>
 <translation id="8251578425305135684">Miniaturen blev fjernet.</translation>
+<translation id="825238165904109940">Vis altid komplette webadresser</translation>
 <translation id="8252569384384439529">Uploader…</translation>
 <translation id="8253198102038551905">Klik på "+" for at få vist netværksegenskaber</translation>
 <translation id="8254954272268479918">Luk Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 2c30403..c48f44d 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1699,6 +1699,7 @@
 <translation id="3264544094376351444">Schriftart Sans-Serif</translation>
 <translation id="3264582393905923483">Kontext</translation>
 <translation id="3265459715026181080">Fenster schließen</translation>
+<translation id="3266274118485960573">Der Sicherheitscheck wird ausgeführt.</translation>
 <translation id="3267726687589094446">Weiterhin automatisches Herunterladen mehrerer Dateien zulassen</translation>
 <translation id="3268451620468152448">Geöffnete Tabs</translation>
 <translation id="3269069891205016797">Ihre Daten werden von dem Gerät entfernt, wenn Sie sich abmelden.</translation>
@@ -1804,6 +1805,7 @@
 <translation id="3412265149091626468">Auswahl anzeigen</translation>
 <translation id="3413122095806433232">Aussteller von Zertifizierungsstellen: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Größe:</translation>
+<translation id="3416468988018290825">Immer vollständige URLs anzeigen</translation>
 <translation id="3420501302812554910">Interner Sicherheitsschlüssel muss zurückgesetzt werden</translation>
 <translation id="3421387094817716717">Öffentlicher Schlüssel für elliptische Kurven</translation>
 <translation id="3422291238483866753">Nachfragen, wenn eine Website eine 3D-Karte meiner Umgebung erstellen oder die Kameraposition verfolgen möchte (empfohlen)</translation>
@@ -2748,7 +2750,7 @@
 <translation id="4660540330091848931">Größenanpassung läuft</translation>
 <translation id="4660838440047236328">der Grundriss Ihres Zimmers</translation>
 <translation id="4661407454952063730">App-Daten können alle Daten sein, die eine App aufgrund der Einstellungen des Entwicklers gespeichert hat, wie z. B. Kontakte, Nachrichten und Fotos.</translation>
-<translation id="4661931051827810091">Sendet anonyme URLs einiger von Ihnen besuchter Seiten, eingeschränkte Systemdaten und einige Seiteninhalte, um neue Bedrohungen für alle Nutzer im Internet erkennen und blockieren zu können.</translation>
+<translation id="4661931051827810091">Sendet URLs einiger von Ihnen besuchter Seiten, eingeschränkte Systemdaten und einige Seiteninhalte, um neue Bedrohungen für alle Nutzer im Internet erkennen und blockieren zu können.</translation>
 <translation id="4662788913887017617">Dieses Lesezeichen für mein iPhone freigeben</translation>
 <translation id="4663373278480897665">Kameranutzung zulässig</translation>
 <translation id="4664482161435122549">PKCS #12 - Fehler beim Export</translation>
@@ -4160,6 +4162,7 @@
 <translation id="6586451623538375658">Primäre Maustaste tauschen</translation>
 <translation id="6586604979641883411">Für das Linux-Upgrade sind mindestens <ph name="REQUIRED_SPACE" /> freier Speicherplatz erforderlich. Geben Sie etwas Speicherplatz auf Ihrem Gerät frei und versuchen Sie es noch einmal.</translation>
 <translation id="6588043302623806746">Sicheres DNS verwenden</translation>
+<translation id="659005207229852190">Der Sicherheitscheck wurde abgeschlossen.</translation>
 <translation id="6590458744723262880">Ordner umbenennen</translation>
 <translation id="6592267180249644460">WebRTC-Protokoll erfasst am <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Ihr Fingerabdruck wurde erfasst</translation>
@@ -5419,6 +5422,7 @@
 <translation id="8249672078237421304">Übersetzung von fremdsprachigen Seiten anbieten</translation>
 <translation id="8251441930213048644">Jetzt aktualisieren</translation>
 <translation id="8251578425305135684">Miniaturansicht wurde entfernt.</translation>
+<translation id="825238165904109940">Immer vollständige URLs anzeigen</translation>
 <translation id="8252569384384439529">Wird hochgeladen…</translation>
 <translation id="8253198102038551905">Auf "+" klicken, um die Netzwerkeigenschaften anzuzeigen</translation>
 <translation id="8254954272268479918">Linux (Beta) herunterfahren</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 06f0f180..dd93517 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1700,6 +1700,7 @@
 <translation id="3264544094376351444">Fuente Sans-serif</translation>
 <translation id="3264582393905923483">Contexto</translation>
 <translation id="3265459715026181080">Cerrar ventana</translation>
+<translation id="3266274118485960573">Se está ejecutando la verificación de seguridad.</translation>
 <translation id="3267726687589094446">Seguir permitiendo las descargas automáticas de varios archivos</translation>
 <translation id="3268451620468152448">Pestañas abiertas</translation>
 <translation id="3269069891205016797">Se quitará tu información del dispositivo cuando salgas.</translation>
@@ -1805,6 +1806,7 @@
 <translation id="3412265149091626468">Saltar a selección</translation>
 <translation id="3413122095806433232">Emisores de certificados: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Tamaño:</translation>
+<translation id="3416468988018290825">Mostrar siempre las URL completas</translation>
 <translation id="3420501302812554910">Debe restablecerse la llave de seguridad interna</translation>
 <translation id="3421387094817716717">Clave pública de curva elíptica</translation>
 <translation id="3422291238483866753">Preguntar cuando un sitio desee crear un mapa 3D de tu entorno o hacer un seguimiento de la posición de la cámara (recomendado)</translation>
@@ -4161,6 +4163,7 @@
 <translation id="6586451623538375658">Cambiar el botón principal del mouse</translation>
 <translation id="6586604979641883411">Para actualizar Linux, debes contar con, al menos, <ph name="REQUIRED_SPACE" /> de espacio libre en disco. Libera espacio de tu dispositivo y vuelve a intentarlo.</translation>
 <translation id="6588043302623806746">Usar DNS seguro</translation>
+<translation id="659005207229852190">Se completó la verificación de seguridad.</translation>
 <translation id="6590458744723262880">Cambiar nombre de carpeta</translation>
 <translation id="6592267180249644460">Fecha y hora de captura de registro de WebRTC: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Se capturó tu huella digital</translation>
@@ -5421,6 +5424,7 @@
 <translation id="8249672078237421304">Preguntarme si quiero traducir páginas que no estén en un idioma que puedo leer</translation>
 <translation id="8251441930213048644">Actualizar ahora</translation>
 <translation id="8251578425305135684">Miniatura eliminada.</translation>
+<translation id="825238165904109940">Mostrar siempre las URL completas</translation>
 <translation id="8252569384384439529">Subiendo…</translation>
 <translation id="8253198102038551905">Haz clic en "+" para ver las propiedades de red.</translation>
 <translation id="8254954272268479918">Cerrar Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index de53270a..86b37eb 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-serif letra</translation>
 <translation id="3264582393905923483">Testuingurua</translation>
 <translation id="3265459715026181080">Itxi leihoa</translation>
+<translation id="3266274118485960573">Abian da segurtasun-egiaztapena.</translation>
 <translation id="3267726687589094446">Jarraitu baimentzen fitxategi ugariren deskarga automatikoak</translation>
 <translation id="3268451620468152448">Ireki fitxak</translation>
 <translation id="3269069891205016797">Zure informazioa gailutik kenduko da saioa amaitzen duzunean.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Egin salto hautapenera</translation>
 <translation id="3413122095806433232">Autoritate ziurtagiri-emaileen jaulkitzaileak: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Tamaina:</translation>
+<translation id="3416468988018290825">Erakutsi beti URL osoak</translation>
 <translation id="3420501302812554910">Barneko segurtasun-giltza berrezarri egin behar da</translation>
 <translation id="3421387094817716717">Kurba eliptikoko gako publikoa</translation>
 <translation id="3422291238483866753">Eskatu zure baimena webguneren batek inguruaren 3D mapa bat sortu edo kameraren posizioaren jarraipena egin nahi duenean (gomendatua)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Aldatu saguaren botoi nagusia</translation>
 <translation id="6586604979641883411">Gutxienez <ph name="REQUIRED_SPACE" /> izan behar dituzu libre Linux bertsio-berritzeko. Egin tokia gailuan eta saiatu berriro.</translation>
 <translation id="6588043302623806746">Erabili DNS segurua</translation>
+<translation id="659005207229852190">Amaitu da segurtasun-egiaztapena.</translation>
 <translation id="6590458744723262880">Aldatu karpetaren izena</translation>
 <translation id="6592267180249644460">WebRTC erregistroa egin da (<ph name="WEBRTC_LOG_CAPTURE_TIME" />)</translation>
 <translation id="6592808042417736307">Gehitu da hatz-marka</translation>
@@ -5423,6 +5426,7 @@
 <translation id="8249672078237421304">Eskaini zeure burua beste hizkuntzetan idatzitako orriak itzultzeko</translation>
 <translation id="8251441930213048644">Freskatu</translation>
 <translation id="8251578425305135684">Irudi txikia kendu egin da.</translation>
+<translation id="825238165904109940">Erakutsi beti URL osoak</translation>
 <translation id="8252569384384439529">Kargatzen…</translation>
 <translation id="8253198102038551905">Sakatu "+" sarearen propietateak ikusteko</translation>
 <translation id="8254954272268479918">Itxi Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 4ad1b68..314faa1 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1700,6 +1700,7 @@
 <translation id="3264544094376351444">‏قلم Sans-Serif</translation>
 <translation id="3264582393905923483">زمینه</translation>
 <translation id="3265459715026181080">بستن پنجره</translation>
+<translation id="3266274118485960573">«بررسی ایمنی» درحال اجرا است.</translation>
 <translation id="3267726687589094446">ادامه اجازه بارگیری خودکار چند فایل</translation>
 <translation id="3268451620468152448">برگه‌های باز</translation>
 <translation id="3269069891205016797">با خروج از سیستم، اطلاعات شما پاک می‌شوند.</translation>
@@ -1805,6 +1806,7 @@
 <translation id="3412265149091626468">پرش به انتخاب</translation>
 <translation id="3413122095806433232">‏صادرکنندگان CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">اندازه:</translation>
+<translation id="3416468988018290825">همیشه نشانی‌های وب کامل نشان داده شود</translation>
 <translation id="3420501302812554910">کلید امنیتی داخلی باید بازنشانی شود</translation>
 <translation id="3421387094817716717">کلید عمومی منحنی بیضوی</translation>
 <translation id="3422291238483866753">وقتی سایتی می‌خواهد نقشه سه‌بعدی از محیط ایجاد کند یا موقعیت دوربین را ردیابی کند سؤال شود (توصیه می‌شود)</translation>
@@ -4161,6 +4163,7 @@
 <translation id="6586451623538375658">جابجایی دکمه اصلی ماوس</translation>
 <translation id="6586604979641883411">‏برای ارتقای Linux، حداقل <ph name="REQUIRED_SPACE" /> فضای آزاد دیسک لازم است. لطفاً مقداری فضا در دستگاه آزاد کنید و دوباره امتحان کنید.</translation>
 <translation id="6588043302623806746">‏استفاده از DNS ایمن</translation>
+<translation id="659005207229852190">«بررسی ایمنی» کامل شده است.</translation>
 <translation id="6590458744723262880">تغییر نام پوشه</translation>
 <translation id="6592267180249644460">‏زمان ثبت گزارش WebRTC ‏<ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">اثرانگشت ثبت شد</translation>
@@ -5421,6 +5424,7 @@
 <translation id="8249672078237421304">پیشنهاد ترجمه برای صفحه‌هایی که زبان آن‌ها را نمی‌دانم</translation>
 <translation id="8251441930213048644">بازخوانی در همین لحظه</translation>
 <translation id="8251578425305135684">تصویر کوچک حذف شد.</translation>
+<translation id="825238165904109940">همیشه نشانی‌های وب کامل نشان داده شود</translation>
 <translation id="8252569384384439529">درحال بارگذاری…</translation>
 <translation id="8253198102038551905">روی «+» کلیک کنید تا مشخصات شبکه را دریافت کنید</translation>
 <translation id="8254954272268479918">‏خاموش کردن Linux (بتا)</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index a5e2db6..69aa25b 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-Serif-fontti</translation>
 <translation id="3264582393905923483">Konteksti</translation>
 <translation id="3265459715026181080">Sulje ikkuna</translation>
+<translation id="3266274118485960573">Turvatarkistus on käynnissä.</translation>
 <translation id="3267726687589094446">Salli edelleen useiden tiedostojen automaattinen lataaminen</translation>
 <translation id="3268451620468152448">Avoimet välilehdet</translation>
 <translation id="3269069891205016797">Tietosi poistetaan laitteelta, kun kirjaudut ulos.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Siirry valintaan</translation>
 <translation id="3413122095806433232">Varmenteiden myöntäjät: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Koko:</translation>
+<translation id="3416468988018290825">Näytä aina täydet URL-osoitteet</translation>
 <translation id="3420501302812554910">Sisäinen suojausavain on nollattava</translation>
 <translation id="3421387094817716717">Julkinen avain: elliptinen käyrä</translation>
 <translation id="3422291238483866753">Kysy aina, kun sivusto pyytää lupaa luoda 3D-kartan ympäristöstäsi tai seurata kameran asentoa (suositus)</translation>
@@ -4163,6 +4165,7 @@
 <translation id="6586451623538375658">Vaihda hiiren ykköspainiketta</translation>
 <translation id="6586604979641883411">Linuxin päivittämiseen tarvitaan vähintään <ph name="REQUIRED_SPACE" /> vapaata levytilaa. Vapauta laitteelta tilaa ja yritä uudelleen.</translation>
 <translation id="6588043302623806746">Käytä suojattua DNS:ää</translation>
+<translation id="659005207229852190">Turvatarkistus on valmis.</translation>
 <translation id="6590458744723262880">Nimeä kansio uudelleen</translation>
 <translation id="6592267180249644460">WebRTC-loki kaapattiin <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Sormenjälkesi tallennettiin</translation>
@@ -5422,6 +5425,7 @@
 <translation id="8249672078237421304">Tarjoa käännöstä muunkielisille sivuille</translation>
 <translation id="8251441930213048644">Päivitä nyt</translation>
 <translation id="8251578425305135684">Pikkukuva poistettu.</translation>
+<translation id="825238165904109940">Näytä aina täydet URL-osoitteet</translation>
 <translation id="8252569384384439529">Ladataan…</translation>
 <translation id="8253198102038551905">Tarkastele verkon ominaisuuksia klikkaamalla +</translation>
 <translation id="8254954272268479918">Sammuta Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 9d70c971..a41fd28 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-serif font</translation>
 <translation id="3264582393905923483">Konteksto</translation>
 <translation id="3265459715026181080">Close Window</translation>
+<translation id="3266274118485960573">Tumatakbo ang pag-check sa kaligtasan.</translation>
 <translation id="3267726687589094446">Patuloy na payagan ang mga awtomatikong pagda-download ng maraming file</translation>
 <translation id="3268451620468152448">Mga Bukas na Tab</translation>
 <translation id="3269069891205016797">Aalisin sa device ang iyong impormasyon kapag nag-sign out ka.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Jump to Selection</translation>
 <translation id="3413122095806433232">Mga Nagbigay ng CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Laki:</translation>
+<translation id="3416468988018290825">Palaging ipakita ang mga buong URL</translation>
 <translation id="3420501302812554910">Nangangailangan ng pag-reset ang internal na security key</translation>
 <translation id="3421387094817716717">Elliptic Curve Public Key</translation>
 <translation id="3422291238483866753">Magtanong kapag gusto ng isang site na gumawa ng 3D na mapa ng iyong kapaligiran o subaybayan ang posisyon ng camera (inirerekomenda)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Palitan ang pangunahing button ng mouse</translation>
 <translation id="6586604979641883411">Hindi bababa sa <ph name="REQUIRED_SPACE" /> na bakanteng espasyo sa disk ang kinakailangan para ma-upgrade ang Linux. Magbakante ng ilang espasyo sa iyong device at subukan ulit.</translation>
 <translation id="6588043302623806746">Gamitin ang secure na DNS</translation>
+<translation id="659005207229852190">Tapos na ang pag-check sa kaligtasan.</translation>
 <translation id="6590458744723262880">Palitan ang pangalan ng folder</translation>
 <translation id="6592267180249644460">Na-capture ang log ng WebRTC noong <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Na-capture na ang iyong fingerprint</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Mag-alok na isalin ang mga page na wala sa wikang nababasa mo</translation>
 <translation id="8251441930213048644">I-refresh ngayon</translation>
 <translation id="8251578425305135684">Naalis ang thumbnail.</translation>
+<translation id="825238165904109940">Palaging Ipakita ang Mga Buong URL</translation>
 <translation id="8252569384384439529">Ina-upload...</translation>
 <translation id="8253198102038551905">I-click '+' upang makita ang mga property ng network</translation>
 <translation id="8254954272268479918">I-shut down ang Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 4c7c23c4..467a970 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1704,6 +1704,7 @@
 <translation id="3264544094376351444">Polices sans empattement</translation>
 <translation id="3264582393905923483">Contexte</translation>
 <translation id="3265459715026181080">Fermer la fenêtre</translation>
+<translation id="3266274118485960573">La vérification de sécurité est en cours d'exécution.</translation>
 <translation id="3267726687589094446">Continuer à autoriser les téléchargements automatiques de plusieurs fichiers</translation>
 <translation id="3268451620468152448">Onglets ouverts</translation>
 <translation id="3269069891205016797">Vos données seront supprimées de l'appareil lors de la déconnexion.</translation>
@@ -1809,6 +1810,7 @@
 <translation id="3412265149091626468">Aller à la sélection</translation>
 <translation id="3413122095806433232">Émetteurs de l'autorité de certification : <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Taille :</translation>
+<translation id="3416468988018290825">Toujours afficher les URL en entier</translation>
 <translation id="3420501302812554910">La clé de sécurité interne doit être réinitialisée</translation>
 <translation id="3421387094817716717">Clé publique à courbe elliptique</translation>
 <translation id="3422291238483866753">Demander une autorisation lorsqu'un site veut créer une carte 3D de votre environnement ou faire le suivi de la position de l'appareil photo (recommandé)</translation>
@@ -4165,6 +4167,7 @@
 <translation id="6586451623538375658">Inverser les boutons de la souris</translation>
 <translation id="6586604979641883411">Un minimum de <ph name="REQUIRED_SPACE" /> d'espace est requis pour effectuer la mise à niveau de Linux. Veuillez libérer de l'espace sur votre appareil et réessayer.</translation>
 <translation id="6588043302623806746">Utiliser un DNS sécurisé</translation>
+<translation id="659005207229852190">La vérification de sécurité est terminée.</translation>
 <translation id="6590458744723262880">Renommer le dossier</translation>
 <translation id="6592267180249644460">Date de création du journal WebRTC : <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Votre empreinte digitale a été capturée</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Me proposer de traduire les pages qui sont écrites dans une langue que je ne sais pas lire</translation>
 <translation id="8251441930213048644">Actualiser maintenant</translation>
 <translation id="8251578425305135684">Miniature supprimée.</translation>
+<translation id="825238165904109940">Toujours afficher les URL en entier</translation>
 <translation id="8252569384384439529">Téléversement en cours…</translation>
 <translation id="8253198102038551905">Cliquez sur « + » pour afficher les propriétés du réseau</translation>
 <translation id="8254954272268479918">Arrêter Linux (bêta)</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 4874033..6b6f61eb 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Police Sans Serif</translation>
 <translation id="3264582393905923483">Contexte</translation>
 <translation id="3265459715026181080">Fermer la fenêtre</translation>
+<translation id="3266274118485960573">Contrôle de sécurité en cours.</translation>
 <translation id="3267726687589094446">Continuer à autoriser le téléchargement automatique de plusieurs fichiers</translation>
 <translation id="3268451620468152448">Onglets ouverts</translation>
 <translation id="3269069891205016797">Les informations vous concernant seront supprimées de cet appareil dès votre déconnexion.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Aller à la sélection</translation>
 <translation id="3413122095806433232">Émetteurs de l'autorité de certification : <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Taille :</translation>
+<translation id="3416468988018290825">Toujours afficher les URL en entier</translation>
 <translation id="3420501302812554910">Une réinitialisation est requise pour la clé de sécurité interne</translation>
 <translation id="3421387094817716717">Clé publique de la courbe elliptique</translation>
 <translation id="3422291238483866753">Vous demander votre avis lorsqu'un site souhaite créer un plan 3D de votre environnement ou suivre la position de la caméra (recommandé)</translation>
@@ -4165,6 +4167,7 @@
 <translation id="6586451623538375658">Inverser le bouton principal de la souris</translation>
 <translation id="6586604979641883411">Vous devez disposer d'au moins <ph name="REQUIRED_SPACE" /> d'espace disque libre pour mettre à niveau Linux. Veuillez libérer de l'espace sur l'appareil, puis réessayer.</translation>
 <translation id="6588043302623806746">Utiliser un DNS sécurisé</translation>
+<translation id="659005207229852190">Contrôle de sécurité terminé.</translation>
 <translation id="6590458744723262880">Renommer le dossier</translation>
 <translation id="6592267180249644460">Date et heure de création du journal WebRTC : <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Votre empreinte a bien été enregistrée</translation>
@@ -5425,6 +5428,7 @@
 <translation id="8249672078237421304">Me proposer de traduire les pages qui sont écrites dans une langue que je ne connais pas</translation>
 <translation id="8251441930213048644">Actualiser</translation>
 <translation id="8251578425305135684">Miniature supprimée</translation>
+<translation id="825238165904109940">Toujours afficher les URL en entier</translation>
 <translation id="8252569384384439529">Importation…</translation>
 <translation id="8253198102038551905">Cliquez sur "+" pour accéder aux propriétés réseau.</translation>
 <translation id="8254954272268479918">Arrêter Linux (bêta)</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 85a32c6..e0e829d 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1702,6 +1702,7 @@
 <translation id="3264544094376351444">Tipo de letra sen serifas</translation>
 <translation id="3264582393905923483">Contexto</translation>
 <translation id="3265459715026181080">Pechar ventá</translation>
+<translation id="3266274118485960573">Estase executando a Revisión de seguranza.</translation>
 <translation id="3267726687589094446">Continuar permitindo as descargas automáticas de varios ficheiros</translation>
 <translation id="3268451620468152448">Pestanas abertas</translation>
 <translation id="3269069891205016797">Cando peches sesión quitarase do dispositivo a túa información.</translation>
@@ -1807,6 +1808,7 @@
 <translation id="3412265149091626468">Saltar á selección</translation>
 <translation id="3413122095806433232">Emisores de CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Tamaño:</translation>
+<translation id="3416468988018290825">Mostrar sempre URL completos</translation>
 <translation id="3420501302812554910">É necesario restablecer a chave de seguranza interna</translation>
 <translation id="3421387094817716717">Clave pública de Elliptic Curve</translation>
 <translation id="3422291238483866753">Preguntar cando un sitio queira crear un mapa 3D do que te rodea e facer un seguimento da posición da cámara (recomendado)</translation>
@@ -4163,6 +4165,7 @@
 <translation id="6586451623538375658">Cambiar botón principal do rato</translation>
 <translation id="6586604979641883411">É necesario ter polo menos <ph name="REQUIRED_SPACE" /> de espazo libre no disco para poder actualizar Linux. Libera espazo no dispositivo e téntao de novo.</translation>
 <translation id="6588043302623806746">Usar DNS seguro</translation>
+<translation id="659005207229852190">Completouse a Revisión de seguranza.</translation>
 <translation id="6590458744723262880">Cambiar o nome do cartafol</translation>
 <translation id="6592267180249644460">Rexistro WebRTC capturado <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Capturouse a túa impresión dixital</translation>
@@ -5422,6 +5425,7 @@
 <translation id="8249672078237421304">Preguntar se queres traducir páxinas que non estean escritas nun idioma que entendas</translation>
 <translation id="8251441930213048644">Actualizar agora</translation>
 <translation id="8251578425305135684">Miniatura eliminada.</translation>
+<translation id="825238165904109940">Mostrar sempre URL completos</translation>
 <translation id="8252569384384439529">Cargando…</translation>
 <translation id="8253198102038551905">Facer clic en "+" para obter as propiedades da rede</translation>
 <translation id="8254954272268479918">Pechar Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 74e7933..0010ddef 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-serif फ़ॉन्ट</translation>
 <translation id="3264582393905923483">प्रसंग</translation>
 <translation id="3265459715026181080">विंडो बंद करें</translation>
+<translation id="3266274118485960573">सुरक्षा जांच हो रही है.</translation>
 <translation id="3267726687589094446">एकाधिक फ़ाइलों के स्वचालित डाउनलोड की अनुमति देना जारी रखें</translation>
 <translation id="3268451620468152448">खुले सत्र</translation>
 <translation id="3269069891205016797">आपके प्रस्थान करने पर आपकी जानकारी इस डिवाइस से निकाल दी जाएगी.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">चुनें पर जाएं</translation>
 <translation id="3413122095806433232">CA जारीकर्ता: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">आकार:</translation>
+<translation id="3416468988018290825">हमेशा पूरे यूआरएल दिखाएं</translation>
 <translation id="3420501302812554910">अंदरूनी सुरक्षा कुंजी को रीसेट करने की ज़रूरत है</translation>
 <translation id="3421387094817716717">अंडाकार वक्र वाली सार्वजनिक कुंजी</translation>
 <translation id="3422291238483866753">जब कोई साइट आपके आस-पास की जगह का 3D मैप बनाना या कैमरे की स्थिति ट्रैक करना चाहे, तो इसके लिए पूछें (सुझाया गया)</translation>
@@ -4163,6 +4165,7 @@
 <translation id="6586451623538375658">प्राथमिक माउस बटन स्वैप करें</translation>
 <translation id="6586604979641883411">Linux अपग्रेड करने के लिए, डिस्क में कम से कम <ph name="REQUIRED_SPACE" /> खाली जगह होनी चाहिए. कृपया अपने डिवाइस में कुछ जगह खाली करें और फिर से कोशिश करें.</translation>
 <translation id="6588043302623806746">सुरक्षित डीएनएस इस्तेमाल करें</translation>
+<translation id="659005207229852190">सुरक्षा जांच पूरी हो गई.</translation>
 <translation id="6590458744723262880">फ़ोल्‍डर का नाम बदलें</translation>
 <translation id="6592267180249644460">WebRTC लॉग कैप्चर किया गया <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">आपका फ़िंगरप्रिंट कैप्चर कर लिया गया</translation>
@@ -5422,6 +5425,7 @@
 <translation id="8249672078237421304">ऐसे पेजों का अनुवाद करना ऑफ़र करें जो उस भाषा में नहीं हैं जिसे आप पढ़ते हैं</translation>
 <translation id="8251441930213048644">अभी रीफ़्रेश करें</translation>
 <translation id="8251578425305135684">थंबनेल निकाला गया.</translation>
+<translation id="825238165904109940">हमेशा पूरे यूआरएल दिखाएं</translation>
 <translation id="8252569384384439529">अपलोड हो रही है...</translation>
 <translation id="8253198102038551905">नेटवर्क प्रॉपर्टी पाने के लिए '+' बटन पर क्‍लिक करें</translation>
 <translation id="8254954272268479918">Linux (बीटा) बंद करें</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 3273c43..c1cb961d5 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-serif տառատեսակ</translation>
 <translation id="3264582393905923483">Համատեքստ</translation>
 <translation id="3265459715026181080">Close Window</translation>
+<translation id="3266274118485960573">Անվտանգության ստուգումը դեռ չի ավարտվել։</translation>
 <translation id="3267726687589094446">Շարունակել թույլ տալ բազմակի ֆայլերի ավտոմատ ներբեռնումը</translation>
 <translation id="3268451620468152448">Բաց ներդիրները</translation>
 <translation id="3269069891205016797">Ձեր տեղեկությունները կհեռացվեն սարքից, երբ դուրս գրվեք:</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Jump to Selection</translation>
 <translation id="3413122095806433232">Հավաստագրման կենտրոնի թողարկողներ՝ <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Չափը՝</translation>
+<translation id="3416468988018290825">Միշտ ցույց տալ ամբողջական URL-ները</translation>
 <translation id="3420501302812554910">Անհրաժեշտ է զրոյացնել անվտանգության ներքին բանալու կարգավորումները</translation>
 <translation id="3421387094817716717">Օվալաձև կորի հանրային բանալին</translation>
 <translation id="3422291238483866753">Հարցնել, երբ որևէ կայք ուզում է ստեղծել շրջակայքի եռաչափ քարտեզը և հետագծել տեսախցիկի դիրքը (խորհուրդ է տրվում)</translation>
@@ -4167,6 +4169,7 @@
 <translation id="6586451623538375658">Փոխատեղել մկնիկի կոճակները</translation>
 <translation id="6586604979641883411">Լիինուքսը թարմացնելու համար անհրաժեշտ է առնվազն <ph name="REQUIRED_SPACE" /> տարածք։ Ձեր սարքում տարածք ազատեք և նորից փորձեք։</translation>
 <translation id="6588043302623806746">Օգտագործել ապահով DNS</translation>
+<translation id="659005207229852190">Անվտանգության ստուգումն ավարտվել է։</translation>
 <translation id="6590458744723262880">Պանակի վերանվանում</translation>
 <translation id="6592267180249644460">WebRTC-ի մատյանի պահման ժամանակը՝ <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Մատնահետքն ավելացվեց</translation>
@@ -5425,6 +5428,7 @@
 <translation id="8249672078237421304">Առաջարկել թարգմանել էջերը, որոնք ձեր իմացած լեզուներով չեն</translation>
 <translation id="8251441930213048644">Թարմացնել հիմա</translation>
 <translation id="8251578425305135684">Մանրապատկերը հեռացվել է:</translation>
+<translation id="825238165904109940">Միշտ ցույց տալ ամբողջական URL-ները</translation>
 <translation id="8252569384384439529">Վերբեռնում...</translation>
 <translation id="8253198102038551905">Ցանցի հատկությունները տեսնելու համար սեղմեք «+»</translation>
 <translation id="8254954272268479918">Անջատել Լինուքսը (բետա)</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 984d087..479fe6e 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1701,6 +1701,7 @@
 <translation id="3264544094376351444">Font Sans-serif</translation>
 <translation id="3264582393905923483">Konteks</translation>
 <translation id="3265459715026181080">Tutup Jendela</translation>
+<translation id="3266274118485960573">Pemeriksaan keselamatan sedang berjalan.</translation>
 <translation id="3267726687589094446">Lanjutkan mengizinkan download otomatis beberapa file</translation>
 <translation id="3268451620468152448">Tab Terbuka</translation>
 <translation id="3269069891205016797">Informasi Anda akan dihapus dari perangkat ketika logout.</translation>
@@ -1806,6 +1807,7 @@
 <translation id="3412265149091626468">Lompat ke Pilihan</translation>
 <translation id="3413122095806433232">Penerbit CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Ukuran:</translation>
+<translation id="3416468988018290825">Selalu tampilkan URL lengkap</translation>
 <translation id="3420501302812554910">Kunci keamanan internal perlu disetel ulang</translation>
 <translation id="3421387094817716717">Kunci Publik Kurva Eliptis</translation>
 <translation id="3422291238483866753">Tanyakan saat situs ingin membuat peta 3D untuk area di sekeliling Anda atau melacak posisi kamera (direkomendasikan)</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">Tukar tombol mouse utama</translation>
 <translation id="6586604979641883411">Diperlukan ruang disk kosong minimal sebesar <ph name="REQUIRED_SPACE" /> untuk mengupgrade Linux. Kosongkan ruang di perangkat Anda dan coba lagi.</translation>
 <translation id="6588043302623806746">Gunakan DNS aman</translation>
+<translation id="659005207229852190">Pemeriksaan keselamatan telah selesai.</translation>
 <translation id="6590458744723262880">Ganti nama folder</translation>
 <translation id="6592267180249644460">Log WebRTC direkam pada <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Sidik jari Anda telah direkam</translation>
@@ -5422,6 +5425,7 @@
 <translation id="8249672078237421304">Tanya apakah halaman yang tidak Anda pahami ingin diterjemahkan</translation>
 <translation id="8251441930213048644">Muat ulang sekarang</translation>
 <translation id="8251578425305135684">Gambar kecil dihapus.</translation>
+<translation id="825238165904109940">Selalu Tampilkan URL Lengkap</translation>
 <translation id="8252569384384439529">Mengupload...</translation>
 <translation id="8253198102038551905">Klik '+' untuk mendapatkan properti jaringan</translation>
 <translation id="8254954272268479918">Matikan Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 8d6c30f7..88b9064 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans Serif フォント</translation>
 <translation id="3264582393905923483">コンテキスト</translation>
 <translation id="3265459715026181080">ウインドウを閉じる</translation>
+<translation id="3266274118485960573">安全確認を実行しています。</translation>
 <translation id="3267726687589094446">複数ファイルの自動ダウンロードを今後も許可する</translation>
 <translation id="3268451620468152448">開いているタブ</translation>
 <translation id="3269069891205016797">ログアウトするとデバイスから利用時の情報が削除されます。</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">選択部分へジャンプ</translation>
 <translation id="3413122095806433232">認証局発行元: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">サイズ:</translation>
+<translation id="3416468988018290825">URL 全体を常に表示</translation>
 <translation id="3420501302812554910">内部セキュリティ キーのリセットが必要です</translation>
 <translation id="3421387094817716717">楕円曲線公開鍵</translation>
 <translation id="3422291238483866753">サイトから周囲の 3D マップの作成またはカメラ位置の追跡を求められたときに確認する(推奨)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">マウスのメイン ボタンを右にする</translation>
 <translation id="6586604979641883411">Linux のアップグレードには、少なくとも <ph name="REQUIRED_SPACE" /> の空きディスク容量が必要です。デバイスの空き容量を確保してから、もう一度お試しください。</translation>
 <translation id="6588043302623806746">セキュア DNS を使用する</translation>
+<translation id="659005207229852190">安全確認が完了しました。</translation>
 <translation id="6590458744723262880">フォルダ名の変更</translation>
 <translation id="6592267180249644460">WebRTC ログの記録日時: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">指紋を登録しました</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">母国語以外のページで翻訳ツールを表示する</translation>
 <translation id="8251441930213048644">今すぐ更新</translation>
 <translation id="8251578425305135684">サムネイルを削除しました。</translation>
+<translation id="825238165904109940">URL 全体を常に表示</translation>
 <translation id="8252569384384439529">アップロードしています...</translation>
 <translation id="8253198102038551905">ネットワークのプロパティを表示するには [+] をクリック</translation>
 <translation id="8254954272268479918">Linux(ベータ版)を終了</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 2e14218..e379ed9 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1702,6 +1702,7 @@
 <translation id="3264544094376351444">Sans-serif შრიფტი</translation>
 <translation id="3264582393905923483">კონტექსტი</translation>
 <translation id="3265459715026181080">ფანჯრის დახურვა</translation>
+<translation id="3266274118485960573">მიმდინარეობს უსაფრთხოების შემოწმება.</translation>
 <translation id="3267726687589094446">რამდენიმე ფაილის ავტომატური ჩამოტვირთვის დაშვების გაგრძელება</translation>
 <translation id="3268451620468152448">გახსნილი ჩანართები</translation>
 <translation id="3269069891205016797">თქვენი ინფორმაცია ამოიშლება მოწყობილობიდან, როცა გამოხვალთ სისტემიდან.</translation>
@@ -1807,6 +1808,7 @@
 <translation id="3412265149091626468">მონიშნულ ობიექტზე გადახტომა</translation>
 <translation id="3413122095806433232">CA გამცემები: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">ზომა:</translation>
+<translation id="3416468988018290825">URL-ების ყოველთვის სრულად გამოჩენა</translation>
 <translation id="3420501302812554910">უსაფრთხოების შიდა გასაღები საჭიროებს გადაყენებას</translation>
 <translation id="3421387094817716717">ეკლიპტიკური მრუდის საჯარო გასაღები</translation>
 <translation id="3422291238483866753">შეკითხვა საიტის მიერ თქვენი გარემოს 3-განზომილებიანი რუკის შექმნის ან კამერის პოზიციისთვის თვალის მიდევნების მოთხოვნისას (რეკომენდებული)</translation>
@@ -4163,6 +4165,7 @@
 <translation id="6586451623538375658">ძირითადი მაუსის ღილაკის შეცვლა</translation>
 <translation id="6586604979641883411">Linux-ის ახალ ვერსიაზე გადასვლისთვის დისკზე საჭიროა მინიმუმ <ph name="REQUIRED_SPACE" /> თავისუფალი მეხსიერება. გაათავისუფლეთ მეხსიერება თქვენს მოწყობილობაზე და ცადეთ ხელახლა.</translation>
 <translation id="6588043302623806746">დაცული DNS-ის გამოყენება</translation>
+<translation id="659005207229852190">უსაფრთხოების შემოწმება შესრულდა.</translation>
 <translation id="6590458744723262880">საქაღალდის გადარქმევა</translation>
 <translation id="6592267180249644460">WebRTC ჟურნალი გადაღებულია <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">თქვენი თითის ანაბეჭდი აღბეჭდილია</translation>
@@ -5421,6 +5424,7 @@
 <translation id="8249672078237421304">გვერდების თარგმნის შემოთავაზება, თუ მათი ენა ბრაუზერში გამოყენებულისგან განსხვავდება</translation>
 <translation id="8251441930213048644">ახლავე განახლება</translation>
 <translation id="8251578425305135684">ესკიზები წაშლილია.</translation>
+<translation id="825238165904109940">URL-ების ყოველთვის სრულად გამოჩენა</translation>
 <translation id="8252569384384439529">მიმდინარეობს ატვირთვა...</translation>
 <translation id="8253198102038551905">ქსელის თვისებების მიღებისათვის, დააჭირეთ „+“</translation>
 <translation id="8254954272268479918">Linux-ის (ბეტა) გამორთვა</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 054f5e3..c8f1486 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1700,6 +1700,7 @@
 <translation id="3264544094376351444">Sans-serif қаріпі</translation>
 <translation id="3264582393905923483">Мәнмәтін</translation>
 <translation id="3265459715026181080">Терезені жабу</translation>
+<translation id="3266274118485960573">Қауіпсіздік шарасы қосулы.</translation>
 <translation id="3267726687589094446">Бірнеше файлды автоматты жүктеуге берілген рұқсат күшін сақтау</translation>
 <translation id="3268451620468152448">Ашық қойындылар</translation>
 <translation id="3269069891205016797">Жүйеден шыққан кезде, ақпаратыңыз құрылғыдан өшіріледі.</translation>
@@ -1805,6 +1806,7 @@
 <translation id="3412265149091626468">Таңдауға өту</translation>
 <translation id="3413122095806433232">CA мекемелері: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Көлемі:</translation>
+<translation id="3416468988018290825">URL мекенжайларын әрдайым толық көрсету</translation>
 <translation id="3420501302812554910">Ішкі қауіпсіздік кілтін қалпына келтіру керек.</translation>
 <translation id="3421387094817716717">Эллипстік қисық сызықтардың ашық кілті</translation>
 <translation id="3422291238483866753">Сайт айналаңыздың 3D картасын жасағысы немесе камера орнын бақылағысы келгенде, рұқсат сұраy (ұсынылады)</translation>
@@ -4161,6 +4163,7 @@
 <translation id="6586451623538375658">Негізгі тінтуір түймесін ауыстыру</translation>
 <translation id="6586604979641883411">Linux жүйесінің жаңа нұсқасын орнату үшін дискіде кемінде <ph name="REQUIRED_SPACE" /> бос орын болуы керек. Құрылғыда аздап орын босатып, әрекетті қайталаңыз.</translation>
 <translation id="6588043302623806746">Қорғалған DNS пайдалану</translation>
+<translation id="659005207229852190">Қауіпсіздік шарасы аяқталды.</translation>
 <translation id="6590458744723262880">Қалтаның атауын өзгерту</translation>
 <translation id="6592267180249644460">WebRTC журналы жазып алынды <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Саусақ ізіңіз түсірілді.</translation>
@@ -5420,6 +5423,7 @@
 <translation id="8249672078237421304">Сіз оқитын тілден басқа тілдегі беттерді аударуды ұсынады</translation>
 <translation id="8251441930213048644">Қазір жаңарту</translation>
 <translation id="8251578425305135684">Нобай жойылды.</translation>
+<translation id="825238165904109940">URL мекенжайларын әрдайым толық көрсету</translation>
 <translation id="8252569384384439529">Жүктеп салынуда…</translation>
 <translation id="8253198102038551905">Желілік сипаттарын алу үшін "+" белгісін басыңыз</translation>
 <translation id="8254954272268479918">Linux (бета нұсқасы) виртуалды құрылғысын жабу</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 73a9f3e..3693b147 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">ពុម្ពអក្សរ Sans-serif</translation>
 <translation id="3264582393905923483">បរិបទ</translation>
 <translation id="3265459715026181080">បិទផ្ទាំង</translation>
+<translation id="3266274118485960573">ការពិនិត្យ​សុវត្ថិភាព​កំពុងដំណើរការ​។</translation>
 <translation id="3267726687589094446">បន្តអនុញ្ញាតការទាញយកឯកសារច្រើនដោយស្វ័យប្រវត្តិ</translation>
 <translation id="3268451620468152448">បើកផ្ទាំង</translation>
 <translation id="3269069891205016797">ព័ត៌មានរបស់អ្នកនឹងត្រូវបានលុបចេញពីឧបករណ៍នេះ នៅពេលដែលអ្នកចេញពីគណនី។</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">លោតទៅការជ្រើសរើស</translation>
 <translation id="3413122095806433232">អ្នកចេញផ្សាយ CA៖ <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">ទំហំ៖</translation>
+<translation id="3416468988018290825">បង្ហាញ URL ពេញលេញ​ជានិច្ច</translation>
 <translation id="3420501302812554910">តម្រូវឱ្យ​កំណត់​សោសុវត្ថិភាព​ផ្នែកខាងក្នុងឡើងវិញ</translation>
 <translation id="3421387094817716717">សោសាធារណ: Elliptic Curve</translation>
 <translation id="3422291238483866753">សួរ​នៅពេល​គេហទំព័រ​ចង់បង្កើតផែនទី 3D នៃមជ្ឈដ្ឋានជុំវិញរបស់អ្នក ឬតាមដានទីតាំងកាមេរ៉ា (បានណែនាំ)</translation>
@@ -4165,6 +4167,7 @@
 <translation id="6586451623538375658">អូសប៊ូតុងកណ្តុរបឋម</translation>
 <translation id="6586604979641883411">តម្រូវឱ្យ​មានទំហំផ្ទុកថាស​ទំនេរ​យ៉ាងហោចណាស់ <ph name="REQUIRED_SPACE" /> ដើម្បី​ដំឡើងកំណែ Linux។ សូមបង្កើន​ទំហំផ្ទុក​មួយចំនួន​នៅលើ​ឧបករណ៍​របស់អ្នក រួចព្យាយាម​ម្ដងទៀត។</translation>
 <translation id="6588043302623806746">ប្រើ DNS សុវត្ថិភាព</translation>
+<translation id="659005207229852190">ការពិនិត្យ​សុវត្ថិភាព​បានបញ្ចប់​ហើយ។</translation>
 <translation id="6590458744723262880">ប្ដូរ​ឈ្មោះ​ថត</translation>
 <translation id="6592267180249644460">កំណត់ត្រា WebRTC បានចាប់យក <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">បានថត​ស្នាមម្រាមដៃ​របស់អ្នក​ហើយ</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">ផ្តល់ជូន​ការបកប្រែ​ទំព័រ​ដែល​មិនមែន​ជាភាសា​ដែល​អ្នក​អាន</translation>
 <translation id="8251441930213048644">ផ្ទុកឡើងវិញ​ឥឡូវនេះ</translation>
 <translation id="8251578425305135684">រូបតំណាងតូចត្រូវបានដកចេញ។</translation>
+<translation id="825238165904109940">បង្ហាញ URL ពេញលេញ​ជានិច្ច</translation>
 <translation id="8252569384384439529">កំពុង​បង្ហោះ...</translation>
 <translation id="8253198102038551905">ចុច '+' ដើម្បីទទួលយកលក្ខណៈសម្បត្តិបណ្តាញ</translation>
 <translation id="8254954272268479918">បិទ Linux (បេតា)</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index fb3e0e0..9ed6cbe 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-serif</translation>
 <translation id="3264582393905923483">컨텍스트</translation>
 <translation id="3265459715026181080">창 닫기</translation>
+<translation id="3266274118485960573">안전 확인을 실행 중입니다.</translation>
 <translation id="3267726687589094446">여러 파일을 자동으로 다운로드하도록 계속 허용</translation>
 <translation id="3268451620468152448">열린 탭</translation>
 <translation id="3269069891205016797">로그아웃하면 내 정보가 기기에서 삭제됩니다.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">선택 부분으로 이동</translation>
 <translation id="3413122095806433232">CA 발행기관: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">크기:</translation>
+<translation id="3416468988018290825">항상 전체 URL 표시</translation>
 <translation id="3420501302812554910">내부 보안 키 재설정 필요</translation>
 <translation id="3421387094817716717">타원 곡선 공개 키</translation>
 <translation id="3422291238483866753">사이트에서 주변 환경의 3D 지도를 생성하거나 카메라 위치를 추적하려고 할 때 확인(권장)</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">기본 마우스 버튼 전환</translation>
 <translation id="6586604979641883411">Linux를 업그레이드하려면 <ph name="REQUIRED_SPACE" /> 이상의 디스크 여유 공간이 필요합니다. 기기에서 여유 공간을 확보한 후 다시 시도해 보세요.</translation>
 <translation id="6588043302623806746">보안 DNS 사용</translation>
+<translation id="659005207229852190">안전 확인이 완료되었습니다.</translation>
 <translation id="6590458744723262880">폴더 이름 바꾸기</translation>
 <translation id="6592267180249644460">WebRTC 로그 캡처 시간: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">지문이 등록되었습니다.</translation>
@@ -5422,6 +5425,7 @@
 <translation id="8249672078237421304">이 언어로 된 페이지에 대한 번역 옵션 제공</translation>
 <translation id="8251441930213048644">지금 새로고침</translation>
 <translation id="8251578425305135684">미리보기 이미지가 삭제되었습니다.</translation>
+<translation id="825238165904109940">항상 전체 URL 표시</translation>
 <translation id="8252569384384439529">업로드 중...</translation>
 <translation id="8253198102038551905">'+'를 클릭하여 네트워크 속성 보기</translation>
 <translation id="8254954272268479918">Linux(베타) 종료</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index c3f22e2..5db20c3c 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-serif ариби</translation>
 <translation id="3264582393905923483">Контекст</translation>
 <translation id="3265459715026181080">Терезени жабуу</translation>
+<translation id="3266274118485960573">Коопсуздук текшерилүүдө.</translation>
 <translation id="3267726687589094446">Бир нече файл автоматтык түрдө жүктөлүп алына берсин</translation>
 <translation id="3268451620468152448">Ачык өтмөктөр</translation>
 <translation id="3269069891205016797">Каттоо эсебинен чыкканыңыздан кийин, маалыматыңыз түзмөктөн өчүрүлөт.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Тандоого секириңиз</translation>
 <translation id="3413122095806433232">Тастыктама берүүчүлөр: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Өлчөм:</translation>
+<translation id="3416468988018290825">URL'дер ар дайым толугу менен көрсөтүлсүн</translation>
 <translation id="3420501302812554910">Ички коопсуздук ачкычын баштапкы абалга келтирүү талап кылынат</translation>
 <translation id="3421387094817716717">Эллиптикалык ийри сызыктын жалпыга ачык ачкычы</translation>
 <translation id="3422291238483866753">Сайт айланаңыздын 3D картасын түзгөнү же камераңыздын абалын көргөнү жатканда уруксат суралсын (сунушталат)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Негизги чычкан баскычын алмаштыруу</translation>
 <translation id="6586604979641883411">Linux'тун жаңы версиясын жүктөп алуу үчүн кеминде <ph name="REQUIRED_SPACE" /> орун талап кылынат. Түзмөгүңүздө бир аз орун бошотуп, кайталап көрүңүз.</translation>
 <translation id="6588043302623806746">Коопсуз DNS'ти колдонуу</translation>
+<translation id="659005207229852190">Коопсуздук текшерилди.</translation>
 <translation id="6590458744723262880">Папканын аталышын өзгөртүү</translation>
 <translation id="6592267180249644460">WebRTC таржымалы кармалды <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Манжа изиңиз тартылды</translation>
@@ -5423,6 +5426,7 @@
 <translation id="8249672078237421304">Барактар түшүнүксүз тилде болсо, аларды которуу сунушталсын</translation>
 <translation id="8251441930213048644">Азыр жаңыртуу</translation>
 <translation id="8251578425305135684">Бармакбасым өчүрүлдү.</translation>
+<translation id="825238165904109940">URL'дер ар дайым толугу менен көрсөтүлсүн</translation>
 <translation id="8252569384384439529">Жүктөлүп берилүүдө…</translation>
 <translation id="8253198102038551905">Тармак касиеттерин ачуу үчүн "+" дегенди чыкылдатыңыз</translation>
 <translation id="8254954272268479918">Linux'ту (бета-версиясы) жабуу</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 2bfacd9..3919832 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1701,6 +1701,7 @@
 <translation id="3264544094376351444">ຟອນ Sans-serif</translation>
 <translation id="3264582393905923483">ສະພາບການ</translation>
 <translation id="3265459715026181080">ປິດໜ້າ​ຕ່າງ</translation>
+<translation id="3266274118485960573">ການກວດສອບຄວາມປອດໄພພວມດຳເນີນຢູ່.</translation>
 <translation id="3267726687589094446">ສືບຕໍ່ອະນຸຍາດການດາວໂຫຼດຫຼາຍໄຟລ໌ອັດຕະໂນມັດ</translation>
 <translation id="3268451620468152448">ເປີດ​ແຖບ</translation>
 <translation id="3269069891205016797">ຂໍ້ມູນຂອງທ່ານຈະຖືກລຶບອອກຈາກອຸປະກອນເມື່ອທ່ານອອກຈາກລະບົບ.</translation>
@@ -1806,6 +1807,7 @@
 <translation id="3412265149091626468">ຂ້າມໄປຫາການເລືອກ</translation>
 <translation id="3413122095806433232">ຜູ້ອອກ CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">ຂະໜາດ:</translation>
+<translation id="3416468988018290825">ສະແດງ URL ເຕັມທຸກເທື່ອ</translation>
 <translation id="3420501302812554910">ກະແຈຄວາມປອດໄພພາຍໃນຈຳເປັນຕ້ອງຣີເຊັດ</translation>
 <translation id="3421387094817716717">Elliptic Curve Public Key</translation>
 <translation id="3422291238483866753">ຖາມເມື່ອເວັບໄຊຕ້ອງການສ້າງແຜນທີ່ 3 ມິຕິຂອງສິ່ງທີ່ຢູ່ອ້ອມຂ້າງຕົວທ່ານ ຫຼື ຕາມຕຳແໜ່ງກ້ອງ (ແນະນຳ)</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">ແລກປ່ຽນປຸ່ມເມົາສ໌ຕົ້ນຕໍ</translation>
 <translation id="6586604979641883411">ຈຳເປັນຕ້ອງມີພື້ນທີ່ດິສຫວ່າງຢ່າງໜ້ອຍ <ph name="REQUIRED_SPACE" /> ເພື່ອອັບເກຣດ Linux. ກະລຸນາຂະຫຍາຍພື້ນທີ່ຫວ່າງໃນອຸປະກອນຂອງທ່ານ ແລ້ວລອງໃໝ່.</translation>
 <translation id="6588043302623806746">ໃຊ້ DNS ທີ່ປອດໄພ</translation>
+<translation id="659005207229852190">ການກວດສອບຄວາມປອດໄພສຳເລັດແລ້ວ.</translation>
 <translation id="6590458744723262880">ປ່ຽນຊື່ໂຟນເດີ</translation>
 <translation id="6592267180249644460">ແຄັບເຈີບັນທຶກ WebRTC <ph name="WEBRTC_LOG_CAPTURE_TIME" /> ແລ້ວ</translation>
 <translation id="6592808042417736307">ບັນທຶກລາຍນິ້ວມືຂອງທ່ານແລ້ວ</translation>
@@ -5420,6 +5423,7 @@
 <translation id="8249672078237421304">ສະເໜີແປໜ້າຕ່າງໆທີ່ບໍ່ເປັນພາສາທີ່ທ່ານອ່ານໄດ້</translation>
 <translation id="8251441930213048644">ໂຫຼດຂໍ້ມູນໃຫມ່ດຽວນີ້</translation>
 <translation id="8251578425305135684">ເອົາຮູບນ້ອຍອອກໄປແລ້ວ.</translation>
+<translation id="825238165904109940">ສະແດງ URL ເຕັມທຸກເທື່ອ</translation>
 <translation id="8252569384384439529">ກຳລັງອັບໂຫລດ...</translation>
 <translation id="8253198102038551905">ຄ​ລິກ '+' ເພື່ອ​ເອົາ​ຄຸນ​ສົມ​ບັດ​ເຄືອ​ຂ່າຍ</translation>
 <translation id="8254954272268479918">ປິດເຄື່ອງ Linux (ເບຕ້າ)</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 79a7cd0..1db0506 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-Serif fonts</translation>
 <translation id="3264582393905923483">Konteksts</translation>
 <translation id="3265459715026181080">Aizvērt logu</translation>
+<translation id="3266274118485960573">Ir sākta drošības pārbaude.</translation>
 <translation id="3267726687589094446">Atļaut vairāku failu automātisku lejupielādēšanu arī turpmāk</translation>
 <translation id="3268451620468152448">Atvērtās cilnes</translation>
 <translation id="3269069891205016797">Jūsu informācija tiks noņemta no ierīces, kad jūs izrakstīsieties.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Pāriet uz atlasi</translation>
 <translation id="3413122095806433232">CA izsniedzēji: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Lielums:</translation>
+<translation id="3416468988018290825">Vienmēr rādīt visus vietrāžus URL</translation>
 <translation id="3420501302812554910">Jāatiestata iekšējā drošības atslēga</translation>
 <translation id="3421387094817716717">Eliptiskas līknes publiskā atslēga</translation>
 <translation id="3422291238483866753">Vaicāt, ja vietne vēlas izveidot jūsu apkārtnes 3D karti vai izsekot kameras pozīciju (ieteicams)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Apmainīt galveno peles pogu</translation>
 <translation id="6586604979641883411">Lai jauninātu Linux, nepieciešama brīva vieta diskā vismaz <ph name="REQUIRED_SPACE" /> apjomā. Lūdzu, atbrīvojiet vietu savā ierīcē un mēģiniet vēlreiz.</translation>
 <translation id="6588043302623806746">Lietot drošu DNS serveri</translation>
+<translation id="659005207229852190">Drošības pārbaude tika pabeigta.</translation>
 <translation id="6590458744723262880">Mapes pārdēvēšana</translation>
 <translation id="6592267180249644460">WebRTC žurnāls — ierakstīts šādā datumā: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Jūsu pirksta nospiedums tika reģistrēts.</translation>
@@ -5423,6 +5426,7 @@
 <translation id="8249672078237421304">Piedāvāt tulkot lapas, kas nav manā valodā</translation>
 <translation id="8251441930213048644">Atsvaidzināt tūlīt</translation>
 <translation id="8251578425305135684">Sīktēls ir noņemts.</translation>
+<translation id="825238165904109940">Vienmēr rādīt visus vietrāžus URL</translation>
 <translation id="8252569384384439529">Notiek augšupielāde...</translation>
 <translation id="8253198102038551905">Noklikšķiniet uz “+”, lai iegūtu tīkla rekvizītus</translation>
 <translation id="8254954272268479918">Izslēgt Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 7b41e3a..d30e72b 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1698,6 +1698,7 @@
 <translation id="3264544094376351444">Sans-serif фонт</translation>
 <translation id="3264582393905923483">Хам сэдэв</translation>
 <translation id="3265459715026181080">Цонхыг хаах</translation>
+<translation id="3266274118485960573">Аюулгүй байдлын шалгалт хийж байна.</translation>
 <translation id="3267726687589094446">Олон тооны файлуудыг автоматаар татаж авахыг үргэлжүүлэн зөвшөөрөх</translation>
 <translation id="3268451620468152448">Цонхнуудыг нээх</translation>
 <translation id="3269069891205016797">Энэ төхөөрөмжөөс гарах үед таны мэдээлэл устах болно.</translation>
@@ -1803,6 +1804,7 @@
 <translation id="3412265149091626468">Selection-д очих</translation>
 <translation id="3413122095806433232">Гэрчилгээжүүлэлт олгогч: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Хэмжээ:</translation>
+<translation id="3416468988018290825">Үргэлж бүтэн URL-г харуулах</translation>
 <translation id="3420501302812554910">Дотоод аюулгүй байдлын түлхүүрийг шинэчлэх шаардлагатай</translation>
 <translation id="3421387094817716717">Зууван муруй нийтийн түлхүүр</translation>
 <translation id="3422291238483866753">Сайт таны эргэн тойрны 3D газрын зургийг үүсгэх эсвэл камерын хөдөлгөөнийг хянах хүсэлтэй үед асуух (санал болгосон)</translation>
@@ -4158,6 +4160,7 @@
 <translation id="6586451623538375658">Хулганы үндсэн товчийг солих</translation>
 <translation id="6586604979641883411">Linux-г дэвшүүлэхэд хамгийн багадаа диск дээр <ph name="REQUIRED_SPACE" /> сул зайтай байх шаардлагатай. Төхөөрөмж дээрээ сул зай гаргаад дахин оролдоно уу.</translation>
 <translation id="6588043302623806746">Найдвартай DNS ашиглана уу</translation>
+<translation id="659005207229852190">Аюулгүй байдлын шалгалтыг хийж дуусгалаа.</translation>
 <translation id="6590458744723262880">Фолдерын нэрийг өөрчлөх</translation>
 <translation id="6592267180249644460">WebRTC бүртгэл <ph name="WEBRTC_LOG_CAPTURE_TIME" />-д хадгалагдлаа</translation>
 <translation id="6592808042417736307">Таны хурууны хээг авлаа</translation>
@@ -5414,6 +5417,7 @@
 <translation id="8249672078237421304">Таны орны хэлээр байхгүй хуудсыг орчуулах санал хүргүүлнэ үү</translation>
 <translation id="8251441930213048644">Яг одоо дахин ачаалах</translation>
 <translation id="8251578425305135684">Жижиг зураг устгагдсан.</translation>
+<translation id="825238165904109940">Үргэлж бүтэн URL-г харуулах</translation>
 <translation id="8252569384384439529">Байршуулж байна...</translation>
 <translation id="8253198102038551905">Сүлжээний хандалтын сонголтыг нэмэгдүүлэхийн тулд  '+' дээр дарна уу</translation>
 <translation id="8254954272268479918">Linux (Бэта)-г унтраах</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index fe0136b..006e4372 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Fon Sans-serif</translation>
 <translation id="3264582393905923483">Konteks</translation>
 <translation id="3265459715026181080">Tutup Tetingkap</translation>
+<translation id="3266274118485960573">Semakan keselamatan sedang dijalankan</translation>
 <translation id="3267726687589094446">Terus membenarkan muat turun automatik berbilang fail</translation>
 <translation id="3268451620468152448">Tab Terbuka</translation>
 <translation id="3269069891205016797">Maklumat anda akan dialih keluar daripada peranti apabila anda mengelog keluar.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Lompat ke Pemilihan</translation>
 <translation id="3413122095806433232">Pengeluar CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Saiz:</translation>
+<translation id="3416468988018290825">Sentiasa paparkan URL penuh</translation>
 <translation id="3420501302812554910">Kunci keselamatan dalaman memerlukan penetapan semula</translation>
 <translation id="3421387094817716717">Kunci Awam Lengkung Eliptik</translation>
 <translation id="3422291238483866753">Tanya apabila tapak mahu membuat peta 3D bagi persekitaran anda atau menjejaki kedudukan kamera (disyorkan)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Tukar butang tetikus utama</translation>
 <translation id="6586604979641883411">Sekurang-kurangnya <ph name="REQUIRED_SPACE" /> ruang cakera kosong diperlukan untuk meningkatkan Linux. Sila kosongkan sedikit ruang pada peranti anda dan cuba lagi.</translation>
 <translation id="6588043302623806746">Gunakan DNS selamat</translation>
+<translation id="659005207229852190">Semakan keselamatan selesai.</translation>
 <translation id="6590458744723262880">Namakan semula folder</translation>
 <translation id="6592267180249644460">Log WebRTC dirakam <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Cap jari anda telah disimpan</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Tawarkan untuk menterjemah halaman yang bukan dalam bahasa yang anda baca</translation>
 <translation id="8251441930213048644">Muat semula sekarang</translation>
 <translation id="8251578425305135684">Lakaran kenit dibuang.</translation>
+<translation id="825238165904109940">Sentiasa Paparkan URL Penuh</translation>
 <translation id="8252569384384439529">Memuat naik...</translation>
 <translation id="8253198102038551905">Klik '+' untuk mendapatkan sifat rangkaian</translation>
 <translation id="8254954272268479918">Matikan Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 1e9ce14c..5ea014a 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1704,6 +1704,7 @@
 <translation id="3264544094376351444">Sans-serif ဖွန့်</translation>
 <translation id="3264582393905923483">အခြေအနေ</translation>
 <translation id="3265459715026181080">ဝင်ဒိုး ပိတ်ရန်</translation>
+<translation id="3266274118485960573">လုံခြုံရေး စစ်ဆေးနေသည်။</translation>
 <translation id="3267726687589094446">ဖိုင်များစွာ တပြိုင်နက် အလိုအလျောက် ဒေါင်းလုဒ် ပြုလုပ်မှုကို ဆက်လက် ခွင့်ပြုမည်</translation>
 <translation id="3268451620468152448">တဲဘ်များ ဖွင့်ရန်</translation>
 <translation id="3269069891205016797">သင်ထွက်လိုက်သည့်အခါ သင့်အချက်အလက်များကို ဤစက်ပစ္စည်းမှနေ၍ ဖယ်ရှားလိုက်ပါမည်။</translation>
@@ -1809,6 +1810,7 @@
 <translation id="3412265149091626468">ရွေးချယ်မှု ဆီကို ခုန်ကျော်သွားရန်</translation>
 <translation id="3413122095806433232">CA ထျုတ်ပေးသူများ: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">အရွယ်အစား:</translation>
+<translation id="3416468988018290825">URL အပြည့်အစုံကို အမြဲပြရန်</translation>
 <translation id="3420501302812554910">အတွင်းပိုင်း လုံခြုံရေးကီးကို ပြင်ဆင်သတ်မှတ်ရန် လိုအပ်သည်</translation>
 <translation id="3421387094817716717">Elliptic Curve အများသုံးကီး</translation>
 <translation id="3422291238483866753">ဝဘ်ဆိုက်က သင့်ပတ်ဝန်းကျင်၏ 3D မြေပုံဆွဲခြင်း သို့မဟုတ် ကင်မရာအနေအထား ခြေရာခံခြင်းတို့ ပြုလုပ်လိုသည့်အခါ မေးမြန်းရန် (အကြံပြုထားသည်)</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">အခြေခံ မောက်စ် ခလုတ် ဖလှယ်ရန်</translation>
 <translation id="6586604979641883411">Linux အဆင့်မြှင့်ရန် အနည်းဆုံး သိုလှောင်ခန်းနေရာ <ph name="REQUIRED_SPACE" /> လိုအပ်သည်။ သင့်စက်တွင် နေရာလွတ်ပြုလုပ်ပြီး ထပ်စမ်းကြည့်ပါ။</translation>
 <translation id="6588043302623806746">လုံခြုံသော DNS ကို အသုံးပြုပါ</translation>
+<translation id="659005207229852190">လုံခြုံရေးစစ်ဆေးပြီးပါပြီ။</translation>
 <translation id="6590458744723262880">ဖိုင်တွဲအမည်ကို ပြောင်းခြင်း</translation>
 <translation id="6592267180249644460">WebRTC ရိုက်ထားသည့် လော့<ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">သင်၏လက်ဗွေကို ထည့်လိုက်ပါပြီ</translation>
@@ -5421,6 +5424,7 @@
 <translation id="8249672078237421304">သင့်ဘာသာစကားမဟုတ်သည့် စာမျက်နှာများကို ဘာသာပြန်ပေးရန် ကမ်းလှမ်းပါသည်</translation>
 <translation id="8251441930213048644">ယခု ပြန်လည်စတင်ရန်</translation>
 <translation id="8251578425305135684">လက်သည်းပုံ ဖယ်ရှားလိုက်ပါပြီ။</translation>
+<translation id="825238165904109940">URL အပြည့်အစုံကို အမြဲပြရန်</translation>
 <translation id="8252569384384439529">အပ်လုဒ်လုပ်နေသည်...</translation>
 <translation id="8253198102038551905">'+' ကို နှိပ်ပြီး ကွန်ယက်ဂုဏ်သတ္တိများကိို ရယူပါ</translation>
 <translation id="8254954272268479918">Linux (စမ်းသပ်ဆော့ဖ်ဝဲ) ကို ပိတ်ရန်</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 4776fad..3cdc726 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Tipo de letra Sans-Serif</translation>
 <translation id="3264582393905923483">Contexto</translation>
 <translation id="3265459715026181080">Fechar janela</translation>
+<translation id="3266274118485960573">A verificação de segurança está a ser executada.</translation>
 <translation id="3267726687589094446">Continuar a permitir transferências automáticas de vários ficheiros</translation>
 <translation id="3268451620468152448">Abrir Separadores</translation>
 <translation id="3269069891205016797">As suas informações serão removidas do dispositivo quando terminar sessão.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Passar para a selecção</translation>
 <translation id="3413122095806433232">Emissores de AC: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Tamanho:</translation>
+<translation id="3416468988018290825">Mostrar sempre URLs completos</translation>
 <translation id="3420501302812554910">É necessário repor a chave de segurança interna</translation>
 <translation id="3421387094817716717">Chave pública curva elíptica</translation>
 <translation id="3422291238483866753">Perguntar quando um site pretender criar um mapa 3D do ambiente à sua volta ou monitorizar a posição da câmara (recomendado)</translation>
@@ -4165,6 +4167,7 @@
 <translation id="6586451623538375658">Trocar botão principal do rato</translation>
 <translation id="6586604979641883411">É necessário, pelo menos, <ph name="REQUIRED_SPACE" /> de espaço livre no disco para atualizar o Linux. Liberte algum espaço no dispositivo e tente novamente.</translation>
 <translation id="6588043302623806746">Utilizar o DNS seguro</translation>
+<translation id="659005207229852190">A verificação de segurança foi concluída.</translation>
 <translation id="6590458744723262880">Mudar o nome da pasta</translation>
 <translation id="6592267180249644460">Registo de WebRTC capturado <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">A sua impressão digital foi capturada.</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Sugerir a tradução de páginas que não estejam num idioma que o utilizador saiba ler</translation>
 <translation id="8251441930213048644">Atualizar agora</translation>
 <translation id="8251578425305135684">Miniatura removida.</translation>
+<translation id="825238165904109940">Mostrar sempre URLs completos</translation>
 <translation id="8252569384384439529">A carregar…</translation>
 <translation id="8253198102038551905">Clique em "+" para aceder às propriedades de rede</translation>
 <translation id="8254954272268479918">Encerrar o Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 26a9846..6533c66 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Font Sans-Serif</translation>
 <translation id="3264582393905923483">Context</translation>
 <translation id="3265459715026181080">Închide fereastra</translation>
+<translation id="3266274118485960573">Rulează verificarea de siguranță.</translation>
 <translation id="3267726687589094446">Permiteți în continuare descărcarea automată a mai multor fișiere</translation>
 <translation id="3268451620468152448">File deschise</translation>
 <translation id="3269069891205016797">Informațiile tale vor fi eliminate de pe dispozitiv după ce te deconectezi.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Accesează selecția</translation>
 <translation id="3413122095806433232">Emitenți CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Dimensiune:</translation>
+<translation id="3416468988018290825">Afișează întotdeauna adresele URL complete</translation>
 <translation id="3420501302812554910">Cheia de securitate internă trebuie resetată</translation>
 <translation id="3421387094817716717">Cheia publică a curburii eliptice</translation>
 <translation id="3422291238483866753">Anunță-mă dacă un site vrea să creeze o hartă 3D a lucrurilor din jur sau să urmărească poziția camerei video (recomandat)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Comutați butonul principal al mouse-ului</translation>
 <translation id="6586604979641883411">Pentru a face upgrade la Linux este necesar un spațiu liber pe disc de cel puțin <ph name="REQUIRED_SPACE" />. Eliberează spațiu pe dispozitiv și încearcă din nou.</translation>
 <translation id="6588043302623806746">Folosește un DNS securizat</translation>
+<translation id="659005207229852190">Verificarea de siguranță s-a finalizat.</translation>
 <translation id="6590458744723262880">Redenumește dosarul</translation>
 <translation id="6592267180249644460">Jurnal WebRTC înregistrat la <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Amprenta a fost capturată</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Oferă traducerea paginilor care nu sunt într-o limbă pe care o cunosc</translation>
 <translation id="8251441930213048644">Actualizează acum</translation>
 <translation id="8251578425305135684">Miniatura a fost eliminată.</translation>
+<translation id="825238165904109940">Afișează întotdeauna adresele URL complete</translation>
 <translation id="8252569384384439529">Se încarcă...</translation>
 <translation id="8253198102038551905">Pentru a vedea proprietățile rețelei, dă clic pe „+”</translation>
 <translation id="8254954272268479918">Închide Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 2759967..320c04f 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1701,6 +1701,7 @@
 <translation id="3264544094376351444">Шрифты без засечек</translation>
 <translation id="3264582393905923483">Контекст</translation>
 <translation id="3265459715026181080">Закрыть окно</translation>
+<translation id="3266274118485960573">Выполняется проверка безопасности.</translation>
 <translation id="3267726687589094446">По-прежнему разрешать автоматическое скачивание нескольких файлов</translation>
 <translation id="3268451620468152448">Вкладки</translation>
 <translation id="3269069891205016797">Ваши данные будут удалены с устройства после выхода.</translation>
@@ -1806,6 +1807,7 @@
 <translation id="3412265149091626468">Перейти к выделенному</translation>
 <translation id="3413122095806433232">Издатели центра сертификации: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Размер:</translation>
+<translation id="3416468988018290825">Всегда показывать URL полностью</translation>
 <translation id="3420501302812554910">Необходимо сбросить настройки внутреннего электронного ключа</translation>
 <translation id="3421387094817716717">Открытый ключ на эллиптических кривых</translation>
 <translation id="3422291238483866753">Запрашивать для сайтов разрешение на создание 3D-карты места, в котором вы находитесь, и отслеживание положения камеры (рекомендуется)</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">Поменять местами кнопки мыши</translation>
 <translation id="6586604979641883411">Для обновления Linux необходимо как минимум <ph name="REQUIRED_SPACE" /> свободного места на диске. Удалите ненужные данные с устройства и повторите попытку.</translation>
 <translation id="6588043302623806746">Использовать безопасный DNS-сервер</translation>
+<translation id="659005207229852190">Проверка безопасности завершена.</translation>
 <translation id="6590458744723262880">Переименование папки</translation>
 <translation id="6592267180249644460">Время сохранения журнала WebRTC: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Отпечаток пальца сохранен</translation>
@@ -5421,6 +5424,7 @@
 <translation id="8249672078237421304">Предлагать перевод страниц, если их язык отличается от используемого в браузере</translation>
 <translation id="8251441930213048644">Обновить сейчас</translation>
 <translation id="8251578425305135684">Быстрая ссылка удалена.</translation>
+<translation id="825238165904109940">Всегда показывать URL полностью</translation>
 <translation id="8252569384384439529">Загрузка...</translation>
 <translation id="8253198102038551905">Чтобы просмотреть свойства сети, нажмите "+"</translation>
 <translation id="8254954272268479918">Завершить работу Linux (бета)</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 23f0a52..f0c64f9c 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1702,6 +1702,7 @@
 <translation id="3264544094376351444">Bezpätkové písmo</translation>
 <translation id="3264582393905923483">Kontext</translation>
 <translation id="3265459715026181080">Zatvoriť okno</translation>
+<translation id="3266274118485960573">Prebieha kontrola bezpečnosti.</translation>
 <translation id="3267726687589094446">Naďalej povoľovať automatické sťahovanie viacerých súborov súčasne</translation>
 <translation id="3268451620468152448">Otvorené karty</translation>
 <translation id="3269069891205016797">Po odhlásení sa vaše informácie odstránia zo zariadenia.</translation>
@@ -1807,6 +1808,7 @@
 <translation id="3412265149091626468">Prejsť na výber</translation>
 <translation id="3413122095806433232">Vydavatelia CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Veľkosť:</translation>
+<translation id="3416468988018290825">Vždy zobrazovať celé webové adresy</translation>
 <translation id="3420501302812554910">Vyžaduje sa resetovanie interného bezpečného kľúča</translation>
 <translation id="3421387094817716717">Verejný kľúč založený na eliptickej krivke</translation>
 <translation id="3422291238483866753">Opýtať sa, keď chce web vytvoriť 3D mapu vášho okolia alebo sledovať umiestnenie kamier (odporúčané)</translation>
@@ -4163,6 +4165,7 @@
 <translation id="6586451623538375658">Zameniť primárne tlačidlo myši</translation>
 <translation id="6586604979641883411">Na inováciu systému Linux sa vyžaduje minimálne <ph name="REQUIRED_SPACE" /> voľného priestoru na disku. Uvoľnite priestor vo svojom zariadení a skúste to znova.</translation>
 <translation id="6588043302623806746">Používať zabezpečený server DNS</translation>
+<translation id="659005207229852190">Kontrola bezpečnosti bola dokončená.</translation>
 <translation id="6590458744723262880">Premenovanie priečinka</translation>
 <translation id="6592267180249644460">Denník WebRTC zaznamenaný <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Váš odtlačok prsta bol nasnímaný</translation>
@@ -5422,6 +5425,7 @@
 <translation id="8249672078237421304">Ponúkať preklad stránok, ktorým by ste nemuseli rozumieť</translation>
 <translation id="8251441930213048644">Ihneď obnoviť</translation>
 <translation id="8251578425305135684">Miniatúra odstránená.</translation>
+<translation id="825238165904109940">Vždy zobrazovať celé webové adresy</translation>
 <translation id="8252569384384439529">Nahráva sa...</translation>
 <translation id="8253198102038551905">Vlastnosti siete otvoríte kliknutím na tlačidlo plus (+)</translation>
 <translation id="8254954272268479918">Vypnúť Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 0ef685b..b2fc228 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1700,6 +1700,7 @@
 <translation id="3264544094376351444">Shkrimi sans-serif</translation>
 <translation id="3264582393905923483">Konteksti</translation>
 <translation id="3265459715026181080">Mbyll dritaren</translation>
+<translation id="3266274118485960573">Po ekzekutohet kontrolli i sigurisë.</translation>
 <translation id="3267726687589094446">Vazhdo të lejosh shkarkimet automatike të shumë skedarëve</translation>
 <translation id="3268451620468152448">Hap skedat</translation>
 <translation id="3269069891205016797">Informacionet e tua do të hiqen nga pajisja kur të dalësh.</translation>
@@ -1805,6 +1806,7 @@
 <translation id="3412265149091626468">Kalo te përzgjedhja</translation>
 <translation id="3413122095806433232">Lëshuesit e autoritetit të certifikimit: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Madhësia:</translation>
+<translation id="3416468988018290825">Gjithmonë shfaq URL të plota</translation>
 <translation id="3420501302812554910">Çelësi i brendshëm i sigurisë kërkon rivendosje</translation>
 <translation id="3421387094817716717">Çelësi publik i kurbës eliptike</translation>
 <translation id="3422291238483866753">Pyet kur një sajt kërkon të krijojë një hartë 3D të ambientit tënd rrethues ose të gjurmojë pozicionin e kamerës (rekomandohet)</translation>
@@ -4161,6 +4163,7 @@
 <translation id="6586451623538375658">Ndërro butonin kryesor të miut</translation>
 <translation id="6586604979641883411">Kërkohen të paktën <ph name="REQUIRED_SPACE" /> hapësirë e lirë disku për përmirësimin e Linux. Liro pak hapësirë në pajisjen tënde dhe provo përsëri.</translation>
 <translation id="6588043302623806746">Përdor DNS-në e sigurt</translation>
+<translation id="659005207229852190">Kontrolli i sigurisë përfundoi.</translation>
 <translation id="6590458744723262880">Riemërto dosjen</translation>
 <translation id="6592267180249644460">Evidenca e WebRTC regjistroi <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Gjurma e gishtit tënd u regjistrua</translation>
@@ -5419,6 +5422,7 @@
 <translation id="8249672078237421304">Ofro përkthimin e faqeve që nuk janë në një gjuhë që e lexon</translation>
 <translation id="8251441930213048644">Rifresko tani</translation>
 <translation id="8251578425305135684">Miniatura u hoq.</translation>
+<translation id="825238165904109940">Gjithmonë shfaq URL të plota</translation>
 <translation id="8252569384384439529">Po ngarkohet...</translation>
 <translation id="8253198102038551905">Kliko "+" për të gjetur karakteristikat e rrjetit</translation>
 <translation id="8254954272268479918">Fike sistemin Linux (Beta)</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 834af3d..e08bf570 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans serif-teckensnitt</translation>
 <translation id="3264582393905923483">Sammanhang</translation>
 <translation id="3265459715026181080">Stäng fönster</translation>
+<translation id="3266274118485960573">Säkerhetskontrollen körs.</translation>
 <translation id="3267726687589094446">Fortsätt att tillåta automatiska nedladdningar av flera filer</translation>
 <translation id="3268451620468152448">Öppna flikar</translation>
 <translation id="3269069891205016797">Dina uppgifter tas bort från enheten när du loggar ut.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Hoppa till markering</translation>
 <translation id="3413122095806433232">CA-utfärdare: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Storlek:</translation>
+<translation id="3416468988018290825">Visa alltid hela webbadresser</translation>
 <translation id="3420501302812554910">Den interna säkerhetsnyckeln behöver återställas</translation>
 <translation id="3421387094817716717">Offentlig nyckel vid kryptering med elliptisk kurva</translation>
 <translation id="3422291238483866753">Fråga när en webbplats vill skapa en 3D-karta över dina omgivningar eller registrera kamerans position (rekommenderas)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Byt primär musknapp</translation>
 <translation id="6586604979641883411">Det krävs minst <ph name="REQUIRED_SPACE" /> ledigt hårddiskutrymme för att uppgradera Linux. Frigör utrymme på enheten och försök igen.</translation>
 <translation id="6588043302623806746">Använd säker DNS</translation>
+<translation id="659005207229852190">Säkerhetskontrollen har slutförts.</translation>
 <translation id="6590458744723262880">Byt namn på mapp</translation>
 <translation id="6592267180249644460">WebRTC-logg registrerades <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Ditt fingeravtryck har registrerats</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Erbjud att översätta sidor som är på ett språk som du inte kan läsa</translation>
 <translation id="8251441930213048644">Uppdatera nu</translation>
 <translation id="8251578425305135684">Miniatyren har tagits bort.</translation>
+<translation id="825238165904109940">Visa alltid hela webbadresser</translation>
 <translation id="8252569384384439529">Laddar upp …</translation>
 <translation id="8253198102038551905">Klicka på + för att hämta nätverksegenskaperna</translation>
 <translation id="8254954272268479918">Avsluta Linux (beta)</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 56f606a..a2fe528 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -195,6 +195,7 @@
 <translation id="1251366534849411931">திறந்த நெளி அடைப்புக்குறி இல்லை: <ph name="ERROR_LINE" /></translation>
 <translation id="1252987234827889034">சுயவிவரப் பிழை ஏற்பட்டது</translation>
 <translation id="1254593899333212300">நேரடி இணைய இணைப்பு</translation>
+<translation id="1259152067760398571">பாதுகாப்புச் சரிபார்ப்பு நேற்று மேற்கொள்ளப்பட்டது</translation>
 <translation id="1260451001046713751"><ph name="HOST" /> இடமிருந்து பாப்-அப்களையும் திசைதிருப்புதல்களையும் எப்போதும் அனுமதி</translation>
 <translation id="126156426083987769">டெமோ பயன்முறையில் சாதனம் இயங்குவதற்கான உரிமங்களில் ஒரு சிக்கல் ஏற்பட்டது.</translation>
 <translation id="126710816202626562">மொழிபெயர்ப்பிற்கான மொழி:</translation>
@@ -384,6 +385,7 @@
 <translation id="1524430321211440688">விசைப்பலகை</translation>
 <translation id="1524563461097350801">வேண்டாம்</translation>
 <translation id="1525740877599838384">இருப்பிடத்தைக் கண்டறிய, வைஃபையை மட்டும் பயன்படுத்து</translation>
+<translation id="152629053603783244">Linuxஸை மீண்டும் தொடங்கு</translation>
 <translation id="1526560967942511387">பெயரிடப்படாத ஆவணம்</translation>
 <translation id="1529891865407786369">மின்சக்தி மூலம்</translation>
 <translation id="1530838837447122178">மவுஸ் மற்றும் டச்பேட் அமைப்புகளைத் திற</translation>
@@ -479,6 +481,7 @@
 <translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Google கிளவுட் அச்சுடன் பிரிண்டரைச் சேர்த்து, எங்கிருந்தும் அச்சிடலாம்.}other{Google கிளவுட் அச்சுடன் # பிரிண்டர்களைச் சேர்த்து, எங்கிருந்தும் அச்சிடலாம்.}}</translation>
 <translation id="1656528038316521561">பின்னணி ஒளிபுகாத்தன்மை</translation>
 <translation id="1657406563541664238">தானாகவே பயன்பாட்டு புள்ளிவிவரங்களையும் சிதைவு புகார்களையும் Google க்கு அனுப்புவதன் மூலம், <ph name="PRODUCT_NAME" /> ஐ மேலும் சிறப்பானதாக்க உதவுங்கள்</translation>
+<translation id="1657937299377480641">கல்வி தொடர்பான ஆதாரங்களை அணுகுவதற்காக மீண்டும் உள்நுழைய, பெற்றோரின் அனுமதியைக் கோரவும்</translation>
 <translation id="1658424621194652532">இந்தப் பக்கமானது உங்கள் மைக்ரோஃபோனை அணுகுகிறது.</translation>
 <translation id="1660204651932907780">ஒலியை இயக்க, தளங்களை அனுமதிக்கும் (பரிந்துரைக்கப்படுவது)</translation>
 <translation id="1660763353352708040">பவர் அடாப்டர் தொடர்பான சிக்கல்</translation>
@@ -513,8 +516,10 @@
 <translation id="1697686431566694143">கோப்பைத் திருத்து</translation>
 <translation id="1698122934742150150">தற்போதைய மறைநிலை அமர்விற்கு மட்டும்</translation>
 <translation id="1698650002254827833">ஆப்ஸ் பட்டியலை ஏற்ற முடியவில்லை. மீண்டும் முயலவும்.</translation>
+<translation id="1700079447639026019">குக்கீகளை எப்போதுமே பயன்படுத்த முடியாத தளங்கள்</translation>
 <translation id="1701062906490865540">இவரை அகற்று</translation>
 <translation id="1703331064825191675">உங்கள் கடவுச்சொற்களைப் பற்றிய கவலை ஒருபோதும் வேண்டாம்</translation>
+<translation id="1704970325597567340"><ph name="DATE" /> அன்று பாதுகாப்புச் சரிபார்ப்பு மேற்கொள்ளப்பட்டது</translation>
 <translation id="1706586824377653884">உங்கள் நிர்வாகி சேர்த்துள்ளார்</translation>
 <translation id="1706625117072057435">அளவுமாற்ற நிலைகள்</translation>
 <translation id="1708338024780164500">(செயல்படா நிலையில்)</translation>
@@ -687,6 +692,7 @@
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">இதன் மூலம் திற:</translation>
 <translation id="1925021887439448749">பிரத்தியேக இணைய முகவரியை உள்ளிடவும்</translation>
+<translation id="1925124445985510535"><ph name="TIME" />க்குப் பாதுகாப்புச் சரிபார்ப்பு மேற்கொள்ளப்பட்டது</translation>
 <translation id="1926339101652878330">இந்த அமைப்புகள் நிறுவனக் கொள்கையால் கட்டுப்படுத்தப்படுகின்றன. மேலும் தகவலுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.</translation>
 <translation id="1927632033341042996">விரல் <ph name="NEW_FINGER_NUMBER" /></translation>
 <translation id="1928202201223835302">பழைய பின்னை உள்ளிடவும்</translation>
@@ -731,6 +737,7 @@
 <translation id="1990512225220753005">இந்தப் பக்கத்தில் ஷார்ட்கட்களைக் காண்பிக்க வேண்டாம்</translation>
 <translation id="1992397118740194946">அமைக்கப்படவில்லை</translation>
 <translation id="1994173015038366702">தள URL</translation>
+<translation id="1995916364271252349">தளங்கள் எந்தத் தகவல்களைப் பயன்படுத்தலாம், எதைக் காட்டலாம் (இருப்பிடம், கேமரா, பாப்-அப் மற்றும் பல) என்பதைக் கட்டுப்படுத்தும்</translation>
 <translation id="1997484222658892567">உங்கள் கம்ப்யூட்டரில் அதிக அளவு தரவை நிரந்தரமாகச் சேமிக்க <ph name="URL" /> விரும்புகிறது</translation>
 <translation id="1997616988432401742">உங்கள் சான்றிதழ்கள்</translation>
 <translation id="1999115740519098545">தொடக்கத்தில்</translation>
@@ -916,6 +923,7 @@
 <translation id="2232876851878324699">கோப்பில் ஒரு இறக்குமதி செய்யப்படாத சான்றிதழ் உள்ளது:</translation>
 <translation id="2233502537820838181">&amp;மேலும் தகவல்</translation>
 <translation id="2234876718134438132">ஒத்திசைவு &amp; Google சேவைகள்</translation>
+<translation id="2235344399760031203">மூன்றாம் தரப்புக் குக்கீகள் தடுக்கப்பட்டுள்ளன</translation>
 <translation id="2238379619048995541">காலஇடைவெளி நிலையின் தரவு</translation>
 <translation id="2239921694246509981">கண்காணிக்கும் பயனரைச் சேர்</translation>
 <translation id="2241053333139545397">பல இணையதளங்களில் உங்கள் தரவைப் படித்தல் மற்றும் திருத்துதல்</translation>
@@ -985,6 +993,7 @@
 <translation id="2335111415680198280">{0,plural, =1{# சாளரத்தை மூடுக}other{# சாளரங்களை மூடுக}}</translation>
 <translation id="2335122562899522968">இந்தப் பக்கம் குக்கீகளை அமைக்கும்.</translation>
 <translation id="2336228925368920074">அனைத்து தாவல்களையும் புக்மார்க்கிடுக...</translation>
+<translation id="2336376423977300504">சாளரங்கள் மூடப்படும்போது குக்கீகளை எப்போதும் அழி</translation>
 <translation id="2336381494582898602">பவர்வாஷ்</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" /> இணைய விரும்புகிறது</translation>
 <translation id="2342740338116612727">புக்மார்க்குகள் சேர்க்கப்பட்டன</translation>
@@ -1041,6 +1050,7 @@
 <translation id="241082044617551207">அறியப்படாத செருகுநிரல்</translation>
 <translation id="2412593942846481727">புதுப்பிப்பு உள்ளது</translation>
 <translation id="2413749388954403953">புக்மார்க்குகள் பயனர் இடைமுகத்தை மாற்றலாம்</translation>
+<translation id="2417206894320497232">Plugin VM பயன்படுத்தத் தயாராக உள்ளது.</translation>
 <translation id="241727068219398187"><ph name="TIME" /> அன்றைக்கான உங்கள் Google கடவுச்சொல் மூலம் தரவு என்கிரிப்ட் செய்யப்பட்டது.
           இதில் Google Payயிலுள்ள கட்டண முறைகளும் முகவரிகளும் சேர்க்கப்படவில்லை.</translation>
 <translation id="2419706071571366386">பாதுகாப்பிற்காக, கம்ப்யூட்டர் பயன்படுத்தப்படாத போது வெளியேறவும்.</translation>
@@ -1221,6 +1231,7 @@
 <translation id="2637400434494156704">தவறான பின். இன்னும் ஒருமுறை முயலலாம்.</translation>
 <translation id="2638087589890736295">ஒத்திசைவைத் தொடங்க, கடவுச்சொற்றொடர் வேண்டும்</translation>
 <translation id="264083724974021997">உங்கள் மொபைலுடன் இணைக்கவும் - உரையாடல்</translation>
+<translation id="2641065435954454414">பதிவிறக்கத் தயார்படுத்துகிறது</translation>
 <translation id="2642111877055905627">கால்பந்து</translation>
 <translation id="2643698698624765890">சாளரத்தின் மெனுவிலுள்ள நீட்டிப்புகள் என்பதைக் கிளிக் செய்து நீட்டிப்புகளை நிர்வகிக்கவும்.</translation>
 <translation id="264810637653812429">இணக்கமான சாதனங்கள் இல்லை.</translation>
@@ -1303,6 +1314,7 @@
 <translation id="2739191690716947896">பிழைத்திருத்து</translation>
 <translation id="2739240477418971307">உங்கள் அணுகல்தன்மை அமைப்புகளை மாற்றலாம்</translation>
 <translation id="274029851662193272">டிப்ரஸ்டு</translation>
+<translation id="2741713322780029189">மீட்பு டெர்மினலைத் திற</translation>
 <translation id="2741912629735277980">உள்நுழைவுத் திரையில் UIயைக் காட்டு</translation>
 <translation id="274290345632688601">Linux ஆப்ஸ் &amp; கோப்புகள் மீட்டமைக்கப்படுகின்றன.</translation>
 <translation id="2743387203779672305">கிளிப்போர்டுக்கு நகலெடு</translation>
@@ -1539,6 +1551,7 @@
 <translation id="3047644958362961983">நீங்கள் எதிர்கொள்ளும் அசிஸ்டண்ட் சிக்கலை நாங்கள் புரிந்து கொள்ள இந்தத் தகவல் உதவும். இவை 90 நாட்கள் வரை சேமித்து வைக்கப்படும், சம்பந்தப்பட்ட தொழில்நுட்ப மற்றும் கருத்துக் குழுக்களுக்கு மட்டுமே இதற்கான அணுகல் வழங்கப்படும்.</translation>
 <translation id="3053013834507634016">சான்றிதழ் விசைப் பயன்பாடு</translation>
 <translation id="3053273573829329829">பயனர் பின்னை இயக்கு</translation>
+<translation id="3055590424724986000">உங்களின் விருப்பத்திற்குரிய சேவை வழங்குநருடன்</translation>
 <translation id="3058498974290601450">அமைப்புகளில் ஒத்திசைவை எந்த நேரத்திலும் இயக்கலாம்</translation>
 <translation id="3060379269883947824">பேசும் திரையை இயக்கு</translation>
 <translation id="3065041951436100775">தாவல் நிறுத்தப்பட்டது பற்றிய கருத்து.</translation>
@@ -1697,6 +1710,7 @@
 <translation id="3293644607209440645">இந்தப் பக்கத்தை அனுப்பு</translation>
 <translation id="32939749466444286">Linux கண்டெய்னர் தொடங்கவில்லை. மீண்டும் முயலவும்.</translation>
 <translation id="3294437725009624529">கெஸ்ட்</translation>
+<translation id="3296193636298964625">உங்கள் அனைத்துக் கடவுச்சொற்களையும் Chromeமால் சரிபார்க்க முடியவில்லை, ஏனெனில் மிக அதிகமான கடவுச்சொற்கள் உள்ளன.</translation>
 <translation id="329703603001918157">ஷார்ட்கட்டைத் திருத்த முடியவில்லை</translation>
 <translation id="329838636886466101">சரிசெய்</translation>
 <translation id="3298789223962368867">செல்லாத URL உள்ளிடப்பட்டது.</translation>
@@ -1717,6 +1731,7 @@
 <translation id="3317459757438853210">இரு-பக்கம்</translation>
 <translation id="3317678681329786349">கேமராவும் மைக்ரோஃபோனும் தடுக்கப்பட்டன</translation>
 <translation id="3319048459796106952">புதிய &amp;மறைநிலை சாளரம்</translation>
+<translation id="3320630259304269485">பாதுகாப்பு உலாவல் (ஆபத்தான தளங்களிலிருந்து பாதுகாப்பு) மற்றும் பிற பாதுகாப்பு அமைப்புகள்</translation>
 <translation id="3323521181261657960">போனஸ்! கூடுதல் நேரம் பயன்படுத்தலாம்</translation>
 <translation id="3325910708063135066">Mac சிஸ்டம் விருப்பத்தேர்வுகளில் மைக்ரோஃபோன் மற்றும் கேமரா முடக்கப்பட்டுள்ளது</translation>
 <translation id="3328489342742826322">காப்புப்பிரதியிலிருந்து மீட்டமைக்கும் போது 'Linux கோப்புகள்' கோப்புறையில் ஏற்கனவே உள்ள Linux ஆப்ஸும் தரவும் நீக்கப்படும்.</translation>
@@ -1836,6 +1851,7 @@
 <translation id="3487007233252413104">அநாமதேய செயல்பாடு</translation>
 <translation id="348780365869651045">AppCache க்காக காத்திருக்கிறது...</translation>
 <translation id="3488065109653206955">பகுதியளவு செயலாக்கப்பட்டது</translation>
+<translation id="3489025949017384019">பெரும்பாலான தளங்கள் சரியாகச் செயல்படாமல் போகக்கூடும்</translation>
 <translation id="3492788708641132712">ஒத்திசைவு வேலை செய்யவில்லை. மீண்டும் உள்நுழையவும்.</translation>
 <translation id="3493486281776271508">இணைய இணைப்பு அவசியம்</translation>
 <translation id="3493881266323043047">செல்லுபடிக்காலம்</translation>
@@ -1991,8 +2007,10 @@
 <translation id="3688526734140524629">சேனலை மாற்று</translation>
 <translation id="3688578402379768763">புதுப்பித்த நிலையில்</translation>
 <translation id="3688794912214798596">மொழிகளை மாற்றுக...</translation>
+<translation id="3690369331356918524">தரவு மீறலினால் கடவுச்சொற்கள் வெளியாகியிருந்தால் அதுகுறித்து எச்சரிக்கும்</translation>
 <translation id="3691231116639905343">கீபோர்ட் ஆப்ஸ்</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> உங்கள் திரையைப் பகிர விரும்புகிறது</translation>
+<translation id="369135240373237088">பள்ளிக் கணக்கு மூலம் மீண்டும் உள்நுழைக</translation>
 <translation id="3693415264595406141">கடவுச்சொல்:</translation>
 <translation id="3694027410380121301">முந்தைய தாவலைத் தேர்ந்தெடு</translation>
 <translation id="369489984217678710">கடவுச்சொற்களும் பிற உள்நுழைவுத் தரவும்</translation>
@@ -2128,6 +2146,7 @@
 <translation id="3841964634449506551">தவறான கடவுச்சொல்</translation>
 <translation id="3842552989725514455">Serif எழுத்துரு</translation>
 <translation id="3846116211488856547">இணையதளங்கள், Android ஆப்ஸ் மற்றும் பலவற்றை உருவாக்கத் தேவையான கருவிகளைப் பெறுக. Linuxஸை நிறுவ, <ph name="DOWNLOAD_SIZE" /> டேட்டா பயன்படுத்தப்படும்.</translation>
+<translation id="3847319713229060696">வலையைப் பயன்படுத்தும் அனைவருக்கும் பாதுகாப்பை மேம்படுத்த உதவுங்கள்</translation>
 <translation id="385051799172605136">முந்தைய பக்கம்</translation>
 <translation id="3850914401008572843">சிஸ்டம் கோப்புகள் உள்ளதால் இந்தக் கோப்புறையை <ph name="ORIGIN" /> தளத்தால் திறக்க முடியவில்லை</translation>
 <translation id="3851428669031642514">பாதுகாப்பற்ற ஸ்கிரிப்ட்களை ஏற்று</translation>
@@ -2432,6 +2451,7 @@
 <translation id="4263223596040212967">கீபோர்டின் தளவமைப்பை சரிபார்த்துவிட்டு மீண்டும் முயலவும்.</translation>
 <translation id="4263757076580287579">அச்சுப்பொறியைப் பதிவுசெய்தல் ரத்து செய்யப்பட்டது.</translation>
 <translation id="426564820080660648">புதுப்பிப்புகளைப் பார்க்க, ஈத்தர்நெட், வைஃபை அல்லது மொபைல் டேட்டாவைப் பயன்படுத்தவும்.</translation>
+<translation id="4267455501101322486">கல்வி தொடர்பான ஆதாரங்களை அணுகுவதற்கென்று ஒரு கணக்கைச் சேர்க்க, பெற்றோரின் அனுமதியைக் கோரவும்</translation>
 <translation id="4267953847983678297">தானாகவே மொபைல் டேட்டாவுடன் இணை</translation>
 <translation id="4268025649754414643">விசை மாற்றம்</translation>
 <translation id="4270393598798225102">பதிப்பு <ph name="NUMBER" /></translation>
@@ -2471,6 +2491,7 @@
 <translation id="4336434711095810371">அனைத்துத் தரவையும் அழி</translation>
 <translation id="4336979451636460645">நெட்வொர்க் பதிவுகளுக்கு இதைப் பார்க்கவும்: <ph name="DEVICE_LOG_LINK" /></translation>
 <translation id="4340515029017875942"><ph name="ORIGIN" />, "<ph name="EXTENSION_NAME" />" பயன்பாட்டுடன் தொடர்புகொள்ள விழைகிறது</translation>
+<translation id="434404122609091467">உங்களின் தற்போதைய சேவை வழங்குநருடன்</translation>
 <translation id="4345587454538109430">உள்ளமை...</translation>
 <translation id="4345732373643853732">பயனர் பெயர் சேவையகத்தில் இல்லை</translation>
 <translation id="4348766275249686434">பிழைகளைச் சேகரி</translation>
@@ -2509,6 +2530,7 @@
 <translation id="439266289085815679">புளூடூத் உள்ளமைவைக் கட்டுப்படுத்துபவர்: <ph name="USER_EMAIL" />.</translation>
 <translation id="4392896746540753732">உள்ளமைவுக் கோப்பைத் திருத்தும்</translation>
 <translation id="4394049700291259645">முடக்கு</translation>
+<translation id="439817266247065935">உங்கள் சாதனத்தைச் சரியாக ஷட்-டவுன் செய்யவில்லை. Linux ஆப்ஸைப் பயன்படுத்த Linuxஸை மீண்டும் தொடங்கவும்.</translation>
 <translation id="4400367121200150367">கடவுச்சொல்லை ஒருபோதும் சேமிக்க வேண்டாம் எனக் குறிக்கப்பட்ட தளங்கள் இங்கே தோன்றும்</translation>
 <translation id="4400632832271803360">மேல் வரிசையில் உள்ள விசைகளின் செயல்பாட்டை மாற்ற, தொடக்கி விசையைத் தொடர்ந்து அழுத்திப் பிடிக்கவும்</translation>
 <translation id="4400963414856942668">தாவலை புக்மார்க் செய்ய நட்சத்திரத்தை கிளிக் செய்யலாம்</translation>
@@ -2608,6 +2630,7 @@
 <translation id="4534661889221639075">மீண்டும் முயலவும்.</translation>
 <translation id="4535127706710932914">இயல்புநிலை சுயவிவரம்</translation>
 <translation id="4535767533210902251">உங்கள் கீபோர்டின் மேலே வலது ஓரத்தில் கைரேகை சென்சார் உள்ளது. அதை ஏதேனும் ஒரு விரலால் மெதுவாகத் தொடவும்.</translation>
+<translation id="4536140153723794651">குக்கீகளை எப்போதுமே பயன்படுத்தும் தளங்கள்</translation>
 <translation id="4538417792467843292">சொல்லை நீக்கு</translation>
 <translation id="4538684596480161368">எப்போதும் <ph name="HOST" /> இல் சாண்ட்பாக்ஸ் செய்யப்படாத செருகுநிரல்களைத் தடு</translation>
 <translation id="4538792345715658285">நிறுவன கொள்கையால் நிறுவப்பட்டது.</translation>
@@ -2706,6 +2729,7 @@
 <translation id="4665446389743427678"><ph name="SITE" /> சேகரித்த தரவு அனைத்தும் நீக்கப்படும்.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" />ஐ இயக்க, கிளிக் செய்யவும்</translation>
 <translation id="4670064810192446073">விர்ச்சுவல் ரியாலிட்டி</translation>
+<translation id="4672879467403304774">உள்நுழைந்திருக்கும்போது Chromeமிலும் பிற Google ஆப்ஸிலும் உங்களைப் பாதுகாக்கும்</translation>
 <translation id="46733273239502219">நிறுவப்பட்ட ஆப்ஸிலுள்ள ஆஃப்லைன் தரவும் அழிக்கப்படும்</translation>
 <translation id="4673442866648850031">ஸ்டைலஸ் அகற்றப்பட்டதும், ஸ்டைலஸ் கருவிகளைத் திற</translation>
 <translation id="4677772697204437347">GPU நினைவகம்</translation>
@@ -2966,6 +2990,7 @@
 <translation id="5052499409147950210">தளத்தைத் திருத்து</translation>
 <translation id="5053604404986157245">தோராயமாக உருவாக்கப்பட்ட TPM கடவுச்சொல் கிடைக்கவில்லை. இது பவர்வாஷுக்குப் பிறகு இயல்பாக ஏற்படக்கூடியது.</translation>
 <translation id="5057110919553308744">நீங்கள் நீட்டிப்பைக் கிளிக் செய்யும்போது</translation>
+<translation id="5057403786441168405">நீங்கள் உள்நுழைந்துள்ள கணக்குகளை நிர்வகியுங்கள். அனுமதிகளின் அடிப்படையில் உங்கள் அனுபவத்தைப் பிரத்தியேகமானதாக்க Chrome மற்றும் Google Playயில் இருக்கும் தளங்களும் ஆப்ஸும் நீட்டிப்புகளும் இந்தக் கணக்குகளைப் பயன்படுத்தலாம். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="5060332552815861872">சேமிப்பதற்கு ஒரு பிரிண்டர் உள்ளது.</translation>
 <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{இந்தக் கோப்புறையில் ஒரு புத்தகக்குறி உள்ளது. அதை நிச்சயமாக நீக்க விரும்புகிறீர்களா?}other{இந்தக் கோப்புறையில் # புக்மார்க்குகள் உள்ளன. அவற்றை நிச்சயமாக நீக்க விரும்புகிறீர்களா?}}</translation>
 <translation id="5062930723426326933">உள்நுழைவில் தோல்வி, இணையத்துடன் இணைத்து மீண்டும் முயற்சிக்கவும்.</translation>
@@ -3094,6 +3119,7 @@
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" ஐ இயக்கவா?</translation>
 <translation id="5243522832766285132">ஒரு சில வினாடிகளில் மீண்டும் முயலவும்</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />க்கு ஒத்திசைக்கிறது</translation>
+<translation id="5245610266855777041">பள்ளிக் கணக்கு மூலம் தொடங்குக</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> செயலிழந்தது. ஆப்ஸை மறுதொடக்கம் செய்ய இந்த பலூனைக் கிளிக் செய்க.</translation>
 <translation id="5247051749037287028">காட்சிப் பெயர் (விரும்பினால்)</translation>
 <translation id="5249624017678798539">பதிவிறக்கம் நிறைவுபெறுவதற்கு முன்பாகவே உலாவி சிதைவுற்றது.</translation>
@@ -3109,6 +3135,7 @@
 <translation id="5260508466980570042">மன்னிக்கவும், உங்கள் மின்னஞ்சலையும் கடவுச்சொல்லையும் சரிபார்க்க முடியவில்லை. தயவுசெய்து மீண்டும் முயற்சி செய்க.</translation>
 <translation id="5261683757250193089">இணைய அங்காடியில் திற</translation>
 <translation id="5262178194499261222">கடவுச்சொல்லை அகற்று</translation>
+<translation id="5263468185123738872">விருந்தினர் ஆப்ரேட்டிங் சிஸ்டத்தை நிறுவ Plugin VMமைத் தொடங்கவும்.</translation>
 <translation id="5264148714798105376">இதற்கு ஒரு நிமிடம் அல்லது அதற்கும் மேல் ஆகலாம்.</translation>
 <translation id="5264252276333215551">உங்கள் ஆப்ஸை கியோஸ்க் பயன்முறையில் தொடங்க இணையத்துடன் இணைக்கவும்.</translation>
 <translation id="5265562206369321422">ஒரு வாரத்திற்கும் மேலாக ஆஃப்லைனில் உள்ளது</translation>
@@ -3118,6 +3145,7 @@
 <translation id="5275352920323889391">நாய்</translation>
 <translation id="527605982717517565"><ph name="HOST" /> இல் JavaScript ஐ எப்போதும் அனுமதி</translation>
 <translation id="5280174558369304332">அகற்றப்படவுள்ள நீட்டிப்புகள்:</translation>
+<translation id="5280243692621919988">சாளரங்கள் அனைத்தையும் மூடும்போது குக்கீகளையும் வலைதளத் தரவையும் அழி</translation>
 <translation id="5280426389926346830">ஷார்ட்கட்டை உருவாக்கவா?</translation>
 <translation id="528208740344463258">Android ஆப்ஸைப் பதிவிறக்கிப் பயன்படுத்துவதற்கு, தேவையான புதுப்பிப்பை முதலில் நீங்கள் நிறுவ வேண்டும். உங்கள் <ph name="DEVICE_TYPE" /> புதுப்பிக்கப்படும் போது, அதை நீங்கள் பயன்படுத்த முடியாது. நிறுவல் முடிந்ததும், உங்கள் <ph name="DEVICE_TYPE" /> தொடங்கும்.</translation>
 <translation id="5282733140964383898">"கண்காணிக்க வேண்டாம்" என்பதை இயக்குவதால், உங்கள் உலாவல் ட்ராஃபிக்குடன் ஒரு கோரிக்கை இணைக்கப்படும். கோரிக்கைக்கு இணையதளம் பதிலளிக்கிறதா என்பதையும், கோரிக்கை எப்படிப் புரிந்துகொள்ளப்பட்டது என்பதையும் பொறுத்து விளைவுகள் இருக்கும். எடுத்துக்காட்டாக, நீங்கள் பார்வையிட்ட பிற இணையதளங்களைச் சார்ந்திராத விளம்பரங்களை உங்களுக்குக் காட்டுவதன் மூலம் இந்தக் கோரிக்கைக்குச் சில இணையதளங்கள் பதிலளிக்கலாம். பாதுகாப்பை மேம்படுத்துவது, தங்களின் இணையதளங்களில் உள்ளடக்கம், சேவைகள், விளம்பரங்கள் மற்றும் பரிந்துரைகளை வழங்குவது, புள்ளிவிவர அறிக்கைகளை உருவாக்குவது போன்ற காரணங்களுக்காக, பல இணையதளங்கள் தொடர்ந்து நீங்கள் உலாவிய தரவைச் சேகரித்துப் பயன்படுத்தும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
@@ -3285,6 +3313,7 @@
 <translation id="5495597166260341369">திரையை இயக்கத்தில் வை</translation>
 <translation id="5496587651328244253">ஒழுங்கமை</translation>
 <translation id="5499313591153584299">இந்தக் கோப்பு உங்கள் கம்ப்யூட்டருக்குத் தீங்கு விளைவிக்கலாம்.</translation>
+<translation id="5500709606820808700">பாதுகாப்புச் சரிபார்ப்பு இன்று மேற்கொள்ளப்பட்டது</translation>
 <translation id="5502500733115278303">Firefox இலிருந்து இறக்குமதி செய்யப்பட்டது</translation>
 <translation id="5505264765875738116">அறிவிப்புகளை அனுப்புவதற்கான அனுமதியைத் தளங்களால் கோர இயலாது</translation>
 <translation id="5505307013568720083">மை தீர்ந்துவிட்டது</translation>
@@ -3458,6 +3487,7 @@
 <translation id="5722930212736070253">அச்சச்சோ! Zip Archiverரில் ஒரு பிழை நேர்ந்தது.</translation>
 <translation id="572328651809341494">சமீபத்திய தாவல்கள்</translation>
 <translation id="5723508132121499792">இயக்கத்தில் எந்த பின்புல பயன்பாடுகளும் இல்லை</translation>
+<translation id="5723967018671998714">மறைநிலைப் பயன்முறையில் மூன்றாம் தரப்புக் குக்கீகள் தடுக்கப்பட்டுள்ளன</translation>
 <translation id="5727728807527375859">நீட்டிப்புகள், ஆப்ஸ் மற்றும் தீம்கள் ஆகியவை உங்கள் கம்ப்யூட்டருக்குத் தீங்கு விளைவிக்கலாம். நிச்சயமாகத் தொடர விரும்புகிறீர்களா?</translation>
 <translation id="5729712731028706266">&amp;காண்க</translation>
 <translation id="5732392974455271431">உங்களுக்காக, தளத்தின் தடுப்பை உங்கள் பெற்றோர் நீக்க முடியும்</translation>
@@ -3975,6 +4005,7 @@
 <translation id="642469772702851743">இந்தச் சாதனம் (SN: <ph name="SERIAL_NUMBER" />), உரிமையாளரால் பூட்டப்பட்டது.</translation>
 <translation id="6426200009596957090">ChromeVox அமைப்புகளைத் திற</translation>
 <translation id="6428450836711225518">மொபைல் எண்ணைச் சரிபார்த்தல்</translation>
+<translation id="6428982734197629783">படத்தைச் செயல்படுத்துகிறது</translation>
 <translation id="6429384232893414837">புதுப்பிப்பதில் பிழை</translation>
 <translation id="6430814529589430811">Base64-குறியேற்றப்பட்ட ASCII, ஒற்றைச் சான்றிதழ்</translation>
 <translation id="6431347207794742960">இந்தக் கம்ப்யூட்டரில் எல்லா பயனர்களுக்கும் <ph name="PRODUCT_NAME" /> தானியங்குப் புதுப்பிப்புகளை அமைக்கும்</translation>
@@ -4204,6 +4235,7 @@
 <translation id="6767566652486411142">மற்றொரு மொழியைத் தேர்வுசெய்க...</translation>
 <translation id="6767639283522617719">டொமைனுடன் இணைக்க முடியவில்லை. நிறுவன யூனிட்டின் அமைப்புகள் சரியாக இருப்பதை உறுதிசெய்யவும்.</translation>
 <translation id="6769712124046837540">பிரிண்டரைச் சேர்க்கிறது...</translation>
+<translation id="6770602306803890733">உங்களுக்கும் வலையைப் பயன்படுபடுத்துகின்ற அனைவருக்குமான பாதுகாப்பையும் மேம்படுத்தும்</translation>
 <translation id="6770664076092644100">NFC வழியாகச் சரிபார்</translation>
 <translation id="6771503742377376720">இது ஒரு சான்றளிக்கும் மையம்</translation>
 <translation id="6772339735733515807">உங்கள் நீட்டிப்புகளை நிர்வகியுங்கள்</translation>
@@ -4229,6 +4261,7 @@
 <translation id="6798578729981748444">இறக்குவதை முடிக்க, எல்லா Firefox சாளரங்களையும் மூடவும்.</translation>
 <translation id="6798780071646309401">கேப்ஸ்லாக் இயக்கப்பட்டுள்ளது</translation>
 <translation id="6798954102094737107">செருகுநிரல்: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">பொது அமைப்புகள்</translation>
 <translation id="6801435275744557998">டச்ஸ்கிரீனை அளவுத்திருத்தம் செய்</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">சரி</translation>
@@ -4320,6 +4353,7 @@
 <translation id="6922745772873733498">அச்சிடுவதற்குப் பின்னை உள்ளிடவும்</translation>
 <translation id="6923132443355966645">நகர்த்து / கிளிக் செய்</translation>
 <translation id="6923633482430812883">பகிர்வை ஏற்றுவதில் பிழை. நீங்கள் இணைக்கின்ற கோப்புச் சேவையகம் SMBv2 அல்லது அதற்குப் பிந்தைய பதிப்பை ஆதரிக்கிறதா எனச் சரிபார்க்கவும்.</translation>
+<translation id="692615146179981818">இந்தக் கடவுச்சொல்லை அகற்றுவதால் <ph name="DOMAIN" /> இல் உங்கள் கணக்கு நீக்கப்படாது. உங்கள் கணக்கைப் பிறரிடம் இருந்து பாதுகாப்பாக வைக்க உங்கள் கடவுச்சொல்லை மாற்றவும் அல்லது <ph name="DOMAIN" /> இல் இருந்து உங்கள் கணக்கை நீக்கவும்.</translation>
 <translation id="6930036377490597025">இணைக்கக்கூடிய பாதுகாப்பு விசை அல்லது உள்ளமைந்த சென்சார்</translation>
 <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{ஒரு நீட்டிப்பு நிராகரிக்கப்பட்டுள்ளது}other{# நீட்டிப்புகள் நிராகரிக்கப்பட்டுள்ளன}}</translation>
 <translation id="6930321203306643451">மேம்படுத்துதல் நிறைவடைந்தது</translation>
@@ -4346,6 +4380,8 @@
 <translation id="6965382102122355670">சரி</translation>
 <translation id="6965648386495488594">போர்ட்</translation>
 <translation id="6965978654500191972">சாதனம்</translation>
+<translation id="6966201992886493384">உங்கள் உலாவல் அனுபவத்தை மேம்படுத்துவதற்காகக் குக்கீகளைத் தளங்கள் பயன்படுத்த முடியும், உதாரணமாக உங்களை உள்நுழைந்தவாறே வைத்திருப்பது அல்லது ஷாப்பிங் கார்ட்டில் உள்ள பொருட்களை நினைவில்கொள்வது போன்றவை</translation>
+<translation id="696780070563539690">விளம்பரங்களைப் பிரத்தியேகமாக்குவது போன்று வெவ்வேறு தளங்களில் உங்களின் உலாவல் செயல்பாட்டைப் பார்க்கக் குக்கீகளைத் தளங்கள் பயன்படுத்த முடியாது</translation>
 <translation id="6968288415730398122">திரைப் பூட்டை உள்ளமைக்க, கடவுச்சொல்லை உள்ளிடவும்</translation>
 <translation id="6970480684834282392">தொடங்கப்படும் வகை</translation>
 <translation id="6970856801391541997">குறிப்பிட்ட பக்கங்களை அச்சிடு</translation>
@@ -4707,6 +4743,7 @@
 <translation id="7443806024147773267">உங்கள் Google கணக்கில் உள்நுழைந்திருக்கும் போதெல்லாம் உங்கள் கடவுச்சொற்களைப் பயன்படுத்தலாம்</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ஐ முடக்கு</translation>
 <translation id="7448430327655618736">ஆப்ஸைத் தானாகவே நிறுவும்</translation>
+<translation id="7449752890690775568">கடவுச்சொல்லை அகற்றவா?</translation>
 <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> உலாவியில் திறக்கும்</translation>
 <translation id="7453008956351770337">இந்தப் பிரிண்டரைத் தேர்ந்தெடுப்பதன் மூலம், பின்வரும் நீட்டிப்பு உங்கள் பிரிண்டரை அணுகுவதற்கான அனுமதியை வழங்குகிறீர்கள்:</translation>
 <translation id="7454548535253569100">போர்ட்டல்: <ph name="SUBFRAME_SITE" /></translation>
@@ -4753,6 +4790,7 @@
 <translation id="7507207699631365376">இந்த வழங்குநரின் <ph name="BEGIN_LINK" />தனியுரிமைக் கொள்கையைக்<ph name="END_LINK" /> காட்டு</translation>
 <translation id="7507930499305566459">நிலை பதிலளிப்பாளர் சான்றிதழ்</translation>
 <translation id="7508054832109420082">பிரிண்டர்களுக்கான அணுகலை வழங்கு</translation>
+<translation id="751120035300339">உங்களை உள்நுழைந்தவாறு வைத்திருப்பது அல்லது உங்கள் ஷாப்பிங் கார்ட்டில் உள்ள பொருட்களை நினைவில்கொள்வது போன்ற உங்கள் உலாவுதல் அனுபவத்தை மேம்படுத்த தளங்களால் குக்கீகளைப் பயன்படுத்த முடியாது</translation>
 <translation id="7513029293694390567">சேமித்த அனுமதிச் சான்றுகளைப் பயன்படுத்தி இணையதளங்களில் தானாகவே உள்நுழையும். இதை முடக்கினால், இணையதளத்தில் உள்நுழையும் ஒவ்வொரு முறையும் உறுதிப்படுத்த வேண்டும்.</translation>
 <translation id="7514239104543605883">உங்கள் சாதனத்திற்கு நகலெடுங்கள்</translation>
 <translation id="7514365320538308">பதிவிறக்கு</translation>
@@ -4818,6 +4856,7 @@
 <translation id="761530003705945209">Google Driveவிற்குக் காப்புப் பிரதி எடுக்கவும். எப்போது வேண்டுமானாலும் உங்கள் தரவை எளிதாக மீட்டெடுக்கலாம் அல்லது சாதனத்தை மாற்றலாம். ஆப்ஸ் தரவும் உங்கள் காப்புப் பிரதியில் அடங்கும். உங்களின் காப்புப்பிரதிகள் Googleளுக்குப் பதிவேற்றப்பட்டு Google கணக்கின் கடவுச்சொல்லைப் பயன்படுத்தி என்க்ரிப்ஷன் செய்யப்படுகின்றன.</translation>
 <translation id="7616214729753637086">சாதனத்தைப் பதிவுசெய்கிறது...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />" சாதனத்துடன் இணைக்கிறது</translation>
+<translation id="762068974690945752">இங்கே பள்ளிக் கணக்கு ஒன்றைச் சேர்க்கலாம் அல்லது பிள்ளைகளின் கணக்குகளை நிர்வகிக்கலாம். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="7621382409404463535">சாதன உள்ளமைவை சிஸ்டத்தால் சேமிக்க முடியவில்லை.</translation>
 <translation id="7622114377921274169">சார்ஜாகிறது.</translation>
 <translation id="7624337243375417909">கேப்ஸ்லாக் முடக்கப்பட்டுள்ளது</translation>
@@ -5102,6 +5141,7 @@
 <translation id="7961015016161918242">எப்போதும் இல்லை</translation>
 <translation id="7963826112438303517">அசிஸ்டண்ட் உங்கள் குரல் மாதிரியை உருவாக்கவும் மேம்படுத்தவும் இந்தப் பதிவுகளையும் நீங்கள் பேசிய கோரிக்கைகளையும் பயன்படுத்தும், இவை நீங்கள் Voice Matchசை இயக்கியுள்ள சாதனங்களில் மட்டும் சேமிக்கப்படும். அசிஸ்டண்ட் அமைப்புகளில் குரல் செயல்பாட்டைப் பார்க்கலாம் அல்லது மீண்டும் பயிற்சியளிக்கலாம்.</translation>
 <translation id="7966241909927244760">பட முகவரியை ந&amp;கலெடு</translation>
+<translation id="7968072247663421402">வழங்குநர் விருப்பங்கள்</translation>
 <translation id="7968742106503422125">நீங்கள் நகலெடுத்து ஒட்டும் தரவைப் படிக்கலாம், திருத்தலாம்</translation>
 <translation id="7968833647796919681">செயல்திறன் தரவுச் சேகரிப்பை இயக்கு</translation>
 <translation id="7968982339740310781">விவரங்களைக் காண்பி</translation>
@@ -5381,6 +5421,7 @@
 <translation id="8320459152843401447">உங்கள் முழுத் திரை</translation>
 <translation id="8322814362483282060">இந்தப் பக்கம் உங்கள் மைக்ரோஃபோனை அணுகுவதிலிருந்து தடுக்கப்பட்டுள்ளது.</translation>
 <translation id="8323167517179506834">URL ஐத் தட்டச்சு செய்யவும்</translation>
+<translation id="8324784016256120271">விளம்பரங்களைப் பிரத்தியேகமாக்குவது போன்று வெவ்வேறு தளங்களில் உங்களின் உலாவல் செயல்பாட்டைப் பார்க்கக் குக்கீகளைத் தளங்கள் பயன்படுத்த முடியும்</translation>
 <translation id="8326478304147373412">PKCS #7, சான்றிதழ் சங்கிலி</translation>
 <translation id="8327039559959785305">Linux கோப்புகளை ஏற்றுவதில் பிழை ஏற்பட்டது. மீண்டும் முயலவும்.</translation>
 <translation id="8327676037044516220">அனுமதிகளும் உள்ளடக்க அமைப்புகளும்</translation>
@@ -5436,6 +5477,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> நெட்வொர்க், இணைக்கிறது</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">முதலில் கேள் (பரிந்துரைத்தது)</translation>
+<translation id="8417573335434189196">ஆபத்தான இணையதளங்கள், பதிவிறக்கங்கள் அல்லது நீட்டிப்புகளில் இருந்து உங்களைப் பாதுகாக்காது. இந்த அமைப்பை Chrome பரிந்துரைப்பதில்லை.</translation>
 <translation id="8418445294933751433">தாவலாக &amp;காண்பி</translation>
 <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' உடன் பொருந்தும் தேடல் முடிவுகள்</translation>
 <translation id="8419368276599091549">உங்கள் <ph name="DEVICE_TYPE" />க்கு வரவேற்கிறோம்!</translation>
@@ -5600,6 +5642,7 @@
 <translation id="8642947597466641025">உரையை இன்னும் பெரிதாக்கு</translation>
 <translation id="8644655801811752511">இந்தப் பாதுகாப்பு விசையை மீட்டமைக்க முடியவில்லை. விசையைச் செருகிய உடனே அதை மீட்டமைக்க முயலவும்.</translation>
 <translation id="8645354835496065562">தொடர்ந்து சென்சார் அணுகலை அனுமதி</translation>
+<translation id="8645920082661222035">ஆபத்தான நிகழ்வுகள் ஏற்படுவதற்கு முன்பு அவற்றைக் கணித்து உங்களை எச்சரிக்கும்</translation>
 <translation id="8647834505253004544">சரியான இணைய முகவரி அல்ல</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> அல்லது <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">உங்கள் பழைய கணக்கை இனி அணுக முடியாது என்றாலும் அதை அகற்ற முடியும்.</translation>
@@ -5642,6 +5685,7 @@
 <translation id="8688672835843460752">மீதமுள்ளது:</translation>
 <translation id="8691418731028620688">வைஃபையுடன் இணை</translation>
 <translation id="8695825812785969222">Open &amp;Location...</translation>
+<translation id="8698269656364382265">முந்தைய திரைக்குச் செல்வதற்கு இடதுபக்கத்தில் இருந்து ஸ்வைப் செய்யவும்.</translation>
 <translation id="869884720829132584">ஆப்ஸ் மெனு</translation>
 <translation id="869891660844655955">காலாவதியாகும் தேதி</translation>
 <translation id="8703346390800944767">விளம்பரத்தைத் தவிர்</translation>
@@ -5970,6 +6014,7 @@
 <translation id="9101691533782776290">பயன்பாட்டைத் தொடங்கு</translation>
 <translation id="9102610709270966160">நீட்டிப்பை இயக்கு</translation>
 <translation id="9103868373786083162">பின்னே செல்ல அழுத்தவும், வரலாற்றைக் காட்டும் சூழல் மெனு</translation>
+<translation id="9108808586816295166">பாதுகாப்பான DNS எப்போதும் கிடைக்காமல் போகலாம்</translation>
 <translation id="9109122242323516435">இடத்தைக் காலியாக்க, சாதனத்தின் சேமிப்பகத்தில் இருந்து கோப்புகளை நீக்கவும்.</translation>
 <translation id="9109283579179481106">மொபைல் நெட்வொர்க்குடன் இணைத்தல்</translation>
 <translation id="9111102763498581341">பூட்டைத் திற</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index e327de6..6dbfa56 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">แบบอักษร Sans-Serif</translation>
 <translation id="3264582393905923483">บริบท</translation>
 <translation id="3265459715026181080">ปิดหน้าต่าง</translation>
+<translation id="3266274118485960573">กำลังดำเนินการตรวจสอบความปลอดภัย</translation>
 <translation id="3267726687589094446">อนุญาตการดาวน์โหลดไฟล์หลายๆ ไฟล์โดยอัตโนมัติต่อไป</translation>
 <translation id="3268451620468152448">แท็บที่เปิดอยู่</translation>
 <translation id="3269069891205016797">ระบบจะนำข้อมูลของคุณออกจากอุปกรณ์เมื่อคุณออกจากระบบ</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">ข้ามไปที่สิ่งที่เลือก</translation>
 <translation id="3413122095806433232">ผู้ออก CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">ขนาด:</translation>
+<translation id="3416468988018290825">แสดง URL แบบเต็มเสมอ</translation>
 <translation id="3420501302812554910">ต้องรีเซ็ตคีย์ความปลอดภัยภายใน</translation>
 <translation id="3421387094817716717">กุญแจสาธารณะแบบ Elliptic Curve</translation>
 <translation id="3422291238483866753">ถามเมื่อเว็บไซต์ต้องการสร้างแผนที่ 3 มิติของสิ่งที่อยู่รอบตัวคุณหรือติดตามตำแหน่งของกล้อง (แนะนำ)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">สลับปุ่มเมาส์หลัก</translation>
 <translation id="6586604979641883411">การอัปเกรด Linux ต้องใช้พื้นที่ดิสก์ว่างอย่างน้อย <ph name="REQUIRED_SPACE" /> โปรดลบข้อมูลบางส่วนในอุปกรณ์ แล้วลองอีกครั้ง</translation>
 <translation id="6588043302623806746">ใช้ DNS ที่ปลอดภัย</translation>
+<translation id="659005207229852190">ตรวจสอบความปลอดภัยเสร็จสิ้นแล้ว</translation>
 <translation id="6590458744723262880">เปลี่ยนชื่อโฟลเดอร์</translation>
 <translation id="6592267180249644460">บันทึก WebRTC ที่จับภาพ <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">บันทึกลายนิ้วมือของคุณได้แล้ว</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">เสนอให้แปลหน้าที่ไม่ได้อยู่ในภาษาที่คุณอ่านได้</translation>
 <translation id="8251441930213048644">รีเฟรชเลย</translation>
 <translation id="8251578425305135684">รูปภาพขนาดย่อถูกลบแล้ว</translation>
+<translation id="825238165904109940">แสดง URL แบบเต็มเสมอ</translation>
 <translation id="8252569384384439529">กำลังอัปโหลด...</translation>
 <translation id="8253198102038551905">คลิก "+" เพื่อดูคุณสมบัติของเครือข่าย</translation>
 <translation id="8254954272268479918">ปิด Linux (เบต้า)</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 63b3597..0ae5ad0 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Sans-serif yazı tipi</translation>
 <translation id="3264582393905923483">Bağlam</translation>
 <translation id="3265459715026181080">Pencereyi Kapat</translation>
+<translation id="3266274118485960573">Güvenlik kontrolü çalışıyor.</translation>
 <translation id="3267726687589094446">Otomatik olarak birden fazla dosya indirilmesine izin vermeye devam et</translation>
 <translation id="3268451620468152448">Açık Sekmeler</translation>
 <translation id="3269069891205016797">Oturumu kapattığınızda bilgileriniz cihazdan kaldırılacak.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Seçim'e Atla</translation>
 <translation id="3413122095806433232">CA Verenler: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Boyut:</translation>
+<translation id="3416468988018290825">Her zaman URL'leri tam olarak göster</translation>
 <translation id="3420501302812554910">Dahili güvenlik anahtarının sıfırlanması gerekiyor</translation>
 <translation id="3421387094817716717">Eliptik Eğri Ortak Anahtarı</translation>
 <translation id="3422291238483866753">Bir site çevremin 3D haritasını oluşturmak veya kamera konumunu takip etmek istediğinde sor (önerilir)</translation>
@@ -4165,6 +4167,7 @@
 <translation id="6586451623538375658">Birincil fare düğmesini değiştir</translation>
 <translation id="6586604979641883411">Linux'un yeni sürüme geçirilmesi için en az <ph name="REQUIRED_SPACE" /> boş alan gerekiyor. Lütfen cihazınızda biraz yer açıp tekrar deneyin.</translation>
 <translation id="6588043302623806746">Güvenli DNS kullan</translation>
+<translation id="659005207229852190">Güvenlik kontrolü tamamlandı.</translation>
 <translation id="6590458744723262880">Klasörü yeniden adlandırın</translation>
 <translation id="6592267180249644460">WebRTC günlüğü yakalandı: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Parmak iziniz alındı</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Okuduğum dilde olmayan sayfaları çevirmeyi öner</translation>
 <translation id="8251441930213048644">Şimdi yenile</translation>
 <translation id="8251578425305135684">Küçük resim kaldırıldı.</translation>
+<translation id="825238165904109940">Her Zaman URL'leri Tam Olarak Göster</translation>
 <translation id="8252569384384439529">Yükleniyor...</translation>
 <translation id="8253198102038551905">Ağ özelliklerini almak için "+" işaretini tıklayın</translation>
 <translation id="8254954272268479918">Linux'u (Beta) kapat</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 8b5b863..b8123164 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Шрифт Sans-serif</translation>
 <translation id="3264582393905923483">Контекст</translation>
 <translation id="3265459715026181080">Закрити вікно</translation>
+<translation id="3266274118485960573">Триває перевірка безпеки.</translation>
 <translation id="3267726687589094446">Надалі дозволяти автоматичне завантаження декількох файлів</translation>
 <translation id="3268451620468152448">Відкриті вкладки</translation>
 <translation id="3269069891205016797">Коли ви вийдете з облікового запису, вашу інформацію буде вилучено з пристрою.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Перейти до виділення</translation>
 <translation id="3413122095806433232">Видавці ЦС: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Розмір:</translation>
+<translation id="3416468988018290825">Завжди показувати повні URL-адреси</translation>
 <translation id="3420501302812554910">Потрібно скинути внутрішній ключ безпеки</translation>
 <translation id="3421387094817716717">Відкритий ключ еліптичних кривих</translation>
 <translation id="3422291238483866753">Запитувати, коли сайт хоче створити 3D-карту вашого оточення або відстежувати положення камери (рекомендовано)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Змінити основну кнопку миші</translation>
 <translation id="6586604979641883411">Щоб оновити Linux, необхідно принаймні <ph name="REQUIRED_SPACE" /> вільного місця на диску. Звільніть місце на пристрої й повторіть спробу.</translation>
 <translation id="6588043302623806746">Використовувати безпечну систему DNS</translation>
+<translation id="659005207229852190">Перевірку безпеки завершено.</translation>
 <translation id="6590458744723262880">Перейменувати папку</translation>
 <translation id="6592267180249644460">Журнал WebRTC створено: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Відбиток пальця відскановано</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Пропонувати переклад сторінок, якщо їх мова відрізняється від мови у веб-переглядачі</translation>
 <translation id="8251441930213048644">Оновити</translation>
 <translation id="8251578425305135684">Ескіз видалено.</translation>
+<translation id="825238165904109940">Завжди показувати повні URL-адреси</translation>
 <translation id="8252569384384439529">Завантаження…</translation>
 <translation id="8253198102038551905">Натисніть "+", щоб відобразити властивості мережі</translation>
 <translation id="8254954272268479918">Вимкнути Linux (бета-версія)</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 864f4f5..fdd3fb9b 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1704,6 +1704,7 @@
 <translation id="3264544094376351444">‏Sans-serif فونٹ</translation>
 <translation id="3264582393905923483">سیاق و سباق</translation>
 <translation id="3265459715026181080">ونڈو کو بند کریں</translation>
+<translation id="3266274118485960573">سیفٹی چیک چل رہا ہے۔</translation>
 <translation id="3267726687589094446">متعدد فائلوں کے خودکار ڈاؤن لوڈز کو اجازت دینا جاری رکھیں</translation>
 <translation id="3268451620468152448">کھلے ٹیبز</translation>
 <translation id="3269069891205016797">آپ کے سائن آؤٹ ہونے پر آپ کی معلومات آلہ سے ہٹا دی جائے گی۔</translation>
@@ -1809,6 +1810,7 @@
 <translation id="3412265149091626468">انتخاب پر جائیں</translation>
 <translation id="3413122095806433232">‏CA جاری کنندگان: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">سائز:</translation>
+<translation id="3416468988018290825">‏ہمیشہ مکمل URLs دکھائیں</translation>
 <translation id="3420501302812554910">داخلی سیکیورٹی کلید کو دوبارہ ترتیب دینے کی ضرورت ہے</translation>
 <translation id="3421387094817716717">‏Elliptic Curve عوامی کلید</translation>
 <translation id="3422291238483866753">‏جب کوئی سائٹ آپ کے اطراف کا 3D نقشہ تخلیق یا کیمرے کی پوزیشن ٹریک کرنا چاہے تو پوچھیں (تجویز کردہ)</translation>
@@ -4165,6 +4167,7 @@
 <translation id="6586451623538375658">ابتدائی ماؤس بٹن سویپ کریں</translation>
 <translation id="6586604979641883411">‏Linux کو اپ گریڈ کرنے کے لیے کم از کم ڈسک کی <ph name="REQUIRED_SPACE" /> خالی جگہ درکار ہے۔ براہ کرم اپنے آلہ پر کچھ جگہ خالی کریں اور دوبارہ کوشش کریں۔</translation>
 <translation id="6588043302623806746">‏محفوظ DNS استعمال کریں</translation>
+<translation id="659005207229852190">سیفٹی چیک مکمل ہو گیا ہے۔</translation>
 <translation id="6590458744723262880">فولڈر کا نام تبدیل کریں</translation>
 <translation id="6592267180249644460">‏WebRTC لاگ کیپچر کرنے کا وقت <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">آپ کا فنگر پرنٹ کیپچر ہو گیا تھا</translation>
@@ -5425,6 +5428,7 @@
 <translation id="8249672078237421304">ان صفحات کا ترجمہ کرنے کی پیشکش کریں جو آپ کے مطالعہ کی زبان میں نہیں ہیں</translation>
 <translation id="8251441930213048644">اب ریفریش کریں</translation>
 <translation id="8251578425305135684">تھمب نیل کو ہٹا دیا گیا۔</translation>
+<translation id="825238165904109940">‏ہمیشہ مکمل URLs دکھائیں</translation>
 <translation id="8252569384384439529">اپ لوڈ ہو رہی ہے...</translation>
 <translation id="8253198102038551905">نیٹ ورک کی خصوصیات حاصل کرنے کیلئے '+' پر کلک کریں</translation>
 <translation id="8254954272268479918">‏Linux (بی ٹا) بند کریں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index f119bacb..c9e79d0 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -459,7 +459,7 @@
 <translation id="1616206807336925449">Bu kengaytmaga maxsus ruxsatlarni talab qilmaydi.</translation>
 <translation id="1616298854599875024">Umumiy modul hisoblanmagan <ph name="IMPORT_NAME" /> kengaytmasini import qilib bo‘lmadi</translation>
 <translation id="1618268899808219593">&amp;Yordam markazi</translation>
-<translation id="1620307519959413822">Parol xato. Qayta urining yoki tiklash uchun Parolni unutdim tugmasini bosing.</translation>
+<translation id="1620307519959413822">Parol xato. Qayta urining yoki tiklash uchun “Parolni unutdim” yozuvini bosing.</translation>
 <translation id="1620510694547887537">Kamera</translation>
 <translation id="1623132449929929218">Rasmlar hozircha mavjud emas. Kolleksiyalarni olish uchun internetga qayta ulaning.</translation>
 <translation id="1627276047960621195">Fayl deskriptorlari</translation>
@@ -1701,6 +1701,7 @@
 <translation id="3264544094376351444">Sans-serif shrift</translation>
 <translation id="3264582393905923483">Kontekst</translation>
 <translation id="3265459715026181080">Oynani yopish</translation>
+<translation id="3266274118485960573">Xavfsizlik tekshiruvi bajarilmoqda.</translation>
 <translation id="3267726687589094446">Bir necha fayllarni birdaniga avtomatik yuklab olishga hali ham ruxsat berilsin</translation>
 <translation id="3268451620468152448">Ochiq ichki oynalar</translation>
 <translation id="3269069891205016797">Tizimdan chiqishingiz bilan ma’lumotlaringiz o‘chirib yuboriladi.</translation>
@@ -1806,6 +1807,7 @@
 <translation id="3412265149091626468">Belgilanishga o‘tish</translation>
 <translation id="3413122095806433232">Sertifikatlash markazi noshiri: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Hajmi:</translation>
+<translation id="3416468988018290825">Doim butun URL manzillar chiqarilsin</translation>
 <translation id="3420501302812554910">Ichki elektron kalit sozlamalari qayta tiklanishi zarur</translation>
 <translation id="3421387094817716717">Elliptik egri chiziqli ochiq kalit</translation>
 <translation id="3422291238483866753">Saytlar atrofingiz 3D xaritasini yaratish yoki kamera holatini kuzatishdan oldin ruxsat olsin (tavsiya etiladi)</translation>
@@ -3132,7 +3134,7 @@
 <translation id="5213891612754844763">Proksi-server sozlamalari</translation>
 <translation id="5215502535566372932">Mamlakatni tanlang</translation>
 <translation id="521582610500777512">Rasm o‘chirildi</translation>
-<translation id="5222403284441421673">Himoyalanmagan yuklanma bloklandi</translation>
+<translation id="5222403284441421673">Xavfli yuklanma bloklandi</translation>
 <translation id="5222676887888702881">Tizimdan chiqish</translation>
 <translation id="52232769093306234">Arxivlab bo‘lmadi.</translation>
 <translation id="5225324770654022472">“Xizmatlar” tugmasini ko‘rsatish</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">Sichqoncha tugmalarining o‘rnini almashtirish</translation>
 <translation id="6586604979641883411">Linux yangilanishi uchun kamida <ph name="REQUIRED_SPACE" /> joy ochilishi zarur. Qurilmada joy ochib, qayta urining.</translation>
 <translation id="6588043302623806746">Xavfsiz DNS ishlatish</translation>
+<translation id="659005207229852190">Xavfsizlik tekshiruvi tamomlandi.</translation>
 <translation id="6590458744723262880">Jild nomini o‘zgartirish</translation>
 <translation id="6592267180249644460">WebRTC jurnali yozib olinganligi vaqti: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Barmoq izingiz olindi</translation>
@@ -5420,6 +5423,7 @@
 <translation id="8249672078237421304">Agar sahifa tili brauzer tilidan farq qilsa, uni tarjima qilish taklif qilinsin</translation>
 <translation id="8251441930213048644">Hozir yangilash</translation>
 <translation id="8251578425305135684">Tezkor havola o‘chirildi.</translation>
+<translation id="825238165904109940">Doim butun URL manzillar chiqarilsin</translation>
 <translation id="8252569384384439529">Yuklanmoqda…</translation>
 <translation id="8253198102038551905">Tarmoq xususiyatlarini ko‘rish uchun “+” ustiga bosing</translation>
 <translation id="8254954272268479918">Linux (Beta) ishini yakunlash</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index d01b6cb..b2e62293 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1703,6 +1703,7 @@
 <translation id="3264544094376351444">Phông chữ Sans-serif</translation>
 <translation id="3264582393905923483">Ngữ cảnh</translation>
 <translation id="3265459715026181080">Đóng Cửa sổ</translation>
+<translation id="3266274118485960573">Đang chạy tính năng kiểm tra an toàn.</translation>
 <translation id="3267726687589094446">Tiếp tục cho phép tự động tải nhiều tệp xuống</translation>
 <translation id="3268451620468152448">Tab đang mở</translation>
 <translation id="3269069891205016797">Thông tin của bạn sẽ được xóa khỏi thiết bị khi bạn đăng xuất.</translation>
@@ -1808,6 +1809,7 @@
 <translation id="3412265149091626468">Chuyển tới Phần lựa chọn</translation>
 <translation id="3413122095806433232">Nhà cung cấp CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Kích thước:</translation>
+<translation id="3416468988018290825">Luôn hiển thị URL đầy đủ</translation>
 <translation id="3420501302812554910">Cần phải đặt lại khóa bảo mật nội bộ</translation>
 <translation id="3421387094817716717">Khóa công khai đường cong elip</translation>
 <translation id="3422291238483866753">Hỏi khi một trang web muốn tạo bản đồ 3D về các khu vực xung quanh bạn hoặc theo dõi thông tin vị trí của máy ảnh (khuyên dùng)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Hoán đổi nút chuột chính</translation>
 <translation id="6586604979641883411">Cần có tối thiểu <ph name="REQUIRED_SPACE" /> dung lượng ổ đĩa trống để nâng cấp Linux. Vui lòng giải phóng một số dung lượng trên thiết bị rồi thử lại.</translation>
 <translation id="6588043302623806746">Sử dụng hệ thống tên miền (DNS) bảo mật</translation>
+<translation id="659005207229852190">Đã hoàn tất kiểm tra an toàn.</translation>
 <translation id="6590458744723262880">Đổi tên thư mục</translation>
 <translation id="6592267180249644460">Đã ghi nhật ký WebRTC vào <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Hệ thống đã ghi lại vân tay của bạn</translation>
@@ -5424,6 +5427,7 @@
 <translation id="8249672078237421304">Đề xuất dịch các trang không phải bằng ngôn ngữ bạn đã đọc</translation>
 <translation id="8251441930213048644">Làm mới ngay</translation>
 <translation id="8251578425305135684">Đã xóa hình thu nhỏ.</translation>
+<translation id="825238165904109940">Luôn hiển thị URL đầy đủ</translation>
 <translation id="8252569384384439529">Đang tải lên...</translation>
 <translation id="8253198102038551905">Hãy nhấp vào '+' để nhận thuộc tính mạng</translation>
 <translation id="8254954272268479918">Tắt Linux (Thử nghiệm)</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 427df8ac..99f0587 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1699,6 +1699,7 @@
 <translation id="3264544094376351444">Sans-serif 字体</translation>
 <translation id="3264582393905923483">上下文</translation>
 <translation id="3265459715026181080">关闭窗口</translation>
+<translation id="3266274118485960573">正在运行安全检查。</translation>
 <translation id="3267726687589094446">继续允许自动下载多个文件</translation>
 <translation id="3268451620468152448">打开的标签页</translation>
 <translation id="3269069891205016797">在您退出后,系统会自动从此设备上移除您的信息。</translation>
@@ -1804,6 +1805,7 @@
 <translation id="3412265149091626468">跳到所选部分</translation>
 <translation id="3413122095806433232">CA 证书颁发者:<ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">大小:</translation>
+<translation id="3416468988018290825">一律显示完整网址</translation>
 <translation id="3420501302812554910">需要重置内部安全密钥</translation>
 <translation id="3421387094817716717">椭圆曲线公共密钥</translation>
 <translation id="3422291238483866753">在网站想为您的周边环境创建 3D 地图或跟踪摄像头位置时询问您(推荐)</translation>
@@ -4159,6 +4161,7 @@
 <translation id="6586451623538375658">切换鼠标主按钮</translation>
 <translation id="6586604979641883411">必须有至少 <ph name="REQUIRED_SPACE" /> 的可用磁盘空间,才能升级 Linux。请在您的设备上释放一些空间,然后重试。</translation>
 <translation id="6588043302623806746">使用安全 DNS</translation>
+<translation id="659005207229852190">已完成安全检查。</translation>
 <translation id="6590458744723262880">重命名文件夹</translation>
 <translation id="6592267180249644460">WebRTC日志记录时间:<ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">已捕获您的指纹</translation>
@@ -5418,6 +5421,7 @@
 <translation id="8249672078237421304">询问是否翻译非您所用语言的网页</translation>
 <translation id="8251441930213048644">立即刷新</translation>
 <translation id="8251578425305135684">已删除缩略图。</translation>
+<translation id="825238165904109940">一律显示完整网址</translation>
 <translation id="8252569384384439529">正在上传…</translation>
 <translation id="8253198102038551905">点击“+”可查看网络属性</translation>
 <translation id="8254954272268479918">关闭 Linux 虚拟机(测试版)</translation>
@@ -5532,7 +5536,7 @@
 <translation id="8408068190360279472">“<ph name="NETWORK_TYPE" />”类型的网络,正在连接</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">先询问(推荐)</translation>
-<translation id="8417548266957501132">家长的登录密码</translation>
+<translation id="8417548266957501132">家长登录密码</translation>
 <translation id="8417573335434189196">不会保护您免受危险网站、下载内容或扩展程序的侵害。Chrome 不建议您使用此设置。</translation>
 <translation id="8418445294933751433">显示为标签页(&amp;S)</translation>
 <translation id="8419098111404128271">与“<ph name="SEARCH_TEXT" />”相符的搜索结果</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index f712e7c..0fc36a9 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1701,6 +1701,7 @@
 <translation id="3264544094376351444">Sans-serif 字型</translation>
 <translation id="3264582393905923483">內容</translation>
 <translation id="3265459715026181080">關閉視窗</translation>
+<translation id="3266274118485960573">執行緊安全檢查。</translation>
 <translation id="3267726687589094446">繼續允許自動下載多個檔案</translation>
 <translation id="3268451620468152448">開啟的分頁</translation>
 <translation id="3269069891205016797">登出帳戶後,系統會將您的資料從裝置上移除。</translation>
@@ -1806,6 +1807,7 @@
 <translation id="3412265149091626468">跳至所選範圍</translation>
 <translation id="3413122095806433232">CA 發行者:<ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">大小:</translation>
+<translation id="3416468988018290825">一律顯示完整網址</translation>
 <translation id="3420501302812554910">必須重設內部安全密鑰</translation>
 <translation id="3421387094817716717">橢圓曲線公開金鑰</translation>
 <translation id="3422291238483866753">在網站要求建立您身處環境的 3D 地圖或追蹤攝錄機位置時詢問您 (建議)</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">調換滑鼠主按鈕</translation>
 <translation id="6586604979641883411">升級 Linux 需要至少 <ph name="REQUIRED_SPACE" /> 的可用磁碟空間。請在裝置上釋出儲存空間,然後再試一次。</translation>
 <translation id="6588043302623806746">使用安全 DNS</translation>
+<translation id="659005207229852190">完成咗安全檢查。</translation>
 <translation id="6590458744723262880">重新命名資料夾</translation>
 <translation id="6592267180249644460">WebRTC 記錄擷取時間:<ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">已擷取您的指紋</translation>
@@ -5421,6 +5424,7 @@
 <translation id="8249672078237421304">詢問是否把網頁翻譯為您慣用的語言</translation>
 <translation id="8251441930213048644">立即重新整理</translation>
 <translation id="8251578425305135684">已移除縮圖。</translation>
+<translation id="825238165904109940">一律顯示完整網址</translation>
 <translation id="8252569384384439529">正在上載…</translation>
 <translation id="8253198102038551905">按一下 [+] 以取得網絡屬性</translation>
 <translation id="8254954272268479918">關閉 Linux (Beta 版本)</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 2e4e350..4b3b4d8e 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1702,6 +1702,7 @@
 <translation id="3264544094376351444">Sans-serif 字型</translation>
 <translation id="3264582393905923483">內容</translation>
 <translation id="3265459715026181080">關閉視窗</translation>
+<translation id="3266274118485960573">正在執行安全檢查。</translation>
 <translation id="3267726687589094446">繼續允許自動下載多個檔案</translation>
 <translation id="3268451620468152448">開啟的分頁</translation>
 <translation id="3269069891205016797">系統會在你登出後將你的資訊從裝置上移除。</translation>
@@ -1807,6 +1808,7 @@
 <translation id="3412265149091626468">跳至所選範圍</translation>
 <translation id="3413122095806433232">CA 發行者:<ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">空間大小:</translation>
+<translation id="3416468988018290825">一律顯示完整網址</translation>
 <translation id="3420501302812554910">必須重設內部安全金鑰</translation>
 <translation id="3421387094817716717">橢圓曲線公開金鑰</translation>
 <translation id="3422291238483866753">網站必須先詢問你,才能根據你的周遭環境建立 3D 地圖或追蹤攝影機位置 (建議)</translation>
@@ -4162,6 +4164,7 @@
 <translation id="6586451623538375658">調換滑鼠主按鈕</translation>
 <translation id="6586604979641883411">升級 Linux 至少需要 <ph name="REQUIRED_SPACE" /> 的可用磁碟空間。請在裝置上釋出一些空間,然後再試一次。</translation>
 <translation id="6588043302623806746">使用安全 DNS</translation>
+<translation id="659005207229852190">安全檢查作業已完成。</translation>
 <translation id="6590458744723262880">重新命名資料夾</translation>
 <translation id="6592267180249644460">WebRTC 記錄擷取時間:<ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">已擷取你的指紋</translation>
@@ -5421,6 +5424,7 @@
 <translation id="8249672078237421304">詢問是否將網頁翻譯成你慣用的語言</translation>
 <translation id="8251441930213048644">立即重新整理</translation>
 <translation id="8251578425305135684">已移除縮圖。</translation>
+<translation id="825238165904109940">一律顯示完整網址</translation>
 <translation id="8252569384384439529">上傳中...</translation>
 <translation id="8253198102038551905">按一下 [+] 即可查看網路屬性</translation>
 <translation id="8254954272268479918">關閉 Linux (Beta 版)</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 1692404..833fb9d 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1701,6 +1701,7 @@
 <translation id="3264544094376351444">I-fonti ye-Sans-serif</translation>
 <translation id="3264582393905923483">Okuqukethwe</translation>
 <translation id="3265459715026181080">Vala iwindi</translation>
+<translation id="3266274118485960573">Ukuhlola kokuphepha kuyaqalisa.</translation>
 <translation id="3267726687589094446">Qhubeka uvumele ukulanda okuzenzakalelayo kwamafayela amaningi</translation>
 <translation id="3268451620468152448">Vula amathebhu</translation>
 <translation id="3269069891205016797">Ulwazi lwakho luzosuswa kusuka kudivayisi uma uphuma.</translation>
@@ -1806,6 +1807,7 @@
 <translation id="3412265149091626468">Yeqela kokukhethiwe</translation>
 <translation id="3413122095806433232">Izikhiphi ze-CA: <ph name="LOCATION" /></translation>
 <translation id="3414952576877147120">Usayizi:</translation>
+<translation id="3416468988018290825">Njalo nje bonisa ama-URL agcwele</translation>
 <translation id="3420501302812554910">Ukhiye wokuqinisekisa ubunikazi wangaphakathi udinga ukusethwa kabusha</translation>
 <translation id="3421387094817716717">Ukhiye osesidlangalaleni wejika le-elliptic</translation>
 <translation id="3422291238483866753">Buza uma amasayithi efuna ukudala imephu ye-3D yendawo ekuzungezile noma ukulandelela indawo yekhamera (kuyanconywa)</translation>
@@ -4164,6 +4166,7 @@
 <translation id="6586451623538375658">Swayipha inkinobho yegundane eyinhloko</translation>
 <translation id="6586604979641883411">Okungenani u-<ph name="REQUIRED_SPACE" /> wesikhala sediski okhululekile uyadingeka ukuthuthukisa i-Linux. Sicela ukhulule isikhala kudivayisi yakho bese uyazama futhi.</translation>
 <translation id="6588043302623806746">Sebenzisa i-DNS evikelekile</translation>
+<translation id="659005207229852190">Ukuhlola kokuphepha kuqedile.</translation>
 <translation id="6590458744723262880">Qamba kabusha ifolda</translation>
 <translation id="6592267180249644460">Ilogi ye-WebRTC ithwetshuliwe ngomhla ka-<ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">Isigxivizo sakho somunwe sithwetshuliwe</translation>
@@ -5423,6 +5426,7 @@
 <translation id="8249672078237421304">Nikezela ngokuhumusha amakhasi angekho kulimi olifundayo</translation>
 <translation id="8251441930213048644">Vuselela manje</translation>
 <translation id="8251578425305135684">Isithombe esincane sisusiwe.</translation>
+<translation id="825238165904109940">Njalo nje Bonisa ama-URL Agcwele</translation>
 <translation id="8252569384384439529">Iyalayisha...</translation>
 <translation id="8253198102038551905">Chofoza u-'+' ukuze uthole imininingwane yenethiwekhi</translation>
 <translation id="8254954272268479918">Vala i-Linux (Beta)</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 2a901b0..19bb780 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -736,6 +736,47 @@
                   net::EFFECTIVE_CONNECTION_TYPE_LAST,
               "ECT enum value is not handled.");
 
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitNone[] = {
+    {"max_srp_prefetches", "-1"}};
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitZero[] = {
+    {"max_srp_prefetches", "0"}};
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitOne[] = {
+    {"max_srp_prefetches", "1"}};
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitTwo[] = {
+    {"max_srp_prefetches", "2"}};
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitThree[] = {
+    {"max_srp_prefetches", "3"}};
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitFour[] = {
+    {"max_srp_prefetches", "4"}};
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitFive[] = {
+    {"max_srp_prefetches", "5"}};
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitTen[] = {
+    {"max_srp_prefetches", "10"}};
+const FeatureEntry::FeatureParam kIsolatedPrerenderPrefetchLimitFifteen[] = {
+    {"max_srp_prefetches", "15"}};
+
+const FeatureEntry::FeatureVariation
+    kIsolatedPrerenderFeatureWithPrefetchLimit[] = {
+        {"Unlimited Prefetches", kIsolatedPrerenderPrefetchLimitNone,
+         base::size(kIsolatedPrerenderPrefetchLimitNone), nullptr},
+        {"Zero Prefetches", kIsolatedPrerenderPrefetchLimitZero,
+         base::size(kIsolatedPrerenderPrefetchLimitZero), nullptr},
+        {"One Prefetch", kIsolatedPrerenderPrefetchLimitOne,
+         base::size(kIsolatedPrerenderPrefetchLimitOne), nullptr},
+        {"Two Prefetches", kIsolatedPrerenderPrefetchLimitTwo,
+         base::size(kIsolatedPrerenderPrefetchLimitTwo), nullptr},
+        {"Three Prefetches", kIsolatedPrerenderPrefetchLimitThree,
+         base::size(kIsolatedPrerenderPrefetchLimitThree), nullptr},
+        {"Four Prefetches", kIsolatedPrerenderPrefetchLimitFour,
+         base::size(kIsolatedPrerenderPrefetchLimitFour), nullptr},
+        {"Five Prefetches", kIsolatedPrerenderPrefetchLimitFive,
+         base::size(kIsolatedPrerenderPrefetchLimitFive), nullptr},
+        {"Ten Prefetches", kIsolatedPrerenderPrefetchLimitTen,
+         base::size(kIsolatedPrerenderPrefetchLimitTen), nullptr},
+        {"Fifteen Prefetches", kIsolatedPrerenderPrefetchLimitFifteen,
+         base::size(kIsolatedPrerenderPrefetchLimitFifteen), nullptr},
+};
+
 #if defined(OS_ANDROID)
 const FeatureEntry::FeatureParam
     kAutofillKeyboardAccessoryFeatureVariationAnimationDuration[] = {
@@ -2426,10 +2467,16 @@
      flag_descriptions::kEnablePreviewsCoinFlipName,
      flag_descriptions::kEnablePreviewsCoinFlipDescription, kOsAll,
      FEATURE_VALUE_TYPE(previews::features::kCoinFlipHoldback)},
+    {"enable-google-srp-isolated-prerender-probing",
+     flag_descriptions::kEnableSRPIsolatedPrerenderProbingName,
+     flag_descriptions::kEnableSRPIsolatedPrerenderProbingDescription, kOsAll,
+     FEATURE_VALUE_TYPE(features::kIsolatePrerendersMustProbeOrigin)},
     {"enable-google-srp-isolated-prerenders",
      flag_descriptions::kEnableSRPIsolatedPrerendersName,
      flag_descriptions::kEnableSRPIsolatedPrerendersDescription, kOsAll,
-     FEATURE_VALUE_TYPE(features::kIsolatePrerenders)},
+     FEATURE_WITH_PARAMS_VALUE_TYPE(features::kIsolatePrerenders,
+                                    kIsolatedPrerenderFeatureWithPrefetchLimit,
+                                    "Prefetch Limit")},
     {"allow-insecure-localhost", flag_descriptions::kAllowInsecureLocalhostName,
      flag_descriptions::kAllowInsecureLocalhostDescription, kOsAll,
      SINGLE_VALUE_TYPE(switches::kAllowInsecureLocalhost)},
diff --git a/chrome/browser/availability/availability_prober.h b/chrome/browser/availability/availability_prober.h
index bcd4351..04c284c8 100644
--- a/chrome/browser/availability/availability_prober.h
+++ b/chrome/browser/availability/availability_prober.h
@@ -42,8 +42,7 @@
 class SharedURLLoaderFactory;
 }  // namespace network
 
-typedef base::RepeatingCallback<void(bool)>
-    AvailabilityProberOnCompleteCallback;
+typedef base::OnceCallback<void(bool)> AvailabilityProberOnCompleteCallback;
 
 // This class is a utility to probe a given URL with a given set of behaviors.
 // This can be used for determining whether a specific network resource is
diff --git a/chrome/browser/browser_switcher/bho/BUILD.gn b/chrome/browser/browser_switcher/bho/BUILD.gn
index 3d16f13..56203fe 100644
--- a/chrome/browser/browser_switcher/bho/BUILD.gn
+++ b/chrome/browser/browser_switcher/bho/BUILD.gn
@@ -86,50 +86,49 @@
   ]
 }
 
-if (is_clang) {
-  browser_switcher_x64_toolchain = "//build/toolchain/win:win_clang_x64"
-  browser_switcher_x86_toolchain = "//build/toolchain/win:win_clang_x86"
-} else {
-  browser_switcher_x64_toolchain = "//build/toolchain/win:x64"
-  browser_switcher_x86_toolchain = "//build/toolchain/win:x86"
-}
-
+assert(is_clang)
 browser_switcher_x64_label =
-    ":browser_switcher_bho($browser_switcher_x64_toolchain)"
-browser_switcher_x86_label =
-    ":browser_switcher_bho($browser_switcher_x86_toolchain)"
+    ":browser_switcher_bho(//build/toolchain/win:win_clang_x64)"
 
-copy("copy_browser_switcher_binaries") {
-  # Make sure we have both bitnesses in the root out directory.
-  if (target_cpu == "x86") {
-    cross_build_label = browser_switcher_x64_label
-    cross_build_dll = "browser_switcher_bho_64.dll"
-  } else if (target_cpu == "x64") {
-    cross_build_label = browser_switcher_x86_label
-    cross_build_dll = "browser_switcher_bho.dll"
+if (!is_asan) {
+  browser_switcher_x86_label =
+      ":browser_switcher_bho(//build/toolchain/win:win_clang_x86)"
+
+  copy("copy_browser_switcher_binaries") {
+    # Make sure we have both bitnesses in the root out directory.
+    if (target_cpu == "x86") {
+      cross_build_label = browser_switcher_x64_label
+      cross_build_dll = "browser_switcher_bho_64.dll"
+    } else if (target_cpu == "x64") {
+      cross_build_label = browser_switcher_x86_label
+      cross_build_dll = "browser_switcher_bho.dll"
+    }
+
+    cross_build_out_dir = get_label_info(cross_build_label, "root_out_dir")
+
+    sources = [ "$cross_build_out_dir/$cross_build_dll" ]
+    if (symbol_level > 0) {
+      sources += [ "$cross_build_out_dir/$cross_build_dll.pdb" ]
+    }
+
+    outputs = [ "$root_out_dir/{{source_file_part}}" ]
+    deps = [
+      browser_switcher_x64_label,
+      browser_switcher_x86_label,
+    ]
   }
-
-  cross_build_out_dir = get_label_info(cross_build_label, "root_out_dir")
-
-  sources = [ "$cross_build_out_dir/$cross_build_dll" ]
-  if (symbol_level > 0) {
-    sources += [ "$cross_build_out_dir/$cross_build_dll.pdb" ]
-  }
-
-  outputs = [ "$root_out_dir/{{source_file_part}}" ]
-  deps = [
-    browser_switcher_x64_label,
-    browser_switcher_x86_label,
-  ]
 }
 
 group("browser_switcher_dlls") {
   # Build a DLL for each bitness, and put them in the root out dir.
-  deps = [
-    ":copy_browser_switcher_binaries",
-    browser_switcher_x64_label,
-    browser_switcher_x86_label,
-  ]
+  # Asan builds only support 64-bit builds, so don't do this there.
+  deps = [ browser_switcher_x64_label ]
+  if (!is_asan) {
+    deps += [
+      ":copy_browser_switcher_binaries",
+      browser_switcher_x86_label,
+    ]
+  }
 }
 
 midl("ie_bho_idl") {
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 5d29da10..27d55fdf 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -107,6 +107,7 @@
     "//chromeos/components/multidevice",
     "//chromeos/components/multidevice/logging",
     "//chromeos/components/power",
+    "//chromeos/components/print_management/mojom",
     "//chromeos/components/proximity_auth",
     "//chromeos/components/quick_answers/public/cpp:prefs",
     "//chromeos/components/smbfs",
@@ -2142,6 +2143,10 @@
     "printing/ppd_resolution_state.h",
     "printing/ppd_resolution_tracker.cc",
     "printing/ppd_resolution_tracker.h",
+    "printing/print_management/print_job_info_mojom_conversions.cc",
+    "printing/print_management/print_job_info_mojom_conversions.h",
+    "printing/print_management/printing_manager.cc",
+    "printing/print_management/printing_manager.h",
     "printing/print_server.cc",
     "printing/print_server.h",
     "printing/print_servers_provider.cc",
@@ -3093,6 +3098,7 @@
     "printing/history/test_print_job_history_service_observer.h",
     "printing/ppd_resolution_state_unittest.cc",
     "printing/ppd_resolution_tracker_unittest.cc",
+    "printing/print_management/print_job_info_mojom_conversions_unittest.cc",
     "printing/print_servers_provider_unittest.cc",
     "printing/printer_detector_test_util.h",
     "printing/printer_event_tracker_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/print/arc_print_service.cc b/chrome/browser/chromeos/arc/print/arc_print_service.cc
index f4eb6295..f79b147 100644
--- a/chrome/browser/chromeos/arc/print/arc_print_service.cc
+++ b/chrome/browser/chromeos/arc/print/arc_print_service.cc
@@ -133,23 +133,17 @@
 std::unique_ptr<printing::MetafileSkia> ReadFileOnBlockingTaskRunner(
     base::File file,
     size_t data_size) {
-  // TODO(vkuzkokov) Can we make give pipe to CUPS directly?
-  std::vector<char> buf(data_size);
-  int bytes = file.ReadAtCurrentPos(buf.data(), data_size);
-  if (bytes < 0) {
+  // TODO(vkuzkokov): Can we make give pipe to CUPS directly?
+  std::vector<uint8_t> buf(data_size);
+  if (!file.ReadAtCurrentPosAndCheck(buf)) {
     PLOG(ERROR) << "Error reading PDF";
     return nullptr;
   }
-  if (static_cast<size_t>(bytes) != data_size)
-    return nullptr;
 
   file.Close();
 
   auto metafile = std::make_unique<printing::MetafileSkia>();
-  if (!metafile->InitFromData(buf.data(), buf.size())) {
-    LOG(ERROR) << "Failed to initialize PDF metafile";
-    return nullptr;
-  }
+  CHECK(metafile->InitFromData(buf));
   return metafile;
 }
 
diff --git a/chrome/browser/chromeos/arc/tracing/arc_tracing_graphics_model.cc b/chrome/browser/chromeos/arc/tracing/arc_tracing_graphics_model.cc
index a906b05..ca6d895 100644
--- a/chrome/browser/chromeos/arc/tracing/arc_tracing_graphics_model.cc
+++ b/chrome/browser/chromeos/arc/tracing/arc_tracing_graphics_model.cc
@@ -67,14 +67,9 @@
 constexpr char kAcquireBufferQuery[] =
     "android:onMessageReceived/android:handleMessageInvalidate/"
     "android:latchBuffer/android:updateTexImage/android:acquireBuffer";
-// Android PI+
-constexpr char kReleaseBufferQueryP[] =
+constexpr char kReleaseBufferQuery[] =
     "android:onMessageReceived/android:handleMessageRefresh/"
     "android:postComposition/android:releaseBuffer";
-// Android NYC
-constexpr char kReleaseBufferQueryN[] =
-    "android:onMessageReceived/android:handleMessageRefresh/"
-    "android:releaseBuffer";
 constexpr char kDequeueBufferQuery[] = "android:dequeueBuffer";
 constexpr char kQueueBufferQuery[] = "android:queueBuffer";
 
@@ -408,24 +403,15 @@
     return false;
   }
 
-  const int surface_flinger_pid_p =
-      ProcessSurfaceFlingerEvents(common_model, kReleaseBufferQueryP,
-                                  out_events, -1 /* surface_flinger_pid */);
-  const int surface_flinger_pid_n =
-      ProcessSurfaceFlingerEvents(common_model, kReleaseBufferQueryN,
-                                  out_events, -1 /* surface_flinger_pid */);
-  if (surface_flinger_pid_p <= 0 && surface_flinger_pid_n <= 0) {
+  const int surface_flinger_release_buffer_pid =
+      ProcessSurfaceFlingerEvents(common_model, kReleaseBufferQuery, out_events,
+                                  -1 /* surface_flinger_pid */);
+  if (surface_flinger_release_buffer_pid <= 0) {
     LOG(ERROR) << "Failed to detect releaseBuffer events.";
     return false;
   }
 
-  if (surface_flinger_pid_p > 0 && surface_flinger_pid_n > 0) {
-    LOG(ERROR) << "Detected releaseBuffer events from both NYC and PI.";
-    return false;
-  }
-
-  if (surface_flinger_pid_p != surface_flinger_pid &&
-      surface_flinger_pid_n != surface_flinger_pid) {
+  if (surface_flinger_pid != surface_flinger_release_buffer_pid) {
     LOG(ERROR) << "Detected acquireBuffer and releaseBuffer from"
                   " different processes.";
     return false;
diff --git a/chrome/browser/chromeos/extensions/printing/print_job_submitter.cc b/chrome/browser/chromeos/extensions/printing/print_job_submitter.cc
index bda0ac6..a6bf3ab 100644
--- a/chrome/browser/chromeos/extensions/printing/print_job_submitter.cc
+++ b/chrome/browser/chromeos/extensions/printing/print_job_submitter.cc
@@ -243,12 +243,11 @@
 }
 
 void PrintJobSubmitter::StartPrintJob() {
-  auto metafile = std::make_unique<printing::MetafileSkia>();
-  CHECK(metafile->InitFromData(flattened_pdf_mapping_.memory(),
-                               flattened_pdf_mapping_.size()));
-
   DCHECK(extension_);
   DCHECK(settings_);
+  auto metafile = std::make_unique<printing::MetafileSkia>();
+  CHECK(metafile->InitFromData(
+      flattened_pdf_mapping_.GetMemoryAsSpan<const uint8_t>()));
   print_job_controller_->StartPrintJob(
       extension_->id(), std::move(metafile), std::move(settings_),
       base::BindOnce(&PrintJobSubmitter::OnPrintJobSubmitted,
diff --git a/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions.cc b/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions.cc
new file mode 100644
index 0000000..2ad7b49f
--- /dev/null
+++ b/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions.cc
@@ -0,0 +1,57 @@
+// 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/chromeos/printing/print_management/print_job_info_mojom_conversions.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "base/time/time.h"
+#include "chrome/browser/chromeos/printing/history/print_job_info.pb.h"
+#include "url/gurl.h"
+
+namespace chromeos {
+namespace printing {
+namespace print_management {
+namespace {
+
+mojom::PrintJobCompletionStatus PrintJobStatusProtoToMojom(
+    proto::PrintJobInfo_PrintJobStatus print_job_status_proto) {
+  switch (print_job_status_proto) {
+    case proto::PrintJobInfo_PrintJobStatus_FAILED:
+      return mojom::PrintJobCompletionStatus::kFailed;
+    case proto::PrintJobInfo_PrintJobStatus_CANCELED:
+      return mojom::PrintJobCompletionStatus::kCanceled;
+    case proto::PrintJobInfo_PrintJobStatus_PRINTED:
+      return mojom::PrintJobCompletionStatus::kPrinted;
+    case proto::
+        PrintJobInfo_PrintJobStatus_PrintJobInfo_PrintJobStatus_INT_MIN_SENTINEL_DO_NOT_USE_:
+    case proto::
+        PrintJobInfo_PrintJobStatus_PrintJobInfo_PrintJobStatus_INT_MAX_SENTINEL_DO_NOT_USE_:
+      NOTREACHED();
+      return mojom::PrintJobCompletionStatus::kFailed;
+  }
+  return mojom::PrintJobCompletionStatus::kFailed;
+}
+
+}  // namespace
+
+mojom::PrintJobInfoPtr PrintJobProtoToMojom(
+    const proto::PrintJobInfo& print_job_info_proto) {
+  mojom::PrintJobInfoPtr print_job_mojom = mojom::PrintJobInfo::New();
+
+  print_job_mojom->id = print_job_info_proto.id();
+  print_job_mojom->title = base::UTF8ToUTF16(print_job_info_proto.title());
+  print_job_mojom->completion_status =
+      PrintJobStatusProtoToMojom(print_job_info_proto.status());
+  print_job_mojom->creation_time =
+      base::Time::FromJsTime(print_job_info_proto.creation_time());
+  print_job_mojom->number_of_pages = print_job_info_proto.number_of_pages();
+  print_job_mojom->printer_name =
+      base::UTF8ToUTF16(print_job_info_proto.printer().name());
+  print_job_mojom->printer_uri = GURL(print_job_info_proto.printer().uri());
+  return print_job_mojom;
+}
+
+}  // namespace print_management
+}  // namespace printing
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions.h b/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions.h
new file mode 100644
index 0000000..312df35
--- /dev/null
+++ b/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions.h
@@ -0,0 +1,29 @@
+// 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_CHROMEOS_PRINTING_PRINT_MANAGEMENT_PRINT_JOB_INFO_MOJOM_CONVERSIONS_H_
+#define CHROME_BROWSER_CHROMEOS_PRINTING_PRINT_MANAGEMENT_PRINT_JOB_INFO_MOJOM_CONVERSIONS_H_
+
+#include "chromeos/components/print_management/mojom/printing_manager.mojom.h"
+
+namespace chromeos {
+namespace printing {
+
+namespace mojom = printing_manager::mojom;
+
+namespace proto {
+class PrintJobInfo;
+}  //  namespace proto
+
+namespace print_management {
+
+// Converts proto::PrintJobInfo into mojom::PrintJobInfoPtr.
+mojom::PrintJobInfoPtr PrintJobProtoToMojom(
+    const proto::PrintJobInfo& print_job_info_proto);
+
+}  // namespace print_management
+}  // namespace printing
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_PRINT_MANAGEMENT_PRINT_JOB_INFO_MOJOM_CONVERSIONS_H_
diff --git a/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions_unittest.cc b/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions_unittest.cc
new file mode 100644
index 0000000..ccd40e2
--- /dev/null
+++ b/chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions_unittest.cc
@@ -0,0 +1,66 @@
+// 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/chromeos/printing/print_management/print_job_info_mojom_conversions.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "base/time/time.h"
+#include "chrome/browser/chromeos/printing/history/print_job_info.pb.h"
+#include "chromeos/components/print_management/mojom/printing_manager.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+
+namespace proto = printing::proto;
+namespace mojom = printing::printing_manager::mojom;
+
+namespace {
+
+constexpr char kName[] = "name";
+constexpr char kUri[] = "ipp://192.168.1.5";
+constexpr char kTitle[] = "title";
+constexpr char kId[] = "id";
+constexpr int64_t kJobCreationTime = 0;
+constexpr uint32_t kPagesNumber = 3;
+
+proto::PrintJobInfo CreatePrintJobInfoProto() {
+  // Create Printer proto.
+  proto::Printer printer;
+  printer.set_name(kName);
+  printer.set_uri(kUri);
+
+  // Create PrintJobInfo proto.
+  proto::PrintJobInfo print_job_info;
+
+  print_job_info.set_id(kId);
+  print_job_info.set_title(kTitle);
+  print_job_info.set_status(
+      printing::proto::PrintJobInfo_PrintJobStatus_PRINTED);
+  print_job_info.set_creation_time(
+      static_cast<int64_t>(base::Time::UnixEpoch().ToJsTime()));
+  print_job_info.set_number_of_pages(kPagesNumber);
+  *print_job_info.mutable_printer() = printer;
+
+  return print_job_info;
+}
+
+}  // namespace
+
+TEST(PrintJobInfoMojomConversionsTest, PrintJobProtoToMojom) {
+  mojom::PrintJobInfoPtr print_job_mojo =
+      printing::print_management::PrintJobProtoToMojom(
+          CreatePrintJobInfoProto());
+
+  EXPECT_EQ(kId, print_job_mojo->id);
+  EXPECT_EQ(base::UTF8ToUTF16(kTitle), print_job_mojo->title);
+  EXPECT_EQ(mojom::PrintJobCompletionStatus::kPrinted,
+            print_job_mojo->completion_status);
+  EXPECT_EQ(base::Time::FromJsTime(kJobCreationTime),
+            print_job_mojo->creation_time);
+  EXPECT_EQ(base::UTF8ToUTF16(kName), print_job_mojo->printer_name);
+  EXPECT_EQ(kUri, print_job_mojo->printer_uri.spec());
+  EXPECT_EQ(kPagesNumber, print_job_mojo->number_of_pages);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/print_management/printing_manager.cc b/chrome/browser/chromeos/printing/print_management/printing_manager.cc
new file mode 100644
index 0000000..ed3009bd
--- /dev/null
+++ b/chrome/browser/chromeos/printing/print_management/printing_manager.cc
@@ -0,0 +1,54 @@
+// 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/chromeos/printing/print_management/printing_manager.h"
+
+#include "base/bind.h"
+#include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
+#include "chrome/browser/chromeos/printing/history/print_job_history_service_factory.h"
+#include "chrome/browser/chromeos/printing/print_management/print_job_info_mojom_conversions.h"
+#include "chrome/browser/profiles/profile.h"
+#include "content/public/browser/browser_context.h"
+
+namespace chromeos {
+namespace printing {
+namespace print_management {
+
+PrintingManager::PrintingManager(Profile* profile) : profile_(profile) {}
+
+PrintingManager::~PrintingManager() = default;
+
+void PrintingManager::GetPrintJobs(GetPrintJobsCallback callback) {
+  chromeos::PrintJobHistoryService* print_job_history_service =
+      chromeos::PrintJobHistoryServiceFactory::GetForBrowserContext(profile_);
+  print_job_history_service->GetPrintJobs(
+      base::BindOnce(&PrintingManager::OnPrintJobsRetrieved,
+                     base::Unretained(this), std::move(callback)));
+}
+
+void PrintingManager::OnPrintJobsRetrieved(
+    GetPrintJobsCallback callback,
+    bool success,
+    std::unique_ptr<std::vector<chromeos::printing::proto::PrintJobInfo>>
+        print_job_info_protos) {
+  std::vector<mojom::PrintJobInfoPtr> print_job_infos;
+
+  if (success) {
+    DCHECK(print_job_info_protos);
+    for (const auto& print_job_info : *print_job_info_protos) {
+      print_job_infos.push_back(PrintJobProtoToMojom(print_job_info));
+    }
+  }
+
+  std::move(callback).Run(std::move(print_job_infos));
+}
+
+void PrintingManager::BindInterface(
+    mojo::PendingReceiver<mojom::PrintingMetadataProvider> pending_receiver) {
+  receiver_.Bind(std::move(pending_receiver));
+}
+
+}  // namespace print_management
+}  // namespace printing
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/print_management/printing_manager.h b/chrome/browser/chromeos/printing/print_management/printing_manager.h
new file mode 100644
index 0000000..c954b06
--- /dev/null
+++ b/chrome/browser/chromeos/printing/print_management/printing_manager.h
@@ -0,0 +1,49 @@
+// 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_CHROMEOS_PRINTING_PRINT_MANAGEMENT_PRINTING_MANAGER_H_
+#define CHROME_BROWSER_CHROMEOS_PRINTING_PRINT_MANAGEMENT_PRINTING_MANAGER_H_
+
+#include "chrome/browser/chromeos/printing/history/print_job_info.pb.h"
+#include "chromeos/components/print_management/mojom/printing_manager.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+
+class Profile;
+
+namespace chromeos {
+namespace printing {
+namespace mojom = printing_manager::mojom;
+namespace print_management {
+
+class PrintingManager : public mojom::PrintingMetadataProvider {
+ public:
+  explicit PrintingManager(Profile* profile);
+  ~PrintingManager() override;
+
+  PrintingManager(const PrintingManager&) = delete;
+  PrintingManager& operator=(const PrintingManager&) = delete;
+
+  // mojom::PrintingMetadataProvider implementation
+  void GetPrintJobs(GetPrintJobsCallback callback) override;
+
+  void BindInterface(
+      mojo::PendingReceiver<mojom::PrintingMetadataProvider> pending_receiver);
+
+ private:
+  void OnPrintJobsRetrieved(
+      GetPrintJobsCallback callback,
+      bool success,
+      std::unique_ptr<std::vector<chromeos::printing::proto::PrintJobInfo>>
+          print_job_info_protos);
+
+  mojo::Receiver<mojom::PrintingMetadataProvider> receiver_{this};
+  Profile* profile_;  // Not Owned.
+};
+
+}  // namespace print_management
+}  // namespace printing
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_PRINTING_PRINT_MANAGEMENT_PRINTING_MANAGER_H_
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc
index 4caa6b0..44268dd 100644
--- a/chrome/browser/extensions/api/tabs/tabs_api.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -485,6 +485,9 @@
       if (ExtensionTabUtil::IsKillURL(url))
         return RespondNow(Error(tabs_constants::kNoCrashBrowserError));
       urls.push_back(url);
+
+      // Log if this navigation looks like it is to a devtools URL.
+      ExtensionTabUtil::LogPossibleDevtoolsSchemeNavigation(url);
     }
   }
 
@@ -1348,6 +1351,9 @@
     return false;
   }
 
+  // Log if this navigation looks like it is to a devtools URL.
+  ExtensionTabUtil::LogPossibleDevtoolsSchemeNavigation(url);
+
   const bool is_javascript_scheme = url.SchemeIs(url::kJavaScriptScheme);
   UMA_HISTOGRAM_BOOLEAN("Extensions.ApiTabUpdateJavascript",
                         is_javascript_scheme);
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
index 1d9592e..599b836 100644
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
@@ -213,16 +213,9 @@
   ASSERT_TRUE(RunExtensionTest("webnavigation/api")) << message_;
 }
 
-// Flaky on Windows Linux and  Chrome OS. See http://crbug.com/874782.
-#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_LINUX)
-#define MAYBE_GetFrame DISABLED_GetFrame
-#else
-#define MAYBE_GetFrame GetFrame
-#endif
-IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, MAYBE_GetFrame) {
+IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, GetFrame) {
   ASSERT_TRUE(RunExtensionTest("webnavigation/getFrame")) << message_;
 }
-#undef MAYBE_GetFrame
 
 IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ClientRedirect) {
   ASSERT_TRUE(RunExtensionTest("webnavigation/clientRedirect"))
diff --git a/chrome/browser/extensions/background_xhr_browsertest.cc b/chrome/browser/extensions/background_xhr_browsertest.cc
index e402bf2..94786fc 100644
--- a/chrome/browser/extensions/background_xhr_browsertest.cc
+++ b/chrome/browser/extensions/background_xhr_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/extension_with_management_policy_apitest.h"
@@ -34,6 +35,7 @@
 #include "net/ssl/client_cert_store.h"
 #include "net/ssl/ssl_server_config.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
+#include "services/network/public/cpp/features.h"
 #include "url/gurl.h"
 
 namespace extensions {
@@ -105,7 +107,18 @@
 
 class BackgroundXhrWebstoreTest : public ExtensionApiTestWithManagementPolicy {
  public:
-  BackgroundXhrWebstoreTest() = default;
+  BackgroundXhrWebstoreTest() {
+    // TODO(lukasza): https://crbug.com/1061567: Migrate tests related to
+    // cross-origin requests from content scripts into the
+    // CrossOriginReadBlockingExtensionTest suite (which already covers test
+    // matrix of various enabled/disabled features).
+    //
+    // Affected tests:
+    // - BackgroundXhrWebstoreTest.PolicyContentScriptXHR
+    scoped_feature_list_.InitAndDisableFeature(
+        network::features::kCorbAllowlistAlsoAppliesToOorCors);
+  }
+
   ~BackgroundXhrWebstoreTest() override = default;
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
@@ -169,6 +182,8 @@
   }
 
  private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+
   DISALLOW_COPY_AND_ASSIGN(BackgroundXhrWebstoreTest);
 };
 
@@ -238,6 +253,67 @@
               ::testing::HasSubstr("<head><title>OK</title></head>"));
 }
 
+// Verify that policy blocklists apply to XHRs done from injected scripts.
+IN_PROC_BROWSER_TEST_F(BackgroundXhrWebstoreTest, PolicyContentScriptXHR) {
+  TestExtensionDir test_dir;
+  test_dir.WriteManifest(R"(
+    {
+      "name": "XHR Content Script Test",
+      "manifest_version": 2,
+      "version": "0.1",
+      "permissions": ["<all_urls>", "tabs"],
+      "background": {"scripts": ["background.js"]}
+    })");
+
+  constexpr char kBackgroundScript[] =
+      R"(function executeFetch(url) {
+           chrome.tabs.executeScript({code: `
+             fetch("${url}")
+             .then(response => response.text())
+             .then(text => domAutomationController.send(text))
+             .catch(err => domAutomationController.send('ERROR: ' + err));
+           `});
+         }
+      )";
+  test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), kBackgroundScript);
+
+  const Extension* extension = LoadExtension(test_dir.UnpackedPath());
+  ASSERT_TRUE(extension);
+
+  // Navigate to a foo.com page.
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  GURL page_url(embedded_test_server()->GetURL("foo.com", "/title1.html"));
+  ui_test_utils::NavigateToURL(browser(), page_url);
+  EXPECT_EQ(page_url, web_contents->GetMainFrame()->GetLastCommittedURL());
+
+  // Using "/non-corb.octet-stream" resource (instead of "/simple.html" as in
+  // most other tests here) because XHRs/fetches from content scripts are
+  // subject to CORB (which is already covered by
+  // CrossOriginReadBlockingExtensionTest) and we want to focus the test below
+  // on policy behavior (which should be independent from whether or not CORB
+  // blocks the response).
+  GURL example_url =
+      embedded_test_server()->GetURL("example.com", "/non-corb.octet-stream");
+  GURL public_example_url = embedded_test_server()->GetURL(
+      "public.example.com", "/non-corb.octet-stream");
+
+  // Sanity Check: Should be able to fetch cross origin.
+  EXPECT_EQ("octet-stream-body", ExecuteFetch(extension, example_url));
+  EXPECT_EQ("octet-stream-body", ExecuteFetch(extension, public_example_url));
+
+  {
+    ExtensionManagementPolicyUpdater pref(&policy_provider_);
+    pref.AddPolicyBlockedHost("*", "*://*.example.com");
+    pref.AddPolicyAllowedHost("*", "*://public.example.com");
+  }
+
+  // Policies apply to XHR from a content script.
+  EXPECT_EQ("ERROR: TypeError: Failed to fetch",
+            ExecuteFetch(extension, example_url));
+  EXPECT_EQ("octet-stream-body", ExecuteFetch(extension, public_example_url));
+}
+
 // Make sure the blocklist and allowlist update for both Default and Individual
 // scope policies. Testing with all host permissions granted (<all_urls>).
 IN_PROC_BROWSER_TEST_F(BackgroundXhrWebstoreTest, PolicyUpdateXHR) {
diff --git a/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc b/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc
index b44b3c3..d932fbfa 100644
--- a/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc
+++ b/chrome/browser/extensions/corb_and_cors_extension_browsertest.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/extensions/api/tabs/tabs_api.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/extension_function_test_utils.h"
-#include "chrome/browser/extensions/extension_management_test_util.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/tab_helper.h"
@@ -27,8 +26,6 @@
 #include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/policy/core/browser/browser_policy_connector.h"
-#include "components/policy/core/common/mock_configuration_policy_provider.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/network_service_util.h"
@@ -166,14 +163,6 @@
                                                        disabled_features);
   }
 
-  void SetUpInProcessBrowserTestFixture() override {
-    EXPECT_CALL(policy_provider_, IsInitializationComplete(testing::_))
-        .WillRepeatedly(testing::Return(true));
-    policy_provider_.SetAutoRefresh();
-    policy::BrowserPolicyConnector::SetPolicyProviderForTesting(
-        &policy_provider_);
-  }
-
   bool IsExtensionAllowlisted() {
     return (GetParam() & TestParam::kAllowlisted) != 0;
   }
@@ -337,14 +326,13 @@
   // This verification helper might not work for non-CORB-eligible resources
   // like MIME types not covered by CORB (e.g. application/octet-stream) or
   // same-origin responses.
-  void VerifyCorbEligibleFetchFromContentScript(
-      const base::HistogramTester& histograms,
-      const std::string& actual_fetch_result,
-      const std::string& expected_fetch_result) {
+  void VerifyFetchFromContentScript(const base::HistogramTester& histograms,
+                                    const std::string& actual_fetch_result,
+                                    const std::string& expected_fetch_result) {
     SubprocessMetricsProvider::MergeHistogramDeltasForTesting();
 
-    // VerifyCorbEligibleFetchFromContentScript is only called for Content Types
-    // covered by CORB and therefore these requests carry no risk for
+    // VerifyFetchFromContentScript is only called for Content Types covered by
+    // CORB and therefore these requests carry no risk for
     // CorbAllowlistAlsoAppliesToOorCors - verify that we didn't log the UMA.
     VerifyPassiveUmaForAllowlistForCors(histograms, base::nullopt);
 
@@ -373,30 +361,6 @@
     }
   }
 
-  void VerifyNonCorbElligibleFetchFromContentScript(
-      const base::HistogramTester& histograms,
-      const std::string& actual_fetch_result,
-      const std::string& expected_fetch_result_prefix) {
-    // Verify that CORB sniffing allowed the response.
-    VerifyFetchFromContentScriptWasAllowedByCorb(histograms,
-                                                 true /* expecting_sniffing */);
-
-    if (ShouldAllowlistAlsoApplyToOorCors() &&
-        AreContentScriptFetchesExpectedToBeBlocked()) {
-      // Verify that the response body was blocked by CORS.
-      EXPECT_EQ(kCorsErrorWhenFetching, actual_fetch_result);
-    } else {
-      // Verify that the response body was not blocked by either CORB nor CORS.
-      EXPECT_THAT(actual_fetch_result,
-                  ::testing::StartsWith(expected_fetch_result_prefix));
-    }
-
-    // This is the kind of response (i.e., cross-origin fetch of a non-CORB
-    // type) that could be affected by the planned
-    // CorbAllowlistAlsoAppliesToOorCors feature.
-    VerifyPassiveUmaForAllowlistForCors(histograms, true);
-  }
-
   content::WebContents* active_web_contents() {
     return browser()->tab_strip_model()->GetActiveWebContents();
   }
@@ -523,9 +487,6 @@
         browser()->profile(), extension_->id(), background_script);
   }
 
- protected:
-  policy::MockConfigurationPolicyProvider policy_provider_;
-
  private:
   void AllowlistExtensionIfNeeded(const Extension& extension) {
     // Sanity check that the field trial param (which has to be registered via
@@ -655,10 +616,9 @@
     std::string fetch_result = PopString(&message_queue);
 
     // Verify whether the fetch worked or not (expectations differ depending on
-    // various factors - see the body of
-    // VerifyCorbEligibleFetchFromContentScript).
-    VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                             "nosniff.xml - body\n");
+    // various factors - see the body of VerifyFetchFromContentScript).
+    VerifyFetchFromContentScript(histograms, fetch_result,
+                                 "nosniff.xml - body\n");
   }
 
   // Test case #2: Declarative script injected after a renderer-initiated
@@ -680,10 +640,9 @@
     std::string fetch_result = PopString(&message_queue);
 
     // Verify whether the fetch worked or not (expectations differ depending on
-    // various factors - see the body of
-    // VerifyCorbEligibleFetchFromContentScript).
-    VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                             "nosniff.xml - body\n");
+    // various factors - see the body of VerifyFetchFromContentScript).
+    VerifyFetchFromContentScript(histograms, fetch_result,
+                                 "nosniff.xml - body\n");
   }
 }
 
@@ -713,10 +672,9 @@
       FetchViaContentScript(cross_site_resource, active_web_contents());
 
   // Verify whether the fetch worked or not (expectations differ depending on
-  // various factors - see the body of
-  // VerifyCorbEligibleFetchFromContentScript).
-  VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                           "nosniff.xml - body\n");
+  // various factors - see the body of VerifyFetchFromContentScript).
+  VerifyFetchFromContentScript(histograms, fetch_result,
+                               "nosniff.xml - body\n");
 }
 
 // Tests that extension permission to bypass CORS is revoked after the extension
@@ -782,8 +740,8 @@
     content::ExecuteScriptAsync(active_web_contents(), kFetchInitiatingScript);
     std::string fetch_result = PopString(&queue);
 
-    VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                             "nosniff.xml - body\n");
+    VerifyFetchFromContentScript(histograms, fetch_result,
+                                 "nosniff.xml - body\n");
   }
 
   // Unload the extension and try fetching again.  The content script should
@@ -814,111 +772,6 @@
   }
 }
 
-// Test that <all_urls> permission does not apply to hosts blocked by policy.
-IN_PROC_BROWSER_TEST_P(CorbAndCorsExtensionBrowserTest,
-                       ContentScriptVsHostBlockedByPolicy_NoSniffXml) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(InstallExtensionWithPermissionToAllUrls());
-  {
-    ExtensionManagementPolicyUpdater pref(&policy_provider_);
-    pref.AddPolicyBlockedHost("*", "*://*.example.com");
-    pref.AddPolicyAllowedHost("*", "*://public.example.com");
-  }
-
-  // Navigate to a fetch-initiator.com page.
-  GURL page_url = GetTestPageUrl("fetch-initiator.com");
-  ui_test_utils::NavigateToURL(browser(), page_url);
-  ASSERT_EQ(page_url,
-            active_web_contents()->GetMainFrame()->GetLastCommittedURL());
-  ASSERT_EQ(url::Origin::Create(page_url),
-            active_web_contents()->GetMainFrame()->GetLastCommittedOrigin());
-
-  // Test fetch from a host allowed by the policy (and allowed by the extension
-  // permissions).
-  {
-    SCOPED_TRACE(::testing::Message() << "Allowed by policy");
-    base::HistogramTester histograms;
-    GURL cross_site_resource(
-        embedded_test_server()->GetURL("public.example.com", "/nosniff.xml"));
-    std::string fetch_result =
-        FetchViaContentScript(cross_site_resource, active_web_contents());
-
-    // Verify whether the fetch worked or not (expectations differ depending on
-    // various factors - see the body of
-    // VerifyCorbEligibleFetchFromContentScript).
-    VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                             "nosniff.xml - body\n");
-  }
-
-  // Test fetch from a host blocked by the policy (and allowed by the extension
-  // permissions).
-  {
-    SCOPED_TRACE(::testing::Message() << "Blocked by policy");
-    base::HistogramTester histograms;
-    GURL cross_site_resource(
-        embedded_test_server()->GetURL("example.com", "/nosniff.xml"));
-    std::string fetch_result =
-        FetchViaContentScript(cross_site_resource, active_web_contents());
-
-    // Verify that the fetch was blocked by CORS.
-    EXPECT_EQ(kCorsErrorWhenFetching, fetch_result);
-    VerifyFetchFromContentScriptWasBlockedByCorb(histograms);
-  }
-}
-
-// Test that <all_urls> permission does not apply to hosts blocked by policy.
-IN_PROC_BROWSER_TEST_P(CorbAndCorsExtensionBrowserTest,
-                       ContentScriptVsHostBlockedByPolicy_AllowedTextResource) {
-  ASSERT_TRUE(embedded_test_server()->Start());
-  ASSERT_TRUE(InstallExtensionWithPermissionToAllUrls());
-  {
-    ExtensionManagementPolicyUpdater pref(&policy_provider_);
-    pref.AddPolicyBlockedHost("*", "*://*.example.com");
-    pref.AddPolicyAllowedHost("*", "*://public.example.com");
-  }
-
-  // Navigate to a fetch-initiator.com page.
-  GURL page_url = GetTestPageUrl("fetch-initiator.com");
-  ui_test_utils::NavigateToURL(browser(), page_url);
-  ASSERT_EQ(page_url,
-            active_web_contents()->GetMainFrame()->GetLastCommittedURL());
-  ASSERT_EQ(url::Origin::Create(page_url),
-            active_web_contents()->GetMainFrame()->GetLastCommittedOrigin());
-
-  // Test fetch from a host allowed by the policy (and allowed by the extension
-  // permissions).
-  {
-    SCOPED_TRACE(::testing::Message() << "Allowed by policy");
-    base::HistogramTester histograms;
-    GURL cross_site_resource(embedded_test_server()->GetURL(
-        "public.example.com", "/save_page/text.txt"));
-    std::string fetch_result =
-        FetchViaContentScript(cross_site_resource, active_web_contents());
-
-    // Verify that the fetch was allowed by CORB.  CORS expectations differ
-    // depending on exact scenario.
-    VerifyNonCorbElligibleFetchFromContentScript(
-        histograms, fetch_result,
-        "text-object.txt: ae52dd09-9746-4b7e-86a6-6ada5e2680c2");
-  }
-
-  // Test fetch from a host blocked by the policy (and allowed by the extension
-  // permissions).
-  {
-    SCOPED_TRACE(::testing::Message() << "Blocked by policy");
-    base::HistogramTester histograms;
-    GURL cross_site_resource(
-        embedded_test_server()->GetURL("example.com", "/save_page/text.txt"));
-    std::string fetch_result =
-        FetchViaContentScript(cross_site_resource, active_web_contents());
-
-    // Verify that the fetch was blocked by CORS.
-    EXPECT_EQ(kCorsErrorWhenFetching, fetch_result);
-    VerifyFetchFromContentScriptWasAllowedByCorb(histograms,
-                                                 true /* expecting_sniffing */);
-  }
-}
-
 IN_PROC_BROWSER_TEST_P(CorbAndCorsExtensionBrowserTest,
                        FromProgrammaticContentScript_PermissionToAllUrls) {
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -941,10 +794,9 @@
       FetchViaContentScript(cross_site_resource, active_web_contents());
 
   // Verify whether the fetch worked or not (expectations differ depending on
-  // various factors - see the body of
-  // VerifyCorbEligibleFetchFromContentScript).
-  VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                           "nosniff.xml - body\n");
+  // various factors - see the body of VerifyFetchFromContentScript).
+  VerifyFetchFromContentScript(histograms, fetch_result,
+                               "nosniff.xml - body\n");
 }
 
 // Coverage of *.subdomain.com extension permissions for CORB-eligible fetches
@@ -975,10 +827,9 @@
         FetchViaContentScript(allowed_url, active_web_contents());
 
     // Verify whether the fetch worked or not (expectations differ depending on
-    // various factors - see the body of
-    // VerifyCorbEligibleFetchFromContentScript).
-    VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                             "nosniff.xml - body\n");
+    // various factors - see the body of VerifyFetchFromContentScript).
+    VerifyFetchFromContentScript(histograms, fetch_result,
+                                 "nosniff.xml - body\n");
   }
 }
 
@@ -1011,10 +862,9 @@
       FetchViaContentScript(redirecting_url, active_web_contents());
 
   // Verify whether the fetch worked or not (expectations differ depending on
-  // various factors - see the body of
-  // VerifyCorbEligibleFetchFromContentScript).
-  VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                           "nosniff.xml - body\n");
+  // various factors - see the body of VerifyFetchFromContentScript).
+  VerifyFetchFromContentScript(histograms, fetch_result,
+                               "nosniff.xml - body\n");
 }
 
 // Test that verifies CORS-allowed fetches work for targets that are not
@@ -1136,11 +986,28 @@
   std::string fetch_result =
       FetchViaContentScript(cross_site_resource, active_web_contents());
 
-  // Verify that the fetch was allowed by CORB.  CORS expectations differ
-  // depending on exact scenario.
-  VerifyNonCorbElligibleFetchFromContentScript(
-      histograms, fetch_result,
-      "text-object.txt: ae52dd09-9746-4b7e-86a6-6ada5e2680c2");
+  // Verify that CORB sniffing allowed the response.
+  VerifyFetchFromContentScriptWasAllowedByCorb(histograms,
+                                               true /* expecting_sniffing */);
+
+  if (ShouldAllowlistAlsoApplyToOorCors() &&
+      AreContentScriptFetchesExpectedToBeBlocked()) {
+    // Verify that the response body was blocked by CORS.
+    EXPECT_EQ(kCorsErrorWhenFetching, fetch_result);
+  } else {
+    // Verify that the response body was not blocked by either CORB nor CORS.
+    //
+    // StartsWith (rather than equality) is used in the verification step to
+    // account for \n VS \r\n difference on Windows.
+    EXPECT_THAT(fetch_result,
+                ::testing::StartsWith(
+                    "text-object.txt: ae52dd09-9746-4b7e-86a6-6ada5e2680c2"));
+  }
+
+  // This is the kind of response (i.e., cross-origin fetch of a non-CORB type)
+  // that could be affected by the planned CorbAllowlistAlsoAppliesToOorCors
+  // feature.
+  VerifyPassiveUmaForAllowlistForCors(histograms, true);
 }
 
 // Coverage of *.subdomain.com extension permissions for non-CORB eligible
@@ -1174,9 +1041,27 @@
         FetchViaContentScript(allowed_url, active_web_contents());
 
     // Verify that CORB sniffing allowed the response.
-    VerifyNonCorbElligibleFetchFromContentScript(
-        histograms, fetch_result,
-        "text-object.txt: ae52dd09-9746-4b7e-86a6-6ada5e2680c2");
+    VerifyFetchFromContentScriptWasAllowedByCorb(histograms,
+                                                 true /* expecting_sniffing */);
+
+    if (ShouldAllowlistAlsoApplyToOorCors() &&
+        AreContentScriptFetchesExpectedToBeBlocked()) {
+      // Verify that the response body was blocked by CORS.
+      EXPECT_EQ(kCorsErrorWhenFetching, fetch_result);
+    } else {
+      // Verify that the response body was not blocked by either CORB nor CORS.
+      //
+      // StartsWith (rather than equality) is used in the verification step to
+      // account for \n VS \r\n difference on Windows.
+      EXPECT_THAT(fetch_result,
+                  ::testing::StartsWith(
+                      "text-object.txt: ae52dd09-9746-4b7e-86a6-6ada5e2680c2"));
+    }
+
+    // This is the kind of response (i.e., cross-origin fetch of a non-CORB
+    // type) that could be affected by the planned
+    // CorbAllowlistAlsoAppliesToOorCors feature.
+    VerifyPassiveUmaForAllowlistForCors(histograms, true);
   }
 }
 
@@ -1205,8 +1090,22 @@
       FetchViaContentScript(cross_site_resource, active_web_contents());
 
   // Verify that CORB sniffing allowed the response.
-  VerifyNonCorbElligibleFetchFromContentScript(histograms, fetch_result,
-                                               "\xEF\xBF\xBDPNG");
+  VerifyFetchFromContentScriptWasAllowedByCorb(histograms,
+                                               true /* expecting_sniffing */);
+
+  if (ShouldAllowlistAlsoApplyToOorCors() &&
+      AreContentScriptFetchesExpectedToBeBlocked()) {
+    // Verify that the response body was blocked by CORS.
+    EXPECT_EQ(kCorsErrorWhenFetching, fetch_result);
+  } else {
+    // Verify that the response body was not blocked by either CORB nor CORS.
+    EXPECT_THAT(fetch_result, ::testing::StartsWith("\xEF\xBF\xBDPNG"));
+  }
+
+  // This is the kind of response (i.e., cross-origin fetch that is not blocked
+  // by CORB due to sniffing) that could be affected by the planned
+  // CorbAllowlistAlsoAppliesToOorCors feature.
+  VerifyPassiveUmaForAllowlistForCors(histograms, true);
 }
 
 // Test that responses are blocked by CORB, but have empty response body are not
@@ -1233,10 +1132,9 @@
       FetchViaContentScript(cross_site_resource, active_web_contents());
 
   // Verify whether the fetch worked or not (expectations differ depending on
-  // various factors - see the body of
-  // VerifyCorbEligibleFetchFromContentScript).
-  VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                           "" /* expected_response_body */);
+  // various factors - see the body of VerifyFetchFromContentScript).
+  VerifyFetchFromContentScript(histograms, fetch_result,
+                               "" /* expected_response_body */);
 }
 
 // Test that LogInitiatorSchemeBypassingDocumentBlocking exits early for
@@ -1559,10 +1457,9 @@
         FetchViaContentScript(cross_site_resource, active_web_contents());
 
     // Verify whether the fetch worked or not (expectations differ depending on
-    // various factors - see the body of
-    // VerifyCorbEligibleFetchFromContentScript).
-    VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                             "nosniff.xml - body\n");
+    // various factors - see the body of VerifyFetchFromContentScript).
+    VerifyFetchFromContentScript(histograms, fetch_result,
+                                 "nosniff.xml - body\n");
   }
   // Using a different image, to bypass renderer-side caching.
   EXPECT_EQ("IMG LOADED",
@@ -1593,10 +1490,9 @@
         FetchViaContentScript(cross_site_resource, active_web_contents());
 
     // Verify whether the fetch worked or not (expectations differ depending on
-    // various factors - see the body of
-    // VerifyCorbEligibleFetchFromContentScript).
-    VerifyCorbEligibleFetchFromContentScript(histograms, fetch_result,
-                                             "nosniff.xml - body\n");
+    // various factors - see the body of VerifyFetchFromContentScript).
+    VerifyFetchFromContentScript(histograms, fetch_result,
+                                 "nosniff.xml - body\n");
   }
   // Using a different image, to bypass renderer-side caching.
   EXPECT_EQ("IMG LOADED",
diff --git a/chrome/browser/extensions/extension_service_sync_unittest.cc b/chrome/browser/extensions/extension_service_sync_unittest.cc
index fccb6c3..6f8d5a8 100644
--- a/chrome/browser/extensions/extension_service_sync_unittest.cc
+++ b/chrome/browser/extensions/extension_service_sync_unittest.cc
@@ -63,6 +63,8 @@
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/metrics/user_action_tester.h"
+#include "chrome/browser/extensions/extension_management_test_util.h"
+#include "chrome/browser/extensions/standard_management_policy_provider.h"
 #include "chrome/browser/supervised_user/supervised_user_constants.h"
 #include "chrome/browser/supervised_user/supervised_user_extensions_metrics_recorder.h"
 #include "chrome/browser/supervised_user/supervised_user_features.h"
@@ -71,6 +73,7 @@
 #include "chrome/browser/supervised_user/supervised_user_settings_service.h"
 #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
 #include "chrome/common/pref_names.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
 #endif
 
 using extensions::AppSorting;
@@ -1761,6 +1764,8 @@
 
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
 
+// TODO(crbug/1065107): Move this test class and associated tests to a separate
+// file under enable_supervised_users build.
 class ExtensionServiceTestSupervised
     : public ExtensionServiceSyncCustomGalleryTest,
       public SupervisedUserService::Delegate {
@@ -1781,11 +1786,51 @@
   }
 
  protected:
-  void InitSupervisedUserInitiatedExtensionInstallFeature(bool enabled) {
-    if (enabled) {
-      scoped_feature_list_.InitAndEnableFeature(
-          supervised_users::kSupervisedUserInitiatedExtensionInstall);
+  typedef extensions::ExtensionManagementPrefUpdater<
+      sync_preferences::TestingPrefServiceSyncable>
+      ManagementPrefUpdater;
+
+  // These enum values represent various feature flags for enabling
+  // supervised users to install extensions.
+  enum class SupervisedUserExtensionInstallFeatureMode {
+    // Turn off all feature flags.
+    kNone,
+    // Refers to the extensions lite feature that enables supervised users to
+    // install from the ExtensionInstallWhitelist policy as a temporary measure
+    // in response to the COVID-19 crisis.
+    kLite,
+    // Refers to the full extensions feature where each install has be approved
+    // through the parent permissions dialog.
+    kFull
+  };
+
+  // Enables or disables features for allowing supervised users to install
+  // extensions.
+  void InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode mode) {
+    std::vector<base::Feature> enabled_features;
+    std::vector<base::Feature> disabled_features;
+    switch (mode) {
+      case SupervisedUserExtensionInstallFeatureMode::kNone:
+        disabled_features.push_back(
+            supervised_users::kSupervisedUserInitiatedExtensionInstall);
+        disabled_features.push_back(
+            supervised_users::kSupervisedUserAllowlistExtensionInstall);
+        break;
+      case SupervisedUserExtensionInstallFeatureMode::kLite:
+        disabled_features.push_back(
+            supervised_users::kSupervisedUserInitiatedExtensionInstall);
+        enabled_features.push_back(
+            supervised_users::kSupervisedUserAllowlistExtensionInstall);
+        break;
+      case SupervisedUserExtensionInstallFeatureMode::kFull:
+        enabled_features.push_back(
+            supervised_users::kSupervisedUserInitiatedExtensionInstall);
+        disabled_features.push_back(
+            supervised_users::kSupervisedUserAllowlistExtensionInstall);
+        break;
     }
+    scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features);
   }
 
   void SetSupervisedUserExtensionsMayRequestPermissionsPref(bool enabled) {
@@ -1934,7 +1979,8 @@
 // in the pref kSupervisedUserExtensionsMayRequestPermissions returning false,
 // then child users cannot install new extensions.
 TEST_F(ExtensionServiceTestSupervised, SupervisedUserCannotInstallExtension) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -1952,7 +1998,8 @@
 // supervised user controls, and the extension remains disabled.
 TEST_F(ExtensionServiceTestSupervised,
        AddSupervisionAndSyncShouldNotReenablePreinstalledExtension) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/false);
 
@@ -1994,7 +2041,8 @@
 // unexpected behavior.
 TEST_F(ExtensionServiceTestSupervised,
        CustodianApprovalDoesNotAffectRegularUsers) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/false);
 
@@ -2021,7 +2069,8 @@
 // newly-installed extensions are disabled until approved.
 TEST_F(ExtensionServiceTestSupervised,
        InstallAllowedButDisabledForSupervisedUser) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2042,7 +2091,8 @@
 
 TEST_F(ExtensionServiceTestSupervised,
        PreinstalledExtensionWithSUInitiatedInstalls) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/false);
 
@@ -2067,7 +2117,8 @@
 
 TEST_F(ExtensionServiceTestSupervised,
        PreinstalledExtensionWithoutSUInitiatedInstalls) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/false);
 
@@ -2092,7 +2143,8 @@
 // This tests the case when the sync entity flagging the extension as approved
 // arrives before the extension itself is installed.
 TEST_F(ExtensionServiceTestSupervised, ExtensionApprovalBeforeInstallation) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2116,7 +2168,8 @@
 // Test that if an approved extension is updated to a newer version that doesn't
 // require additional permissions, it is still enabled.
 TEST_F(ExtensionServiceTestSupervised, UpdateWithoutPermissionIncrease) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2142,7 +2195,8 @@
 
 TEST_F(ExtensionServiceTestSupervised,
        UpdateWithPermissionIncreaseApprovalOldVersion) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2174,7 +2228,8 @@
 
 TEST_F(ExtensionServiceTestSupervised,
        UpdateWithPermissionIncreaseApprovalMatchingVersion) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2201,7 +2256,8 @@
 // updates to that approved, newer version.
 TEST_F(ExtensionServiceTestSupervised,
        UpdateWithPermissionIncreaseApprovalNewVersion) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   base::HistogramTester histogram_tester;
 
@@ -2287,7 +2343,8 @@
 }
 
 TEST_F(ExtensionServiceTestSupervised, SupervisedUserInitiatedInstalls) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2320,7 +2377,8 @@
 
 TEST_F(ExtensionServiceTestSupervised,
        UpdateSUInitiatedInstallWithoutPermissionIncrease) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2362,7 +2420,8 @@
 
 TEST_F(ExtensionServiceTestSupervised,
        UpdateSUInitiatedInstallWithPermissionIncrease) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2408,7 +2467,8 @@
 
 TEST_F(ExtensionServiceTestSupervised,
        UpdateSUInitiatedInstallWithPermissionIncreaseApprovalArrivesFirst) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2442,7 +2502,8 @@
 // kSupervisedUserExtensionsMayRequestPermissions pref being set to false.
 TEST_F(ExtensionServiceTestSupervised,
        SupervisedUserExtensionsMayRequestPermissionsToggleOff) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/false);
 
@@ -2476,7 +2537,8 @@
 // supervised user's approved and enabled extensions are not affected.
 TEST_F(ExtensionServiceTestSupervised,
        SupervisedUserExtensionsMayRequestPermissionsDoesNotAffectExisting) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2528,7 +2590,8 @@
 // kSupervisedUserExtensionsMayRequestPermissions is false.
 TEST_F(ExtensionServiceTestSupervised,
        ChildUserCannotApproveAdditionalPermissions) {
-  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kFull);
 
   InitServices(/*profile_is_supervised=*/true);
 
@@ -2577,6 +2640,94 @@
           extensions::disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED);
 }
 
+// Tests that extension installation is blocked for child accounts without any
+// features.
+TEST_F(ExtensionServiceTestSupervised, ExtensionsLiteInstallBlocked) {
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kNone);
+  InitServices(/*profile_is_supervised=*/true);
+
+  base::FilePath path = data_dir().AppendASCII("good.crx");
+  const Extension* extension = InstallCRX(path, INSTALL_FAILED);
+  // The extension should not have been installed.
+  EXPECT_FALSE(extension);
+}
+
+// Tests that extension installation is still blocked if no
+// ExtensionInstallWhitelist or ExtensionInstallBlacklist policies present.
+TEST_F(ExtensionServiceTestSupervised,
+       ExtensionsLiteInstallWithoutPolicyStillBlocked) {
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kLite);
+  InitServices(/*profile_is_supervised=*/true);
+
+  base::FilePath path = data_dir().AppendASCII("good.crx");
+  const Extension* extension = InstallCRX(path, INSTALL_FAILED);
+  // The extension should not have been installed.
+  EXPECT_FALSE(extension);
+}
+
+// Tests that extension installation is blocked for supervised users, if the
+// extension id is not on the ExtensionInstallWhitelist.
+TEST_F(ExtensionServiceTestSupervised, ExtensionsLiteInstallBlacklisted) {
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kLite);
+  InitServices(/*profile_is_supervised=*/true);
+
+  base::HistogramTester histogram_tester;
+  histogram_tester.ExpectTotalCount("SupervisedUsers.ExtensionsAllowlist", 0);
+
+  {
+    ManagementPrefUpdater pref_updater(testing_pref_service());
+    pref_updater.SetBlacklistedByDefault(true);
+  }
+
+  base::FilePath path = data_dir().AppendASCII("good.crx");
+  const Extension* extension = InstallCRX(path, INSTALL_FAILED);
+  // The extension should not have been installed.
+  EXPECT_FALSE(extension);
+
+  // We should have one allowlist miss.
+  histogram_tester.ExpectUniqueSample(
+      "SupervisedUsers.ExtensionsAllowlist",
+      extensions::StandardManagementPolicyProvider::UmaExtensionStateAllowlist::
+          kAllowlistMiss,
+      1);
+  histogram_tester.ExpectTotalCount("SupervisedUsers.ExtensionsAllowlist", 1);
+}
+
+// Tests that extension installation is not blocked for supervised users, if the
+// extension id is allowlisted by policy.
+TEST_F(ExtensionServiceTestSupervised, ExtensionsLiteInstallAllowlisted) {
+  InitSupervisedUserExtensionInstallFeatures(
+      SupervisedUserExtensionInstallFeatureMode::kLite);
+  InitServices(/*profile_is_supervised=*/true);
+
+  base::HistogramTester histogram_tester;
+  histogram_tester.ExpectTotalCount("SupervisedUsers.ExtensionsAllowlist", 0);
+
+  {
+    ManagementPrefUpdater pref_updater(testing_pref_service());
+    pref_updater.SetBlacklistedByDefault(true);
+    pref_updater.SetIndividualExtensionInstallationAllowed(good_crx, true);
+  }
+
+  base::FilePath path = data_dir().AppendASCII("good.crx");
+  const Extension* extension = InstallCRX(path, INSTALL_NEW);
+  ASSERT_TRUE(extension);
+  std::string id = extension->id();
+  EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
+
+  // We should have two allowlist hits, because UserMayLoad() gets called
+  // multiple times.
+  histogram_tester.ExpectBucketCount(
+      "SupervisedUsers.ExtensionsAllowlist",
+      extensions::StandardManagementPolicyProvider::UmaExtensionStateAllowlist::
+          kAllowlistHit,
+      2);
+  histogram_tester.ExpectTotalCount("SupervisedUsers.ExtensionsAllowlist", 2);
+}
+
 #endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS)
 
 // Tests sync behavior in the case of an item that starts out as an app and gets
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc
index 2c4147af..805b1f3 100644
--- a/chrome/browser/extensions/extension_tab_util.cc
+++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -8,6 +8,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
 #include "base/numerics/ranges.h"
 #include "base/stl_util.h"
@@ -244,16 +245,19 @@
                                               url_string);
       return nullptr;
     }
+
+    // Don't let extensions crash the browser or renderers.
+    if (ExtensionTabUtil::IsKillURL(url)) {
+      *error = tabs_constants::kNoCrashBrowserError;
+      return nullptr;
+    }
+
+    // Log if this navigation looks like it is to a devtools URL.
+    ExtensionTabUtil::LogPossibleDevtoolsSchemeNavigation(url);
   } else {
     url = GURL(chrome::kChromeUINewTabURL);
   }
 
-  // Don't let extensions crash the browser or renderers.
-  if (ExtensionTabUtil::IsKillURL(url)) {
-    *error = tabs_constants::kNoCrashBrowserError;
-    return nullptr;
-  }
-
   // Default to foreground for the new tab. The presence of 'active' property
   // will override this default.
   bool active = true;
@@ -802,6 +806,12 @@
   return false;
 }
 
+void ExtensionTabUtil::LogPossibleDevtoolsSchemeNavigation(const GURL& url) {
+  const bool is_devtools_scheme = url.SchemeIs(content::kChromeDevToolsScheme);
+  UMA_HISTOGRAM_BOOLEAN("Extensions.ApiUrlNavigationDevtools",
+                        is_devtools_scheme);
+}
+
 void ExtensionTabUtil::CreateTab(std::unique_ptr<WebContents> web_contents,
                                  const std::string& extension_id,
                                  WindowOpenDisposition disposition,
diff --git a/chrome/browser/extensions/extension_tab_util.h b/chrome/browser/extensions/extension_tab_util.h
index 7fc4cb2..3ed4d37 100644
--- a/chrome/browser/extensions/extension_tab_util.h
+++ b/chrome/browser/extensions/extension_tab_util.h
@@ -208,6 +208,10 @@
   // equivalent. Extensions should be prevented from navigating to such URLs.
   static bool IsKillURL(const GURL& url);
 
+  // Logs if the URL of a tab that an extension is creating or navitaging to has
+  // the devtools scheme.
+  static void LogPossibleDevtoolsSchemeNavigation(const GURL& url);
+
   // Opens a tab for the specified |web_contents|.
   static void CreateTab(std::unique_ptr<content::WebContents> web_contents,
                         const std::string& extension_id,
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index d12a599..08c2447 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1479,6 +1479,11 @@
     "expiry_milestone": 83
   },
   {
+    "name": "enable-google-srp-isolated-prerender-probing",
+    "owners": [ "//chrome/browser/prerender/OWNERS" ],
+    "expiry_milestone": 90
+  },
+  {
     "name": "enable-google-srp-isolated-prerenders",
     "owners": [ "//chrome/browser/prerender/OWNERS" ],
     "expiry_milestone": 90
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 85bd05c..73ff791 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -633,6 +633,11 @@
 const char kEnableSRPIsolatedPrerendersDescription[] =
     "Enable Navigation Predictions on the Google SRP to be fully isolated.";
 
+const char kEnableSRPIsolatedPrerenderProbingName[] =
+    "Enable Probing on Navigation Predictor Isolated Prerenders";
+const char kEnableSRPIsolatedPrerenderProbingDescription[] =
+    "Enable probing checks for Isolated Prerenders which will block commit.";
+
 const char kDownloadAutoResumptionNativeName[] =
     "Enable download auto-resumption in native";
 const char kDownloadAutoResumptionNativeDescription[] =
@@ -2794,9 +2799,8 @@
 const char kOmniboxSuggestionTransparencyOptionsName[] =
     "Omnibox Suggestion Transparency Options";
 const char kOmniboxSuggestionTransparencyOptionsDescription[] =
-    "Improves transparency of and control over omnibox suggestions. This "
-    "includes \"Why this Suggestion?\" and user controls to delete "
-    "personalized suggestions.";
+    "Surfaces an X button next to deletable omnibox suggestions. This is to "
+    "make the suggestion removal feature more discoverable.";
 
 const char kOmniboxTabSwitchSuggestionsName[] =
     "Omnibox tab switch suggestions";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 4a7e82c..22af89b 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -453,6 +453,9 @@
 extern const char kEnableSRPIsolatedPrerendersName[];
 extern const char kEnableSRPIsolatedPrerendersDescription[];
 
+extern const char kEnableSRPIsolatedPrerenderProbingName[];
+extern const char kEnableSRPIsolatedPrerenderProbingDescription[];
+
 extern const char kEnableResamplingInputEventsName[];
 extern const char kEnableResamplingInputEventsDescription[];
 extern const char kEnableResamplingScrollEventsName[];
diff --git a/chrome/browser/media/history/media_history_store.cc b/chrome/browser/media/history/media_history_store.cc
index 0e09d17..7db0e4a 100644
--- a/chrome/browser/media/history/media_history_store.cc
+++ b/chrome/browser/media/history/media_history_store.cc
@@ -6,6 +6,7 @@
 
 #include "base/callback.h"
 #include "base/files/file_path.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/strings/stringprintf.h"
 #include "base/task_runner_util.h"
 #include "chrome/browser/media/feeds/media_feeds_service.h"
@@ -200,6 +201,11 @@
   if (!db_->Execute("PRAGMA foreign_keys=1")) {
     LOG(ERROR) << "Failed to enable foreign keys on the media history store.";
     db_->Poison();
+
+    base::UmaHistogramEnumeration(
+        MediaHistoryStore::kInitResultHistogramName,
+        MediaHistoryStore::InitResult::kFailedNoForeignKeys);
+
     return;
   }
 
@@ -208,6 +214,11 @@
   if (status != sql::INIT_OK) {
     LOG(ERROR) << "Failed to create or update the media history store.";
     db_->Poison();
+
+    base::UmaHistogramEnumeration(
+        MediaHistoryStore::kInitResultHistogramName,
+        MediaHistoryStore::InitResult::kFailedDatabaseTooNew);
+
     return;
   }
 
@@ -215,10 +226,18 @@
   if (status != sql::INIT_OK) {
     LOG(ERROR) << "Failed to initialize the media history store tables.";
     db_->Poison();
+
+    base::UmaHistogramEnumeration(
+        MediaHistoryStore::kInitResultHistogramName,
+        MediaHistoryStore::InitResult::kFailedInitializeTables);
+
     return;
   }
 
   initialization_successful_ = true;
+
+  base::UmaHistogramEnumeration(MediaHistoryStore::kInitResultHistogramName,
+                                MediaHistoryStore::InitResult::kSuccess);
 }
 
 sql::InitStatus MediaHistoryStoreInternal::CreateOrUpgradeIfNeeded() {
@@ -605,6 +624,9 @@
   return feed_items_table_->GetItemsForFeed(feed_id);
 }
 
+const char MediaHistoryStore::kInitResultHistogramName[] =
+    "Media.History.Init.Result";
+
 MediaHistoryStore::MediaHistoryStore(
     Profile* profile,
     scoped_refptr<base::UpdateableSequencedTaskRunner> db_task_runner)
diff --git a/chrome/browser/media/history/media_history_store.h b/chrome/browser/media/history/media_history_store.h
index 75f9225..42aec6e 100644
--- a/chrome/browser/media/history/media_history_store.h
+++ b/chrome/browser/media/history/media_history_store.h
@@ -56,6 +56,19 @@
       base::RepeatingCallback<bool(const base::TimeDelta& duration,
                                    const base::TimeDelta& position)>;
 
+  static const char kInitResultHistogramName[];
+
+  // When we initialize the database we store the result in
+  // |kInitResultHistogramName|. Do not change the numbering since this
+  // is recorded.
+  enum class InitResult {
+    kSuccess = 0,
+    kFailedNoForeignKeys = 1,
+    kFailedDatabaseTooNew = 2,
+    kFailedInitializeTables = 3,
+    kMaxValue = kFailedInitializeTables,
+  };
+
  protected:
   friend class MediaHistoryKeyedService;
 
diff --git a/chrome/browser/media/history/media_history_store_unittest.cc b/chrome/browser/media/history/media_history_store_unittest.cc
index e1d38fd..8247fa22 100644
--- a/chrome/browser/media/history/media_history_store_unittest.cc
+++ b/chrome/browser/media/history/media_history_store_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/task/thread_pool.h"
 #include "base/task/thread_pool/pooled_sequenced_task_runner.h"
 #include "base/test/bind_test_util.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_timeouts.h"
 #include "chrome/browser/history/history_service_factory.h"
@@ -93,6 +94,8 @@
  public:
   MediaHistoryStoreUnitTest() = default;
   void SetUp() override {
+    base::HistogramTester histogram_tester;
+
     // Set up the profile.
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     TestingProfile::Builder profile_builder;
@@ -113,6 +116,10 @@
     // tearing down the temporary directory.
     WaitForDB();
 
+    histogram_tester.ExpectBucketCount(
+        MediaHistoryStore::kInitResultHistogramName,
+        MediaHistoryStore::InitResult::kSuccess, 1);
+
     // Set up the local DB connection used for assertions.
     base::FilePath db_file =
         temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Media History"));
diff --git a/chrome/browser/net/cert_verify_proc_browsertest.cc b/chrome/browser/net/cert_verify_proc_browsertest.cc
new file mode 100644
index 0000000..22e89e6
--- /dev/null
+++ b/chrome/browser/net/cert_verify_proc_browsertest.cc
@@ -0,0 +1,151 @@
+// 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/command_line.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/json/json_reader.h"
+#include "build/build_config.h"
+#include "chrome/test/base/chrome_test_utils.h"
+#include "content/public/browser/network_service_instance.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "services/network/public/cpp/network_switches.h"
+
+#if defined(OS_ANDROID)
+#include "chrome/test/base/android/android_browser_test.h"
+#else
+#include "chrome/test/base/in_process_browser_test.h"
+#endif
+
+// Base class for tests that want to record a net log. The subclass should
+// implement the VerifyNetLog method which will be called after the test body
+// completes.
+class NetLogPlatformBrowserTestBase : public PlatformBrowserTest {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir());
+    net_log_path_ = tmp_dir_.GetPath().AppendASCII("netlog.json");
+    command_line->AppendSwitchPath(network::switches::kLogNetLog,
+                                   net_log_path_);
+  }
+
+  void TearDownInProcessBrowserTestFixture() override {
+    // When using the --log-net-log command line param, the net log is
+    // finalized during the destruction of the network service, which is
+    // started before this method is called, but completes asynchronously.
+    //
+    // Try for up to 5 seconds to read the netlog file.
+    constexpr base::TimeDelta kMaxWaitTime = base::TimeDelta::FromSeconds(5);
+    constexpr base::TimeDelta kWaitInterval =
+        base::TimeDelta::FromMilliseconds(50);
+    int tries_left = kMaxWaitTime / kWaitInterval;
+
+    base::Optional<base::Value> parsed_net_log;
+    while (true) {
+      std::string file_contents;
+      ASSERT_TRUE(base::ReadFileToString(net_log_path_, &file_contents));
+
+      parsed_net_log = base::JSONReader::Read(file_contents);
+      if (parsed_net_log)
+        break;
+
+      if (--tries_left <= 0)
+        break;
+      // The netlog file did not parse as valid JSON. Probably the Network
+      // Service is still shutting down. Wait a bit and try again.
+      base::PlatformThread::Sleep(kWaitInterval);
+    }
+    ASSERT_TRUE(parsed_net_log);
+
+    VerifyNetLog(&parsed_net_log.value());
+
+    PlatformBrowserTest::TearDownInProcessBrowserTestFixture();
+  }
+
+  // Subclasses should override this to implement the test verification
+  // conditions. It will be called after the test fixture has been torn down.
+  virtual void VerifyNetLog(base::Value* parsed_net_log) = 0;
+
+ protected:
+  content::WebContents* GetActiveWebContents() {
+    return chrome_test_utils::GetActiveWebContents(this);
+  }
+
+ private:
+  base::FilePath net_log_path_;
+  base::ScopedTempDir tmp_dir_;
+};
+
+// This is an integration test to ensure that CertVerifyProc netlog events
+// continue to be logged once cert verification is moved out of the network
+// service process. (See crbug.com/1015134 and crbug.com/1040681.)
+class CertVerifyProcNetLogBrowserTest : public NetLogPlatformBrowserTestBase {
+ public:
+  void SetUpOnMainThread() override {
+    PlatformBrowserTest::SetUpOnMainThread();
+
+    host_resolver()->AddRule("*", "127.0.0.1");
+
+    https_server_.ServeFilesFromSourceDirectory("chrome/test/data/");
+    https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES);
+  }
+
+  void VerifyNetLog(base::Value* parsed_net_log) override {
+    base::DictionaryValue* main;
+    ASSERT_TRUE(parsed_net_log->GetAsDictionary(&main));
+
+    base::Value* events = main->FindListKey("events");
+    ASSERT_TRUE(events);
+
+    bool found_cert_verify_proc_event = false;
+    for (const auto& event : events->GetList()) {
+      base::Optional<int> event_type = event.FindIntKey("type");
+      ASSERT_TRUE(event_type.has_value());
+      if (event_type ==
+          static_cast<int>(net::NetLogEventType::CERT_VERIFY_PROC)) {
+        base::Optional<int> phase = event.FindIntKey("phase");
+        if (!phase.has_value() ||
+            *phase != static_cast<int>(net::NetLogEventPhase::BEGIN)) {
+          continue;
+        }
+        const base::Value* params = event.FindDictKey("params");
+        if (!params)
+          continue;
+        const std::string* host = params->FindStringKey("host");
+        if (host && *host == kTestHost) {
+          found_cert_verify_proc_event = true;
+          break;
+        }
+      }
+    }
+
+    EXPECT_TRUE(found_cert_verify_proc_event);
+  }
+
+  const std::string kTestHost = "netlog-example.a.test";
+
+ protected:
+  net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS};
+};
+
+IN_PROC_BROWSER_TEST_F(CertVerifyProcNetLogBrowserTest, Test) {
+  ASSERT_TRUE(https_server_.Start());
+
+  // Request using a unique host name to ensure that the cert verification wont
+  // use a cached result for 127.0.0.1 that happened before the test starts
+  // logging.
+  EXPECT_TRUE(content::NavigateToURL(
+      GetActiveWebContents(),
+      https_server_.GetURL(kTestHost, "/ssl/google.html")));
+
+  // Technically there is no guarantee that if the cert verifier is running out
+  // of process that the netlog mojo messages will be delivered before the cert
+  // verification mojo result. See:
+  // https://chromium.googlesource.com/chromium/src/+/master/docs/mojo_ipc_conversion.md#Ordering-Considerations
+  // Hopefully this won't be flaky.
+  base::RunLoop().RunUntilIdle();
+  content::FlushNetworkServiceInstanceForTesting();
+}
diff --git a/chrome/browser/net/cookie_policy_browsertest.cc b/chrome/browser/net/cookie_policy_browsertest.cc
index 4d244855..f92af6ac 100644
--- a/chrome/browser/net/cookie_policy_browsertest.cc
+++ b/chrome/browser/net/cookie_policy_browsertest.cc
@@ -21,6 +21,7 @@
 #include "components/network_session_configurator/common/network_switches.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/common/content_paths.h"
+#include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "net/dns/mock_host_resolver.h"
@@ -32,9 +33,8 @@
 namespace {
 
 const std::vector<std::string> kStorageTypes{
-    "Cookie",    "LocalStorage", "FileSystem",   "SessionStorage",
-    "IndexedDb", "WebSql",       "CacheStorage", "ServiceWorker",
-};
+    "Cookie", "LocalStorage", "FileSystem",    "SessionStorage", "IndexedDb",
+    "WebSql", "CacheStorage", "ServiceWorker", "CookieStore"};
 
 const std::vector<std::string> kCrossTabCommunicationTypes{
     "SharedWorker",
@@ -59,6 +59,8 @@
     // HTTPS server only serves a valid cert for localhost, so this is needed
     // to load pages from other hosts without an error.
     command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
+    command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures,
+                                    "CookieStoreDocument");
   }
 
   void SetBlockThirdPartyCookies(bool value) {
diff --git a/chrome/browser/policy/managed_bookmarks_policy_handler_unittest.cc b/chrome/browser/policy/managed_bookmarks_policy_handler_unittest.cc
index dc033db5..f1722da 100644
--- a/chrome/browser/policy/managed_bookmarks_policy_handler_unittest.cc
+++ b/chrome/browser/policy/managed_bookmarks_policy_handler_unittest.cc
@@ -124,7 +124,7 @@
       }
     ]
   )");
-  ASSERT_EQ(expected, *pref_value);
+  EXPECT_EQ(expected, *pref_value);
 }
 
 TEST_F(ManagedBookmarksPolicyHandlerTest, ApplyPolicySettingsNoTitle) {
@@ -165,7 +165,7 @@
       }
     ]
   )");
-  ASSERT_EQ(expected, *pref_value);
+  EXPECT_EQ(expected, *pref_value);
 }
 
 TEST_F(ManagedBookmarksPolicyHandlerTest, WrongPolicyType) {
@@ -214,7 +214,7 @@
       }
     ]
   )");
-  ASSERT_EQ(expected, *pref_value);
+  EXPECT_EQ(expected, *pref_value);
 }
 
 TEST_F(ManagedBookmarksPolicyHandlerTest, BadBookmark) {
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc b/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
index 667f869d..58a4320 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
@@ -11,6 +11,7 @@
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/strings/string_split.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
@@ -24,6 +25,7 @@
 #include "chrome/browser/prerender/isolated/isolated_prerender_service.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_service_factory.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_service_workers_observer.h"
+#include "chrome/browser/prerender/isolated/isolated_prerender_tab_helper.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.h"
 #include "chrome/browser/prerender/prerender_final_status.h"
 #include "chrome/browser/prerender/prerender_handle.h"
@@ -41,6 +43,7 @@
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
 #include "components/data_reduction_proxy/proto/client_config.pb.h"
 #include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/common/network_service_util.h"
 #include "content/public/test/browser_test_base.h"
@@ -54,6 +57,8 @@
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
 #include "services/network/public/mojom/network_service_test.mojom.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
+#include "services/network/test/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -147,7 +152,6 @@
   void SetUp() override {
     scoped_feature_list_.InitWithFeatures(
         {features::kIsolatePrerenders,
-         features::kPrefetchSRPNavigationPredictions_HTMLOnly,
          data_reduction_proxy::features::kDataReductionProxyHoldback,
          data_reduction_proxy::features::kFetchClientConfig},
         {});
@@ -180,12 +184,14 @@
                                       enabled);
   }
 
+  content::WebContents* GetWebContents() const {
+    return browser()->tab_strip_model()->GetActiveWebContents();
+  }
+
   void MakeNavigationPrediction(const GURL& doc_url,
                                 const std::vector<GURL>& predicted_urls) {
     NavigationPredictorKeyedServiceFactory::GetForProfile(browser()->profile())
-        ->OnPredictionUpdated(
-            browser()->tab_strip_model()->GetActiveWebContents(), doc_url,
-            predicted_urls);
+        ->OnPredictionUpdated(GetWebContents(), doc_url, predicted_urls);
   }
 
   std::unique_ptr<prerender::PrerenderHandle> StartPrerender(const GURL& url) {
@@ -195,11 +201,7 @@
 
     return prerender_manager->AddPrerenderFromNavigationPredictor(
         url,
-        browser()
-            ->tab_strip_model()
-            ->GetActiveWebContents()
-            ->GetController()
-            .GetDefaultSessionStorageNamespace(),
+        GetWebContents()->GetController().GetDefaultSessionStorageNamespace(),
         kSize);
   }
 
@@ -245,12 +247,7 @@
     return origin_server_->GetURL("testorigin.com", path);
   }
 
-  size_t origin_server_request_with_cookies() const {
-    return origin_server_request_with_cookies_;
-  }
-
  protected:
-  base::OnceClosure waiting_for_resource_request_closure_;
   base::OnceClosure on_proxy_request_closure_;
 
  private:
@@ -270,10 +267,6 @@
     // Don't care about favicons.
     if (request.GetURL().spec().find("favicon") != std::string::npos)
       return;
-
-    if (request.headers.find("Cookie") != request.headers.end()) {
-      origin_server_request_with_cookies_++;
-    }
   }
 
   void MonitorProxyResourceRequest(
@@ -343,55 +336,14 @@
       prerender::PrerenderHandle* handle) override {}
   void OnPrerenderNetworkBytesChanged(
       prerender::PrerenderHandle* handle) override {}
-  void OnPrerenderStop(prerender::PrerenderHandle* handle) override {
-    if (waiting_for_resource_request_closure_) {
-      std::move(waiting_for_resource_request_closure_).Run();
-    }
-  }
+  void OnPrerenderStop(prerender::PrerenderHandle* handle) override {}
 
   base::test::ScopedFeatureList scoped_feature_list_;
   std::unique_ptr<net::EmbeddedTestServer> proxy_server_;
   std::unique_ptr<net::EmbeddedTestServer> origin_server_;
   std::unique_ptr<net::EmbeddedTestServer> config_server_;
-  size_t origin_server_request_with_cookies_ = 0;
 };
 
-IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest,
-                       DISABLE_ON_WIN_MAC_CHROMEOS(PrerenderIsIsolated)) {
-  SetDataSaverEnabled(true);
-
-  base::HistogramTester histogram_tester;
-
-  ASSERT_TRUE(content::SetCookie(browser()->profile(), GetOriginServerURL("/"),
-                                 "testing"));
-
-  // Do a prerender to the same origin and expect that the cookies are not used.
-  std::unique_ptr<prerender::PrerenderHandle> handle =
-      StartPrerender(GetOriginServerURL("/simple.html"));
-  ASSERT_TRUE(handle);
-
-  // Wait for the prerender to complete before checking.
-  if (!handle->IsFinishedLoading()) {
-    handle->SetObserver(this);
-    base::RunLoop run_loop;
-    waiting_for_resource_request_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(0U, origin_server_request_with_cookies());
-
-  histogram_tester.ExpectUniqueSample(
-      "Prerender.FinalStatus",
-      prerender::FINAL_STATUS_NOSTATE_PREFETCH_FINISHED, 1);
-
-  // Navigate to the same origin and expect it to have cookies.
-  // Note: This check needs to come after the prerender, otherwise the prerender
-  // will be canceled because the origin was recently loaded.
-  ui_test_utils::NavigateToURL(browser(), GetOriginServerURL("/simple.html"));
-  EXPECT_EQ(1U, origin_server_request_with_cookies());
-}
-
 IN_PROC_BROWSER_TEST_F(
     IsolatedPrerenderBrowserTest,
     DISABLE_ON_WIN_MAC_CHROMEOS(ServiceWorkerRegistrationIsObserved)) {
@@ -401,7 +353,7 @@
   ui_test_utils::NavigateToURL(
       browser(),
       GetOriginServerURL("/service_worker/create_service_worker.html"));
-  EXPECT_EQ("DONE", EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
+  EXPECT_EQ("DONE", EvalJs(GetWebContents(),
                            "register('network_fallback_worker.js');"));
 
   IsolatedPrerenderService* isolated_prerender_service =
@@ -439,3 +391,104 @@
   // server.
   run_loop.Run();
 }
+
+class ProbingIsolatedPrerenderBrowserTest
+    : public IsolatedPrerenderBrowserTest {
+ public:
+  ProbingIsolatedPrerenderBrowserTest()
+      : origin_server_for_probing_url_(GURL("https://bad.probe.com")) {}
+
+  void SetUp() override {
+    IsolatedPrerenderBrowserTest::SetUp();
+    scoped_feature_list_.InitWithFeatureState(
+        features::kIsolatePrerendersMustProbeOrigin, EnableProbe());
+
+    origin_server_for_probing_ = std::make_unique<net::EmbeddedTestServer>(
+        net::EmbeddedTestServer::TYPE_HTTPS);
+    if (EnableProbe()) {
+      ASSERT_TRUE(origin_server_for_probing_->Start());
+      origin_server_for_probing_url_ = origin_server_for_probing_->base_url();
+    }
+  }
+
+  virtual bool EnableProbe() const = 0;
+
+  GURL origin_server_for_probing_url() const {
+    return origin_server_for_probing_url_;
+  }
+
+  void AddSuccessfulPrefetch(const GURL& url) const {
+    IsolatedPrerenderTabHelper* tab_helper =
+        IsolatedPrerenderTabHelper::FromWebContents(GetWebContents());
+
+    network::mojom::URLResponseHeadPtr head =
+        network::CreateURLResponseHead(net::HTTP_OK);
+    head->was_fetched_via_cache = false;
+    head->mime_type = "text/html";
+
+    tab_helper->CallHandlePrefetchResponseForTesting(
+        url, net::NetworkIsolationKey::CreateOpaqueAndNonTransient(),
+        std::move(head),
+        std::make_unique<std::string>(
+            "<html><head><title>Successful prefetch</title></head></html>"));
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+  std::unique_ptr<net::EmbeddedTestServer> origin_server_for_probing_;
+  GURL origin_server_for_probing_url_;
+};
+
+class ProbingEnabledIsolatedPrerenderBrowserTest
+    : public ProbingIsolatedPrerenderBrowserTest {
+ public:
+  bool EnableProbe() const override { return true; }
+};
+
+class ProbingDisabledIsolatedPrerenderBrowserTest
+    : public ProbingIsolatedPrerenderBrowserTest {
+ public:
+  bool EnableProbe() const override { return false; }
+};
+
+// These tests use a separate embedded test server from |origin_server_| because
+// we need to test against a bad server for the probe disabled case, and ensure
+// that no probe occurs and the prefetched page can still be used. Therefore,
+// |origin_server_for_probing_| is only started when probing is enabled.
+
+IN_PROC_BROWSER_TEST_F(ProbingEnabledIsolatedPrerenderBrowserTest, ProbeGood) {
+  AddSuccessfulPrefetch(origin_server_for_probing_url());
+
+  ui_test_utils::NavigateToURL(browser(), origin_server_for_probing_url());
+
+  content::NavigationEntry* entry =
+      GetWebContents()->GetController().GetVisibleEntry();
+  EXPECT_EQ(content::PAGE_TYPE_NORMAL, entry->GetPageType());
+
+  EXPECT_EQ(base::UTF8ToUTF16("Successful prefetch"),
+            GetWebContents()->GetTitle());
+}
+
+IN_PROC_BROWSER_TEST_F(ProbingEnabledIsolatedPrerenderBrowserTest, ProbeBad) {
+  AddSuccessfulPrefetch(GURL("http://does-not-exist.host"));
+
+  ui_test_utils::NavigateToURL(browser(), origin_server_for_probing_url());
+
+  // The navigation won't be intercepted so an error page will be displayed.
+  content::NavigationEntry* entry =
+      GetWebContents()->GetController().GetVisibleEntry();
+  EXPECT_EQ(content::PAGE_TYPE_ERROR, entry->GetPageType());
+}
+
+IN_PROC_BROWSER_TEST_F(ProbingDisabledIsolatedPrerenderBrowserTest, NoProbe) {
+  AddSuccessfulPrefetch(origin_server_for_probing_url());
+
+  ui_test_utils::NavigateToURL(browser(), origin_server_for_probing_url());
+
+  content::NavigationEntry* entry =
+      GetWebContents()->GetController().GetVisibleEntry();
+  EXPECT_EQ(content::PAGE_TYPE_NORMAL, entry->GetPageType());
+
+  EXPECT_EQ(base::UTF8ToUTF16("Successful prefetch"),
+            GetWebContents()->GetTitle());
+}
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_features.cc b/chrome/browser/prerender/isolated/isolated_prerender_features.cc
index 8901f74..278a74a 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_features.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_features.cc
@@ -15,9 +15,4 @@
 const base::Feature kIsolatePrerendersMustProbeOrigin{
     "IsolatePrerendersMustProbeOrigin", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Prefetches main frame HTML resources for results on Google SRPs.
-const base::Feature kPrefetchSRPNavigationPredictions_HTMLOnly{
-    "PrefetchSRPNavigationPredictions_HTMLOnly",
-    base::FEATURE_DISABLED_BY_DEFAULT};
-
 }  // namespace features
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_features.h b/chrome/browser/prerender/isolated/isolated_prerender_features.h
index c1785ef..e4e97eb 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_features.h
+++ b/chrome/browser/prerender/isolated/isolated_prerender_features.h
@@ -11,7 +11,6 @@
 
 extern const base::Feature kIsolatePrerenders;
 extern const base::Feature kIsolatePrerendersMustProbeOrigin;
-extern const base::Feature kPrefetchSRPNavigationPredictions_HTMLOnly;
 
 }  // namespace features
 
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_from_string_url_loader.cc b/chrome/browser/prerender/isolated/isolated_prerender_from_string_url_loader.cc
index 5d77f72d..65a5eb1 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_from_string_url_loader.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_from_string_url_loader.cc
@@ -136,6 +136,7 @@
   handle_watcher_.reset();
   producer_handle_.reset();
   client_.reset();
+  receiver_.reset();
   weak_ptr_factory_.InvalidateWeakPtrs();
   MaybeDeleteSelf();
 }
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_params.cc b/chrome/browser/prerender/isolated/isolated_prerender_params.cc
index 07863c8..707bf51 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_params.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_params.cc
@@ -6,6 +6,7 @@
 
 #include <string>
 
+#include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_features.h"
@@ -26,14 +27,17 @@
 }
 
 base::Optional<size_t> IsolatedPrerenderMaximumNumberOfPrefetches() {
-  if (!base::FeatureList::IsEnabled(
-          features::kPrefetchSRPNavigationPredictions_HTMLOnly)) {
+  if (!IsolatedPrerenderIsEnabled()) {
     return 0;
   }
 
-  int max = base::GetFieldTrialParamByFeatureAsInt(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly,
-      "max_srp_prefetches", 1);
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          "isolated-prerender-unlimited-prefetches")) {
+    return base::nullopt;
+  }
+
+  int max = base::GetFieldTrialParamByFeatureAsInt(features::kIsolatePrerenders,
+                                                   "max_srp_prefetches", 1);
   if (max < 0) {
     return base::nullopt;
   }
@@ -46,3 +50,10 @@
           features::kIsolatePrerendersMustProbeOrigin, "probe_timeout_ms",
           10 * 1000 /* 10 seconds */));
 }
+
+base::TimeDelta IsolatedPrefetchTimeoutDuration() {
+  return base::TimeDelta::FromMilliseconds(
+      base::GetFieldTrialParamByFeatureAsInt(features::kIsolatePrerenders,
+                                             "prefetch_timeout_ms",
+                                             10 * 1000 /* 10 seconds */));
+}
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_params.h b/chrome/browser/prerender/isolated/isolated_prerender_params.h
index df38c45..3cec945 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_params.h
+++ b/chrome/browser/prerender/isolated/isolated_prerender_params.h
@@ -26,4 +26,8 @@
 // The amount of time to allow before timing out an origin probe.
 base::TimeDelta IsolatedPrerenderProbeTimeout();
 
+// The amount of time to allow a prefetch to take before considering it a
+// timeout error.
+base::TimeDelta IsolatedPrefetchTimeoutDuration();
+
 #endif  // CHROME_BROWSER_PRERENDER_ISOLATED_ISOLATED_PRERENDER_PARAMS_H_
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.cc b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.cc
index 5e2f23a..b924409 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.cc
@@ -55,6 +55,10 @@
   if (navigation_predictor_service) {
     navigation_predictor_service->AddObserver(this);
   }
+
+  // Make sure the global service is up and running so that the service worker
+  // registrations can be queried before the first navigation prediction.
+  IsolatedPrerenderServiceFactory::GetForProfile(profile_);
 }
 
 IsolatedPrerenderTabHelper::~IsolatedPrerenderTabHelper() {
@@ -101,8 +105,7 @@
     content::Visibility visibility) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!base::FeatureList::IsEnabled(
-          features::kPrefetchSRPNavigationPredictions_HTMLOnly)) {
+  if (!IsolatedPrerenderIsEnabled()) {
     return;
   }
 
@@ -132,8 +135,7 @@
 
 void IsolatedPrerenderTabHelper::Prefetch() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(base::FeatureList::IsEnabled(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly));
+  DCHECK(IsolatedPrerenderIsEnabled());
 
   page_->url_loader.reset();
   if (page_->urls_to_prefetch.empty()) {
@@ -205,6 +207,7 @@
   page_->url_loader->SetOnRedirectCallback(base::BindRepeating(
       &IsolatedPrerenderTabHelper::OnPrefetchRedirect, base::Unretained(this)));
   page_->url_loader->SetAllowHttpErrorResults(true);
+  page_->url_loader->SetTimeoutDuration(IsolatedPrefetchTimeoutDuration());
   page_->url_loader->DownloadToString(
       GetURLLoaderFactory(),
       base::BindOnce(&IsolatedPrerenderTabHelper::OnPrefetchComplete,
@@ -244,13 +247,20 @@
   Prefetch();
 }
 
+void IsolatedPrerenderTabHelper::CallHandlePrefetchResponseForTesting(
+    const GURL& url,
+    const net::NetworkIsolationKey& key,
+    network::mojom::URLResponseHeadPtr head,
+    std::unique_ptr<std::string> body) {
+  HandlePrefetchResponse(url, key, std::move(head), std::move(body));
+}
+
 void IsolatedPrerenderTabHelper::HandlePrefetchResponse(
     const GURL& url,
     const net::NetworkIsolationKey& key,
     network::mojom::URLResponseHeadPtr head,
     std::unique_ptr<std::string> body) {
   DCHECK(!head->was_fetched_via_cache);
-  DCHECK(PrefetchingActive());
 
   int response_code = head->headers->response_code();
   if (response_code < 200 || response_code >= 300) {
@@ -270,8 +280,7 @@
     const base::Optional<NavigationPredictorKeyedService::Prediction>&
         prediction) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!base::FeatureList::IsEnabled(
-          features::kPrefetchSRPNavigationPredictions_HTMLOnly)) {
+  if (!IsolatedPrerenderIsEnabled()) {
     return;
   }
 
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.h b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.h
index 3b0a5f88..6d0f227 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.h
+++ b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.h
@@ -47,6 +47,12 @@
     return page_ ? page_->prefetched_responses.size() : 0;
   }
 
+  void CallHandlePrefetchResponseForTesting(
+      const GURL& url,
+      const net::NetworkIsolationKey& key,
+      network::mojom::URLResponseHeadPtr head,
+      std::unique_ptr<std::string> body);
+
   // content::WebContentsObserver implementation.
   void DidStartNavigation(
       content::NavigationHandle* navigation_handle) override;
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc
index 74631aad..13be092 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc
@@ -233,8 +233,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, FeatureDisabled) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndDisableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndDisableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -245,8 +244,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, DataSaverDisabled) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   SetDataSaverEnabled(false);
 
@@ -259,8 +257,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, GoogleSRPOnly) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.not-google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -271,8 +268,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, SRPOnly) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/photos?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -283,8 +279,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, HTTPSPredictionsOnly) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.not-google.com/search?q=cats");
   GURL prediction_url("http://www.cat-food.com/");
@@ -295,8 +290,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, DontFetchGoogleLinks) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("http://www.google.com/user");
@@ -307,8 +301,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, DontFetchIPAddresses) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://123.234.123.234/meow");
@@ -319,8 +312,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, WrongWebContents) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -331,8 +323,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, HasPurposePrefetchHeader) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -344,8 +335,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, NoCookies) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -360,8 +350,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, 2XXOnly) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -375,8 +364,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, NetErrorOKOnly) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -390,8 +378,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, NonHTML) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -406,8 +393,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, UserSettingDisabled) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   profile()->GetPrefs()->SetInteger(
       prefs::kNetworkPredictionOptions,
@@ -423,8 +409,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, SuccessCase) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -452,8 +437,7 @@
 TEST_F(IsolatedPrerenderTabHelperTest, LimitedNumberOfPrefetches_Zero) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeatureWithParameters(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly,
-      {{"max_srp_prefetches", "0"}});
+      features::kIsolatePrerenders, {{"max_srp_prefetches", "0"}});
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -463,11 +447,38 @@
   EXPECT_EQ(RequestCount(), 0);
 }
 
-TEST_F(IsolatedPrerenderTabHelperTest, LimitedNumberOfPrefetches_Unlimited) {
+TEST_F(IsolatedPrerenderTabHelperTest,
+       NumberOfPrefetches_UnlimitedByExperiment) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeatureWithParameters(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly,
-      {{"max_srp_prefetches", "-1"}});
+      features::kIsolatePrerenders, {{"max_srp_prefetches", "-1"}});
+
+  GURL doc_url("https://www.google.com/search?q=cats");
+  GURL prediction_url_1("https://www.cat-food.com/");
+  GURL prediction_url_2("https://www.dogs-r-dumb.com/");
+  GURL prediction_url_3("https://www.catz-rule.com/");
+  MakeNavigationPrediction(
+      web_contents(), doc_url,
+      {prediction_url_1, prediction_url_2, prediction_url_3});
+
+  VerifyCommonRequestState(prediction_url_1);
+  MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, {}, kHTMLBody);
+  VerifyCommonRequestState(prediction_url_2);
+  // Failed responses do not retry or attempt more requests in the list.
+  MakeResponseAndWait(net::HTTP_OK, net::ERR_FAILED, kHTMLMimeType, {},
+                      kHTMLBody);
+  VerifyCommonRequestState(prediction_url_3);
+  MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, {}, kHTMLBody);
+
+  EXPECT_EQ(RequestCount(), 0);
+}
+
+TEST_F(IsolatedPrerenderTabHelperTest, NumberOfPrefetches_UnlimitedByCmdLine) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
+
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      "isolated-prerender-unlimited-prefetches");
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url_1("https://www.cat-food.com/");
@@ -492,8 +503,7 @@
 TEST_F(IsolatedPrerenderTabHelperTest, LimitedNumberOfPrefetches) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeatureWithParameters(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly,
-      {{"max_srp_prefetches", "2"}});
+      features::kIsolatePrerenders, {{"max_srp_prefetches", "2"}});
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url_1("https://www.cat-food.com/");
@@ -515,8 +525,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, PrefetchingNotStartedWhileInvisible) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   web_contents()->WasHidden();
 
@@ -530,8 +539,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, PrefetchingPausedWhenInvisible) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url_1("https://www.cat-food.com/");
@@ -552,8 +560,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, PrefetchingRestartedWhenVisible) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   web_contents()->WasHidden();
 
@@ -571,8 +578,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, ServiceWorkerRegistered) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -590,8 +596,7 @@
 
 TEST_F(IsolatedPrerenderTabHelperTest, ServiceWorkerNotRegistered) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   GURL doc_url("https://www.google.com/search?q=cats");
   GURL prediction_url("https://www.cat-food.com/");
@@ -675,8 +680,7 @@
     GURL prediction_url("https://www.cat-food.com/");
 
     base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitAndEnableFeature(
-        features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+    scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
     MakeNavigationPrediction(web_contents(), doc_url, {prediction_url});
 
@@ -720,8 +724,7 @@
   GURL redirect_url("https://redirect-here.com");
 
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kPrefetchSRPNavigationPredictions_HTMLOnly);
+  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
 
   MakeNavigationPrediction(web_contents(), doc_url, {prediction_url});
   VerifyCommonRequestState(prediction_url);
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
index 86ab71bf..792366a 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
@@ -7,10 +7,14 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/callback.h"
 #include "base/feature_list.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_features.h"
+#include "chrome/browser/prerender/isolated/isolated_prerender_from_string_url_loader.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_params.h"
+#include "chrome/browser/prerender/isolated/isolated_prerender_tab_helper.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_url_loader.h"
+#include "chrome/browser/prerender/isolated/prefetched_mainframe_response_container.h"
 #include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -21,43 +25,6 @@
 
 namespace {
 
-bool ShouldInterceptRequestForPrerender(
-    int frame_tree_node_id,
-    const network::ResourceRequest& tentative_resource_request,
-    content::BrowserContext* browser_context) {
-  if (!base::FeatureList::IsEnabled(features::kIsolatePrerenders))
-    return false;
-
-  // Lite Mode must be enabled for this feature to be enabled.
-  Profile* profile = Profile::FromBrowserContext(browser_context);
-  bool ds_enabled = data_reduction_proxy::DataReductionProxySettings::
-      IsDataSaverEnabledByUser(profile->IsOffTheRecord(), profile->GetPrefs());
-  if (!ds_enabled)
-    return false;
-
-  // TODO(crbug.com/1023486): Add other triggering checks.
-
-  // TODO(robertogden): Bail GetStoragePartitionForSite(url) !=
-  // GetDefaultStoragePartitionForSite().
-
-  content::WebContents* web_contents =
-      content::WebContents::FromFrameTreeNodeId(frame_tree_node_id);
-  if (!web_contents)
-    return false;
-
-  if (!tentative_resource_request.url.SchemeIs(url::kHttpsScheme))
-    return false;
-
-  DCHECK_EQ(web_contents->GetBrowserContext(), browser_context);
-
-  prerender::PrerenderManager* prerender_manager =
-      prerender::PrerenderManagerFactory::GetForBrowserContext(browser_context);
-  if (!prerender_manager)
-    return false;
-
-  return prerender_manager->IsWebContentsPrerendering(web_contents, nullptr);
-}
-
 Profile* ProfileFromFrameTreeNodeID(int frame_tree_node_id) {
   content::WebContents* web_contents =
       content::WebContents::FromFrameTreeNodeId(frame_tree_node_id);
@@ -84,68 +51,60 @@
   DCHECK(!loader_callback_);
   loader_callback_ = std::move(callback);
 
-  if (!ShouldInterceptRequestForPrerender(
-          frame_tree_node_id_, tentative_resource_request, browser_context)) {
-    OnDoNotInterceptRequest();
+  std::unique_ptr<PrefetchedMainframeResponseContainer> prefetch =
+      GetPrefetchedResponse(tentative_resource_request.url);
+  if (!prefetch) {
+    DoNotInterceptNavigation();
     return;
   }
 
   if (base::FeatureList::IsEnabled(
           features::kIsolatePrerendersMustProbeOrigin)) {
-    StartProbe(tentative_resource_request, browser_context);
+    StartProbe(tentative_resource_request.url.GetOrigin(),
+               base::BindOnce(&IsolatedPrerenderURLLoaderInterceptor::
+                                  InterceptPrefetchedNavigation,
+                              base::Unretained(this),
+                              tentative_resource_request, std::move(prefetch)));
     return;
   }
-
-  OnInterceptRequest(tentative_resource_request, browser_context);
+  InterceptPrefetchedNavigation(tentative_resource_request,
+                                std::move(prefetch));
 }
 
-void IsolatedPrerenderURLLoaderInterceptor::OnInterceptRequest(
+void IsolatedPrerenderURLLoaderInterceptor::InterceptPrefetchedNavigation(
     const network::ResourceRequest& tentative_resource_request,
-    content::BrowserContext* browser_context) {
-  std::unique_ptr<IsolatedPrerenderURLLoader> url_loader =
-      std::make_unique<IsolatedPrerenderURLLoader>(
-          tentative_resource_request,
-          content::BrowserContext::GetDefaultStoragePartition(browser_context)
-              ->GetURLLoaderFactoryForBrowserProcess(),
-          frame_tree_node_id_, 0 /* request_id */);
+    std::unique_ptr<PrefetchedMainframeResponseContainer> prefetch) {
+  std::unique_ptr<IsolatedPrerenderFromStringURLLoader> url_loader =
+      std::make_unique<IsolatedPrerenderFromStringURLLoader>(
+          std::move(prefetch), tentative_resource_request);
   std::move(loader_callback_).Run(url_loader->ServingResponseHandler());
   // url_loader manages its own lifetime once bound to the mojo pipes.
   url_loader.release();
-  return;
 }
 
-void IsolatedPrerenderURLLoaderInterceptor::OnDoNotInterceptRequest() {
+void IsolatedPrerenderURLLoaderInterceptor::DoNotInterceptNavigation() {
   std::move(loader_callback_).Run({});
 }
 
-void IsolatedPrerenderURLLoaderInterceptor::CallOnProbeCompleteForTesting(
-    const network::ResourceRequest& tentative_resource_request,
-    content::BrowserContext* browser_context,
-    bool success) {
-  OnProbeComplete(tentative_resource_request, browser_context, success);
-}
-
 void IsolatedPrerenderURLLoaderInterceptor::OnProbeComplete(
-    const network::ResourceRequest& tentative_resource_request,
-    content::BrowserContext* browser_context,
+    base::OnceClosure on_success_callback,
     bool success) {
   if (success) {
-    OnInterceptRequest(tentative_resource_request, browser_context);
+    std::move(on_success_callback).Run();
     return;
   }
-  OnDoNotInterceptRequest();
+  DoNotInterceptNavigation();
 }
 
 void IsolatedPrerenderURLLoaderInterceptor::StartProbe(
-    const network::ResourceRequest& tentative_resource_request,
-    content::BrowserContext* browser_context) {
+    const GURL& url,
+    base::OnceClosure on_success_callback) {
   Profile* profile = ProfileFromFrameTreeNodeID(frame_tree_node_id_);
   if (!profile) {
-    OnDoNotInterceptRequest();
+    DoNotInterceptNavigation();
     return;
   }
 
-  GURL url = tentative_resource_request.url.GetOrigin();
   DCHECK(url.SchemeIs(url::kHttpsScheme));
 
   net::NetworkTrafficAnnotationTag traffic_annotation =
@@ -191,9 +150,9 @@
       0 /* max_cache_entries */,
       base::TimeDelta::FromSeconds(0) /* revalidate_cache_after */);
   // Unretained is safe here because |this| owns |origin_prober_|.
-  origin_prober_->SetOnCompleteCallback(base::BindRepeating(
-      &IsolatedPrerenderURLLoaderInterceptor::OnProbeComplete,
-      base::Unretained(this), tentative_resource_request, browser_context));
+  origin_prober_->SetOnCompleteCallback(
+      base::BindOnce(&IsolatedPrerenderURLLoaderInterceptor::OnProbeComplete,
+                     base::Unretained(this), std::move(on_success_callback)));
   origin_prober_->SendNowIfInactive(false /* send_only_in_foreground */);
 }
 
@@ -209,3 +168,18 @@
   // site is blocked.
   return net_error == net::OK;
 }
+
+std::unique_ptr<PrefetchedMainframeResponseContainer>
+IsolatedPrerenderURLLoaderInterceptor::GetPrefetchedResponse(const GURL& url) {
+  content::WebContents* web_contents =
+      content::WebContents::FromFrameTreeNodeId(frame_tree_node_id_);
+  if (!web_contents)
+    return nullptr;
+
+  IsolatedPrerenderTabHelper* tab_helper =
+      IsolatedPrerenderTabHelper::FromWebContents(web_contents);
+  if (!tab_helper)
+    return nullptr;
+
+  return tab_helper->TakePrefetchResponse(url);
+}
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.h b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.h
index 83fc4ef..acb34a49 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.h
+++ b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/callback_forward.h"
 #include "base/macros.h"
 #include "base/sequence_checker.h"
 #include "chrome/browser/availability/availability_prober.h"
@@ -18,6 +19,8 @@
 class BrowserContext;
 }  // namespace content
 
+class PrefetchedMainframeResponseContainer;
+
 // Intercepts prerender navigations that are eligible to be isolated.
 class IsolatedPrerenderURLLoaderInterceptor
     : public content::URLLoaderRequestInterceptor,
@@ -32,18 +35,16 @@
       content::BrowserContext* browser_context,
       content::URLLoaderRequestInterceptor::LoaderCallback callback) override;
 
-  void CallOnProbeCompleteForTesting(
-      const network::ResourceRequest& tentative_resource_request,
-      content::BrowserContext* browser_context,
-      bool success);
-
-  // TODO(crbug/1023485): Add logic to handle subresources.
+ protected:
+  // Virtual for testing
+  virtual std::unique_ptr<PrefetchedMainframeResponseContainer>
+  GetPrefetchedResponse(const GURL& url);
 
  private:
-  void OnInterceptRequest(
+  void InterceptPrefetchedNavigation(
       const network::ResourceRequest& tentative_resource_request,
-      content::BrowserContext* browser_context);
-  void OnDoNotInterceptRequest();
+      std::unique_ptr<PrefetchedMainframeResponseContainer>);
+  void DoNotInterceptNavigation();
 
   // AvailabilityProber::Delegate:
   bool ShouldSendNextProbe() override;
@@ -51,15 +52,10 @@
                          const network::mojom::URLResponseHead* head,
                          std::unique_ptr<std::string> body) override;
 
-  // Starts a probe to the origin of |tentative_resource_request|'s url.
-  void StartProbe(const network::ResourceRequest& tentative_resource_request,
-                  content::BrowserContext* browser_context);
+  void StartProbe(const GURL& url, base::OnceClosure on_success_callback);
 
   // Called when the probe finishes with |success|.
-  void OnProbeComplete(
-      const network::ResourceRequest& tentative_resource_request,
-      content::BrowserContext* browser_context,
-      bool success);
+  void OnProbeComplete(base::OnceClosure on_success_callback, bool success);
 
   // Used to get the current WebContents.
   const int frame_tree_node_id_;
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor_unittest.cc b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor_unittest.cc
index 42a8f33c..18ea462 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor_unittest.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_features.h"
+#include "chrome/browser/prerender/isolated/prefetched_mainframe_response_container.h"
 #include "chrome/browser/prerender/prerender_handle.h"
 #include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
@@ -43,6 +44,34 @@
 #define DISABLE_ASAN(x) x
 #endif
 
+class TestIsolatedPrerenderURLLoaderInterceptor
+    : public IsolatedPrerenderURLLoaderInterceptor {
+ public:
+  explicit TestIsolatedPrerenderURLLoaderInterceptor(int frame_tree_node_id)
+      : IsolatedPrerenderURLLoaderInterceptor(frame_tree_node_id) {}
+  ~TestIsolatedPrerenderURLLoaderInterceptor() override = default;
+
+  void SetHasPrefetchedResponse(const GURL& url, bool has_prefetch) {
+    expected_url_ = url;
+    has_prefetch_ = has_prefetch;
+  }
+
+  std::unique_ptr<PrefetchedMainframeResponseContainer> GetPrefetchedResponse(
+      const GURL& url) override {
+    EXPECT_EQ(expected_url_, url);
+    if (has_prefetch_) {
+      return std::make_unique<PrefetchedMainframeResponseContainer>(
+          net::NetworkIsolationKey(), network::mojom::URLResponseHead::New(),
+          std::make_unique<std::string>("body"));
+    }
+    return nullptr;
+  }
+
+ private:
+  GURL expected_url_;
+  bool has_prefetch_ = false;
+};
+
 class IsolatedPrerenderURLLoaderInterceptorTest
     : public ChromeRenderViewHostTestHarness {
  public:
@@ -102,132 +131,11 @@
 };
 
 TEST_F(IsolatedPrerenderURLLoaderInterceptorTest, DISABLE_ASAN(WantIntercept)) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
-
-  std::unique_ptr<prerender::PrerenderHandle> handle =
-      StartPrerender(TestURL());
-
-  std::unique_ptr<IsolatedPrerenderURLLoaderInterceptor> interceptor =
-      std::make_unique<IsolatedPrerenderURLLoaderInterceptor>(
-          handle->contents()
-              ->prerender_contents()
-              ->GetMainFrame()
-              ->GetFrameTreeNodeId());
-
-  network::ResourceRequest request;
-  request.url = TestURL();
-  request.resource_type =
-      static_cast<int>(blink::mojom::ResourceType::kMainFrame);
-  request.method = "GET";
-
-  interceptor->MaybeCreateLoader(
-      request, profile(),
-      base::BindOnce(
-          &IsolatedPrerenderURLLoaderInterceptorTest::HandlerCallback,
-          base::Unretained(this)));
-  WaitForCallback();
-
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_TRUE(was_intercepted().value());
-}
-
-TEST_F(IsolatedPrerenderURLLoaderInterceptorTest, DISABLE_ASAN(FeatureOff)) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndDisableFeature(features::kIsolatePrerenders);
-
-  std::unique_ptr<prerender::PrerenderHandle> handle =
-      StartPrerender(TestURL());
-
-  std::unique_ptr<IsolatedPrerenderURLLoaderInterceptor> interceptor =
-      std::make_unique<IsolatedPrerenderURLLoaderInterceptor>(
-          handle->contents()
-              ->prerender_contents()
-              ->GetMainFrame()
-              ->GetFrameTreeNodeId());
-
-  network::ResourceRequest request;
-  request.url = TestURL();
-  request.resource_type =
-      static_cast<int>(blink::mojom::ResourceType::kMainFrame);
-  request.method = "GET";
-
-  interceptor->MaybeCreateLoader(
-      request, profile(),
-      base::BindOnce(
-          &IsolatedPrerenderURLLoaderInterceptorTest::HandlerCallback,
-          base::Unretained(this)));
-  WaitForCallback();
-
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
-}
-
-TEST_F(IsolatedPrerenderURLLoaderInterceptorTest,
-       DISABLE_ASAN(DataSaverDisabled)) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
-
-  SetDataSaverEnabled(false);
-
-  std::unique_ptr<prerender::PrerenderHandle> handle =
-      StartPrerender(TestURL());
-
-  std::unique_ptr<IsolatedPrerenderURLLoaderInterceptor> interceptor =
-      std::make_unique<IsolatedPrerenderURLLoaderInterceptor>(
-          handle->contents()
-              ->prerender_contents()
-              ->GetMainFrame()
-              ->GetFrameTreeNodeId());
-
-  network::ResourceRequest request;
-  request.url = TestURL();
-  request.resource_type =
-      static_cast<int>(blink::mojom::ResourceType::kMainFrame);
-  request.method = "GET";
-
-  interceptor->MaybeCreateLoader(
-      request, profile(),
-      base::BindOnce(
-          &IsolatedPrerenderURLLoaderInterceptorTest::HandlerCallback,
-          base::Unretained(this)));
-  WaitForCallback();
-
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
-}
-
-TEST_F(IsolatedPrerenderURLLoaderInterceptorTest, DISABLE_ASAN(NotAPrerender)) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
-
-  std::unique_ptr<IsolatedPrerenderURLLoaderInterceptor> interceptor =
-      std::make_unique<IsolatedPrerenderURLLoaderInterceptor>(
+  std::unique_ptr<TestIsolatedPrerenderURLLoaderInterceptor> interceptor =
+      std::make_unique<TestIsolatedPrerenderURLLoaderInterceptor>(
           web_contents()->GetMainFrame()->GetFrameTreeNodeId());
 
-  network::ResourceRequest request;
-  request.url = TestURL();
-  request.resource_type =
-      static_cast<int>(blink::mojom::ResourceType::kMainFrame);
-  request.method = "GET";
-
-  interceptor->MaybeCreateLoader(
-      request, profile(),
-      base::BindOnce(
-          &IsolatedPrerenderURLLoaderInterceptorTest::HandlerCallback,
-          base::Unretained(this)));
-  WaitForCallback();
-
-  EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
-}
-
-TEST_F(IsolatedPrerenderURLLoaderInterceptorTest, DISABLE_ASAN(NotAFrame)) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders);
-
-  std::unique_ptr<IsolatedPrerenderURLLoaderInterceptor> interceptor =
-      std::make_unique<IsolatedPrerenderURLLoaderInterceptor>(1337);
+  interceptor->SetHasPrefetchedResponse(TestURL(), true);
 
   network::ResourceRequest request;
   request.url = TestURL();
@@ -243,64 +151,16 @@
   WaitForCallback();
 
   EXPECT_TRUE(was_intercepted().has_value());
-  EXPECT_FALSE(was_intercepted().value());
-}
-
-TEST_F(IsolatedPrerenderURLLoaderInterceptorTest,
-       DISABLE_ASAN(ProbeOrigin_Success)) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      {features::kIsolatePrerenders,
-       features::kIsolatePrerendersMustProbeOrigin},
-      {});
-
-  std::unique_ptr<prerender::PrerenderHandle> handle =
-      StartPrerender(TestURL());
-
-  std::unique_ptr<IsolatedPrerenderURLLoaderInterceptor> interceptor =
-      std::make_unique<IsolatedPrerenderURLLoaderInterceptor>(
-          handle->contents()
-              ->prerender_contents()
-              ->GetMainFrame()
-              ->GetFrameTreeNodeId());
-
-  network::ResourceRequest request;
-  request.url = TestURL();
-  request.resource_type =
-      static_cast<int>(blink::mojom::ResourceType::kMainFrame);
-  request.method = "GET";
-
-  interceptor->MaybeCreateLoader(
-      request, profile(),
-      base::BindOnce(
-          &IsolatedPrerenderURLLoaderInterceptorTest::HandlerCallback,
-          base::Unretained(this)));
-
-  interceptor->CallOnProbeCompleteForTesting(request, profile(), true);
-
-  WaitForCallback();
-
-  EXPECT_TRUE(was_intercepted().has_value());
   EXPECT_TRUE(was_intercepted().value());
 }
 
 TEST_F(IsolatedPrerenderURLLoaderInterceptorTest,
-       DISABLE_ASAN(ProbeOrigin_Failure)) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      {features::kIsolatePrerenders,
-       features::kIsolatePrerendersMustProbeOrigin},
-      {});
+       DISABLE_ASAN(DoNotWantIntercept)) {
+  std::unique_ptr<TestIsolatedPrerenderURLLoaderInterceptor> interceptor =
+      std::make_unique<TestIsolatedPrerenderURLLoaderInterceptor>(
+          web_contents()->GetMainFrame()->GetFrameTreeNodeId());
 
-  std::unique_ptr<prerender::PrerenderHandle> handle =
-      StartPrerender(TestURL());
-
-  std::unique_ptr<IsolatedPrerenderURLLoaderInterceptor> interceptor =
-      std::make_unique<IsolatedPrerenderURLLoaderInterceptor>(
-          handle->contents()
-              ->prerender_contents()
-              ->GetMainFrame()
-              ->GetFrameTreeNodeId());
+  interceptor->SetHasPrefetchedResponse(TestURL(), false);
 
   network::ResourceRequest request;
   request.url = TestURL();
@@ -313,11 +173,10 @@
       base::BindOnce(
           &IsolatedPrerenderURLLoaderInterceptorTest::HandlerCallback,
           base::Unretained(this)));
-
-  interceptor->CallOnProbeCompleteForTesting(request, profile(), false);
-
   WaitForCallback();
 
   EXPECT_TRUE(was_intercepted().has_value());
   EXPECT_FALSE(was_intercepted().value());
 }
+
+// Testing of the probe is done in browsertests.
diff --git a/chrome/browser/printing/pdf_to_emf_converter.cc b/chrome/browser/printing/pdf_to_emf_converter.cc
index 3a9141aa..79e5971 100644
--- a/chrome/browser/printing/pdf_to_emf_converter.cc
+++ b/chrome/browser/printing/pdf_to_emf_converter.cc
@@ -219,7 +219,7 @@
   } else {
     metafile = std::make_unique<Emf>();
   }
-  if (!metafile->InitFromData(mapping.memory(), mapping.size()))
+  if (!metafile->InitFromData(mapping.GetMemoryAsSpan<const uint8_t>()))
     metafile.reset();
   return metafile;
 }
@@ -265,7 +265,7 @@
 
   base::MappedReadOnlyRegion memory =
       base::ReadOnlySharedMemoryRegion::Create(data->size());
-  if (!memory.region.IsValid() || !memory.mapping.IsValid()) {
+  if (!memory.IsValid()) {
     OnFailed(std::string("Failed to create PDF data mapping."));
     return;
   }
diff --git a/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc b/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
index c437173..0eec97e 100644
--- a/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
+++ b/chrome/browser/printing/pdf_to_emf_converter_browsertest.cc
@@ -59,7 +59,7 @@
 
 std::unique_ptr<ENHMETAHEADER> GetEmfHeader(const std::string& emf_data) {
   Emf emf;
-  if (!emf.InitFromData(emf_data.data(), emf_data.size()))
+  if (!emf.InitFromData(base::as_bytes(base::make_span(emf_data))))
     return nullptr;
 
   auto meta_header = std::make_unique<ENHMETAHEADER>();
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
index f008ef9..3378f34 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -176,7 +176,7 @@
 #endif
 
   std::unique_ptr<MetafileSkia> metafile = std::make_unique<MetafileSkia>();
-  CHECK(metafile->InitFromData(print_data->front(), print_data->size()));
+  CHECK(metafile->InitFromData(*print_data));
 
   // Update the rendered document. It will send notifications to the listener.
   PrintedDocument* document = print_job_->document();
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_am.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_am.xtb
index 64eb24e6..d348642 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_am.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">ቪዲዮ</translation>
 <translation id="4764692524839457597">ነባሪ</translation>
 <translation id="4772771694153161212">ከስር አታስምር</translation>
+<translation id="4784215347943747396">መሣሪያውን በ1 ወይም 2 መቆጣጠሪያዎች ብቻ ይቆጣጠሩ</translation>
 <translation id="4786285211967466855">ምንም ቀዳሚ የደረጃ 1 ርዕስ የለም</translation>
 <translation id="4787577491510559358">ለአሁኑ ንጥል ቅርጸት ያስታውቁ</translation>
 <translation id="479989351350248267">ፈልግ</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
index c31aeef..62aa2aa8 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">فيديو</translation>
 <translation id="4764692524839457597">تلقائي</translation>
 <translation id="4772771694153161212">بدون تسطير</translation>
+<translation id="4784215347943747396">تسمح بالتحكُّم في الجهاز باستخدام مفتاح تبديل واحد أو مفتاحَين.</translation>
 <translation id="4786285211967466855">ليس هناك عنوان سابق من المستوى الأول.</translation>
 <translation id="4787577491510559358">الإعلان عن تنسيق عنصر حالي</translation>
 <translation id="479989351350248267">بحث</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_az.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_az.xtb
index 851dec4..1dceb08 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_az.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_az.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">defolt</translation>
 <translation id="4772771694153161212">Altdan xətli deyil</translation>
+<translation id="4784215347943747396">Yalnız 1, yaxud 2 düymə ilə cihazı idarə edin</translation>
 <translation id="4786285211967466855">Öncəki 1-ci səviyyə başlığı yoxdur</translation>
 <translation id="4787577491510559358">Cari element üçün formatlamanı elan edin</translation>
 <translation id="479989351350248267">axtarın</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_be.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_be.xtb
index f7b1cc6..7911bb3 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_be.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_be.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">відэа</translation>
 <translation id="4764692524839457597">стандартна</translation>
 <translation id="4772771694153161212">Не падкрэслены</translation>
+<translation id="4784215347943747396">Кіраванне прыладай з дапамогай аднаго-двух пераключальнікаў</translation>
 <translation id="4786285211967466855">Няма папярэдняга загалоўка ўзроўню 1</translation>
 <translation id="4787577491510559358">Агучыць фармаціраванне бягучага элемента</translation>
 <translation id="479989351350248267">пошук</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bg.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bg.xtb
index f27d38e..6eb11aaf 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bg.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">видео</translation>
 <translation id="4764692524839457597">по подразбиране</translation>
 <translation id="4772771694153161212">Неподчертан текст</translation>
+<translation id="4784215347943747396">Управлявайте устройството само с 1 или 2 превключвателя</translation>
 <translation id="4786285211967466855">Няма предишно заглавие от първо ниво</translation>
 <translation id="4787577491510559358">Съобщаване на форматирането за текущия елемент</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_cs.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_cs.xtb
index 0efda81..2421cb4 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_cs.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">výchozí</translation>
 <translation id="4772771694153161212">Bez podtržení</translation>
+<translation id="4784215347943747396">Ovládejte zařízení jen jedním nebo dvěma přepínači</translation>
 <translation id="4786285211967466855">Žádný předchozí nadpis 1. úrovně není</translation>
 <translation id="4787577491510559358">Oznamovat formátování aktuální položky</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_da.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_da.xtb
index 44bd67c1..f6fa8f1 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_da.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">standard</translation>
 <translation id="4772771694153161212">Ikke understregning</translation>
+<translation id="4784215347943747396">Styr enheden med blot én eller to kontakter</translation>
 <translation id="4786285211967466855">Der er ingen forrige niveau 1-overskrifter</translation>
 <translation id="4787577491510559358">Oplæs formatering for aktuelt element</translation>
 <translation id="479989351350248267">søg</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb
index 69a84b4..a4b4e73 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">Video</translation>
 <translation id="4764692524839457597">Standard</translation>
 <translation id="4772771694153161212">Nicht unterstrichen</translation>
+<translation id="4784215347943747396">Das Gerät lässt sich über einen oder zwei Schalter steuern</translation>
 <translation id="4786285211967466855">Keine vorherige Überschrift der Ebene 1</translation>
 <translation id="4787577491510559358">Formatierung für aktuelles Element ansagen</translation>
 <translation id="479989351350248267">Suchen</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_es-419.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_es-419.xtb
index f930960..e0df25e 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_es-419.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_es-419.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">predeterminado</translation>
 <translation id="4772771694153161212">Sin subrayado</translation>
+<translation id="4784215347943747396">Controla el dispositivo con solo 1 o 2 interruptores</translation>
 <translation id="4786285211967466855">No hay encabezados de nivel 1 anteriores</translation>
 <translation id="4787577491510559358">Anuncia el formato del elemento actual</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_eu.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_eu.xtb
index 983a117..1d985eb 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_eu.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_eu.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">lehenetsia</translation>
 <translation id="4772771694153161212">Ez dago azpimarratuta</translation>
+<translation id="4784215347943747396">Etengailu bat edo bi erabilita kontrolatu ahal izango duzu gailua</translation>
 <translation id="4786285211967466855">Ez dago lehenengo mailako beste goibururik honen aurretik</translation>
 <translation id="4787577491510559358">Iragarri uneko elementuaren formatua</translation>
 <translation id="479989351350248267">bilaketa</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb
index 5c7a0b0..e8292106 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb
@@ -112,7 +112,7 @@
 <translation id="1829244130665387512">یافتن در صفحه</translation>
 <translation id="1834891354138622109">ستون</translation>
 <translation id="1845944666972354496">برای فعال کردن دو ضربه سریع بزنید</translation>
-<translation id="1846771122725914429">صفحه‌نمایش بریل بلوتوث</translation>
+<translation id="1846771122725914429">نمایشگر بریل بلوتوث</translation>
 <translation id="1865601187525349519">پایان نوشتار</translation>
 <translation id="1876229593313240038">doc</translation>
 <translation id="1902396333223336119">سلول</translation>
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">ویدئو</translation>
 <translation id="4764692524839457597">پیش‌فرض</translation>
 <translation id="4772771694153161212">زیرخط نیست</translation>
+<translation id="4784215347943747396">کنترل دستگاه تنها با ۱ یا ۲ کلید</translation>
 <translation id="4786285211967466855">عنوان سطح ۱ قبلی وجود ندارد</translation>
 <translation id="4787577491510559358">اعلام قالب‌بندی برای مورد کنونی</translation>
 <translation id="479989351350248267">جستجو</translation>
@@ -501,7 +502,7 @@
 <translation id="4997282455736854877"><ph name="NAME" />، دکمه رادیویی انتخاب شد</translation>
 <translation id="5011664330025416377">‏«Search+Space» (جستجو+فاصله) را برای فعال کردن فشار دهید</translation>
 <translation id="5020651427400641814">فعال کردن گزارش‌گیری از گفتار</translation>
-<translation id="5041394372352067729">انتقال صفحه‌نمایش بریل به بالای صفحه</translation>
+<translation id="5041394372352067729">انتقال نمایشگر بریل به بالای صفحه</translation>
 <translation id="5042770794184672516">افزایش میزان صدای گفتار</translation>
 <translation id="5042992464904238023">محتوای وب</translation>
 <translation id="5050015258024679800">عنوان قبلی سطح ۴</translation>
@@ -676,7 +677,7 @@
 <translation id="6475604559827479857">رنگ برای برجسته کردن کلمه‌:</translation>
 <translation id="6493991254603208962">کم کردن روشنایی</translation>
 <translation id="6501595918865591267">فیروزه‌ای</translation>
-<translation id="6508059270146105198">انتقال صفحه‌نمایش بریل به پایین صفحه</translation>
+<translation id="6508059270146105198">انتقال نمایشگر بریل به پایین صفحه</translation>
 <translation id="6521550811716689390">بنفش تیره</translation>
 <translation id="6536157907112457272">کتانی</translation>
 <translation id="6540201937398578274">‏در ChromeVox، کلید «جستجو» (Search) کلید تغییردهنده است. اکثر میان‌برهای ChromeVox با کلید «جستجو» شروع می‌شوند. از کلیدهای پیکان نیز برای پیمایش استفاده می‌کنید.</translation>
@@ -785,7 +786,7 @@
 <translation id="7400575256015741911">غلط املایی شناسایی شد</translation>
 <translation id="7408482676469142474">tbl</translation>
 <translation id="7425395583360211003">بازگشت</translation>
-<translation id="7429415133937917139">‏خروجی صفحه‌نمایش بریل قابل‌بازخوانی را در
+<translation id="7429415133937917139">‏خروجی نمایشگر بریل قابل‌بازخوانی را در
     پانل ChromeVox در بالای صفحه شبیه‌سازی می‌کند</translation>
 <translation id="7434509671034404296">برنامه‌نویس</translation>
 <translation id="743783356331413498">مثال</translation>
@@ -991,7 +992,7 @@
 <translation id="93384979447910801">سبز دریایی تیره</translation>
 <translation id="948171205378458592">کاهش سرعت گفتار</translation>
 <translation id="962913030769097253">عنوان بعدی سطح ۱</translation>
-<translation id="966588271015727539">صفحه‌نمایش بریل انتخاب کنید</translation>
+<translation id="966588271015727539">نمایشگر بریل انتخاب کنید</translation>
 <translation id="973955474346881951">فعال/غیرفعال کردن حالت چسبنده</translation>
 <translation id="985654871861528815">یک خط پایین بروید</translation>
 <translation id="992256792861109788">صورتی</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fi.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fi.xtb
index 83dbec0..d6f4bd0 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fi.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">oletus</translation>
 <translation id="4772771694153161212">Ei alleviivausta</translation>
+<translation id="4784215347943747396">Ohjaa laitetta vain 1–2 kytkimellä</translation>
 <translation id="4786285211967466855">Ei edellisiä tason 1 otsikoita</translation>
 <translation id="4787577491510559358">Sano nykyisen kohteen muotoilu</translation>
 <translation id="479989351350248267">haku</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fil.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fil.xtb
index 5ae737c..8bbfc312 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fil.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">default</translation>
 <translation id="4772771694153161212">Hindi nakasalungguhit</translation>
+<translation id="4784215347943747396">Kontrolin ang device sa pamamagitan lang ng 1 o 2 switch</translation>
 <translation id="4786285211967466855">Walang nakaraang heading sa antas 1</translation>
 <translation id="4787577491510559358">Ianunsyo ang pag-format para sa kasalukuyang item</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb
index 169a743f..97cd57d 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">Vidéo</translation>
 <translation id="4764692524839457597">par défaut</translation>
 <translation id="4772771694153161212">Pas souligné</translation>
+<translation id="4784215347943747396">Pour commander l'appareil avec juste un ou deux commutateurs</translation>
 <translation id="4786285211967466855">Aucun en-tête de niveau 1 précédent</translation>
 <translation id="4787577491510559358">Annoncer le formatage pour l'élément actuel</translation>
 <translation id="479989351350248267">chercher</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr.xtb
index 35175363..3790cb2 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">vidéo</translation>
 <translation id="4764692524839457597">par défaut</translation>
 <translation id="4772771694153161212">Non souligné</translation>
+<translation id="4784215347943747396">Contrôler l'appareil avec seulement un ou deux contacteurs</translation>
 <translation id="4786285211967466855">Aucun titre de niveau 1 précédent</translation>
 <translation id="4787577491510559358">Annoncer la mise en forme de l'élément actuel</translation>
 <translation id="479989351350248267">rechercher</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
index 09f26b96..7b4bc20 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_gl.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">vídeo</translation>
 <translation id="4764692524839457597">predeterminado</translation>
 <translation id="4772771694153161212">Texto sen subliñado</translation>
+<translation id="4784215347943747396">Controla o dispositivo con só 1 ou 2 interruptores</translation>
 <translation id="4786285211967466855">Non hai ningunha cabeceira anterior de nivel 1</translation>
 <translation id="4787577491510559358">Anuncia o formato do elemento actual</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hi.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hi.xtb
index f131e6271..926e39d 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hi.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">वीडियो</translation>
 <translation id="4764692524839457597">डिफ़ॉल्ट</translation>
 <translation id="4772771694153161212">अंडरलाइन नहीं है</translation>
+<translation id="4784215347943747396">सिर्फ़ एक या दो स्विच से डिवाइस कंट्रोल करें</translation>
 <translation id="4786285211967466855">पहले से कोई लेवल 2 शीर्षक नहीं है</translation>
 <translation id="4787577491510559358">मौजूदा आइटम का फ़ॉर्मैट बताएं</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb
index 75c9baf..55b73b2 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hy.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">կանխադրված</translation>
 <translation id="4772771694153161212">Ընդգծումն անջատված է</translation>
+<translation id="4784215347943747396">Կառավարեք սարքն ընդամենը 1 կամ 2 փոխանջատիչի օգնությամբ</translation>
 <translation id="4786285211967466855">1-ին մակարդակի նախորդ վերնագիր չկա</translation>
 <translation id="4787577491510559358">Հնչեցնել ընթացիկ տարրի ձևաչափը</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_id.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_id.xtb
index fb8ba69..190451e 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_id.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">default</translation>
 <translation id="4772771694153161212">Tidak garis bawah</translation>
+<translation id="4784215347943747396">Kontrol perangkat hanya dengan satu atau dua tombol</translation>
 <translation id="4786285211967466855">Tidak ada judul level 1 sebelumnya</translation>
 <translation id="4787577491510559358">Ucapkan format item saat ini</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ja.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ja.xtb
index 70cf36cb..8933c9dc 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ja.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ja.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">動画</translation>
 <translation id="4764692524839457597">デフォルト</translation>
 <translation id="4772771694153161212">下線オフ</translation>
+<translation id="4784215347943747396">1~2 個のスイッチだけでデバイスを制御します</translation>
 <translation id="4786285211967466855">前のレベル 1 の見出しはありません</translation>
 <translation id="4787577491510559358">現在のアイテムの書式設定を読み上げる</translation>
 <translation id="479989351350248267">検索</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ka.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ka.xtb
index fffa1d0..95153d6 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ka.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ka.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">ვიდეო</translation>
 <translation id="4764692524839457597">ნაგულისხმევი</translation>
 <translation id="4772771694153161212">ხაზგაუსმელი</translation>
+<translation id="4784215347943747396">მართეთ მოწყობილობა 1 ან 2 გადამრთველით</translation>
 <translation id="4786285211967466855">წინა 1-ლი დონის სათაური არ არის</translation>
 <translation id="4787577491510559358">მიმდინარე ერთეულის ფორმატირების გამოცხადება</translation>
 <translation id="479989351350248267">ძიება</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb
index 78423a9..2c65b44 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">бейне</translation>
 <translation id="4764692524839457597">әдепкі</translation>
 <translation id="4772771694153161212">Асты сызылмаған</translation>
+<translation id="4784215347943747396">Құрылғыны 1 не 2 ауыстырғышпен басқарыңыз.</translation>
 <translation id="4786285211967466855">Алдыңғы 1-деңгей тақырыбы жоқ.</translation>
 <translation id="4787577491510559358">Ағымдағы элементті форматтауды жариялау</translation>
 <translation id="479989351350248267">іздеу</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_km.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_km.xtb
index 72d8d4e..60cd31e 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_km.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_km.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">វីដេអូ</translation>
 <translation id="4764692524839457597">លំនាំដើម</translation>
 <translation id="4772771694153161212">មិន​គូស​បន្ទាត់ពី​ក្រោម</translation>
+<translation id="4784215347943747396">គ្រប់គ្រង​ឧបករណ៍​ដោយប្រើ​ប៊ូតុងបិទបើក 1 ឬ 2 ប៉ុណ្ណោះ</translation>
 <translation id="4786285211967466855">គ្មានផ្នែកក្បាលកម្រិតទី 1 មុនទេ</translation>
 <translation id="4787577491510559358">ប្រកាស​ទម្រង់​សម្រាប់​ធាតុ​បច្ចុប្បន្ន</translation>
 <translation id="479989351350248267">ស្វែងរក</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ko.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ko.xtb
index 68a92de2..1f40439b 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ko.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">동영상</translation>
 <translation id="4764692524839457597">기본값</translation>
 <translation id="4772771694153161212">밑줄 아님</translation>
+<translation id="4784215347943747396">스위치 1~2개로 기기를 제어합니다.</translation>
 <translation id="4786285211967466855">이전 수준 1 제목이 없습니다</translation>
 <translation id="4787577491510559358">현재 항목의 서식을 음성으로 안내합니다.</translation>
 <translation id="479989351350248267">검색</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb
index 2dbce95..8c9bb31 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">видео</translation>
 <translation id="4764692524839457597">демейки</translation>
 <translation id="4772771694153161212">Асты сызылган тамгалар эмес</translation>
+<translation id="4784215347943747396">Түзмөктү 1 же 2 которуштургуч менен башкаруу</translation>
 <translation id="4786285211967466855">Мурунку 1-деңгээлдин башкы аталышы жок</translation>
 <translation id="4787577491510559358">Учурдагы нерсе үчүн форматтоону жарыялоо</translation>
 <translation id="479989351350248267">издөө</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lo.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lo.xtb
index 6371a4f..685f902 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lo.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lo.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">ວິ​ດີ​ໂອ</translation>
 <translation id="4764692524839457597">ຄ່າເລີ່ມຕົ້ນ</translation>
 <translation id="4772771694153161212">ບໍ່ແມ່ນຂີດກ້ອງ</translation>
+<translation id="4784215347943747396">ຄວບຄຸມອຸປະກອນດ້ວຍ 1 ຫຼື 2 ປຸ່ມເທົ່ານັ້ນ</translation>
 <translation id="4786285211967466855">ບໍ່ມີຫົວຂໍ້ລະດັບ 1 ກ່ອນໜ້າ</translation>
 <translation id="4787577491510559358">ປະກາດການຈັດຮູບແບບສຳລັບລາຍການປັດຈຸບັນ</translation>
 <translation id="479989351350248267">ຄົ້ນ​ຫາ</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lv.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lv.xtb
index 509aeaf..ac28006 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_lv.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">noklusējums</translation>
 <translation id="4772771694153161212">Nav pasvītrojuma</translation>
+<translation id="4784215347943747396">Kontrolējiet ierīci, izmantojot tikai 1–2 slēdžus.</translation>
 <translation id="4786285211967466855">Nav iepriekšējā 1. līmeņa virsraksta.</translation>
 <translation id="4787577491510559358">Paziņot pašreizējā vienuma formatējumu</translation>
 <translation id="479989351350248267">meklēt</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mn.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mn.xtb
index 0195e77..59aec92 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mn.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_mn.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">видео</translation>
 <translation id="4764692524839457597">өгөгдмөл</translation>
 <translation id="4772771694153161212">Доогуур нь зураагүй байна</translation>
+<translation id="4784215347943747396">Төхөөрөмжийг зөвхөн 1 эсвэл 2 сэлгэлтээр хянах</translation>
 <translation id="4786285211967466855">Өмнөх 1-р түвшний гарчиг алга байна</translation>
 <translation id="4787577491510559358">Одоо байгаа зүйлийн форматчлалыг зарлах</translation>
 <translation id="479989351350248267">хайлт</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ms.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ms.xtb
index 33feb8bd..80fc8ae 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ms.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">lalai</translation>
 <translation id="4772771694153161212">Tidak bergaris bawah</translation>
+<translation id="4784215347943747396">Kawal peranti dengan hanya 1 atau 2 suis</translation>
 <translation id="4786285211967466855">Tiada tajuk tahap 1 sebelumnya</translation>
 <translation id="4787577491510559358">Umumkan pemformatan untuk item semasa</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_my.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_my.xtb
index 93f7e93..7ffe76de 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_my.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_my.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">ဗီဒီယို</translation>
 <translation id="4764692524839457597">မူရင်း</translation>
 <translation id="4772771694153161212">အောက်မျဉ်းသားမထားပါ</translation>
+<translation id="4784215347943747396">စက်ပစ္စည်းကို ခလုတ် ၁ ခု သို့မဟုတ် ၂ ခုဖြင့်သာ ထိန်းချုပ်ခြင်း</translation>
 <translation id="4786285211967466855">ယခင် အဆင့် ၁ ခေါင်းစီး မရှိပါ</translation>
 <translation id="4787577491510559358">လက်ရှိအရာအတွက် ဖော်မက်ကို ကြေညာရန်</translation>
 <translation id="479989351350248267">ရှာဖွေမှု</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
index 9edef64..434a718 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-PT.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">vídeo</translation>
 <translation id="4764692524839457597">predefinição</translation>
 <translation id="4772771694153161212">Sem sublinhado</translation>
+<translation id="4784215347943747396">Controle o dispositivo com apenas 1 ou 2 comutadores.</translation>
 <translation id="4786285211967466855">Não existe nenhum cabeçalho de nível 1 anterior.</translation>
 <translation id="4787577491510559358">Anunciar a formatação para o item atual</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ro.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ro.xtb
index b8a5bca..56375721 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ro.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">prestabilit</translation>
 <translation id="4772771694153161212">Fără subliniere</translation>
+<translation id="4784215347943747396">Controlează dispozitivul doar cu unul sau două comutatoare</translation>
 <translation id="4786285211967466855">Nu există un titlu de nivel 1 anterior</translation>
 <translation id="4787577491510559358">Anunță formatarea pentru elementul actual</translation>
 <translation id="479989351350248267">căutați</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ru.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ru.xtb
index 8953b5c..19c1cb0 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ru.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">видео</translation>
 <translation id="4764692524839457597">по умолчанию</translation>
 <translation id="4772771694153161212">Не подчеркнутый</translation>
+<translation id="4784215347943747396">Возможность управлять устройством с помощью одного или двух переключателей</translation>
 <translation id="4786285211967466855">Предыдущего заголовка первого уровня нет</translation>
 <translation id="4787577491510559358">Озвучить форматирование текущего объекта</translation>
 <translation id="479989351350248267">поиск</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb
index dd15c69..da09f77 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">predvolené</translation>
 <translation id="4772771694153161212">Text nie je podčiarknutý</translation>
+<translation id="4784215347943747396">Ovládajte zariadenie iba jedným alebo dvoma prepínačmi</translation>
 <translation id="4786285211967466855">Žiadny predchádzajúci nadpis prvej úrovne</translation>
 <translation id="4787577491510559358">Oznamovať formátovanie aktuálnej položky</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sq.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sq.xtb
index 8dc5afb..b26ae9e 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sq.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sq.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">e parazgjedhur</translation>
 <translation id="4772771694153161212">Jo i nënvizuar</translation>
+<translation id="4784215347943747396">Komandoje pajisjen me thjesht 1 ose 2 çelësa</translation>
 <translation id="4786285211967466855">Nuk ka titull të mëparshëm të nivelit 1</translation>
 <translation id="4787577491510559358">Njofto për formatimin për artikullin aktual</translation>
 <translation id="479989351350248267">kërko</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sv.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sv.xtb
index 6782260..f87b867 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sv.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">standard</translation>
 <translation id="4772771694153161212">Inte understruken</translation>
+<translation id="4784215347943747396">Styr enheten med bara en eller två brytare</translation>
 <translation id="4786285211967466855">Det finns ingen föregående rubrik på nivå 1</translation>
 <translation id="4787577491510559358">Läs upp formatering för det aktuella objektet</translation>
 <translation id="479989351350248267">sök</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_th.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_th.xtb
index 5e8f543..7ab0ac23 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_th.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">วิดีโอ</translation>
 <translation id="4764692524839457597">ค่าเริ่มต้น</translation>
 <translation id="4772771694153161212">ไม่ขีดเส้นใต้</translation>
+<translation id="4784215347943747396">ควบคุมอุปกรณ์ด้วยสวิตช์เพียง 1 หรือ 2 ปุ่ม</translation>
 <translation id="4786285211967466855">ไม่มีส่วนหัวระดับ 1 ก่อนหน้า</translation>
 <translation id="4787577491510559358">ประกาศการจัดรูปแบบของรายการปัจจุบัน</translation>
 <translation id="479989351350248267">ค้นหา</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
index ef3de909..3b1e9a1 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">varsayılan</translation>
 <translation id="4772771694153161212">Altı çizili değil</translation>
+<translation id="4784215347943747396">Cihazı yalnızca 1 veya 2 anahtarla kontrol edin</translation>
 <translation id="4786285211967466855">Önceki 1. düzey başlık yok</translation>
 <translation id="4787577491510559358">Mevcut öğenin biçimini söyler</translation>
 <translation id="479989351350248267">ara</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uk.xtb
index fbc61f8..70ca102a 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uk.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">відео</translation>
 <translation id="4764692524839457597">за умовчанням</translation>
 <translation id="4772771694153161212">Без підкреслення</translation>
+<translation id="4784215347943747396">Керувати пристроєм за допомогою 1 або 2 перемикачів</translation>
 <translation id="4786285211967466855">Немає попереднього заголовка рівня 1</translation>
 <translation id="4787577491510559358">Озвучувати формат поточного елемента</translation>
 <translation id="479989351350248267">пошук</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ur.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ur.xtb
index 6ec8206..9741909 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ur.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ur.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">ویڈیو</translation>
 <translation id="4764692524839457597">ڈیفالٹ</translation>
 <translation id="4772771694153161212">خط کشیدہ نہیں ہے</translation>
+<translation id="4784215347943747396">صرف 1 یا 2 سوئچز کی مدد سے آلے کو کنٹرول کریں</translation>
 <translation id="4786285211967466855">سطح 1 کی کوئی پچھلی ہیڈنگ نہیں ہے</translation>
 <translation id="4787577491510559358">موجودہ آئٹم کیلئے فارمیٹنگ پڑھیں</translation>
 <translation id="479989351350248267">تلاش کریں</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
index e95b120bf..f6ec0eb 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
@@ -462,6 +462,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">birlamchi</translation>
 <translation id="4772771694153161212">Tagiga chizilmagan</translation>
+<translation id="4784215347943747396">1 yoki 2 almashtirish bilan qurilmani boshqarish imkoniyati</translation>
 <translation id="4786285211967466855">Bundan oldin boshqa 4-darajali sarlavha mavjud emas</translation>
 <translation id="4787577491510559358">Joriy element formati aytilsin</translation>
 <translation id="479989351350248267">qidiruv</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb
index 62454cb..ffd97e5 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">mặc định</translation>
 <translation id="4772771694153161212">Không gạch chân</translation>
+<translation id="4784215347943747396">Điều khiển thiết bị chỉ bằng 1 hoặc 2 công tắc</translation>
 <translation id="4786285211967466855">Không có tiêu đề cấp 1 nào trước đó</translation>
 <translation id="4787577491510559358">Cho biết định dạng của mục hiện có</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb
index e3bce3d..0757b57 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">视频</translation>
 <translation id="4764692524839457597">默认</translation>
 <translation id="4772771694153161212">不带下划线</translation>
+<translation id="4784215347943747396">只需 1 个或 2 个开关即可控制设备</translation>
 <translation id="4786285211967466855">没有上一个 1 级标题</translation>
 <translation id="4787577491510559358">播报当前项的格式</translation>
 <translation id="479989351350248267">搜索</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-HK.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-HK.xtb
index 78b93a8b..27bfebb 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-HK.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-HK.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">影片</translation>
 <translation id="4764692524839457597">預設</translation>
 <translation id="4772771694153161212">冇加底線嘅文字</translation>
+<translation id="4784215347943747396">使用 1 或 2 種開關設定就能控制裝置</translation>
 <translation id="4786285211967466855">冇上一個第 1 級標題</translation>
 <translation id="4787577491510559358">讀出目前項目的格式</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-TW.xtb
index 5c1b9fa..988931c9 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-TW.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-TW.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">影片</translation>
 <translation id="4764692524839457597">預設</translation>
 <translation id="4772771694153161212">沒有加上底線的文字</translation>
+<translation id="4784215347943747396">只須 1 或 2 種切換方式即可操控裝置</translation>
 <translation id="4786285211967466855">沒有上一個第 1 階標題</translation>
 <translation id="4787577491510559358">朗讀目前項目的格式</translation>
 <translation id="479989351350248267">search</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zu.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zu.xtb
index db84b06..6afc733 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zu.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zu.xtb
@@ -463,6 +463,7 @@
 <translation id="4763480195061959176">ividiyo</translation>
 <translation id="4764692524839457597">okuzenzakalelayo</translation>
 <translation id="4772771694153161212">Akukho ukudwebela</translation>
+<translation id="4784215347943747396">Lawula idivayisi ngokushintsha nje okungu-1 noma okungu-2.</translation>
 <translation id="4786285211967466855">Asikho isihloko esedlule seleveli engu-1</translation>
 <translation id="4787577491510559358">Memezela ukufometha kwento yamanje</translation>
 <translation id="479989351350248267">sesha</translation>
diff --git a/chrome/browser/resources/media/media_data_table.js b/chrome/browser/resources/media/media_data_table.js
index 8efaad5..758ace6 100644
--- a/chrome/browser/resources/media/media_data_table.js
+++ b/chrome/browser/resources/media/media_data_table.js
@@ -80,7 +80,7 @@
             key = k;
           });
 
-          this.delegate_.insertDataField(td, data, key);
+          this.delegate_.insertDataField(td, data, key, dataRow);
           tr.appendChild(td);
         });
       });
@@ -103,8 +103,10 @@
      * @param {Element} td
      * @param {?Object} data
      * @param {string} key
+     * @param {Object} dataRow This is the row itself in case we need extra
+     *   data to render the field.
      */
-    insertDataField(td, data, key) {}
+    insertDataField(td, data, key, dataRow) {}
 
     /**
      * Compares two objects based on |sortKey|.
diff --git a/chrome/browser/resources/media/media_feeds.html b/chrome/browser/resources/media/media_feeds.html
index 3f848c5..1083adcf 100644
--- a/chrome/browser/resources/media/media_feeds.html
+++ b/chrome/browser/resources/media/media_feeds.html
@@ -124,6 +124,8 @@
         </th>
         <th data-key="logos">
           Logos
+        <th data-key="actions">
+          Actions
         </th>
       </tr>
     </thead>
@@ -131,22 +133,71 @@
     </tbody>
   </table>
 
-  <template id="datarow">
-    <tr>
-      <td class="id-cell"></td>
-      <td class="url-cell"></td>
-      <td></td>
-      <td class="last-discovery-time-cell"></td>
-      <td></td>
-      <td></td>
-      <td></td>
-      <td></td>
-      <td></td>
-      <td></td>
-      <td></td>
-      <td></td>
-      <td></td>
-    </tr>
-  </template>
+  <div id="feed-content" style="display:none;">
+    <hr>
+    <h2>Feed Contents: <span id="current-feed"></span></h2>
+    <table id="feed-items-table">
+      <thead>
+        <tr>
+          <th sort-key="type" class="sort-column" sort-reverse>
+            Type
+          </th>
+          <th sort-key="name">
+            Name
+          </th>
+          <th sort-key="author">
+            Author
+          </th>
+          <th sort-key="datePublished">
+            Date Published
+          </th>
+          <th sort-key="isFamilyFriendly">
+            Family Friendly
+          </th>
+          <th sort-key="actionStatus">
+            Action Status
+          </th>
+          <th sort-key="action.url">
+            Action URL
+          </th>
+          <th sort-key="action.startTime">
+            Action Start Time (secs)
+          </th>
+          <th sort-key="interactionCounters">
+            Interaction Counters
+          </th>
+          <th sort-key="contentRatings">
+            Content Ratings
+          </th>
+          <th sort-key="genre">
+            Genre
+          </th>
+          <th sort-key="live">
+            Live Details
+          </th>
+          <th sort-key="tvEpisode">
+            TV Episode
+          </th>
+          <th sort-key="playNextCandidate">
+            Play Next Candidate
+          </th>
+          <th sort-key="identifiers">
+            Identifiers
+          </th>
+          <th sort-key="shownCount">
+            Shown Count
+          </th>
+          <th sort-key="clicked">
+            Clicked
+          </th>
+          <th sort-key="images">
+            Images
+          </th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+  </div>
 </body>
 </html>
diff --git a/chrome/browser/resources/media/media_feeds.js b/chrome/browser/resources/media/media_feeds.js
index 13830a4..cb517fb 100644
--- a/chrome/browser/resources/media/media_feeds.js
+++ b/chrome/browser/resources/media/media_feeds.js
@@ -11,10 +11,16 @@
   return mediaFeedsPageIsPopulatedResolver.promise;
 }
 
+const mediaFeedItemsPageIsPopulatedResolver = new PromiseResolver();
+function whenFeedTableIsPopulatedForTest() {
+  return mediaFeedItemsPageIsPopulatedResolver.promise;
+}
+
 (function() {
 
 let delegate = null;
 let feedsTable = null;
+let feedItemsTable = null;
 let store = null;
 
 /** @implements {cr.ui.MediaDataTableDelegate} */
@@ -25,8 +31,28 @@
    * @param {Element} td
    * @param {?Object} data
    * @param {string} key
+   * @param {Object} dataRow
    */
-  insertDataField(td, data, key) {
+  insertDataField(td, data, key, dataRow) {
+    if (key == 'actions') {
+      const a = document.createElement('a');
+      a.href = '#feed-content';
+      a.textContent = 'Show Contents';
+      td.appendChild(a);
+
+      a.addEventListener('click', () => {
+        store.getItemsForMediaFeed(dataRow.id).then(response => {
+          feedItemsTable.setData(response.items);
+
+          // Show the feed items section.
+          $('current-feed').textContent = dataRow.url.url;
+          $('feed-content').style.display = 'block';
+
+          mediaFeedItemsPageIsPopulatedResolver.resolve();
+        });
+      });
+    }
+
     if (data === undefined || data === null) {
       return;
     }
@@ -36,11 +62,11 @@
       td.textContent = data.url;
     } else if (
         key === 'lastDiscoveryTime' || key === 'lastFetchTime' ||
-        key === 'cacheExpiryTime') {
+        key === 'cacheExpiryTime' || key === 'datePublished') {
       // Format a mojo time.
       td.textContent =
           convertMojoTimeToJS(/** @type {mojoBase.mojom.Time} */ (data))
-              .toString();
+              .toLocaleString();
     } else if (key === 'userStatus') {
       // Format a FeedUserStatus.
       if (data == mediaFeeds.mojom.FeedUserStatus.kAuto) {
@@ -74,7 +100,7 @@
 
       td.textContent =
           contentTypes.length === 0 ? 'None' : contentTypes.join(',');
-    } else if (key === 'logos') {
+    } else if (key === 'logos' || key === 'images') {
       // Format an array of mojo media images.
       data.forEach((image) => {
         const a = document.createElement('a');
@@ -84,6 +110,129 @@
         td.appendChild(a);
         td.appendChild(document.createElement('br'));
       });
+    } else if (key == 'type') {
+      // Format a MediaFeedItemType.
+      switch (parseInt(data, 10)) {
+        case mediaFeeds.mojom.MediaFeedItemType.kVideo:
+          td.textContent = 'Video';
+          break;
+        case mediaFeeds.mojom.MediaFeedItemType.kTVSeries:
+          td.textContent = 'TV Series';
+          break;
+        case mediaFeeds.mojom.MediaFeedItemType.kMovie:
+          td.textContent = 'Movie';
+          break;
+      }
+    } else if (key == 'isFamilyFriendly' || key == 'clicked') {
+      // Format a boolean.
+      td.textContent = data ? 'Yes' : 'No';
+    } else if (key == 'actionStatus') {
+      // Format a MediaFeedItemActionStatus.
+      switch (parseInt(data, 10)) {
+        case mediaFeeds.mojom.MediaFeedItemActionStatus.kUnknown:
+          td.textContent = 'Unknown';
+          break;
+        case mediaFeeds.mojom.MediaFeedItemActionStatus.kActive:
+          td.textContent = 'Active';
+          break;
+        case mediaFeeds.mojom.MediaFeedItemActionStatus.kPotential:
+          td.textContent = 'Potential';
+          break;
+        case mediaFeeds.mojom.MediaFeedItemActionStatus.kCompleted:
+          td.textContent = 'Completed';
+          break;
+      }
+    } else if (key == 'startTime') {
+      // Format a start time.
+      td.textContent =
+          timeDeltaToSeconds(/** @type {mojoBase.mojom.TimeDelta} */ (data));
+    } else if (key == 'interactionCounters') {
+      // Format interaction counters.
+      const counters = [];
+
+      Object.keys(data).forEach((key) => {
+        let keyString = '';
+
+        switch (parseInt(key, 10)) {
+          case mediaFeeds.mojom.InteractionCounterType.kWatch:
+            keyString = 'Watch';
+            break;
+          case mediaFeeds.mojom.InteractionCounterType.kLike:
+            keyString = 'Like';
+            break;
+          case mediaFeeds.mojom.InteractionCounterType.kDislike:
+            keyString = 'Dislike';
+            break;
+        }
+
+        counters.push(keyString + '=' + data[key]);
+      });
+
+      td.textContent = counters.join(' ');
+    } else if (key == 'contentRatings') {
+      // Format content ratings.
+      const ratings = [];
+
+      data.forEach((rating) => {
+        ratings.push(rating.agency + ' ' + rating.value);
+      });
+
+      td.textContent = ratings.join(', ');
+    } else if (key == 'author') {
+      // Format a mojom author.
+      const a = document.createElement('a');
+      a.href = data.url;
+      a.textContent = data.name;
+      a.target = '_blank';
+      td.appendChild(a);
+    } else if (key == 'name' || key == 'genre') {
+      // Format a mojo string16.
+      td.textContent =
+          decodeString16(/** @type {mojoBase.mojom.String16} */ (data));
+    } else if (key == 'live') {
+      // Format LiveDetails.
+      td.textContent = 'Live';
+
+      if (data.startTime) {
+        td.textContent += ' ' +
+            'StartTime=' +
+            convertMojoTimeToJS(
+                /** @type {mojoBase.mojom.Time} */ (data.startTime))
+                .toLocaleString();
+      }
+
+      if (data.endTime) {
+        td.textContent += ' ' +
+            'EndTime=' +
+            convertMojoTimeToJS(
+                /** @type {mojoBase.mojom.Time} */ (data.endTime))
+                .toLocaleString();
+      }
+    } else if (key == 'tvEpisode') {
+      // Format a TV Episode.
+      td.textContent = data.name + ' EpisodeNumber=' + data.episodeNumber +
+          ' SeasonNumber=' + data.seasonNumber + ' ' +
+          formatIdentifiers(/** @type {Array<mediaFeeds.mojom.Identifier>} */ (
+              data.identifiers));
+    } else if (key == 'playNextCandidate') {
+      // Format a Play Next Candidate.
+      td.textContent = data.name + ' EpisodeNumber=' + data.episodeNumber +
+          ' SeasonNumber=' + data.seasonNumber + ' ' +
+          formatIdentifiers(
+                           /** @type {Array<mediaFeeds.mojom.Identifier>} */ (
+                               data.identifiers)) +
+          ' ActionURL=' + data.action.url.url;
+
+      if (data.action.startTime) {
+        td.textContent +=
+            ' ActionStartTimeSecs=' + timeDeltaToSeconds(data.action.startTime);
+      }
+
+      td.textContent += ' DurationSecs=' + timeDeltaToSeconds(data.duration);
+    } else if (key == 'identifiers') {
+      // Format identifiers.
+      td.textContent = formatIdentifiers(
+          /** @type {Array<mediaFeeds.mojom.Identifier>} */ (data));
     } else {
       td.textContent = data;
     }
@@ -122,6 +271,57 @@
 }
 
 /**
+ * Convert a time delta to seconds.
+ * @param {mojoBase.mojom.TimeDelta} timeDelta
+ * @returns {number}
+ */
+function timeDeltaToSeconds(timeDelta) {
+  return timeDelta.microseconds / 1000 / 1000;
+}
+
+/**
+ * Formats an array of identifiers for display.
+ * @param {Array<mediaFeeds.mojom.Identifier>} mojoIdentifiers
+ * @returns {string}
+ */
+function formatIdentifiers(mojoIdentifiers) {
+  const identifiers = [];
+
+  mojoIdentifiers.forEach((identifier) => {
+    let keyString = '';
+
+    switch (identifier.type) {
+      case mediaFeeds.mojom.Identifier_Type.kTMSRootId:
+        keyString = 'TMSRootId';
+        break;
+      case mediaFeeds.mojom.Identifier_Type.kTMSId:
+        keyString = 'TMSId';
+        break;
+      case mediaFeeds.mojom.Identifier_Type.kPartnerId:
+        keyString = 'PartnerId';
+        break;
+    }
+
+    identifiers.push(keyString + '=' + identifier.value);
+  });
+
+  return identifiers.join(' ');
+}
+
+/**
+ * Parses utf16 coded string.
+ * @param {?mojoBase.mojom.String16} arr
+ * @return {string}
+ */
+function decodeString16(arr) {
+  if (arr == null) {
+    return '';
+  }
+
+  return arr.data.map(ch => String.fromCodePoint(ch)).join('');
+}
+
+/**
  * Converts a mojo time to a JS time.
  * @param {mojoBase.mojom.Time} mojoTime
  * @return {Date}
@@ -160,6 +360,7 @@
 
   delegate = new MediaFeedsTableDelegate();
   feedsTable = new cr.ui.MediaDataTable($('feeds-table'), delegate);
+  feedItemsTable = new cr.ui.MediaDataTable($('feed-items-table'), delegate);
 
   updateFeedsTable();
 
diff --git a/chrome/browser/resources/pdf/pdf_scripting_api.js b/chrome/browser/resources/pdf/pdf_scripting_api.js
index 365e1a331..8cae862 100644
--- a/chrome/browser/resources/pdf/pdf_scripting_api.js
+++ b/chrome/browser/resources/pdf/pdf_scripting_api.js
@@ -68,7 +68,7 @@
     this.viewportChangedCallback_;
 
     /** @private {Function} */
-    this.loadCallback_;
+    this.loadCompleteCallback_;
 
     /** @private {Function} */
     this.selectedTextCallback_;
@@ -108,8 +108,8 @@
         case 'documentLoaded': {
           const data = /** @type {{load_state: LoadState}} */ (event.data);
           this.loadState_ = data.load_state;
-          if (this.loadCallback_) {
-            this.loadCallback_(this.loadState_ === LoadState.SUCCESS);
+          if (this.loadCompleteCallback_) {
+            this.loadCompleteCallback_(this.loadState_ === LoadState.SUCCESS);
           }
           break;
         }
@@ -181,10 +181,10 @@
    *
    * @param {Function} callback the callback to be called.
    */
-  setLoadCallback(callback) {
-    this.loadCallback_ = callback;
-    if (this.loadState_ !== LoadState.LOADING && this.loadCallback_) {
-      this.loadCallback_(this.loadState_ === LoadState.SUCCESS);
+  setLoadCompleteCallback(callback) {
+    this.loadCompleteCallback_ = callback;
+    if (this.loadState_ !== LoadState.LOADING && this.loadCompleteCallback_) {
+      this.loadCompleteCallback_(this.loadState_ === LoadState.SUCCESS);
     }
   }
 
@@ -309,15 +309,15 @@
   };
 
   // Add the functions to the iframe so that they can be called directly.
+  iframe.darkModeChanged = client.darkModeChanged.bind(client);
+  iframe.hideToolbars = client.hideToolbars.bind(client);
+  iframe.loadPreviewPage = client.loadPreviewPage.bind(client);
+  iframe.resetPrintPreviewMode = client.resetPrintPreviewMode.bind(client);
+  iframe.scrollPosition = client.scrollPosition.bind(client);
+  iframe.sendKeyEvent = client.sendKeyEvent.bind(client);
+  iframe.setKeyEventCallback = client.setKeyEventCallback.bind(client);
+  iframe.setLoadCompleteCallback = client.setLoadCompleteCallback.bind(client);
   iframe.setViewportChangedCallback =
       client.setViewportChangedCallback.bind(client);
-  iframe.setLoadCallback = client.setLoadCallback.bind(client);
-  iframe.setKeyEventCallback = client.setKeyEventCallback.bind(client);
-  iframe.resetPrintPreviewMode = client.resetPrintPreviewMode.bind(client);
-  iframe.loadPreviewPage = client.loadPreviewPage.bind(client);
-  iframe.sendKeyEvent = client.sendKeyEvent.bind(client);
-  iframe.scrollPosition = client.scrollPosition.bind(client);
-  iframe.hideToolbars = client.hideToolbars.bind(client);
-  iframe.darkModeChanged = client.darkModeChanged.bind(client);
   return iframe;
 }
diff --git a/chrome/browser/resources/print_preview/ui/plugin_proxy.js b/chrome/browser/resources/print_preview/ui/plugin_proxy.js
index 5894f8e..c145fcc 100644
--- a/chrome/browser/resources/print_preview/ui/plugin_proxy.js
+++ b/chrome/browser/resources/print_preview/ui/plugin_proxy.js
@@ -6,33 +6,15 @@
 import {PDFCreateOutOfProcessPlugin} from '../pdf/pdf_scripting_api.js';
 
 /**
- * @typedef {{accessibility: Function,
- *            documentLoadComplete: Function,
- *            getHeight: Function,
- *            getHorizontalScrollbarThickness: Function,
- *            getPageLocationNormalized: Function,
- *            getVerticalScrollbarThickness: Function,
- *            getWidth: Function,
- *            getZoomLevel: Function,
- *            goToPage: Function,
- *            grayscale: Function,
+ * @typedef {{darkModeChanged: Function,
+ *            hideToolbars: Function,
  *            loadPreviewPage: Function,
- *            onload: Function,
- *            onPluginSizeChanged: Function,
- *            onScroll: Function,
- *            pageXOffset: Function,
- *            pageYOffset: Function,
- *            reload: Function,
  *            resetPrintPreviewMode: Function,
+ *            scrollPosition: Function,
  *            sendKeyEvent: Function,
- *            setPageNumbers: Function,
- *            setPageXOffset: Function,
- *            setPageYOffset: Function,
- *            setZoomLevel: Function,
- *            fitToHeight: Function,
- *            fitToWidth: Function,
- *            zoomIn: Function,
- *            zoomOut: Function}}
+ *            setKeyEventCallback: Function,
+ *            setLoadCompleteCallback: Function,
+ *            setViewportChangedCallback: Function}}
  */
 export let PDFPlugin;
 
@@ -164,9 +146,9 @@
     this.plugin_.setKeyEventCallback(keyEventCallback);
   }
 
-  /** @param {?Function} loadCallback */
-  setLoadCallback(loadCallback) {
-    this.plugin_.setLoadCallback(loadCallback);
+  /** @param {?Function} loadCompleteCallback */
+  setLoadCompleteCallback(loadCompleteCallback) {
+    this.plugin_.setLoadCompleteCallback(loadCompleteCallback);
   }
 
   /** @param {?Function} viewportChangedCallback */
diff --git a/chrome/browser/resources/print_preview/ui/preview_area.js b/chrome/browser/resources/print_preview/ui/preview_area.js
index a074457a9..e75d9bf 100644
--- a/chrome/browser/resources/print_preview/ui/preview_area.js
+++ b/chrome/browser/resources/print_preview/ui/preview_area.js
@@ -42,7 +42,6 @@
 
 /** @enum {string} */
 export const PreviewAreaState = {
-  NO_PLUGIN: 'no-plugin',
   LOADING: 'loading',
   DISPLAY_PREVIEW: 'display-preview',
   OPEN_IN_PREVIEW_LOADING: 'open-in-preview-loading',
@@ -93,8 +92,8 @@
     /** @type {!State} */
     state: Number,
 
-    /** @private {boolean} Whether the plugin is loaded */
-    pluginLoaded_: {
+    /** @private {boolean} Whether the plugin completely loaded the preview */
+    pluginLoadComplete_: {
       type: Boolean,
       value: false,
     },
@@ -109,7 +108,7 @@
     previewLoaded_: {
       type: Boolean,
       notify: true,
-      computed: 'computePreviewLoaded_(documentReady_, pluginLoaded_)',
+      computed: 'computePreviewLoaded_(documentReady_, pluginLoadComplete_)',
     },
   },
 
@@ -120,7 +119,7 @@
 
   observers: [
     'onDarkModeChanged_(inDarkMode)',
-    'pluginOrDocumentStatusChanged_(pluginLoaded_, documentReady_)',
+    'pluginOrDocumentStatusChanged_(pluginLoadComplete_, documentReady_)',
     'onStateOrErrorChange_(state, error)',
   ],
 
@@ -162,7 +161,7 @@
    * @private
    */
   computePreviewLoaded_() {
-    return this.documentReady_ && this.pluginLoaded_;
+    return this.documentReady_ && this.pluginLoadComplete_;
   },
 
   /** @return {boolean} Whether the preview is loaded. */
@@ -210,7 +209,7 @@
 
   /** @private */
   pluginOrDocumentStatusChanged_() {
-    if (!this.pluginLoaded_ || !this.documentReady_ ||
+    if (!this.pluginLoadComplete_ || !this.documentReady_ ||
         this.previewState === PreviewAreaState.ERROR) {
       return;
     }
@@ -343,14 +342,14 @@
       const plugin = this.pluginProxy_.createPlugin(previewUid, index);
       this.pluginProxy_.setKeyEventCallback(this.keyEventCallback_);
       this.$$('.preview-area-plugin-wrapper')
-          .appendChild(
-              /** @type {Node} */ (plugin));
-      this.pluginProxy_.setLoadCallback(this.onPluginLoad_.bind(this));
+          .appendChild(/** @type {Node} */ (plugin));
+      this.pluginProxy_.setLoadCompleteCallback(
+          this.onPluginLoadComplete_.bind(this));
       this.pluginProxy_.setViewportChangedCallback(
           this.onPreviewVisualStateChange_.bind(this));
     }
 
-    this.pluginLoaded_ = false;
+    this.pluginLoadComplete_ = false;
     if (this.inDarkMode) {
       this.pluginProxy_.darkModeChanged(true);
     }
@@ -361,15 +360,13 @@
   },
 
   /**
-   * Called when the plugin loads. This is a consequence of calling
-   * plugin.reload(). Certain plugin state can only be set after the plugin
-   * has loaded.
+   * Called when the plugin loads the preview completely.
    * @param {boolean} success Whether the plugin load succeeded or not.
    * @private
    */
-  onPluginLoad_(success) {
+  onPluginLoadComplete_(success) {
     if (success) {
-      this.pluginLoaded_ = true;
+      this.pluginLoadComplete_ = true;
     } else {
       this.error = Error.PREVIEW_FAILED;
       this.previewState = PreviewAreaState.ERROR;
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index 13da11d..8de3c7a 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -246,6 +246,7 @@
     "people_page:closure_compile_module",
     "prefs:closure_compile_module",
     "printing_page:closure_compile_module",
+    "privacy_page:closure_compile_module",
     "reset_page:closure_compile_module",
     "search_engines_page:closure_compile_module",
     "search_page:closure_compile_module",
diff --git a/chrome/browser/resources/settings/lazy_load.js b/chrome/browser/resources/settings/lazy_load.js
index 2233af5..1fca5c5 100644
--- a/chrome/browser/resources/settings/lazy_load.js
+++ b/chrome/browser/resources/settings/lazy_load.js
@@ -14,7 +14,7 @@
 // been migrated to Polymer 3.
 // import './privacy_page/cookies_page.m.js';
 import './privacy_page/security_keys_subpage.m.js';
-// import './privacy_page/security_page.m.js';
+import './privacy_page/security_page.m.js';
 import './site_settings/all_sites.m.js';
 import './site_settings/site_data_details_subpage.m.js';
 import './site_settings_page/site_settings_page.m.js';
diff --git a/chrome/browser/resources/settings/metrics_browser_proxy.js b/chrome/browser/resources/settings/metrics_browser_proxy.js
index 4d2b63d..a214068 100644
--- a/chrome/browser/resources/settings/metrics_browser_proxy.js
+++ b/chrome/browser/resources/settings/metrics_browser_proxy.js
@@ -35,7 +35,7 @@
   };
 
   /** @interface */
-  class MetricsBrowserProxy {
+  /* #export */ class MetricsBrowserProxy {
     /**
      * Helper function that calls recordHistogram for the
      * SettingsPage.PrivacyElementInteractions histogram
diff --git a/chrome/browser/resources/settings/privacy_page/BUILD.gn b/chrome/browser/resources/settings/privacy_page/BUILD.gn
index 2e818ad..77b0767 100644
--- a/chrome/browser/resources/settings/privacy_page/BUILD.gn
+++ b/chrome/browser/resources/settings/privacy_page/BUILD.gn
@@ -202,14 +202,17 @@
   ]
 }
 
-# TODO(crbug.com/1026426): Fix and enable.
 js_type_check("closure_compile_module") {
   is_polymer3 = true
   deps = [
-    #":passwords_leak_detection_toggle.m",
+    ":collapse_radio_button.m",
+    ":do_not_track_toggle.m",
+    ":passwords_leak_detection_toggle.m",
     ":personalization_options.m",
     ":privacy_page.m",
     ":privacy_page_browser_proxy.m",
+    ":secure_dns.m",
+    ":secure_dns_input.m",
     ":security_keys_bio_enroll_dialog.m",
     ":security_keys_browser_proxy.m",
     ":security_keys_credential_management_dialog.m",
@@ -217,15 +220,62 @@
     ":security_keys_reset_dialog.m",
     ":security_keys_set_pin_dialog.m",
     ":security_keys_subpage.m",
-
-    #":security_page.m",
+    ":security_page.m",
   ]
 }
 
+js_library("collapse_radio_button.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/collapse_radio_button.m.js" ]
+  deps = [
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button_behavior.m",
+    "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior.m",
+  ]
+  extra_deps = [ ":collapse_radio_button_module" ]
+}
+
+js_library("secure_dns.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/secure_dns.m.js" ]
+  deps = [
+    ":privacy_page_browser_proxy.m",
+    "..:i18n_setup.m",
+    "../prefs:prefs_behavior.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js:web_ui_listener_behavior.m",
+  ]
+  extra_deps = [ ":secure_dns_module" ]
+}
+
+js_library("secure_dns_input.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/secure_dns_input.m.js" ]
+  deps = [
+    ":privacy_page_browser_proxy.m",
+    "..:i18n_setup.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+  ]
+  extra_deps = [ ":secure_dns_input_module" ]
+}
+
+js_library("do_not_track_toggle.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.m.js" ]
+  deps = [
+    "..:metrics_browser_proxy.m",
+    "../controls:settings_toggle_button.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js/cr/ui:focus_without_ink.m",
+  ]
+  extra_deps = [ ":do_not_track_toggle_module" ]
+}
+
 js_library("passwords_leak_detection_toggle.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    "..:metrics_browser_proxy.m",
+    "../people_page:sync_browser_proxy.m",
+    "../prefs:prefs_behavior.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js:i18n_behavior.m",
+    "//ui/webui/resources/js:web_ui_listener_behavior.m",
   ]
   extra_deps = [ ":passwords_leak_detection_toggle_module" ]
 }
@@ -355,17 +405,30 @@
 js_library("security_page.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/privacy_page/security_page.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    ":privacy_page_browser_proxy.m",
+    "..:i18n_setup.m",
+    "..:metrics_browser_proxy.m",
+    "..:route.m",
+    "..:router.m",
+    "../people_page:sync_browser_proxy.m",
+    "../prefs:prefs_behavior.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js:assert.m",
+    "//ui/webui/resources/js/cr/ui:focus_without_ink.m",
   ]
   extra_deps = [ ":security_page_module" ]
 }
 
 group("polymer3_elements") {
   public_deps = [
+    ":collapse_radio_button_module",
+    ":do_not_track_toggle_module",
     ":modulize",
     ":passwords_leak_detection_toggle_module",
     ":personalization_options_module",
     ":privacy_page_module",
+    ":secure_dns_input_module",
+    ":secure_dns_module",
     ":security_keys_bio_enroll_dialog_module",
     ":security_keys_credential_management_dialog_module",
     ":security_keys_pin_field_module",
@@ -376,10 +439,53 @@
   ]
 }
 
+polymer_modulizer("collapse_radio_button") {
+  js_file = "collapse_radio_button.js"
+  html_file = "collapse_radio_button.html"
+  html_type = "dom-module"
+  namespace_rewrites = settings_namespace_rewrites
+  auto_imports = settings_auto_imports + [
+                   "ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.html|CrPolicyIndicatorType",
+                   "ui/webui/resources/cr_elements/cr_radio_button:cr_radio_button_behavior.html|CrRadioButtonBehavior",
+                 ]
+}
+
+polymer_modulizer("secure_dns") {
+  js_file = "secure_dns.js"
+  html_file = "secure_dns.html"
+  html_type = "dom-module"
+  namespace_rewrites = settings_namespace_rewrites
+  auto_imports = settings_auto_imports + [
+                   "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl,SecureDnsUiManagementMode,SecureDnsMode,ResolverOption,SecureDnsSetting",
+                   "ui/webui/resources/html/assert.html|assertNotReached",
+                 ]
+}
+
+polymer_modulizer("secure_dns_input") {
+  js_file = "secure_dns_input.js"
+  html_file = "secure_dns_input.html"
+  html_type = "dom-module"
+  namespace_rewrites = settings_namespace_rewrites
+  auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl" ]
+}
+
+polymer_modulizer("do_not_track_toggle") {
+  js_file = "do_not_track_toggle.js"
+  html_file = "do_not_track_toggle.html"
+  html_type = "dom-module"
+  namespace_rewrites = settings_namespace_rewrites
+  auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxyImpl" ]
+}
+
 polymer_modulizer("passwords_leak_detection_toggle") {
   js_file = "passwords_leak_detection_toggle.js"
   html_file = "passwords_leak_detection_toggle.html"
   html_type = "dom-module"
+  namespace_rewrites = settings_namespace_rewrites
+  auto_imports = settings_auto_imports + [
+                   "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncStatus,StoredAccount",
+                   "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxyImpl",
+                 ]
 }
 
 polymer_modulizer("personalization_options") {
@@ -398,12 +504,6 @@
   js_file = "privacy_page.js"
   html_file = "privacy_page.html"
   html_type = "dom-module"
-  ignore_imports = [
-    "chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html",
-    "chrome/browser/resources/settings/privacy_page/secure_dns.html",
-    "chrome/browser/resources/settings/privacy_page/security_page.html",
-    "chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.html",
-  ]
   namespace_rewrites = settings_namespace_rewrites
   auto_imports = settings_auto_imports + [
                    "ui/webui/resources/html/assert.html|assert",
@@ -484,6 +584,15 @@
   js_file = "security_page.js"
   html_file = "security_page.html"
   html_type = "dom-module"
+  namespace_rewrites = settings_namespace_rewrites
+  auto_imports = settings_auto_imports + [
+                   "ui/webui/resources/html/assert.html|assert",
+                   "chrome/browser/resources/settings/router.html|Router",
+                   "chrome/browser/resources/settings/route.html|routes",
+                   "chrome/browser/resources/settings/metrics_browser_proxy.html|PrivacyElementInteractions,MetricsBrowserProxy,MetricsBrowserProxyImpl",
+                   "chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.html|PrivacyPageBrowserProxy,PrivacyPageBrowserProxyImpl",
+                   "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncStatus",
+                 ]
 }
 
 js_modulizer("modulize") {
diff --git a/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.js b/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.js
index 2f447c7..6ec3fb7 100644
--- a/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.js
+++ b/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.js
@@ -63,7 +63,8 @@
    * @private
    */
   onDialogConfirm_() {
-    this.$.toggle.sendPrefChange();
+    /** @type {!SettingsToggleButtonElement} */ (this.$.toggle)
+        .sendPrefChange();
     this.closeDialog_();
   },
 
@@ -73,7 +74,8 @@
    * @private
    */
   onDialogCancel_() {
-    this.$.toggle.resetToPrefValue();
+    /** @type {!SettingsToggleButtonElement} */ (this.$.toggle)
+        .resetToPrefValue();
     this.closeDialog_();
   },
 });
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.js b/chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.js
index eb22b0f..658b4d6 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.js
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.js
@@ -13,7 +13,7 @@
   /* #export */ let MetricsReporting;
 
   /** @typedef {{name: string, value: string, policy: string}} */
-  let ResolverOption;
+  /* #export */ let ResolverOption;
 
   /**
    * Contains the possible string values for the secure DNS mode. This should be
@@ -44,7 +44,7 @@
    *   managementMode: settings.SecureDnsUiManagementMode
    * }}
    */
-  let SecureDnsSetting;
+  /* #export */ let SecureDnsSetting;
 
   /** @interface */
   /* #export */ class PrivacyPageBrowserProxy {
diff --git a/chrome/browser/resources/settings/privacy_page/secure_dns.html b/chrome/browser/resources/settings/privacy_page/secure_dns.html
index c1988ed..950ce24 100644
--- a/chrome/browser/resources/settings/privacy_page/secure_dns.html
+++ b/chrome/browser/resources/settings/privacy_page/secure_dns.html
@@ -4,7 +4,6 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_radio_group/cr_radio_group.html">
 <link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
 <link rel="import" href="chrome://resources/html/assert.html">
-<link rel="import" href="chrome://resources/html/load_time_data.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="../controls/settings_toggle_button.html">
 <link rel="import" href="../i18n_setup.html">
diff --git a/chrome/browser/resources/settings/privacy_page/secure_dns_input.html b/chrome/browser/resources/settings/privacy_page/secure_dns_input.html
index 2f3189b7..1d7f71e 100644
--- a/chrome/browser/resources/settings/privacy_page/secure_dns_input.html
+++ b/chrome/browser/resources/settings/privacy_page/secure_dns_input.html
@@ -1,8 +1,8 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
-<link rel="import" href="chrome://resources/html/load_time_data.html">
 <link rel="import" href="privacy_page_browser_proxy.html">
+<link rel="import" href="../i18n_setup.html">
 
 <dom-module id="secure-dns-input">
   <template>
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.html b/chrome/browser/resources/settings/privacy_page/security_page.html
index f48fd68..8e434df 100644
--- a/chrome/browser/resources/settings/privacy_page/security_page.html
+++ b/chrome/browser/resources/settings/privacy_page/security_page.html
@@ -12,8 +12,10 @@
 <link rel="import" href="secure_dns.html">
 <link rel="import" href="collapse_radio_button.html">
 <link rel="import" href="../controls/settings_toggle_button.html">
+<link rel="import" href="../i18n_setup.html">
 <link rel="import" href="../icons.html">
 <link rel="import" href="../metrics_browser_proxy.html">
+<link rel="import" href="../people_page/sync_browser_proxy.html">
 <link rel="import" href="../prefs/prefs.html">
 <link rel="import" href="../prefs/prefs_behavior.html">
 <link rel="import" href="../route.html">
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_browser_proxy.js b/chrome/browser/resources/settings/safety_check_page/safety_check_browser_proxy.js
index 00daeb9..f33a744 100644
--- a/chrome/browser/resources/settings/safety_check_page/safety_check_browser_proxy.js
+++ b/chrome/browser/resources/settings/safety_check_page/safety_check_browser_proxy.js
@@ -8,6 +8,20 @@
  */
 cr.define('settings', function() {
   /**
+   * Constants used in safety check C++ to JS communication.
+   * Their values need be kept in sync with their counterparts in
+   * chrome/browser/ui/webui/settings/safety_check_handler.h and
+   * chrome/browser/ui/webui/settings/safety_check_handler.cc
+   * @enum {string}
+   */
+  const SafetyCheckCallbackConstants = {
+    UPDATES_CHANGED: 'safety-check-updates-status-changed',
+    PASSWORDS_CHANGED: 'safety-check-passwords-status-changed',
+    SAFE_BROWSING_CHANGED: 'safety-check-safe-browsing-status-changed',
+    EXTENSIONS_CHANGED: 'safety-check-extensions-status-changed',
+  };
+
+  /**
    * States of the safety check updates element.
    * Needs to be kept in sync with UpdatesStatus in
    * chrome/browser/ui/webui/settings/safety_check_handler.h
@@ -106,5 +120,6 @@
     SafetyCheckExtensionsStatus,
     SafetyCheckBrowserProxy,
     SafetyCheckBrowserProxyImpl,
+    SafetyCheckCallbackConstants,
   };
 });
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 1a439f51..a1b2edc 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
@@ -7,42 +7,9 @@
  * 'settings-safety-check-page' is the settings page containing the browser
  * safety check.
  */
-cr.define('settings', function() {
-  /**
-   * Values used to identify safety check components in the callback event.
-   * Needs to be kept in sync with SafetyCheckComponent in
-   * chrome/browser/ui/webui/settings/safety_check_handler.h
-   * @enum {number}
-   */
-  const SafetyCheckComponent = {
-    UPDATES: 0,
-    PASSWORDS: 1,
-    SAFE_BROWSING: 2,
-    EXTENSIONS: 3,
-  };
-
-  /**
-   * Constants used in safety check C++ to JS communication.
-   * Their values need be kept in sync with their counterparts in
-   * chrome/browser/ui/webui/settings/safety_check_handler.h and
-   * chrome/browser/ui/webui/settings/safety_check_handler.cc
-   * @enum {string}
-   */
-  const SafetyCheckCallbackConstants = {
-    UPDATES_CHANGED: 'safety-check-updates-status-changed',
-    PASSWORDS_CHANGED: 'safety-check-passwords-status-changed',
-    SAFE_BROWSING_CHANGED: 'safety-check-safe-browsing-status-changed',
-    EXTENSIONS_CHANGED: 'safety-check-extensions-status-changed',
-  };
-
-  // #cr_define_end
-  return {
-    SafetyCheckComponent,
-    SafetyCheckCallbackConstants,
-  };
-});
 
 (function() {
+
 /**
  * States of the safety check parent element.
  * @enum {number}
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index 50f2db3b..746750e 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -873,8 +873,7 @@
                  type="chrome_html" />
       <structure name="IDR_SETTINGS_DO_NOT_TRACK_TOGGLE_JS"
                  file="privacy_page/do_not_track_toggle.js"
-                 type="chrome_html"
-                 preprocess="true" />
+                 type="chrome_html" />
       <structure name="IDR_SETTINGS_PERSONALIZATION_OPTIONS_HTML"
                  file="privacy_page/personalization_options.html"
                  type="chrome_html"
diff --git a/chrome/browser/resources/settings/settings_resources_v3.grdp b/chrome/browser/resources/settings/settings_resources_v3.grdp
index 556c393..f8ad2c2 100644
--- a/chrome/browser/resources/settings/settings_resources_v3.grdp
+++ b/chrome/browser/resources/settings/settings_resources_v3.grdp
@@ -451,11 +451,24 @@
            use_base_dir="false"
            preprocess="true"
            type="BINDATA" />
+  <include name="IDR_SETTINGS_PRIVACY_PAGE_COLLAPSE_RADIO_BUTTON_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/collapse_radio_button.m.js"
+           use_base_dir="false"
+           type="BINDATA" />
+  <include name="IDR_SETTINGS_PRIVACY_PAGE_DO_NOT_TRACK_TOGGLE_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.m.js"
+           use_base_dir="false"
+           type="BINDATA" />
   <include name="IDR_SETTINGS_PRIVACY_PAGE_PRIVACY_PAGE_M_JS"
            file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/privacy_page.m.js"
            use_base_dir="false"
            preprocess="true"
            type="BINDATA" />
+  <include name="IDR_SETTINGS_PRIVACY_PAGE_PASSWORDS_LEAK_DETECTION_TOGGLE_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.m.js"
+           use_base_dir="false"
+           preprocess="true"
+           type="BINDATA" />
   <include name="IDR_SETTINGS_PRIVACY_PAGE_PERSONALIZATION_OPTIONS_M_JS"
            file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/personalization_options.m.js"
            use_base_dir="false"
@@ -466,6 +479,19 @@
            use_base_dir="false"
            preprocess="true"
            type="BINDATA" />
+  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURE_DNS_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/secure_dns.m.js"
+           use_base_dir="false"
+           type="BINDATA" />
+  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURE_DNS_INPUT_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/secure_dns_input.m.js"
+           use_base_dir="false"
+           type="BINDATA" />
+  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_PAGE_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_page.m.js"
+           use_base_dir="false"
+           preprocess="true"
+           type="BINDATA" />
   <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_BIO_ENROLL_DIALOG_M_JS"
            file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.m.js"
            use_base_dir="false"
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
index 548e8ac..bb66812 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -31,6 +31,7 @@
 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
 #include "chrome/browser/safe_browsing/ui_manager.h"
+#include "chrome/browser/safe_browsing/user_interaction_observer.h"
 #include "chrome/browser/ssl/cert_verifier_browser_test.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
 #include "chrome/browser/ui/browser.h"
@@ -1892,12 +1893,6 @@
       content::IsolateAllSitesForTesting(command_line);
   }
 
-  void SetUpOnMainThread() override {
-    host_resolver()->AddRule("*", "127.0.0.1");
-    content::SetupCrossSiteRedirector(embedded_test_server());
-    ASSERT_TRUE(embedded_test_server()->Start());
-  }
-
   void CreatedBrowserMainParts(
       content::BrowserMainParts* browser_main_parts) override {
     // Test UI manager and test database manager should be set before
@@ -1921,7 +1916,6 @@
     event.text[0] = 'a';
     content::RenderWidgetHost* rwh = contents->GetRenderViewHost()->GetWidget();
     rwh->ForwardKeyboardEvent(event);
-
     if (AreCommittedInterstitialsEnabled()) {
       observer.WaitForNavigationFinished();
     }
@@ -1940,7 +1934,8 @@
 };
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageDelayedWarningBrowserTest,
-                       DelayedWarnings) {
+                       DelayedWarningShown) {
+  base::HistogramTester histograms;
   // Navigate to a phishing site.
   ui_test_utils::NavigateToURL(browser(),
                                GURL(kChromeUISafeBrowsingMatchPhishingUrl));
@@ -1954,6 +1949,31 @@
   AssertNoInterstitial(browser(), false);  // Assert the interstitial is gone
   EXPECT_EQ(GURL(url::kAboutBlankURL),     // Back to "about:blank"
             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
+
+  histograms.ExpectTotalCount(kDelayedWarningsHistogram, 2);
+  histograms.ExpectBucketCount(kDelayedWarningsHistogram,
+                               DelayedWarningEvent::kPageLoaded, 1);
+  histograms.ExpectBucketCount(kDelayedWarningsHistogram,
+                               DelayedWarningEvent::kWarningShownOnKeypress, 1);
+}
+
+IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageDelayedWarningBrowserTest,
+                       DelayedWarningNotShown) {
+  base::HistogramTester histograms;
+  // Navigate to a phishing site.
+  ui_test_utils::NavigateToURL(browser(),
+                               GURL(kChromeUISafeBrowsingMatchPhishingUrl));
+  WaitForReady(browser());
+  AssertNoInterstitial(browser(), true);
+
+  // Navigate away without interacting with the page.
+  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
+
+  histograms.ExpectTotalCount(kDelayedWarningsHistogram, 2);
+  histograms.ExpectBucketCount(kDelayedWarningsHistogram,
+                               DelayedWarningEvent::kPageLoaded, 1);
+  histograms.ExpectBucketCount(kDelayedWarningsHistogram,
+                               DelayedWarningEvent::kWarningNotShown, 1);
 }
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/chrome/browser/safe_browsing/user_interaction_observer.cc b/chrome/browser/safe_browsing/user_interaction_observer.cc
index 249349f5..ad23075e 100644
--- a/chrome/browser/safe_browsing/user_interaction_observer.cc
+++ b/chrome/browser/safe_browsing/user_interaction_observer.cc
@@ -6,17 +6,25 @@
 
 #include <string>
 
+#include "base/metrics/histogram_functions.h"
 #include "components/safe_browsing/core/features.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
 
+namespace safe_browsing {
+
+const char kDelayedWarningsHistogram[] = "SafeBrowsing.DelayedWarnings.Event";
+
 namespace {
 const char kWebContentsUserDataKey[] =
     "web_contents_safe_browsing_user_interaction_observer";
+
+void RecordUMA(DelayedWarningEvent event) {
+  base::UmaHistogramEnumeration(kDelayedWarningsHistogram, event);
 }
 
-namespace safe_browsing {
+}  // namespace
 
 SafeBrowsingUserInteractionObserver::SafeBrowsingUserInteractionObserver(
     content::WebContents* web_contents,
@@ -38,11 +46,16 @@
   // (DidGetUserInteraction() can only observe and not cancel the event.)
   web_contents->GetRenderViewHost()->GetWidget()->AddKeyPressEventCallback(
       key_press_callback_);
+
+  RecordUMA(DelayedWarningEvent::kPageLoaded);
 }
 
 SafeBrowsingUserInteractionObserver::~SafeBrowsingUserInteractionObserver() {
   web_contents_->GetRenderViewHost()->GetWidget()->RemoveKeyPressEventCallback(
       key_press_callback_);
+  if (!interstitial_shown_) {
+    RecordUMA(DelayedWarningEvent::kWarningNotShown);
+  }
 }
 
 // static
@@ -90,6 +103,8 @@
     const content::NativeWebKeyboardEvent& event) {
   CleanUp();
   // Show the interstitial.
+  interstitial_shown_ = true;
+  RecordUMA(DelayedWarningEvent::kWarningShownOnKeypress);
   SafeBrowsingUIManager::StartDisplayingBlockingPage(ui_manager_, resource_);
   // DO NOT add code past this point. |this| is destroyed.
   return true;
diff --git a/chrome/browser/safe_browsing/user_interaction_observer.h b/chrome/browser/safe_browsing/user_interaction_observer.h
index caab6cf..184a6ef 100644
--- a/chrome/browser/safe_browsing/user_interaction_observer.h
+++ b/chrome/browser/safe_browsing/user_interaction_observer.h
@@ -14,6 +14,23 @@
 
 namespace safe_browsing {
 
+// Used for UMA. There may be more than one event per navigation (e.g.
+// kAll and kWarningShownOnKeypress).
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class DelayedWarningEvent {
+  // User loaded a page with a delayed warning.
+  kPageLoaded = 0,
+  // User left the page and the warning was never shown.
+  kWarningNotShown = 1,
+  // The warning is shown because the user pressed a key.
+  kWarningShownOnKeypress = 2,
+  kMaxValue = kWarningShownOnKeypress,
+};
+
+// Name of the histogram.
+extern const char kDelayedWarningsHistogram[];
+
 // Observes user interactions and shows an interstitial if necessary.
 // Only created when an interstitial was about to be displayed but was delayed
 // due to the Delayed Warnings experiment. Deleted once the interstitial is
@@ -59,6 +76,7 @@
   content::WebContents* web_contents_;
   security_interstitials::UnsafeResource resource_;
   scoped_refptr<SafeBrowsingUIManager> ui_manager_;
+  bool interstitial_shown_ = false;
 };
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/supervised_user/supervised_user_features.cc b/chrome/browser/supervised_user/supervised_user_features.cc
index f08d2916..2f648416 100644
--- a/chrome/browser/supervised_user/supervised_user_features.cc
+++ b/chrome/browser/supervised_user/supervised_user_features.cc
@@ -16,7 +16,7 @@
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 const base::Feature kSupervisedUserAllowlistExtensionInstall{
     "SupervisedUserAllowlistExtensionInstall",
-    base::FEATURE_ENABLED_BY_DEFAULT};
+    base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 }  // namespace supervised_users
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 088de3f8..e522eafb 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -2691,6 +2691,7 @@
         "views/frame/browser_desktop_window_tree_host_linux.cc",
         "views/frame/browser_desktop_window_tree_host_linux.h",
       ]
+      deps += [ "//ui/platform_window/extensions" ]
     }
     if (use_gtk) {
       # This is the only component that can interact with gtk.
@@ -3558,15 +3559,21 @@
         sources += [
           "views/chrome_browser_main_extra_parts_views_linux.cc",
           "views/chrome_browser_main_extra_parts_views_linux.h",
-          "views/linux_ui/linux_ui_factory.h",
         ]
         if (use_gtk) {
-          sources += [ "views/linux_ui/linux_ui_factory_gtk.cc" ]
-
-          # This is the only component that can interact with gtk.
-          deps += [ "//chrome/browser/ui/gtk" ]
-        } else {
-          sources += [ "views/linux_ui/linux_ui_factory.cc" ]
+          deps += [
+            "//chrome/browser/ui/gtk",
+            "//ui/gtk",
+          ]
+          if (use_x11) {
+            deps += [
+              "//ui/gfx/x",
+              "//ui/gtk:x",
+            ]
+          }
+          if (use_ozone) {
+            deps += [ "//ui/ozone" ]
+          }
         }
         if (use_x11) {
           sources += [
diff --git a/chrome/browser/ui/android/infobars/reader_mode_infobar.cc b/chrome/browser/ui/android/infobars/reader_mode_infobar.cc
index 663f20b..e1a30ac7 100644
--- a/chrome/browser/ui/android/infobars/reader_mode_infobar.cc
+++ b/chrome/browser/ui/android/infobars/reader_mode_infobar.cc
@@ -31,10 +31,13 @@
 };
 
 ReaderModeInfoBar::ReaderModeInfoBar(
-    std::unique_ptr<ReaderModeInfoBarDelegate> delegate)
-    : InfoBarAndroid(std::move(delegate)) {}
+    std::unique_ptr<ReaderModeInfoBarDelegate> delegate,
+    const JavaParamRef<jobject>& j_manager)
+    : InfoBarAndroid(std::move(delegate)), _j_reader_mode_manager(j_manager) {}
 
-ReaderModeInfoBar::~ReaderModeInfoBar() {}
+ReaderModeInfoBar::~ReaderModeInfoBar() {
+  _j_reader_mode_manager.Reset();
+}
 
 infobars::InfoBarDelegate* ReaderModeInfoBar::GetDelegate() {
   return delegate();
@@ -45,25 +48,19 @@
   return Java_ReaderModeInfoBar_create(env);
 }
 
-base::android::ScopedJavaLocalRef<jobject> ReaderModeInfoBar::GetTab(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
-  content::WebContents* web_contents =
-      InfoBarService::WebContentsFromInfoBar(this);
-  if (!web_contents)
-    return nullptr;
-
-  TabAndroid* tab_android = TabAndroid::FromWebContents(web_contents);
-  return tab_android ? tab_android->GetJavaObject() : nullptr;
+base::android::ScopedJavaGlobalRef<jobject>
+ReaderModeInfoBar::GetReaderModeManager(JNIEnv* env) {
+  return _j_reader_mode_manager;
 }
 
 void ReaderModeInfoBar::ProcessButton(int action) {}
 
 void JNI_ReaderModeInfoBar_Create(JNIEnv* env,
-                                  const JavaParamRef<jobject>& j_tab) {
+                                  const JavaParamRef<jobject>& j_tab,
+                                  const JavaParamRef<jobject>& j_manager) {
   InfoBarService* service = InfoBarService::FromWebContents(
       TabAndroid::GetNativeTab(env, j_tab)->web_contents());
 
   service->AddInfoBar(std::make_unique<ReaderModeInfoBar>(
-      std::make_unique<ReaderModeInfoBarDelegate>()));
+      std::make_unique<ReaderModeInfoBarDelegate>(), j_manager));
 }
diff --git a/chrome/browser/ui/android/infobars/reader_mode_infobar.h b/chrome/browser/ui/android/infobars/reader_mode_infobar.h
index 96b85bb..e24ef52 100644
--- a/chrome/browser/ui/android/infobars/reader_mode_infobar.h
+++ b/chrome/browser/ui/android/infobars/reader_mode_infobar.h
@@ -16,12 +16,11 @@
 class ReaderModeInfoBar : public InfoBarAndroid {
  public:
   explicit ReaderModeInfoBar(
-      std::unique_ptr<ReaderModeInfoBarDelegate> delegate);
+      std::unique_ptr<ReaderModeInfoBarDelegate> delegate,
+      const base::android::JavaParamRef<jobject>& j_manager);
   ~ReaderModeInfoBar() override;
 
-  base::android::ScopedJavaLocalRef<jobject> GetTab(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  base::android::ScopedJavaGlobalRef<jobject> GetReaderModeManager(JNIEnv* env);
 
  protected:
   infobars::InfoBarDelegate* GetDelegate();
@@ -32,6 +31,7 @@
       JNIEnv* env) override;
 
  private:
+  base::android::ScopedJavaGlobalRef<jobject> _j_reader_mode_manager;
   DISALLOW_COPY_AND_ASSIGN(ReaderModeInfoBar);
 };
 
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
index c84c91a..f3710ac 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -481,7 +481,7 @@
 <translation id="4538018662093857852">Жөнөкөй режимди күйгүзүү</translation>
 <translation id="4550003330909367850">Бул жерден сырсөзүңүздү көрүп же көчүрүү үчүн бул түзмөктүн экран кулпусун жөндөңүз.</translation>
 <translation id="4558311620361989323">Веб баракчасынын кыска жолдору</translation>
-<translation id="4561979708150884304">Байланыш жок</translation>
+<translation id="4561979708150884304">Интернет жок</translation>
 <translation id="4565377596337484307">Сырсөздү жашыруу</translation>
 <translation id="4572422548854449519">Башкарылган аккаунтка кириңиз</translation>
 <translation id="4574741712540401491">•  <ph name="LIST_ITEM_TEXT" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
index 2157eb3..aa5fba1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -926,6 +926,7 @@
 <translation id="780301667611848630">தேவையில்லை</translation>
 <translation id="7810647596859435254">இதன் மூலம் திற…</translation>
 <translation id="7821588508402923572">உங்கள் டேட்டா சேமிப்புகள் இங்கே தோன்றும்</translation>
+<translation id="7828557259026017104">நீங்கள் பார்வையிடும் தளங்களால் உருவாக்கப்பட்ட கோப்புகளே குக்கீகள். உங்கள் விருப்பங்களை நினைவில் வைத்துக்கொள்ள இணையதளங்கள் இவற்றைப் பயன்படுத்துகின்றன. பிற தளங்களால் மூன்றாம் தரப்புக் குக்கீகள் உருவாக்கப்படுகின்றன. நீங்கள் பார்வையிடும் இணையப் பக்கத்தில் தோன்றக்கூடிய விளம்பரங்கள் அல்லது படங்கள் போன்ற சில உள்ளடக்கங்கள் இந்தத் தளங்களுக்குச் சொந்தமானதாக இருக்கும்.</translation>
 <translation id="783819812427904514">வீடியோவின் ஒலியை இயக்கு</translation>
 <translation id="784934925303690534">நேர வரம்பு</translation>
 <translation id="7851858861565204677">பிற சாதனங்கள்</translation>
diff --git a/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc
index 9c371f0..c4b1b66 100644
--- a/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.cc
@@ -4,16 +4,19 @@
 
 #include "chrome/browser/ui/ash/assistant/assistant_web_view_impl.h"
 
+#include "ash/public/cpp/window_properties.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/focused_node_details.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_delegate.h"
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
+#include "ui/aura/window.h"
 #include "ui/views/controls/webview/web_contents_set_background_color.h"
 #include "ui/views/controls/webview/webview.h"
 #include "ui/views/focus/focus_manager.h"
 #include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
 
 AssistantWebViewImpl::AssistantWebViewImpl(Profile* profile,
                                            const InitParams& params)
@@ -65,6 +68,11 @@
   web_contents_->GetController().LoadURLWithParams(params);
 }
 
+void AssistantWebViewImpl::AddedToWidget() {
+  UpdateMinimizeOnBackProperty();
+  AssistantWebView::AddedToWidget();
+}
+
 bool AssistantWebViewImpl::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
     content::mojom::WindowContainerType window_container_type,
@@ -222,6 +230,17 @@
 
   can_go_back_ = can_go_back;
 
+  UpdateMinimizeOnBackProperty();
+
   for (auto& observer : observers_)
     observer.DidChangeCanGoBack(can_go_back_);
 }
+
+void AssistantWebViewImpl::UpdateMinimizeOnBackProperty() {
+  const bool minimize_on_back = params_.minimize_on_back_key && !can_go_back_;
+  views::Widget* widget = GetWidget();
+  if (widget) {
+    widget->GetNativeWindow()->SetProperty(ash::kMinimizeOnBackKey,
+                                           minimize_on_back);
+  }
+}
diff --git a/chrome/browser/ui/ash/assistant/assistant_web_view_impl.h b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.h
index 1ffdf05e..8087763 100644
--- a/chrome/browser/ui/ash/assistant/assistant_web_view_impl.h
+++ b/chrome/browser/ui/ash/assistant/assistant_web_view_impl.h
@@ -41,6 +41,7 @@
   void RemoveObserver(Observer* observer) override;
   bool GoBack() override;
   void Navigate(const GURL& url) override;
+  void AddedToWidget() override;
 
   // content::WebContentsDelegate:
   bool IsWebContentsCreationOverridden(
@@ -77,6 +78,10 @@
 
   void UpdateCanGoBack();
 
+  // Update the window property that stores whether we can minimize on a back
+  // event.
+  void UpdateMinimizeOnBackProperty();
+
   const InitParams params_;
 
   std::unique_ptr<content::WebContents> web_contents_;
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 0e35330..08e6c68 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -296,8 +296,10 @@
 constexpr TimeDelta kUIUpdateCoalescingTime = TimeDelta::FromMilliseconds(200);
 
 BrowserWindow* CreateBrowserWindow(std::unique_ptr<Browser> browser,
-                                   bool user_gesture) {
-  return BrowserWindow::CreateBrowserWindow(std::move(browser), user_gesture);
+                                   bool user_gesture,
+                                   bool in_tab_dragging) {
+  return BrowserWindow::CreateBrowserWindow(std::move(browser), user_gesture,
+                                            in_tab_dragging);
 }
 
 const extensions::Extension* GetExtensionForOrigin(
@@ -526,7 +528,8 @@
 
   window_ = params.window ? params.window
                           : CreateBrowserWindow(std::unique_ptr<Browser>(this),
-                                                params.user_gesture);
+                                                params.user_gesture,
+                                                params.in_tab_dragging);
 
   if (app_controller_)
     app_controller_->UpdateCustomTabBarVisibility(false);
@@ -554,11 +557,6 @@
 
   BrowserList::AddBrowser(this);
 
-  // SetIsInTabDragging() will set the fast resize bit for the web contents.
-  // It will be reset after the drag ends.
-  if (params.in_tab_dragging)
-    SetIsInTabDragging(true);
-
   if (is_focus_mode_)
     focus_mode_start_time_ = base::TimeTicks::Now();
 }
@@ -906,10 +904,6 @@
   return unload_controller_.RunUnloadEventsHelper(web_contents);
 }
 
-void Browser::SetIsInTabDragging(bool is_in_tab_dragging) {
-  window_->TabDraggingStatusChanged(is_in_tab_dragging);
-}
-
 void Browser::OnWindowClosing() {
   if (!ShouldCloseWindow())
     return;
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h
index 29ac0fd8..87db494 100644
--- a/chrome/browser/ui/browser_window.h
+++ b/chrome/browser/ui/browser_window.h
@@ -440,7 +440,8 @@
 
   // Construct a BrowserWindow implementation for the specified |browser|.
   static BrowserWindow* CreateBrowserWindow(std::unique_ptr<Browser> browser,
-                                            bool user_gesture);
+                                            bool user_gesture,
+                                            bool in_tab_dragging);
 
   // Shows the avatar bubble on the window frame off of the avatar button with
   // the given mode. The Service Type specified by GAIA is provided as well.
diff --git a/chrome/browser/ui/gtk/BUILD.gn b/chrome/browser/ui/gtk/BUILD.gn
index b66e906..e849f6e 100644
--- a/chrome/browser/ui/gtk/BUILD.gn
+++ b/chrome/browser/ui/gtk/BUILD.gn
@@ -56,7 +56,6 @@
 
   deps = [
     "//base",
-    "//build/config/linux/gtk",
     "//build/config/linux/gtk:gtkprint",
     "//printing",
     "//skia",
@@ -75,6 +74,7 @@
     "//ui/events:dom_keycode_converter",
     "//ui/gfx",
     "//ui/gfx/geometry",
+    "//ui/gtk",
     "//ui/native_theme",
     "//ui/shell_dialogs",
     "//ui/strings",
diff --git a/chrome/browser/ui/gtk/gtk_ui.cc b/chrome/browser/ui/gtk/gtk_ui.cc
index ba30b1ca..5ed0f20 100644
--- a/chrome/browser/ui/gtk/gtk_ui.cc
+++ b/chrome/browser/ui/gtk/gtk_ui.cc
@@ -9,6 +9,7 @@
 #include <pango/pango.h>
 
 #include <cmath>
+#include <memory>
 #include <set>
 #include <utility>
 
@@ -53,6 +54,7 @@
 #include "ui/gfx/image/image_skia_source.h"
 #include "ui/gfx/skbitmap_operations.h"
 #include "ui/gfx/skia_util.h"
+#include "ui/gtk/gtk_ui_delegate.h"
 #include "ui/native_theme/native_theme.h"
 #include "ui/shell_dialogs/select_file_policy.h"
 #include "ui/views/controls/button/button.h"
@@ -70,10 +72,7 @@
 #include "chrome/browser/ui/gtk/gtk_event_loop_x11.h"
 #endif
 
-#if defined(USE_X11)
-#include "ui/gfx/x/x11.h"        // nogncheck
-#include "ui/gfx/x/x11_types.h"  // nogncheck
-#elif defined(USE_OZONE)
+#if defined(USE_OZONE)
 #include "ui/base/ime/input_method.h"
 #include "ui/ozone/public/ozone_platform.h"
 #endif
@@ -86,6 +85,9 @@
 
 namespace {
 
+// Stores the GtkUi singleton instance
+const GtkUi* g_gtk_ui = nullptr;
+
 const double kDefaultDPI = 96;
 
 class GtkButtonImageSource : public gfx::ImageSkiaSource {
@@ -380,26 +382,19 @@
 
 }  // namespace
 
-GtkUi::GtkUi() {
+GtkUi::GtkUi(ui::GtkUiDelegate* delegate) : delegate_(delegate) {
   using Action = views::LinuxUI::WindowFrameAction;
   using ActionSource = views::LinuxUI::WindowFrameActionSource;
+
+  DCHECK(delegate_);
+  DCHECK(!g_gtk_ui);
+  g_gtk_ui = this;
+
   window_frame_actions_ = {
       {ActionSource::kDoubleClick, Action::kToggleMaximize},
       {ActionSource::kMiddleClick, GetDefaultMiddleClickAction()},
       {ActionSource::kRightClick, Action::kMenu}};
 
-#if defined(USE_X11)
-  // Force Gtk to use Xwayland (in case a Wayland compositor is being used).
-  gdk_set_allowed_backends("x11");
-#elif defined(USE_OZONE)
-  // TODO(crbug.com/1002674): This is a temporary layering violation, supported
-  // during X11 migration to Ozone. Once LinuxUI/GtkUi is reworked to be more
-  // aligned with Ozone design, this will be moved into ozone backend code.
-  std::string ozone_platform{ui::OzonePlatform::GetPlatformName()};
-  if (ozone_platform == "x11" || ozone_platform == "wayland")
-    gdk_set_allowed_backends(ozone_platform.c_str());
-#endif
-
   // Avoid GTK initializing atk-bridge, and let AuraLinux implementation
   // do it once it is ready.
   std::unique_ptr<base::Environment> env(base::Environment::Create());
@@ -412,6 +407,12 @@
 
 GtkUi::~GtkUi() {
   gtk_widget_destroy(fake_window_);
+  g_gtk_ui = nullptr;
+}
+
+ui::GtkUiDelegate* GtkUi::GetDelegate() {
+  DCHECK(g_gtk_ui) << "GtkUi instance is not set.";
+  return g_gtk_ui->delegate_;
 }
 
 void GtkUi::Initialize() {
@@ -827,6 +828,13 @@
 
 bool GtkUi::MatchEvent(const ui::Event& event,
                        std::vector<ui::TextEditCommandAuraLinux>* commands) {
+  // TODO(crbug.com/963419): Use delegate's |GetGdkKeymap| here to
+  // determine if GtkUi's key binding handling implementation is used or not.
+  // Ozone/Wayland was unintentionally using GtkUi for keybinding handling, so
+  // early out here, for now, until a proper solution for ozone is implemented.
+  if (!GetDelegate()->GetGdkKeymap())
+    return false;
+
   // Ensure that we have a keyboard handler.
   if (!key_bindings_handler_)
     key_bindings_handler_ = std::make_unique<GtkKeyBindingsHandler>();
@@ -1093,15 +1101,19 @@
     return display::Display::GetForcedDeviceScaleFactor();
 
   GdkScreen* screen = gdk_screen_get_default();
-  gint scale = gtk_widget_get_scale_factor(fake_window_);
-  DCHECK_GT(scale, 0);
-  gdouble resolution = gdk_screen_get_resolution(screen);
-  const float scale_factor =
-      resolution <= 0 ? scale : resolution * scale / kDefaultDPI;
+  float scale = gtk_widget_get_scale_factor(fake_window_);
+  DCHECK_GT(scale, 0.0);
 
-  // Blacklist scaling factors <120% (crbug.com/484400) and round
-  // to 1 decimal to prevent rendering problems (crbug.com/485183).
-  return scale_factor < 1.2f ? 1.0f : roundf(scale_factor * 10) / 10;
+  gdouble resolution = gdk_screen_get_resolution(screen);
+  // TODO(https://crbug.com/1033552): Remove this hack once the Trusty bots are
+  // fixed to have a resolution of 96, or when the Trusty bots are removed
+  // altogether.
+  if (std::abs(resolution - 95.8486) < 0.001)
+    resolution = 96;
+  if (resolution > 0)
+    scale *= resolution / kDefaultDPI;
+
+  return scale;
 }
 
 void GtkUi::UpdateDeviceScaleFactor() {
@@ -1122,6 +1134,6 @@
 
 }  // namespace gtk
 
-views::LinuxUI* BuildGtkUi() {
-  return new gtk::GtkUi;
+views::LinuxUI* BuildGtkUi(ui::GtkUiDelegate* delegate) {
+  return new gtk::GtkUi(delegate);
 }
diff --git a/chrome/browser/ui/gtk/gtk_ui.h b/chrome/browser/ui/gtk/gtk_ui.h
index 6c80703a..f22a01d 100644
--- a/chrome/browser/ui/gtk/gtk_ui.h
+++ b/chrome/browser/ui/gtk/gtk_ui.h
@@ -16,6 +16,7 @@
 #include "build/buildflag.h"
 #include "ui/base/glib/glib_signal.h"
 #include "ui/gfx/color_utils.h"
+#include "ui/gtk/gtk_ui_delegate.h"
 #include "ui/views/linux_ui/linux_ui.h"
 #include "ui/views/window/frame_buttons.h"
 
@@ -36,9 +37,13 @@
 // Interface to GTK desktop features.
 class GtkUi : public views::LinuxUI {
  public:
-  GtkUi();
+  explicit GtkUi(ui::GtkUiDelegate* delegate);
   ~GtkUi() override;
 
+  // Static delegate getter, used by different objects (created by GtkUi), e.g:
+  // Dialogs, IME Context, when platform-specific functionality is required.
+  static ui::GtkUiDelegate* GetDelegate();
+
   // Setters used by SettingsProvider:
   void SetWindowButtonOrdering(
       const std::vector<views::FrameButton>& leading_buttons,
@@ -143,6 +148,9 @@
 
   float GetRawDeviceScaleFactor();
 
+  // Not owned by GtkUi.
+  ui::GtkUiDelegate* const delegate_;
+
   NativeThemeGtk* native_theme_;
 
   // A regular GtkWindow.
@@ -211,6 +219,7 @@
 }  // namespace gtk
 
 // Access point to the GTK desktop system.
-COMPONENT_EXPORT(GTK) views::LinuxUI* BuildGtkUi();
+COMPONENT_EXPORT(GTK)
+views::LinuxUI* BuildGtkUi(ui::GtkUiDelegate* delegate);
 
 #endif  // CHROME_BROWSER_UI_GTK_GTK_UI_H_
diff --git a/chrome/browser/ui/gtk/gtk_util.cc b/chrome/browser/ui/gtk/gtk_util.cc
index a6921c6c..27db8b2 100644
--- a/chrome/browser/ui/gtk/gtk_util.cc
+++ b/chrome/browser/ui/gtk/gtk_util.cc
@@ -19,6 +19,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/string_util.h"
+#include "chrome/browser/ui/gtk/gtk_ui.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/events/event.h"
@@ -26,6 +27,9 @@
 #include "ui/events/keycodes/dom/keycode_converter.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gtk/gtk_ui_delegate.h"
+#include "ui/ozone/public/ozone_platform.h"
 #include "ui/views/linux_ui/linux_ui.h"
 
 #if defined(USE_X11)
@@ -145,15 +149,9 @@
     return;
 
   gtk_widget_realize(dialog);
-#if defined(USE_X11)
   GdkWindow* gdk_window = gtk_widget_get_window(dialog);
-  XSetTransientForHint(GDK_WINDOW_XDISPLAY(gdk_window),
-                       GDK_WINDOW_XID(gdk_window),
-                       parent->GetHost()->GetAcceleratedWidget());
-#else
-  // TODO(https://crbug.com/992239): Provide a wayland implementation.
-  NOTIMPLEMENTED();
-#endif
+  gfx::AcceleratedWidget parent_id = parent->GetHost()->GetAcceleratedWidget();
+  GtkUi::GetDelegate()->SetGdkWindowTransientFor(gdk_window, parent_id);
 
   // We also set the |parent| as a property of |dialog|, so that we can unlink
   // the two later.
@@ -582,18 +580,6 @@
   return prop_value;
 }
 
-GdkDisplay* GetGdkDisplay() {
-  GdkDisplay* display = nullptr;
-  // TODO(crbug.com/1002674): Remove once GtkIM-based LinuxInputMethodContext
-  // implementation is moved out of gtk.
-#if defined(USE_X11)
-  display = gdk_x11_lookup_xdisplay(gfx::GetXDisplay());
-#endif
-  if (!display)  // Fall back to the default display.
-    display = gdk_display_get_default();
-  return display;
-}
-
 int BuildXkbStateFromGdkEvent(unsigned int state, unsigned char group) {
   return state | ((group & 0x3) << 13);
 }
@@ -606,7 +592,7 @@
   int group = GetKeyEventProperty(key_event, ui::kPropertyKeyboardGroup);
 
   // Get GdkKeymap
-  GdkKeymap* keymap = gdk_keymap_get_for_display(GetGdkDisplay());
+  GdkKeymap* keymap = GtkUi::GetDelegate()->GetGdkKeymap();
 
   // Get keyval and state
   GdkModifierType state = ExtractGdkEventStateFromKeyEvent(key_event);
diff --git a/chrome/browser/ui/gtk/gtk_util.h b/chrome/browser/ui/gtk/gtk_util.h
index 0ff280f..4fe0021 100644
--- a/chrome/browser/ui/gtk/gtk_util.h
+++ b/chrome/browser/ui/gtk/gtk_util.h
@@ -178,9 +178,6 @@
 std::string GetGtkSettingsStringProperty(GtkSettings* settings,
                                          const gchar* prop_name);
 
-// Get current GdkDisplay instance
-GdkDisplay* GetGdkDisplay();
-
 // Xkb Events store group attribute into XKeyEvent::state bit field, along with
 // other state-related info, while GdkEventKey objects have separate fields for
 // that purpose, they are ::state and ::group. This function is responsible for
diff --git a/chrome/browser/ui/gtk/input_method_context_impl_gtk.cc b/chrome/browser/ui/gtk/input_method_context_impl_gtk.cc
index 848f213b..0210bb8f 100644
--- a/chrome/browser/ui/gtk/input_method_context_impl_gtk.cc
+++ b/chrome/browser/ui/gtk/input_method_context_impl_gtk.cc
@@ -6,11 +6,11 @@
 
 #include <gdk/gdk.h>
 #include <gdk/gdkkeysyms.h>
-#include <gdk/gdkx.h>
 #include <gtk/gtk.h>
 #include <stddef.h>
 
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ui/gtk/gtk_ui.h"
 #include "chrome/browser/ui/gtk/gtk_util.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/ime/composition_text.h"
@@ -18,6 +18,8 @@
 #include "ui/base/ime/text_input_client.h"
 #include "ui/events/event.h"
 #include "ui/gfx/geometry/dip_util.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gtk/gtk_ui_delegate.h"
 #include "ui/views/linux_ui/linux_ui.h"
 
 namespace gtk {
@@ -30,16 +32,11 @@
   if (!key_event.target())
     return nullptr;
 
-  GdkDisplay* display = GetGdkDisplay();
   aura::Window* window = static_cast<aura::Window*>(key_event.target());
-  XID xwindow = window->GetHost()->GetAcceleratedWidget();
+  DCHECK(window) << "KeyEvent target window not set.";
 
-  GdkWindow* gdk_window = gdk_x11_window_lookup_for_display(display, xwindow);
-  if (gdk_window)
-    g_object_ref(gdk_window);
-  else
-    gdk_window = gdk_x11_window_foreign_new_for_display(display, xwindow);
-  return gdk_window;
+  auto window_id = window->GetHost()->GetAcceleratedWidget();
+  return GtkUi::GetDelegate()->GetGdkWindow(window_id);
 }
 
 // Translate IME ui::KeyEvent to a GdkEventKey.
diff --git a/chrome/browser/ui/sync/profile_signin_confirmation_helper_unittest.cc b/chrome/browser/ui/sync/profile_signin_confirmation_helper_unittest.cc
index 05c87ea..94d6930 100644
--- a/chrome/browser/ui/sync/profile_signin_confirmation_helper_unittest.cc
+++ b/chrome/browser/ui/sync/profile_signin_confirmation_helper_unittest.cc
@@ -140,9 +140,11 @@
     user_prefs_ = new TestingPrefStoreWithCustomReadError;
     sync_preferences::TestingPrefServiceSyncable* pref_service =
         new sync_preferences::TestingPrefServiceSyncable(
-            new TestingPrefStore(), new TestingPrefStore(), user_prefs_,
-            new TestingPrefStore(), new user_prefs::PrefRegistrySyncable(),
-            new PrefNotifierImpl());
+            /*managed_prefs=*/new TestingPrefStore(),
+            /*supervised_user_prefs=*/new TestingPrefStore(),
+            /*extension_prefs=*/new TestingPrefStore(), user_prefs_,
+            /*recommended_prefs=*/new TestingPrefStore(),
+            new user_prefs::PrefRegistrySyncable(), new PrefNotifierImpl());
     RegisterUserProfilePrefs(pref_service->registry());
     builder.SetPrefService(
         base::WrapUnique<sync_preferences::PrefServiceSyncable>(pref_service));
diff --git a/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc b/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc
index c959e4f..5f7c2b2 100644
--- a/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc
+++ b/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc
@@ -5,10 +5,29 @@
 #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.h"
 
 #include "chrome/browser/themes/theme_service_aura_linux.h"
-#include "chrome/browser/ui/views/linux_ui/linux_ui_factory.h"
 #include "chrome/browser/ui/views/theme_profile_key.h"
+#include "ui/base/buildflags.h"
 #include "ui/views/linux_ui/linux_ui.h"
 
+#if BUILDFLAG(USE_GTK)
+#include "chrome/browser/ui/gtk/gtk_ui.h"
+#include "ui/gtk/gtk_ui_delegate.h"
+#endif
+
+namespace {
+
+views::LinuxUI* BuildLinuxUI() {
+  views::LinuxUI* linux_ui = nullptr;
+  // GtkUi is the only LinuxUI implementation for now.
+#if BUILDFLAG(USE_GTK)
+  DCHECK(ui::GtkUiDelegate::instance());
+  linux_ui = BuildGtkUi(ui::GtkUiDelegate::instance());
+#endif
+  return linux_ui;
+}
+
+}  // namespace
+
 ChromeBrowserMainExtraPartsViewsLinux::ChromeBrowserMainExtraPartsViewsLinux() =
     default;
 
@@ -18,7 +37,7 @@
 void ChromeBrowserMainExtraPartsViewsLinux::ToolkitInitialized() {
   ChromeBrowserMainExtraPartsViews::ToolkitInitialized();
 
-  views::LinuxUI* linux_ui = views::BuildLinuxUI();
+  views::LinuxUI* linux_ui = BuildLinuxUI();
   if (!linux_ui)
     return;
 
diff --git a/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.cc b/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.cc
index 5d45d05..35753fa 100644
--- a/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.cc
+++ b/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.cc
@@ -5,6 +5,9 @@
 #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.h"
 
 #include "chrome/browser/ui/browser_list.h"
+#include "ui/gfx/x/x11_types.h"
+#include "ui/gtk/gtk_ui_delegate.h"
+#include "ui/gtk/gtk_ui_delegate_x11.h"
 #include "ui/views/widget/desktop_aura/x11_desktop_handler.h"
 
 ChromeBrowserMainExtraPartsViewsLinuxX11::
@@ -21,6 +24,16 @@
   views::X11DesktopHandler::get()->AddObserver(this);
 }
 
+void ChromeBrowserMainExtraPartsViewsLinuxX11::ToolkitInitialized() {
+  // In Aura/X11, Gtk-based LinuxUI implementation is used, so we instantiate
+  // and inject the GtkUiDelegate before ChromeBrowserMainExtraPartsViewsLinux,
+  // so it can properly initialize GtkUi on its |ToolkitInitialized| override.
+  gtk_ui_delegate_ = std::make_unique<ui::GtkUiDelegateX11>(gfx::GetXDisplay());
+  ui::GtkUiDelegate::SetInstance(gtk_ui_delegate_.get());
+
+  ChromeBrowserMainExtraPartsViewsLinux::ToolkitInitialized();
+}
+
 void ChromeBrowserMainExtraPartsViewsLinuxX11::OnWorkspaceChanged(
     const std::string& new_workspace) {
   BrowserList::MoveBrowsersInWorkspaceToFront(new_workspace);
diff --git a/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.h b/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.h
index 1f5d1b3..ab5f02f 100644
--- a/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.h
+++ b/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux_x11.h
@@ -5,9 +5,16 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_CHROME_BROWSER_MAIN_EXTRA_PARTS_VIEWS_LINUX_X11_H_
 #define CHROME_BROWSER_UI_VIEWS_CHROME_BROWSER_MAIN_EXTRA_PARTS_VIEWS_LINUX_X11_H_
 
+#include <memory>
+
 #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.h"
+#include "ui/gtk/gtk_ui_delegate.h"
 #include "ui/views/widget/desktop_aura/x11_desktop_handler_observer.h"
 
+namespace ui {
+class GtkUiDelegate;
+}
+
 // This is solely used by non-ozone X11 builds.
 class ChromeBrowserMainExtraPartsViewsLinuxX11
     : public ChromeBrowserMainExtraPartsViewsLinux,
@@ -18,11 +25,14 @@
 
   // Overridden from ChromeBrowserMainExtraParts:
   void PreCreateThreads() override;
+  void ToolkitInitialized() override;
 
   // Overridden from views::X11DesktopHandlerObserver.
   void OnWorkspaceChanged(const std::string& new_workspace) override;
 
  private:
+  std::unique_ptr<ui::GtkUiDelegate> gtk_ui_delegate_;
+
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainExtraPartsViewsLinuxX11);
 };
 
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
index d2073245..17d4002 100644
--- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
+++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
@@ -11,6 +11,9 @@
 #include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/browser/ui/views/frame/browser_frame.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h"
+#include "chrome/browser/ui/views/tabs/tab_strip.h"
+#include "ui/platform_window/extensions/x11_extension.h"
 
 ////////////////////////////////////////////////////////////////////////////////
 // BrowserDesktopWindowTreeHostLinux, public:
@@ -21,16 +24,19 @@
     BrowserView* browser_view,
     BrowserFrame* browser_frame)
     : DesktopWindowTreeHostLinuxImpl(native_widget_delegate,
-                                     desktop_native_widget_aura) {
-#if defined(USE_X11)
-  browser_view_ = browser_view;
-#endif
+                                     desktop_native_widget_aura),
+      browser_view_(browser_view),
+      browser_frame_(browser_frame) {
+  static_cast<DesktopBrowserFrameAuraLinux*>(
+      browser_frame->native_browser_frame())
+      ->set_host(this);
   browser_frame->set_frame_type(browser_frame->UseCustomFrame()
                                     ? views::Widget::FrameType::kForceCustom
                                     : views::Widget::FrameType::kForceNative);
 }
 
-BrowserDesktopWindowTreeHostLinux::~BrowserDesktopWindowTreeHostLinux() {}
+BrowserDesktopWindowTreeHostLinux::~BrowserDesktopWindowTreeHostLinux() =
+    default;
 
 ////////////////////////////////////////////////////////////////////////////////
 // BrowserDesktopWindowTreeHostLinux,
@@ -49,6 +55,18 @@
   return false;
 }
 
+void BrowserDesktopWindowTreeHostLinux::TabDraggingStatusChanged(
+    bool is_dragging) {
+  // If there's no tabs left, the browser window is about to close, so don't
+  // call SetOverrideRedirect() to prevent the window from flashing.
+  if (!browser_view_->tabstrip()->GetModelCount())
+    return;
+
+  auto* x11_extension = GetX11Extension();
+  if (x11_extension && x11_extension->IsWmTiling())
+    x11_extension->SetOverrideRedirect(is_dragging);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // BrowserDesktopWindowTreeHostLinux,
 //     DesktopWindowTreeHostLinuxImpl implementation:
@@ -72,6 +90,14 @@
   DesktopWindowTreeHostLinuxImpl::CloseNow();
 }
 
+bool BrowserDesktopWindowTreeHostLinux::IsOverrideRedirect() const {
+  if (browser_frame_->tab_drag_kind() != TabDragKind::kAllTabs)
+    return false;
+
+  auto* x11_extension = GetX11Extension();
+  return x11_extension && x11_extension->IsWmTiling();
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // BrowserDesktopWindowTreeHost, public:
 
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h
index 5ceccb1..1780d32 100644
--- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h
+++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h
@@ -44,19 +44,26 @@
       BrowserFrame* browser_frame);
   ~BrowserDesktopWindowTreeHostLinux() override;
 
+  // Called when the window starts or stops moving because of a tab drag.
+  void TabDraggingStatusChanged(bool is_dragging);
+
  private:
-  // Overridden from BrowserDesktopWindowTreeHost:
+  // BrowserDesktopWindowTreeHost:
   DesktopWindowTreeHost* AsDesktopWindowTreeHost() override;
   int GetMinimizeButtonOffset() const override;
   bool UsesNativeSystemMenu() const override;
 
-  // Overridden from views::DesktopWindowTreeHostLinuxImpl:
+  // views::DesktopWindowTreeHostLinuxImpl:
   void Init(const views::Widget::InitParams& params) override;
   void CloseNow() override;
 
-#if defined(USE_X11)
-  BrowserView* browser_view_ = nullptr;
+  // ui::X11ExtensionDelegate:
+  bool IsOverrideRedirect() const override;
 
+  BrowserView* browser_view_ = nullptr;
+  BrowserFrame* browser_frame_ = nullptr;
+
+#if defined(USE_X11)
   // Each browser frame maintains its own menu bar object because the lower
   // level dbus protocol associates a xid to a menu bar; we can't map multiple
   // xids to the same menu bar.
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc
index b6ef6d5..d4ce38e 100644
--- a/chrome/browser/ui/views/frame/browser_frame.cc
+++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window_state.h"
+#include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host.h"
 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
 #include "chrome/browser/ui/views/frame/browser_root_view.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
@@ -275,6 +276,23 @@
   return menu_model_builder_->menu_model();
 }
 
+void BrowserFrame::SetTabDragKind(TabDragKind tab_drag_kind) {
+  if (tab_drag_kind_ == tab_drag_kind)
+    return;
+
+  bool was_dragging_window = tab_drag_kind_ == TabDragKind::kAllTabs;
+  bool is_dragging_window = tab_drag_kind == TabDragKind::kAllTabs;
+  if (was_dragging_window != is_dragging_window && native_browser_frame_)
+    native_browser_frame_->TabDraggingStatusChanged(is_dragging_window);
+
+  bool was_dragging_any = tab_drag_kind_ != TabDragKind::kNone;
+  bool is_dragging_any = tab_drag_kind != TabDragKind::kNone;
+  if (was_dragging_any != is_dragging_any)
+    browser_view_->TabDraggingStatusChanged(is_dragging_any);
+
+  tab_drag_kind_ = tab_drag_kind;
+}
+
 void BrowserFrame::OnMenuClosed() {
   menu_runner_.reset();
 }
diff --git a/chrome/browser/ui/views/frame/browser_frame.h b/chrome/browser/ui/views/frame/browser_frame.h
index fb4489a..708efa5 100644
--- a/chrome/browser/ui/views/frame/browser_frame.h
+++ b/chrome/browser/ui/views/frame/browser_frame.h
@@ -14,6 +14,7 @@
 #include "ui/views/context_menu_controller.h"
 #include "ui/views/widget/widget.h"
 
+class BrowserDesktopWindowTreeHost;
 class BrowserNonClientFrameView;
 class BrowserRootView;
 class BrowserView;
@@ -38,6 +39,18 @@
 class View;
 }
 
+enum class TabDragKind {
+  // No drag is active.
+  kNone,
+
+  // One or more (but not all) tabs within a window are being dragged.
+  kTab,
+
+  // All of the tabs in a window are being dragged, and the whole window is
+  // along for the ride.
+  kAllTabs,
+};
+
 // This is a virtual interface that allows system specific browser frames.
 class BrowserFrame : public views::Widget, public views::ContextMenuController {
  public:
@@ -124,6 +137,14 @@
     return native_browser_frame_;
   }
 
+  void set_browser_desktop_window_tree_host(
+      BrowserDesktopWindowTreeHost* browser_desktop_window_tree_host) {
+    browser_desktop_window_tree_host_ = browser_desktop_window_tree_host;
+  }
+
+  void SetTabDragKind(TabDragKind tab_drag_kind);
+  TabDragKind tab_drag_kind() const { return tab_drag_kind_; }
+
  private:
   void OnTouchUiChanged();
 
@@ -154,6 +175,16 @@
           base::BindRepeating(&BrowserFrame::OnTouchUiChanged,
                               base::Unretained(this)));
 
+  BrowserDesktopWindowTreeHost* browser_desktop_window_tree_host_ = nullptr;
+
+  // Indicates the drag state for this window. The value can be kWindowDrag
+  // if the accociated browser is the dragged browser or kTabDrag
+  // if this is the source browser that the drag window originates from. During
+  // tab dragging process, the dragged browser or the source browser's bounds
+  // may change, the fast resize strategy will be used to resize its web
+  // contents for smoother dragging.
+  TabDragKind tab_drag_kind_ = TabDragKind::kNone;
+
   DISALLOW_COPY_AND_ASSIGN(BrowserFrame);
 };
 
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 222e386..911d64e 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1386,7 +1386,7 @@
   // Do nothing if we're currently participating in a tab dragging process. The
   // fast resize bit will be reset and the web contents will get re-layed out
   // after the tab dragging ends.
-  if (in_tab_dragging_)
+  if (frame()->tab_drag_kind() != TabDragKind::kNone)
     return;
 
   if (is_animating)
@@ -1403,15 +1403,8 @@
 }
 
 void BrowserView::TabDraggingStatusChanged(bool is_dragging) {
-  if (in_tab_dragging_ == is_dragging)
-    return;
-
-  in_tab_dragging_ = is_dragging;
-  if (in_tab_dragging_) {
-    contents_web_view_->SetFastResize(true);
-  } else {
-    contents_web_view_->SetFastResize(false);
-
+  contents_web_view_->SetFastResize(is_dragging);
+  if (!is_dragging) {
     // When tab dragging is ended, we need to make sure the web contents get
     // re-layed out. Otherwise we may see web contents get clipped to the window
     // size that was used during dragging.
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index 0d3dbf62..79088c7 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -810,13 +810,6 @@
   // jankiness.
   bool in_process_fullscreen_ = false;
 
-  // True if we're participating in a tab dragging process. The value can be
-  // true if the accociated browser is the dragged browser or the source browser
-  // that the drag tab(s) originates from. During tab dragging process, the
-  // dragged browser or the source browser's bounds may change, the fast resize
-  // strategy will be used to resize its web contents for smoother dragging.
-  bool in_tab_dragging_ = false;
-
   std::unique_ptr<ExclusiveAccessBubbleViews> exclusive_access_bubble_;
 
 #if defined(OS_WIN)
diff --git a/chrome/browser/ui/views/frame/browser_window_factory.cc b/chrome/browser/ui/views/frame/browser_window_factory.cc
index 1f7913d..9089e38 100644
--- a/chrome/browser/ui/views/frame/browser_window_factory.cc
+++ b/chrome/browser/ui/views/frame/browser_window_factory.cc
@@ -22,7 +22,8 @@
 // static
 BrowserWindow* BrowserWindow::CreateBrowserWindow(
     std::unique_ptr<Browser> browser,
-    bool user_gesture) {
+    bool user_gesture,
+    bool in_tab_dragging) {
   // Create the view and the frame. The frame will attach itself via the view
   // so we don't need to do anything with the pointer.
   BrowserView* view = new BrowserView(std::move(browser));
@@ -33,6 +34,8 @@
 #endif
   if (!browser_frame)
     browser_frame = new BrowserFrame(view);
+  if (in_tab_dragging)
+    browser_frame->SetTabDragKind(TabDragKind::kAllTabs);
   browser_frame->InitBrowserFrame();
 
   view->GetWidget()->non_client_view()->SetAccessibleName(
diff --git a/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.cc b/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.cc
index 6081799..26b4d1e 100644
--- a/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.cc
+++ b/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "chrome/browser/shell_integration_linux.h"
+#include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h"
 #include "chrome/browser/ui/views/frame/browser_frame.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/common/chrome_switches.h"
@@ -67,6 +68,10 @@
   return false;
 }
 
+void DesktopBrowserFrameAuraLinux::TabDraggingStatusChanged(bool is_dragging) {
+  host_->TabDraggingStatusChanged(is_dragging);
+}
+
 void DesktopBrowserFrameAuraLinux::OnUseCustomChromeFrameChanged() {
   // Tell the window manager to add or remove system borders.
   browser_frame()->set_frame_type(UseCustomFrame()
diff --git a/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h b/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h
index 39e94ba..ca9223c 100644
--- a/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h
+++ b/chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h
@@ -9,18 +9,23 @@
 #include "chrome/browser/ui/views/frame/desktop_browser_frame_aura.h"
 #include "components/prefs/pref_member.h"
 
+class BrowserDesktopWindowTreeHostLinux;
+
 // Provides the window frame for the Chrome browser window on Desktop Linux/X11.
 class DesktopBrowserFrameAuraLinux : public DesktopBrowserFrameAura {
  public:
   DesktopBrowserFrameAuraLinux(BrowserFrame* browser_frame,
                                BrowserView* browser_view);
 
+  void set_host(BrowserDesktopWindowTreeHostLinux* host) { host_ = host; }
+
  protected:
   ~DesktopBrowserFrameAuraLinux() override;
 
   // Overridden from NativeBrowserFrame:
   views::Widget::InitParams GetWidgetParams() override;
   bool UseCustomFrame() const override;
+  void TabDraggingStatusChanged(bool is_dragging) override;
 
  private:
   // Called when the preference changes.
@@ -29,6 +34,8 @@
   // Whether the custom Chrome frame preference is set.
   BooleanPrefMember use_custom_frame_pref_;
 
+  BrowserDesktopWindowTreeHostLinux* host_ = nullptr;
+
   DISALLOW_COPY_AND_ASSIGN(DesktopBrowserFrameAuraLinux);
 };
 
diff --git a/chrome/browser/ui/views/frame/native_browser_frame.h b/chrome/browser/ui/views/frame/native_browser_frame.h
index a7c4867..cc04154 100644
--- a/chrome/browser/ui/views/frame/native_browser_frame.h
+++ b/chrome/browser/ui/views/frame/native_browser_frame.h
@@ -49,6 +49,9 @@
   virtual bool HandleKeyboardEvent(
       const content::NativeWebKeyboardEvent& event) = 0;
 
+  // Called when the window starts or stops moving because of a tab drag.
+  virtual void TabDraggingStatusChanged(bool is_dragging) {}
+
  protected:
   friend class BrowserFrame;
 
diff --git a/chrome/browser/ui/views/linux_ui/linux_ui_factory.cc b/chrome/browser/ui/views/linux_ui/linux_ui_factory.cc
deleted file mode 100644
index ed7f61a..0000000
--- a/chrome/browser/ui/views/linux_ui/linux_ui_factory.cc
+++ /dev/null
@@ -1,15 +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 "chrome/browser/ui/views/linux_ui/linux_ui_factory.h"
-
-namespace views {
-
-LinuxUI* BuildLinuxUI() {
-  // Users can use their own implementations of LinuxUI. By default, if the gtk
-  // is not available, the LinuxUI is not used.
-  return nullptr;
-}
-
-}  // namespace views
diff --git a/chrome/browser/ui/views/linux_ui/linux_ui_factory.h b/chrome/browser/ui/views/linux_ui/linux_ui_factory.h
deleted file mode 100644
index 882549a..0000000
--- a/chrome/browser/ui/views/linux_ui/linux_ui_factory.h
+++ /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.
-
-#ifndef CHROME_BROWSER_UI_VIEWS_LINUX_UI_LINUX_UI_FACTORY_H_
-#define CHROME_BROWSER_UI_VIEWS_LINUX_UI_LINUX_UI_FACTORY_H_
-
-#include "ui/views/views_export.h"
-
-namespace views {
-
-class LinuxUI;
-
-VIEWS_EXPORT LinuxUI* BuildLinuxUI();
-
-}  // namespace views
-
-#endif  // CHROME_BROWSER_UI_VIEWS_LINUX_UI_LINUX_UI_FACTORY_H_
diff --git a/chrome/browser/ui/views/linux_ui/linux_ui_factory_gtk.cc b/chrome/browser/ui/views/linux_ui/linux_ui_factory_gtk.cc
deleted file mode 100644
index 578cde72..0000000
--- a/chrome/browser/ui/views/linux_ui/linux_ui_factory_gtk.cc
+++ /dev/null
@@ -1,15 +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 "chrome/browser/ui/views/linux_ui/linux_ui_factory.h"
-
-#include "chrome/browser/ui/gtk/gtk_ui.h"
-
-namespace views {
-
-LinuxUI* BuildLinuxUI() {
-  return BuildGtkUi();
-}
-
-}  // namespace views
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 d42a2bad..db85a4f 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
@@ -228,9 +228,12 @@
 operator=(Usage&&) = default;
 
 NativeFileSystemUsageBubbleView::FilePathListModel::FilePathListModel(
+    const views::View* owner,
     std::vector<base::FilePath> files,
     std::vector<base::FilePath> directories)
-    : files_(std::move(files)), directories_(std::move(directories)) {}
+    : owner_(owner),
+      files_(std::move(files)),
+      directories_(std::move(directories)) {}
 
 NativeFileSystemUsageBubbleView::FilePathListModel::~FilePathListModel() =
     default;
@@ -249,10 +252,12 @@
 
 gfx::ImageSkia NativeFileSystemUsageBubbleView::FilePathListModel::GetIcon(
     int row) {
+  const SkColor icon_color = owner_->GetNativeTheme()->GetSystemColor(
+      ui::NativeTheme::kColorId_DefaultIconColor);
   return gfx::CreateVectorIcon(size_t{row} < files_.size()
                                    ? vector_icons::kInsertDriveFileOutlineIcon
                                    : vector_icons::kFolderOpenIcon,
-                               kIconSize, gfx::kChromeIconGrey);
+                               kIconSize, icon_color);
 }
 
 base::string16 NativeFileSystemUsageBubbleView::FilePathListModel::GetTooltip(
@@ -330,9 +335,11 @@
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       origin_(origin),
       usage_(std::move(usage)),
-      readable_paths_model_(std::move(usage_.readable_files),
+      readable_paths_model_(this,
+                            std::move(usage_.readable_files),
                             std::move(usage_.readable_directories)),
-      writable_paths_model_(std::move(usage_.writable_files),
+      writable_paths_model_(this,
+                            std::move(usage_.writable_files),
                             std::move(usage_.writable_directories)) {
   DialogDelegate::SetButtonLabel(ui::DIALOG_BUTTON_OK,
                                  l10n_util::GetStringUTF16(IDS_DONE));
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h
index e4f5e07e..5199c428 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.h
@@ -38,7 +38,8 @@
  private:
   class FilePathListModel : public ui::TableModel {
    public:
-    FilePathListModel(std::vector<base::FilePath> files,
+    FilePathListModel(const views::View* view,
+                      std::vector<base::FilePath> files,
                       std::vector<base::FilePath> directories);
     ~FilePathListModel() override;
     // ui::TableModel:
@@ -49,6 +50,10 @@
     void SetObserver(ui::TableModelObserver*) override;
 
    private:
+    // The model needs access to the view it is in to access the correct theme
+    // for icon colors.
+    const views::View* const owner_;
+
     const std::vector<base::FilePath> files_;
     const std::vector<base::FilePath> directories_;
     DISALLOW_COPY_AND_ASSIGN(FilePathListModel);
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
index 0e89893b..7de3804 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -413,7 +413,7 @@
                                                tabstrip_->stacked_layout());
 }
 
-void BrowserTabStripController::OnStartedDragging() {
+void BrowserTabStripController::OnStartedDragging(bool dragging_window) {
   if (!immersive_reveal_lock_.get()) {
     // The top-of-window views should be revealed while the user is dragging
     // tabs in immersive fullscreen. The top-of-window views may not be already
@@ -424,12 +424,13 @@
             ImmersiveModeController::ANIMATE_REVEAL_NO));
   }
 
-  browser_view_->TabDraggingStatusChanged(/*is_dragging=*/true);
+  browser_view_->frame()->SetTabDragKind(dragging_window ? TabDragKind::kAllTabs
+                                                         : TabDragKind::kTab);
   // We also use fast resize for the source browser window as the source browser
   // window may also change bounds during dragging.
   BrowserView* source_browser_view = GetSourceBrowserViewInTabDragging();
   if (source_browser_view && source_browser_view != browser_view_)
-    source_browser_view->TabDraggingStatusChanged(/*is_dragging=*/true);
+    source_browser_view->frame()->SetTabDragKind(TabDragKind::kTab);
 }
 
 void BrowserTabStripController::OnStoppedDragging() {
@@ -439,9 +440,9 @@
   // Only reset the source window's fast resize bit after the entire drag
   // ends.
   if (browser_view_ != source_browser_view)
-    browser_view_->TabDraggingStatusChanged(/*is_dragging=*/false);
+    browser_view_->frame()->SetTabDragKind(TabDragKind::kNone);
   if (source_browser_view && !TabDragController::IsActive())
-    source_browser_view->TabDraggingStatusChanged(/*is_dragging=*/false);
+    source_browser_view->frame()->SetTabDragKind(TabDragKind::kNone);
 }
 
 void BrowserTabStripController::OnKeyboardFocusedTabChanged(
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
index 1014fad..2e569c9 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -83,7 +83,7 @@
   void CreateNewTab() override;
   void CreateNewTabWithLocation(const base::string16& loc) override;
   void StackedLayoutMaybeChanged() override;
-  void OnStartedDragging() override;
+  void OnStartedDragging(bool dragging_window) override;
   void OnStoppedDragging() override;
   void OnKeyboardFocusedTabChanged(base::Optional<int> index) override;
   base::string16 GetGroupTitle(
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
index 7056910..32da593 100644
--- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
@@ -216,7 +216,7 @@
 void FakeBaseTabStripController::StackedLayoutMaybeChanged() {
 }
 
-void FakeBaseTabStripController::OnStartedDragging() {}
+void FakeBaseTabStripController::OnStartedDragging(bool dragging_window) {}
 
 void FakeBaseTabStripController::OnStoppedDragging() {}
 
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
index f0fdf98c2..8638e3d 100644
--- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
@@ -56,7 +56,7 @@
   void CreateNewTab() override;
   void CreateNewTabWithLocation(const base::string16& loc) override;
   void StackedLayoutMaybeChanged() override;
-  void OnStartedDragging() override;
+  void OnStartedDragging(bool dragging_window) override;
   void OnStoppedDragging() override;
   void OnKeyboardFocusedTabChanged(base::Optional<int> index) override;
   base::string16 GetGroupTitle(
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
index a8f5f6e..061f15c9 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -106,6 +106,13 @@
 #include "base/mac/mac_util.h"
 #endif
 
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+#include "chrome/browser/ui/views/frame/desktop_browser_frame_aura_linux.h"
+#define DESKTOP_BROWSER_FRAME_AURA DesktopBrowserFrameAuraLinux
+#else
+#define DESKTOP_BROWSER_FRAME_AURA DesktopBrowserFrameAura
+#endif
+
 using content::WebContents;
 using display::Display;
 using ui_test_utils::GetDisplays;
@@ -311,12 +318,11 @@
 // synthesize this scenario.
 
 // Allows making ClearNativeFocus() invoke ReleaseCapture().
-class TestDesktopBrowserFrameAura : public DesktopBrowserFrameAura {
+class TestDesktopBrowserFrameAura : public DESKTOP_BROWSER_FRAME_AURA {
  public:
-  TestDesktopBrowserFrameAura(
-      BrowserFrame* browser_frame,
-      BrowserView* browser_view)
-      : DesktopBrowserFrameAura(browser_frame, browser_view),
+  TestDesktopBrowserFrameAura(BrowserFrame* browser_frame,
+                              BrowserView* browser_view)
+      : DESKTOP_BROWSER_FRAME_AURA(browser_frame, browser_view),
         release_capture_(false) {}
   ~TestDesktopBrowserFrameAura() override {}
 
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc
index a5db2af..21e62f0 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -653,7 +653,8 @@
 
   void StartedDragging(const std::vector<TabSlotView*>& views) override {
     // Let the controller know that the user started dragging tabs.
-    tab_strip_->controller_->OnStartedDragging();
+    tab_strip_->controller_->OnStartedDragging(
+        views.size() == static_cast<size_t>(tab_strip_->GetModelCount()));
 
     // Hide the new tab button immediately if we didn't originate the drag.
     if (!drag_controller_)
diff --git a/chrome/browser/ui/views/tabs/tab_strip_controller.h b/chrome/browser/ui/views/tabs/tab_strip_controller.h
index e097168..a9c8980 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/tab_strip_controller.h
@@ -124,7 +124,9 @@
   virtual void StackedLayoutMaybeChanged() = 0;
 
   // Notifies controller that the user started dragging this tabstrip's tabs.
-  virtual void OnStartedDragging() = 0;
+  // |dragging_window| indicates if the whole window is moving, or if tabs are
+  // moving within a window.
+  virtual void OnStartedDragging(bool dragging_window) = 0;
 
   // Notifies controller that the user stopped dragging this tabstrip's tabs.
   // This is also called when the tabs that the user is dragging were detached
diff --git a/chrome/browser/ui/webui/certificates_handler.cc b/chrome/browser/ui/webui/certificates_handler.cc
index e08cec62..c5454568 100644
--- a/chrome/browser/ui/webui/certificates_handler.cc
+++ b/chrome/browser/ui/webui/certificates_handler.cc
@@ -278,7 +278,11 @@
       use_hardware_backed_(false),
       file_access_provider_(base::MakeRefCounted<FileAccessProvider>()) {}
 
-CertificatesHandler::~CertificatesHandler() {}
+CertificatesHandler::~CertificatesHandler() {
+  if (select_file_dialog_.get())
+    select_file_dialog_->ListenerDestroyed();
+  select_file_dialog_ = nullptr;
+}
 
 void CertificatesHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc
index 37f9c8b..29bf745e 100644
--- a/chrome/service/service_utility_process_host.cc
+++ b/chrome/service/service_utility_process_host.cc
@@ -250,7 +250,7 @@
 
   base::MappedReadOnlyRegion memory =
       base::ReadOnlySharedMemoryRegion::Create(size);
-  if (!memory.region.IsValid() || !memory.mapping.IsValid())
+  if (!memory.IsValid())
     return false;
 
   int result =
@@ -523,7 +523,7 @@
     return false;
   }
   printing::Emf emf;
-  if (!emf.InitFromData(mapping.memory(), mapping.size())) {
+  if (!emf.InitFromData(mapping.GetMemoryAsSpan<const uint8_t>())) {
     OnRenderPDFPagesToMetafileDone(false);
     return false;
   }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 730a8fd..6087c40 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -509,6 +509,7 @@
       "../browser/engagement/important_sites_util_browsertest.cc",
       "../browser/games/games_service_browsertest.cc",
       "../browser/metrics/metrics_service_user_demographics_browsertest.cc",
+      "../browser/net/cert_verify_proc_browsertest.cc",
       "../browser/profiles/profile_browsertest_android.cc",
       "../browser/ssl/crlset_browsertest.cc",
       "android/browsertests_apk/android_browsertests_jni_onload.cc",
@@ -982,6 +983,7 @@
       "../browser/navigation_predictor/navigation_predictor_browsertest.cc",
       "../browser/navigation_predictor/navigation_predictor_preconnect_client_browsertest.cc",
       "../browser/navigation_predictor/search_engine_preconnector_browsertest.cc",
+      "../browser/net/cert_verify_proc_browsertest.cc",
       "../browser/net/chrome_accept_header_browsertest.cc",
       "../browser/net/chrome_mojo_proxy_resolver_factory_browsertest.cc",
       "../browser/net/chrome_network_delegate_browsertest.cc",
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc
index 5c546cc9..9f28b4e 100644
--- a/chrome/test/base/testing_profile.cc
+++ b/chrome/test/base/testing_profile.cc
@@ -94,11 +94,11 @@
 #include "components/policy/core/common/policy_service.h"
 #include "components/policy/core/common/policy_service_impl.h"
 #include "components/policy/core/common/schema.h"
+#include "components/prefs/pref_notifier_impl.h"
 #include "components/prefs/testing_pref_store.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
 #include "components/sync/model/fake_sync_change_processor.h"
 #include "components/sync/model/sync_error_factory_mock.h"
-#include "components/sync_preferences/pref_service_mock_factory.h"
 #include "components/sync_preferences/pref_service_syncable.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "components/user_prefs/user_prefs.h"
@@ -153,7 +153,6 @@
 
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
 #include "chrome/browser/supervised_user/supervised_user_constants.h"
-#include "chrome/browser/supervised_user/supervised_user_pref_store.h"
 #include "chrome/browser/supervised_user/supervised_user_settings_service.h"
 #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
 #endif
@@ -417,8 +416,8 @@
   if (!IsOffTheRecord()) {
     SupervisedUserSettingsService* settings_service =
         SupervisedUserSettingsServiceFactory::GetForKey(key_.get());
-    TestingPrefStore* store = new TestingPrefStore();
-    settings_service->Init(store);
+    supervised_user_pref_store_ = new TestingPrefStore();
+    settings_service->Init(supervised_user_pref_store_);
     settings_service->MergeDataAndStartSyncing(
         syncer::SUPERVISED_USER_SETTINGS, syncer::SyncDataList(),
         std::unique_ptr<syncer::SyncChangeProcessor>(
@@ -426,7 +425,7 @@
         std::unique_ptr<syncer::SyncErrorFactory>(
             new syncer::SyncErrorFactoryMock));
 
-    store->SetInitializationCompleted();
+    supervised_user_pref_store_->SetInitializationCompleted();
   }
 #endif
 
@@ -852,20 +851,17 @@
 void TestingProfile::CreatePrefServiceForSupervisedUser() {
   DCHECK(!prefs_.get());
   DCHECK(!supervised_user_id_.empty());
-  sync_preferences::PrefServiceMockFactory factory;
-  SupervisedUserSettingsService* supervised_user_settings =
-      SupervisedUserSettingsServiceFactory::GetForKey(GetProfileKey());
-  scoped_refptr<PrefStore> supervised_user_prefs =
-      base::MakeRefCounted<SupervisedUserPrefStore>(supervised_user_settings);
 
-  factory.set_supervised_user_prefs(supervised_user_prefs);
-
-  scoped_refptr<user_prefs::PrefRegistrySyncable> registry(
-      new user_prefs::PrefRegistrySyncable);
-
-  prefs_ = factory.CreateSyncable(registry.get());
-  RegisterUserProfilePrefs(registry.get());
+  // Construct testing_prefs_ by hand to add the supervised user pref store.
+  testing_prefs_ = new sync_preferences::TestingPrefServiceSyncable(
+      /*managed_prefs=*/new TestingPrefStore, supervised_user_pref_store_,
+      /*extension_prefs=*/new TestingPrefStore,
+      /*user_prefs=*/new TestingPrefStore,
+      /*recommended_prefs=*/new TestingPrefStore,
+      new user_prefs::PrefRegistrySyncable, new PrefNotifierImpl);
+  prefs_.reset(testing_prefs_);
   user_prefs::UserPrefs::Set(this, prefs_.get());
+  RegisterUserProfilePrefs(testing_prefs_->registry());
 }
 #endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS)
 
diff --git a/chrome/test/base/testing_profile.h b/chrome/test/base/testing_profile.h
index 6cffd0c..7de6198 100644
--- a/chrome/test/base/testing_profile.h
+++ b/chrome/test/base/testing_profile.h
@@ -36,6 +36,7 @@
 class SimpleDependencyManager;
 class ExtensionSpecialStoragePolicy;
 class HostContentSettingsMap;
+class TestingPrefStore;
 
 namespace content {
 class MockResourceContext;
@@ -500,6 +501,10 @@
 #endif  // defined(OS_CHROMEOS)
 
   std::unique_ptr<policy::PolicyService> policy_service_;
+
+#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+  TestingPrefStore* supervised_user_pref_store_ = nullptr;
+#endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS)
 };
 
 #endif  // CHROME_TEST_BASE_TESTING_PROFILE_H_
diff --git a/chrome/test/data/pdf/basic_plugin_test.js b/chrome/test/data/pdf/basic_plugin_test.js
index 34e7fa14..0c2e7c4 100644
--- a/chrome/test/data/pdf/basic_plugin_test.js
+++ b/chrome/test/data/pdf/basic_plugin_test.js
@@ -59,6 +59,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/beep_test.js b/chrome/test/data/pdf/beep_test.js
index 6e0de30e..9865f3f 100644
--- a/chrome/test/data/pdf/beep_test.js
+++ b/chrome/test/data/pdf/beep_test.js
@@ -15,6 +15,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/bookmarks_test.js b/chrome/test/data/pdf/bookmarks_test.js
index 3c139752..b3c3bf0 100644
--- a/chrome/test/data/pdf/bookmarks_test.js
+++ b/chrome/test/data/pdf/bookmarks_test.js
@@ -132,6 +132,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/layout_test.js b/chrome/test/data/pdf/layout_test.js
index 5d31083..52c37cf 100644
--- a/chrome/test/data/pdf/layout_test.js
+++ b/chrome/test/data/pdf/layout_test.js
@@ -45,7 +45,7 @@
 };
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback((success) => {
+scriptingAPI.setLoadCompleteCallback((success) => {
   if (success && document.title in perLayoutTests) {
     chrome.test.runTests(tests.concat(perLayoutTests[document.title]));
   } else {
diff --git a/chrome/test/data/pdf/navigator_test.js b/chrome/test/data/pdf/navigator_test.js
index 451d25a..4cc307f 100644
--- a/chrome/test/data/pdf/navigator_test.js
+++ b/chrome/test/data/pdf/navigator_test.js
@@ -262,6 +262,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/nobeep_test.js b/chrome/test/data/pdf/nobeep_test.js
index 012350f..0bd9c64 100644
--- a/chrome/test/data/pdf/nobeep_test.js
+++ b/chrome/test/data/pdf/nobeep_test.js
@@ -15,6 +15,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/params_parser_test.js b/chrome/test/data/pdf/params_parser_test.js
index 5886f22..ee71ae3d 100644
--- a/chrome/test/data/pdf/params_parser_test.js
+++ b/chrome/test/data/pdf/params_parser_test.js
@@ -150,6 +150,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/redirects_fail_test.js b/chrome/test/data/pdf/redirects_fail_test.js
index 0f64490..331e4dea 100644
--- a/chrome/test/data/pdf/redirects_fail_test.js
+++ b/chrome/test/data/pdf/redirects_fail_test.js
@@ -77,6 +77,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/title_test.js b/chrome/test/data/pdf/title_test.js
index 1ecc07d4..6a8d97c2a 100644
--- a/chrome/test/data/pdf/title_test.js
+++ b/chrome/test/data/pdf/title_test.js
@@ -16,6 +16,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/touch_handling_test.js b/chrome/test/data/pdf/touch_handling_test.js
index 5a96291..f4b8368 100644
--- a/chrome/test/data/pdf/touch_handling_test.js
+++ b/chrome/test/data/pdf/touch_handling_test.js
@@ -76,6 +76,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/pdf/whitespace_title_test.js b/chrome/test/data/pdf/whitespace_title_test.js
index fa32e92..7e25ecf 100644
--- a/chrome/test/data/pdf/whitespace_title_test.js
+++ b/chrome/test/data/pdf/whitespace_title_test.js
@@ -16,6 +16,6 @@
 ];
 
 const scriptingAPI = new PDFScriptingAPI(window, window);
-scriptingAPI.setLoadCallback(function() {
+scriptingAPI.setLoadCompleteCallback(function() {
   chrome.test.runTests(tests);
 });
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 7ade8d6..538476e53 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -47,9 +47,11 @@
     "$root_gen_dir/chrome/test/data/webui/cr_focus_row_behavior_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/mock_controller.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/people_page_sync_page_interactive_test.m.js",
+    "$root_gen_dir/chrome/test/data/webui/settings/secure_dns_interactive_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/settings_animated_pages_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/settings_ui_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/sync_test_util.m.js",
+    "$root_gen_dir/chrome/test/data/webui/settings/test_privacy_page_browser_proxy.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/test_sync_browser_proxy.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/test_util.m.js",
     "$root_gen_dir/chrome/test/data/webui/test_browser_proxy.m.js",
@@ -225,8 +227,10 @@
     "$root_gen_dir/chrome/test/data/webui/settings/chooser_exception_list_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/chooser_exception_list_entry_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/clear_browsing_data_test.m.js",
+    "$root_gen_dir/chrome/test/data/webui/settings/collapse_radio_button_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/controlled_button_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/controlled_radio_button_tests.m.js",
+    "$root_gen_dir/chrome/test/data/webui/settings/do_not_track_toggle_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/downloads_page_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/dropdown_menu_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/edit_dictionary_page_test.m.js",
@@ -242,6 +246,7 @@
     "$root_gen_dir/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/passwords_export_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/passwords_section_test.m.js",
+    "$root_gen_dir/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/payments_section_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/people_page_sync_controls_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/people_page_sync_page_test.m.js",
@@ -257,6 +262,8 @@
     "$root_gen_dir/chrome/test/data/webui/settings/search_page_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/search_settings_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/security_keys_subpage_test.m.js",
+    "$root_gen_dir/chrome/test/data/webui/settings/security_page_test.m.js",
+    "$root_gen_dir/chrome/test/data/webui/settings/secure_dns_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/settings_main_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/settings_menu_test.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/settings_slider_tests.m.js",
diff --git a/chrome/test/data/webui/media/media_feeds_webui_browsertest.js b/chrome/test/data/webui/media/media_feeds_webui_browsertest.js
index 72c293b..65e2a405a 100644
--- a/chrome/test/data/webui/media/media_feeds_webui_browsertest.js
+++ b/chrome/test/data/webui/media/media_feeds_webui_browsertest.js
@@ -6,6 +6,10 @@
  * @fileoverview Test suite for the Media Feeds WebUI.
  */
 
+const EXAMPLE_URL_1 = 'http://example.com/feed.json';
+
+GEN('#include "base/run_loop.h"');
+GEN('#include "chrome/browser/media/history/media_history_keyed_service.h"');
 GEN('#include "chrome/browser/ui/browser.h"');
 GEN('#include "media/base/media_switches.h"');
 
@@ -20,6 +24,97 @@
 
   isAsync: true,
 
+  testGenPreamble: function() {
+    GEN('auto* service =');
+    GEN('  media_history::MediaHistoryKeyedService::Get(');
+    GEN('    browser()->profile());');
+    GEN('service->DiscoverMediaFeed(GURL("' + EXAMPLE_URL_1 + '"));');
+    GEN('auto items = std::vector<media_feeds::mojom::MediaFeedItemPtr>();');
+    GEN('auto item = media_feeds::mojom::MediaFeedItem::New();');
+    GEN('item->name = base::ASCIIToUTF16("The Movie");');
+    GEN('item->type = media_feeds::mojom::MediaFeedItemType::kMovie;');
+    GEN('item->date_published = base::Time::FromDeltaSinceWindowsEpoch(');
+    GEN('  base::TimeDelta::FromMinutes(10));');
+    GEN('item->is_family_friendly = true;');
+    GEN('item->action_status =');
+    GEN('  media_feeds::mojom::MediaFeedItemActionStatus::kPotential;');
+    GEN('item->genre = base::ASCIIToUTF16("test");');
+    GEN('item->duration = base::TimeDelta::FromSeconds(30);');
+    GEN('item->live = media_feeds::mojom::LiveDetails::New();');
+    GEN('item->live->start_time = base::Time::FromDeltaSinceWindowsEpoch(');
+    GEN('  base::TimeDelta::FromMinutes(20));');
+    GEN('item->live->end_time = base::Time::FromDeltaSinceWindowsEpoch(');
+    GEN('  base::TimeDelta::FromMinutes(30));');
+    GEN('item->shown_count = 3;');
+    GEN('item->clicked = true;');
+    GEN('item->author = media_feeds::mojom::Author::New();');
+    GEN('item->author->name = "Media Site";');
+    GEN('item->author->url = GURL("https://www.example.com");');
+    GEN('item->action = media_feeds::mojom::Action::New();');
+    GEN('item->action->start_time = base::TimeDelta::FromSeconds(3);');
+    GEN('item->action->url = GURL("https://www.example.com");');
+    GEN('item->interaction_counters.emplace(');
+    GEN('  media_feeds::mojom::InteractionCounterType::kLike, 10000);');
+    GEN('item->interaction_counters.emplace(');
+    GEN('  media_feeds::mojom::InteractionCounterType::kDislike, 20000);');
+    GEN('item->interaction_counters.emplace(');
+    GEN('  media_feeds::mojom::InteractionCounterType::kWatch, 30000);');
+    GEN('item->content_ratings.push_back(');
+    GEN('  media_feeds::mojom::ContentRating::New("MPAA", "PG-13"));');
+    GEN('item->content_ratings.push_back(');
+    GEN('  media_feeds::mojom::ContentRating::New("agency", "TEST2"));');
+    GEN('item->identifiers.push_back(');
+    GEN('  media_feeds::mojom::Identifier::New(');
+    GEN('    media_feeds::mojom::Identifier::Type::kPartnerId, "TEST1"));');
+    GEN('item->identifiers.push_back(');
+    GEN('  media_feeds::mojom::Identifier::New(');
+    GEN('    media_feeds::mojom::Identifier::Type::kTMSId, "TEST2"));');
+    GEN('item->tv_episode = media_feeds::mojom::TVEpisode::New();');
+    GEN('item->tv_episode->name = "TV Episode Name";');
+    GEN('item->tv_episode->season_number = 1;');
+    GEN('item->tv_episode->episode_number = 2;');
+    GEN('item->tv_episode->identifiers.push_back(');
+    GEN('  media_feeds::mojom::Identifier::New(');
+    GEN('    media_feeds::mojom::Identifier::Type::kPartnerId, "TEST3"));');
+    GEN('item->play_next_candidate = ');
+    GEN('    media_feeds::mojom::PlayNextCandidate::New();');
+    GEN('item->play_next_candidate->name = "Next TV Episode Name";');
+    GEN('item->play_next_candidate->season_number = 1;');
+    GEN('item->play_next_candidate->episode_number = 3;');
+    GEN('item->play_next_candidate->duration =');
+    GEN('    base::TimeDelta::FromSeconds(10);');
+    GEN('item->play_next_candidate->action = ');
+    GEN('    media_feeds::mojom::Action::New();');
+    GEN('item->play_next_candidate->action->start_time =');
+    GEN('    base::TimeDelta::FromSeconds(3);');
+    GEN('item->play_next_candidate->action->url = ');
+    GEN('    GURL("https://www.example.com");');
+    GEN('item->play_next_candidate->identifiers.push_back(');
+    GEN('  media_feeds::mojom::Identifier::New(');
+    GEN('    media_feeds::mojom::Identifier::Type::kPartnerId, "TEST4"));');
+    GEN('media_session::MediaImage image1;');
+    GEN('image1.src = GURL("https://www.example.org/image1.png");');
+    GEN('item->images.push_back(image1);');
+    GEN('media_session::MediaImage image2;');
+    GEN('image2.src = GURL("https://www.example.org/image2.png");');
+    GEN('item->images.push_back(image2);');
+    GEN('items.push_back(std::move(item));');
+    GEN('std::vector<media_session::MediaImage> logos;');
+    GEN('media_session::MediaImage logo1;');
+    GEN('logo1.src = GURL("https://www.example.org/logo1.png");');
+    GEN('logos.push_back(logo1);');
+    GEN('media_session::MediaImage logo2;');
+    GEN('logo2.src = GURL("https://www.example.org/logo2.png");');
+    GEN('logos.push_back(logo2);');
+    GEN('service->StoreMediaFeedFetchResult(');
+    GEN('  1, std::move(items), media_feeds::mojom::FetchResult::kSuccess,');
+    GEN('  base::Time::FromDeltaSinceWindowsEpoch(');
+    GEN('  base::TimeDelta::FromMinutes(40)), logos, "Test Feed");');
+    GEN('base::RunLoop run_loop;');
+    GEN('service->PostTaskToDBForTest(run_loop.QuitClosure());');
+    GEN('run_loop.Run();');
+  },
+
   extraLibraries: [
     '//third_party/mocha/mocha.js',
     '//chrome/test/data/webui/mocha_adapter.js',
@@ -32,7 +127,7 @@
   });
 
   test('check feeds table is loaded', function() {
-    let feedHeaders =
+    const feedsHeaders =
         Array.from(document.querySelector('#feed-table-header').children);
 
     assertDeepEquals(
@@ -40,9 +135,93 @@
           'ID', 'Url', 'Display Name', 'Last Discovery Time', 'Last Fetch Time',
           'User Status', 'Last Fetch Result', 'Fetch Failed Count',
           'Cache Expiry Time', 'Last Fetch Item Count',
-          'Last Fetch Play Next Count', 'Last Fetch Content Types', 'Logos'
+          'Last Fetch Play Next Count', 'Last Fetch Content Types', 'Logos',
+          'Actions'
         ],
-        feedHeaders.map(x => x.textContent.trim()));
+        feedsHeaders.map(x => x.textContent.trim()));
+
+    const feedsContents =
+        document.querySelector('#feed-table-body').childNodes[0];
+
+    assertEquals('1', feedsContents.childNodes[0].textContent.trim());
+    assertEquals(EXAMPLE_URL_1, feedsContents.childNodes[1].textContent.trim());
+    assertEquals('Test Feed', feedsContents.childNodes[2].textContent.trim());
+    assertEquals('Auto', feedsContents.childNodes[5].textContent.trim());
+    assertEquals('Success', feedsContents.childNodes[6].textContent.trim());
+    assertEquals('0', feedsContents.childNodes[7].textContent.trim());
+    assertNotEquals('', feedsContents.childNodes[8].textContent.trim());
+    assertEquals('1', feedsContents.childNodes[9].textContent.trim());
+    assertEquals('1', feedsContents.childNodes[10].textContent.trim());
+    assertEquals('Movie', feedsContents.childNodes[11].textContent.trim());
+    assertEquals(
+        'https://www.example.org/logo1.pnghttps://www.example.org/logo2.png',
+        feedsContents.childNodes[12].textContent.trim());
+    assertEquals(
+        'Show Contents', feedsContents.childNodes[13].textContent.trim());
+
+    // Click on the show contents button.
+    feedsContents.childNodes[13].firstChild.click();
+
+    return whenFeedTableIsPopulatedForTest().then(() => {
+      assertEquals(
+          EXAMPLE_URL_1, document.querySelector('#current-feed').textContent);
+
+      const feedItemsHeaders = Array.from(
+          document.querySelector('#feed-items-table thead tr').children);
+
+      assertDeepEquals(
+          [
+            'Type', 'Name', 'Author', 'Date Published', 'Family Friendly',
+            'Action Status', 'Action URL', 'Action Start Time (secs)',
+            'Interaction Counters', 'Content Ratings', 'Genre', 'Live Details',
+            'TV Episode', 'Play Next Candidate', 'Identifiers', 'Shown Count',
+            'Clicked', 'Images'
+          ],
+          feedItemsHeaders.map(x => x.textContent.trim()));
+
+      const feedItemsContents =
+          document.querySelector('#feed-items-table tbody').childNodes[0];
+
+      assertEquals('Movie', feedItemsContents.childNodes[0].textContent.trim());
+      assertEquals(
+          'The Movie', feedItemsContents.childNodes[1].textContent.trim());
+      assertEquals(
+          'Media Site', feedItemsContents.childNodes[2].textContent.trim());
+      assertEquals(
+          '12/31/1600, 4:17:02 PM',
+          feedItemsContents.childNodes[3].textContent.trim());
+      assertEquals('Yes', feedItemsContents.childNodes[4].textContent.trim());
+      assertEquals(
+          'Potential', feedItemsContents.childNodes[5].textContent.trim());
+      assertEquals(
+          'https://www.example.com/',
+          feedItemsContents.childNodes[6].textContent.trim());
+      assertEquals('3', feedItemsContents.childNodes[7].textContent.trim());
+      assertEquals(
+          'Watch=30000 Like=10000 Dislike=20000',
+          feedItemsContents.childNodes[8].textContent.trim());
+      assertEquals(
+          'MPAA PG-13, agency TEST2',
+          feedItemsContents.childNodes[9].textContent.trim());
+      assertEquals('test', feedItemsContents.childNodes[10].textContent.trim());
+      assertEquals(
+          'Live StartTime=12/31/1600, 4:27:02 PM EndTime=12/31/1600, 4:37:02 PM',
+          feedItemsContents.childNodes[11].textContent.trim());
+      assertEquals(
+          'TV Episode Name EpisodeNumber=2 SeasonNumber=1 PartnerId=TEST3',
+          feedItemsContents.childNodes[12].textContent.trim());
+      assertEquals(
+          'Next TV Episode Name EpisodeNumber=3 SeasonNumber=1 PartnerId=TEST4 ActionURL=https://www.example.com/ ActionStartTimeSecs=3 DurationSecs=10',
+          feedItemsContents.childNodes[13].textContent.trim());
+      assertEquals(
+          'PartnerId=TEST1 TMSId=TEST2',
+          feedItemsContents.childNodes[14].textContent.trim());
+      assertEquals('3', feedItemsContents.childNodes[15].textContent.trim());
+      assertEquals('Yes', feedItemsContents.childNodes[16].textContent.trim());
+      assertEquals(
+          'https://www.example.org/image1.pnghttps://www.example.org/image2.png',
+          feedItemsContents.childNodes[17].textContent.trim());
+    });
   });
 
   mocha.run();
diff --git a/chrome/test/data/webui/print_preview/plugin_stub.js b/chrome/test/data/webui/print_preview/plugin_stub.js
index 99325f9..9df3222 100644
--- a/chrome/test/data/webui/print_preview/plugin_stub.js
+++ b/chrome/test/data/webui/print_preview/plugin_stub.js
@@ -13,7 +13,7 @@
     super(['loadPreviewPage']);
 
     /** @type {?Function} The callback to call on load. */
-    this.loadCallback_ = null;
+    this.loadCompleteCallback_ = null;
 
     /** @type {?Function} Callback to call before load. */
     this.preloadCallback_ = null;
@@ -34,12 +34,12 @@
   }
 
   /**
-   * @param {?Function} loadCallback Callback to call when the preview
+   * @param {?Function} loadCompleteCallback Callback to call when the preview
    *     loads.
    */
-  setLoadCallback(loadCallback) {
-    assert(!this.loadCallback_);
-    this.loadCallback_ = loadCallback;
+  setLoadCompleteCallback(loadCompleteCallback) {
+    assert(!this.loadCompleteCallback_);
+    this.loadCompleteCallback_ = loadCompleteCallback;
   }
 
   /**
@@ -116,7 +116,7 @@
 
   /**
    * Called when the preview area wants the plugin to load a preview page.
-   * Immediately calls loadCallback_().
+   * Immediately calls loadCompleteCallback_().
    * @param {number} previewUid The unique ID of the preview UI.
    * @param {number} pageIndex The page index to load.
    * @param {number} index The preview index.
@@ -128,8 +128,8 @@
     if (this.preloadCallback_) {
       this.preloadCallback_();
     }
-    if (this.loadCallback_) {
-      this.loadCallback_(true);
+    if (this.loadCompleteCallback_) {
+      this.loadCompleteCallback_(true);
     }
   }
 
diff --git a/chrome/test/data/webui/print_preview/print_button_test.js b/chrome/test/data/webui/print_preview/print_button_test.js
index 85ca3f0..6d8bb79 100644
--- a/chrome/test/data/webui/print_preview/print_button_test.js
+++ b/chrome/test/data/webui/print_preview/print_button_test.js
@@ -53,10 +53,10 @@
     page = document.createElement('print-preview-app');
     document.body.appendChild(page);
     pluginProxy.setPreloadCallback(() => {
-      // Print before calling previewArea.onPluginLoad_. This simulates the
-      // user clicking the print button while the preview is still loading,
-      // since previewArea.onPluginLoad_() indicates to the UI that the
-      // preview is ready.
+      // Print before calling previewArea.onPluginLoadComplete_(). This
+      // simulates the user clicking the print button while the preview is still
+      // loading, since previewArea.onPluginLoadComplete_() indicates to the UI
+      // that the preview is ready.
       if (printBeforePreviewReady) {
         const sidebar = page.$$('print-preview-sidebar');
         const parentElement = sidebar.$$('print-preview-button-strip');
diff --git a/chrome/test/data/webui/print_preview/restore_state_test.js b/chrome/test/data/webui/print_preview/restore_state_test.js
index d64f928..c0ccf1528 100644
--- a/chrome/test/data/webui/print_preview/restore_state_test.js
+++ b/chrome/test/data/webui/print_preview/restore_state_test.js
@@ -308,7 +308,7 @@
     document.body.appendChild(page);
     const previewArea = page.$$('print-preview-preview-area');
     previewArea.plugin_ =
-        new PDFPluginStub(previewArea.onPluginLoad_.bind(previewArea));
+        new PDFPluginStub(previewArea.onPluginLoadComplete_.bind(previewArea));
 
     return nativeLayer.whenCalled('getInitialSettings')
         .then(function() {
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn
index 3765ef09..16803db 100644
--- a/chrome/test/data/webui/settings/BUILD.gn
+++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -21,8 +21,10 @@
     "chooser_exception_list_entry_tests.js",
     "chooser_exception_list_tests.js",
     "clear_browsing_data_test.js",
+    "collapse_radio_button_tests.js",
     "controlled_button_tests.js",
     "controlled_radio_button_tests.js",
+    "do_not_track_toggle_test.js",
     "downloads_page_test.js",
     "dropdown_menu_tests.js",
     "edit_dictionary_page_test.js",
@@ -34,6 +36,7 @@
     "languages_page_tests.js",
     "languages_tests.js",
     "on_startup_page_tests.js",
+    "passwords_leak_detection_toggle_test.js",
     "passwords_and_autofill_fake_data.js",
     "passwords_export_test.js",
     "password_check_test.js",
@@ -54,6 +57,9 @@
     "search_page_test.js",
     "search_settings_test.js",
     "security_keys_subpage_test.js",
+    "security_page_test.js",
+    "secure_dns_test.js",
+    "secure_dns_interactive_test.js",
     "settings_animated_pages_test.js",
     "settings_main_test.js",
     "settings_menu_test.js",
diff --git a/chrome/test/data/webui/settings/collapse_radio_button_tests.js b/chrome/test/data/webui/settings/collapse_radio_button_tests.js
index 8ffe9a2f..76f021d 100644
--- a/chrome/test/data/webui/settings/collapse_radio_button_tests.js
+++ b/chrome/test/data/webui/settings/collapse_radio_button_tests.js
@@ -2,6 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import 'chrome://settings/lazy_load.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {isChildVisible} from 'chrome://test/test_util.m.js';
+// #import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.m.js';
+// clang-format on
+
 suite('CrCollapseRadioButton', function() {
   /** @type {SettingsCollapseRadioButtonElement} */
   let collapseRadioButton;
diff --git a/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js b/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js
index b059f1069..b538bc18 100644
--- a/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js
@@ -286,14 +286,17 @@
  ['Checkbox', 'checkbox_tests.m.js'],
  ['ChooserExceptionList', 'chooser_exception_list_tests.m.js'],
  ['ChooserExceptionListEntry', 'chooser_exception_list_entry_tests.m.js'],
+ ['CollapseRadioButton', 'collapse_radio_button_tests.m.js'],
  ['ControlledButton', 'controlled_button_tests.m.js'],
  ['ControlledRadioButton', 'controlled_radio_button_tests.m.js'],
+ ['DoNotTrackToggle', 'do_not_track_toggle_test.m.js'],
  ['DownloadsPage', 'downloads_page_test.m.js'],
  ['DropdownMenu', 'dropdown_menu_tests.m.js'],
  ['ExtensionControlledIndicator', 'extension_controlled_indicator_tests.m.js'],
  ['Languages', 'languages_tests.m.js'],
  ['Menu', 'settings_menu_test.m.js'],
  ['OnStartupPage', 'on_startup_page_tests.m.js'],
+ ['PasswordsLeakDetectionToggle', 'passwords_leak_detection_toggle_test.m.js'],
  ['PaymentsSection', 'payments_section_test.m.js'],
  ['PeoplePage', 'people_page_test.m.js'],
  ['PeoplePageSyncControls', 'people_page_sync_controls_test.m.js'],
@@ -307,6 +310,8 @@
  ['SearchPage', 'search_page_test.m.js'],
  ['Search', 'search_settings_test.m.js'],
  ['SecurityKeysSubpage', 'security_keys_subpage_test.m.js'],
+ ['SecurityPage', 'security_page_test.m.js'],
+ ['SecureDns', 'secure_dns_test.m.js'],
  // Copied from P2 test: Disabled for flakiness, see https://crbug.com/1061249
  ['SiteData', 'site_data_test.m.js', 'DISABLED_All'],
  ['SiteDataDetails', 'site_data_details_subpage_tests.m.js'],
diff --git a/chrome/test/data/webui/settings/cr_settings_v3_interactive_ui_tests.js b/chrome/test/data/webui/settings/cr_settings_v3_interactive_ui_tests.js
index 2434010..d53c85d 100644
--- a/chrome/test/data/webui/settings/cr_settings_v3_interactive_ui_tests.js
+++ b/chrome/test/data/webui/settings/cr_settings_v3_interactive_ui_tests.js
@@ -50,6 +50,18 @@
 });
 
 // eslint-disable-next-line no-var
+var CrSettingsSecureDnsV3Test = class extends CrSettingsV3InteractiveUITest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://settings/test_loader.html?module=settings/secure_dns_interactive_test.m.js';
+  }
+};
+
+TEST_F('CrSettingsSecureDnsV3Test', 'All', function() {
+  mocha.run();
+});
+
+// eslint-disable-next-line no-var
 var SettingsUIV3InteractiveTest = class extends CrSettingsV3InteractiveUITest {
   /** @override */
   get browsePreload() {
diff --git a/chrome/test/data/webui/settings/do_not_track_toggle_test.js b/chrome/test/data/webui/settings/do_not_track_toggle_test.js
index f08a3d0..017adb0 100644
--- a/chrome/test/data/webui/settings/do_not_track_toggle_test.js
+++ b/chrome/test/data/webui/settings/do_not_track_toggle_test.js
@@ -2,6 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from 'chrome://settings/settings.js';
+// #import {TestMetricsBrowserProxy} from 'chrome://test/settings/test_metrics_browser_proxy.m.js';
+// clang-format on
+
 suite('CrSettingsDoNotTrackToggleTest', function() {
   /** @type {settings.TestMetricsBrowserProxy} */
   let testMetricsBrowserProxy;
diff --git a/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.js b/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.js
index aca8711..94af2b7 100644
--- a/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.js
+++ b/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.js
@@ -2,6 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {MetricsBrowserProxyImpl, PrivacyElementInteractions} from 'chrome://settings/settings.js';
+// #import {TestMetricsBrowserProxy} from 'chrome://test/settings/test_metrics_browser_proxy.m.js';
+// #import {PrivacyPageBrowserProxyImpl, StatusAction, SyncBrowserProxyImpl} from 'chrome://settings/settings.js';
+// #import {TestPrivacyPageBrowserProxy} from 'chrome://test/settings/test_privacy_page_browser_proxy.m.js';
+// #import {TestSyncBrowserProxy} from 'chrome://test/settings/test_sync_browser_proxy.m.js';
+// #import {isChromeOS} from 'chrome://resources/js/cr.m.js';
+// #import {simulateStoredAccounts} from 'chrome://test/settings/sync_test_util.m.js';
+// clang-format on
+
 suite('CrSettingsPasswordsLeakDetectionToggleTest', function() {
   /** @type {settings.TestMetricsBrowserProxy} */
   let testMetricsBrowserProxy;
diff --git a/chrome/test/data/webui/settings/secure_dns_interactive_test.js b/chrome/test/data/webui/settings/secure_dns_interactive_test.js
index 1d265f7..dc3d479 100644
--- a/chrome/test/data/webui/settings/secure_dns_interactive_test.js
+++ b/chrome/test/data/webui/settings/secure_dns_interactive_test.js
@@ -7,6 +7,15 @@
  * secure-dns-input interactively.
  */
 
+// clang-format off
+// #import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+// #import {TestPrivacyPageBrowserProxy} from 'chrome://test/settings/test_privacy_page_browser_proxy.m.js';
+// #import {PrivacyPageBrowserProxyImpl, SecureDnsMode, SecureDnsUiManagementMode} from 'chrome://settings/settings.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {flushTasks} from 'chrome://test/test_util.m.js';
+// #import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
+// clang-format on
+
 suite('SettingsSecureDnsInputInteractive', function() {
   /** @type {SecureDnsInputElement} */
   let testElement;
diff --git a/chrome/test/data/webui/settings/secure_dns_test.js b/chrome/test/data/webui/settings/secure_dns_test.js
index de85940..129f8b1 100644
--- a/chrome/test/data/webui/settings/secure_dns_test.js
+++ b/chrome/test/data/webui/settings/secure_dns_test.js
@@ -7,6 +7,14 @@
  * secure-dns-input.
  */
 
+// clang-format off
+// #import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+// #import {TestPrivacyPageBrowserProxy} from 'chrome://test/settings/test_privacy_page_browser_proxy.m.js';
+// #import {PrivacyPageBrowserProxyImpl, SecureDnsMode, SecureDnsUiManagementMode} from 'chrome://settings/settings.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {flushTasks} from 'chrome://test/test_util.m.js';
+// clang-format on
+
 suite('SettingsSecureDnsInput', function() {
   /** @type {settings.TestPrivacyPageBrowserProxy} */
   let testBrowserProxy;
diff --git a/chrome/test/data/webui/settings/security_page_test.js b/chrome/test/data/webui/settings/security_page_test.js
index a75f867..2788e039 100644
--- a/chrome/test/data/webui/settings/security_page_test.js
+++ b/chrome/test/data/webui/settings/security_page_test.js
@@ -2,6 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import 'chrome://settings/lazy_load.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {PrivacyPageBrowserProxyImpl, SyncBrowserProxyImpl, MetricsBrowserProxyImpl, PrivacyElementInteractions} from 'chrome://settings/settings.js';
+// #import {TestMetricsBrowserProxy} from 'chrome://test/settings/test_metrics_browser_proxy.m.js';
+// #import {TestSyncBrowserProxy} from 'chrome://test/settings/test_sync_browser_proxy.m.js';
+// #import {TestPrivacyPageBrowserProxy} from 'chrome://test/settings/test_privacy_page_browser_proxy.m.js';
+// #import {isMac, isWindows} from 'chrome://resources/js/cr.m.js';
+// clang-format on
+
 suite('CrSettingsSecurityPageTest', function() {
   /** @type {settings.TestMetricsBrowserProxy} */
   let testMetricsBrowserProxy;
diff --git a/chrome/updater/constants.cc b/chrome/updater/constants.cc
index 16af159..46fd725f 100644
--- a/chrome/updater/constants.cc
+++ b/chrome/updater/constants.cc
@@ -8,7 +8,7 @@
 
 // App ids.
 const char kUpdaterAppId[] = "{44FC7FE2-65CE-487C-93F4-EDEE46EEAAAB}";
-const char kChromeAppId[] = "{8A69D345-D564-463C-AFF1-A69D9E530F96}";
+
 const char kNullVersion[] = "0.0.0.0";
 
 // Command line arguments.
diff --git a/chrome/updater/constants.h b/chrome/updater/constants.h
index f887baec..98a4ed9 100644
--- a/chrome/updater/constants.h
+++ b/chrome/updater/constants.h
@@ -12,9 +12,6 @@
 // The updater specific app ID.
 extern const char kUpdaterAppId[];
 
-// Chrome's app ID.
-extern const char kChromeAppId[];
-
 // "0.0.0.0". Historically, a null version has been used to indicate a
 // new install.
 extern const char kNullVersion[];
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc
index 2248889..e2904bd 100644
--- a/chrome/updater/updater.cc
+++ b/chrome/updater/updater.cc
@@ -31,14 +31,14 @@
 #include "chrome/updater/server/mac/server.h"
 #endif
 
-// To install the updater on Windows, run "updatersetup.exe" from the
-// build directory.
-//
-// To uninstall, run "updater.exe --uninstall" from its install directory,
+// Instructions For Windows.
+// - To install only the updater, run "updatersetup.exe" from the build out dir.
+// - To install Chrome and the updater, do the same but use the --appid:
+//    updatersetup.exe --appid={8A69D345-D564-463C-AFF1-A69D9E530F96}
+// - To uninstall, run "updater.exe --uninstall" from its install directory,
 // which is under %LOCALAPPDATA%\Google\GoogleUpdater, or from the |out|
 // directory of the build.
-//
-// To debug, use the command line arguments:
+// - To debug, append the following arguments to any updater command line:
 //    --enable-logging --vmodule=*/chrome/updater/*=2.
 
 namespace updater {
diff --git a/chrome/updater/win/installer/installer.cc b/chrome/updater/win/installer/installer.cc
index dbee734c..38505b2b 100644
--- a/chrome/updater/win/installer/installer.cc
+++ b/chrome/updater/win/installer/installer.cc
@@ -207,10 +207,20 @@
       !cmd_line.append(L"\"")) {
     return ProcessExitResult(COMMAND_STRING_OVERFLOW);
   }
-
   if (!cmd_line.append(L" --install --single-process --enable-logging"
-                       L" --vmodule=*/chrome/updater/*=2"))
+                       L" --vmodule=*/chrome/updater/*=2")) {
     return ProcessExitResult(COMMAND_STRING_OVERFLOW);
+  }
+
+  // Append to the command line arguments this program has been invoked with.
+  int num_args = 0;
+  wchar_t** const arg_list =
+      ::CommandLineToArgvW(::GetCommandLineW(), &num_args);
+  for (int i = 1; i != num_args; ++i) {
+    if (!cmd_line.append(L" ") || !cmd_line.append(arg_list[i])) {
+      return ProcessExitResult(COMMAND_STRING_OVERFLOW);
+    }
+  }
 
   return RunProcessAndWait(setup_exe.get(), cmd_line.get());
 }
diff --git a/chrome/updater/win/ui/progress_wnd.cc b/chrome/updater/win/ui/progress_wnd.cc
index 0a9d6b4..5dc2fce 100644
--- a/chrome/updater/win/ui/progress_wnd.cc
+++ b/chrome/updater/win/ui/progress_wnd.cc
@@ -23,6 +23,9 @@
 
 namespace {
 
+// TODO(crbug.com/1065588): remove this symbol.
+const char kChromeAppId[] = "{8A69D345-D564-463C-AFF1-A69D9E530F96}";
+
 // The current UI shows to the user only one completion type, even though
 // there could be multiple applications in a bundle, where each application
 // could have a different completion type. The following array lists the
diff --git a/chromecast/BUILD.gn b/chromecast/BUILD.gn
index dffdb5e..98dcf7b 100644
--- a/chromecast/BUILD.gn
+++ b/chromecast/BUILD.gn
@@ -34,7 +34,10 @@
     data_deps += [ ":cast_shell" ]
   }
   if (is_linux) {
-    deps += [ "//chromecast/tracing" ]
+    deps += [
+      "//chromecast/browser/webview/client:wayland_webview_client",
+      "//chromecast/tracing",
+    ]
   }
   if (chromecast_branding != "public") {
     deps += [ "//chromecast/internal:all" ]
diff --git a/chromecast/browser/cast_web_contents.h b/chromecast/browser/cast_web_contents.h
index f43861d4..0c969286 100644
--- a/chromecast/browser/cast_web_contents.h
+++ b/chromecast/browser/cast_web_contents.h
@@ -371,6 +371,16 @@
       const std::string& data,
       std::vector<blink::WebMessagePort> ports) = 0;
 
+  // Executes a string of JavaScript in the main frame's context.
+  // This is no-op if the main frame is not available.
+  // Pass in a callback to receive a result when it is available.
+  // If there is no need to receive the result, pass in a
+  // default-constructed callback. If provided, the callback
+  // will be invoked on the UI thread.
+  virtual void ExecuteJavaScript(
+      const base::string16& javascript,
+      base::OnceCallback<void(base::Value)> callback) = 0;
+
   // ===========================================================================
   // Utility Methods
   // ===========================================================================
diff --git a/chromecast/browser/cast_web_contents_browsertest.cc b/chromecast/browser/cast_web_contents_browsertest.cc
index ddb22cd..a4a7240e 100644
--- a/chromecast/browser/cast_web_contents_browsertest.cc
+++ b/chromecast/browser/cast_web_contents_browsertest.cc
@@ -1143,6 +1143,59 @@
   }
 }
 
+IN_PROC_BROWSER_TEST_F(CastWebContentsBrowserTest, ExecuteJavaScript) {
+  // Start test server for hosting test HTML pages.
+  embedded_test_server()->ServeFilesFromSourceDirectory(GetTestDataPath());
+  StartTestServer();
+  auto run_loop = std::make_unique<base::RunLoop>();
+  auto quit_closure = [&run_loop]() {
+    if (run_loop->running()) {
+      run_loop->QuitWhenIdle();
+    }
+  };
+
+  // ===========================================================================
+  // Test: Set a value using ExecuteJavaScript with empty callback, and then use
+  // ExecuteJavaScript with callback to retrieve that value.
+  // ===========================================================================
+  constexpr char kSoyMilkJsonStringLiteral[] = "\"SoyMilk\"";
+
+  // Load page with title "hello":
+  GURL gurl{embedded_test_server()->GetURL("/title1.html")};
+  {
+    InSequence seq;
+    EXPECT_CALL(
+        mock_cast_wc_observer_,
+        OnPageStateChanged(CheckPageState(
+            cast_web_contents_.get(), CastWebContents::PageState::LOADING)));
+    EXPECT_CALL(
+        mock_cast_wc_observer_,
+        OnPageStateChanged(CheckPageState(cast_web_contents_.get(),
+                                          CastWebContents::PageState::LOADED)))
+        .WillOnce(InvokeWithoutArgs(quit_closure));
+  }
+  cast_web_contents_->LoadUrl(gurl);
+  run_loop->Run();
+
+  // Execute with empty callback.
+  cast_web_contents_->ExecuteJavaScript(
+      base::UTF8ToUTF16(
+          base::StringPrintf("const the_var = %s;", kSoyMilkJsonStringLiteral)),
+      base::DoNothing());
+
+  // Execute a script snippet to return the variable's value.
+  base::RunLoop run_loop2;
+  cast_web_contents_->ExecuteJavaScript(
+      base::UTF8ToUTF16("the_var;"),
+      base::BindLambdaForTesting([&](base::Value result_value) {
+        std::string result_json;
+        ASSERT_TRUE(base::JSONWriter::Write(result_value, &result_json));
+        EXPECT_EQ(result_json, kSoyMilkJsonStringLiteral);
+        run_loop2.Quit();
+      }));
+  run_loop2.Run();
+}
+
 }  // namespace chromecast
 
 #endif  // CHROMECAST_BROWSER_CAST_WEB_CONTENTS_BROWSERTEST_H_
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc
index a3afd23a..978ffe9 100644
--- a/chromecast/browser/cast_web_contents_impl.cc
+++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -104,8 +104,7 @@
   return *it;
 }
 
-void CastWebContentsImpl::RenderProcessReady(
-    content::RenderProcessHost* host) {
+void CastWebContentsImpl::RenderProcessReady(content::RenderProcessHost* host) {
   DCHECK(host->IsReady());
   const base::Process& process = host->GetProcess();
   for (auto& observer : observer_list_) {
@@ -431,6 +430,18 @@
       std::move(ports));
 }
 
+void CastWebContentsImpl::ExecuteJavaScript(
+    const base::string16& javascript,
+    base::OnceCallback<void(base::Value)> callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!web_contents_ || closing_ || !main_frame_loaded_ ||
+      !web_contents_->GetMainFrame())
+    return;
+
+  web_contents_->GetMainFrame()->ExecuteJavaScript(javascript,
+                                                   std::move(callback));
+}
+
 void CastWebContentsImpl::AddObserver(CastWebContents::Observer* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(observer);
diff --git a/chromecast/browser/cast_web_contents_impl.h b/chromecast/browser/cast_web_contents_impl.h
index 8707bc7..e5864b7 100644
--- a/chromecast/browser/cast_web_contents_impl.h
+++ b/chromecast/browser/cast_web_contents_impl.h
@@ -82,6 +82,9 @@
       const std::string& target_origin,
       const std::string& data,
       std::vector<blink::WebMessagePort> ports) override;
+  void ExecuteJavaScript(
+      const base::string16& javascript,
+      base::OnceCallback<void(base::Value)> callback) override;
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
   bool is_websql_enabled() override;
diff --git a/chromecast/browser/webview/client/BUILD.gn b/chromecast/browser/webview/client/BUILD.gn
new file mode 100644
index 0000000..598ce32
--- /dev/null
+++ b/chromecast/browser/webview/client/BUILD.gn
@@ -0,0 +1,20 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+executable("wayland_webview_client") {
+  sources = [
+    "webview.cc",
+    "webview.h",
+    "webview_main.cc",
+  ]
+  configs += [ "//third_party/grpc:grpc_config" ]
+  deps = [
+    "//base",
+    "//chromecast/browser/webview/proto",
+    "//components/exo/wayland:client_support",
+    "//skia",
+    "//third_party/wayland:wayland_client",
+    "//ui/gl",
+  ]
+}
diff --git a/chromecast/browser/webview/client/DEPS b/chromecast/browser/webview/client/DEPS
new file mode 100644
index 0000000..46d48b3
--- /dev/null
+++ b/chromecast/browser/webview/client/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+third_party/skia",
+]
diff --git a/chromecast/browser/webview/client/webview.cc b/chromecast/browser/webview/client/webview.cc
new file mode 100644
index 0000000..bd97207
--- /dev/null
+++ b/chromecast/browser/webview/client/webview.cc
@@ -0,0 +1,265 @@
+// 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 "chromecast/browser/webview/client/webview.h"
+
+#include <grpcpp/create_channel.h>
+
+#include "base/bind.h"
+#include "base/files/file_descriptor_watcher_posix.h"
+#include "base/logging.h"
+#include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "chromecast/browser/webview/proto/webview.pb.h"
+#include "third_party/grpc/src/include/grpcpp/grpcpp.h"
+#include "third_party/skia/include/gpu/GrContext.h"
+#include "ui/gl/gl_bindings.h"
+
+namespace chromecast {
+namespace client {
+
+namespace {
+
+constexpr int kGrpcMaxReconnectBackoffMs = 1000;
+constexpr int kWebviewId = 10;
+
+void FrameCallback(void* data, wl_callback* callback, uint32_t time) {
+  WebviewClient* webview_client = static_cast<WebviewClient*>(data);
+  if (webview_client->HasAvailableBuffer())
+    webview_client->SchedulePaint();
+}
+
+void BufferReleaseCallback(void* data, wl_buffer* /* buffer */) {
+  WebviewClient::BufferCallback* buffer_callback =
+      static_cast<WebviewClient::BufferCallback*>(data);
+  buffer_callback->buffer->busy = false;
+  buffer_callback->client->SchedulePaint();
+}
+
+}  // namespace
+
+using chromecast::webview::WebviewRequest;
+using chromecast::webview::WebviewResponse;
+
+WebviewClient::WebviewClient()
+    : task_runner_(base::ThreadTaskRunnerHandle::Get()),
+      file_descriptor_watcher_(task_runner_) {}
+
+WebviewClient::~WebviewClient() {}
+
+bool WebviewClient::HasAvailableBuffer() {
+  auto buffer_it =
+      std::find_if(buffers_.begin(), buffers_.end(),
+                   [](const std::unique_ptr<ClientBase::Buffer>& buffer) {
+                     return !buffer->busy;
+                   });
+  return buffer_it != buffers_.end();
+}
+
+void WebviewClient::Run(const InitParams& params,
+                        const std::string& channel_directory) {
+  webview_surface_.reset(static_cast<wl_surface*>(
+      wl_compositor_create_surface(globals_.compositor.get())));
+
+  // Roundtrip to wait for display configuration.
+  wl_display_roundtrip(display_.get());
+
+  AllocateBuffers(params);
+
+  ::grpc::ChannelArguments args;
+  args.SetInt(GRPC_ARG_MAX_RECONNECT_BACKOFF_MS, kGrpcMaxReconnectBackoffMs);
+  stub_ = chromecast::webview::PlatformViewsService::NewStub(
+      ::grpc::CreateCustomChannel(std::string("unix:" + channel_directory),
+                                  ::grpc::InsecureChannelCredentials(), args));
+  std::unique_ptr<::grpc::ClientContext> context =
+      std::make_unique<::grpc::ClientContext>();
+  client_ = stub_->CreateWebview(context.get());
+  WebviewRequest request;
+
+  request.mutable_create()->set_webview_id(kWebviewId);
+  request.mutable_create()->set_window_id(kWebviewId);
+
+  if (!client_->Write(request)) {
+    LOG(ERROR) << ("Failed to create webview");
+    return;
+  }
+
+  WebviewResponse response;
+  if (!client_->Read(&response)) {
+    LOG(ERROR) << "Failed to read webview creation response";
+    return;
+  }
+
+  wl_webview_surface_.reset(wl_subcompositor_get_subsurface(
+      globals_.subcompositor.get(), webview_surface_.get(), surface_.get()));
+  wl_subsurface_set_sync(wl_webview_surface_.get());
+  aura_surface.reset(zaura_shell_get_aura_surface(globals_.aura_shell.get(),
+                                                  webview_surface_.get()));
+
+  if (!aura_surface) {
+    LOG(ERROR) << "No aura surface";
+    return;
+  }
+
+  zaura_surface_set_client_surface_id(aura_surface.get(), kWebviewId);
+
+  WebviewRequest resize_request;
+  resize_request.mutable_resize()->set_width(size_.height());
+  resize_request.mutable_resize()->set_height(size_.width());
+
+  if (!client_->Write(resize_request)) {
+    LOG(ERROR) << ("Resize request failed");
+    return;
+  }
+
+  std::cout << "Enter URL, q to quit: ";
+  std::cout.flush();
+  task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&WebviewClient::Paint, base::Unretained(this)));
+
+  stdin_controller_ = file_descriptor_watcher_.WatchReadable(
+      STDIN_FILENO, base::BindRepeating(&WebviewClient::InputCallback,
+                                        base::Unretained(this)));
+  TakeExclusiveAccess();
+  wl_display_controller_ = file_descriptor_watcher_.WatchReadable(
+      wl_display_get_fd(display_.get()),
+      base::BindRepeating(&WebviewClient::WlDisplayCallback,
+                          base::Unretained(this)));
+  run_loop_.Run();
+}
+
+void WebviewClient::AllocateBuffers(const InitParams& params) {
+  static wl_buffer_listener buffer_listener = {BufferReleaseCallback};
+  for (size_t i = 0; i < params.num_buffers; ++i) {
+    auto buffer_callback = std::make_unique<BufferCallback>();
+    auto buffer = CreateBuffer(size_, params.drm_format, params.bo_usage,
+                               &buffer_listener, buffer_callback.get());
+    if (!buffer) {
+      LOG(ERROR) << "Failed to create buffer";
+      return;
+    }
+    buffer_callback->client = this;
+    buffer_callback->buffer = buffer.get();
+    buffer_callbacks_.push_back(std::move(buffer_callback));
+    buffers_.push_back(std::move(buffer));
+  }
+  webview_buffer_ = CreateBuffer(size_, params.drm_format, params.bo_usage);
+}
+
+void WebviewClient::HandleMode(void* data,
+                               struct wl_output* wl_output,
+                               uint32_t flags,
+                               int32_t width,
+                               int32_t height,
+                               int32_t refresh) {
+  if ((WL_OUTPUT_MODE_CURRENT & flags) != WL_OUTPUT_MODE_CURRENT)
+    return;
+
+  size_.SetSize(width, height);
+  switch (transform_) {
+    case WL_OUTPUT_TRANSFORM_NORMAL:
+    case WL_OUTPUT_TRANSFORM_180:
+      surface_size_.SetSize(width, height);
+      break;
+    case WL_OUTPUT_TRANSFORM_90:
+    case WL_OUTPUT_TRANSFORM_270:
+      surface_size_.SetSize(height, width);
+      break;
+    default:
+      NOTREACHED();
+      break;
+  }
+
+  std::unique_ptr<wl_region> opaque_region(static_cast<wl_region*>(
+      wl_compositor_create_region(globals_.compositor.get())));
+
+  if (!opaque_region) {
+    LOG(ERROR) << "Can't create region";
+    return;
+  }
+
+  wl_region_add(opaque_region.get(), 0, 0, surface_size_.width(),
+                surface_size_.height());
+  wl_surface_set_opaque_region(surface_.get(), opaque_region.get());
+  wl_surface_set_input_region(surface_.get(), opaque_region.get());
+}
+
+void WebviewClient::InputCallback() {
+  std::string request;
+  std::cin >> request;
+
+  if (request == "q") {
+    run_loop_.Quit();
+    return;
+  }
+
+  SendNavigationRequest(request);
+  std::cout << "Enter URL, q to quit: ";
+  std::cout.flush();
+}
+
+void WebviewClient::Paint() {
+  Buffer* buffer = DequeueBuffer();
+
+  if (!buffer)
+    return;
+
+  if (gr_context_) {
+    gr_context_->flush();
+    glFinish();
+  }
+
+  wl_surface_set_buffer_scale(surface_.get(), scale_);
+  wl_surface_set_buffer_transform(surface_.get(), transform_);
+  wl_surface_damage(surface_.get(), 0, 0, surface_size_.width(),
+                    surface_size_.height());
+  wl_surface_attach(surface_.get(), buffer->buffer.get(), 0, 0);
+
+  wl_surface_set_buffer_scale(webview_surface_.get(), scale_);
+  wl_surface_damage(webview_surface_.get(), 0, 0, surface_size_.width(),
+                    surface_size_.height());
+  wl_surface_attach(webview_surface_.get(), webview_buffer_->buffer.get(), 0,
+                    0);
+
+  // Set up frame callbacks.
+  frame_callback_.reset(wl_surface_frame(surface_.get()));
+  static wl_callback_listener frame_listener = {FrameCallback};
+  wl_callback_add_listener(frame_callback_.get(), &frame_listener, this);
+
+  wl_surface_commit(webview_surface_.get());
+  wl_surface_commit(surface_.get());
+  wl_display_flush(display_.get());
+}
+
+void WebviewClient::SchedulePaint() {
+  task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&WebviewClient::Paint, base::Unretained(this)));
+}
+
+void WebviewClient::SendNavigationRequest(const std::string& URL) {
+  WebviewRequest load_url_request;
+  load_url_request.mutable_navigate()->set_url(URL);
+
+  if (!client_->Write(load_url_request)) {
+    LOG(ERROR) << ("Navigation request send failed");
+  }
+}
+
+void WebviewClient::TakeExclusiveAccess() {
+  while (wl_display_prepare_read(display_.get()) == -1) {
+    if (wl_display_dispatch_pending(display_.get()) == -1) {
+      LOG(ERROR) << "Error dispatching Wayland events";
+      return;
+    }
+  }
+  wl_display_flush(display_.get());
+}
+
+void WebviewClient::WlDisplayCallback() {
+  wl_display_read_events(display_.get());
+  TakeExclusiveAccess();
+}
+
+}  // namespace client
+}  // namespace chromecast
diff --git a/chromecast/browser/webview/client/webview.h b/chromecast/browser/webview/client/webview.h
new file mode 100644
index 0000000..d81b16f5
--- /dev/null
+++ b/chromecast/browser/webview/client/webview.h
@@ -0,0 +1,75 @@
+// 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 CHROMECAST_BROWSER_WEBVIEW_CLIENT_WEBVIEW_H_
+#define CHROMECAST_BROWSER_WEBVIEW_CLIENT_WEBVIEW_H_
+
+#include <string>
+
+#include "base/files/file_descriptor_watcher_posix.h"
+#include "base/run_loop.h"
+#include "base/threading/thread.h"
+#include "chromecast/browser/webview/proto/webview.grpc.pb.h"
+#include "components/exo/wayland/clients/client_base.h"
+#include "third_party/grpc/src/include/grpcpp/grpcpp.h"
+
+namespace chromecast {
+namespace client {
+
+// Sample Wayland client to manipulate webviews
+class WebviewClient : public exo::wayland::clients::ClientBase {
+ public:
+  struct BufferCallback {
+    WebviewClient* client;
+    Buffer* buffer;
+  };
+
+  WebviewClient();
+  ~WebviewClient() override;
+  bool HasAvailableBuffer();
+  void Run(const InitParams& params, const std::string& channel_directory);
+  void SchedulePaint();
+
+ private:
+  void AllocateBuffers(const InitParams& params);
+  void HandleMode(void* data,
+                  struct wl_output* wl_output,
+                  uint32_t flags,
+                  int32_t width,
+                  int32_t height,
+                  int32_t refresh) override;
+  void InputCallback();
+  void Paint();
+  using WebviewRequestResponseClient =
+      ::grpc::ClientReaderWriterInterface<chromecast::webview::WebviewRequest,
+                                          chromecast::webview::WebviewResponse>;
+  void SendNavigationRequest(const std::string& URL);
+  void TakeExclusiveAccess();
+  void WlDisplayCallback();
+
+  std::unique_ptr<wl_callback> frame_callback_;
+  std::unique_ptr<wl_callback> subsurface_frame_callback_;
+  std::unique_ptr<wl_surface> webview_surface_;
+  std::unique_ptr<wl_subsurface> wl_webview_surface_;
+  std::unique_ptr<zaura_surface> aura_surface;
+
+  std::vector<std::unique_ptr<BufferCallback>> buffer_callbacks_;
+  std::unique_ptr<ClientBase::Buffer> webview_buffer_;
+  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+
+  std::unique_ptr<base::FileDescriptorWatcher::Controller> stdin_controller_;
+  std::unique_ptr<base::FileDescriptorWatcher::Controller>
+      wl_display_controller_;
+  base::FileDescriptorWatcher file_descriptor_watcher_;
+  base::RunLoop run_loop_;
+
+  std::unique_ptr<chromecast::webview::PlatformViewsService::Stub> stub_;
+  std::unique_ptr<WebviewRequestResponseClient> client_;
+  DISALLOW_COPY_AND_ASSIGN(WebviewClient);
+};
+
+}  // namespace client
+}  // namespace chromecast
+
+#endif  // CHROMECAST_BROWSER_WEBVIEW_CLIENT_WEBVIEW_H_
diff --git a/chromecast/browser/webview/client/webview_main.cc b/chromecast/browser/webview/client/webview_main.cc
new file mode 100644
index 0000000..1cc0c4a2
--- /dev/null
+++ b/chromecast/browser/webview/client/webview_main.cc
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/browser/webview/client/webview.h"
+
+#include "base/at_exit.h"
+#include "base/command_line.h"
+#include "base/message_loop/message_pump_type.h"
+#include "base/task/single_thread_task_executor.h"
+
+int main(int argc, char* argv[]) {
+  if (argc < 2) {
+    std::cout << "Usage: wayland_webview_client [CHANNEL DIRECTORY] [OPTION]"
+              << std::endl;
+    return -1;
+  }
+
+  base::AtExitManager exit_manager;
+  base::CommandLine::Init(argc, argv);
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+
+  chromecast::client::WebviewClient::InitParams params;
+  params.allocate_buffers_with_output_mode = true;
+  params.num_buffers = 3;
+  params.use_fullscreen_shell = true;
+  params.use_touch = true;
+
+  if (!params.FromCommandLine(*command_line))
+    return 1;
+
+  base::SingleThreadTaskExecutor main_task_executor(base::MessagePumpType::IO);
+  chromecast::client::WebviewClient client;
+  client.Init(params);
+  client.Run(params, argv[1]);
+}
diff --git a/chromeos/components/print_management/mojom/BUILD.gn b/chromeos/components/print_management/mojom/BUILD.gn
new file mode 100644
index 0000000..44bcd536
--- /dev/null
+++ b/chromeos/components/print_management/mojom/BUILD.gn
@@ -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.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojom") {
+  sources = [ "printing_manager.mojom" ]
+
+  public_deps = [
+    "//mojo/public/mojom/base",
+    "//url/mojom:url_mojom_gurl",
+  ]
+}
diff --git a/chromeos/components/print_management/mojom/OWNERS b/chromeos/components/print_management/mojom/OWNERS
new file mode 100644
index 0000000..c4096b7
--- /dev/null
+++ b/chromeos/components/print_management/mojom/OWNERS
@@ -0,0 +1,10 @@
+# Primary Owners
+jimmyxgong@chromium.org
+khorimoto@chromium.org
+
+# Secondary Owners
+baileyberro@chromium.org
+zentaro@chromium.org
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
\ No newline at end of file
diff --git a/chromeos/components/print_management/mojom/printing_manager.mojom b/chromeos/components/print_management/mojom/printing_manager.mojom
new file mode 100644
index 0000000..b9c7640
--- /dev/null
+++ b/chromeos/components/print_management/mojom/printing_manager.mojom
@@ -0,0 +1,53 @@
+// 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 chromeos.printing.printing_manager.mojom;
+
+import "mojo/public/mojom/base/string16.mojom";
+import "mojo/public/mojom/base/time.mojom";
+import "url/mojom/url.mojom";
+
+// Enumeration of print job status.
+enum PrintJobCompletionStatus {
+  kFailed,
+  kCanceled,
+  kPrinted
+};
+
+// Contains all the information in regards to a print job. Information is
+// provided by the printer. Printer details, i.e. name and uri, can be edited
+// via print settings.
+struct PrintJobInfo {
+  // Unique identifier for a particular print job.
+  string id;
+
+  // Title of the print job. Usually the name of the printed file.
+  mojo_base.mojom.String16 title;
+
+  // Corresponds to the status of the print job after it the print job has
+  // finished.
+  PrintJobCompletionStatus completion_status;
+
+  // Time of when the print job was requested.
+  mojo_base.mojom.Time creation_time;
+
+  // Number of pages requested to print.
+  uint32 number_of_pages;
+
+  // The printer destination the print job was sent to.
+  mojo_base.mojom.String16 printer_name;
+
+  // The URI of the printer the print job was requested to.
+  url.mojom.Url printer_uri;
+};
+
+// Provides APIs to retrieve print metadata information. This API is exposed
+// only to the Print Management App (chrome://print-management). Interfaces are
+// implemented by a browser service. Interacts with PrintHistory API to retrieve
+// print job metadatas.
+interface PrintingMetadataProvider {
+  // Returns an array of PrintJobInfo. This is the main function to retrieve
+  // the print history of a device.
+  GetPrintJobs() => (array<PrintJobInfo> print_jobs);
+};
diff --git a/chromeos/profiles/airmont.afdo.newest.txt b/chromeos/profiles/airmont.afdo.newest.txt
index 571a247b..7df9fd8f 100644
--- a/chromeos/profiles/airmont.afdo.newest.txt
+++ b/chromeos/profiles/airmont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-airmont-83-4085.6-1584959535-benchmark-83.0.4091.0-r2-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-airmont-83-4085.6-1584959535-benchmark-83.0.4094.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/chromeos/profiles/broadwell.afdo.newest.txt b/chromeos/profiles/broadwell.afdo.newest.txt
index a515e25..1f42128 100644
--- a/chromeos/profiles/broadwell.afdo.newest.txt
+++ b/chromeos/profiles/broadwell.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-broadwell-83-4044.62-1584958487-benchmark-83.0.4091.0-r2-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-broadwell-83-4044.62-1584958487-benchmark-83.0.4094.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/chromeos/profiles/silvermont.afdo.newest.txt b/chromeos/profiles/silvermont.afdo.newest.txt
index 67fc2e3..4af967f 100644
--- a/chromeos/profiles/silvermont.afdo.newest.txt
+++ b/chromeos/profiles/silvermont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-silvermont-83-4085.6-1584956258-benchmark-83.0.4091.0-r2-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-silvermont-83-4085.6-1584956258-benchmark-83.0.4094.0-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java
index 3c1cecc..a0bb0b4a 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java
@@ -99,6 +99,11 @@
     public void showScrim(PropertyModel model) {
         assert model != null : "Showing the scrim requires a model.";
 
+        // Ensure the previous scrim is hidden before showing the new one. This logic should be in
+        // the mediator, but it depends on the old view and binder being available which are
+        // replaced prior to mediator#showScrim being called.
+        if (mMediator.isActive()) mMediator.hideScrim(false);
+
         if (mChangeProcessor != null) mChangeProcessor.destroy();
 
         mView = mScrimViewBuilder.get();
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java
index 030ae58..23ac896 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java
@@ -185,6 +185,11 @@
         mOverlayAnimator.start();
     }
 
+    /** @return Whether the scrim is still active (has a non-null model). */
+    boolean isActive() {
+        return mModel != null;
+    }
+
     @Override
     public void onClick(View view) {
         if (mModel.get(ScrimProperties.CLICK_DELEGATE) != null) {
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimTest.java
index 4f152d22..95dea15 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimTest.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimTest.java
@@ -6,6 +6,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -242,6 +243,24 @@
                 ((ViewGroup.MarginLayoutParams) scrimView.getLayoutParams()).topMargin);
     }
 
+    @Test
+    @SmallTest
+    @Feature({"Scrim"})
+    public void testOldScrimHidden() throws TimeoutException {
+        showScrim(buildModel(true, false, true, Color.RED), false);
+
+        assertScrimVisibility(true);
+
+        View oldScrim = mScrimCoordinator.getViewForTesting();
+
+        showScrim(buildModel(true, false, true, Color.BLUE), false);
+
+        View newScrim = mScrimCoordinator.getViewForTesting();
+
+        assertNotEquals("The view should have changed.", oldScrim, newScrim);
+        assertEquals("The old scrim should be gone.", View.GONE, oldScrim.getVisibility());
+    }
+
     /**
      * Build a model to show the scrim with.
      * @param requiredKeysOnly Whether the model should be built with only the required keys.
diff --git a/components/certificate_transparency/chrome_ct_policy_enforcer.cc b/components/certificate_transparency/chrome_ct_policy_enforcer.cc
index 2d63673..0234f88f 100644
--- a/components/certificate_transparency/chrome_ct_policy_enforcer.cc
+++ b/components/certificate_transparency/chrome_ct_policy_enforcer.cc
@@ -92,7 +92,11 @@
     bool build_timely,
     CTPolicyCompliance compliance) {
   base::DictionaryValue dict;
-  dict.SetKey("certificate", net::NetLogX509CertificateParams(cert));
+  // TODO(mattm): This double-wrapping of the certificate list is weird. Remove
+  // this (probably requires updates to netlog-viewer).
+  base::Value certificate_dict(base::Value::Type::DICTIONARY);
+  certificate_dict.SetKey("certificates", net::NetLogX509CertificateList(cert));
+  dict.SetKey("certificate", std::move(certificate_dict));
   dict.SetBoolean("build_timely", build_timely);
   dict.SetString("ct_compliance_status",
                  CTPolicyComplianceToString(compliance));
diff --git a/components/feed/core/v2/BUILD.gn b/components/feed/core/v2/BUILD.gn
index c6b96dc2..58e363b 100644
--- a/components/feed/core/v2/BUILD.gn
+++ b/components/feed/core/v2/BUILD.gn
@@ -68,6 +68,7 @@
   testonly = true
   sources = [
     "feed_network_impl_unittest.cc",
+    "feed_store_unittest.cc",
     "feed_stream_unittest.cc",
     "stream_model_unittest.cc",
     "stream_model_update_request_unittest.cc",
@@ -82,6 +83,7 @@
     "//base/test:test_support",
     "//components/feed/core:feed_core",
     "//components/feed/core/common:feed_core_common",
+    "//components/leveldb_proto:test_support",
     "//components/prefs:test_support",
     "//components/signin/public/identity_manager",
     "//components/signin/public/identity_manager:test_support",
diff --git a/components/feed/core/v2/feed_store.cc b/components/feed/core/v2/feed_store.cc
index f9d193d7..02db601 100644
--- a/components/feed/core/v2/feed_store.cc
+++ b/components/feed/core/v2/feed_store.cc
@@ -68,19 +68,30 @@
 }  // namespace
 
 FeedStore::FeedStore(leveldb_proto::ProtoDatabaseProvider* database_provider,
-                     const base::FilePath& feed_directory)
-    : task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
-          {base::MayBlock(), base::TaskPriority::USER_VISIBLE})),
+                     const base::FilePath& feed_directory,
+                     scoped_refptr<base::SequencedTaskRunner> task_runner)
+    : database_status_(leveldb_proto::Enums::InitStatus::kNotInitialized),
       database_(database_provider->GetDB<feedstore::Record>(
           leveldb_proto::ProtoDbType::FEED_STREAM_DATABASE,
           feed_directory,
-          task_runner_)) {
-  database_->Init(base::BindOnce(&FeedStore::OnDatabaseInitialized,
-                                 weak_ptr_factory_.GetWeakPtr()));
+          task_runner)) {
+  Initialize();
+}
+
+FeedStore::FeedStore(
+    std::unique_ptr<leveldb_proto::ProtoDatabase<feedstore::Record>> database)
+    : database_status_(leveldb_proto::Enums::InitStatus::kNotInitialized),
+      database_(std::move(database)) {
+  Initialize();
 }
 
 FeedStore::~FeedStore() = default;
 
+void FeedStore::Initialize() {
+  database_->Init(base::BindOnce(&FeedStore::OnDatabaseInitialized,
+                                 weak_ptr_factory_.GetWeakPtr()));
+}
+
 void FeedStore::OnDatabaseInitialized(leveldb_proto::Enums::InitStatus status) {
   database_status_ = status;
 }
@@ -89,6 +100,10 @@
   return database_status_ == leveldb_proto::Enums::InitStatus::kOK;
 }
 
+bool FeedStore::IsInitializedForTesting() const {
+  return IsInitialized();
+}
+
 void FeedStore::ReadSingle(
     const std::string& key,
     base::OnceCallback<void(bool, std::unique_ptr<feedstore::Record>)>
@@ -129,7 +144,7 @@
     base::OnceCallback<void(std::unique_ptr<feedstore::StreamData>)> callback,
     bool success,
     std::unique_ptr<feedstore::Record> record) {
-  if (!success) {
+  if (!success || !record) {
     std::move(callback).Run(nullptr);
     return;
   }
@@ -138,16 +153,19 @@
 }
 
 void FeedStore::ReadContent(
-    std::vector<feedwire::ContentId> ids,
-    base::OnceCallback<
-        void(std::unique_ptr<std::vector<feedstore::Content>>,
-             std::unique_ptr<std::vector<feedstore::StreamSharedState>>)>
+    std::vector<feedwire::ContentId> content_ids,
+    std::vector<feedwire::ContentId> shared_state_ids,
+    base::OnceCallback<void(std::vector<feedstore::Content>,
+                            std::vector<feedstore::StreamSharedState>)>
         content_callback) {
   std::vector<std::string> key_vector;
-  key_vector.reserve(ids.size());
-  for (auto& content_id : ids)
+  key_vector.reserve(content_ids.size() + shared_state_ids.size());
+  for (auto& content_id : content_ids)
     key_vector.push_back(ContentKey(content_id));
 
+  for (auto& shared_state_id : shared_state_ids)
+    key_vector.push_back(SharedStateKey(shared_state_id));
+
   ReadMany(base::flat_set<std::string>(std::move(key_vector)),
            base::BindOnce(&FeedStore::OnReadContentFinished,
                           weak_ptr_factory_.GetWeakPtr(),
@@ -155,26 +173,25 @@
 }
 
 void FeedStore::OnReadContentFinished(
-    base::OnceCallback<void(
-        std::unique_ptr<std::vector<feedstore::Content>>,
-        std::unique_ptr<std::vector<feedstore::StreamSharedState>>)> callback,
+    base::OnceCallback<void(std::vector<feedstore::Content>,
+                            std::vector<feedstore::StreamSharedState>)>
+        callback,
     bool success,
     std::unique_ptr<std::vector<feedstore::Record>> records) {
-  if (!success) {
-    std::move(callback).Run(nullptr, nullptr);
+  if (!success || !records) {
+    std::move(callback).Run({}, {});
     return;
   }
 
-  auto content = std::make_unique<std::vector<feedstore::Content>>();
+  std::vector<feedstore::Content> content;
   // Most of records will be content.
-  content->reserve(records->size());
-  auto shared_states =
-      std::make_unique<std::vector<feedstore::StreamSharedState>>();
+  content.reserve(records->size());
+  std::vector<feedstore::StreamSharedState> shared_states;
   for (auto& record : *records) {
     if (record.data_case() == feedstore::Record::kContent)
-      content->push_back(std::move(record.content()));
+      content.push_back(std::move(record.content()));
     else if (record.data_case() == feedstore::Record::kSharedState)
-      shared_states->push_back(std::move(record.shared_state()));
+      shared_states.push_back(std::move(record.shared_state()));
   }
 
   std::move(callback).Run(std::move(content), std::move(shared_states));
@@ -194,7 +211,7 @@
         callback,
     bool success,
     std::unique_ptr<feedstore::Record> record) {
-  if (!success) {
+  if (!success || !record) {
     std::move(callback).Run(nullptr);
     return;
   }
diff --git a/components/feed/core/v2/feed_store.h b/components/feed/core/v2/feed_store.h
index 551ff21a..d5ea0bc 100644
--- a/components/feed/core/v2/feed_store.h
+++ b/components/feed/core/v2/feed_store.h
@@ -19,9 +19,17 @@
 class FeedStore {
  public:
   FeedStore(leveldb_proto::ProtoDatabaseProvider* database_provider,
-            const base::FilePath& feed_directory);
+            const base::FilePath& feed_directory,
+            scoped_refptr<base::SequencedTaskRunner> task_runner);
+  FeedStore(const FeedStore&) = delete;
+  FeedStore& operator=(const FeedStore&) = delete;
   ~FeedStore();
 
+  // For testing.
+  explicit FeedStore(
+      std::unique_ptr<leveldb_proto::ProtoDatabase<feedstore::Record>>
+          database);
+
   // Read StreamData and pass it to stream_data_callback, or nullptr on failure.
   void ReadStreamData(
       base::OnceCallback<void(std::unique_ptr<feedstore::StreamData>)>
@@ -29,10 +37,10 @@
   // Read Content and StreamSharedStates and pass them to content_callback, or
   // nullptrs on failure.
   void ReadContent(
-      std::vector<feedwire::ContentId> ids,
-      base::OnceCallback<
-          void(std::unique_ptr<std::vector<feedstore::Content>>,
-               std::unique_ptr<std::vector<feedstore::StreamSharedState>>)>
+      std::vector<feedwire::ContentId> content_ids,
+      std::vector<feedwire::ContentId> shared_state_ids,
+      base::OnceCallback<void(std::vector<feedstore::Content>,
+                              std::vector<feedstore::StreamSharedState>)>
           content_callback);
 
   void ReadNextStreamState(
@@ -47,7 +55,11 @@
   // TODO(iwells): implement this
   // Deletes old records that are no longer needed
   // void RemoveOldData(base::OnceCallback<void(bool)> callback);
+
+  bool IsInitializedForTesting() const;
+
  private:
+  void Initialize();
   void OnDatabaseInitialized(leveldb_proto::Enums::InitStatus status);
   bool IsInitialized() const;
 
@@ -65,9 +77,9 @@
       bool success,
       std::unique_ptr<feedstore::Record> record);
   void OnReadContentFinished(
-      base::OnceCallback<void(
-          std::unique_ptr<std::vector<feedstore::Content>>,
-          std::unique_ptr<std::vector<feedstore::StreamSharedState>>)> callback,
+      base::OnceCallback<void(std::vector<feedstore::Content>,
+                              std::vector<feedstore::StreamSharedState>)>
+          callback,
       bool success,
       std::unique_ptr<std::vector<feedstore::Record>> records);
   void OnReadNextStreamStateFinished(
@@ -84,9 +96,6 @@
   //                             bool success);
 
   leveldb_proto::Enums::InitStatus database_status_;
-
-  // Task runner on which to execute database calls.
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
   std::unique_ptr<leveldb_proto::ProtoDatabase<feedstore::Record>> database_;
 
   base::WeakPtrFactory<FeedStore> weak_ptr_factory_{this};
diff --git a/components/feed/core/v2/feed_store_unittest.cc b/components/feed/core/v2/feed_store_unittest.cc
new file mode 100644
index 0000000..76eaa86
--- /dev/null
+++ b/components/feed/core/v2/feed_store_unittest.cc
@@ -0,0 +1,321 @@
+// 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/feed/core/v2/feed_store.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_piece.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/task_environment.h"
+#include "components/feed/core/proto/v2/wire/content_id.pb.h"
+#include "components/feed/core/v2/test/stream_builder.h"
+#include "components/leveldb_proto/testing/fake_db.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace feed {
+namespace {
+
+const char kNextPageToken[] = "next page token";
+const char kConsistencyToken[] = "consistency token";
+const int64_t kLastAddedTimeMs = 100;
+
+feedstore::StreamData MakeStreamData() {
+  feedstore::StreamData stream_data;
+  *stream_data.mutable_content_id() = MakeRootId();
+  stream_data.set_next_page_token(kNextPageToken);
+  stream_data.set_consistency_token(kConsistencyToken);
+  stream_data.set_last_added_time_millis(kLastAddedTimeMs);
+
+  std::vector<feedstore::DataOperation> operations =
+      MakeTypicalStreamOperations();
+  for (auto& operation : operations) {
+    *stream_data.add_structures() = std::move(operation.structure());
+  }
+
+  return stream_data;
+}
+
+std::string ContentIdToString(const feedwire::ContentId& content_id) {
+  return base::StrCat(
+      {"{content_domain: \"", content_id.content_domain(),
+       "\", id: ", base::NumberToString(content_id.id()), ", type: \"",
+       feedwire::ContentId::Type_Name(content_id.type()), "\"}"});
+}
+
+std::string KeyForContentId(base::StringPiece prefix,
+                            const feedwire::ContentId& content_id) {
+  return base::StrCat({prefix, content_id.content_domain(), ",",
+                       base::NumberToString(content_id.type()), ",",
+                       base::NumberToString(content_id.id())});
+}
+
+feedstore::Record RecordForContent(feedstore::Content content) {
+  feedstore::Record record;
+  *record.mutable_content() = std::move(content);
+  return record;
+}
+
+feedstore::Record RecordForSharedState(feedstore::StreamSharedState shared) {
+  feedstore::Record record;
+  *record.mutable_shared_state() = std::move(shared);
+  return record;
+}
+
+const char kRootKey[] = "S/0";
+
+}  // namespace
+
+class FeedStoreTest : public testing::Test {
+ public:
+  void MakeFeedStore(std::map<std::string, feedstore::Record> entries,
+                     leveldb_proto::Enums::InitStatus init_status =
+                         leveldb_proto::Enums::InitStatus::kOK) {
+    db_entries_ = std::move(entries);
+    auto fake_db =
+        std::make_unique<leveldb_proto::test::FakeDB<feedstore::Record>>(
+            &db_entries_);
+    fake_db_ = fake_db.get();
+    store_ = std::make_unique<FeedStore>(std::move(fake_db));
+    fake_db_->InitStatusCallback(init_status);
+  }
+
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::SYSTEM_TIME};
+
+  std::unique_ptr<FeedStore> store_;
+  std::map<std::string, feedstore::Record> db_entries_;
+  leveldb_proto::test::FakeDB<feedstore::Record>* fake_db_;
+};
+
+TEST_F(FeedStoreTest, InitSuccess) {
+  MakeFeedStore({});
+  EXPECT_TRUE(store_->IsInitializedForTesting());
+}
+
+TEST_F(FeedStoreTest, InitFailure) {
+  std::map<std::string, feedstore::Record> entries;
+  auto fake_db =
+      std::make_unique<leveldb_proto::test::FakeDB<feedstore::Record>>(
+          &entries);
+  leveldb_proto::test::FakeDB<feedstore::Record>* fake_db_raw = fake_db.get();
+
+  auto store = std::make_unique<FeedStore>(std::move(fake_db));
+  EXPECT_FALSE(store->IsInitializedForTesting());
+
+  fake_db_raw->InitStatusCallback(leveldb_proto::Enums::InitStatus::kError);
+  EXPECT_FALSE(store->IsInitializedForTesting());
+}
+
+TEST_F(FeedStoreTest, ReadStreamData) {
+  feedstore::Record record;
+  *record.mutable_stream_data() = MakeStreamData();
+  MakeFeedStore({{kRootKey, record}});
+
+  // Successful read
+  bool did_successful_read = false;
+  store_->ReadStreamData(base::BindLambdaForTesting(
+      [&](std::unique_ptr<feedstore::StreamData> stream_data) {
+        did_successful_read = true;
+        ASSERT_TRUE(stream_data);
+        EXPECT_EQ(ContentIdToString(stream_data->content_id()),
+                  ContentIdToString(record.stream_data().content_id()));
+        EXPECT_EQ(stream_data->structures_size(),
+                  record.stream_data().structures_size());
+        EXPECT_EQ(stream_data->next_page_token(),
+                  record.stream_data().next_page_token());
+        EXPECT_EQ(stream_data->consistency_token(),
+                  record.stream_data().consistency_token());
+        EXPECT_EQ(stream_data->last_added_time_millis(),
+                  record.stream_data().last_added_time_millis());
+        EXPECT_EQ(stream_data->next_action_id(),
+                  record.stream_data().next_action_id());
+      }));
+  fake_db_->GetCallback(true);
+  EXPECT_TRUE(did_successful_read);
+
+  // Failed read
+  bool did_failed_read = false;
+  store_->ReadStreamData(base::BindLambdaForTesting(
+      [&](std::unique_ptr<feedstore::StreamData> stream_data) {
+        did_failed_read = true;
+        EXPECT_FALSE(stream_data);
+      }));
+  fake_db_->GetCallback(false);
+  EXPECT_TRUE(did_failed_read);
+}
+
+TEST_F(FeedStoreTest, ReadNonexistentStreamData) {
+  MakeFeedStore({});
+
+  bool did_read = false;
+  store_->ReadStreamData(base::BindLambdaForTesting(
+      [&](std::unique_ptr<feedstore::StreamData> stream_data) {
+        did_read = true;
+        EXPECT_FALSE(stream_data);
+      }));
+  fake_db_->GetCallback(true);
+  EXPECT_TRUE(did_read);
+}
+
+TEST_F(FeedStoreTest, ReadNonexistentContentAndSharedStates) {
+  MakeFeedStore({});
+
+  bool did_read = false;
+  store_->ReadContent(
+      {MakeContentContentId(0)}, {MakeSharedStateContentId(0)},
+      base::BindLambdaForTesting(
+          [&](std::vector<feedstore::Content> content,
+              std::vector<feedstore::StreamSharedState> shared_states) {
+            did_read = true;
+            EXPECT_EQ(content.size(), 0ul);
+            EXPECT_EQ(shared_states.size(), 0ul);
+          }));
+  fake_db_->LoadCallback(true);
+  EXPECT_TRUE(did_read);
+}
+
+TEST_F(FeedStoreTest, ReadContentAndSharedStates) {
+  feedstore::Content content1 = MakeContent(1);
+  feedstore::Content content2 = MakeContent(2);
+  feedstore::StreamSharedState shared1 = MakeSharedState(1);
+  feedstore::StreamSharedState shared2 = MakeSharedState(2);
+
+  MakeFeedStore({{KeyForContentId("c/", content1.content_id()),
+                  RecordForContent(content1)},
+                 {KeyForContentId("c/", content2.content_id()),
+                  RecordForContent(content2)},
+                 {KeyForContentId("s/", shared1.content_id()),
+                  RecordForSharedState(shared1)},
+                 {KeyForContentId("s/", shared2.content_id()),
+                  RecordForSharedState(shared2)}});
+
+  std::vector<feedwire::ContentId> content_ids = {content1.content_id(),
+                                                  content2.content_id()};
+  std::vector<feedwire::ContentId> shared_state_ids = {shared1.content_id(),
+                                                       shared2.content_id()};
+
+  // Successful read
+  bool did_successful_read = false;
+  store_->ReadContent(
+      content_ids, shared_state_ids,
+      base::BindLambdaForTesting(
+          [&](std::vector<feedstore::Content> content,
+              std::vector<feedstore::StreamSharedState> shared_states) {
+            did_successful_read = true;
+            ASSERT_EQ(content.size(), 2ul);
+            EXPECT_EQ(ContentIdToString(content[0].content_id()),
+                      ContentIdToString(content1.content_id()));
+            EXPECT_EQ(content[0].frame(), content1.frame());
+
+            ASSERT_EQ(shared_states.size(), 2ul);
+            EXPECT_EQ(ContentIdToString(shared_states[0].content_id()),
+                      ContentIdToString(shared1.content_id()));
+            EXPECT_EQ(shared_states[0].shared_state_data(),
+                      shared1.shared_state_data());
+          }));
+  fake_db_->LoadCallback(true);
+  EXPECT_TRUE(did_successful_read);
+
+  // Failed read
+  bool did_failed_read = false;
+  store_->ReadContent(
+      content_ids, shared_state_ids,
+      base::BindLambdaForTesting(
+          [&](std::vector<feedstore::Content> content,
+              std::vector<feedstore::StreamSharedState> shared_states) {
+            did_failed_read = true;
+            EXPECT_EQ(content.size(), 0ul);
+            EXPECT_EQ(shared_states.size(), 0ul);
+          }));
+  fake_db_->LoadCallback(false);
+  EXPECT_TRUE(did_failed_read);
+}
+
+TEST_F(FeedStoreTest, ReadNextStreamState) {
+  feedstore::Record record;
+  feedstore::StreamAndContentState* next_stream_state =
+      record.mutable_next_stream_state();
+  *next_stream_state->mutable_stream_data() = MakeStreamData();
+  *next_stream_state->add_content() = MakeContent(0);
+  *next_stream_state->add_shared_state() = MakeSharedState(0);
+
+  MakeFeedStore({{"N", record}});
+
+  // Successful read
+  bool did_successful_read = false;
+  store_->ReadNextStreamState(base::BindLambdaForTesting(
+      [&](std::unique_ptr<feedstore::StreamAndContentState> result) {
+        did_successful_read = true;
+        ASSERT_TRUE(result);
+        EXPECT_TRUE(result->has_stream_data());
+        EXPECT_EQ(result->content_size(), 1);
+        EXPECT_EQ(result->shared_state_size(), 1);
+      }));
+  fake_db_->GetCallback(true);
+  EXPECT_TRUE(did_successful_read);
+
+  // Failed read
+  bool did_failed_read = false;
+  store_->ReadNextStreamState(base::BindLambdaForTesting(
+      [&](std::unique_ptr<feedstore::StreamAndContentState> result) {
+        did_failed_read = true;
+        EXPECT_FALSE(result);
+      }));
+  fake_db_->GetCallback(false);
+  EXPECT_TRUE(did_failed_read);
+}
+
+TEST_F(FeedStoreTest, WriteThenRead) {
+  MakeFeedStore({});
+
+  std::vector<feedstore::Record> records(4);
+  *records[0].mutable_stream_data() = MakeStreamData();
+  *records[1].mutable_content() = MakeContent(0);
+  *records[2].mutable_shared_state() = MakeSharedState(0);
+  *records[3].mutable_next_stream_state()->mutable_stream_data() =
+      MakeStreamData();
+
+  store_->Write(records, base::BindLambdaForTesting([](bool success) {}));
+  fake_db_->UpdateCallback(true);
+
+  bool did_read_stream_data = false;
+  store_->ReadStreamData(base::BindLambdaForTesting(
+      [&](std::unique_ptr<feedstore::StreamData> stream_data) {
+        did_read_stream_data = true;
+        ASSERT_TRUE(stream_data);
+        // Just make sure stream_data isn't a default empty StreamData.
+        EXPECT_TRUE(stream_data->has_content_id());
+      }));
+  fake_db_->GetCallback(true);
+  EXPECT_TRUE(did_read_stream_data);
+
+  bool did_read_content = false;
+  store_->ReadContent(
+      {records[1].content().content_id()},
+      {records[2].shared_state().content_id()},
+      base::BindLambdaForTesting(
+          [&](std::vector<feedstore::Content> content,
+              std::vector<feedstore::StreamSharedState> shared_states) {
+            did_read_content = true;
+            ASSERT_EQ(content.size(), 1ul);
+            EXPECT_TRUE(content[0].has_content_id());
+
+            ASSERT_EQ(shared_states.size(), 1ul);
+            EXPECT_TRUE(shared_states[0].has_content_id());
+          }));
+  fake_db_->LoadCallback(true);
+  EXPECT_TRUE(did_read_content);
+
+  bool did_read_next_stream_state = false;
+  store_->ReadNextStreamState(base::BindLambdaForTesting(
+      [&](std::unique_ptr<feedstore::StreamAndContentState> result) {
+        did_read_next_stream_state = true;
+        ASSERT_TRUE(result);
+        EXPECT_TRUE(result->has_stream_data());
+      }));
+  fake_db_->GetCallback(true);
+  EXPECT_TRUE(did_read_next_stream_state);
+}
+
+}  // namespace feed
diff --git a/components/feed/core/v2/test/stream_builder.cc b/components/feed/core/v2/test/stream_builder.cc
index d43c57c..c7721ad 100644
--- a/components/feed/core/v2/test/stream_builder.cc
+++ b/components/feed/core/v2/test/stream_builder.cc
@@ -29,6 +29,10 @@
   return MakeContentId(ContentId::FEATURE, "stories", id_number);
 }
 
+ContentId MakeSharedStateContentId(int id_number) {
+  return MakeContentId(ContentId::TYPE_UNDEFINED, "shared", id_number);
+}
+
 ContentId MakeRootId(int id_number) {
   return MakeContentId(ContentId::TYPE_UNDEFINED, "root", id_number);
 }
diff --git a/components/feed/core/v2/test/stream_builder.h b/components/feed/core/v2/test/stream_builder.h
index e0f73d3..446baee 100644
--- a/components/feed/core/v2/test/stream_builder.h
+++ b/components/feed/core/v2/test/stream_builder.h
@@ -21,6 +21,7 @@
                         int id_number);
 ContentId MakeClusterId(int id_number);
 ContentId MakeContentContentId(int id_number);
+ContentId MakeSharedStateContentId(int id_number);
 ContentId MakeRootId(int id_number = 0);
 ContentId MakeSharedStateId(int id_number = 0);
 feedstore::StreamStructure MakeStream(int id_number = 0);
@@ -30,6 +31,7 @@
 feedstore::StreamStructure MakeRemove(ContentId id);
 feedstore::StreamStructure MakeClearAll();
 feedstore::Content MakeContent(int id_number);
+feedstore::StreamSharedState MakeSharedState(int id_number);
 feedstore::DataOperation MakeOperation(feedstore::StreamStructure structure);
 feedstore::DataOperation MakeOperation(feedstore::Content content);
 
diff --git a/components/omnibox/browser/location_bar_model_delegate.h b/components/omnibox/browser/location_bar_model_delegate.h
index 37b69d8..57257ad6 100644
--- a/components/omnibox/browser/location_bar_model_delegate.h
+++ b/components/omnibox/browser/location_bar_model_delegate.h
@@ -37,8 +37,10 @@
   // exists. Otherwise returns false and leaves |url| unmodified.
   virtual bool GetURL(GURL* url) const = 0;
 
-  // Returns whether we should prevent elision of the display URL and turn off
-  // query in omnibox. Based on whether user has a specified extension enabled.
+  // Returns whether to prevent elision of the display URL and turn off
+  // query in omnibox. Based on whether user has a specified extension or pref
+  // enabled. If true, the only elisions should be username/password and
+  // trailing slash on bare hostname.
   virtual bool ShouldPreventElision() const;
 
   // Returns whether everything after the hostname should be trimmed from the
diff --git a/components/omnibox/browser/location_bar_model_impl.cc b/components/omnibox/browser/location_bar_model_impl.cc
index ee45814..102451a9 100644
--- a/components/omnibox/browser/location_bar_model_impl.cc
+++ b/components/omnibox/browser/location_bar_model_impl.cc
@@ -55,14 +55,6 @@
     format_types |= url_formatter::kFormatUrlTrimAfterHost;
   }
 
-  // Early exit to prevent elision of URLs when relevant extension or pref is
-  // enabled.
-  if (delegate_->ShouldPreventElision()) {
-    url_formatter::FormatUrlTypes full_url_format_types = format_types &=
-        ~url_formatter::kFormatUrlOmitHTTP;
-    return GetFormattedURL(full_url_format_types);
-  }
-
 #if defined(OS_IOS)
   format_types |= url_formatter::kFormatUrlTrimAfterHost;
 #endif
@@ -83,6 +75,14 @@
     url_formatter::FormatUrlTypes format_types) const {
   if (!ShouldDisplayURL())
     return base::string16{};
+
+  // Reset |format_types| to prevent elision of URLs when relevant extension or
+  // pref is enabled.
+  if (delegate_->ShouldPreventElision()) {
+    format_types = url_formatter::kFormatUrlOmitDefaults &
+                   ~url_formatter::kFormatUrlOmitHTTP;
+  }
+
   GURL url(GetURL());
   // Note that we can't unescape spaces here, because if the user copies this
   // and pastes it into another program, that program may think the URL ends at
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
index cf69a1d..c90b22b 100644
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -124,11 +124,10 @@
 const base::Feature kOmniboxPedalSuggestions{"OmniboxPedalSuggestions",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Feature used for UI that improves transparency of and control over omnibox
-// suggestions. This includes "Why this Suggestion?" and user controls to delete
-// personalized suggestions. This will be eventually enabled by default.
+// Feature that surfaces an X button next to deletable omnibox suggestions.
+// This is to make the suggestion removal feature more discoverable.
 const base::Feature kOmniboxSuggestionTransparencyOptions{
-    "OmniboxSuggestionTransparencyOptions", base::FEATURE_DISABLED_BY_DEFAULT};
+    "OmniboxSuggestionTransparencyOptions", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Feature to enable clipboard provider to suggest searching for copied images.
 const base::Feature kEnableClipboardProviderImageSuggestions{
diff --git a/components/permissions/android/permissions_android_strings.grd b/components/permissions/android/permissions_android_strings.grd
index fee4a4d2..6e5eccfc 100644
--- a/components/permissions/android/permissions_android_strings.grd
+++ b/components/permissions/android/permissions_android_strings.grd
@@ -179,7 +179,7 @@
       <message name="IDS_INFOBAR_MISSING_LOCATION_PERMISSION_TEXT" desc="Text shown in an infobar when a website has requested access to the location capabilities, but Chrome is missing the Android location permission.">
         Chrome needs access to your location to share your location with this site.
       </message>
-      <message name="IDS_INFOBAR_UPDATE_PERMISSIONS_BUTTON_TEXT" desc="Button text shown when Chrome does not have the necessary permission required to complete the requested tasks (e.g. a website has request location information, but Chrome is missing that Android permission)." formatter_data="android_java">
+      <message name="IDS_INFOBAR_UPDATE_PERMISSIONS_BUTTON_TEXT" desc="Button text shown when Chrome does not have the necessary permission required to complete the requested tasks (e.g. a website has request location information, but Chrome is missing that Android permission).">
         Continue
       </message>
 
diff --git a/components/permissions_strings.grdp b/components/permissions_strings.grdp
index 4f296ad..ea74672 100644
--- a/components/permissions_strings.grdp
+++ b/components/permissions_strings.grdp
@@ -45,7 +45,7 @@
     <message name="IDS_STORAGE_ACCESS_INFOBAR_TEXT" desc="Permission request shown if the user is visiting a site needs access to its data while it is embedded into another site.">
       <ph name="EMBEDDED_URL">$1<ex>news.site</ex></ph> wants to use cookies and site data on <ph name="TOP_LEVEL_URL">$2<ex>content_domain.site</ex></ph>
     </message>
-    <message name="IDS_INFOBAR_UPDATE_PERMISSIONS_BUTTON_TEXT" desc="Button text shown when Chrome does not have the necessary permission required to complete the requested tasks (e.g. a website has request location information, but Chrome is missing that Android permission)." formatter_data="android_java">
+    <message name="IDS_INFOBAR_UPDATE_PERMISSIONS_BUTTON_TEXT" desc="Button text shown when Chrome does not have the necessary permission required to complete the requested tasks (e.g. a website has request location information, but Chrome is missing that Android permission).">
       Continue
     </message>
     <message name="IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO_INFOBAR_TEXT" desc="Text requesting permission for a site to access the computer's microphone and camera.">
diff --git a/components/prefs/testing_pref_service.cc b/components/prefs/testing_pref_service.cc
index f6b170a..fb06790 100644
--- a/components/prefs/testing_pref_service.cc
+++ b/components/prefs/testing_pref_service.cc
@@ -17,6 +17,7 @@
 template <>
 TestingPrefServiceBase<PrefService, PrefRegistry>::TestingPrefServiceBase(
     TestingPrefStore* managed_prefs,
+    TestingPrefStore* supervised_user_prefs,
     TestingPrefStore* extension_prefs,
     TestingPrefStore* user_prefs,
     TestingPrefStore* recommended_prefs,
@@ -25,9 +26,9 @@
     : PrefService(
           std::unique_ptr<PrefNotifierImpl>(pref_notifier),
           std::make_unique<PrefValueStore>(managed_prefs,
-                                           nullptr,
+                                           supervised_user_prefs,
                                            extension_prefs,
-                                           nullptr,
+                                           /*command_line_prefs=*/nullptr,
                                            user_prefs,
                                            recommended_prefs,
                                            pref_registry->defaults().get(),
@@ -39,16 +40,18 @@
                                       PrefRegistry>::HandleReadError),
           false),
       managed_prefs_(managed_prefs),
+      supervised_user_prefs_(supervised_user_prefs),
       extension_prefs_(extension_prefs),
       user_prefs_(user_prefs),
       recommended_prefs_(recommended_prefs) {}
 
 TestingPrefServiceSimple::TestingPrefServiceSimple()
     : TestingPrefServiceBase<PrefService, PrefRegistry>(
-          new TestingPrefStore(),
-          new TestingPrefStore(),
-          new TestingPrefStore(),
-          new TestingPrefStore(),
+          /*managed_prefs=*/new TestingPrefStore(),
+          /*supervised_user_prefs=*/new TestingPrefStore(),
+          /*extension_prefs=*/new TestingPrefStore(),
+          /*user_prefs=*/new TestingPrefStore(),
+          /*recommended_prefs=*/new TestingPrefStore(),
           new PrefRegistrySimple(),
           new PrefNotifierImpl()) {}
 
diff --git a/components/prefs/testing_pref_service.h b/components/prefs/testing_pref_service.h
index badf4c1..c802869 100644
--- a/components/prefs/testing_pref_service.h
+++ b/components/prefs/testing_pref_service.h
@@ -41,6 +41,12 @@
   // preference has been defined previously.
   void RemoveManagedPref(const std::string& path);
 
+  // Similar to the above, but for supervised user preferences.
+  const base::Value* GetSupervisedUserPref(const std::string& path) const;
+  void SetSupervisedUserPref(const std::string& path,
+                             std::unique_ptr<base::Value> value);
+  void RemoveSupervisedUserPref(const std::string& path);
+
   // Similar to the above, but for extension preferences.
   // Does not really know about extensions and their order of installation.
   // Useful in tests that only check that a preference is overridden by an
@@ -69,6 +75,7 @@
 
  protected:
   TestingPrefServiceBase(TestingPrefStore* managed_prefs,
+                         TestingPrefStore* supervised_user_prefs,
                          TestingPrefStore* extension_prefs,
                          TestingPrefStore* user_prefs,
                          TestingPrefStore* recommended_prefs,
@@ -91,6 +98,7 @@
 
   // Pointers to the pref stores our value store uses.
   scoped_refptr<TestingPrefStore> managed_prefs_;
+  scoped_refptr<TestingPrefStore> supervised_user_prefs_;
   scoped_refptr<TestingPrefStore> extension_prefs_;
   scoped_refptr<TestingPrefStore> user_prefs_;
   scoped_refptr<TestingPrefStore> recommended_prefs_;
@@ -116,9 +124,10 @@
   DISALLOW_COPY_AND_ASSIGN(TestingPrefServiceSimple);
 };
 
-template<>
+template <>
 TestingPrefServiceBase<PrefService, PrefRegistry>::TestingPrefServiceBase(
     TestingPrefStore* managed_prefs,
+    TestingPrefStore* supervised_user_prefs,
     TestingPrefStore* extension_prefs,
     TestingPrefStore* user_prefs,
     TestingPrefStore* recommended_prefs,
@@ -151,6 +160,26 @@
 }
 
 template <class SuperPrefService, class ConstructionPrefRegistry>
+const base::Value*
+TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+    GetSupervisedUserPref(const std::string& path) const {
+  return GetPref(supervised_user_prefs_.get(), path);
+}
+
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+    SetSupervisedUserPref(const std::string& path,
+                          std::unique_ptr<base::Value> value) {
+  SetPref(supervised_user_prefs_.get(), path, std::move(value));
+}
+
+template <class SuperPrefService, class ConstructionPrefRegistry>
+void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
+    RemoveSupervisedUserPref(const std::string& path) {
+  RemovePref(supervised_user_prefs_.get(), path);
+}
+
+template <class SuperPrefService, class ConstructionPrefRegistry>
 const base::Value* TestingPrefServiceBase<
     SuperPrefService,
     ConstructionPrefRegistry>::GetExtensionPref(const std::string& path) const {
@@ -237,6 +266,7 @@
 void TestingPrefServiceBase<SuperPrefService, ConstructionPrefRegistry>::
     SetInitializationCompleted() {
   managed_prefs_->SetInitializationCompleted();
+  supervised_user_prefs_->SetInitializationCompleted();
   extension_prefs_->SetInitializationCompleted();
   recommended_prefs_->SetInitializationCompleted();
   // |user_prefs_| is initialized in PrefService constructor so no need to
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index d0fe038..9625205 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1653,13 +1653,8 @@
   if (!preview_document_mapping.IsValid())
     return false;
 
-  auto preview_document_buffer =
-      preview_document_mapping.GetMemoryAsSpan<const uint8_t>();
-  if (!print_preview_context_.metafile()->InitFromData(
-          preview_document_buffer.data(), preview_document_buffer.size())) {
-    LOG(ERROR) << "Failed to initialize PDF metafile.";
-    return false;
-  }
+  CHECK(print_preview_context_.metafile()->InitFromData(
+      preview_document_mapping.GetMemoryAsSpan<const uint8_t>()));
 
   if (CheckForCancel())
     return false;
diff --git a/components/printing/test/mock_printer.cc b/components/printing/test/mock_printer.cc
index 9c7309f..524ca62 100644
--- a/components/printing/test/mock_printer.cc
+++ b/components/printing/test/mock_printer.cc
@@ -215,7 +215,7 @@
 #else
   printing::MetafileSkia metafile;
 #endif
-  metafile.InitFromData(mapping.memory(), mapping.size());
+  metafile.InitFromData(mapping.GetMemoryAsSpan<const uint8_t>());
   printing::Image image(metafile);
   pages_.push_back(base::MakeRefCounted<MockPrinterPage>(
       mapping.memory(), mapping.size(), image));
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 23b3ccd..eb24fbe 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -447,7 +447,7 @@
 <translation id="2930577230479659665">トリミング(コピー単位)</translation>
 <translation id="2934466151127459956">Government-Letter</translation>
 <translation id="2941952326391522266">このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。このサーバーのセキュリティ証明書は <ph name="DOMAIN2" /> から発行されています。原因としては、不適切な設定や、悪意のあるユーザーによる接続妨害が考えられます。</translation>
-<translation id="2943895734390379394">アップロード時間:</translation>
+<translation id="2943895734390379394">アップロード時刻:</translation>
 <translation id="2948083400971632585">接続用に設定されたプロキシは、設定ページで無効にできます。</translation>
 <translation id="2951588413176968965">自分の用紙受け</translation>
 <translation id="295526156371527179">警告: このポリシーは辞書でないため、ポリシーで指定されているとおりに辞書として統合されませんでした。</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index 296217b..00f1a80 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -1019,7 +1019,7 @@
 <translation id="5340250774223869109">O aplicativo foi bloqueado</translation>
 <translation id="534295439873310000">Dispositivos NFC</translation>
 <translation id="5344579389779391559">Esta página pode tentar cobrar pagamento em dinheiro</translation>
-<translation id="5346336634660260557">Verificar o conteúdo da área de transferência, assim como dos arquivos que você faz o download ou upload no Chrome.</translation>
+<translation id="5346336634660260557">Verificar o conteúdo da área de transferência, assim como dos arquivos que você salva ou envia pelo Chrome.</translation>
 <translation id="5355557959165512791">Não é possível acessar <ph name="SITE" /> neste momento, porque o certificado dele foi revogado. Como os ataques e erros de rede são geralmente temporários, esta página provavelmente funcionará mais tarde.</translation>
 <translation id="536296301121032821">Falha ao armazenar as configurações da política</translation>
 <translation id="5371425731340848620">Atualizar cartão</translation>
diff --git a/components/sync_preferences/testing_pref_service_syncable.cc b/components/sync_preferences/testing_pref_service_syncable.cc
index 5b3c7ee0..fc7edf9 100644
--- a/components/sync_preferences/testing_pref_service_syncable.cc
+++ b/components/sync_preferences/testing_pref_service_syncable.cc
@@ -16,6 +16,7 @@
 TestingPrefServiceBase<sync_preferences::PrefServiceSyncable,
                        user_prefs::PrefRegistrySyncable>::
     TestingPrefServiceBase(TestingPrefStore* managed_prefs,
+                           TestingPrefStore* supervised_user_prefs,
                            TestingPrefStore* extension_prefs,
                            TestingPrefStore* user_prefs,
                            TestingPrefStore* recommended_prefs,
@@ -24,9 +25,9 @@
     : sync_preferences::PrefServiceSyncable(
           std::unique_ptr<PrefNotifierImpl>(pref_notifier),
           std::make_unique<PrefValueStore>(managed_prefs,
-                                           nullptr,  // supervised_user_prefs
-                                           extension_prefs,  // extension_prefs
-                                           nullptr,  // command_line_prefs
+                                           supervised_user_prefs,
+                                           extension_prefs,
+                                           /*command_line_prefs=*/nullptr,
                                            user_prefs,
                                            recommended_prefs,
                                            pref_registry->defaults().get(),
@@ -49,15 +50,17 @@
 TestingPrefServiceSyncable::TestingPrefServiceSyncable()
     : TestingPrefServiceBase<PrefServiceSyncable,
                              user_prefs::PrefRegistrySyncable>(
-          new TestingPrefStore(),
-          new TestingPrefStore(),
-          new TestingPrefStore(),
-          new TestingPrefStore(),
+          /*managed_prefs=*/new TestingPrefStore(),
+          /*supervised_user_prefs=*/new TestingPrefStore(),
+          /*extension_prefs=*/new TestingPrefStore(),
+          /*user_prefs=*/new TestingPrefStore(),
+          /*recommended_prefs=*/new TestingPrefStore(),
           new user_prefs::PrefRegistrySyncable(),
           new PrefNotifierImpl()) {}
 
 TestingPrefServiceSyncable::TestingPrefServiceSyncable(
     TestingPrefStore* managed_prefs,
+    TestingPrefStore* supervised_user_prefs,
     TestingPrefStore* extension_prefs,
     TestingPrefStore* user_prefs,
     TestingPrefStore* recommended_prefs,
@@ -66,6 +69,7 @@
     : TestingPrefServiceBase<PrefServiceSyncable,
                              user_prefs::PrefRegistrySyncable>(
           managed_prefs,
+          supervised_user_prefs,
           extension_prefs,
           user_prefs,
           recommended_prefs,
diff --git a/components/sync_preferences/testing_pref_service_syncable.h b/components/sync_preferences/testing_pref_service_syncable.h
index ee59cc1..fcbad54 100644
--- a/components/sync_preferences/testing_pref_service_syncable.h
+++ b/components/sync_preferences/testing_pref_service_syncable.h
@@ -23,8 +23,8 @@
 //  a PrefModelAssociatorClient.
 // TODO(tschumann) The whole purpose of TestingPrefServiceBase is questionable
 // and I'd be in favor of removing it completely:
-//  -- it hides the dependency injetion of the different stores
-//  -- just to later offer ways to manipulate speficic stores.
+//  -- it hides the dependency injection of the different stores
+//  -- just to later offer ways to manipulate specific stores.
 //  -- if tests just dependency injects the individual stores directly, they
 //     already have full control and won't need that indirection at all.
 // See PrefServiceSyncableMergeTest as an example of a cleaner way.
@@ -34,6 +34,7 @@
  public:
   TestingPrefServiceSyncable();
   TestingPrefServiceSyncable(TestingPrefStore* managed_prefs,
+                             TestingPrefStore* supervised_user_prefs,
                              TestingPrefStore* extension_prefs,
                              TestingPrefStore* user_prefs,
                              TestingPrefStore* recommended_prefs,
@@ -56,6 +57,7 @@
 TestingPrefServiceBase<sync_preferences::PrefServiceSyncable,
                        user_prefs::PrefRegistrySyncable>::
     TestingPrefServiceBase(TestingPrefStore* managed_prefs,
+                           TestingPrefStore* supervised_user_prefs,
                            TestingPrefStore* extension_prefs,
                            TestingPrefStore* user_prefs,
                            TestingPrefStore* recommended_prefs,
diff --git a/content/browser/accessibility/accessibility_auralinux_browsertest.cc b/content/browser/accessibility/accessibility_auralinux_browsertest.cc
index 81984b0..99bda64d 100644
--- a/content/browser/accessibility/accessibility_auralinux_browsertest.cc
+++ b/content/browser/accessibility/accessibility_auralinux_browsertest.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind_helpers.h"
 #include "base/macros.h"
+#include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "content/browser/accessibility/accessibility_browsertest.h"
 #include "content/browser/accessibility/browser_accessibility.h"
@@ -314,7 +315,7 @@
 
   // Single line text fields should return the whole text.
   CheckTextAtOffset(atk_text, 0, ATK_TEXT_BOUNDARY_LINE_START, 0,
-                    InputContentsString().size(),
+                    int{InputContentsString().size()},
                     InputContentsString().c_str());
 
   g_object_unref(atk_text);
@@ -333,7 +334,52 @@
 
   // Last line does not have a trailing newline.
   CheckTextAtOffset(atk_text, 32, ATK_TEXT_BOUNDARY_LINE_START, 32,
-                    InputContentsString().size(), "\"KHTML, like\".");
+                    int{InputContentsString().size()}, "\"KHTML, like\".");
+
+  g_object_unref(atk_text);
+}
+
+IN_PROC_BROWSER_TEST_F(AccessibilityAuraLinuxBrowserTest,
+                       TestBlankLineTextAtOffsetWithBoundaryLine) {
+  AtkText* atk_text = SetUpTextareaField();
+
+  AccessibilityNotificationWaiter waiter(shell()->web_contents(),
+                                         ui::kAXModeComplete,
+                                         ax::mojom::Event::kValueChanged);
+  // Add a blank line at the end of the textarea.
+  ExecuteScript(base::UTF8ToUTF16(R"SCRIPT(
+      const textarea = document.querySelector('textarea');
+      textarea.value += '\n';
+      )SCRIPT"));
+  waiter.WaitForNotification();
+
+  // The second last line should have an additional trailing newline. Also,
+  // Blink represents the blank line with a newline character, so in total there
+  // should be two more newlines. The second newline is not part of the HTML
+  // value attribute however.
+  int contents_string_length = int{InputContentsString().size()} + 1;
+  CheckTextAtOffset(atk_text, 32, ATK_TEXT_BOUNDARY_LINE_START, 32,
+                    contents_string_length, "\"KHTML, like\".\n");
+  CheckTextAtOffset(atk_text, 46, ATK_TEXT_BOUNDARY_LINE_START, 32,
+                    contents_string_length, "\"KHTML, like\".\n");
+
+  // An offset one past the last character should return the last line which is
+  // blank. This is represented by Blink with yet another line break.
+  CheckTextAtOffset(atk_text, contents_string_length,
+                    ATK_TEXT_BOUNDARY_LINE_START, contents_string_length,
+                    (contents_string_length + 1), "\n");
+
+  {
+    // There should be no text after the blank line.
+    int start_offset = 0;
+    int end_offset = 0;
+    char* text = atk_text_get_text_at_offset(
+        atk_text, (contents_string_length + 1), ATK_TEXT_BOUNDARY_LINE_START,
+        &start_offset, &end_offset);
+    EXPECT_EQ(0, start_offset);
+    EXPECT_EQ(0, end_offset);
+    EXPECT_EQ(nullptr, text);
+  }
 
   g_object_unref(atk_text);
 }
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc
index 9b9e533..320407c 100644
--- a/content/browser/accessibility/accessibility_win_browsertest.cc
+++ b/content/browser/accessibility/accessibility_win_browsertest.cc
@@ -464,8 +464,16 @@
     BrowserAccessibility& node,
     ax::mojom::Role role,
     const std::string& name_or_value) {
-  const auto& name = node.GetStringAttribute(ax::mojom::StringAttribute::kName);
-  const auto& value =
+  const std::string& name =
+      node.GetStringAttribute(ax::mojom::StringAttribute::kName);
+  // Note that "BrowserAccessibility::GetValue" has the
+  // added functionality of computing the value of an ARIA text box from its
+  // inner text.
+  //
+  // <div contenteditable="true" role="textbox">Hello world.</div>
+  // Will expose no HTML value attribute, but some screen readers, such as Jaws,
+  // VoiceOver and Talkback, require one to be computed.
+  const std::string& value =
       node.GetStringAttribute(ax::mojom::StringAttribute::kValue);
   if (node.GetRole() == role &&
       (name == name_or_value || value == name_or_value)) {
@@ -1843,9 +1851,6 @@
   EXPECT_LT(1, prev_width);
   EXPECT_LT(1, prev_height);
 
-  base::win::ScopedBstr text0;
-  ASSERT_HRESULT_SUCCEEDED(input_text->get_text(0, -1, text0.Receive()));
-
   // Delete the character in the input field.
   AccessibilityNotificationWaiter waiter(
       shell()->web_contents(), ui::kAXModeComplete,
@@ -1859,8 +1864,12 @@
   ASSERT_HRESULT_SUCCEEDED(input_text->get_caretOffset(&caret_offset));
   ASSERT_EQ(0, caret_offset);
 
-  base::win::ScopedBstr text;
-  ASSERT_HRESULT_SUCCEEDED(input_text->get_text(0, -1, text.Receive()));
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_EQ(nullptr, text.Get());
+  }
 
   // Now that input is completely empty, the position of the caret should be
   // returned for character 0. The x,y position and height should be the same as
@@ -1894,8 +1903,12 @@
   EXPECT_LT(1, prev_width);
   EXPECT_LT(1, prev_height);
 
-  base::win::ScopedBstr text0;
-  ASSERT_HRESULT_SUCCEEDED(input_text->get_text(0, -1, text0.Receive()));
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_STREQ(L"x", text.Get());
+  }
 
   // Delete the character in the input field.
   AccessibilityNotificationWaiter waiter(
@@ -1905,24 +1918,52 @@
   waiter.WaitForNotification();
 
   ASSERT_HRESULT_SUCCEEDED(input_text->get_nCharacters(&n_characters));
-  ASSERT_EQ(0, n_characters);
+  // When the text field is empty, the placeholder text should become visible.
+  ASSERT_EQ(11, n_characters);
   LONG caret_offset;
   ASSERT_HRESULT_SUCCEEDED(input_text->get_caretOffset(&caret_offset));
   ASSERT_EQ(0, caret_offset);
 
-  base::win::ScopedBstr text;
-  ASSERT_HRESULT_SUCCEEDED(input_text->get_text(0, -1, text.Receive()));
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_STREQ(L"placeholder", text.Get());
+  }
 
-  // Now that input is completely empty, the position of the caret should be
-  // returned for character 0. The x,y position and height should be the same as
-  // it was as when there was single character, but the width should now be 1.
-  LONG x, y, width, height;
-  for (int offset = IA2_TEXT_OFFSET_CARET; offset <= 0; ++offset) {
+  // Now that input is completely empty and the placeholder text is showing, the
+  // position of the caret should be returned for character 0. The x,y position,
+  // height and width should be the same as it was as when there was a single
+  // character.
+  {
+    LONG x, y, width, height;
     EXPECT_HRESULT_SUCCEEDED(input_text->get_characterExtents(
-        offset, IA2_COORDTYPE_SCREEN_RELATIVE, &x, &y, &width, &height));
+        IA2_TEXT_OFFSET_CARET, IA2_COORDTYPE_SCREEN_RELATIVE, &x, &y, &width,
+        &height));
     EXPECT_EQ(prev_x, x);
     EXPECT_EQ(prev_y, y);
-    EXPECT_EQ(7, width);
+    EXPECT_EQ(prev_width, width);
+    EXPECT_EQ(prev_height, height);
+  }
+
+  {
+    LONG x, y, width, height;
+    EXPECT_HRESULT_SUCCEEDED(input_text->get_characterExtents(
+        0, IA2_COORDTYPE_SCREEN_RELATIVE, &x, &y, &width, &height));
+    EXPECT_EQ(prev_x, x);
+    EXPECT_EQ(prev_y, y);
+    EXPECT_EQ(prev_width, width);
+    EXPECT_EQ(prev_height, height);
+  }
+
+  {
+    LONG x, y, width, height;
+    EXPECT_HRESULT_SUCCEEDED(input_text->get_characterExtents(
+        IA2_TEXT_OFFSET_LENGTH, IA2_COORDTYPE_SCREEN_RELATIVE, &x, &y, &width,
+        &height));
+    EXPECT_EQ(prev_x, x);
+    EXPECT_EQ(prev_y, y);
+    EXPECT_EQ(1, width);
     EXPECT_EQ(prev_height, height);
   }
 }
@@ -2004,8 +2045,8 @@
 }
 
 // TODO(accessibility) empty contenteditable gets height of entire
-// contenteditable instead of just 1 line. May be able to use the following
-// in Blink to get the height of a line -- it's at least close:
+// contenteditable instead of just 1 line. Maybe we are able to use the
+// following in Blink to get the height of a line -- it's at least close:
 // layout_object->Style()->GetFont().PrimaryFont()->GetFontMetrics().Height()
 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
                        DISABLED_TestCharacterExtentsInEmptyContenteditable) {
@@ -2025,8 +2066,12 @@
   EXPECT_LT(1, prev_width);
   EXPECT_LT(1, prev_height);
 
-  base::win::ScopedBstr text0;
-  ASSERT_HRESULT_SUCCEEDED(input_text->get_text(0, -1, text0.Receive()));
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_STREQ(L"hello\n\n\nhello", text.Get());
+  }
 
   // Delete the character in the input field.
   AccessibilityNotificationWaiter waiter(shell()->web_contents(),
@@ -2042,8 +2087,12 @@
   ASSERT_HRESULT_SUCCEEDED(input_text->get_caretOffset(&caret_offset));
   ASSERT_EQ(0, caret_offset);
 
-  base::win::ScopedBstr text;
-  ASSERT_HRESULT_SUCCEEDED(input_text->get_text(0, -1, text.Receive()));
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_EQ(nullptr, text.Get());
+  }
 
   // Now that input is completely empty, the position of the caret should be
   // returned for character 0. The x,y position and height should be the same as
@@ -2077,8 +2126,12 @@
   EXPECT_LT(1, prev_width);
   EXPECT_LT(1, prev_height);
 
-  base::win::ScopedBstr text0;
-  ASSERT_HRESULT_SUCCEEDED(input_text->get_text(0, -1, text0.Receive()));
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_STREQ(L"x", text.Get());
+  }
 
   // Delete the character in the input field.
   AccessibilityNotificationWaiter waiter(
@@ -2094,8 +2147,12 @@
   ASSERT_HRESULT_SUCCEEDED(input_text->get_caretOffset(&caret_offset));
   ASSERT_EQ(0, caret_offset);
 
-  base::win::ScopedBstr text;
-  ASSERT_HRESULT_SUCCEEDED(input_text->get_text(0, -1, text.Receive()));
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_EQ(nullptr, text.Get());
+  }
 
   // Now that input is completely empty, the position of the caret should be
   // returned for character 0. The x,y position and height should be the same as
@@ -2129,6 +2186,13 @@
   EXPECT_LT(1, prev_width);
   EXPECT_LT(1, prev_height);
 
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_STREQ(L"x", text.Get());
+  }
+
   // Delete the character in the input field.
   AccessibilityNotificationWaiter waiter(
       shell()->web_contents(), ui::kAXModeComplete,
@@ -2144,6 +2208,13 @@
   ASSERT_HRESULT_SUCCEEDED(input_text->get_caretOffset(&caret_offset));
   ASSERT_EQ(0, caret_offset);
 
+  {
+    base::win::ScopedBstr text;
+    ASSERT_HRESULT_SUCCEEDED(
+        input_text->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
+    EXPECT_EQ(nullptr, text.Get());
+  }
+
   // Now that input is completely empty, the position of the caret should be
   // returned for character 0. The x,y position and height should be the same as
   // it was as when there was single character, but the width should now be 1.
@@ -3463,6 +3534,58 @@
                     L"\"KHTML, like\".");
 }
 
+IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
+                       TestBlankLineTextAtOffsetWithBoundaryLine) {
+  Microsoft::WRL::ComPtr<IAccessibleText> textarea_text;
+  SetUpTextareaField(&textarea_text);
+
+  AccessibilityNotificationWaiter waiter(shell()->web_contents(),
+                                         ui::kAXModeComplete,
+                                         ax::mojom::Event::kValueChanged);
+  // Add a blank line at the end of the textarea.
+  ExecuteScript(base::UTF8ToUTF16(R"SCRIPT(
+      const textarea = document.querySelector('textarea');
+      textarea.value += '\n';
+      )SCRIPT"));
+  waiter.WaitForNotification();
+
+  // The second last line should have an additional trailing newline. Also,
+  // Blink represents the blank line with a newline character, so in total there
+  // should be two more newlines. The second newline is not part of the HTML
+  // value attribute however.
+  int contents_string_length = int{InputContentsString().size()} + 1;
+  CheckTextAtOffset(textarea_text, 32, IA2_TEXT_BOUNDARY_LINE, 32,
+                    contents_string_length, L"\"KHTML, like\".\n");
+  CheckTextAtOffset(textarea_text, 46, IA2_TEXT_BOUNDARY_LINE, 32,
+                    contents_string_length, L"\"KHTML, like\".\n");
+
+  // An offset one past the last character should return the last line which is
+  // blank. This is represented by Blink with yet another line break.
+  CheckTextAtOffset(textarea_text, contents_string_length,
+                    IA2_TEXT_BOUNDARY_LINE, contents_string_length,
+                    (contents_string_length + 1), L"\n");
+
+  {
+    // There should be no text after the blank line.
+    LONG start_offset = 0;
+    LONG end_offset = 0;
+    base::win::ScopedBstr text;
+    EXPECT_EQ(S_FALSE, textarea_text->get_textAtOffset(
+                           (contents_string_length + 1), IA2_TEXT_BOUNDARY_LINE,
+                           &start_offset, &end_offset, text.Receive()));
+
+    // Test special offsets.
+    EXPECT_EQ(S_FALSE, textarea_text->get_textAtOffset(
+                           IA2_TEXT_OFFSET_LENGTH, IA2_TEXT_BOUNDARY_LINE,
+                           &start_offset, &end_offset, text.Receive()));
+  }
+
+  // The caret should have moved to the blank line.
+  CheckTextAtOffset(textarea_text, IA2_TEXT_OFFSET_CARET,
+                    IA2_TEXT_BOUNDARY_LINE, contents_string_length,
+                    (contents_string_length + 1), L"\n");
+}
+
 IN_PROC_BROWSER_TEST_F(
     AccessibilityWinBrowserTest,
     TestTextAtOffsetWithBoundaryLineAndMultiLineEmbeddedObject) {
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 0d6b5f3..ae2c706 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -1089,6 +1089,14 @@
   return GetData().IsClickable();
 }
 
+bool BrowserAccessibility::IsTextField() const {
+  return IsPlainTextField() || IsRichTextField();
+}
+
+bool BrowserAccessibility::IsPasswordField() const {
+  return IsTextField() && HasState(ax::mojom::State::kProtected);
+}
+
 bool BrowserAccessibility::IsPlainTextField() const {
   return GetData().IsPlainTextField();
 }
@@ -1206,18 +1214,17 @@
 }
 
 base::string16 BrowserAccessibility::GetInnerText() const {
-  base::string16 value =
-      GetString16Attribute(ax::mojom::StringAttribute::kValue);
-  if (!value.empty())
-    return value;
-
-  if (IsTextOnlyObject())
+  if (!InternalChildCount()) {
+    if (IsTextField())
+      return GetString16Attribute(ax::mojom::StringAttribute::kValue);
     return GetString16Attribute(ax::mojom::StringAttribute::kName);
+  }
 
   base::string16 text;
   for (InternalChildIterator it = InternalChildrenBegin();
-       it != InternalChildrenEnd(); ++it)
+       it != InternalChildrenEnd(); ++it) {
     text += (*it).GetInnerText();
+  }
   return text;
 }
 
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h
index e52e0ec..79221e2 100644
--- a/content/browser/accessibility/browser_accessibility.h
+++ b/content/browser/accessibility/browser_accessibility.h
@@ -388,17 +388,38 @@
   bool IsWebAreaForPresentationalIframe() const;
 
   virtual bool IsClickable() const;
+
+  // A text field is any widget in which the user should be able to enter and
+  // edit text.
+  //
+  // Examples include <input type="text">, <input type="password">, <textarea>,
+  // <div contenteditable="true">, <div role="textbox">, <div role="searchbox">
+  // and <div role="combobox">. Note that when an ARIA role that indicates that
+  // the widget is editable is used, such as "role=textbox", the element doesn't
+  // need to be contenteditable for this method to return true, as in theory
+  // JavaScript could be used to implement editing functionality. In practice,
+  // this situation should be rare.
+  bool IsTextField() const;
+
+  // A text field that is used for entering passwords.
+  bool IsPasswordField() const;
+
+  // A text field that doesn't accept rich text content, such as text with
+  // special formatting or styling.
   bool IsPlainTextField() const;
+
+  // A text field that accepts rich text content, such as text with special
+  // formatting or styling.
   bool IsRichTextField() const;
 
   // Return true if the accessible name was explicitly set to "" by the author
   bool HasExplicitlyEmptyName() const;
 
-  // If an object is focusable but has no accessible name, use this
-  // to compute a name from its descendants.
+  // TODO(nektar): Remove this method and use GetInnerText instead.
   std::string ComputeAccessibleNameFromDescendants() const;
 
-  // Get text to announce for a live region change if AT does not implement.
+  // Get text to announce for a live region change if an AT does not implement
+  // this functionality.
   std::string GetLiveRegionText() const;
 
   // Creates a text position rooted at this object. Does not conver to a
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc
index 25459cb0..f6e0719 100644
--- a/content/browser/accessibility/browser_accessibility_win_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -789,9 +789,9 @@
   // Get the text of the button.
   EXPECT_EQ(S_OK, root_obj->get_hyperlink(2, hyperlink.GetAddressOf()));
   EXPECT_EQ(S_OK, hyperlink.CopyTo(hypertext.GetAddressOf()));
-  EXPECT_EQ(S_FALSE,
+  EXPECT_EQ(S_OK,
             hypertext->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive()));
-  EXPECT_EQ(nullptr, text.Get());
+  EXPECT_STREQ(button_text_name.c_str(), text.Get());
   text.Reset();
   hyperlink.Reset();
   hypertext.Reset();
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index a2866ad..40f7ad4 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1553,6 +1553,11 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
+                       AccessibilityIframeScrollable) {
+  RunHtmlTest(FILE_PATH_LITERAL("iframe-scrollable.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityIframePostEnable) {
   enable_accessibility_after_navigating_ = true;
   RunHtmlTest(FILE_PATH_LITERAL("iframe.html"));
diff --git a/content/browser/renderer_host/frame_token_message_queue.cc b/content/browser/renderer_host/frame_token_message_queue.cc
index a48ea52..e604f03 100644
--- a/content/browser/renderer_host/frame_token_message_queue.cc
+++ b/content/browser/renderer_host/frame_token_message_queue.cc
@@ -35,6 +35,11 @@
                                    base::NumberToString(frame_token));
     base::debug::DumpWithoutCrashing();
 
+    // TODO(reillyg): Remove this once investigation into
+    // https://crbug.com/1022321 is over.
+    LOG(ERROR) << "Got invalid frame token: " << frame_token
+               << " <= " << last_received_frame_token_;
+
     client_->OnInvalidFrameToken(frame_token);
     return;
   }
@@ -59,6 +64,10 @@
     base::OnceClosure callback) {
   // Zero token is invalid.
   if (!frame_token) {
+    // TODO(reillyg): Remove this once investigation into
+    // https://crbug.com/1022321 is over.
+    LOG(ERROR) << "Got invalid frame token: " << frame_token;
+
     client_->OnInvalidFrameToken(frame_token);
     return;
   }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index 63fbe78..c2a8a40 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -492,9 +492,9 @@
   void SetUpEnvironment() {
     ImageTransportFactory::SetFactory(
         std::make_unique<TestImageTransportFactory>());
-    aura_test_helper_.reset(new aura::test::AuraTestHelper());
-    aura_test_helper_->SetUp(
-        ImageTransportFactory::GetInstance()->GetContextFactory());
+    aura_test_helper_.reset(new aura::test::AuraTestHelper(
+        ImageTransportFactory::GetInstance()->GetContextFactory()));
+    aura_test_helper_->SetUp();
 
     browser_context_.reset(new TestBrowserContext);
     process_host_ = new MockRenderProcessHost(browser_context_.get());
diff --git a/content/public/test/test_renderer_host.cc b/content/public/test/test_renderer_host.cc
index 95108f8..abb9fb0 100644
--- a/content/public/test/test_renderer_host.cc
+++ b/content/public/test/test_renderer_host.cc
@@ -243,8 +243,8 @@
   ui::ContextFactory* context_factory =
       ImageTransportFactory::GetInstance()->GetContextFactory();
 
-  aura_test_helper_.reset(new aura::test::AuraTestHelper());
-  aura_test_helper_->SetUp(context_factory);
+  aura_test_helper_.reset(new aura::test::AuraTestHelper(context_factory));
+  aura_test_helper_->SetUp();
 #endif
 
   sanity_checker_.reset(new ContentBrowserSanityChecker());
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index c07a987..4468037 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -384,7 +384,7 @@
     return;
   }
 
-  metafile->InitFromData(mapper.data(), mapper.size());
+  metafile->InitFromData(mapper);
 #endif  // BUILDFLAG(ENABLE_PRINTING)
 }
 
diff --git a/content/renderer/pepper/ppb_buffer_impl.cc b/content/renderer/pepper/ppb_buffer_impl.cc
index e14c01f..8e4564eb 100644
--- a/content/renderer/pepper/ppb_buffer_impl.cc
+++ b/content/renderer/pepper/ppb_buffer_impl.cc
@@ -87,7 +87,7 @@
 
 BufferAutoMapper::BufferAutoMapper(PPB_Buffer_API* api) : api_(api) {
   needs_unmap_ = !PP_ToBool(api->IsMapped());
-  data_ = api->Map();
+  data_ = reinterpret_cast<const uint8_t*>(api->Map());
   api->Describe(&size_);
 }
 
diff --git a/content/renderer/pepper/ppb_buffer_impl.h b/content/renderer/pepper/ppb_buffer_impl.h
index 9b33e81..22df7392 100644
--- a/content/renderer/pepper/ppb_buffer_impl.h
+++ b/content/renderer/pepper/ppb_buffer_impl.h
@@ -66,15 +66,15 @@
   ~BufferAutoMapper();
 
   // Will be NULL on failure to map.
-  void* data() { return data_; }
-  uint32_t size() { return size_; }
+  const uint8_t* data() const { return data_; }
+  size_t size() const { return size_; }
 
  private:
   ppapi::thunk::PPB_Buffer_API* api_;
 
   bool needs_unmap_;
 
-  void* data_;
+  const uint8_t* data_;
   uint32_t size_;
 
   DISALLOW_COPY_AND_ASSIGN(BufferAutoMapper);
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc
index 7192fab..707c67c5 100644
--- a/content/renderer/pepper/video_decoder_shim.cc
+++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -23,7 +23,7 @@
 #include "content/public/renderer/render_thread.h"
 #include "content/renderer/pepper/pepper_video_decoder_host.h"
 #include "content/renderer/render_thread_impl.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
+#include "gpu/command_buffer/client/raster_interface.h"
 #include "media/base/cdm_context.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/limits.h"
@@ -33,6 +33,7 @@
 #include "media/filters/ffmpeg_video_decoder.h"
 #include "media/filters/vpx_video_decoder.h"
 #include "media/media_buildflags.h"
+#include "media/renderers/yuv_util.h"
 #include "media/video/picture.h"
 #include "media/video/video_decode_accelerator.h"
 #include "ppapi/c/pp_errors.h"
@@ -58,538 +59,6 @@
 
 }  // namespace
 
-// YUV->RGB converter class using a shader and FBO.
-class VideoDecoderShim::YUVConverter {
- public:
-  YUVConverter(scoped_refptr<viz::ContextProviderCommandBuffer>);
-  ~YUVConverter();
-  bool Initialize();
-  void Convert(const media::VideoFrame* frame, GLuint tex_out);
-
- private:
-  GLuint CreateShader();
-  GLuint CompileShader(const char* name, GLuint type, const char* code);
-  GLuint CreateProgram(const char* name, GLuint vshader, GLuint fshader);
-  GLuint CreateTexture();
-
-  scoped_refptr<viz::ContextProviderCommandBuffer> context_provider_;
-  gpu::gles2::GLES2Interface* gl_;
-  GLuint frame_buffer_;
-  GLuint vertex_buffer_;
-  GLuint program_;
-
-  GLuint y_texture_;
-  GLuint u_texture_;
-  GLuint v_texture_;
-  GLuint a_texture_;
-
-  GLuint internal_format_;
-  GLuint format_;
-  media::VideoPixelFormat video_format_;
-
-  GLuint y_width_;
-  GLuint y_height_;
-
-  GLuint uv_width_;
-  GLuint uv_height_;
-  uint32_t uv_height_divisor_;
-  uint32_t uv_width_divisor_;
-
-  GLint yuv_matrix_loc_;
-  GLint yuv_adjust_loc_;
-
-  DISALLOW_COPY_AND_ASSIGN(YUVConverter);
-};
-
-VideoDecoderShim::YUVConverter::YUVConverter(
-    scoped_refptr<viz::ContextProviderCommandBuffer> context_provider)
-    : context_provider_(std::move(context_provider)),
-      gl_(context_provider_->ContextGL()),
-      frame_buffer_(0),
-      vertex_buffer_(0),
-      program_(0),
-      y_texture_(0),
-      u_texture_(0),
-      v_texture_(0),
-      a_texture_(0),
-      internal_format_(0),
-      format_(0),
-      video_format_(media::PIXEL_FORMAT_UNKNOWN),
-      y_width_(2),
-      y_height_(2),
-      uv_width_(2),
-      uv_height_(2),
-      uv_height_divisor_(1),
-      uv_width_divisor_(1),
-      yuv_matrix_loc_(0),
-      yuv_adjust_loc_(0) {
-  DCHECK(gl_);
-}
-
-VideoDecoderShim::YUVConverter::~YUVConverter() {
-  if (y_texture_)
-    gl_->DeleteTextures(1, &y_texture_);
-
-  if (u_texture_)
-    gl_->DeleteTextures(1, &u_texture_);
-
-  if (v_texture_)
-    gl_->DeleteTextures(1, &v_texture_);
-
-  if (a_texture_)
-    gl_->DeleteTextures(1, &a_texture_);
-
-  if (frame_buffer_)
-    gl_->DeleteFramebuffers(1, &frame_buffer_);
-
-  if (vertex_buffer_)
-    gl_->DeleteBuffers(1, &vertex_buffer_);
-
-  if (program_)
-    gl_->DeleteProgram(program_);
-}
-
-GLuint VideoDecoderShim::YUVConverter::CreateTexture() {
-  GLuint tex = 0;
-
-  gl_->GenTextures(1, &tex);
-  gl_->BindTexture(GL_TEXTURE_2D, tex);
-
-  // Create texture with default size - will be resized upon first frame.
-  gl_->TexImage2D(GL_TEXTURE_2D, 0, internal_format_, 2, 2, 0, format_,
-                  GL_UNSIGNED_BYTE, nullptr);
-
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
-  gl_->BindTexture(GL_TEXTURE_2D, 0);
-
-  return tex;
-}
-
-GLuint VideoDecoderShim::YUVConverter::CompileShader(const char* name,
-                                                     GLuint type,
-                                                     const char* code) {
-  GLuint shader = gl_->CreateShader(type);
-
-  gl_->ShaderSource(shader, 1, (const GLchar**)&code, nullptr);
-  gl_->CompileShader(shader);
-
-#ifndef NDEBUG
-  GLint status = 0;
-
-  gl_->GetShaderiv(shader, GL_COMPILE_STATUS, &status);
-  if (status != GL_TRUE) {
-    GLint max_length = 0;
-    GLint actual_length = 0;
-    gl_->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &max_length);
-
-    // The max_length includes the NULL character.
-    std::string error_log(max_length, 0);
-    gl_->GetShaderInfoLog(shader, max_length, &actual_length, &error_log[0]);
-
-    LOG(ERROR) << name << " shader compilation failed: " << error_log.c_str();
-    gl_->DeleteShader(shader);
-    return 0;
-  }
-#endif
-
-  return shader;
-}
-
-GLuint VideoDecoderShim::YUVConverter::CreateProgram(const char* name,
-                                                     GLuint vshader,
-                                                     GLuint fshader) {
-  GLuint program = gl_->CreateProgram();
-  gl_->AttachShader(program, vshader);
-  gl_->AttachShader(program, fshader);
-
-  gl_->BindAttribLocation(program, 0, "position");
-
-  gl_->LinkProgram(program);
-
-#ifndef NDEBUG
-  GLint status = 0;
-
-  gl_->GetProgramiv(program, GL_LINK_STATUS, &status);
-  if (status != GL_TRUE) {
-    GLint max_length = 0;
-    GLint actual_length = 0;
-    gl_->GetProgramiv(program, GL_INFO_LOG_LENGTH, &max_length);
-
-    // The max_length includes the NULL character.
-    std::string error_log(max_length, 0);
-    gl_->GetProgramInfoLog(program, max_length, &actual_length, &error_log[0]);
-
-    LOG(ERROR) << name << " program linking failed: " << error_log.c_str();
-    return 0;
-  }
-#endif
-
-  return program;
-}
-
-GLuint VideoDecoderShim::YUVConverter::CreateShader() {
-  const char* vert_shader =
-      "precision mediump float;\n"
-      "attribute vec2 position;\n"
-      "varying vec2 texcoord;\n"
-      "void main()\n"
-      "{\n"
-      "    gl_Position = vec4( position.xy, 0, 1 );\n"
-      "    texcoord = position*0.5+0.5;\n"
-      "}";
-
-  const char* frag_shader =
-      "precision mediump float;\n"
-      "varying vec2 texcoord;\n"
-      "uniform sampler2D y_sampler;\n"
-      "uniform sampler2D u_sampler;\n"
-      "uniform sampler2D v_sampler;\n"
-      "uniform sampler2D a_sampler;\n"
-      "uniform mat3 yuv_matrix;\n"
-      "uniform vec3 yuv_adjust;\n"
-      "void main()\n"
-      "{\n"
-      "  vec3 yuv = vec3(texture2D(y_sampler, texcoord).x,\n"
-      "                  texture2D(u_sampler, texcoord).x,\n"
-      "                  texture2D(v_sampler, texcoord).x) +\n"
-      "                  yuv_adjust;\n"
-      "  gl_FragColor = vec4(yuv_matrix * yuv, texture2D(a_sampler, "
-      "texcoord).x);\n"
-      "}";
-
-  GLuint vertex_shader =
-      CompileShader("Vertex Shader", GL_VERTEX_SHADER, vert_shader);
-  if (!vertex_shader) {
-    return 0;
-  }
-
-  GLuint fragment_shader =
-      CompileShader("Fragment Shader", GL_FRAGMENT_SHADER, frag_shader);
-  if (!fragment_shader) {
-    gl_->DeleteShader(vertex_shader);
-    return 0;
-  }
-
-  GLuint program =
-      CreateProgram("YUVConverter Program", vertex_shader, fragment_shader);
-
-  gl_->DeleteShader(vertex_shader);
-  gl_->DeleteShader(fragment_shader);
-
-  if (!program) {
-    return 0;
-  }
-
-  gl_->UseProgram(program);
-
-  GLint uniform_location;
-  uniform_location = gl_->GetUniformLocation(program, "y_sampler");
-  DCHECK(uniform_location != -1);
-  gl_->Uniform1i(uniform_location, 0);
-
-  uniform_location = gl_->GetUniformLocation(program, "u_sampler");
-  DCHECK(uniform_location != -1);
-  gl_->Uniform1i(uniform_location, 1);
-
-  uniform_location = gl_->GetUniformLocation(program, "v_sampler");
-  DCHECK(uniform_location != -1);
-  gl_->Uniform1i(uniform_location, 2);
-
-  uniform_location = gl_->GetUniformLocation(program, "a_sampler");
-  DCHECK(uniform_location != -1);
-  gl_->Uniform1i(uniform_location, 3);
-
-  gl_->UseProgram(0);
-
-  yuv_matrix_loc_ = gl_->GetUniformLocation(program, "yuv_matrix");
-  DCHECK(yuv_matrix_loc_ != -1);
-
-  yuv_adjust_loc_ = gl_->GetUniformLocation(program, "yuv_adjust");
-  DCHECK(yuv_adjust_loc_ != -1);
-
-  return program;
-}
-
-bool VideoDecoderShim::YUVConverter::Initialize() {
-  // If texture_rg extension is not available, use slower GL_LUMINANCE.
-  if (context_provider_->ContextCapabilities().texture_rg) {
-    internal_format_ = GL_RED_EXT;
-    format_ = GL_RED_EXT;
-  } else {
-    internal_format_ = GL_LUMINANCE;
-    format_ = GL_LUMINANCE;
-  }
-
-  if (context_provider_->ContextCapabilities().max_texture_image_units < 4) {
-    // We support YUVA textures and require 4 texture units in the fragment
-    // stage.
-    return false;
-  }
-
-  gl_->TraceBeginCHROMIUM("YUVConverter", "YUVConverterContext");
-  gl_->GenFramebuffers(1, &frame_buffer_);
-
-  y_texture_ = CreateTexture();
-  u_texture_ = CreateTexture();
-  v_texture_ = CreateTexture();
-  a_texture_ = CreateTexture();
-
-  // Vertex positions.  Also converted to texcoords in vertex shader.
-  GLfloat vertex_positions[] = {-1.f, -1.f, 1.f, -1.f, -1.f, 1.f, 1.f, 1.f};
-
-  gl_->GenBuffers(1, &vertex_buffer_);
-  gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
-  gl_->BufferData(GL_ARRAY_BUFFER, 2 * sizeof(GLfloat) * 4, vertex_positions,
-                  GL_STATIC_DRAW);
-  gl_->BindBuffer(GL_ARRAY_BUFFER, 0);
-
-  program_ = CreateShader();
-
-  gl_->TraceEndCHROMIUM();
-
-  return (program_ != 0);
-}
-
-void VideoDecoderShim::YUVConverter::Convert(const media::VideoFrame* frame,
-                                             GLuint tex_out) {
-  const float* yuv_matrix = nullptr;
-  const float* yuv_adjust = nullptr;
-
-  if (video_format_ != frame->format()) {
-    // The constants below were taken from
-    // components/viz/service/display/gl_renderer.cc. These values are magic
-    // numbers that are used in the transformation from YUV to RGB color values.
-    // They are taken from the following webpage:
-    // http://www.fourcc.org/fccyvrgb.php
-    static const float yuv_to_rgb_rec601[9] = {
-        1.164f, 1.164f, 1.164f, 0.0f, -.391f, 2.018f, 1.596f, -.813f, 0.0f,
-    };
-    static const float yuv_to_rgb_jpeg[9] = {
-        1.f, 1.f, 1.f, 0.0f, -.34414f, 1.772f, 1.402f, -.71414f, 0.0f,
-    };
-    static const float yuv_to_rgb_rec709[9] = {
-        1.164f, 1.164f, 1.164f, 0.0f, -0.213f, 2.112f, 1.793f, -0.533f, 0.0f,
-    };
-
-    // These values map to 16, 128, and 128 respectively, and are computed
-    // as a fraction over 256 (e.g. 16 / 256 = 0.0625).
-    // They are used in the YUV to RGBA conversion formula:
-    //   Y - 16   : Gives 16 values of head and footroom for overshooting
-    //   U - 128  : Turns unsigned U into signed U [-128,127]
-    //   V - 128  : Turns unsigned V into signed V [-128,127]
-    static const float yuv_adjust_constrained[3] = {
-        -0.0625f, -0.5f, -0.5f,
-    };
-    // Same as above, but without the head and footroom.
-    static const float yuv_adjust_full[3] = {
-        0.0f, -0.5f, -0.5f,
-    };
-
-    yuv_adjust = yuv_adjust_constrained;
-    // TODO(hubbe): Should default to 709
-    yuv_matrix = yuv_to_rgb_rec601;
-
-    SkYUVColorSpace sk_yuv_color_space;
-    if (frame->ColorSpace().ToSkYUVColorSpace(&sk_yuv_color_space)) {
-      switch (sk_yuv_color_space) {
-        case kJPEG_SkYUVColorSpace:
-          yuv_matrix = yuv_to_rgb_jpeg;
-          yuv_adjust = yuv_adjust_full;
-          break;
-        case kRec709_SkYUVColorSpace:
-          yuv_matrix = yuv_to_rgb_rec709;
-          break;
-        case kRec601_SkYUVColorSpace:
-          // Current default.
-          break;
-        default:
-          NOTREACHED();
-      }
-    }
-
-    switch (frame->format()) {
-      case media::PIXEL_FORMAT_I420A:
-      case media::PIXEL_FORMAT_I420:
-        uv_height_divisor_ = 2;
-        uv_width_divisor_ = 2;
-        break;
-      case media::PIXEL_FORMAT_I422:
-        uv_width_divisor_ = 2;
-        uv_height_divisor_ = 1;
-        break;
-      case media::PIXEL_FORMAT_I444:
-        uv_width_divisor_ = 1;
-        uv_height_divisor_ = 1;
-        break;
-
-      default:
-        NOTREACHED();
-    }
-
-    video_format_ = frame->format();
-
-    // Zero these so everything is reset below.
-    y_width_ = y_height_ = 0;
-  }
-
-  gl_->TraceBeginCHROMIUM("YUVConverter", "YUVConverterContext");
-
-  uint32_t ywidth = frame->coded_size().width();
-  uint32_t yheight = frame->coded_size().height();
-
-  DCHECK_EQ(frame->stride(media::VideoFrame::kUPlane),
-            frame->stride(media::VideoFrame::kVPlane));
-
-  uint32_t ystride = frame->stride(media::VideoFrame::kYPlane);
-  uint32_t uvstride = frame->stride(media::VideoFrame::kUPlane);
-
-  // The following code assumes that extended GLES 2.0 state like
-  // UNPACK_SKIP* (if available) are set to defaults.
-  gl_->PixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
-  if (ywidth != y_width_ || yheight != y_height_) {
-    y_width_ = ywidth;
-    y_height_ = yheight;
-
-    uv_width_ = y_width_ / uv_width_divisor_;
-    uv_height_ = y_height_ / uv_height_divisor_;
-
-    // Re-create to resize the textures and upload data.
-    gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, ystride);
-    gl_->ActiveTexture(GL_TEXTURE0);
-    gl_->BindTexture(GL_TEXTURE_2D, y_texture_);
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, internal_format_, y_width_, y_height_, 0,
-                    format_, GL_UNSIGNED_BYTE,
-                    frame->data(media::VideoFrame::kYPlane));
-
-    if (video_format_ == media::PIXEL_FORMAT_I420A) {
-      DCHECK_EQ(frame->stride(media::VideoFrame::kYPlane),
-                frame->stride(media::VideoFrame::kAPlane));
-      gl_->ActiveTexture(GL_TEXTURE3);
-      gl_->BindTexture(GL_TEXTURE_2D, a_texture_);
-      gl_->TexImage2D(GL_TEXTURE_2D, 0, internal_format_, y_width_, y_height_,
-                      0, format_, GL_UNSIGNED_BYTE,
-                      frame->data(media::VideoFrame::kAPlane));
-    } else {
-      // if there is no alpha channel, then create a 2x2 texture with full
-      // alpha.
-      gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, 0);
-      const uint8_t alpha[4] = {0xff, 0xff, 0xff, 0xff};
-      gl_->ActiveTexture(GL_TEXTURE3);
-      gl_->BindTexture(GL_TEXTURE_2D, a_texture_);
-      gl_->TexImage2D(GL_TEXTURE_2D, 0, internal_format_, 2, 2, 0, format_,
-                      GL_UNSIGNED_BYTE, alpha);
-    }
-
-    gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, uvstride);
-    gl_->ActiveTexture(GL_TEXTURE1);
-    gl_->BindTexture(GL_TEXTURE_2D, u_texture_);
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, internal_format_, uv_width_, uv_height_,
-                    0, format_, GL_UNSIGNED_BYTE,
-                    frame->data(media::VideoFrame::kUPlane));
-
-    gl_->ActiveTexture(GL_TEXTURE2);
-    gl_->BindTexture(GL_TEXTURE_2D, v_texture_);
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, internal_format_, uv_width_, uv_height_,
-                    0, format_, GL_UNSIGNED_BYTE,
-                    frame->data(media::VideoFrame::kVPlane));
-  } else {
-    // Bind textures and upload texture data
-    gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, ystride);
-    gl_->ActiveTexture(GL_TEXTURE0);
-    gl_->BindTexture(GL_TEXTURE_2D, y_texture_);
-    gl_->TexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, y_width_, y_height_, format_,
-                       GL_UNSIGNED_BYTE,
-                       frame->data(media::VideoFrame::kYPlane));
-
-    if (video_format_ == media::PIXEL_FORMAT_I420A) {
-      DCHECK_EQ(frame->stride(media::VideoFrame::kYPlane),
-                frame->stride(media::VideoFrame::kAPlane));
-      gl_->ActiveTexture(GL_TEXTURE3);
-      gl_->BindTexture(GL_TEXTURE_2D, a_texture_);
-      gl_->TexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, y_width_, y_height_, format_,
-                         GL_UNSIGNED_BYTE,
-                         frame->data(media::VideoFrame::kAPlane));
-    } else {
-      gl_->ActiveTexture(GL_TEXTURE3);
-      gl_->BindTexture(GL_TEXTURE_2D, a_texture_);
-    }
-
-    gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, uvstride);
-    gl_->ActiveTexture(GL_TEXTURE1);
-    gl_->BindTexture(GL_TEXTURE_2D, u_texture_);
-    gl_->TexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, uv_width_, uv_height_, format_,
-                       GL_UNSIGNED_BYTE,
-                       frame->data(media::VideoFrame::kUPlane));
-
-    gl_->ActiveTexture(GL_TEXTURE2);
-    gl_->BindTexture(GL_TEXTURE_2D, v_texture_);
-    gl_->TexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, uv_width_, uv_height_, format_,
-                       GL_UNSIGNED_BYTE,
-                       frame->data(media::VideoFrame::kVPlane));
-  }
-
-  gl_->BindFramebuffer(GL_FRAMEBUFFER, frame_buffer_);
-  gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                            tex_out, 0);
-
-#ifndef NDEBUG
-  // We should probably check for framebuffer complete here, but that
-  // will slow this method down so check only in debug mode.
-  GLint status = gl_->CheckFramebufferStatus(GL_FRAMEBUFFER);
-  if (status != GL_FRAMEBUFFER_COMPLETE) {
-    return;
-  }
-#endif
-
-  gl_->Viewport(0, 0, ywidth, yheight);
-
-  gl_->UseProgram(program_);
-
-  if (yuv_matrix) {
-    gl_->UniformMatrix3fv(yuv_matrix_loc_, 1, 0, yuv_matrix);
-    gl_->Uniform3fv(yuv_adjust_loc_, 1, yuv_adjust);
-  }
-
-  gl_->BindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
-  gl_->EnableVertexAttribArray(0);
-  gl_->VertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat),
-                           static_cast<const void*>(nullptr));
-
-  gl_->DrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
-  // The YUVConverter shares the context with Skia and possibly other modules
-  // that may make OpenGL calls.  To be a "good OpenGL citizen" for other
-  // (non-Skia) modules that may share this context we restore
-  // buffer/texture/state bindings to OpenGL defaults here.  If we were only
-  // sharing the context with Skia this may not be necessary as we also
-  // Invalidate the GrContext below so that Skia is aware that its state
-  // caches need to be reset.
-
-  gl_->BindBuffer(GL_ARRAY_BUFFER, 0);
-  gl_->DisableVertexAttribArray(0);
-  gl_->UseProgram(0);
-  gl_->BindFramebuffer(GL_FRAMEBUFFER, 0);
-
-  gl_->BindTexture(GL_TEXTURE_2D, 0);
-
-  gl_->ActiveTexture(GL_TEXTURE2);
-  gl_->BindTexture(GL_TEXTURE_2D, 0);
-
-  gl_->ActiveTexture(GL_TEXTURE1);
-  gl_->BindTexture(GL_TEXTURE_2D, 0);
-
-  gl_->ActiveTexture(GL_TEXTURE0);
-  gl_->BindTexture(GL_TEXTURE_2D, 0);
-  gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, 0);
-
-  gl_->TraceEndCHROMIUM();
-}
-
 struct VideoDecoderShim::PendingDecode {
   PendingDecode(uint32_t decode_id,
                 const scoped_refptr<media::DecoderBuffer>& buffer);
@@ -836,8 +305,7 @@
       context_provider_(
           RenderThreadImpl::current()->SharedMainThreadContextProvider()),
       texture_pool_size_(texture_pool_size),
-      num_pending_decodes_(0),
-      yuv_converter_(new YUVConverter(context_provider_)) {
+      num_pending_decodes_(0) {
   DCHECK(host_);
   DCHECK(media_task_runner_.get());
   DCHECK(context_provider_.get());
@@ -886,9 +354,6 @@
   if (!IsCodecSupported(codec))
     return false;
 
-  if (!yuv_converter_->Initialize())
-    return false;
-
   media::VideoDecoderConfig video_decoder_config(
       codec, vda_config.profile,
       media::VideoDecoderConfig::AlphaMode::kIsOpaque, media::VideoColorSpace(),
@@ -939,11 +404,10 @@
   DCHECK_EQ(buffers.size(), mailboxes.size());
   GLuint num_textures = base::checked_cast<GLuint>(buffers.size());
   std::vector<uint32_t> local_texture_ids(num_textures);
-  gpu::gles2::GLES2Interface* gles2 = context_provider_->ContextGL();
+  gpu::raster::RasterInterface* ri = context_provider_->RasterInterface();
   for (uint32_t i = 0; i < num_textures; i++) {
     DCHECK_EQ(1u, buffers[i].client_texture_ids().size());
-    local_texture_ids[i] =
-        gles2->CreateAndConsumeTextureCHROMIUM(mailboxes[i].name);
+    local_texture_ids[i] = ri->CreateAndConsumeForGpuRaster(mailboxes[i]);
     // Map the plugin texture id to the local texture id.
     uint32_t plugin_texture_id = buffers[i].client_texture_ids()[0];
     texture_id_map_[plugin_texture_id] = local_texture_ids[i];
@@ -1053,9 +517,9 @@
     available_textures_.erase(it);
 
     uint32_t local_texture_id = texture_id_map_[texture_id];
-
-    yuv_converter_->Convert(frame->video_frame.get(), local_texture_id);
-
+    ConvertFromVideoFrameYUVTextures(frame->video_frame.get(),
+                                     context_provider_.get(), GL_TEXTURE_2D,
+                                     local_texture_id);
     host_->PictureReady(media::Picture(texture_id, frame->decode_id,
                                        frame->video_frame->visible_rect(),
                                        gfx::ColorSpace(), false));
@@ -1109,12 +573,12 @@
 }
 
 void VideoDecoderShim::DeleteTexture(uint32_t texture_id) {
-  gpu::gles2::GLES2Interface* gles2 = context_provider_->ContextGL();
-  gles2->DeleteTextures(1, &texture_id);
+  gpu::raster::RasterInterface* ri = context_provider_->RasterInterface();
+  ri->DeleteGpuRasterTexture(texture_id);
 }
 
 void VideoDecoderShim::FlushCommandBuffer() {
-  context_provider_->ContextGL()->Flush();
+  context_provider_->RasterInterface()->Flush();
 }
 
 }  // namespace content
diff --git a/content/renderer/pepper/video_decoder_shim.h b/content/renderer/pepper/video_decoder_shim.h
index bca94b9..6332cc38 100644
--- a/content/renderer/pepper/video_decoder_shim.h
+++ b/content/renderer/pepper/video_decoder_shim.h
@@ -61,7 +61,6 @@
   struct PendingDecode;
   struct PendingFrame;
   class DecoderImpl;
-  class YUVConverter;
 
   void OnInitializeFailed();
   void OnDecodeComplete(int32_t result, uint32_t decode_id);
@@ -106,8 +105,6 @@
 
   uint32_t num_pending_decodes_;
 
-  std::unique_ptr<YUVConverter> yuv_converter_;
-
   base::WeakPtrFactory<VideoDecoderShim> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(VideoDecoderShim);
diff --git a/content/shell/utility/shell_content_utility_client.cc b/content/shell/utility/shell_content_utility_client.cc
index 62382f3..613be44 100644
--- a/content/shell/utility/shell_content_utility_client.cc
+++ b/content/shell/utility/shell_content_utility_client.cc
@@ -177,7 +177,8 @@
 
 void ShellContentUtilityClient::RegisterNetworkBinders(
     service_manager::BinderRegistry* registry) {
-  network_service_test_helper_->RegisterNetworkBinders(registry);
+  if (network_service_test_helper_)
+    network_service_test_helper_->RegisterNetworkBinders(registry);
 }
 
 }  // namespace content
diff --git a/content/test/data/accessibility/event/value-value-changed-expected-win.txt b/content/test/data/accessibility/event/value-value-changed-expected-win.txt
index 68a8391..8a5d1a0 100644
--- a/content/test/data/accessibility/event/value-value-changed-expected-win.txt
+++ b/content/test/data/accessibility/event/value-value-changed-expected-win.txt
@@ -1,6 +1,6 @@
 EVENT_OBJECT_VALUECHANGE on <input#value> role=ROLE_SYSTEM_TEXT value="new thing" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE
-IA2_EVENT_TEXT_INSERTED on <input#value> role=ROLE_SYSTEM_TEXT value="new thing" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE new_text={'new ' start=0 end=4}
-IA2_EVENT_TEXT_REMOVED on <input#value> role=ROLE_SYSTEM_TEXT value="new thing" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE old_text={'some' start=0 end=4}
+IA2_EVENT_TEXT_INSERTED on <input#value> role=ROLE_SYSTEM_TEXT value="something" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE new_text={'new ' start=0 end=4}
+IA2_EVENT_TEXT_REMOVED on <input#value> role=ROLE_SYSTEM_TEXT value="something" FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE old_text={'some' start=0 end=4}
 === Start Continuation ===
 EVENT_OBJECT_VALUECHANGE on <input#value> role=ROLE_SYSTEM_TEXT FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE
 IA2_EVENT_TEXT_REMOVED on <input#value> role=ROLE_SYSTEM_TEXT FOCUSABLE IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE old_text={'new thing' start=0 end=9}
diff --git a/content/test/data/accessibility/html/iframe-coordinates-expected-blink.txt b/content/test/data/accessibility/html/iframe-coordinates-expected-blink.txt
index b19ad8e..5dbe179 100644
--- a/content/test/data/accessibility/html/iframe-coordinates-expected-blink.txt
+++ b/content/test/data/accessibility/html/iframe-coordinates-expected-blink.txt
@@ -1,4 +1,4 @@
-rootWebArea pageLocation=(0, 0) scrollX=0 scrollY=0
+rootWebArea pageLocation=(0, 0) scrollX=0 scrollY=0 scrollable=false
 ++genericContainer ignored
 ++++genericContainer size=(300, 150) pageLocation=(0, 0)
 ++++++button size=(250, 50) pageLocation=(25, 25) unclippedSize=(250, 50) name='Button'
@@ -10,7 +10,7 @@
 ++++++++++inlineTextBox name='Button'
 ++++genericContainer size=(300, 150) pageLocation=(0, 300)
 ++++++iframe size=(300, 100) pageLocation=(0, 300) unclippedSize=(300, 100)
-++++++++rootWebArea size=(300, 100) pageLocation=(0, 300) unclippedSize=(300, 100) scrollX=0 scrollY=0
+++++++++rootWebArea size=(300, 100) pageLocation=(0, 300) unclippedSize=(300, 100) scrollX=0 scrollY=0 scrollable=true
 ++++++++++genericContainer ignored size=(300, 100)
 ++++++++++++genericContainer size=(300, 100) pageLocation=(0, 300) unclippedSize=(300, 100)
 ++++++++++++++button size=(250, 50) pageLocation=(25, 325) unclippedSize=(250, 50) name='Ordinary Button'
@@ -18,7 +18,7 @@
 ++++++++++++++++++inlineTextBox name='Ordinary Button'
 ++++genericContainer size=(300, 150) pageLocation=(0, 450)
 ++++++iframe size=(150, 50) pageLocation=(0, 450)
-++++++++rootWebArea size=(150, 50) pageLocation=(0, 450) scrollX=150 scrollY=50
+++++++++rootWebArea size=(150, 50) pageLocation=(0, 450) scrollX=150 scrollY=50 scrollable=true
 ++++++++++genericContainer ignored
 ++++++++++++genericContainer size=(300, 100) pageLocation=(0, 450) unclippedLocation=(-150, 400) unclippedSize=(300, 100)
 ++++++++++++++button size=(250, 50) pageLocation=(0, 450) unclippedLocation=(-125, 425) unclippedSize=(250, 50) name='Scrolled Button'
diff --git a/content/test/data/accessibility/html/iframe-coordinates.html b/content/test/data/accessibility/html/iframe-coordinates.html
index dc271d8..9a8ae0a 100644
--- a/content/test/data/accessibility/html/iframe-coordinates.html
+++ b/content/test/data/accessibility/html/iframe-coordinates.html
@@ -12,6 +12,7 @@
 @WIN-ALLOW:size=(150, 50)
 @WIN-ALLOW:IA2_STATE_EDITABLE
 
+@BLINK-ALLOW:scrollable=*
 @BLINK-ALLOW:scrollX=*
 @BLINK-ALLOW:scrollY=*
 @BLINK-ALLOW:size=(300, 150)
diff --git a/content/test/data/accessibility/html/iframe-expected-blink.txt b/content/test/data/accessibility/html/iframe-expected-blink.txt
index 739747d..bb77e313 100644
--- a/content/test/data/accessibility/html/iframe-expected-blink.txt
+++ b/content/test/data/accessibility/html/iframe-expected-blink.txt
@@ -1,5 +1,5 @@
-rootWebArea
+rootWebArea scrollable=true
 ++genericContainer
 ++++iframe name='Empty iframe'
-++++++rootWebArea
+++++++rootWebArea scrollable=true
 ++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/html/iframe-scrollable-expected-blink.txt b/content/test/data/accessibility/html/iframe-scrollable-expected-blink.txt
new file mode 100644
index 0000000..12a0c79
--- /dev/null
+++ b/content/test/data/accessibility/html/iframe-scrollable-expected-blink.txt
@@ -0,0 +1,12 @@
+rootWebArea scrollable=true
+++genericContainer
+++++iframe name='Scrollable iframe'
+++++++rootWebArea scrollable=true
+++++++++genericContainer ignored
+++++++++++genericContainer
+++++++++++++staticText name='visible text'
+++++++++++++++inlineTextBox name='visible text'
+++++++++++genericContainer ignored
+++++++++++genericContainer
+++++++++++++staticText name='hidden from viewport'
+++++++++++++++inlineTextBox name='hidden from viewport'
diff --git a/content/test/data/accessibility/html/iframe-scrollable.html b/content/test/data/accessibility/html/iframe-scrollable.html
new file mode 100644
index 0000000..885957a
--- /dev/null
+++ b/content/test/data/accessibility/html/iframe-scrollable.html
@@ -0,0 +1,10 @@
+<!--
+@BLINK-ALLOW:scrollable=*
+-->
+<!DOCTYPE html>
+<html style="width:100px; height:100px;">
+<body>
+  <iframe style="width:200px; height: 200px;" aria-label="Scrollable iframe" src="frame/visible_text.html">
+  </iframe>
+</body>
+</html>
diff --git a/content/test/data/accessibility/html/iframe.html b/content/test/data/accessibility/html/iframe.html
index 0c48c20..feef713 100644
--- a/content/test/data/accessibility/html/iframe.html
+++ b/content/test/data/accessibility/html/iframe.html
@@ -3,11 +3,13 @@
 @WIN-ALLOW:ia2_hypertext=*
 @WIN-ALLOW:parent=*
 @WIN-ALLOW:window_class=*
+@BLINK-ALLOW:scrollable=*
+TODO(accessibility) this should eventually show scrollable=false for both the main doc and iframe. See matching TODO in AXObject::IsUserScrollable().
 -->
 <!DOCTYPE html>
 <html>
 <body>
-  <iframe aria-label="Empty iframe" src="frame/empty.html">
+  <iframe style="width:100px; height: 100px;" aria-label="Empty iframe" src="frame/empty.html">
   </iframe>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/content/test/data/accessibility/html/input-text-expected-win.txt b/content/test/data/accessibility/html/input-text-expected-win.txt
index 291a11f..72a4195 100644
--- a/content/test/data/accessibility/html/input-text-expected-win.txt
+++ b/content/test/data/accessibility/html/input-text-expected-win.txt
@@ -1,3 +1,3 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' caret_offset=0 n_selections=0
 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' caret_offset=0 n_selections=0
-++++ROLE_SYSTEM_TEXT name='Name' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:text caret_offset=0 n_selections=0
+++++ROLE_SYSTEM_TEXT name='Name' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:text ia2_hypertext='Name' caret_offset=0 n_selections=0
diff --git a/content/test/data/accessibility/html/input-text-read-only-expected-win.txt b/content/test/data/accessibility/html/input-text-read-only-expected-win.txt
index f9e32b6f..4c2c865 100644
--- a/content/test/data/accessibility/html/input-text-read-only-expected-win.txt
+++ b/content/test/data/accessibility/html/input-text-read-only-expected-win.txt
@@ -1,3 +1,3 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' caret_offset=0 n_selections=0
 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' caret_offset=0 n_selections=0
-++++ROLE_SYSTEM_TEXT name='Name' READONLY FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:text caret_offset=0 n_selections=0
+++++ROLE_SYSTEM_TEXT name='Name' READONLY FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:text ia2_hypertext='Name' caret_offset=0 n_selections=0
diff --git a/content/test/data/accessibility/html/scrollable-overflow-expected-android.txt b/content/test/data/accessibility/html/scrollable-overflow-expected-android.txt
index b540f4f..bde44e1 100644
--- a/content/test/data/accessibility/html/scrollable-overflow-expected-android.txt
+++ b/content/test/data/accessibility/html/scrollable-overflow-expected-android.txt
@@ -1,21 +1,26 @@
 android.webkit.WebView focusable focused scrollable
 ++android.view.View name='no overflow'
-++android.view.View
-++++android.view.View name='clipped'
+++android.view.View name='clipped large lots of text more text'
 ++android.widget.EditText clickable editable_text focusable has_non_empty_value multiline scrollable name='ab cd' text_change_added_count=5
 ++android.view.View
 ++++android.view.View name='tiny'
-++android.view.View scrollable
-++++android.view.View name='x=hidden'
-++android.view.View scrollable name='x=auto'
-++++android.view.View name='x=auto'
-++android.view.View scrollable name='x=scroll'
-++++android.view.View name='x=scroll'
-++android.view.View name='x=visible'
-++android.view.View scrollable
-++++android.view.View name='y=hidden'
-++android.view.View scrollable name='y=auto'
-++++android.view.View name='y=auto'
-++android.view.View scrollable name='y=scroll'
-++++android.view.View name='y=scroll'
-++android.view.View name='y=visible'
\ No newline at end of file
+++android.view.View
+++++android.view.View
+++++++android.view.View name='x=hidden'
+++++android.view.View scrollable name='x=hidden'
+++++++android.view.View name='x=hidden'
+++++android.view.View scrollable name='x=auto'
+++++++android.view.View name='x=auto'
+++++android.view.View scrollable name='x=scroll'
+++++++android.view.View name='x=scroll'
+++++android.view.View name='x=visible'
+++android.view.View
+++++android.view.View
+++++++android.view.View name='y=hidden'
+++++android.view.View scrollable name='y=hidden'
+++++++android.view.View name='y=hidden'
+++++android.view.View scrollable name='y=auto'
+++++++android.view.View name='y=auto'
+++++android.view.View scrollable name='y=scroll'
+++++++android.view.View name='y=scroll'
+++++android.view.View name='y=visible'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/scrollable-overflow-expected-auralinux.txt b/content/test/data/accessibility/html/scrollable-overflow-expected-auralinux.txt
index 12a2d1d6..5b93a93 100644
--- a/content/test/data/accessibility/html/scrollable-overflow-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/scrollable-overflow-expected-auralinux.txt
@@ -1,32 +1,39 @@
 [document web]
 ++[paragraph]
 ++++[static] name='no overflow'
-++[section]
-++++[paragraph]
-++++++[static] name='clipped'
-++[entry] selectable-text
+++[paragraph]
+++++[static] name='clipped large lots of text more text'
+++[entry] selectable-text class:textarea scrollable
 ++[section]
 ++++[paragraph]
 ++++++[static] name='tiny'
-++[section]
+++[panel] class:x-overflow-group
+++++[section] class:x-hidden-small not-scrollable
+++++++[paragraph]
+++++++++[static] name='x=hidden'
+++++[section] name='x=hidden' class:x-hidden-large scrollable
+++++++[paragraph]
+++++++++[static] name='x=hidden'
+++++[section] name='x=auto' class:x-auto scrollable
+++++++[paragraph]
+++++++++[static] name='x=auto'
+++++[section] name='x=scroll' class:x-scroll scrollable
+++++++[paragraph]
+++++++++[static] name='x=scroll'
 ++++[paragraph]
-++++++[static] name='x=hidden'
-++[section] name='x=auto'
+++++++[static] name='x=visible'
+++[panel] class:y-overflow-group
+++++[section] class:y-hidden-small not-scrollable
+++++++[paragraph]
+++++++++[static] name='y=hidden'
+++++[section] name='y=hidden' class:y-hidden-large scrollable
+++++++[paragraph]
+++++++++[static] name='y=hidden'
+++++[section] name='y=auto' class:y-auto scrollable
+++++++[paragraph]
+++++++++[static] name='y=auto'
+++++[section] name='y=scroll' class:y-scroll scrollable
+++++++[paragraph]
+++++++++[static] name='y=scroll'
 ++++[paragraph]
-++++++[static] name='x=auto'
-++[section] name='x=scroll'
-++++[paragraph]
-++++++[static] name='x=scroll'
-++[paragraph]
-++++[static] name='x=visible'
-++[section]
-++++[paragraph]
-++++++[static] name='y=hidden'
-++[section] name='y=auto'
-++++[paragraph]
-++++++[static] name='y=auto'
-++[section] name='y=scroll'
-++++[paragraph]
-++++++[static] name='y=scroll'
-++[paragraph]
-++++[static] name='y=visible'
\ No newline at end of file
+++++++[static] name='y=visible'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/scrollable-overflow-expected-blink.txt b/content/test/data/accessibility/html/scrollable-overflow-expected-blink.txt
index 9c67f12..9b3f7d1 100644
--- a/content/test/data/accessibility/html/scrollable-overflow-expected-blink.txt
+++ b/content/test/data/accessibility/html/scrollable-overflow-expected-blink.txt
@@ -1,55 +1,63 @@
 rootWebArea scrollXMin=0 scrollable=true
 ++genericContainer ignored
-++++genericContainer ignored
+++++genericContainer ignored className='no-overflow not-scrollable'
 ++++++paragraph
 ++++++++staticText name='no overflow'
 ++++++++++inlineTextBox name='no overflow'
-++++genericContainer scrollXMin=0
+++++genericContainer ignored className='clipped-not scrollable'
 ++++++paragraph
-++++++++staticText name='clipped'
-++++++++++inlineTextBox name='clipped'
-++++textField multiline value='ab cd' scrollXMin=0 scrollable=true
+++++++++staticText name='clipped large lots of text more text'
+++++++++++inlineTextBox name='clipped large lots of text more text'
+++++textField multiline className='textarea scrollable' value='ab cd' scrollXMin=0 scrollable=true
 ++++++genericContainer
 ++++++++staticText name='ab cd'
 ++++++++++inlineTextBox name='ab'
 ++++++++++inlineTextBox name=' '
 ++++++++++inlineTextBox name='cd'
-++++genericContainer ignored
+++++genericContainer ignored className='not-enough-content not-scrollable'
 ++++++genericContainer
 ++++++++paragraph
 ++++++++++staticText name='tiny'
 ++++++++++++inlineTextBox name='tiny'
-++++genericContainer ignored
-++++++genericContainer scrollXMin=0 scrollable=true
+++++group className='x-overflow-group'
+++++++genericContainer className='x-hidden-small not-scrollable' scrollXMin=0
 ++++++++paragraph
 ++++++++++staticText name='x=hidden'
 ++++++++++++inlineTextBox name='x=hidden'
-++++++genericContainer name='x=auto' scrollXMin=0 scrollable=true
+++++++genericContainer className='x-hidden-large scrollable' name='x=hidden' scrollXMin=0 scrollable=true
+++++++++paragraph
+++++++++++staticText name='x=hidden'
+++++++++++++inlineTextBox name='x=hidden'
+++++++genericContainer className='x-auto scrollable' name='x=auto' scrollXMin=0 scrollable=true
 ++++++++paragraph
 ++++++++++staticText name='x=auto'
 ++++++++++++inlineTextBox name='x=auto'
-++++++genericContainer name='x=scroll' scrollXMin=0 scrollable=true
+++++++genericContainer className='x-scroll scrollable' name='x=scroll' scrollXMin=0 scrollable=true
 ++++++++paragraph
 ++++++++++staticText name='x=scroll'
 ++++++++++++inlineTextBox name='x=scroll'
-++++++genericContainer ignored
+++++++genericContainer ignored className='x-visible not-scrollable'
 ++++++++paragraph
 ++++++++++staticText name='x=visible'
 ++++++++++++inlineTextBox name='x=visible'
-++++genericContainer ignored
-++++++genericContainer scrollXMin=0 scrollable=true
+++++group className='y-overflow-group'
+++++++genericContainer className='y-hidden-small not-scrollable' scrollXMin=0
 ++++++++paragraph
 ++++++++++staticText name='y=hidden'
 ++++++++++++inlineTextBox name='y=hidden'
-++++++genericContainer name='y=auto' scrollXMin=0 scrollable=true
+++++++genericContainer className='y-hidden-large scrollable' name='y=hidden' scrollXMin=0 scrollable=true
+++++++++paragraph
+++++++++++staticText name='y=hidden'
+++++++++++++inlineTextBox name='y=hidden'
+++++++genericContainer className='y-auto scrollable' name='y=auto' scrollXMin=0 scrollable=true
 ++++++++paragraph
 ++++++++++staticText name='y=auto'
 ++++++++++++inlineTextBox name='y=auto'
-++++++genericContainer name='y=scroll' scrollXMin=0 scrollable=true
+++++++genericContainer className='y-scroll scrollable' name='y=scroll' scrollXMin=0 scrollable=true
 ++++++++paragraph
 ++++++++++staticText name='y=scroll'
 ++++++++++++inlineTextBox name='y=scroll'
-++++++genericContainer ignored
+++++++genericContainer ignored className='y-visible not-scrollable'
 ++++++++paragraph
 ++++++++++staticText name='y=visible'
-++++++++++++inlineTextBox name='y=visible'
+++++++++++++inlineTextBox name='y=visible'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/scrollable-overflow-expected-uia-win.txt b/content/test/data/accessibility/html/scrollable-overflow-expected-uia-win.txt
index a2721b9..fd4b6f0 100644
--- a/content/test/data/accessibility/html/scrollable-overflow-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/scrollable-overflow-expected-uia-win.txt
@@ -1,32 +1,39 @@
-Document IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=false
+Document IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=true
 ++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
 ++++Text Name='no overflow' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group IsControlElement=false IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=true
-++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++++Text Name='clipped' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Edit IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=false Scroll.VerticallyScrollable=true Value.Value='ab cd'
+++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Text Name='clipped large lots of text more text' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++Edit ClassName='textarea scrollable' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=false Scroll.VerticallyScrollable=true Value.Value='ab cd'
 ++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
 ++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
 ++++++Text Name='tiny' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group IsControlElement=false IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=false
+++Group ClassName='x-overflow-group' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Group ClassName='x-hidden-small not-scrollable' IsControlElement=false IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=false
+++++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++++Text Name='x=hidden' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Group Name='x=hidden' ClassName='x-hidden-large scrollable' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=true
+++++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++++Text Name='x=hidden' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Group Name='x=auto' ClassName='x-auto scrollable' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=false
+++++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++++Text Name='x=auto' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Group Name='x=scroll' ClassName='x-scroll scrollable' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=false
+++++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++++Text Name='x=scroll' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
 ++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++++Text Name='x=hidden' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group Name='x=auto' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=false
+++++++Text Name='x=visible' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++Group ClassName='y-overflow-group' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Group ClassName='y-hidden-small not-scrollable' IsControlElement=false IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=false Scroll.VerticallyScrollable=true
+++++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++++Text Name='y=hidden' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Group Name='y=hidden' ClassName='y-hidden-large scrollable' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=true
+++++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++++Text Name='y=hidden' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Group Name='y=auto' ClassName='y-auto scrollable' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=false Scroll.VerticallyScrollable=true
+++++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++++Text Name='y=auto' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++Group Name='y=scroll' ClassName='y-scroll scrollable' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=false Scroll.VerticallyScrollable=true
+++++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++++Text Name='y=scroll' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
 ++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++++Text Name='x=auto' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group Name='x=scroll' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=true Scroll.VerticallyScrollable=false
-++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++++Text Name='x=scroll' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++Text Name='x=visible' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group IsControlElement=false IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=false Scroll.VerticallyScrollable=true
-++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++++Text Name='y=hidden' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group Name='y=auto' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=false Scroll.VerticallyScrollable=true
-++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++++Text Name='y=auto' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group Name='y=scroll' IsScrollPatternAvailable=true IsScrollItemPatternAvailable=true Scroll.HorizontallyScrollable=false Scroll.VerticallyScrollable=true
-++++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++++Text Name='y=scroll' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++Group IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
-++++Text Name='y=visible' IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
+++++++Text Name='y=visible' IsControlElement=false IsScrollPatternAvailable=false IsScrollItemPatternAvailable=true
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/scrollable-overflow.html b/content/test/data/accessibility/html/scrollable-overflow.html
index 296a0ecb..bb61438 100644
--- a/content/test/data/accessibility/html/scrollable-overflow.html
+++ b/content/test/data/accessibility/html/scrollable-overflow.html
@@ -1,64 +1,76 @@
 <!--
 * Test scrollXMin -- the presence of this indicates something is scrollable.
+@AURALINUX-ALLOW:class:*
 @BLINK-ALLOW:scrollXMin=*
 @BLINK-ALLOW:scrollable=true
+@BLINK-ALLOW:className*
+@UIA-WIN-ALLOW:ClassName*
 @UIA-WIN-ALLOW:*ScrollItemPatternAvailable*
 @UIA-WIN-ALLOW:*ScrollPatternAvailable*
 @UIA-WIN-ALLOW:*Scrollable*
+@WIN-ALLOW:class:*
 -->
 <html>
   <style>
   body { font-style: monospace; width: 999px;}
+  .not-scrollable { margin-bottom: 50px; border: 2px dashed red;}
+  .scrollable { margin-bottom: 50px; border: 2px solid green;}
   .clipped { width: 25px; height: 25px; overflow: hidden; }
-  .x-overflow > div { width: 25px; height: 50px;}
-  .x-overflow > div > p { margin: 0; }
-  .y-overflow > div { height: 25px; }
-  .y-overflow > div > p { padding: 12px 0; margin: 0;}
+  .x-overflow-group > div { width: 25px; height: 50px;}
+  .x-overflow-group > div > p { margin: 0; }
+  .y-overflow-group > div { height: 25px; width: 20em;}
+  .y-overflow-group > div > p { padding: 12px 0; margin: 0;}
   </style>
   <body>
-    <div class="no-overflow">  <!-- Not scrollable -->
+    <div class="no-overflow not-scrollable">  <!-- Not scrollable -->
       <p>no overflow <!-- Default is overflow: visible -->
     </div>
 
-    <div class="clipped">  <!-- Not scrollable -->
-      <p>clipped <!-- Default is overflow: visible -->
+    <div class="clipped-not scrollable">  <!-- Not scrollable -->
+      <p>clipped large lots of text more text <!-- Default is overflow: visible -->
     </div>
 
-    <textarea rows="1" cols="2">ab cd</textarea>  <!-- User scrollable -->
+    <textarea class="textarea scrollable" rows="1" cols="2">ab cd</textarea>  <!-- User scrollable -->
 
-    <div class="not-enough-content-to-scroll">  <!-- Not scrollable -->
+    <div class="not-enough-content not-scrollable">  <!-- Not scrollable -->
       <div style="overflow: scroll; width: 100px; height: 100px">
         <p>tiny
       </div>
     </div>
 
-    <div class="x-overflow">
-      <div style="overflow-x: hidden;">  <!-- Actually user scrollable, because overflow-x=hidden changes overflow-y to auto   -->
-          <p>x=hidden
+    <div class="x-overflow-group" role="group">
+      <div class="x-hidden-small not-scrollable" style="overflow-x: hidden;">  <!-- Not user scrollable, because not enough content   -->
+        <p>x=hidden
       </div>
-      <div style="overflow-x: auto;">  <!-- User scrollable if overflow -->
-          <p>x=auto
+      <div class="x-hidden-large scrollable" style="overflow-x: hidden;">  <!-- Actually user scrollable, because overflow-x=hidden changes overflow-y to auto   -->
+        <p style="width:999px; height:999px; background-color:green;">x=hidden
       </div>
-      <div style="overflow-x: scroll;">  <!-- User scrollable if overflow -->
-          <p>x=scroll
+      <div class="x-auto scrollable" style="overflow-x: auto;">  <!-- User scrollable if overflow -->
+        <p>x=auto
       </div>
-      <div style="overflow-x: visible;">  <!-- Not scrollable -->
-          <p>x=visible
+      <div class="x-scroll scrollable" style="overflow-x: scroll;">  <!-- User scrollable if overflow -->
+        <p>x=scroll
+      </div>
+      <div class="x-visible not-scrollable" style="overflow-x: visible;">  <!-- Not scrollable -->
+        <p>x=visible
       </div>
     </div>
 
-    <div class="y-overflow">
-      <div style="overflow-y: hidden;">  <!-- Actually user scrollable, because overflow-y=hidden changes overflow-x to auto   -->
-          <p>y=hidden
+    <div class="y-overflow-group" role="group">
+      <div class="y-hidden-small not-scrollable" style="overflow-y: hidden;">  <!-- Not user scrollable, because not enough text   -->
+        <p>y=hidden
       </div>
-      <div style="overflow-y: auto;">  <!-- Use scrollable if overflow -->
-          <p>y=auto
+      <div class="y-hidden-large scrollable" style="overflow-y: hidden;">  <!-- Actually user scrollable, because overflow-y=hidden changes overflow-x to auto   -->
+        <p style="width:999px; height:999px; background-color:green;">y=hidden
       </div>
-      <div style="overflow-y: scroll;">  <!-- Use scrollable if overflow  -->
-          <p>y=scroll
+      <div class="y-auto scrollable" style="overflow-y: auto;">  <!-- Use scrollable if overflow -->
+        <p>y=auto
       </div>
-      <div style="overflow-y: visible;">  <!-- Not scrollable -->
-          <p>y=visible
+      <div class="y-scroll scrollable" style="overflow-y: scroll;">  <!-- Use scrollable if overflow  -->
+        <p>y=scroll
+      </div>
+      <div class="y-visible not-scrollable" style="overflow-y: visible;">  <!-- Not scrollable -->
+        <p>y=visible
       </div>
     </div>
   </body>
diff --git a/content/test/data/accessibility/html/textarea-expected-win.txt b/content/test/data/accessibility/html/textarea-expected-win.txt
index 8d61e086..4a86c0d 100644
--- a/content/test/data/accessibility/html/textarea-expected-win.txt
+++ b/content/test/data/accessibility/html/textarea-expected-win.txt
@@ -1,3 +1,3 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0
 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0
-++++ROLE_SYSTEM_TEXT value='The <newline>textarea tag  defines a multi-line text input control.<newline>' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The <newline>textarea tag  defines a multi-line text input control.<newline>' caret_offset=0 n_selections=0
+++++ROLE_SYSTEM_TEXT value='The <newline>textarea tag  defines a multi-line text input control.<newline>' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The <newline>textarea tag  defines a multi-line text input control.<newline><newline>' caret_offset=0 n_selections=0
diff --git a/content/test/data/accessibility/html/textarea-read-only-expected-win.txt b/content/test/data/accessibility/html/textarea-read-only-expected-win.txt
index 35d70e38..338138e 100644
--- a/content/test/data/accessibility/html/textarea-read-only-expected-win.txt
+++ b/content/test/data/accessibility/html/textarea-read-only-expected-win.txt
@@ -1,3 +1,3 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0
 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0
-++++ROLE_SYSTEM_TEXT value='The textarea tag defines a multi-line text input control.<newline>' READONLY FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The textarea tag defines a multi-line text input control.<newline>' caret_offset=0 n_selections=0
+++++ROLE_SYSTEM_TEXT value='The textarea tag defines a multi-line text input control.<newline>' READONLY FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The textarea tag defines a multi-line text input control.<newline><newline>' caret_offset=0 n_selections=0
diff --git a/content/test/data/accessibility/html/textarea-with-selection-expected-win.txt b/content/test/data/accessibility/html/textarea-with-selection-expected-win.txt
index 1d3ba0e1..fe795d8 100644
--- a/content/test/data/accessibility/html/textarea-with-selection-expected-win.txt
+++ b/content/test/data/accessibility/html/textarea-with-selection-expected-win.txt
@@ -1,3 +1,3 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' caret_offset=1 n_selections=1 selection_start=0 selection_end=1
 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' caret_offset=1 n_selections=1 selection_start=0 selection_end=1
-++++ROLE_SYSTEM_TEXT value='The textarea tag defines a multi-line text input control.<newline>' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The textarea tag defines a multi-line text input control.<newline>' caret_offset=58 n_selections=1 selection_start=0 selection_end=58
+++++ROLE_SYSTEM_TEXT value='The textarea tag defines a multi-line text input control.<newline>' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The textarea tag defines a multi-line text input control.<newline><newline>' caret_offset=58 n_selections=1 selection_start=0 selection_end=58
diff --git a/content/test/data/browsing_data/site_data.html b/content/test/data/browsing_data/site_data.html
index 9501856..7b3c913b 100644
--- a/content/test/data/browsing_data/site_data.html
+++ b/content/test/data/browsing_data/site_data.html
@@ -20,7 +20,7 @@
   }
 
   function hasCookie() {
-    domAutomationController.send(document.cookie == 'foo=bar');
+    domAutomationController.send(document.cookie.indexOf('foo=bar') != -1);
   }
 
   function setSessionCookie() {
@@ -33,6 +33,17 @@
     domAutomationController.send(document.cookie == 'bar=session');
   }
 
+  function setCookieStore() {
+    cookieStore.set('cookie-name', 'cookie-value', {sameSite: 'none'})
+      .then(success_).catch(failure_);
+  }
+
+  function hasCookieStore() {
+    cookieStore.get('cookie-name').then(function (cookie) {
+      domAutomationController.send(cookie.value == 'cookie-value');
+    }).catch(failure_);
+  }
+
   function setLocalStorage() {
     localStorage.setItem('foo', 'bar');
     success_();
diff --git a/device/vr/orientation/orientation_device_provider_unittest.cc b/device/vr/orientation/orientation_device_provider_unittest.cc
index 33d704ba..7f257ce 100644
--- a/device/vr/orientation/orientation_device_provider_unittest.cc
+++ b/device/vr/orientation/orientation_device_provider_unittest.cc
@@ -36,7 +36,7 @@
   VROrientationDeviceProviderTest() = default;
   ~VROrientationDeviceProviderTest() override = default;
   void SetUp() override {
-    fake_sensor_provider_ = std::make_unique<FakeSensorProvider>();
+    fake_sensor_provider_ = std::make_unique<FakeXRSensorProvider>();
 
     fake_sensor_ = std::make_unique<FakeOrientationSensor>(
         sensor_.InitWithNewPipeAndPassReceiver());
@@ -135,7 +135,7 @@
 
   std::unique_ptr<VROrientationDeviceProvider> provider_;
 
-  std::unique_ptr<FakeSensorProvider> fake_sensor_provider_;
+  std::unique_ptr<FakeXRSensorProvider> fake_sensor_provider_;
   mojo::Remote<mojom::SensorProvider> sensor_provider_;
 
   // Fake Sensor Init params objects
diff --git a/device/vr/orientation/orientation_device_unittest.cc b/device/vr/orientation/orientation_device_unittest.cc
index c55b95f8..4d2d929 100644
--- a/device/vr/orientation/orientation_device_unittest.cc
+++ b/device/vr/orientation/orientation_device_unittest.cc
@@ -81,7 +81,7 @@
   VROrientationDeviceTest() = default;
   ~VROrientationDeviceTest() override = default;
   void SetUp() override {
-    fake_sensor_provider_ = std::make_unique<FakeSensorProvider>(
+    fake_sensor_provider_ = std::make_unique<FakeXRSensorProvider>(
         sensor_provider_.BindNewPipeAndPassReceiver());
 
     fake_sensor_ = std::make_unique<FakeOrientationSensor>(
@@ -226,7 +226,7 @@
   base::test::TaskEnvironment task_environment_;
 
   std::unique_ptr<VROrientationDevice> device_;
-  std::unique_ptr<FakeSensorProvider> fake_sensor_provider_;
+  std::unique_ptr<FakeXRSensorProvider> fake_sensor_provider_;
   mojo::Remote<mojom::SensorProvider> sensor_provider_;
 
   // Fake Sensor Init params objects
diff --git a/device/vr/test/fake_sensor_provider.cc b/device/vr/test/fake_sensor_provider.cc
index 1b862a8..2e31a0e 100644
--- a/device/vr/test/fake_sensor_provider.cc
+++ b/device/vr/test/fake_sensor_provider.cc
@@ -9,30 +9,30 @@
 
 namespace device {
 
-FakeSensorProvider::FakeSensorProvider() = default;
+FakeXRSensorProvider::FakeXRSensorProvider() = default;
 
-FakeSensorProvider::FakeSensorProvider(
+FakeXRSensorProvider::FakeXRSensorProvider(
     mojo::PendingReceiver<mojom::SensorProvider> receiver)
     : receiver_(this, std::move(receiver)) {}
 
-FakeSensorProvider::~FakeSensorProvider() {
+FakeXRSensorProvider::~FakeXRSensorProvider() {
   if (callback_) {
     std::move(callback_).Run(mojom::SensorCreationResult::ERROR_NOT_AVAILABLE,
                              nullptr);
   }
 }
 
-void FakeSensorProvider::Bind(
+void FakeXRSensorProvider::Bind(
     mojo::PendingReceiver<mojom::SensorProvider> receiver) {
   receiver_.Bind(std::move(receiver));
 }
 
-void FakeSensorProvider::GetSensor(mojom::SensorType type,
-                                   GetSensorCallback callback) {
+void FakeXRSensorProvider::GetSensor(mojom::SensorType type,
+                                     GetSensorCallback callback) {
   callback_ = std::move(callback);
 }
 
-void FakeSensorProvider::CallCallback(mojom::SensorInitParamsPtr param) {
+void FakeXRSensorProvider::CallCallback(mojom::SensorInitParamsPtr param) {
   std::move(callback_).Run(mojom::SensorCreationResult::SUCCESS,
                            std::move(param));
 }
diff --git a/device/vr/test/fake_sensor_provider.h b/device/vr/test/fake_sensor_provider.h
index cdac4a1..7708eb7 100644
--- a/device/vr/test/fake_sensor_provider.h
+++ b/device/vr/test/fake_sensor_provider.h
@@ -12,12 +12,12 @@
 
 namespace device {
 
-class FakeSensorProvider : public mojom::SensorProvider {
+class FakeXRSensorProvider : public mojom::SensorProvider {
  public:
-  FakeSensorProvider();
-  explicit FakeSensorProvider(
+  FakeXRSensorProvider();
+  explicit FakeXRSensorProvider(
       mojo::PendingReceiver<mojom::SensorProvider> receiver);
-  ~FakeSensorProvider() override;
+  ~FakeXRSensorProvider() override;
 
   void Bind(mojo::PendingReceiver<mojom::SensorProvider> receiver);
   void GetSensor(mojom::SensorType type, GetSensorCallback callback) override;
diff --git a/fuchsia/engine/browser/frame_impl.cc b/fuchsia/engine/browser/frame_impl.cc
index ef660ea..0ccaad8 100644
--- a/fuchsia/engine/browser/frame_impl.cc
+++ b/fuchsia/engine/browser/frame_impl.cc
@@ -969,6 +969,29 @@
                      std::move(callback)));
 }
 
+bool FrameImpl::CheckMediaAccessPermission(
+    content::RenderFrameHost* render_frame_host,
+    const GURL& security_origin,
+    blink::mojom::MediaStreamType type) {
+  content::PermissionType permission;
+  switch (type) {
+    case blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE:
+      permission = content::PermissionType::AUDIO_CAPTURE;
+      break;
+    case blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE:
+      permission = content::PermissionType::VIDEO_CAPTURE;
+      break;
+    default:
+      NOTREACHED();
+      return false;
+  }
+  auto* permission_controller =
+      web_contents_->GetBrowserContext()->GetPermissionControllerDelegate();
+  return permission_controller->GetPermissionStatusForFrame(
+             permission, render_frame_host, security_origin) ==
+         blink::mojom::PermissionStatus::GRANTED;
+}
+
 void FrameImpl::ReadyToCommitNavigation(
     content::NavigationHandle* navigation_handle) {
   if (before_load_scripts_.empty())
diff --git a/fuchsia/engine/browser/frame_impl.h b/fuchsia/engine/browser/frame_impl.h
index 2b992439..deb4d85 100644
--- a/fuchsia/engine/browser/frame_impl.h
+++ b/fuchsia/engine/browser/frame_impl.h
@@ -208,6 +208,9 @@
       content::WebContents* web_contents,
       const content::MediaStreamRequest& request,
       content::MediaResponseCallback callback) override;
+  bool CheckMediaAccessPermission(content::RenderFrameHost* render_frame_host,
+                                  const GURL& security_origin,
+                                  blink::mojom::MediaStreamType type) override;
 
   // content::WebContentsObserver implementation.
   void ReadyToCommitNavigation(
diff --git a/fuchsia/engine/test/data/mic.html b/fuchsia/engine/test/data/mic.html
new file mode 100644
index 0000000..037b6177
--- /dev/null
+++ b/fuchsia/engine/test/data/mic.html
@@ -0,0 +1,48 @@
+<script>
+  function callGetUserMedia(haveAccess) {
+    return navigator.mediaDevices.getUserMedia({ audio: true, video: false })
+      .then(() => {
+        if (!haveAccess) {
+          throw "getUserMedia() succeeded when the page doesn't have " +
+                "micriphone access";
+        }
+      })
+      .catch((e) => {
+        if (!haveAccess && e.name == "NotFoundError")
+          return;
+        throw e;
+      });
+  }
+
+  function callEnumerateDevices(haveAccess) {
+    return navigator.mediaDevices.enumerateDevices().then((devices)=>{
+      var found = false;
+      for (d of devices) {
+        if (d.kind == "audioinput") {
+          found = true;
+          if (d.deviceId == "" && haveAccess) {
+            throw "deviceId must not be empty when mic permission is granted.";
+          } else if (d.deviceId != "" && !haveAccess) {
+            throw "deviceId must be non-empty only when mic permission is granted.";
+          }
+          if (d.label != "" && !haveAccess) {
+            throw "device label must be empty unless mic permission is granted.";
+          }
+          // TODO(crbug.com/1065436): Verify that d.label is set when microphone
+          // permission is granted.
+        }
+      }
+      if (!found) {
+        throw "enumerateDevices() didn't return any audioinput devices.";
+      }
+    });
+  }
+
+  // NoPermission is passed in the URL when the page doesn't have microphone
+  // access.
+  var haveAccess = (window.location.href.indexOf("NoPermission") < 0);
+
+  callGetUserMedia(haveAccess)
+  .then(() => { return callEnumerateDevices(haveAccess); })
+  .then(() => { document.title = "ended"; })
+</script>
\ No newline at end of file
diff --git a/fuchsia/engine/web_engine_integration_test.cc b/fuchsia/engine/web_engine_integration_test.cc
index 8eda74e..b35b1e1b 100644
--- a/fuchsia/engine/web_engine_integration_test.cc
+++ b/fuchsia/engine/web_engine_integration_test.cc
@@ -44,6 +44,8 @@
   ~WebEngineIntegrationTest() override = default;
 
   void SetUp() override {
+    embedded_test_server_.ServeFilesFromSourceDirectory(
+        "fuchsia/engine/test/data");
     net::test_server::RegisterDefaultHandlers(&embedded_test_server_);
     ASSERT_TRUE(embedded_test_server_.Start());
   }
@@ -80,6 +82,17 @@
     return create_params;
   }
 
+  void CreateNavigationListener() {
+    // Attach a navigation listener, to monitor the state of the Frame.
+    navigation_listener_ =
+        std::make_unique<cr_fuchsia::TestNavigationListener>();
+    navigation_listener_binding_ =
+        std::make_unique<fidl::Binding<fuchsia::web::NavigationEventListener>>(
+            navigation_listener_.get());
+    frame_->SetNavigationEventListener(
+        navigation_listener_binding_->NewBinding());
+  }
+
   void CreateContextAndFrame(fuchsia::web::CreateContextParams params) {
     web_context_provider_->Create(std::move(params), context_.NewRequest());
     context_.set_error_handler([](zx_status_t status) { ADD_FAILURE(); });
@@ -90,6 +103,8 @@
     frame_->GetNavigationController(navigation_controller_.NewRequest());
     navigation_controller_.set_error_handler(
         [](zx_status_t status) { ADD_FAILURE(); });
+
+    CreateNavigationListener();
   }
 
   void CreateContextAndExpectError(fuchsia::web::CreateContextParams params,
@@ -107,19 +122,21 @@
                                        const GURL& url) {
     CreateContextAndFrame(std::move(params));
 
-    // Attach a navigation listener, to monitor the state of the Frame.
-    cr_fuchsia::TestNavigationListener listener;
-    fidl::Binding<fuchsia::web::NavigationEventListener> listener_binding(
-        &listener);
-    frame_->SetNavigationEventListener(listener_binding.NewBinding());
-
     // Navigate the Frame to |url| and wait for it to complete loading.
     fuchsia::web::LoadUrlParams load_url_params;
     ASSERT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
         navigation_controller_.get(), std::move(load_url_params), url.spec()));
 
     // Wait for the URL to finish loading.
-    listener.RunUntilUrlEquals(url);
+    navigation_listener_->RunUntilUrlEquals(url);
+  }
+
+  void GrantPermission(fuchsia::web::PermissionType type,
+                       const std::string& origin) {
+    fuchsia::web::PermissionDescriptor permission;
+    permission.set_type(type);
+    frame_->SetPermissionState(std::move(permission), origin,
+                               fuchsia::web::PermissionState::GRANTED);
   }
 
   std::string ExecuteJavaScriptWithStringResult(base::StringPiece script) {
@@ -143,6 +160,10 @@
   fuchsia::web::FramePtr frame_;
   fuchsia::web::NavigationControllerPtr navigation_controller_;
 
+  std::unique_ptr<cr_fuchsia::TestNavigationListener> navigation_listener_;
+  std::unique_ptr<fidl::Binding<fuchsia::web::NavigationEventListener>>
+      navigation_listener_binding_;
+
   DISALLOW_COPY_AND_ASSIGN(WebEngineIntegrationTest);
 };
 
@@ -366,11 +387,7 @@
   EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
       navigation_controller_.get(), fuchsia::web::LoadUrlParams(),
       kUrl.spec()));
-  cr_fuchsia::TestNavigationListener navigation_listener;
-  fidl::Binding<fuchsia::web::NavigationEventListener> listener_binding(
-      &navigation_listener);
-  frame_->SetNavigationEventListener(listener_binding.NewBinding());
-  navigation_listener.RunUntilUrlAndTitleEquals(kUrl, kTitle);
+  navigation_listener_->RunUntilUrlAndTitleEquals(kUrl, kTitle);
 }
 
 TEST_F(WebEngineIntegrationTest, PlayAudio) {
@@ -394,11 +411,7 @@
       navigation_controller_.get(), std::move(load_url_params),
       "fuchsia-dir://testdata/play_audio.html"));
 
-  cr_fuchsia::TestNavigationListener navigation_listener;
-  fidl::Binding<fuchsia::web::NavigationEventListener> listener_binding(
-      &navigation_listener);
-  frame_->SetNavigationEventListener(listener_binding.NewBinding());
-  navigation_listener.RunUntilTitleEquals("ended");
+  navigation_listener_->RunUntilTitleEquals("ended");
 }
 
 void WebEngineIntegrationTest::RunPermissionTest(bool grant) {
@@ -409,23 +422,15 @@
   CreateContextAndFrame(std::move(create_params));
 
   if (grant) {
-    // Grant microphone permission.
-    fuchsia::web::PermissionDescriptor mic_permission;
-    mic_permission.set_type(fuchsia::web::PermissionType::MICROPHONE);
-    frame_->SetPermissionState(std::move(mic_permission),
-                               "fuchsia-dir://testdata/",
-                               fuchsia::web::PermissionState::GRANTED);
+    GrantPermission(fuchsia::web::PermissionType::MICROPHONE,
+                    "fuchsia-dir://testdata/");
   }
 
   EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
       navigation_controller_.get(), fuchsia::web::LoadUrlParams(),
       "fuchsia-dir://testdata/check_mic_permission.html"));
 
-  cr_fuchsia::TestNavigationListener navigation_listener;
-  fidl::Binding<fuchsia::web::NavigationEventListener> listener_binding(
-      &navigation_listener);
-  frame_->SetNavigationEventListener(listener_binding.NewBinding());
-  navigation_listener.RunUntilTitleEquals(grant ? "granted" : "denied");
+  navigation_listener_->RunUntilTitleEquals(grant ? "granted" : "denied");
 }
 
 TEST_F(WebEngineIntegrationTest, PermissionDenied) {
@@ -435,3 +440,34 @@
 TEST_F(WebEngineIntegrationTest, PermissionGranted) {
   RunPermissionTest(true);
 }
+
+TEST_F(WebEngineIntegrationTest, MicrophoneAccess_WithPermission) {
+  StartWebEngine();
+
+  fuchsia::web::CreateContextParams create_params = DefaultContextParams();
+  create_params.set_features(fuchsia::web::ContextFeatureFlags::AUDIO);
+  CreateContextAndFrame(std::move(create_params));
+
+  GrantPermission(fuchsia::web::PermissionType::MICROPHONE,
+                  embedded_test_server_.GetURL("/").GetOrigin().spec());
+
+  EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
+      navigation_controller_.get(), fuchsia::web::LoadUrlParams(),
+      embedded_test_server_.GetURL("/mic.html").spec()));
+
+  navigation_listener_->RunUntilTitleEquals("ended");
+}
+
+TEST_F(WebEngineIntegrationTest, MicrophoneAccess_WithoutPermission) {
+  StartWebEngine();
+
+  fuchsia::web::CreateContextParams create_params = DefaultContextParams();
+  create_params.set_features(fuchsia::web::ContextFeatureFlags::AUDIO);
+  CreateContextAndFrame(std::move(create_params));
+
+  EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
+      navigation_controller_.get(), fuchsia::web::LoadUrlParams(),
+      embedded_test_server_.GetURL("/mic.html?NoPermission").spec()));
+
+  navigation_listener_->RunUntilTitleEquals("ended");
+}
\ No newline at end of file
diff --git a/gpu/ipc/common/gpu_memory_buffer_impl_test_template.h b/gpu/ipc/common/gpu_memory_buffer_impl_test_template.h
index 791cfd76..94d4a6c 100644
--- a/gpu/ipc/common/gpu_memory_buffer_impl_test_template.h
+++ b/gpu/ipc/common/gpu_memory_buffer_impl_test_template.h
@@ -21,7 +21,7 @@
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/buffer_format_util.h"
-#include "ui/gfx/mojom/buffer_types_mojom_traits.h"
+#include "ui/gfx/mojom/buffer_types.mojom.h"
 
 #if defined(OS_WIN) || defined(USE_OZONE)
 #include "ui/gl/init/gl_factory.h"
diff --git a/gpu/vulkan/BUILD.gn b/gpu/vulkan/BUILD.gn
index 5c85d73..26e22a3c 100644
--- a/gpu/vulkan/BUILD.gn
+++ b/gpu/vulkan/BUILD.gn
@@ -128,8 +128,9 @@
     }
   }
 
-  # TODO(cblume): These tests should run on each platform -- crbug.com/858614
-  if (use_x11) {
+  # TODO(penghuang): support more platforms
+  # https://crbug.com/1065499
+  if (is_android || use_x11) {
     test("vulkan_tests") {
       sources = [
         "tests/basic_vulkan_test.cc",
@@ -147,10 +148,22 @@
         "//gpu/vulkan/init",
         "//testing/gmock",
         "//testing/gtest",
+        "//ui/events/platform",
         "//ui/gfx",
         "//ui/gfx:native_widget_types",
         "//ui/gfx/geometry",
       ]
+
+      if (use_x11) {
+        deps += [ "//ui/events/platform/x11" ]
+      }
+
+      if (is_android) {
+        deps += [
+          "//ui/android:ui_java",
+          "//ui/gl",
+        ]
+      }
     }
   }
 }
diff --git a/gpu/vulkan/tests/DEPS b/gpu/vulkan/tests/DEPS
new file mode 100644
index 0000000..d9fe530
--- /dev/null
+++ b/gpu/vulkan/tests/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ui/events/platform",
+]
diff --git a/gpu/vulkan/tests/basic_vulkan_test.cc b/gpu/vulkan/tests/basic_vulkan_test.cc
index 4b344a33..5724b56 100644
--- a/gpu/vulkan/tests/basic_vulkan_test.cc
+++ b/gpu/vulkan/tests/basic_vulkan_test.cc
@@ -7,8 +7,13 @@
 #include "gpu/vulkan/init/vulkan_factory.h"
 #include "gpu/vulkan/tests/native_window.h"
 #include "gpu/vulkan/vulkan_surface.h"
+#include "ui/events/platform/platform_event_source.h"
 #include "ui/gfx/geometry/rect.h"
 
+#if defined(OS_ANDROID)
+#include <android/native_window_jni.h>
+#endif
+
 namespace gpu {
 
 BasicVulkanTest::BasicVulkanTest() {}
@@ -16,8 +21,17 @@
 BasicVulkanTest::~BasicVulkanTest() {}
 
 void BasicVulkanTest::SetUp() {
+  platform_event_source_ = ui::PlatformEventSource::CreateDefault();
+#if defined(USE_X11)
   const gfx::Rect kDefaultBounds(10, 10, 100, 100);
   window_ = CreateNativeWindow(kDefaultBounds);
+#elif defined(OS_ANDROID)
+  // TODO(penghuang): Not depend on gl.
+  uint texture = 0;
+  surface_texture_ = gl::SurfaceTexture::Create(texture);
+  window_ = surface_texture_->CreateSurface();
+  ASSERT_TRUE(window_ != gfx::kNullAcceleratedWidget);
+#endif
   vulkan_implementation_ = CreateVulkanImplementation();
   ASSERT_TRUE(vulkan_implementation_);
   ASSERT_TRUE(vulkan_implementation_->InitializeVulkanInstance());
@@ -29,10 +43,15 @@
 }
 
 void BasicVulkanTest::TearDown() {
+#if defined(USE_X11)
   DestroyNativeWindow(window_);
+#elif defined(OS_ANDROID)
+  ANativeWindow_release(window_);
+#endif
   window_ = gfx::kNullAcceleratedWidget;
   device_queue_->Destroy();
   vulkan_implementation_.reset();
+  platform_event_source_.reset();
 }
 
 std::unique_ptr<VulkanSurface> BasicVulkanTest::CreateViewSurface(
diff --git a/gpu/vulkan/tests/basic_vulkan_test.h b/gpu/vulkan/tests/basic_vulkan_test.h
index ece7509..8be2002 100644
--- a/gpu/vulkan/tests/basic_vulkan_test.h
+++ b/gpu/vulkan/tests/basic_vulkan_test.h
@@ -5,11 +5,21 @@
 #ifndef GPU_VULKAN_TESTS_BASIC_VULKAN_TEST_H_
 #define GPU_VULKAN_TESTS_BASIC_VULKAN_TEST_H_
 
+#include "base/memory/ref_counted.h"
+#include "build/build_config.h"
 #include "gpu/vulkan/vulkan_device_queue.h"
 #include "gpu/vulkan/vulkan_implementation.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/native_widget_types.h"
 
+#if defined(OS_ANDROID)
+#include "ui/gl/android/surface_texture.h"
+#endif
+
+namespace ui {
+class PlatformEventSource;
+}
+
 namespace gpu {
 
 class BasicVulkanTest : public testing::Test {
@@ -25,14 +35,20 @@
     return vulkan_implementation_.get();
   }
   VulkanDeviceQueue* GetDeviceQueue() { return device_queue_.get(); }
+  VkDevice device() { return device_queue_->GetVulkanDevice(); }
+  VkQueue queue() { return device_queue_->GetVulkanQueue(); }
   std::unique_ptr<VulkanSurface> CreateViewSurface(
       gfx::AcceleratedWidget window);
 
  private:
+  std::unique_ptr<ui::PlatformEventSource> platform_event_source_;
   std::unique_ptr<VulkanImplementation> vulkan_implementation_;
   std::unique_ptr<VulkanDeviceQueue> device_queue_;
 
   gfx::AcceleratedWidget window_ = gfx::kNullAcceleratedWidget;
+#if defined(OS_ANDROID)
+  scoped_refptr<gl::SurfaceTexture> surface_texture_;
+#endif
 };
 
 }  // namespace gpu
diff --git a/gpu/vulkan/tests/vulkan_test.cc b/gpu/vulkan/tests/vulkan_test.cc
index b30a4b5..1b17fbc 100644
--- a/gpu/vulkan/tests/vulkan_test.cc
+++ b/gpu/vulkan/tests/vulkan_test.cc
@@ -4,10 +4,13 @@
 
 #include <memory>
 
+#include "base/optional.h"
 #include "gpu/vulkan/tests/basic_vulkan_test.h"
 #include "gpu/vulkan/vulkan_command_buffer.h"
+#include "gpu/vulkan/vulkan_fence_helper.h"
 #include "gpu/vulkan/vulkan_surface.h"
 #include "gpu/vulkan/vulkan_swap_chain.h"
+#include "gpu/vulkan/vulkan_util.h"
 
 // This file tests basic vulkan initialization steps.
 
@@ -31,11 +34,42 @@
   ASSERT_TRUE(
       surface->Reshape(gfx::Size(100, 100), gfx::OVERLAY_TRANSFORM_NONE));
 
+  constexpr VkSemaphore kNullSemaphore = VK_NULL_HANDLE;
+  auto* fence_helper = GetDeviceQueue()->GetFenceHelper();
+
+  base::Optional<VulkanSwapChain::ScopedWrite> scoped_write;
+  scoped_write.emplace(surface->swap_chain());
+  EXPECT_TRUE(scoped_write->success());
+  VkSemaphore begin_semaphore = scoped_write->TakeBeginSemaphore();
+  EXPECT_NE(begin_semaphore, kNullSemaphore);
+  EXPECT_TRUE(SubmitWaitVkSemaphore(queue(), begin_semaphore));
+
+  fence_helper->EnqueueSemaphoreCleanupForSubmittedWork(begin_semaphore);
+
+  VkSemaphore end_semaphore = scoped_write->GetEndSemaphore();
+  EXPECT_NE(end_semaphore, kNullSemaphore);
+  EXPECT_TRUE(SubmitSignalVkSemaphore(queue(), end_semaphore));
+
+  scoped_write.reset();
+
   // First swap is a special case, call it first to get better errors.
   EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface->SwapBuffers());
 
   // Also make sure we can swap multiple times.
   for (int i = 0; i < 10; ++i) {
+    base::Optional<VulkanSwapChain::ScopedWrite> scoped_write;
+    scoped_write.emplace(surface->swap_chain());
+    EXPECT_TRUE(scoped_write->success());
+    VkSemaphore begin_semaphore = scoped_write->TakeBeginSemaphore();
+    EXPECT_NE(begin_semaphore, kNullSemaphore);
+    EXPECT_TRUE(SubmitWaitVkSemaphore(queue(), begin_semaphore));
+
+    VkSemaphore end_semaphore = scoped_write->GetEndSemaphore();
+    EXPECT_NE(end_semaphore, kNullSemaphore);
+    EXPECT_TRUE(SubmitSignalVkSemaphore(queue(), end_semaphore));
+
+    scoped_write.reset();
+
     EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface->SwapBuffers());
   }
   surface->Finish();
diff --git a/gpu/vulkan/vulkan_fence_helper_unittest.cc b/gpu/vulkan/vulkan_fence_helper_unittest.cc
index 8e3d9d1..a921560 100644
--- a/gpu/vulkan/vulkan_fence_helper_unittest.cc
+++ b/gpu/vulkan/vulkan_fence_helper_unittest.cc
@@ -168,6 +168,9 @@
       fence_helper->GenerateCleanupFence();
   EXPECT_TRUE(fence_handle.is_valid());
 
+  // Call vkQueueWaitIdle() to make sure the |fence_handle| is passed.
+  vkQueueWaitIdle(queue());
+
   // Enqueue 5 more callbacks.
   for (int i = 5; i < 10; i++) {
     fence_helper->EnqueueCleanupTaskForSubmittedWork(
diff --git a/gpu/vulkan/vulkan_util.cc b/gpu/vulkan/vulkan_util.cc
index 797d78e..14fb435 100644
--- a/gpu/vulkan/vulkan_util.cc
+++ b/gpu/vulkan/vulkan_util.cc
@@ -31,10 +31,14 @@
                             const base::span<VkSemaphore>& vk_semaphores,
                             VkFence vk_fence) {
   DCHECK(!vk_semaphores.empty());
+  std::vector<VkPipelineStageFlags> semaphore_stages(vk_semaphores.size());
+  std::fill(semaphore_stages.begin(), semaphore_stages.end(),
+            VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
   // Structure specifying a queue submit operation.
   VkSubmitInfo submit_info = {VK_STRUCTURE_TYPE_SUBMIT_INFO};
   submit_info.waitSemaphoreCount = vk_semaphores.size();
   submit_info.pWaitSemaphores = vk_semaphores.data();
+  submit_info.pWaitDstStageMask = semaphore_stages.data();
   const unsigned int submit_count = 1;
   return vkQueueSubmit(vk_queue, submit_count, &submit_info, vk_fence) ==
          VK_SUCCESS;
diff --git a/infra/config/buckets/ci.star b/infra/config/buckets/ci.star
index d07757d..8777c01 100644
--- a/infra/config/buckets/ci.star
+++ b/infra/config/buckets/ci.star
@@ -478,13 +478,26 @@
     name = 'linux-win_cross-rel',
 )
 
-
-ci.clang_ios_builder(
+ci.clang_builder(
     name = 'ToTiOS',
+    caches = [xcode_cache.x11c29],
+    cores = None,
+    os = os.MAC_10_14,
+    properties = {
+        'xcode_build_version': '11c29'
+    },
+    ssd=True
 )
 
-ci.clang_ios_builder(
+ci.clang_builder(
     name = 'ToTiOSDevice',
+    caches = [xcode_cache.x11c29],
+    cores = None,
+    os = os.MAC_10_14,
+    properties = {
+        'xcode_build_version': '11c29'
+    },
+    ssd=True
 )
 
 
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 8b36583..5549f9a 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -4863,17 +4863,18 @@
       dimensions: "os:Mac-10.14"
       dimensions: "ssd:1"
       recipe: <
-        name: "ios/unified_builder_tester"
+        name: "chromium"
         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:\"chromium.clang\""
         properties_j: "perf_dashboard_machine_group:\"ChromiumClang\""
+        properties_j: "xcode_build_version:\"11c29\""
       >
       execution_timeout_secs: 43200
       caches: <
-        name: "xcode_ios_11a1027"
-        path: "xcode_ios_11a1027.app"
+        name: "xcode_ios_11c29"
+        path: "xcode_ios_11c29.app"
       >
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -4887,17 +4888,18 @@
       dimensions: "os:Mac-10.14"
       dimensions: "ssd:1"
       recipe: <
-        name: "ios/unified_builder_tester"
+        name: "chromium"
         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:\"chromium.clang\""
         properties_j: "perf_dashboard_machine_group:\"ChromiumClang\""
+        properties_j: "xcode_build_version:\"11c29\""
       >
       execution_timeout_secs: 43200
       caches: <
-        name: "xcode_ios_11a1027"
-        path: "xcode_ios_11a1027.app"
+        name: "xcode_ios_11c29"
+        path: "xcode_ios_11c29.app"
       >
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star
index 573a1118..24f01ee 100644
--- a/infra/config/lib/ci.star
+++ b/infra/config/lib/ci.star
@@ -90,18 +90,6 @@
   )
 
 
-def clang_ios_builder(*, name, **kwargs):
-  return clang_builder(
-      name = name,
-      caches = [builders.xcode_cache.x11a1027],
-      cores = None,
-      executable = 'recipe:ios/unified_builder_tester',
-      os = builders.os.MAC_10_14,
-      ssd = True,
-      **kwargs
-  )
-
-
 def clang_mac_builder(*, name, cores=24, **kwargs):
   return clang_builder(
       name = name,
@@ -448,7 +436,6 @@
     chromium_builder = chromium_builder,
     chromiumos_builder = chromiumos_builder,
     clang_builder = clang_builder,
-    clang_ios_builder = clang_ios_builder,
     clang_mac_builder = clang_mac_builder,
     dawn_builder = dawn_builder,
     fuzz_builder = fuzz_builder,
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index 69af6df..b00bc21 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">ለጥፍ እና ሂድ</translation>
 <translation id="292639812446257861">እንዳልተነበበ ምልክት አድርግ</translation>
 <translation id="2958718410589002129">የይለፍ ቃላት</translation>
+<translation id="2964349545761222050">የሶስተኛ ወገን ኩኪዎችን ያግዱ</translation>
 <translation id="2969979262385602596">በመለያ መግባት አልተሳካም። እባክዎ ቆይተው እንደገና ይሞክሩ።</translation>
 <translation id="298306318844797842">የመክፈያ ዘዴን ያክሉ...</translation>
 <translation id="2989805286512600854">በአዲስ ትር ክፈት</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">የእርስዎን ዕልባቶች፣ የይለፍ ቃላት፣ ታሪክ እና ሌሎች ቅንብሮችን በሁሉም መሣሪያዎችዎ ላይ ለማግኘት በGoogle መለያዎ ይግቡ</translation>
 <translation id="5005498671520578047">የይለፍ ቃል ቅዳ</translation>
 <translation id="5010803260590204777">ድሩን በግል ለማሰስ ማንነት የማያሳውቅ ትር ይክፈቱ።</translation>
+<translation id="5039020240289137291">የሶስተኛ ወገን ኩኪዎችን በማገድ ላይ</translation>
 <translation id="5039804452771397117">ፍቀድ</translation>
 <translation id="5059136629401106827">እሺ</translation>
 <translation id="5062321486222145940">Google Driveን ጫን</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index d411dba..e1e36274 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">لصق وانتقال</translation>
 <translation id="292639812446257861">وضع علامة كغير مقروءة</translation>
 <translation id="2958718410589002129">كلمات المرور</translation>
+<translation id="2964349545761222050">حظر ملفات تعريف الارتباط للجهات الخارجية</translation>
 <translation id="2969979262385602596">تعذّر تسجيل الدخول. يُرجى إعادة المحاولة لاحقًا.</translation>
 <translation id="298306318844797842">إضافة طريقة الدفع...</translation>
 <translation id="2989805286512600854">فتح في علامة تبويب جديدة</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">‏سجّل الدخول إلى حسابك على Google للحصول على الإشارات المرجعية وكلمات المرور والسجلّ والإعدادات الأخرى واستخدامها على جميع أجهزتك.</translation>
 <translation id="5005498671520578047">نسخ كلمة المرور</translation>
 <translation id="5010803260590204777">افتح علامة تبويب تصفح متخفي لتصفّح الويب بخصوصية تامّة.</translation>
+<translation id="5039020240289137291">حظر ملفات تعريف الارتباط للجهات الخارجية</translation>
 <translation id="5039804452771397117">سماح</translation>
 <translation id="5059136629401106827">حسنًا</translation>
 <translation id="5062321486222145940">‏تثبيت Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index 60e3797..0ea763d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Yerləşdirin və Keçin</translation>
 <translation id="292639812446257861">Oxunmamış Kimi Qeyd Edin</translation>
 <translation id="2958718410589002129">Parollar</translation>
+<translation id="2964349545761222050">Üçüncü Tərəf Kukiləri Bloklayın</translation>
 <translation id="2969979262385602596">Hesaba daxil olmaq uğursuz oldu. Lütfən, daha sonra yenidən cəhd edin.</translation>
 <translation id="298306318844797842">Ödəniş metodu əlavə edin...</translation>
 <translation id="2989805286512600854">Yeni Paneldə açın</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Bütün cihazlarınızda əlfəcin, tarixçə, parol və digər ayarları əldə etmək üçün Google Hesabınız ilə daxil olun.</translation>
 <translation id="5005498671520578047">Parolu kopyalayın</translation>
 <translation id="5010803260590204777">Vebə özəl olaraq baxmaq üçün gizli panel açın.</translation>
+<translation id="5039020240289137291">Üçüncü tərəf kukilər bloklanır</translation>
 <translation id="5039804452771397117">İcazə verin</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Google Diski quraşdırın</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb
index fa39a77..8a286d1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_be.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Уставіць і перайсці</translation>
 <translation id="292639812446257861">Пазначыць як непрачытаныя</translation>
 <translation id="2958718410589002129">Паролі</translation>
+<translation id="2964349545761222050">Блакіраваць староннія файлы cookie</translation>
 <translation id="2969979262385602596">Не ўдалося ўвайсці. Паўтарыце спробу пазней.</translation>
 <translation id="298306318844797842">Дадаць спосаб аплаты...</translation>
 <translation id="2989805286512600854">Адкрыць у новай укладцы</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Каб закладкі, паролі, гісторыя і іншыя налады былі даступнымі на ўсіх вашых прыладах, увайдзіце ва Уліковы запіс Google</translation>
 <translation id="5005498671520578047">Капіраваць пароль</translation>
 <translation id="5010803260590204777">Для прыватнага прагляду вэб-сайтаў адкрыйце ўкладку інкогніта.</translation>
+<translation id="5039020240289137291">Блакіроўка старонніх файлаў cookie</translation>
 <translation id="5039804452771397117">Дазволіць</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Усталяваць Google Дыск</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index bf27ad8..9302801a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Поставяне и старт</translation>
 <translation id="292639812446257861">Означаване като непрочетено</translation>
 <translation id="2958718410589002129">Пароли</translation>
+<translation id="2964349545761222050">Блокиране на „бисквитките“ на трети страни</translation>
 <translation id="2969979262385602596">Влизането не бе успешно. Моля, опитайте пак по-късно.</translation>
 <translation id="298306318844797842">Добавяне на начин на плащане…</translation>
 <translation id="2989805286512600854">Отваряне в нов раздел</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Влезте с профила си в Google, за да получите своите отметки, пароли, история и други настройки на всичките си устройства</translation>
 <translation id="5005498671520578047">Копиране на паролата</translation>
 <translation id="5010803260590204777">Отворете раздел в режим „инкогнито“, за да сърфирате частно в мрежата.</translation>
+<translation id="5039020240289137291">„Бисквитките“ на трети страни се блокират</translation>
 <translation id="5039804452771397117">Разрешаване</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Инсталиране на Google Диск</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index b36452c..fc9dab8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Vložit a přejít</translation>
 <translation id="292639812446257861">Označit jako nepřečtené</translation>
 <translation id="2958718410589002129">Hesla</translation>
+<translation id="2964349545761222050">Blokovat soubory cookie třetích stran</translation>
 <translation id="2969979262385602596">Přihlášení se nezdařilo. Zkuste to znovu později.</translation>
 <translation id="298306318844797842">Přidat platební metodu...</translation>
 <translation id="2989805286512600854">Otevřít v nové kartě</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Přihlaste se pomocí účtu Google a získejte záložky, hesla, historii a další nastavení do všech svých zařízení.</translation>
 <translation id="5005498671520578047">Kopírování hesla</translation>
 <translation id="5010803260590204777">Chcete-li prohlížet internet v soukromí, otevřete novou anonymní kartu.</translation>
+<translation id="5039020240289137291">Blokování souborů cookie třetích stran</translation>
 <translation id="5039804452771397117">Povolit</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Instalace Disku Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index d11ea29..8e601fb4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Indsæt og fortsæt</translation>
 <translation id="292639812446257861">Markér som ulæst</translation>
 <translation id="2958718410589002129">Adgangskoder</translation>
+<translation id="2964349545761222050">Bloker cookies fra tredjeparter</translation>
 <translation id="2969979262385602596">Login mislykkedes. Prøv igen senere.</translation>
 <translation id="298306318844797842">Tilføj betalingsmetode...</translation>
 <translation id="2989805286512600854">Åbn på ny fane</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Log ind med din Google-konto for at få adgang til dine bogmærker, dine adgangskoder, din historik og andre indstillinger på alle dine enheder.</translation>
 <translation id="5005498671520578047">Kopiér adgangskode</translation>
 <translation id="5010803260590204777">Åbn en inkognitofane for at søge på nettet uden at blive registreret.</translation>
+<translation id="5039020240289137291">Blokerer cookies fra tredjeparter</translation>
 <translation id="5039804452771397117">Tillad</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Installer Google Drev</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 2f58930..e9d44317 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Einfügen und los</translation>
 <translation id="292639812446257861">Als ungelesen markieren</translation>
 <translation id="2958718410589002129">Passwörter</translation>
+<translation id="2964349545761222050">Drittanbieter-Cookies blockieren</translation>
 <translation id="2969979262385602596">Anmeldefehler, bitte später erneut versuchen</translation>
 <translation id="298306318844797842">Zahlungsmethode hinzufügen…</translation>
 <translation id="2989805286512600854">In neuem Tab öffnen</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Melden Sie sich mit Ihrem Google-Konto an, um Ihre Lesezeichen, Ihre Passwörter, Ihren Verlauf und Ihre anderen Einstellungen auf allen Geräten abrufen zu können</translation>
 <translation id="5005498671520578047">Passwort kopieren</translation>
 <translation id="5010803260590204777">Öffnet einen Inkognito-Tab zum anonymen Surfen im Web</translation>
+<translation id="5039020240289137291">Cookies von Drittanbietern werden blockiert</translation>
 <translation id="5039804452771397117">Zulassen</translation>
 <translation id="5059136629401106827">Ok</translation>
 <translation id="5062321486222145940">Google Drive installieren</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
index 678b2994..faa2a5dd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Pegar y acceder</translation>
 <translation id="292639812446257861">Marcar como no leídas</translation>
 <translation id="2958718410589002129">Contraseñas</translation>
+<translation id="2964349545761222050">Bloquear cookies de terceros</translation>
 <translation id="2969979262385602596">Error al iniciar la sesión. Inténtalo más tarde.</translation>
 <translation id="298306318844797842">Agregar forma de pago…</translation>
 <translation id="2989805286512600854">Abrir en una nueva pestaña</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Accede con tu cuenta de Google para obtener tus favoritos, contraseñas, historial y otras opciones de configuración en todos tus dispositivos</translation>
 <translation id="5005498671520578047">Copiar contraseña</translation>
 <translation id="5010803260590204777">Abre una pestaña de incógnito para navegar por la Web de forma privada.</translation>
+<translation id="5039020240289137291">Se están bloqueando las cookies de terceros</translation>
 <translation id="5039804452771397117">Permitir</translation>
 <translation id="5059136629401106827">Aceptar</translation>
 <translation id="5062321486222145940">Instalar Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index 875c20de2..7e6ecb6b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Itsatsi eta listo</translation>
 <translation id="292639812446257861">Markatu irakurri gabeko gisa</translation>
 <translation id="2958718410589002129">Pasahitzak</translation>
+<translation id="2964349545761222050">Blokeatu hirugarrenen cookieak</translation>
 <translation id="2969979262385602596">Ezin izan da hasi saioa. Saiatu berriro geroago.</translation>
 <translation id="298306318844797842">Gehitu ordainketa-metodoa…</translation>
 <translation id="2989805286512600854">Ireki fitxa berri batean</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Hasi saioa Google-ko kontuarekin laster-markak, historia, pasahitzak eta bestelako ezarpenak gailu guztietan eskura izateko</translation>
 <translation id="5005498671520578047">Kopiatu pasahitza</translation>
 <translation id="5010803260590204777">Sarea modu pribatuan arakatzeko, ireki ezkutuko fitxa bat.</translation>
+<translation id="5039020240289137291">Hirugarrenen cookieak blokeatzen</translation>
 <translation id="5039804452771397117">Baimendu</translation>
 <translation id="5059136629401106827">Ados</translation>
 <translation id="5062321486222145940">Instalatu Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index 01a3888..81b9707 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">جای‌گذاری و رفتن</translation>
 <translation id="292639812446257861">علامت‌گذاری به‌‌عنوان خوانده‌نشده</translation>
 <translation id="2958718410589002129">گذرواژه‌ها</translation>
+<translation id="2964349545761222050">مسدود کردن کوکی‌های شخص ثالث</translation>
 <translation id="2969979262385602596">ورود به سیستم انجام نشد. بعداً دوباره امتحان کنید.</translation>
 <translation id="298306318844797842">افزودن روش پرداخت…</translation>
 <translation id="2989805286512600854">باز کردن در برگهٔ جدید</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">‏برای دریافت نشانک‌ها، گذرواژه‌ها، سابقه و تنظیمات دیگر در همه دستگاه‌هایتان، به سیستم حساب Google خود وارد شوید</translation>
 <translation id="5005498671520578047">کپی گذرواژه</translation>
 <translation id="5010803260590204777">برای مرور وب به صورت خصوصی برگه ناشناس باز کنید.</translation>
+<translation id="5039020240289137291">مسدود کردن کوکی‌های شخص ثالث</translation>
 <translation id="5039804452771397117">اجازه دادن</translation>
 <translation id="5059136629401106827">خوب</translation>
 <translation id="5062321486222145940">‏نصب Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 827a9bfe..dbda5a4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Liitä ja siirry</translation>
 <translation id="292639812446257861">Merkitse lukemattomaksi</translation>
 <translation id="2958718410589002129">Salasanat</translation>
+<translation id="2964349545761222050">Estä kolmannen osapuolen evästeet</translation>
 <translation id="2969979262385602596">Kirjautuminen epäonnistui. Yritä myöhemmin uudelleen.</translation>
 <translation id="298306318844797842">Lisää maksutapa…</translation>
 <translation id="2989805286512600854">Avaa uudessa välilehdessä</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Kirjaudu Google-tilillesi, niin voit käyttää kirjanmerkkejäsi, salasanojasi, historiaasi ja muuta Chrome-sisältöäsi kaikilla laitteillasi.</translation>
 <translation id="5005498671520578047">Kopioi salasana</translation>
 <translation id="5010803260590204777">Selaa verkkoa yksityisesti avaamalla incognito-välilehti.</translation>
+<translation id="5039020240289137291">Kolmannen osapuolen evästeiden estäminen</translation>
 <translation id="5039804452771397117">Salli</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Asenna Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index ce13d60..43131e0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Mag-paste at Umalis</translation>
 <translation id="292639812446257861">Markahan Bilang Hindi pa Nababasa</translation>
 <translation id="2958718410589002129">Mga Password</translation>
+<translation id="2964349545761222050">I-block ang Third-Party Cookies</translation>
 <translation id="2969979262385602596">Hindi nakapag-sign in. Pakisubukang muli mamaya.</translation>
 <translation id="298306318844797842">Magdagdag ng Paraan ng Pagbabayad...</translation>
 <translation id="2989805286512600854">Buksan sa Bagong Tab</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Mag-sign in gamit ang Google Account mo para makuha ang iyong mga bookmark, password, history at iba pang mga setting sa lahat ng device mo</translation>
 <translation id="5005498671520578047">Kopyahin password</translation>
 <translation id="5010803260590204777">Magbukas ng tab na incognito upang pribadong i-browse ang web.</translation>
+<translation id="5039020240289137291">Pag-block ng third-party na cookies</translation>
 <translation id="5039804452771397117">Payagan</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">I-install - Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
index 0b05173..84ee1e0b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Coller et rechercher</translation>
 <translation id="292639812446257861">Marquer comme non lu</translation>
 <translation id="2958718410589002129">Mots de passe</translation>
+<translation id="2964349545761222050">Bloquer les témoins tiers</translation>
 <translation id="2969979262385602596">Échec de connexion. Veuillez réessayer plus tard.</translation>
 <translation id="298306318844797842">Ajouter un mode de paiement…</translation>
 <translation id="2989805286512600854">Ouvrir dans un nouvel onglet</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Connectez-vous à votre compte Google pour synchroniser vos favoris, vos mots de passe, votre historique et vos autres paramètres sur tous vos appareils</translation>
 <translation id="5005498671520578047">Copier mot de passe</translation>
 <translation id="5010803260590204777">Ouvrez un onglet de navigation privée pour naviguer sur le Web en secret.</translation>
+<translation id="5039020240289137291">Bloquer les témoins tiers</translation>
 <translation id="5039804452771397117">Autoriser</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Installer Google Disque</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 2d167ead..ec84d35 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Coller et rechercher</translation>
 <translation id="292639812446257861">Marquer comme non lues</translation>
 <translation id="2958718410589002129">Mots de passe</translation>
+<translation id="2964349545761222050">Bloquer les cookies tiers</translation>
 <translation id="2969979262385602596">Échec de la connexion. Veuillez réessayer plus tard.</translation>
 <translation id="298306318844797842">Ajouter un mode de paiement</translation>
 <translation id="2989805286512600854">Ouvrir dans un nouvel onglet</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Connectez-vous à votre compte Google pour synchroniser favoris, mots de passe, historique et autres paramètres sur tous vos appareils.</translation>
 <translation id="5005498671520578047">Copier mot de passe</translation>
 <translation id="5010803260590204777">Ouvrez un onglet de navigation privée pour naviguer sur le Web en toute confidentialité.</translation>
+<translation id="5039020240289137291">Bloquer les cookies tiers</translation>
 <translation id="5039804452771397117">Autoriser</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Installer Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index 8ad7113..71052c9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Pegar e acceder</translation>
 <translation id="292639812446257861">Marcar como non lidos</translation>
 <translation id="2958718410589002129">Contrasinais</translation>
+<translation id="2964349545761222050">Bloquear cookies de terceiros</translation>
 <translation id="2969979262385602596">Erro ao iniciar sesión. Téntao de novo máis tarde.</translation>
 <translation id="298306318844797842">Engadir método de pago…</translation>
 <translation id="2989805286512600854">Abrir nunha pestana nova</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Inicia sesión na túa conta de Google para ter os marcadores, os contrasinais, o historial e o resto das opcións de configuración en todos os teus dispositivos.</translation>
 <translation id="5005498671520578047">Copiar contrasinal</translation>
 <translation id="5010803260590204777">Abre unha pestana de incógnito para examinar a web de forma privada.</translation>
+<translation id="5039020240289137291">Estanse bloqueando as cookies de terceiros</translation>
 <translation id="5039804452771397117">Permitir</translation>
 <translation id="5059136629401106827">Aceptar</translation>
 <translation id="5062321486222145940">Instalar Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 61bf5ad9..eb731c8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">चिपकाएं और जाएं</translation>
 <translation id="292639812446257861">अपठित चिह्नित करें</translation>
 <translation id="2958718410589002129">पासवर्ड</translation>
+<translation id="2964349545761222050">तीसरे पक्ष की कुकी ब्लॉक करें</translation>
 <translation id="2969979262385602596">साइन इन नहीं हो पाया. बाद में फिर से कोशिश करें.</translation>
 <translation id="298306318844797842">भुगतान विधि जोड़ें...</translation>
 <translation id="2989805286512600854">नए टैब में खोलें</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">अपने सभी डिवाइस पर बुकमार्क, पासवर्ड, इतिहास और दूसरी तरह की सेटिंग पाने के लिए Google खाते से साइन इन करें.</translation>
 <translation id="5005498671520578047">पासवर्ड कॉपी करें</translation>
 <translation id="5010803260590204777">निजी रूप से वेब ब्राउज़ करने के लिए गुप्त टैब खोलें.</translation>
+<translation id="5039020240289137291">तीसरे पक्ष की कुकी ब्लॉक की जा रही हैं</translation>
 <translation id="5039804452771397117">अनुमति दें</translation>
 <translation id="5059136629401106827">ठीक</translation>
 <translation id="5062321486222145940">Google डिस्क इंस्टॉल करें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
index 37dc027..72ee2d6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Տեղադրել և անցնել</translation>
 <translation id="292639812446257861">Նշել որպես չկարդացված</translation>
 <translation id="2958718410589002129">Գաղտնաբառեր</translation>
+<translation id="2964349545761222050">Երրորդ կողմի քուքիների արգելափակում</translation>
 <translation id="2969979262385602596">Չհաջողվեց մուտք գործել: Փորձեք մի փոքր ուշ:</translation>
 <translation id="298306318844797842">Ավելացնել վճարման եղանակ...</translation>
 <translation id="2989805286512600854">Բացել նոր ներդիրում</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Մուտք գործեք ձեր Google հաշվով՝ ձեր էջանիշները, գաղտնաբառերը, պատմությունը և այլ կարգավորումները ձեր բոլոր սարքերում օգտագործելու համար:</translation>
 <translation id="5005498671520578047">Պատճենել գաղտնաբառը</translation>
 <translation id="5010803260590204777">Բացեք ինկոգնիտո ներդիր՝ համացանցում անանուն կերպով կայքեր դիտելու համար:</translation>
+<translation id="5039020240289137291">Երրորդ կողմի քուքիների արգելափակում</translation>
 <translation id="5039804452771397117">Թույլ տալ</translation>
 <translation id="5059136629401106827">Եղավ</translation>
 <translation id="5062321486222145940">Տեղադրել Google Drive-ը</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index e804039..4c2cd5a3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Tempel dan Buka</translation>
 <translation id="292639812446257861">Tandai Belum Dibaca</translation>
 <translation id="2958718410589002129">Sandi</translation>
+<translation id="2964349545761222050">Blokir Cookie Pihak Ketiga</translation>
 <translation id="2969979262385602596">Gagal masuk. Coba lagi nanti.</translation>
 <translation id="298306318844797842">Tambahkan Metode Pembayaran...</translation>
 <translation id="2989805286512600854">Buka di Tab Baru</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Login dengan Akun Google untuk mendapatkan bookmark, sandi, histori, dan setelan lainnya di semua perangkat Anda.</translation>
 <translation id="5005498671520578047">Salin sandi</translation>
 <translation id="5010803260590204777">Buka tab samaran untuk menjelajahi web secara pribadi.</translation>
+<translation id="5039020240289137291">Memblokir cookie pihak ketiga</translation>
 <translation id="5039804452771397117">Izinkan</translation>
 <translation id="5059136629401106827">Oke</translation>
 <translation id="5062321486222145940">Instal Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 6f05568..1969c2e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">貼り付けて移動</translation>
 <translation id="292639812446257861">未読にする</translation>
 <translation id="2958718410589002129">パスワード</translation>
+<translation id="2964349545761222050">サードパーティの Cookie をブロックする</translation>
 <translation id="2969979262385602596">ログインできません。後でもう一度お試しください。</translation>
 <translation id="298306318844797842">お支払い方法を追加...</translation>
 <translation id="2989805286512600854">新しいタブで開く</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Google アカウントでログインすると、どのデバイスからでも同じブックマーク、パスワード、履歴などの設定を利用できるようになります。</translation>
 <translation id="5005498671520578047">パスワードのコピー</translation>
 <translation id="5010803260590204777">ウェブをプライベートモードで閲覧するにはシークレットタブを開きます。</translation>
+<translation id="5039020240289137291">サードパーティの Cookie をブロックします</translation>
 <translation id="5039804452771397117">許可</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">ドライブをインストール</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index 0191b2a..a12913a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">ჩასმა და გადასვლა</translation>
 <translation id="292639812446257861">წაუკითხავად მონიშვნა</translation>
 <translation id="2958718410589002129">პაროლები</translation>
+<translation id="2964349545761222050">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა</translation>
 <translation id="2969979262385602596">ვერ შევიდა. მოგვიანებით სცადეთ.</translation>
 <translation id="298306318844797842">გადახდის მეთოდის დამატება…</translation>
 <translation id="2989805286512600854">ახალ ჩანართზე გახსნა</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">თქვენი სანიშნეების, პაროლების, ისტორიის და სხვა პარამეტრების ყველა თქვენს მოწყობილობაში მისაღებად, შედით სისტემაში თქვენი Google ანგარიშით</translation>
 <translation id="5005498671520578047">პაროლის კოპირება</translation>
 <translation id="5010803260590204777">ვების კონფიდენციალურად დასათვალიერებლად გახსენით ინკოგნიტო ჩანართი.</translation>
+<translation id="5039020240289137291">მესამე მხარის ქუქი-ჩანაწერები იბლოკება</translation>
 <translation id="5039804452771397117">დაშვება</translation>
 <translation id="5059136629401106827">კარგი</translation>
 <translation id="5062321486222145940">Google Drive-ის ინსტალაცია</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index f964e78..67d1887 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Қою және өту</translation>
 <translation id="292639812446257861">Оқылмаған етіп белгілеу</translation>
 <translation id="2958718410589002129">Құпия сөздер</translation>
+<translation id="2964349545761222050">Үшінші тараптың cookie файлдарын бөгеу</translation>
 <translation id="2969979262385602596">Кіру мүмкін емес. Кейінірек қайталап көріңіз.</translation>
 <translation id="298306318844797842">Төлеу әдісін қосу...</translation>
 <translation id="2989805286512600854">Жаңа қойындыда ашу</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Барлық құрылғыларда бетбелгілерді, құпия сөздерді, тарихты және басқа параметрлерді алу үшін Google есептік жазбасымен кіріңіз</translation>
 <translation id="5005498671520578047">Құпия сөзді көшіру</translation>
 <translation id="5010803260590204777">Интернетті оңаша шолу үшін инкогнито қойындысын ашыңыз.</translation>
+<translation id="5039020240289137291">Үшінші тараптың cookie файлдарын бөгеу</translation>
 <translation id="5039804452771397117">Рұқсат беру</translation>
 <translation id="5059136629401106827">Жарайды</translation>
 <translation id="5062321486222145940">Google Drive орнату</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb
index 38be22e6..63dcf68 100644
--- a/ios/chrome/app/strings/resources/ios_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">ដាក់ចូល ហើយ​រុករក</translation>
 <translation id="292639812446257861">សម្គាល់ថាមិនទាន់អាន</translation>
 <translation id="2958718410589002129">ពាក្យ​សម្ងាត់</translation>
+<translation id="2964349545761222050">ទប់ស្កាត់​ខូគី​ភាគី​ទីបី</translation>
 <translation id="2969979262385602596">បានបរាជ័យក្នុងការចូល។ សូមព្យាយាមម្តងទៀតនៅពេលក្រោយ។</translation>
 <translation id="298306318844797842">បញ្ចូលវិធីបង់ប្រាក់...</translation>
 <translation id="2989805286512600854">បើកនៅក្នុងផ្ទាំងថ្មី</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">ចូលដោយប្រើគណនី Google របស់អ្នកដើម្បីទទួលយកចំណាំ ពាក្យសម្ងាត់ ប្រវត្តិ និងការកំណត់ផ្សេងទៀតរបស់អ្នកនៅលើឧបករណ៍ទាំងអស់របស់អ្នក</translation>
 <translation id="5005498671520578047">ថតចម្លងពាក្យសម្ងាត់</translation>
 <translation id="5010803260590204777">បើកផ្ទាំងអនាមិកដើម្បីរុករកលើអ៊ីនធឺណិតជាឯកជន។</translation>
+<translation id="5039020240289137291">ការទប់ស្កាត់​ខូគី​ភាគី​ទីបី</translation>
 <translation id="5039804452771397117">អនុញ្ញាត</translation>
 <translation id="5059136629401106827">យល់ព្រម</translation>
 <translation id="5062321486222145940">ដំឡើង Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 8aa3594..5a92367 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">붙여넣어 바로가기</translation>
 <translation id="292639812446257861">읽지않음으로 표시</translation>
 <translation id="2958718410589002129">비밀번호</translation>
+<translation id="2964349545761222050">타사 쿠키 차단</translation>
 <translation id="2969979262385602596">로그인하지 못했습니다. 나중에 다시 시도하세요.</translation>
 <translation id="298306318844797842">결제 수단 추가...</translation>
 <translation id="2989805286512600854">새 탭에서 열기</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Google 계정으로 로그인하면 모든 기기에서 북마크, 비밀번호, 방문 기록 및 기타 설정을 사용할 수 있습니다.</translation>
 <translation id="5005498671520578047">비밀번호 복사</translation>
 <translation id="5010803260590204777">시크릿 탭을 열어 웹을 비공개로 탐색하세요.</translation>
+<translation id="5039020240289137291">타사 쿠키 차단</translation>
 <translation id="5039804452771397117">허용</translation>
 <translation id="5059136629401106827">확인</translation>
 <translation id="5062321486222145940">Google 드라이브 설치</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
index f158762..4b62dcf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Чаптоо жана өтүү</translation>
 <translation id="292639812446257861">Окула элек деп белгилөө</translation>
 <translation id="2958718410589002129">Сырсөздөр</translation>
+<translation id="2964349545761222050">Үчүнчү тараптын cookie файлдарын бөгөттөө</translation>
 <translation id="2969979262385602596">Кире албай калдңз. Бир аздн кийн аракт кылп көрңз.</translation>
 <translation id="298306318844797842">Төлөм ыкмасын кошуу…</translation>
 <translation id="2989805286512600854">Жаңы өтмөктө ачуу</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Бардык түзмөктөрүңүздөн кыстармалар, сырсөздөр, таржымал жана башка жөндөөлөрүңүздү алуу үчүн аккаунтка кириңиз</translation>
 <translation id="5005498671520578047">Сырсөздү көчүрүү</translation>
 <translation id="5010803260590204777">Интернетте купуя серептөө үчүн жашыруун өтмөк ачыңыз.</translation>
+<translation id="5039020240289137291">Үчүнчү тараптын cookie файлдарын бөгөттөө</translation>
 <translation id="5039804452771397117">Уруксат берүү</translation>
 <translation id="5059136629401106827">Жарайт</translation>
 <translation id="5062321486222145940">Google Drive'ды орнотуу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
index b5d9543..d94c94d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">ວາງໃສ່ ແລະ ຊອກຫາ</translation>
 <translation id="292639812446257861">ໝາຍວ່າຍັງບໍ່ໄດ້ອ່ານ</translation>
 <translation id="2958718410589002129">ລະຫັດຜ່ານ</translation>
+<translation id="2964349545761222050">ບລັອກຄຸກກີ້ພາກສ່ວນທີສາມ</translation>
 <translation id="2969979262385602596">ເຂົ້າ​ສູ່​ລະ​ບົບບໍ່ໄດ້, ກະລຸນາລອງໃໝ່ພາຍຫຼັງ.</translation>
 <translation id="298306318844797842">ເພີ່ມວິທີການຈ່າຍເງິນ...</translation>
 <translation id="2989805286512600854">ເປີດຢູ່ໃນແຖບໃໝ່</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">ເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີ Google ຂອງທ່ານເພື່ອໃຊ້ບຸກມາກ, ລະຫັດຜ່ານ, ປະຫວັດ ແລະ ການຕັ້ງຄ່າອື່ນຢູ່ໃນທຸກອຸປະກອນຂອງທ່ານ</translation>
 <translation id="5005498671520578047">ອັດ​ສຳ​ເນົາ​ລະ​ຫັດ​ຜ່ານ</translation>
 <translation id="5010803260590204777">ເປີດ​ແຖບ​ບໍ່​ເຜີຍ​​ຕົນ​ຕົວ ເພື່ອ​ທ່ອງ​ເວັບ​ເປັນ​ສ່ວນ​ຕົວ.</translation>
+<translation id="5039020240289137291">ການບລັອກຄຸກກີ້ພາກສ່ວນທີສາມ</translation>
 <translation id="5039804452771397117">ອະ​ນຸ​ຍາດ​</translation>
 <translation id="5059136629401106827">ຕົກລົງ</translation>
 <translation id="5062321486222145940">ຕິດ​ຕັ້ງ Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index aa8c9ee..86fd7098 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Ielīmēt un pāriet</translation>
 <translation id="292639812446257861">Atzīmēt kā nelasītus</translation>
 <translation id="2958718410589002129">Paroles</translation>
+<translation id="2964349545761222050">Bloķēt trešo pušu sīkfailus</translation>
 <translation id="2969979262385602596">Neizdevās pierakstīties. Vēlāk mēģiniet vēlreiz.</translation>
 <translation id="298306318844797842">Pievienot maksājuma veidu...</translation>
 <translation id="2989805286512600854">Atvērt jaunā cilnē</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Pierakstieties Google kontā, lai izmantotu savas grāmatzīmes, paroles, vēsturi un citus Chrome datus visās jūsu ierīcēs.</translation>
 <translation id="5005498671520578047">Paroles kopēšana</translation>
 <translation id="5010803260590204777">Atveriet inkognito režīma cilni, lai privāti pārlūkotu tīmekli.</translation>
+<translation id="5039020240289137291">Bloķēt trešo pušu sīkfailus</translation>
 <translation id="5039804452771397117">Atļaut</translation>
 <translation id="5059136629401106827">Labi</translation>
 <translation id="5062321486222145940">Instalēt Google disku</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index 685b916..2a7948dd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Буулгаад үргэлжлүүлэх</translation>
 <translation id="292639812446257861">Уншаагүй гэж тэмдэглэх</translation>
 <translation id="2958718410589002129">Нууц үг</translation>
+<translation id="2964349545761222050">Гуравдагч талын күүкиг блоклох</translation>
 <translation id="2969979262385602596">Нэвтэрч чадсангүй. Дараа дахин оролдоно уу.</translation>
 <translation id="298306318844797842">Төлбөрийн хэрэгсэл нэмэх...</translation>
 <translation id="2989805286512600854">Шинэ цонхонд нээ</translation>
@@ -303,6 +304,7 @@
 <translation id="4979397965658815378">Хавчуурга, нууц үг, түүх болон бусад тохиргоог бүх төхөөрөмждөө авахын тулд Google Бүртгэлээрээ нэвтэрнэ үү</translation>
 <translation id="5005498671520578047">Нууц үг хуулах</translation>
 <translation id="5010803260590204777">Вэбэд нууцлалтайгаар зочилохын тулд мэдээллийн нууцлалтай цонхыг нээнэ үү.</translation>
+<translation id="5039020240289137291">Гуравдагч талын күүкиг блоклож байна</translation>
 <translation id="5039804452771397117">Зөвшөөрөх</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Google Drive суулгах</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index 575d508..2e8e13f8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Tampal dan Pergi</translation>
 <translation id="292639812446257861">Tandakan Belum Dibaca</translation>
 <translation id="2958718410589002129">Kata laluan</translation>
+<translation id="2964349545761222050">Sekat Kuki Pihak Ketiga</translation>
 <translation id="2969979262385602596">Gagal melog masuk. Sila cuba sebentar lagi.</translation>
 <translation id="298306318844797842">Tambahkan Kaedah Pembayaran...</translation>
 <translation id="2989805286512600854">Buka dalam Tab Baharu</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Log masuk dengan Akaun Google anda untuk mendapatkan penanda halaman, kata laluan, sejarah dan tetapan anda yang lain pada semua peranti anda</translation>
 <translation id="5005498671520578047">Salin kata laluan</translation>
 <translation id="5010803260590204777">Buka tab inkognito untuk menyemak imbas web secara sulit.</translation>
+<translation id="5039020240289137291">Menyekat kuki pihak ketiga</translation>
 <translation id="5039804452771397117">Benarkan</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Pasang Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb
index 96a4b6f5..b51e4c3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_my.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">ကူးထည့်ပြီး ဖွင့်ရန်</translation>
 <translation id="292639812446257861">မဖတ်ရသေးကြောင်း အမှတ်အသားလုပ်ရန်</translation>
 <translation id="2958718410589002129">စကားဝှက်များ</translation>
+<translation id="2964349545761222050">ပြင်ပအဖွဲ့အစည်း၏ ကွတ်ကီးများကို ပိတ်ခြင်း</translation>
 <translation id="2969979262385602596">လက်မှတ်ထိုးဝင်ရောက်ခြင်းမအောင်မြင်ပါ။ ကျေးဇူးပြု၍ နောက်မှ ထပ်မံကြိုးစားပါ။</translation>
 <translation id="298306318844797842">ငွေပေးချေနည်းလမ်း ထည့်ရန်...</translation>
 <translation id="2989805286512600854">တဲဘ်အသစ်တွင် ဖွင့်မည်</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">သင့်စက်ပစ္စည်းများအားလုံးပေါ်တွင် စာညှပ်များ၊ စကားဝှက်များ၊ မှတ်တမ်းနှင့် အခြားဆက်တင်များ ရယူအသုံးပြုနိုင်ရန် သင့် Google အကောင့်ဖြင့် လက်မှတ်ထိုးဝင်ပါ</translation>
 <translation id="5005498671520578047">စကားဝှက်ကို ကူးယူပါ</translation>
 <translation id="5010803260590204777">ဝဘ်ကို သီးသန့် ရှာကြည့်ရန် ကိုယ်ပျောက်မုဒ်ဖြင့် တဘ်တစ်ခု ဖွင့်ပါ။</translation>
+<translation id="5039020240289137291">ပြင်ပအဖွဲ့အစည်း၏ ကွတ်ကီးများကို ပိတ်ခြင်း</translation>
 <translation id="5039804452771397117">ခွင့်ပြုရန်</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Google Drive တပ်ဆင်မည်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
index 34c330f..9d4f381 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Colar e ir</translation>
 <translation id="292639812446257861">Marcar como não lidas</translation>
 <translation id="2958718410589002129">Palavras-passe</translation>
+<translation id="2964349545761222050">Bloquear cookies de terceiros</translation>
 <translation id="2969979262385602596">Falha ao iniciar sessão. Tente nov. mais tarde.</translation>
 <translation id="298306318844797842">Adicionar método de pagamento…</translation>
 <translation id="2989805286512600854">Abrir num Novo Separador</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Inicie sessão com a sua Conta Google para aceder aos marcadores, às palavras-passe, ao histórico e a outras definições em todos os dispositivos</translation>
 <translation id="5005498671520578047">Copiar palavra-passe</translation>
 <translation id="5010803260590204777">Abra um separador de navegação anónima para navegar na Web de forma privada.</translation>
+<translation id="5039020240289137291">Bloquear cookies de terceiros</translation>
 <translation id="5039804452771397117">Permitir</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Instalar o Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index f130552..a049e81 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Inserează și accesează</translation>
 <translation id="292639812446257861">Marchează ca necitite</translation>
 <translation id="2958718410589002129">Parole</translation>
+<translation id="2964349545761222050">Blochează cookie-urile terță parte</translation>
 <translation id="2969979262385602596">Nu te-ai conectat. Încearcă din nou mai târziu.</translation>
 <translation id="298306318844797842">Adaugă o metodă de plată...</translation>
 <translation id="2989805286512600854">Deschideți într-o filă nouă</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Conectează-te folosind Contul Google pentru a accesa marcajele, parolele, istoricul și alte setări pe toate dispozitivele</translation>
 <translation id="5005498671520578047">Copiază parola</translation>
 <translation id="5010803260590204777">Deschide o filă incognito pentru a naviga privat pe web.</translation>
+<translation id="5039020240289137291">Blocarea cookie-urilor terță parte</translation>
 <translation id="5039804452771397117">Permite</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Instalează Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 22fef34..14c717a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Вставить и перейти</translation>
 <translation id="292639812446257861">Отметить как непрочитанное</translation>
 <translation id="2958718410589002129">Пароли</translation>
+<translation id="2964349545761222050">Блокировать сторонние файлы cookie</translation>
 <translation id="2969979262385602596">Не удалось войти в аккаунт. Повторите попытку.</translation>
 <translation id="298306318844797842">Добавить способ оплаты</translation>
 <translation id="2989805286512600854">Открыть в новой вкладке</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Войдите в аккаунт Google, чтобы пользоваться своими закладками, паролями, историей и другими настройками на любом устройстве</translation>
 <translation id="5005498671520578047">Для копирования пароля</translation>
 <translation id="5010803260590204777">Чтобы просматривать веб-страницы, не оставляя следов, откройте вкладку инкогнито.</translation>
+<translation id="5039020240289137291">Блокировать сторонние файлы cookie</translation>
 <translation id="5039804452771397117">Разрешить</translation>
 <translation id="5059136629401106827">ОК</translation>
 <translation id="5062321486222145940">Установить Google Диск</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 656d04f9..466bf95 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Prilepiť a prejsť</translation>
 <translation id="292639812446257861">Označiť ako neprečítané</translation>
 <translation id="2958718410589002129">Heslá</translation>
+<translation id="2964349545761222050">Blokovať súbory cookie tretích strán</translation>
 <translation id="2969979262385602596">Prihlásenie zlyhalo. Skúste to znova neskôr.</translation>
 <translation id="298306318844797842">Pridať spôsob platby…</translation>
 <translation id="2989805286512600854">Otvoriť na novej karte</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Prihláste sa účtom Google a používajte svoje záložky, heslá, históriu a ďalšie nastavenia vo všetkých svojich zariadeniach</translation>
 <translation id="5005498671520578047">Kopírovanie hesla</translation>
 <translation id="5010803260590204777">Otvorte kartu inkognito a prehliadajte web v súkromí.</translation>
+<translation id="5039020240289137291">Blokovanie súborov cookie tretej strany</translation>
 <translation id="5039804452771397117">Povoliť</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Nainštalovať Disk Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
index 854df0f..b27448f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Ngjit dhe vazhdo</translation>
 <translation id="292639812446257861">Shëno si të palexuara</translation>
 <translation id="2958718410589002129">Fjalëkalimet</translation>
+<translation id="2964349545761222050">Blloko kukit e palëve të treta</translation>
 <translation id="2969979262385602596">Nuk mund të identifikohej. Provo përsëri.</translation>
 <translation id="298306318844797842">Shto mënyrën e pagesës...</translation>
 <translation id="2989805286512600854">Hape në skedë të re</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Identifikohu me llogarinë e Google për të marrë faqeshënuesit, fjalëkalimet, historikun dhe cilësime të tjera në të gjitha pajisjet e tua.</translation>
 <translation id="5005498671520578047">Kopjo fjalëkalimin</translation>
 <translation id="5010803260590204777">Hap një skedë "të fshehtë" për të shfletuar uebin privatisht.</translation>
+<translation id="5039020240289137291">Bllokimi i kukive të palëve të treta</translation>
 <translation id="5039804452771397117">Lejo</translation>
 <translation id="5059136629401106827">Në rregull</translation>
 <translation id="5062321486222145940">Instalo "Diskun e Google"</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 9ef2617c7..0691fb8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Klistra in och öppna</translation>
 <translation id="292639812446257861">Markera som oläst</translation>
 <translation id="2958718410589002129">Lösenord</translation>
+<translation id="2964349545761222050">Blockera cookies från tredje part</translation>
 <translation id="2969979262385602596">Det gick inte att logga in. Försök igen senare.</translation>
 <translation id="298306318844797842">Lägg till betalningsmetod …</translation>
 <translation id="2989805286512600854">Öppna i ny flik</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Logga in med ditt Google-konto så att du kan använda bokmärken, lösenord, historik med mera på alla dina enheter</translation>
 <translation id="5005498671520578047">Kopiera lösenord</translation>
 <translation id="5010803260590204777">Öppna en inkognitoflik om du vill surfa privat på webben.</translation>
+<translation id="5039020240289137291">Cookies från tredje part har blockerats</translation>
 <translation id="5039804452771397117">Tillåt</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Installera Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 1eb3f27..73204f4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">วางแล้วไป</translation>
 <translation id="292639812446257861">ทำเครื่องหมายว่ายังไม่ได้อ่าน</translation>
 <translation id="2958718410589002129">รหัสผ่าน</translation>
+<translation id="2964349545761222050">บล็อกคุกกี้ของบุคคลที่สาม</translation>
 <translation id="2969979262385602596">ไม่สามารถลงชื่อเข้าใช้ได้ โปรดลองอีกครั้งในภายหลัง</translation>
 <translation id="298306318844797842">เพิ่มวิธีการชำระเงิน...</translation>
 <translation id="2989805286512600854">เปิดในแท็บใหม่</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">ลงชื่อเข้าใช้บัญชี Google เพื่อรับบุ๊กมาร์ก รหัสผ่าน ประวัติการเข้าชม และการตั้งค่าอื่นๆ บนอุปกรณ์ทั้งหมดของคุณ</translation>
 <translation id="5005498671520578047">คัดลอกรหัสผ่าน</translation>
 <translation id="5010803260590204777">เปิดแท็บที่ไม่ระบุตัวตนเพื่อท่องเว็บในแบบส่วนตัว</translation>
+<translation id="5039020240289137291">การบล็อกคุกกี้ของบุคคลที่สาม</translation>
 <translation id="5039804452771397117">อนุญาต</translation>
 <translation id="5059136629401106827">ตกลง</translation>
 <translation id="5062321486222145940">ติดตั้ง Google ไดรฟ์</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index ccf50f6..69d78ab8c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Yapıştır ve git</translation>
 <translation id="292639812446257861">Okunmadı Olarak İşaretle</translation>
 <translation id="2958718410589002129">Şifreler</translation>
+<translation id="2964349545761222050">Üçüncü Taraf Çerezlerini Engelle</translation>
 <translation id="2969979262385602596">Oturum açılamadı. Daha sonra tekrar deneyin.</translation>
 <translation id="298306318844797842">Ödeme Yöntemi Ekle...</translation>
 <translation id="2989805286512600854">Yeni Sekmede Aç</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Yer işaretleri, şifreler, geçmiş ve diğer ayarlarınıza tüm cihazlarınızdan erişmek için Google Hesabınızla oturum açın.</translation>
 <translation id="5005498671520578047">Şifreyi kopyalayın</translation>
 <translation id="5010803260590204777">Web'e gizli olarak göz atmak için gizli bir sekme açın.</translation>
+<translation id="5039020240289137291">Üçüncü taraf çerezler engelleniyor</translation>
 <translation id="5039804452771397117">İzin ver</translation>
 <translation id="5059136629401106827">Tamam</translation>
 <translation id="5062321486222145940">Google Drive'ı yükle</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index d5d2c13..ad25a55c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Вставити й перейти</translation>
 <translation id="292639812446257861">Позначити як непрочитані</translation>
 <translation id="2958718410589002129">Паролі</translation>
+<translation id="2964349545761222050">Блокувати файли cookie третіх сторін</translation>
 <translation id="2969979262385602596">Не вдалося ввійти. Спробуйте пізніше.</translation>
 <translation id="298306318844797842">Додати спосіб оплати…</translation>
 <translation id="2989805286512600854">Відкрити в новій вкладці</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Увійдіть в обліковий запис Google, щоб мати доступ до закладок, паролів, історії й інших налаштувань на всіх своїх пристроях</translation>
 <translation id="5005498671520578047">Копіювати пароль</translation>
 <translation id="5010803260590204777">Щоб переглядати веб-сторінки конфіденційно відкрийте анонімну вкладку.</translation>
+<translation id="5039020240289137291">Блокування файлів cookie третіх сторін</translation>
 <translation id="5039804452771397117">Дозволити</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Установити Google Диск</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
index cb0763c..9f93c1e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">پیسٹ کریں اور جائیں</translation>
 <translation id="292639812446257861">بغیر پڑھے ہوئے کے بطور نشان زد کریں</translation>
 <translation id="2958718410589002129">پاس ورڈز</translation>
+<translation id="2964349545761222050">فریق ثالث کوکیز کو مسدود کریں</translation>
 <translation id="2969979262385602596">سائن ان کرنے میں ناکام ہوگیا۔ براہ کرم بعد میں دوبارہ کوشش کریں۔</translation>
 <translation id="298306318844797842">ادائیگی کا طریقہ شامل کریں...</translation>
 <translation id="2989805286512600854">نئے ٹیب میں کھولیں</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">‏اپنے سبھی آلات پر اپنے بُک مارکس، پاس ورڈز، سرگزشت اور دیگر ترتیبات حاصل کرنے کیلئے اپنے Google اکاؤنٹ کے ساتھ سائن ان کریں</translation>
 <translation id="5005498671520578047">پاس ورڈ کاپی کریں</translation>
 <translation id="5010803260590204777">ویب کو نجی طور پر براؤز کرنے کیلئے ایک پوشیدگی ٹیب کھولیں۔</translation>
+<translation id="5039020240289137291">فریق ثالث کوکیز کو مسدود کرنا</translation>
 <translation id="5039804452771397117">اجازت دیں</translation>
 <translation id="5059136629401106827">ٹھیک ہے</translation>
 <translation id="5062321486222145940">‏Google Drive انسٹال کریں</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
index cfc40261..dd370cf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Joylash va davom etish</translation>
 <translation id="292639812446257861">O‘qilmagan deb belgilash</translation>
 <translation id="2958718410589002129">Parollar</translation>
+<translation id="2964349545761222050">Tashqi cookie fayllarni bloklash</translation>
 <translation id="2969979262385602596">Hisobga kirib bo‘lmadi. Keyinroq qayta urinib ko‘ring.</translation>
 <translation id="298306318844797842">Toʻlov usulini kiriting</translation>
 <translation id="2989805286512600854">Yangi varaqda ochish</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Xatcho‘plar, tarix, parollar va boshqa sozlamalarni barcha qurilmalaringizda sinxronlash uchun Google hisobingizga kiring.</translation>
 <translation id="5005498671520578047">Parolni nusxalash</translation>
 <translation id="5010803260590204777">Brauzer tarixi saqlanmasligi uchun inkognito tab oching.</translation>
+<translation id="5039020240289137291">Tashqi cookie fayllar bloklanmoqda</translation>
 <translation id="5039804452771397117">Ruxsat berish</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Google Drive’ni o‘rnatish</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index ae9a09d..e196758 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Dán và truy cập</translation>
 <translation id="292639812446257861">Đánh dấu là chưa đọc</translation>
 <translation id="2958718410589002129">Mật khẩu</translation>
+<translation id="2964349545761222050">Chặn cookie của bên thứ ba</translation>
 <translation id="2969979262385602596">Không đăng nhập được. Vui lòng thử lại sau.</translation>
 <translation id="298306318844797842">Thêm phương thức thanh toán...</translation>
 <translation id="2989805286512600854">Mở bằng Tab Mới</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Đăng nhập bằng Tài khoản Google để nhận dấu trang, mật khẩu, lịch sử và các cài đặt khác trên tất cả thiết bị của bạn</translation>
 <translation id="5005498671520578047">Sao chép mật khẩu</translation>
 <translation id="5010803260590204777">Mở tab ẩn danh để duyệt web một cách riêng tư.</translation>
+<translation id="5039020240289137291">Chặn cookie bên thứ ba</translation>
 <translation id="5039804452771397117">Cho phép</translation>
 <translation id="5059136629401106827">OK</translation>
 <translation id="5062321486222145940">Cài đặt Google Drive</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index ae81c5a8..d13b2af 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">粘贴并转到</translation>
 <translation id="292639812446257861">标记为未读</translation>
 <translation id="2958718410589002129">密码</translation>
+<translation id="2964349545761222050">阻止第三方 Cookie</translation>
 <translation id="2969979262385602596">登录失败,请稍后重试。</translation>
 <translation id="298306318844797842">添加付款方式…</translation>
 <translation id="2989805286512600854">在新标签页中打开</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">登录 Google 帐号,即可获取您在任何登录过的设备上的书签、密码、历史记录及其他设置</translation>
 <translation id="5005498671520578047">复制密码</translation>
 <translation id="5010803260590204777">打开一个隐身标签页即可私密地浏览网络。</translation>
+<translation id="5039020240289137291">阻止第三方 Cookie</translation>
 <translation id="5039804452771397117">允许</translation>
 <translation id="5059136629401106827">知道了</translation>
 <translation id="5062321486222145940">安装Google云端硬盘</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index a084c14..f3daa7c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">貼上並前往</translation>
 <translation id="292639812446257861">標示為未閱讀</translation>
 <translation id="2958718410589002129">密碼</translation>
+<translation id="2964349545761222050">封鎖第三方 Cookie</translation>
 <translation id="2969979262385602596">無法登入,請稍後再試。</translation>
 <translation id="298306318844797842">新增付款方法…</translation>
 <translation id="2989805286512600854">在新分頁中開啟</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">登入 Google 帳戶後,您即可在任何裝置上存取自己的書籤、密碼、記錄和其他設定</translation>
 <translation id="5005498671520578047">複製密碼</translation>
 <translation id="5010803260590204777">透過新開啟的無痕式分頁以私密模式瀏覽網頁。</translation>
+<translation id="5039020240289137291">正在封鎖第三方 Cookie</translation>
 <translation id="5039804452771397117">允許</translation>
 <translation id="5059136629401106827">確定</translation>
 <translation id="5062321486222145940">安裝 Google 雲端硬碟</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 7ac48ac..4ab9989e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">貼上並前往</translation>
 <translation id="292639812446257861">標示為未讀取</translation>
 <translation id="2958718410589002129">密碼</translation>
+<translation id="2964349545761222050">封鎖第三方 Cookie</translation>
 <translation id="2969979262385602596">無法登入,請稍後再試。</translation>
 <translation id="298306318844797842">新增付款方式...</translation>
 <translation id="2989805286512600854">在新分頁中開啟</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">只要登入 Google 帳戶,即可在你的所有裝置上使用自己的書籤、密碼、歷史記錄和其他設定。</translation>
 <translation id="5005498671520578047">複製密碼</translation>
 <translation id="5010803260590204777">透過新開啟的無痕式分頁以私密模式瀏覽網頁。</translation>
+<translation id="5039020240289137291">封鎖第三方 Cookie</translation>
 <translation id="5039804452771397117">允許</translation>
 <translation id="5059136629401106827">確定</translation>
 <translation id="5062321486222145940">安裝 Google 雲端硬碟</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
index 27c3459..88d2397c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -161,6 +161,7 @@
 <translation id="2923448633003185837">Namathisela uphinde uhambe</translation>
 <translation id="292639812446257861">Maka njengokungafundiwe</translation>
 <translation id="2958718410589002129">Amaphasiwedi</translation>
+<translation id="2964349545761222050">Vimba Amakhukhi Enkampani Yangaphandle</translation>
 <translation id="2969979262385602596">Yehlulekile ukungena ngemvume. Sicela uzame futhi emuva kwesikhathi.</translation>
 <translation id="298306318844797842">Engeza indlela yokukhokha...</translation>
 <translation id="2989805286512600854">Vula kuthebhu entsha</translation>
@@ -304,6 +305,7 @@
 <translation id="4979397965658815378">Ngena ngemvume nge-akhawunti yakho ye-Google ukuze uthole amabhukhimakhi, amaphasiwedi, umlando nezinye izilungiselelo kuwo wonke amadivayisi akho</translation>
 <translation id="5005498671520578047">Kopisha iphasiwedi</translation>
 <translation id="5010803260590204777">Vula i ithebhu ye-incognito ukuze uphequlule iwebhu ngokuyimfihlo.</translation>
+<translation id="5039020240289137291">Ukuvimba amakhukhi wenkampani yangaphandle</translation>
 <translation id="5039804452771397117">Vumela</translation>
 <translation id="5059136629401106827">KULUNGILE</translation>
 <translation id="5062321486222145940">Faka ku-Google Drayivu</translation>
diff --git a/ios/chrome/browser/policy/policy_unittest.mm b/ios/chrome/browser/policy/policy_unittest.mm
index 752e744..7d70f0b2 100644
--- a/ios/chrome/browser/policy/policy_unittest.mm
+++ b/ios/chrome/browser/policy/policy_unittest.mm
@@ -83,6 +83,29 @@
         browser_policy_connector_.get());
   }
 
+  void VerifyBooleanPolicy(const std::string& policyKey,
+                           const std::string& prefPath) {
+    // This preference is currently not managed
+    EXPECT_FALSE(pref_service_->IsManagedPreference(prefPath));
+
+    policy::PolicyMap values;
+    // Setting the policy to true should set the pref to true.
+    values.Set(policyKey, policy::POLICY_LEVEL_MANDATORY,
+               policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_PLATFORM,
+               std::make_unique<base::Value>(true), nullptr);
+    policy_provider_.UpdateChromePolicy(values);
+    EXPECT_TRUE(pref_service_->IsManagedPreference(prefPath));
+    EXPECT_TRUE(pref_service_->GetBoolean(prefPath));
+
+    // Setting the policy to false should set the pref to false.
+    values.Set(policyKey, policy::POLICY_LEVEL_MANDATORY,
+               policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_PLATFORM,
+               std::make_unique<base::Value>(false), nullptr);
+    policy_provider_.UpdateChromePolicy(values);
+    EXPECT_TRUE(pref_service_->IsManagedPreference(prefPath));
+    EXPECT_FALSE(pref_service_->GetBoolean(prefPath));
+  }
+
  protected:
   // Temporary directory to hold preference files.
   base::ScopedTempDir state_directory_;
@@ -112,53 +135,13 @@
 // Tests that the SearchSuggestEnabled preference is correctly managed by
 // policy.
 TEST_F(PolicyTest, TestSearchSuggestEnabled) {
-  EXPECT_FALSE(
-      pref_service_->IsManagedPreference(prefs::kSearchSuggestEnabled));
-
-  policy::PolicyMap values;
-  values.Set(policy::key::kSearchSuggestEnabled, policy::POLICY_LEVEL_MANDATORY,
-             policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_PLATFORM,
-             std::make_unique<base::Value>(true), nullptr);
-  policy_provider_.UpdateChromePolicy(values);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(pref_service_->IsManagedPreference(prefs::kSearchSuggestEnabled));
-  EXPECT_TRUE(pref_service_->GetBoolean(prefs::kSearchSuggestEnabled));
-
-  values.Set(policy::key::kSearchSuggestEnabled, policy::POLICY_LEVEL_MANDATORY,
-             policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_PLATFORM,
-             std::make_unique<base::Value>(false), nullptr);
-  policy_provider_.UpdateChromePolicy(values);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(pref_service_->IsManagedPreference(prefs::kSearchSuggestEnabled));
-  EXPECT_FALSE(pref_service_->GetBoolean(prefs::kSearchSuggestEnabled));
+  VerifyBooleanPolicy(policy::key::kSearchSuggestEnabled,
+                      prefs::kSearchSuggestEnabled);
 }
 
 // Tests that the PasswordManagerEnabled preference is correctly managed by
 // policy.
 TEST_F(PolicyTest, TestPasswordManagerEnabled) {
-  EXPECT_FALSE(pref_service_->IsManagedPreference(
-      password_manager::prefs::kCredentialsEnableService));
-
-  policy::PolicyMap values;
-  // Setting the policy to true should set the pref to true.
-  values.Set(policy::key::kPasswordManagerEnabled,
-             policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_MACHINE,
-             policy::POLICY_SOURCE_PLATFORM,
-             std::make_unique<base::Value>(true), nullptr);
-  policy_provider_.UpdateChromePolicy(values);
-  EXPECT_TRUE(pref_service_->IsManagedPreference(
-      password_manager::prefs::kCredentialsEnableService));
-  EXPECT_TRUE(pref_service_->GetBoolean(
-      password_manager::prefs::kCredentialsEnableService));
-
-  // Setting the policy to false should set the pref to false.
-  values.Set(policy::key::kPasswordManagerEnabled,
-             policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_MACHINE,
-             policy::POLICY_SOURCE_PLATFORM,
-             std::make_unique<base::Value>(false), nullptr);
-  policy_provider_.UpdateChromePolicy(values);
-  EXPECT_TRUE(pref_service_->IsManagedPreference(
-      password_manager::prefs::kCredentialsEnableService));
-  EXPECT_FALSE(pref_service_->GetBoolean(
-      password_manager::prefs::kCredentialsEnableService));
+  VerifyBooleanPolicy(policy::key::kPasswordManagerEnabled,
+                      password_manager::prefs::kCredentialsEnableService);
 }
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn
index 1a01d30..7d2c9e6 100644
--- a/ios/third_party/material_components_ios/BUILD.gn
+++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -167,6 +167,7 @@
   "src/components/Dialogs/src/ColorThemer/MDCAlertColorThemer.h",
   "src/components/Dialogs/src/ColorThemer/MaterialDialogs+ColorThemer.h",
   "src/components/Dialogs/src/MDCAlertController+ButtonForAction.h",
+  "src/components/Dialogs/src/MDCAlertController+Customize.h",
   "src/components/Dialogs/src/MDCAlertController.h",
   "src/components/Dialogs/src/MDCAlertControllerDelegate.h",
   "src/components/Dialogs/src/MDCAlertControllerView.h",
@@ -181,7 +182,6 @@
   "src/components/Dialogs/src/TypographyThemer/MaterialDialogs+TypographyThemer.h",
   "src/components/Dialogs/src/UIViewController+MaterialDialogs.h",
   "src/components/Dialogs/src/private/MDCAlertActionManager.h",
-  "src/components/Dialogs/src/private/MDCAlertController+Customize.h",
   "src/components/Dialogs/src/private/MDCAlertControllerView+Private.h",
   "src/components/Dialogs/src/private/MDCDialogShadowedView.h",
   "src/components/Dialogs/src/private/MaterialDialogsStrings.h",
@@ -930,6 +930,7 @@
   "src/components/Dialogs/src/ColorThemer/MaterialDialogs+ColorThemer.h",
   "src/components/Dialogs/src/MDCAlertController+ButtonForAction.h",
   "src/components/Dialogs/src/MDCAlertController+ButtonForAction.m",
+  "src/components/Dialogs/src/MDCAlertController+Customize.h",
   "src/components/Dialogs/src/MDCAlertController.h",
   "src/components/Dialogs/src/MDCAlertController.m",
   "src/components/Dialogs/src/MDCAlertControllerDelegate.h",
@@ -952,7 +953,6 @@
   "src/components/Dialogs/src/UIViewController+MaterialDialogs.m",
   "src/components/Dialogs/src/private/MDCAlertActionManager.h",
   "src/components/Dialogs/src/private/MDCAlertActionManager.m",
-  "src/components/Dialogs/src/private/MDCAlertController+Customize.h",
   "src/components/Dialogs/src/private/MDCAlertControllerView+Private.h",
   "src/components/Dialogs/src/private/MDCAlertControllerView+Private.m",
   "src/components/Dialogs/src/private/MDCDialogShadowedView.h",
diff --git a/ios/third_party/webkit/BUILD.gn b/ios/third_party/webkit/BUILD.gn
index 4098f28..f225a02a 100644
--- a/ios/third_party/webkit/BUILD.gn
+++ b/ios/third_party/webkit/BUILD.gn
@@ -36,7 +36,7 @@
     action(target_name) {
       visibility = [
         ":bundle_webkit_ios_frameworks",
-        ":zip_webkit_mac_minibrowser",
+        ":copy_webkit_mac_minibrowser",
         ":webkit",
       ]
 
@@ -107,20 +107,8 @@
     ]
   }
 
-  _webkit_mac_minibrowser_files = [
-    "$_webkit_mac_out_product_dir/MiniBrowser.app/Contents/MacOS/MiniBrowser",
-    "$_webkit_mac_out_product_dir/MiniBrowser.app/Contents/_CodeSignature/CodeResources",
-    "$_webkit_mac_out_product_dir/MiniBrowser.app/Contents/Frameworks/libclang_rt.asan_osx_dynamic.dylib",
-    "$_webkit_mac_out_product_dir/MiniBrowser.app/Contents/Info.plist",
-    "$_webkit_mac_out_product_dir/MiniBrowser.app/Contents/PkgInfo",
-    "$_webkit_mac_out_product_dir/MiniBrowser.app/Contents/Resources/BrowserWindow.nib",
-    "$_webkit_mac_out_product_dir/MiniBrowser.app/Contents/Resources/ExtensionManagerWindowController.nib",
-    "$_webkit_mac_out_product_dir/MiniBrowser.app/Contents/Resources/MainMenu.nib",
-    "$_webkit_mac_out_product_dir/WebKitTestRunner",
-  ]
-
   compile_webkit("compile_webkit_mac_minibrowser") {
-    outputs = _webkit_mac_minibrowser_files
+    outputs = [ "$_webkit_mac_out_product_dir" ]
     args = [
       "--asan",
       "--output_dir",
@@ -145,11 +133,10 @@
         [ "{{bundle_contents_dir}}/WebKitFrameworks/{{source_file_part}}" ]
   }
 
-  zip("zip_webkit_mac_minibrowser") {
+  copy("copy_webkit_mac_minibrowser") {
+    sources = [ "$_webkit_mac_out_product_dir" ]
+    outputs = [ "$root_out_dir/WebKitMacOS" ]
     public_deps = [ ":compile_webkit_mac_minibrowser" ]
-    inputs = _webkit_mac_minibrowser_files
-    output = "$root_out_dir/WebKitMacOS.zip"
-    base_dir = "$_webkit_mac_out_product_dir"
   }
 }
 
diff --git a/media/audio/fuchsia/audio_manager_fuchsia.cc b/media/audio/fuchsia/audio_manager_fuchsia.cc
index 1644891..587cb91 100644
--- a/media/audio/fuchsia/audio_manager_fuchsia.cc
+++ b/media/audio/fuchsia/audio_manager_fuchsia.cc
@@ -46,12 +46,20 @@
 AudioParameters AudioManagerFuchsia::GetInputStreamParameters(
     const std::string& device_id) {
   // TODO(crbug.com/852834): Fuchsia currently doesn't provide an API to get
-  // device configuration. Update this method when that functionality is
-  // implemented.
+  // device configuration and supported effects. Update this method when that
+  // functionality is implemented.
+  //
   // Use 16kHz sample rate with 10ms buffer, which is consistent with
   // the default configuration used in the AudioCapturer implementation.
-  return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
+  // Assume that the system-provided AudioConsumer supports echo cancellation,
+  // noise suppression and automatic gain control.
+  AudioParameters params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
                          CHANNEL_LAYOUT_MONO, 16000, 160);
+  params.set_effects(AudioParameters::ECHO_CANCELLER |
+                     AudioParameters::NOISE_SUPPRESSION |
+                     AudioParameters::AUTOMATIC_GAIN_CONTROL);
+
+  return params;
 }
 
 AudioParameters AudioManagerFuchsia::GetPreferredOutputStreamParameters(
diff --git a/media/fuchsia/audio/fuchsia_audio_capturer_source.cc b/media/fuchsia/audio/fuchsia_audio_capturer_source.cc
index 40800a5..38ec5412 100644
--- a/media/fuchsia/audio/fuchsia_audio_capturer_source.cc
+++ b/media/fuchsia/audio/fuchsia_audio_capturer_source.cc
@@ -69,6 +69,9 @@
   capturer_.events().OnPacketProduced =
       fit::bind_member(this, &FuchsiaAudioCapturerSource::OnPacketCaptured);
 
+  // TODO(crbug.com/1065207): Enable/disable stream processing based on
+  // |params.effects()| when support is added to fuchsia.media.AudioCapturer.
+
   // Configure stream format.
   fuchsia::media::AudioStreamType stream_type;
   stream_type.sample_format = fuchsia::media::AudioSampleFormat::FLOAT;
diff --git a/media/mojo/clients/BUILD.gn b/media/mojo/clients/BUILD.gn
index cc317fbc..68fd43a 100644
--- a/media/mojo/clients/BUILD.gn
+++ b/media/mojo/clients/BUILD.gn
@@ -14,7 +14,7 @@
 
     "//content/renderer:*",
 
-    # TODO(xhwang): Only allow //media/mojo/services:media_service_unittests
+    # TODO(xhwang): Only allow //media/mojo/services:unit_tests
     "//media/mojo/services:*",
 
     "//media/mojo:test_support",
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn
index ab75c51..89d10b7 100644
--- a/media/mojo/services/BUILD.gn
+++ b/media/mojo/services/BUILD.gn
@@ -161,6 +161,7 @@
   sources = [
     "deferred_destroy_unique_receiver_set_unittest.cc",
     "media_metrics_provider_unittest.cc",
+    "media_service_unittest.cc",
     "mojo_audio_input_stream_unittest.cc",
     "mojo_audio_output_stream_provider_unittest.cc",
     "mojo_audio_output_stream_unittest.cc",
@@ -173,21 +174,29 @@
   ]
 
   deps = [
+    ":services",
     "//base",
     "//base/test:test_support",
     "//components/ukm:test_support",
     "//media:test_support",
+    "//media/cdm:cdm_paths",
     "//media/learning/common",
     "//media/mojo:test_support",
+    "//media/mojo/clients",
+    "//media/mojo/common",
+    "//media/mojo/mojom",
     "//mojo/core/embedder",
     "//mojo/public/interfaces/bindings/tests:test_interfaces",
     "//services/metrics/public/cpp:ukm_builders",
+    "//services/service_manager/public/cpp",
+    "//services/service_manager/public/cpp/test:test_support",
     "//testing/gmock",
     "//testing/gtest",
   ]
 
   if (enable_library_cdms) {
     sources += [
+      "cdm_service_unittest.cc",
       "mojo_cdm_allocator_unittest.cc",
       "mojo_cdm_file_io_unittest.cc",
       "mojo_cdm_helper_unittest.cc",
@@ -206,29 +215,3 @@
     ]
   }
 }
-
-test("media_service_unittests") {
-  testonly = true
-
-  sources = [ "media_service_unittest.cc" ]
-
-  if (enable_library_cdms) {
-    sources += [ "cdm_service_unittest.cc" ]
-  }
-
-  deps = [
-    ":services",
-    "//base",
-    "//base/test:test_support",
-    "//media:test_support",
-    "//media/cdm:cdm_paths",
-    "//media/mojo/clients",
-    "//media/mojo/common",
-    "//media/mojo/mojom",
-    "//mojo/core/test:run_all_unittests",
-    "//services/service_manager/public/cpp",
-    "//services/service_manager/public/cpp/test:test_support",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-}
diff --git a/media/mojo/services/media_service_unittest.cc b/media/mojo/services/media_service_unittest.cc
index d974e00..a0852d6b6 100644
--- a/media/mojo/services/media_service_unittest.cc
+++ b/media/mojo/services/media_service_unittest.cc
@@ -121,11 +121,9 @@
   base::PostTask(FROM_HERE, run_loop->QuitClosure());
 }
 
-// Tests MediaService built into a standalone mojo service binary (see
-// ServiceMain() in main.cc) where MediaService uses TestMojoMediaClient.
-// TestMojoMediaClient supports CDM creation using DefaultCdmFactory (only
-// supports Clear Key key system), and Renderer creation using
-// DefaultRendererFactory that always create media::RendererImpl.
+// Tests MediaService using TestMojoMediaClient, which supports CDM creation
+// using DefaultCdmFactory (only supports Clear Key key system), and Renderer
+// creation using DefaultRendererFactory that always create media::RendererImpl.
 class MediaServiceTest : public testing::Test {
  public:
   MediaServiceTest()
diff --git a/media/renderers/BUILD.gn b/media/renderers/BUILD.gn
index 8e32a8f2..f18dedf 100644
--- a/media/renderers/BUILD.gn
+++ b/media/renderers/BUILD.gn
@@ -32,6 +32,8 @@
     "video_renderer_impl.h",
     "video_resource_updater.cc",
     "video_resource_updater.h",
+    "yuv_util.cc",
+    "yuv_util.h",
   ]
 
   deps = [
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc
index 0fdd0de..298ecc1 100644
--- a/media/renderers/paint_canvas_video_renderer.cc
+++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -32,6 +32,7 @@
 #include "gpu/command_buffer/common/shared_image_usage.h"
 #include "media/base/data_buffer.h"
 #include "media/base/video_frame.h"
+#include "media/renderers/yuv_util.h"
 #include "third_party/libyuv/include/libyuv.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkImageGenerator.h"
@@ -147,32 +148,6 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(SyncTokenClientImpl);
 };
 
-sk_sp<SkImage> YUVGrBackendTexturesToSkImage(
-    GrContext* gr_context,
-    gfx::ColorSpace video_color_space,
-    VideoPixelFormat video_format,
-    GrBackendTexture* yuv_textures,
-    const GrBackendTexture& result_texture) {
-  // TODO(hubbe): This should really default to rec709.
-  // https://crbug.com/828599
-  SkYUVColorSpace color_space = kRec601_SkYUVColorSpace;
-  video_color_space.ToSkYUVColorSpace(&color_space);
-
-  switch (video_format) {
-    case PIXEL_FORMAT_NV12:
-      return SkImage::MakeFromNV12TexturesCopyWithExternalBackend(
-          gr_context, color_space, yuv_textures, kTopLeft_GrSurfaceOrigin,
-          result_texture);
-    case PIXEL_FORMAT_I420:
-      return SkImage::MakeFromYUVTexturesCopyWithExternalBackend(
-          gr_context, color_space, yuv_textures, kTopLeft_GrSurfaceOrigin,
-          result_texture);
-    default:
-      NOTREACHED();
-      return nullptr;
-  }
-}
-
 // Helper class that begins/ends access to a mailbox within a scope. The mailbox
 // must have been imported into |texture|.
 class ScopedSharedImageAccess {
@@ -242,108 +217,6 @@
   return ri->CreateAndConsumeForGpuRaster(mailbox);
 }
 
-static constexpr size_t kNumYUVPlanes = 3;
-struct YUVPlaneTextureInfo {
-  GrGLTextureInfo texture = {0, 0};
-  bool is_shared_image = false;
-};
-using YUVTexturesInfo = std::array<YUVPlaneTextureInfo, kNumYUVPlanes>;
-
-YUVTexturesInfo GetYUVTexturesInfo(
-    const VideoFrame* video_frame,
-    viz::RasterContextProvider* raster_context_provider) {
-  YUVTexturesInfo yuv_textures_info;
-
-  gpu::raster::RasterInterface* ri = raster_context_provider->RasterInterface();
-  DCHECK(ri);
-  // TODO(bsalomon): Use GL_RGB8 once Skia supports it.
-  // skbug.com/7533
-  GrGLenum skia_texture_format =
-      video_frame->format() == PIXEL_FORMAT_NV12 ? GL_RGBA8 : GL_R8_EXT;
-  for (size_t i = 0; i < video_frame->NumTextures(); ++i) {
-    // Get the texture from the mailbox and wrap it in a GrTexture.
-    const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(i);
-    DCHECK(mailbox_holder.texture_target == GL_TEXTURE_2D ||
-           mailbox_holder.texture_target == GL_TEXTURE_EXTERNAL_OES ||
-           mailbox_holder.texture_target == GL_TEXTURE_RECTANGLE_ARB)
-        << "Unsupported texture target " << std::hex << std::showbase
-        << mailbox_holder.texture_target;
-    yuv_textures_info[i].texture.fID = SynchronizeAndImportMailbox(
-        ri, mailbox_holder.sync_token, mailbox_holder.mailbox);
-    if (mailbox_holder.mailbox.IsSharedImage()) {
-      yuv_textures_info[i].is_shared_image = true;
-      ri->BeginSharedImageAccessDirectCHROMIUM(
-          yuv_textures_info[i].texture.fID,
-          GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM);
-    }
-
-    yuv_textures_info[i].texture.fTarget = mailbox_holder.texture_target;
-    yuv_textures_info[i].texture.fFormat = skia_texture_format;
-  }
-
-  return yuv_textures_info;
-}
-
-void DeleteYUVTextures(const VideoFrame* video_frame,
-                       viz::RasterContextProvider* raster_context_provider,
-                       const YUVTexturesInfo& yuv_textures_info) {
-  gpu::raster::RasterInterface* ri = raster_context_provider->RasterInterface();
-  DCHECK(ri);
-
-  for (size_t i = 0; i < video_frame->NumTextures(); ++i) {
-    if (yuv_textures_info[i].is_shared_image)
-      ri->EndSharedImageAccessDirectCHROMIUM(yuv_textures_info[i].texture.fID);
-    ri->DeleteGpuRasterTexture(yuv_textures_info[i].texture.fID);
-  }
-}
-
-sk_sp<SkImage> NewSkImageFromVideoFrameYUVTexturesWithExternalBackend(
-    const VideoFrame* video_frame,
-    viz::RasterContextProvider* raster_context_provider,
-    unsigned int texture_target,
-    unsigned int texture_id) {
-  DCHECK(video_frame->HasTextures());
-  GrContext* gr_context = raster_context_provider->GrContext();
-  DCHECK(gr_context);
-  // TODO: We should compare the DCHECK vs when UpdateLastImage calls this
-  // function. (https://crbug.com/674185)
-  DCHECK(video_frame->format() == PIXEL_FORMAT_I420 ||
-         video_frame->format() == PIXEL_FORMAT_NV12);
-
-  gfx::Size ya_tex_size = video_frame->coded_size();
-  gfx::Size uv_tex_size((ya_tex_size.width() + 1) / 2,
-                        (ya_tex_size.height() + 1) / 2);
-
-  GrGLTextureInfo backend_texture{};
-
-  YUVTexturesInfo yuv_textures_info =
-      GetYUVTexturesInfo(video_frame, raster_context_provider);
-
-  GrBackendTexture yuv_textures[3] = {
-      GrBackendTexture(ya_tex_size.width(), ya_tex_size.height(),
-                       GrMipMapped::kNo, yuv_textures_info[0].texture),
-      GrBackendTexture(uv_tex_size.width(), uv_tex_size.height(),
-                       GrMipMapped::kNo, yuv_textures_info[1].texture),
-      GrBackendTexture(uv_tex_size.width(), uv_tex_size.height(),
-                       GrMipMapped::kNo, yuv_textures_info[2].texture),
-  };
-  backend_texture.fID = texture_id;
-  backend_texture.fTarget = texture_target;
-  backend_texture.fFormat = GL_RGBA8;
-  GrBackendTexture result_texture(video_frame->coded_size().width(),
-                                  video_frame->coded_size().height(),
-                                  GrMipMapped::kNo, backend_texture);
-
-  sk_sp<SkImage> img = YUVGrBackendTexturesToSkImage(
-      gr_context, video_frame->ColorSpace(), video_frame->format(),
-      yuv_textures, result_texture);
-  gr_context->flush();
-
-  DeleteYUVTextures(video_frame, raster_context_provider, yuv_textures_info);
-
-  return img;
-}
-
 const gpu::MailboxHolder& GetVideoFrameMailboxHolder(VideoFrame* video_frame) {
   DCHECK(video_frame->HasTextures());
   DCHECK_EQ(video_frame->NumTextures(), 1u);
diff --git a/media/renderers/yuv_util.cc b/media/renderers/yuv_util.cc
new file mode 100644
index 0000000..b8f70ee62
--- /dev/null
+++ b/media/renderers/yuv_util.cc
@@ -0,0 +1,162 @@
+// Copyright (c) 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 "media/renderers/yuv_util.h"
+
+#include <GLES3/gl3.h>
+
+#include "components/viz/common/gpu/raster_context_provider.h"
+#include "gpu/GLES2/gl2extchromium.h"
+#include "gpu/command_buffer/client/raster_interface.h"
+#include "media/base/video_frame.h"
+#include "third_party/skia/include/core/SkImage.h"
+#include "third_party/skia/include/gpu/GrContext.h"
+
+namespace media {
+
+namespace {
+
+static constexpr size_t kNumYUVPlanes = 3;
+struct YUVPlaneTextureInfo {
+  GrGLTextureInfo texture = {0, 0};
+  bool is_shared_image = false;
+};
+using YUVTexturesInfo = std::array<YUVPlaneTextureInfo, kNumYUVPlanes>;
+
+YUVTexturesInfo GetYUVTexturesInfo(
+    const VideoFrame* video_frame,
+    viz::RasterContextProvider* raster_context_provider) {
+  YUVTexturesInfo yuv_textures_info;
+
+  gpu::raster::RasterInterface* ri = raster_context_provider->RasterInterface();
+  DCHECK(ri);
+  // TODO(bsalomon): Use GL_RGB8 once Skia supports it.
+  // skbug.com/7533
+  GrGLenum skia_texture_format =
+      video_frame->format() == PIXEL_FORMAT_NV12 ? GL_RGBA8 : GL_R8_EXT;
+  for (size_t i = 0; i < video_frame->NumTextures(); ++i) {
+    // Get the texture from the mailbox and wrap it in a GrTexture.
+    const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(i);
+    DCHECK(mailbox_holder.texture_target == GL_TEXTURE_2D ||
+           mailbox_holder.texture_target == GL_TEXTURE_EXTERNAL_OES ||
+           mailbox_holder.texture_target == GL_TEXTURE_RECTANGLE_ARB)
+        << "Unsupported texture target " << std::hex << std::showbase
+        << mailbox_holder.texture_target;
+    ri->WaitSyncTokenCHROMIUM(mailbox_holder.sync_token.GetConstData());
+    yuv_textures_info[i].texture.fID =
+        ri->CreateAndConsumeForGpuRaster(mailbox_holder.mailbox);
+    if (mailbox_holder.mailbox.IsSharedImage()) {
+      yuv_textures_info[i].is_shared_image = true;
+      ri->BeginSharedImageAccessDirectCHROMIUM(
+          yuv_textures_info[i].texture.fID,
+          GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM);
+    }
+
+    yuv_textures_info[i].texture.fTarget = mailbox_holder.texture_target;
+    yuv_textures_info[i].texture.fFormat = skia_texture_format;
+  }
+
+  return yuv_textures_info;
+}
+
+void DeleteYUVTextures(const VideoFrame* video_frame,
+                       viz::RasterContextProvider* raster_context_provider,
+                       const YUVTexturesInfo& yuv_textures_info) {
+  gpu::raster::RasterInterface* ri = raster_context_provider->RasterInterface();
+  DCHECK(ri);
+
+  for (size_t i = 0; i < video_frame->NumTextures(); ++i) {
+    if (yuv_textures_info[i].is_shared_image)
+      ri->EndSharedImageAccessDirectCHROMIUM(yuv_textures_info[i].texture.fID);
+    ri->DeleteGpuRasterTexture(yuv_textures_info[i].texture.fID);
+  }
+}
+
+}  // namespace
+
+void ConvertFromVideoFrameYUVTextures(
+    const VideoFrame* video_frame,
+    viz::RasterContextProvider* raster_context_provider,
+    unsigned int texture_out_target,
+    unsigned int texture_out_id) {
+  // Let the SkImage fall out of scope and track the result texture using
+  // texture_out_id.
+  NewSkImageFromVideoFrameYUVTexturesWithExternalBackend(
+      video_frame, raster_context_provider, texture_out_target, texture_out_id);
+}
+
+sk_sp<SkImage> NewSkImageFromVideoFrameYUVTexturesWithExternalBackend(
+    const VideoFrame* video_frame,
+    viz::RasterContextProvider* raster_context_provider,
+    unsigned int texture_target,
+    unsigned int texture_id) {
+  DCHECK(video_frame->HasTextures());
+  GrContext* gr_context = raster_context_provider->GrContext();
+  DCHECK(gr_context);
+  // TODO: We should compare the DCHECK vs when UpdateLastImage calls this
+  // function. (https://crbug.com/674185)
+  DCHECK(video_frame->format() == PIXEL_FORMAT_I420 ||
+         video_frame->format() == PIXEL_FORMAT_NV12);
+
+  gfx::Size ya_tex_size = video_frame->coded_size();
+  gfx::Size uv_tex_size((ya_tex_size.width() + 1) / 2,
+                        (ya_tex_size.height() + 1) / 2);
+
+  GrGLTextureInfo backend_texture{};
+
+  YUVTexturesInfo yuv_textures_info =
+      GetYUVTexturesInfo(video_frame, raster_context_provider);
+
+  GrBackendTexture yuv_textures[3] = {
+      GrBackendTexture(ya_tex_size.width(), ya_tex_size.height(),
+                       GrMipMapped::kNo, yuv_textures_info[0].texture),
+      GrBackendTexture(uv_tex_size.width(), uv_tex_size.height(),
+                       GrMipMapped::kNo, yuv_textures_info[1].texture),
+      GrBackendTexture(uv_tex_size.width(), uv_tex_size.height(),
+                       GrMipMapped::kNo, yuv_textures_info[2].texture),
+  };
+  backend_texture.fID = texture_id;
+  backend_texture.fTarget = texture_target;
+  backend_texture.fFormat = GL_RGBA8;
+  GrBackendTexture result_texture(video_frame->coded_size().width(),
+                                  video_frame->coded_size().height(),
+                                  GrMipMapped::kNo, backend_texture);
+
+  sk_sp<SkImage> img = YUVGrBackendTexturesToSkImage(
+      gr_context, video_frame->ColorSpace(), video_frame->format(),
+      yuv_textures, result_texture);
+  gr_context->flush();
+
+  DeleteYUVTextures(video_frame, raster_context_provider, yuv_textures_info);
+
+  return img;
+}
+
+sk_sp<SkImage> YUVGrBackendTexturesToSkImage(
+    GrContext* gr_context,
+    gfx::ColorSpace video_color_space,
+    VideoPixelFormat video_format,
+    GrBackendTexture* yuv_textures,
+    const GrBackendTexture& result_texture) {
+  // TODO(hubbe): This should really default to rec709.
+  // https://crbug.com/828599
+  SkYUVColorSpace color_space = kRec601_SkYUVColorSpace;
+  video_color_space.ToSkYUVColorSpace(&color_space);
+
+  switch (video_format) {
+    case PIXEL_FORMAT_NV12:
+      return SkImage::MakeFromNV12TexturesCopyWithExternalBackend(
+          gr_context, color_space, yuv_textures, kTopLeft_GrSurfaceOrigin,
+          result_texture);
+    case PIXEL_FORMAT_I420:
+      return SkImage::MakeFromYUVTexturesCopyWithExternalBackend(
+          gr_context, color_space, yuv_textures, kTopLeft_GrSurfaceOrigin,
+          result_texture);
+    default:
+      NOTREACHED();
+      return nullptr;
+  }
+}
+
+}  // namespace media
diff --git a/media/renderers/yuv_util.h b/media/renderers/yuv_util.h
new file mode 100644
index 0000000..6cf2368
--- /dev/null
+++ b/media/renderers/yuv_util.h
@@ -0,0 +1,51 @@
+// Copyright (c) 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 MEDIA_RENDERERS_YUV_UTIL_H_
+#define MEDIA_RENDERERS_YUV_UTIL_H_
+
+#include "media/base/media_export.h"
+#include "media/base/video_types.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
+#include "ui/gfx/color_space.h"
+
+// Skia forward declarations
+class GrBackendTexture;
+class GrContext;
+class SkImage;
+
+namespace viz {
+class RasterContextProvider;
+}  // namespace viz
+
+namespace media {
+
+class VideoFrame;
+
+// Converts a YUV video frame to RGB format and stored the results in the GL
+// texture with ID |texture_out_id|. The caller of this function maintains
+// ownership of the out texture.
+MEDIA_EXPORT void ConvertFromVideoFrameYUVTextures(
+    const VideoFrame* video_frame,
+    viz::RasterContextProvider* raster_context_provider,
+    unsigned int texture_out_target,
+    unsigned int texture_out_id);
+
+MEDIA_EXPORT sk_sp<SkImage>
+NewSkImageFromVideoFrameYUVTexturesWithExternalBackend(
+    const VideoFrame* video_frame,
+    viz::RasterContextProvider* raster_context_provider,
+    unsigned int texture_target,
+    unsigned int texture_id);
+
+MEDIA_EXPORT sk_sp<SkImage> YUVGrBackendTexturesToSkImage(
+    GrContext* gr_context,
+    gfx::ColorSpace video_color_space,
+    VideoPixelFormat video_format,
+    GrBackendTexture* yuv_textures,
+    const GrBackendTexture& result_texture);
+
+}  // namespace media
+
+#endif  // MEDIA_RENDERERS_YUV_UTIL_H_
\ No newline at end of file
diff --git a/mojo/public/cpp/bindings/array_traits_stl.h b/mojo/public/cpp/bindings/array_traits_stl.h
index d579e5c..c72b2a1 100644
--- a/mojo/public/cpp/bindings/array_traits_stl.h
+++ b/mojo/public/cpp/bindings/array_traits_stl.h
@@ -8,6 +8,7 @@
 #include <array>
 #include <map>
 #include <set>
+#include <unordered_set>
 #include <vector>
 
 #include "mojo/public/cpp/bindings/array_traits.h"
diff --git a/mojo/public/cpp/bindings/tests/struct_unittest.cc b/mojo/public/cpp/bindings/tests/struct_unittest.cc
index c6bd169..04cdc65 100644
--- a/mojo/public/cpp/bindings/tests/struct_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/struct_unittest.cc
@@ -525,5 +525,22 @@
   EXPECT_EQ(1, reordered->c);
 }
 
+TEST_F(StructTest, EnumNestedStructTest) {
+  EnumNestedStructPtr enum_nested_struct =
+      EnumNestedStruct::New(EnumNestedStruct::StructEnum::FIRST);
+  EXPECT_EQ(EnumNestedStruct::StructEnum::FIRST,
+            enum_nested_struct->local_enum_state_);
+
+  enum_nested_struct->local_enum_state_ = EnumNestedStruct::StructEnum::SECOND;
+
+  EnumNestedStructPtr expected_output(
+      EnumNestedStruct::New(EnumNestedStruct::StructEnum::SECOND));
+
+  EnumNestedStructPtr output = SerializeAndDeserialize<EnumNestedStructPtr>(
+      std::move(enum_nested_struct));
+  EXPECT_TRUE(output.Equals(expected_output));
+  EXPECT_EQ(EnumNestedStruct::StructEnum::SECOND, output->local_enum_state_);
+}
+
 }  // namespace test
 }  // namespace mojo
diff --git a/mojo/public/interfaces/bindings/tests/test_structs.mojom b/mojo/public/interfaces/bindings/tests/test_structs.mojom
index da550eb..d991208 100644
--- a/mojo/public/interfaces/bindings/tests/test_structs.mojom
+++ b/mojo/public/interfaces/bindings/tests/test_structs.mojom
@@ -414,3 +414,12 @@
 struct SimpleNestedStruct {
   ContainsOther nested;
 };
+
+struct EnumNestedStruct {
+  enum StructEnum {
+    FIRST,
+    SECOND
+  };
+
+  [MinVersion=1] StructEnum local_enum_state_;
+};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl
index 1d6d82c..9210d7b 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl
@@ -64,7 +64,7 @@
   {{kind|cpp_data_view_type}} {{name}}() const {
 {%-     if pf.min_version != 0 %}
     if (data_->header_.version < {{pf.min_version}})
-      return {{kind|get_qualified_name_for_kind}}{};
+      return {{kind|cpp_data_view_type}}{};
 {%-     endif %}
     return static_cast<{{kind|cpp_data_view_type}}>(data_->{{name}});
   }
diff --git a/net/base/features.cc b/net/base/features.cc
index 169f251..0a0c2da9 100644
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -39,7 +39,7 @@
                                     base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kPostQuantumCECPQ2{"PostQuantumCECPQ2",
-                                       base::FEATURE_ENABLED_BY_DEFAULT};
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kNetUnusedIdleSocketTimeout{
     "NetUnusedIdleSocketTimeout", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index b8762226..2559be5 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -34,10 +34,15 @@
 #include "net/cert/internal/signature_algorithm.h"
 #include "net/cert/known_roots.h"
 #include "net/cert/ocsp_revocation_status.h"
+#include "net/cert/pem.h"
 #include "net/cert/symantec_certs.h"
 #include "net/cert/x509_certificate.h"
+#include "net/cert/x509_certificate_net_log_param.h"
 #include "net/cert/x509_util.h"
 #include "net/der/encode_values.h"
+#include "net/log/net_log_event_type.h"
+#include "net/log/net_log_values.h"
+#include "net/log/net_log_with_source.h"
 #include "net/net_buildflags.h"
 #include "third_party/boringssl/src/include/openssl/pool.h"
 #include "url/url_canon.h"
@@ -451,6 +456,44 @@
   return true;
 }
 
+base::Value CertVerifyParams(X509Certificate* cert,
+                             const std::string& hostname,
+                             const std::string& ocsp_response,
+                             const std::string& sct_list,
+                             int flags,
+                             CRLSet* crl_set,
+                             const CertificateList& additional_trust_anchors) {
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetKey("certificates", NetLogX509CertificateList(cert));
+  if (!ocsp_response.empty()) {
+    dict.SetStringKey("ocsp_response",
+                      PEMEncode(ocsp_response, "NETLOG OCSP RESPONSE"));
+  }
+  if (!sct_list.empty()) {
+    dict.SetStringKey("sct_list", PEMEncode(sct_list, "NETLOG SCT LIST"));
+  }
+  dict.SetKey("host", NetLogStringValue(hostname));
+  dict.SetIntKey("verify_flags", flags);
+  dict.SetKey("crlset_sequence", NetLogNumberValue(crl_set->sequence()));
+  if (crl_set->IsExpired())
+    dict.SetBoolKey("crlset_is_expired", true);
+
+  if (!additional_trust_anchors.empty()) {
+    base::Value certs(base::Value::Type::LIST);
+    for (auto& cert : additional_trust_anchors) {
+      std::string pem_encoded;
+      if (X509Certificate::GetPEMEncodedFromDER(
+              x509_util::CryptoBufferAsStringPiece(cert->cert_buffer()),
+              &pem_encoded)) {
+        certs.Append(std::move(pem_encoded));
+      }
+    }
+    dict.SetKey("additional_trust_anchors", std::move(certs));
+  }
+
+  return dict;
+}
+
 }  // namespace
 
 #if !defined(OS_FUCHSIA)
@@ -495,7 +538,12 @@
                            int flags,
                            CRLSet* crl_set,
                            const CertificateList& additional_trust_anchors,
-                           CertVerifyResult* verify_result) {
+                           CertVerifyResult* verify_result,
+                           const NetLogWithSource& net_log) {
+  net_log.BeginEvent(NetLogEventType::CERT_VERIFY_PROC, [&] {
+    return CertVerifyParams(cert, hostname, ocsp_response, sct_list, flags,
+                            crl_set, additional_trust_anchors);
+  });
   // CertVerifyProc's contract allows ::VerifyInternal() to wait on File I/O
   // (such as the Windows registry or smart cards on all platforms) or may re-
   // enter this code via extension hooks (such as smart card UI). To ensure
@@ -509,8 +557,9 @@
   verify_result->verified_cert = cert;
 
   DCHECK(crl_set);
-  int rv = VerifyInternal(cert, hostname, ocsp_response, sct_list, flags,
-                          crl_set, additional_trust_anchors, verify_result);
+  int rv =
+      VerifyInternal(cert, hostname, ocsp_response, sct_list, flags, crl_set,
+                     additional_trust_anchors, verify_result, net_log);
 
   // Check for mismatched signature algorithms and unknown signature algorithms
   // in the chain. Also fills in the has_* booleans for the digest algorithms
@@ -651,6 +700,8 @@
                                verify_result->is_issued_by_known_root);
   }
 
+  net_log.EndEvent(NetLogEventType::CERT_VERIFY_PROC,
+                   [&] { return verify_result->NetLogParams(rv); });
   return rv;
 }
 
diff --git a/net/cert/cert_verify_proc.h b/net/cert/cert_verify_proc.h
index ed812373..24deeaf 100644
--- a/net/cert/cert_verify_proc.h
+++ b/net/cert/cert_verify_proc.h
@@ -21,6 +21,7 @@
 class CertNetFetcher;
 class CertVerifyResult;
 class CRLSet;
+class NetLogWithSource;
 class X509Certificate;
 typedef std::vector<scoped_refptr<X509Certificate> > CertificateList;
 
@@ -114,7 +115,8 @@
              int flags,
              CRLSet* crl_set,
              const CertificateList& additional_trust_anchors,
-             CertVerifyResult* verify_result);
+             CertVerifyResult* verify_result,
+             const NetLogWithSource& net_log);
 
   // Returns true if the implementation supports passing additional trust
   // anchors to the Verify() call. The |additional_trust_anchors| parameter
@@ -171,7 +173,8 @@
                              int flags,
                              CRLSet* crl_set,
                              const CertificateList& additional_trust_anchors,
-                             CertVerifyResult* verify_result) = 0;
+                             CertVerifyResult* verify_result,
+                             const NetLogWithSource& net_log) = 0;
 
   // HasNameConstraintsViolation returns true iff one of |public_key_hashes|
   // (which are hashes of SubjectPublicKeyInfo structures) has name constraints
diff --git a/net/cert/cert_verify_proc_android.cc b/net/cert/cert_verify_proc_android.cc
index 06b00ea..e649d0ab 100644
--- a/net/cert/cert_verify_proc_android.cc
+++ b/net/cert/cert_verify_proc_android.cc
@@ -358,7 +358,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   std::vector<std::string> cert_bytes;
   GetChainDEREncodedBytes(cert, &cert_bytes);
   if (!VerifyFromAndroidTrustManager(cert_bytes, hostname, cert_net_fetcher_,
diff --git a/net/cert/cert_verify_proc_android.h b/net/cert/cert_verify_proc_android.h
index 9868219..aa7893e 100644
--- a/net/cert/cert_verify_proc_android.h
+++ b/net/cert/cert_verify_proc_android.h
@@ -32,7 +32,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 
   scoped_refptr<CertNetFetcher> cert_net_fetcher_;
 
diff --git a/net/cert/cert_verify_proc_android_unittest.cc b/net/cert/cert_verify_proc_android_unittest.cc
index 19d79a5e..ca8bd84 100644
--- a/net/cert/cert_verify_proc_android_unittest.cc
+++ b/net/cert/cert_verify_proc_android_unittest.cc
@@ -15,6 +15,7 @@
 #include "net/cert/test_root_certs.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
+#include "net/log/net_log_with_source.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/test_certificate_data.h"
 #include "net/test/test_data_directory.h"
@@ -185,7 +186,7 @@
       OK,
       proc->Verify(leaf.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if the certificate does not contain an AIA URL, no AIA fetch
@@ -201,7 +202,7 @@
       ERR_CERT_AUTHORITY_INVALID,
       proc->Verify(cert.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if a certificate contains one file:// URL and one http:// URL,
@@ -233,7 +234,7 @@
       OK,
       proc->Verify(cert.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if an AIA request returns the wrong intermediate, certificate
@@ -257,7 +258,7 @@
       ERR_CERT_AUTHORITY_INVALID,
       proc->Verify(cert.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if an AIA request returns an error, certificate verification
@@ -278,7 +279,7 @@
       ERR_CERT_AUTHORITY_INVALID,
       proc->Verify(cert.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if an AIA request returns an unparseable cert, certificate
@@ -299,7 +300,7 @@
       ERR_CERT_AUTHORITY_INVALID,
       proc->Verify(cert.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if a certificate has two HTTP AIA URLs, they are both fetched. If
@@ -334,7 +335,7 @@
       OK,
       proc->Verify(cert.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if an intermediate is fetched via AIA, and the intermediate itself
@@ -369,7 +370,7 @@
       ERR_CERT_AUTHORITY_INVALID,
       proc->Verify(cert.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if a certificate contains six AIA URLs, only the first five are
@@ -393,7 +394,7 @@
       ERR_CERT_AUTHORITY_INVALID,
       proc->Verify(cert.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 // Tests that if the supplied chain contains an intermediate with an AIA URL,
@@ -421,7 +422,7 @@
       ERR_CERT_AUTHORITY_INVALID,
       proc->Verify(leaf.get(), "target", /*ocsp_response=*/std::string(),
                    /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-                   empty_cert_list_, &verify_result));
+                   empty_cert_list_, &verify_result, NetLogWithSource()));
 }
 
 }  // namespace net
diff --git a/net/cert/cert_verify_proc_builtin.cc b/net/cert/cert_verify_proc_builtin.cc
index 18c3c4c..34c9987a 100644
--- a/net/cert/cert_verify_proc_builtin.cc
+++ b/net/cert/cert_verify_proc_builtin.cc
@@ -10,6 +10,7 @@
 
 #include "base/logging.h"
 #include "base/strings/string_piece.h"
+#include "base/values.h"
 #include "crypto/sha2.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_net_fetcher.h"
@@ -31,6 +32,7 @@
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
 #include "net/der/encode_values.h"
+#include "net/log/net_log_with_source.h"
 
 namespace net {
 
@@ -50,6 +52,62 @@
 
 const void* kResultDebugDataKey = &kResultDebugDataKey;
 
+base::Value NetLogCertParams(const CRYPTO_BUFFER* cert_handle,
+                             const CertErrors& errors) {
+  base::Value results(base::Value::Type::DICTIONARY);
+
+  std::string pem_encoded;
+  if (X509Certificate::GetPEMEncodedFromDER(
+          x509_util::CryptoBufferAsStringPiece(cert_handle), &pem_encoded)) {
+    results.SetStringKey("certificate", pem_encoded);
+  }
+
+  std::string errors_string = errors.ToDebugString();
+  if (!errors_string.empty())
+    results.SetStringKey("errors", errors_string);
+
+  return results;
+}
+
+base::Value PEMCertListValue(const ParsedCertificateList& certs) {
+  base::Value value(base::Value::Type::LIST);
+  for (const auto& cert : certs) {
+    std::string pem;
+    X509Certificate::GetPEMEncodedFromDER(cert->der_cert().AsStringPiece(),
+                                          &pem);
+    value.Append(std::move(pem));
+  }
+  return value;
+}
+
+base::Value NetLogPathBuilderResultPath(
+    const CertPathBuilderResultPath& result_path) {
+  base::Value value(base::Value::Type::DICTIONARY);
+  value.SetBoolKey("is_valid", result_path.IsValid());
+  value.SetIntKey("last_cert_trust",
+                  static_cast<int>(result_path.last_cert_trust.type));
+  value.SetKey("certificates", PEMCertListValue(result_path.certs));
+  // TODO(crbug.com/634484): netlog user_constrained_policy_set.
+  std::string errors_string =
+      result_path.errors.ToDebugString(result_path.certs);
+  if (!errors_string.empty())
+    value.SetStringKey("errors", errors_string);
+  return value;
+}
+
+base::Value NetLogPathBuilderResult(const CertPathBuilder::Result& result) {
+  base::Value value(base::Value::Type::DICTIONARY);
+  // TODO(crbug.com/634484): include debug data (or just have things netlog it
+  // directly).
+  value.SetBoolKey("has_valid_path", result.HasValidPath());
+  value.SetIntKey("best_result_index", result.best_result_index);
+  if (result.exceeded_iteration_limit)
+    value.SetBoolKey("exceeded_iteration_limit", true);
+  if (result.exceeded_deadline)
+    value.SetBoolKey("exceeded_deadline", true);
+  return value;
+}
+
 RevocationPolicy NoRevocationChecking() {
   RevocationPolicy policy;
   policy.check_revocation = false;
@@ -302,7 +360,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 
   scoped_refptr<CertNetFetcher> net_fetcher_;
   std::unique_ptr<SystemTrustStoreProvider> system_trust_store_provider_;
@@ -331,14 +390,19 @@
 }
 
 void AddIntermediatesToIssuerSource(X509Certificate* x509_cert,
-                                    CertIssuerSourceStatic* intermediates) {
-  CertErrors errors;
+                                    CertIssuerSourceStatic* intermediates,
+                                    const NetLogWithSource& net_log) {
   for (const auto& intermediate : x509_cert->intermediate_buffers()) {
+    CertErrors errors;
     scoped_refptr<ParsedCertificate> cert =
         ParseCertificateFromBuffer(intermediate.get(), &errors);
+    // TODO(crbug.com/634484): this duplicates the logging of the input chain
+    // maybe should only log if there is a parse error/warning?
+    net_log.AddEvent(NetLogEventType::CERT_VERIFY_PROC_INPUT_CERT, [&] {
+      return NetLogCertParams(intermediate.get(), errors);
+    });
     if (cert)
       intermediates->AddCert(std::move(cert));
-    // TODO(crbug.com/634443): Surface these parsing errors?
   }
 }
 
@@ -465,6 +529,7 @@
 
   if (verification_type == VerificationType::kEV) {
     GetEVPolicyOids(ev_metadata, target.get(), &user_initial_policy_set);
+    // TODO(crbug.com/634484): netlog user_initial_policy_set.
   } else {
     user_initial_policy_set = {AnyPolicy()};
   }
@@ -485,6 +550,7 @@
   path_builder.AddCertIssuerSource(intermediates);
 
   // Allow the path builder to discover intermediates through AIA fetching.
+  // TODO(crbug.com/634484): hook up netlog to AIA.
   std::unique_ptr<CertIssuerSourceAia> aia_cert_issuer_source;
   if (net_fetcher) {
     aia_cert_issuer_source = std::make_unique<CertIssuerSourceAia>(net_fetcher);
@@ -601,9 +667,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
-  CertErrors parsing_errors;
-
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   // VerifyInternal() is expected to carry out verifications using the current
   // time stamp.
   base::Time verification_time = base::Time::Now();
@@ -622,28 +687,43 @@
                                                der_verification_time);
 
   // Parse the target certificate.
-  scoped_refptr<ParsedCertificate> target =
-      ParseCertificateFromBuffer(input_cert->cert_buffer(), &parsing_errors);
-  if (!target) {
-    // TODO(crbug.com/634443): Surface these parsing errors?
-    verify_result->cert_status |= CERT_STATUS_INVALID;
-    return ERR_CERT_INVALID;
+  scoped_refptr<ParsedCertificate> target;
+  {
+    CertErrors parsing_errors;
+    target =
+        ParseCertificateFromBuffer(input_cert->cert_buffer(), &parsing_errors);
+    // TODO(crbug.com/634484): this duplicates the logging of the input chain
+    // maybe should only log if there is a parse error/warning?
+    net_log.AddEvent(NetLogEventType::CERT_VERIFY_PROC_TARGET_CERT, [&] {
+      return NetLogCertParams(input_cert->cert_buffer(), parsing_errors);
+    });
+    if (!target) {
+      verify_result->cert_status |= CERT_STATUS_INVALID;
+      return ERR_CERT_INVALID;
+    }
   }
 
   // Parse the provided intermediates.
   CertIssuerSourceStatic intermediates;
-  AddIntermediatesToIssuerSource(input_cert, &intermediates);
+  AddIntermediatesToIssuerSource(input_cert, &intermediates, net_log);
 
   // Parse the additional trust anchors and setup trust store.
   std::unique_ptr<SystemTrustStore> ssl_trust_store =
       system_trust_store_provider_->CreateSystemTrustStore();
 
   for (const auto& x509_cert : additional_trust_anchors) {
+    CertErrors parsing_errors;
     scoped_refptr<ParsedCertificate> cert =
         ParseCertificateFromBuffer(x509_cert->cert_buffer(), &parsing_errors);
     if (cert)
       ssl_trust_store->AddTrustAnchor(cert);
-    // TODO(eroman): Surface parsing errors of additional trust anchor.
+    // TODO(crbug.com/634484): this duplicates the logging of the
+    // additional_trust_anchors maybe should only log if there is a parse
+    // error/warning?
+    net_log.AddEvent(
+        NetLogEventType::CERT_VERIFY_PROC_ADDITIONAL_TRUST_ANCHOR, [&] {
+          return NetLogCertParams(x509_cert->cert_buffer(), parsing_errors);
+        });
   }
 
   // Get the global dependencies.
@@ -678,6 +758,15 @@
        ++cur_attempt_index) {
     const auto& cur_attempt = attempts[cur_attempt_index];
     verification_type = cur_attempt.verification_type;
+    net_log.BeginEvent(
+        NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT, [&] {
+          base::DictionaryValue results;
+          if (verification_type == VerificationType::kEV)
+            results.SetBoolKey("is_ev_attempt", true);
+          results.SetIntKey("digest_policy",
+                            static_cast<int>(cur_attempt.digest_policy));
+          return results;
+        });
 
     // If a previous attempt used up most/all of the deadline, extend the
     // deadline a little bit to give this verification attempt a chance at
@@ -692,6 +781,16 @@
         flags, ocsp_response, crl_set, net_fetcher_.get(), ev_metadata,
         &checked_revocation_for_some_path);
 
+    // TODO(crbug.com/634484): Log these in path_builder.cc so they include
+    // correct timing information.
+    for (const auto& path : result.paths) {
+      net_log.AddEvent(NetLogEventType::CERT_VERIFY_PROC_PATH_BUILT,
+                       [&] { return NetLogPathBuilderResultPath(*path); });
+    }
+
+    net_log.EndEvent(NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT,
+                     [&] { return NetLogPathBuilderResult(result); });
+
     if (result.HasValidPath())
       break;
 
diff --git a/net/cert/cert_verify_proc_builtin_unittest.cc b/net/cert/cert_verify_proc_builtin_unittest.cc
index 29ba255..4153212 100644
--- a/net/cert/cert_verify_proc_builtin_unittest.cc
+++ b/net/cert/cert_verify_proc_builtin_unittest.cc
@@ -16,6 +16,7 @@
 #include "net/cert_net/cert_net_fetcher_url_request.h"
 #include "net/der/encode_values.h"
 #include "net/log/net_log_with_source.h"
+#include "net/log/test_net_log.h"
 #include "net/test/cert_builder.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -66,15 +67,19 @@
                          const std::string& hostname,
                          int flags,
                          const CertificateList& additional_trust_anchors,
-                         CertVerifyResult* verify_result) {
+                         CertVerifyResult* verify_result,
+                         NetLogSource* out_source) {
   base::ScopedAllowBaseSyncPrimitivesForTesting scoped_allow_blocking;
   scoped_refptr<CRLSet> crl_set = CRLSet::EmptyCRLSetForTesting();
+  NetLogWithSource net_log(NetLogWithSource::Make(
+      net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_TASK));
   int error =
       verify_proc->Verify(cert.get(), hostname,
                           /*ocsp_response=*/std::string(),
                           /*sct_list=*/std::string(), flags, crl_set.get(),
-                          additional_trust_anchors, verify_result);
+                          additional_trust_anchors, verify_result, net_log);
   verify_result->DetachFromSequence();
+  *out_source = net_log.source();
   return error;
 }
 
@@ -101,14 +106,15 @@
               int flags,
               const CertificateList& additional_trust_anchors,
               CertVerifyResult* verify_result,
+              NetLogSource* out_source,
               CompletionOnceCallback callback) {
     verify_result->DetachFromSequence();
     base::ThreadPool::PostTaskAndReplyWithResult(
         FROM_HERE,
         {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
         base::BindOnce(&VerifyOnWorkerThread, verify_proc_, std::move(cert),
-                       hostname, flags, additional_trust_anchors,
-                       verify_result),
+                       hostname, flags, additional_trust_anchors, verify_result,
+                       out_source),
         std::move(callback));
   }
 
@@ -149,10 +155,11 @@
   ASSERT_TRUE(chain.get());
 
   CertVerifyResult verify_result;
+  NetLogSource verify_net_log_source;
   TestCompletionCallback callback;
   Verify(chain.get(), "www.example.com", /*flags=*/0,
          /*additional_trust_anchors=*/{root->GetX509Certificate()},
-         &verify_result, callback.callback());
+         &verify_result, &verify_net_log_source, callback.callback());
 
   int error = callback.WaitForResult();
   EXPECT_THAT(error, IsOk());
@@ -205,11 +212,12 @@
   ASSERT_TRUE(chain.get());
 
   CertVerifyResult verify_result;
+  NetLogSource verify_net_log_source;
   TestCompletionCallback verify_callback;
   Verify(chain.get(), "www.example.com",
          CertVerifyProc::VERIFY_REV_CHECKING_ENABLED,
          /*additional_trust_anchors=*/{root->GetX509Certificate()},
-         &verify_result, verify_callback.callback());
+         &verify_result, &verify_net_log_source, verify_callback.callback());
 
   for (int i = 0; i < expected_request_count; i++) {
     // Wait for request #|i| to be made.
@@ -275,11 +283,12 @@
   ASSERT_TRUE(chain.get());
 
   CertVerifyResult verify_result;
+  NetLogSource verify_net_log_source;
   TestCompletionCallback verify_callback;
   Verify(chain.get(), "www.example.com",
          CertVerifyProc::VERIFY_REV_CHECKING_ENABLED,
          /*additional_trust_anchors=*/{root->GetX509Certificate()},
-         &verify_result, verify_callback.callback());
+         &verify_result, &verify_net_log_source, verify_callback.callback());
 
   for (int i = 0; i < expected_request_count; i++) {
     // Wait for request #|i| to be made.
@@ -345,12 +354,14 @@
   scoped_refptr<X509Certificate> chain = leaf->GetX509CertificateChain();
   ASSERT_TRUE(chain.get());
 
+  RecordingNetLogObserver net_log_observer(NetLogCaptureMode::kDefault);
   CertVerifyResult verify_result;
+  NetLogSource verify_net_log_source;
   TestCompletionCallback verify_callback;
   Verify(chain.get(), "www.example.com",
          /*flags=*/0,
          /*additional_trust_anchors=*/{root->GetX509Certificate()},
-         &verify_result, verify_callback.callback());
+         &verify_result, &verify_net_log_source, verify_callback.callback());
 
   for (int i = 0; i < expected_request_count; i++) {
     // Wait for request #|i| to be made.
@@ -368,6 +379,61 @@
   EXPECT_THAT(error, IsOk());
   EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_IS_EV);
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
+
+  auto events = net_log_observer.GetEntriesForSource(verify_net_log_source);
+
+  auto event = std::find_if(events.begin(), events.end(), [](const auto& e) {
+    return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT;
+  });
+  ASSERT_NE(event, events.end());
+  EXPECT_EQ(net::NetLogEventPhase::BEGIN, event->phase);
+  ASSERT_TRUE(event->params.is_dict());
+  EXPECT_EQ(true, event->params.FindBoolKey("is_ev_attempt"));
+
+  event = std::find_if(++event, events.end(), [](const auto& e) {
+    return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILT;
+  });
+  ASSERT_NE(event, events.end());
+  EXPECT_EQ(net::NetLogEventPhase::NONE, event->phase);
+  ASSERT_TRUE(event->params.is_dict());
+  const std::string* errors = event->params.FindStringKey("errors");
+  ASSERT_TRUE(errors);
+  EXPECT_EQ("----- Certificate i=1 (CN=" +
+                intermediate->GetX509Certificate()->subject().common_name +
+                ") -----\nERROR: Unable to check revocation\n\n",
+            *errors);
+
+  event = std::find_if(++event, events.end(), [](const auto& e) {
+    return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT;
+  });
+  ASSERT_NE(event, events.end());
+  EXPECT_EQ(net::NetLogEventPhase::END, event->phase);
+  ASSERT_TRUE(event->params.is_dict());
+  EXPECT_EQ(false, event->params.FindBoolKey("has_valid_path"));
+
+  event = std::find_if(++event, events.end(), [](const auto& e) {
+    return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT;
+  });
+  ASSERT_NE(event, events.end());
+  EXPECT_EQ(net::NetLogEventPhase::BEGIN, event->phase);
+  ASSERT_TRUE(event->params.is_dict());
+  EXPECT_EQ(base::nullopt, event->params.FindBoolKey("is_ev_attempt"));
+
+  event = std::find_if(++event, events.end(), [](const auto& e) {
+    return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILT;
+  });
+  ASSERT_NE(event, events.end());
+  EXPECT_EQ(net::NetLogEventPhase::NONE, event->phase);
+  ASSERT_TRUE(event->params.is_dict());
+  EXPECT_FALSE(event->params.FindStringKey("errors"));
+
+  event = std::find_if(++event, events.end(), [](const auto& e) {
+    return e.type == NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT;
+  });
+  ASSERT_NE(event, events.end());
+  EXPECT_EQ(net::NetLogEventPhase::END, event->phase);
+  ASSERT_TRUE(event->params.is_dict());
+  EXPECT_EQ(true, event->params.FindBoolKey("has_valid_path"));
 }
 #endif  // defined(PLATFORM_USES_CHROMIUM_EV_METADATA)
 
@@ -382,10 +448,11 @@
   base::Time time = base::Time::Now();
 
   CertVerifyResult verify_result;
+  NetLogSource verify_net_log_source;
   TestCompletionCallback callback;
   Verify(chain.get(), "www.example.com", /*flags=*/0,
          /*additional_trust_anchors=*/{root->GetX509Certificate()},
-         &verify_result, callback.callback());
+         &verify_result, &verify_net_log_source, callback.callback());
 
   int error = callback.WaitForResult();
   EXPECT_THAT(error, IsOk());
diff --git a/net/cert/cert_verify_proc_ios.cc b/net/cert/cert_verify_proc_ios.cc
index 551466a..59624eb8 100644
--- a/net/cert/cert_verify_proc_ios.cc
+++ b/net/cert/cert_verify_proc_ios.cc
@@ -412,7 +412,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   ScopedCFTypeRef<CFArrayRef> trust_policies;
   OSStatus status = CreateTrustPolicies(&trust_policies);
   if (status)
diff --git a/net/cert/cert_verify_proc_ios.h b/net/cert/cert_verify_proc_ios.h
index 43585a4..42eb9e04 100644
--- a/net/cert/cert_verify_proc_ios.h
+++ b/net/cert/cert_verify_proc_ios.h
@@ -42,7 +42,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 };
 
 }  // namespace net
diff --git a/net/cert/cert_verify_proc_mac.cc b/net/cert/cert_verify_proc_mac.cc
index 2753a150..62eb02a 100644
--- a/net/cert/cert_verify_proc_mac.cc
+++ b/net/cert/cert_verify_proc_mac.cc
@@ -1288,7 +1288,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   // Save the input state of |*verify_result|, which may be needed to re-do
   // verification with different flags.
   const CertVerifyResult input_verify_result(*verify_result);
diff --git a/net/cert/cert_verify_proc_mac.h b/net/cert/cert_verify_proc_mac.h
index 1eea75a7..fcf882b 100644
--- a/net/cert/cert_verify_proc_mac.h
+++ b/net/cert/cert_verify_proc_mac.h
@@ -77,7 +77,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 };
 
 }  // namespace net
diff --git a/net/cert/cert_verify_proc_mac_unittest.cc b/net/cert/cert_verify_proc_mac_unittest.cc
index 01d2a68..7575010 100644
--- a/net/cert/cert_verify_proc_mac_unittest.cc
+++ b/net/cert/cert_verify_proc_mac_unittest.cc
@@ -20,6 +20,7 @@
 #include "net/cert/test_root_certs.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
+#include "net/log/net_log_with_source.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/gtest_util.h"
 #include "net/test/test_data_directory.h"
@@ -112,7 +113,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, crl_set.get(), CertificateList(),
-      &verify_result);
+      &verify_result, NetLogWithSource());
 
   ASSERT_EQ(OK, error);
   ASSERT_EQ(0U, verify_result.cert_status);
@@ -172,7 +173,7 @@
   int error = verify_proc->Verify(
       cert.get(), "gms.hongleong.com.my", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
 
   ASSERT_EQ(OK, error);
   EXPECT_FALSE(verify_result.has_sha1);
@@ -221,7 +222,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_INVALID));
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
 }
@@ -244,7 +245,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
 
   if (base::mac::IsAtLeastOS10_15()) {
     EXPECT_THAT(error, IsError(ERR_CERT_VALIDITY_TOO_LONG));
diff --git a/net/cert/cert_verify_proc_nss.cc b/net/cert/cert_verify_proc_nss.cc
index 72e52dc..f2e8e5d 100644
--- a/net/cert/cert_verify_proc_nss.cc
+++ b/net/cert/cert_verify_proc_nss.cc
@@ -1042,7 +1042,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   return VerifyInternalImpl(cert, hostname, ocsp_response, flags, crl_set,
                             additional_trust_anchors,
                             NULL,  // chain_verify_callback
diff --git a/net/cert/cert_verify_proc_nss.h b/net/cert/cert_verify_proc_nss.h
index 022d675..d826812 100644
--- a/net/cert/cert_verify_proc_nss.h
+++ b/net/cert/cert_verify_proc_nss.h
@@ -42,7 +42,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 };
 
 }  // namespace net
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index c2b0f8c..1f705a4 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -42,6 +42,7 @@
 #include "net/cert_net/nss_ocsp_session_url_request.h"
 #include "net/der/input.h"
 #include "net/der/parser.h"
+#include "net/log/test_net_log.h"
 #include "net/proxy_resolution/proxy_config.h"
 #include "net/proxy_resolution/proxy_config_service_fixed.h"
 #include "net/test/cert_builder.h"
@@ -117,7 +118,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 
   const CertVerifyResult result_;
 
@@ -132,7 +134,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   *verify_result = result_;
   verify_result->verified_cert = cert;
   return OK;
@@ -305,10 +308,22 @@
              int flags,
              CRLSet* crl_set,
              const CertificateList& additional_trust_anchors,
-             CertVerifyResult* verify_result) {
+             CertVerifyResult* verify_result,
+             const NetLogWithSource& net_log) {
     return verify_proc_->Verify(cert, hostname, /*ocsp_response=*/std::string(),
                                 /*sct_list=*/std::string(), flags, crl_set,
-                                additional_trust_anchors, verify_result);
+                                additional_trust_anchors, verify_result,
+                                net_log);
+  }
+
+  int Verify(X509Certificate* cert,
+             const std::string& hostname,
+             int flags,
+             CRLSet* crl_set,
+             const CertificateList& additional_trust_anchors,
+             CertVerifyResult* verify_result) {
+    return Verify(cert, hostname, flags, crl_set, additional_trust_anchors,
+                  verify_result, NetLogWithSource());
   }
 
   CertVerifyProcType verify_proc_type() const { return GetParam(); }
@@ -809,14 +824,45 @@
   ASSERT_TRUE(cert_with_bad_intermediate);
   EXPECT_EQ(1U, cert_with_bad_intermediate->intermediate_buffers().size());
 
+  RecordingNetLogObserver net_log_observer(NetLogCaptureMode::kDefault);
+  NetLogWithSource net_log(NetLogWithSource::Make(
+      net::NetLog::Get(), net::NetLogSourceType::CERT_VERIFIER_TASK));
   int flags = 0;
   CertVerifyResult verify_result;
-  int error =
-      Verify(cert_with_bad_intermediate.get(), "127.0.0.1", flags,
-             CRLSet::BuiltinCRLSet().get(), CertificateList(), &verify_result);
+  int error = Verify(cert_with_bad_intermediate.get(), "127.0.0.1", flags,
+                     CRLSet::BuiltinCRLSet().get(), CertificateList(),
+                     &verify_result, net_log);
 
   EXPECT_THAT(error, IsOk());
   EXPECT_EQ(0u, verify_result.cert_status);
+
+  auto events = net_log_observer.GetEntriesForSource(net_log.source());
+  EXPECT_FALSE(events.empty());
+
+  auto event = std::find_if(events.begin(), events.end(), [](const auto& e) {
+    return e.type == NetLogEventType::CERT_VERIFY_PROC;
+  });
+  ASSERT_NE(event, events.end());
+  EXPECT_EQ(net::NetLogEventPhase::BEGIN, event->phase);
+  ASSERT_TRUE(event->params.is_dict());
+  const std::string* host = event->params.FindStringKey("host");
+  ASSERT_TRUE(host);
+  EXPECT_EQ("127.0.0.1", *host);
+
+  if (verify_proc_type() == CERT_VERIFY_PROC_BUILTIN) {
+    event = std::find_if(events.begin(), events.end(), [](const auto& e) {
+      return e.type == NetLogEventType::CERT_VERIFY_PROC_INPUT_CERT;
+    });
+    ASSERT_NE(event, events.end());
+    EXPECT_EQ(net::NetLogEventPhase::NONE, event->phase);
+    ASSERT_TRUE(event->params.is_dict());
+    const std::string* errors = event->params.FindStringKey("errors");
+    ASSERT_TRUE(errors);
+    EXPECT_EQ(
+        "ERROR: Failed parsing Certificate SEQUENCE\nERROR: Failed parsing "
+        "Certificate\n",
+        *errors);
+  }
 }
 
 // A regression test for http://crbug.com/31497.
@@ -1148,7 +1194,7 @@
     return verify_proc->Verify(
         chain.get(), "test.example.com", /*ocsp_response=*/std::string(),
         /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-        CertificateList(), &verify_result);
+        CertificateList(), &verify_result, NetLogWithSource());
   }
 
  private:
@@ -1730,7 +1776,7 @@
   error = verify_proc->Verify(
       cert.get(), "webmail", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME);
 
@@ -1741,7 +1787,7 @@
   error = verify_proc->Verify(
       cert.get(), "webmail", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_NON_UNIQUE_NAME);
 }
@@ -1785,7 +1831,7 @@
     error = verify_proc->Verify(
         cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
         /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-        CertificateList(), &test_result_1);
+        CertificateList(), &test_result_1, NetLogWithSource());
     EXPECT_THAT(error, IsError(ERR_CERT_SYMANTEC_LEGACY));
     EXPECT_TRUE(test_result_1.cert_status & CERT_STATUS_SYMANTEC_LEGACY);
 
@@ -1802,7 +1848,7 @@
     error = verify_proc->Verify(
         cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
         /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-        CertificateList(), &test_result_2);
+        CertificateList(), &test_result_2, NetLogWithSource());
     EXPECT_THAT(error, IsOk());
     EXPECT_FALSE(test_result_2.cert_status & CERT_STATUS_AUTHORITY_INVALID);
 
@@ -1812,7 +1858,8 @@
         cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
         /*sct_list=*/std::string(),
         CertVerifyProc::VERIFY_DISABLE_SYMANTEC_ENFORCEMENT,
-        CRLSet::BuiltinCRLSet().get(), CertificateList(), &test_result_3);
+        CRLSet::BuiltinCRLSet().get(), CertificateList(), &test_result_3,
+        NetLogWithSource());
     EXPECT_THAT(error, IsOk());
     EXPECT_FALSE(test_result_3.cert_status & CERT_STATUS_SYMANTEC_LEGACY);
   }
@@ -1845,7 +1892,7 @@
     error = verify_proc->Verify(
         cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
         /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-        CertificateList(), &test_result_1);
+        CertificateList(), &test_result_1, NetLogWithSource());
     if (feature_flag_enabled) {
       EXPECT_THAT(error, IsError(ERR_CERT_SYMANTEC_LEGACY));
       EXPECT_TRUE(test_result_1.cert_status & CERT_STATUS_SYMANTEC_LEGACY);
@@ -1867,7 +1914,7 @@
     error = verify_proc->Verify(
         cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
         /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-        CertificateList(), &test_result_2);
+        CertificateList(), &test_result_2, NetLogWithSource());
     EXPECT_THAT(error, IsOk());
     EXPECT_FALSE(test_result_2.cert_status & CERT_STATUS_AUTHORITY_INVALID);
 
@@ -1877,7 +1924,8 @@
         cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
         /*sct_list=*/std::string(),
         CertVerifyProc::VERIFY_DISABLE_SYMANTEC_ENFORCEMENT,
-        CRLSet::BuiltinCRLSet().get(), CertificateList(), &test_result_3);
+        CRLSet::BuiltinCRLSet().get(), CertificateList(), &test_result_3,
+        NetLogWithSource());
     EXPECT_THAT(error, IsOk());
     EXPECT_FALSE(test_result_3.cert_status & CERT_STATUS_SYMANTEC_LEGACY);
   }
@@ -2084,10 +2132,11 @@
 
   int flags = 0;
   CertVerifyResult verify_result;
-  int error = verify_proc()->Verify(chain.get(), "treadclimber.com",
-                                    /*ocsp_response=*/std::string(), sct_list,
-                                    flags, CRLSet::BuiltinCRLSet().get(),
-                                    CertificateList(), &verify_result);
+  int error =
+      verify_proc()->Verify(chain.get(), "treadclimber.com",
+                            /*ocsp_response=*/std::string(), sct_list, flags,
+                            CRLSet::BuiltinCRLSet().get(), CertificateList(),
+                            &verify_result, NetLogWithSource());
 
   // Since the valid |sct_list| was passed to Verify, verification should
   // succeed on all verifiers and OS versions.
@@ -4078,7 +4127,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_INVALID));
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
 }
@@ -4097,7 +4146,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_INVALID));
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_INVALID);
 }
@@ -4116,7 +4165,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
 }
@@ -4137,7 +4186,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_WEAK_SIGNATURE_ALGORITHM);
 }
@@ -4158,7 +4207,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   if (AreSHA1IntermediatesAllowed()) {
     EXPECT_THAT(error, IsOk());
     EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT);
@@ -4186,7 +4235,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_WEAK_SIGNATURE_ALGORITHM));
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT);
 
@@ -4196,7 +4245,7 @@
   error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_SHA1_SIGNATURE_PRESENT);
 }
@@ -4283,7 +4332,7 @@
       new MockCertVerifyProc(CertVerifyResult());
   proc->Verify(ee_chain.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
                /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-               CertificateList(), &verify_result);
+               CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD2), verify_result.has_md2);
   EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD4), verify_result.has_md4);
   EXPECT_EQ(!!(data.expected_algorithms & EXPECT_MD5), verify_result.has_md5);
@@ -4413,7 +4462,7 @@
     int error = verify_proc->Verify(
         cert.get(), hostname, /*ocsp_response=*/std::string(),
         /*sct_list=*/std::string(), 0, CRLSet::BuiltinCRLSet().get(),
-        CertificateList(), &verify_result);
+        CertificateList(), &verify_result, NetLogWithSource());
     if (valid) {
       EXPECT_THAT(error, IsOk());
       EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID);
@@ -4509,7 +4558,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(OK, error);
   histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1);
   histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, true, 1);
@@ -4536,7 +4585,8 @@
   CertVerifyResult verify_result;
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", "dummy response", /*sct_list=*/std::string(),
-      flags, CRLSet::BuiltinCRLSet().get(), CertificateList(), &verify_result);
+      flags, CRLSet::BuiltinCRLSet().get(), CertificateList(), &verify_result,
+      NetLogWithSource());
   EXPECT_EQ(OK, error);
   histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1);
   histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, true, 1);
@@ -4564,7 +4614,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(OK, error);
   histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 1);
   histograms.ExpectBucketCount(kTLSFeatureExtensionHistogram, false, 1);
@@ -4590,7 +4640,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(OK, error);
   histograms.ExpectTotalCount(kTLSFeatureExtensionHistogram, 0);
   histograms.ExpectTotalCount(kTLSFeatureExtensionOCSPHistogram, 0);
@@ -4632,7 +4682,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(OK, error);
   histograms.ExpectUniqueSample(kTrustAnchorVerifyHistogram,
                                 kGTSRootR4HistogramID, 1);
@@ -4680,7 +4730,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(OK, error);
 
   // Only GTS Root R3 should be recorded.
@@ -4719,7 +4769,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(OK, error);
   const base::HistogramBase::Sample kUnknownRootHistogramID = 0;
   histograms.ExpectUniqueSample(kTrustAnchorVerifyHistogram,
@@ -4746,11 +4796,11 @@
 
   int flags = 0;
   CertVerifyResult verify_result;
-  int error = verify_proc->Verify(cert.get(), "127.0.0.1",
-                                  /*ocsp_response=*/"invalid OCSP data",
-                                  /*sct_list=*/std::string(), flags,
-                                  CRLSet::BuiltinCRLSet().get(),
-                                  CertificateList(), &verify_result);
+  int error = verify_proc->Verify(
+      cert.get(), "127.0.0.1",
+      /*ocsp_response=*/"invalid OCSP data",
+      /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(OK, error);
 
   EXPECT_EQ(OCSPVerifyResult::PROVIDED,
@@ -4780,7 +4830,7 @@
   int error = verify_proc->Verify(
       cert.get(), "127.0.0.1", /*ocsp_response=*/"invalid OCSP data",
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &verify_result);
+      CertificateList(), &verify_result, NetLogWithSource());
   EXPECT_EQ(OK, error);
 
   EXPECT_EQ(OCSPVerifyResult::PARSE_RESPONSE_ERROR,
diff --git a/net/cert/cert_verify_proc_win.cc b/net/cert/cert_verify_proc_win.cc
index 1e4639f..4836665 100644
--- a/net/cert/cert_verify_proc_win.cc
+++ b/net/cert/cert_verify_proc_win.cc
@@ -877,7 +877,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   // Ensure the Revocation Provider has been installed and configured for this
   // CRLSet.
   ScopedThreadLocalCRLSet thread_local_crlset(crl_set);
diff --git a/net/cert/cert_verify_proc_win.h b/net/cert/cert_verify_proc_win.h
index b89f088..49e15438 100644
--- a/net/cert/cert_verify_proc_win.h
+++ b/net/cert/cert_verify_proc_win.h
@@ -28,7 +28,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 };
 
 }  // namespace net
diff --git a/net/cert/cert_verify_result.cc b/net/cert/cert_verify_result.cc
index b6d9543..5d88b7fb 100644
--- a/net/cert/cert_verify_result.cc
+++ b/net/cert/cert_verify_result.cc
@@ -6,7 +6,10 @@
 
 #include <tuple>
 
+#include "base/values.h"
+#include "net/base/net_errors.h"
 #include "net/cert/x509_certificate.h"
+#include "net/cert/x509_certificate_net_log_param.h"
 
 namespace net {
 
@@ -58,4 +61,35 @@
   ClearAllUserData();
 }
 
+base::Value CertVerifyResult::NetLogParams(int net_error) const {
+  base::DictionaryValue results;
+  DCHECK_NE(ERR_IO_PENDING, net_error);
+  if (net_error < 0)
+    results.SetIntKey("net_error", net_error);
+  if (has_md5)
+    results.SetBoolKey("has_md5", true);
+  if (has_md2)
+    results.SetBoolKey("has_md2", true);
+  if (has_md4)
+    results.SetBoolKey("has_md4", true);
+  results.SetBoolKey("is_issued_by_known_root", is_issued_by_known_root);
+  if (is_issued_by_additional_trust_anchor) {
+    results.SetBoolKey("is_issued_by_additional_trust_anchor", true);
+  }
+  results.SetIntKey("cert_status", cert_status);
+  // TODO(mattm): This double-wrapping of the certificate list is weird. Remove
+  // this (probably requires updates to netlog-viewer).
+  base::Value certificate_dict(base::Value::Type::DICTIONARY);
+  certificate_dict.SetKey("certificates",
+                          net::NetLogX509CertificateList(verified_cert.get()));
+  results.SetKey("verified_cert", std::move(certificate_dict));
+
+  base::Value hashes(base::Value::Type::LIST);
+  for (const auto& public_key_hash : public_key_hashes)
+    hashes.Append(public_key_hash.ToString());
+  results.SetKey("public_key_hashes", std::move(hashes));
+
+  return std::move(results);
+}
+
 }  // namespace net
diff --git a/net/cert/cert_verify_result.h b/net/cert/cert_verify_result.h
index a8cac35..5663b28 100644
--- a/net/cert/cert_verify_result.h
+++ b/net/cert/cert_verify_result.h
@@ -14,6 +14,10 @@
 #include "net/cert/ocsp_verify_result.h"
 #include "net/cert/x509_cert_types.h"
 
+namespace base {
+class Value;
+}
+
 namespace net {
 
 class X509Certificate;
@@ -36,6 +40,11 @@
 
   void Reset();
 
+  // Creates NetLog parameter to describe the CertVerifyResult. |net_error| is
+  // a net error code to include in the params, if non-zero. It must not be
+  // ERR_IO_PENDING, as that is not a true error.
+  base::Value NetLogParams(int net_error) const;
+
   // The certificate chain that was constructed during verification.
   //
   // Note: Although |verified_cert| will match the originally supplied
diff --git a/net/cert/coalescing_cert_verifier.cc b/net/cert/coalescing_cert_verifier.cc
index 6f1a1f5..4bd65c7 100644
--- a/net/cert/coalescing_cert_verifier.cc
+++ b/net/cert/coalescing_cert_verifier.cc
@@ -70,37 +70,17 @@
 
 namespace {
 
-base::Value CertVerifyResultParams(const CertVerifyResult& verify_result) {
-  base::DictionaryValue results;
-  results.SetBoolean("has_md5", verify_result.has_md5);
-  results.SetBoolean("has_md2", verify_result.has_md2);
-  results.SetBoolean("has_md4", verify_result.has_md4);
-  results.SetBoolean("is_issued_by_known_root",
-                     verify_result.is_issued_by_known_root);
-  results.SetBoolean("is_issued_by_additional_trust_anchor",
-                     verify_result.is_issued_by_additional_trust_anchor);
-  results.SetInteger("cert_status", verify_result.cert_status);
-  results.SetKey("verified_cert", NetLogX509CertificateParams(
-                                      verify_result.verified_cert.get()));
-
-  std::unique_ptr<base::ListValue> hashes(new base::ListValue());
-  for (auto it = verify_result.public_key_hashes.begin();
-       it != verify_result.public_key_hashes.end(); ++it) {
-    hashes->AppendString(it->ToString());
-  }
-  results.Set("public_key_hashes", std::move(hashes));
-
-  return std::move(results);
-}
-
 base::Value CertVerifierParams(const CertVerifier::RequestParams& params) {
-  base::Value dict(NetLogX509CertificateParams(params.certificate().get()));
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetKey("certificates",
+              NetLogX509CertificateList(params.certificate().get()));
   if (!params.ocsp_response().empty()) {
-    dict.SetStringPath("ocsp_response",
-                       PEMEncode(params.ocsp_response(), "OCSP RESPONSE"));
+    dict.SetStringPath("ocsp_response", PEMEncode(params.ocsp_response(),
+                                                  "NETLOG OCSP RESPONSE"));
   }
   if (!params.sct_list().empty()) {
-    dict.SetStringPath("sct_list", PEMEncode(params.sct_list(), "SCT LIST"));
+    dict.SetStringPath("sct_list",
+                       PEMEncode(params.sct_list(), "NETLOG SCT LIST"));
   }
   dict.SetPath("host", NetLogStringValue(params.hostname()));
   dict.SetIntPath("verifier_flags", params.flags());
@@ -283,7 +263,7 @@
   if (result != ERR_IO_PENDING) {
     LogMetrics();
     net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB,
-                      [&] { return CertVerifyResultParams(verify_result_); });
+                      [&] { return verify_result_.NetLogParams(result); });
   }
 
   return result;
@@ -294,7 +274,7 @@
 
   pending_request_.reset();  // Reset to signal clean completion.
   net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB,
-                    [&] { return CertVerifyResultParams(verify_result_); });
+                    [&] { return verify_result_.NetLogParams(result); });
 
   // It's possible that during the process of invoking a callback for a
   // Request, |this| may get deleted (along with the associated parent). If
diff --git a/net/cert/internal/simple_path_builder_delegate.h b/net/cert/internal/simple_path_builder_delegate.h
index ca76705b..3e57beade 100644
--- a/net/cert/internal/simple_path_builder_delegate.h
+++ b/net/cert/internal/simple_path_builder_delegate.h
@@ -34,6 +34,8 @@
 
     // Accepts everything that kStrong does, plus SHA1.
     kWeakAllowSha1,
+
+    kMaxValue = kWeakAllowSha1
   };
 
   // Error emitted when a public key is rejected because it is an RSA key with a
diff --git a/net/cert/internal/trust_store.h b/net/cert/internal/trust_store.h
index a7a7bc9..be7acbb 100644
--- a/net/cert/internal/trust_store.h
+++ b/net/cert/internal/trust_store.h
@@ -32,6 +32,8 @@
   // verification process. See VerifyCertificateChain() for details on how
   // constraints are applied.
   TRUSTED_ANCHOR_WITH_CONSTRAINTS,
+
+  LAST = TRUSTED_ANCHOR_WITH_CONSTRAINTS
 };
 
 // Describes the level of trust in a certificate. See CertificateTrustType for
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc
index cbea226..91b1c594 100644
--- a/net/cert/multi_threaded_cert_verifier.cc
+++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -17,6 +17,9 @@
 #include "net/cert/cert_verify_result.h"
 #include "net/cert/crl_set.h"
 #include "net/cert/x509_certificate.h"
+#include "net/log/net_log_event_type.h"
+#include "net/log/net_log_source_type.h"
+#include "net/log/net_log_with_source.h"
 
 namespace net {
 
@@ -35,6 +38,7 @@
 struct ResultHelper {
   int error;
   CertVerifyResult result;
+  NetLogWithSource net_log;
 };
 
 int GetFlagsForConfig(const CertVerifier::Config& config) {
@@ -62,14 +66,16 @@
     const std::string& sct_list,
     int flags,
     const scoped_refptr<CRLSet>& crl_set,
-    const CertificateList& additional_trust_anchors) {
+    const CertificateList& additional_trust_anchors,
+    const NetLogWithSource& net_log) {
   TRACE_EVENT0(NetTracingCategory(), "DoVerifyOnWorkerThread");
   auto verify_result = std::make_unique<ResultHelper>();
+  verify_result->net_log = net_log;
   MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives
       allow_base_sync_primitives;
   verify_result->error = verify_proc->Verify(
       cert.get(), hostname, ocsp_response, sct_list, flags, crl_set.get(),
-      additional_trust_anchors, &verify_result->result);
+      additional_trust_anchors, &verify_result->result, net_log);
   // The CertVerifyResult is created and populated on the worker thread and
   // then returned to the network thread. Detach now before returning the
   // result, since any further access will be on the network thread.
@@ -89,10 +95,15 @@
 
   void Start(const scoped_refptr<CertVerifyProc>& verify_proc,
              const CertVerifier::Config& config,
-             const CertVerifier::RequestParams& params);
+             const CertVerifier::RequestParams& params,
+             const NetLogWithSource& caller_net_log);
 
  private:
-  void OnJobComplete(std::unique_ptr<ResultHelper> verify_result);
+  // This is a static method with a |self| weak pointer instead of a regular
+  // method, so that PostTask will still run it even if the weakptr is no
+  // longer valid.
+  static void OnJobComplete(base::WeakPtr<InternalRequest> self,
+                            std::unique_ptr<ResultHelper> verify_result);
 
   CompletionOnceCallback callback_;
   CertVerifyResult* caller_result_;
@@ -108,7 +119,14 @@
 
 void InternalRequest::Start(const scoped_refptr<CertVerifyProc>& verify_proc,
                             const CertVerifier::Config& config,
-                            const CertVerifier::RequestParams& params) {
+                            const CertVerifier::RequestParams& params,
+                            const NetLogWithSource& caller_net_log) {
+  const NetLogWithSource net_log(NetLogWithSource::Make(
+      caller_net_log.net_log(), NetLogSourceType::CERT_VERIFIER_TASK));
+  net_log.BeginEvent(NetLogEventType::CERT_VERIFIER_TASK);
+  caller_net_log.AddEventReferencingSource(
+      NetLogEventType::CERT_VERIFIER_TASK_BOUND, net_log.source());
+
   int flags = GetFlagsForConfig(config);
   if (params.flags() & CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES) {
     flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_ENABLED;
@@ -121,16 +139,25 @@
       base::BindOnce(&DoVerifyOnWorkerThread, verify_proc, params.certificate(),
                      params.hostname(), params.ocsp_response(),
                      params.sct_list(), flags, config.crl_set,
-                     config.additional_trust_anchors),
+                     config.additional_trust_anchors, net_log),
       base::BindOnce(&InternalRequest::OnJobComplete,
                      weak_factory_.GetWeakPtr()));
 }
 
+// static
 void InternalRequest::OnJobComplete(
+    base::WeakPtr<InternalRequest> self,
     std::unique_ptr<ResultHelper> verify_result) {
-  *caller_result_ = verify_result->result;
-  // Note: May delete |this|.
-  std::move(callback_).Run(verify_result->error);
+  // Always log the EndEvent, even if the Request has been destroyed.
+  verify_result->net_log.EndEvent(NetLogEventType::CERT_VERIFIER_TASK);
+
+  // Check |self| weakptr and don't continue if the Request was destroyed.
+  if (!self)
+    return;
+
+  *self->caller_result_ = verify_result->result;
+  // Note: May delete |self|.
+  std::move(self->callback_).Run(verify_result->error);
 }
 
 }  // namespace
@@ -160,7 +187,7 @@
 
   std::unique_ptr<InternalRequest> request =
       std::make_unique<InternalRequest>(std::move(callback), verify_result);
-  request->Start(verify_proc_, config_, params);
+  request->Start(verify_proc_, config_, params, net_log);
   *out_req = std::move(request);
   return ERR_IO_PENDING;
 }
diff --git a/net/cert/multi_threaded_cert_verifier_unittest.cc b/net/cert/multi_threaded_cert_verifier_unittest.cc
index 933f84b..d070395e 100644
--- a/net/cert/multi_threaded_cert_verifier_unittest.cc
+++ b/net/cert/multi_threaded_cert_verifier_unittest.cc
@@ -39,7 +39,7 @@
 
 class MockCertVerifyProc : public CertVerifyProc {
  public:
-  MOCK_METHOD8(VerifyInternal,
+  MOCK_METHOD9(VerifyInternal,
                int(X509Certificate*,
                    const std::string&,
                    const std::string&,
@@ -47,7 +47,8 @@
                    int,
                    CRLSet*,
                    const CertificateList&,
-                   CertVerifyResult*));
+                   CertVerifyResult*,
+                   const NetLogWithSource&));
   MOCK_CONST_METHOD0(SupportsAdditionalTrustAnchors, bool());
 
  private:
@@ -79,7 +80,7 @@
         verifier_(mock_verify_proc_) {
     EXPECT_CALL(*mock_verify_proc_, SupportsAdditionalTrustAnchors())
         .WillRepeatedly(Return(true));
-    EXPECT_CALL(*mock_verify_proc_, VerifyInternal(_, _, _, _, _, _, _, _))
+    EXPECT_CALL(*mock_verify_proc_, VerifyInternal(_, _, _, _, _, _, _, _, _))
         .WillRepeatedly(
             DoAll(SetCertVerifyResult(), Return(ERR_CERT_COMMON_NAME_INVALID)));
   }
@@ -184,8 +185,9 @@
 
     verifier_.SetConfig(config);
 
-    EXPECT_CALL(*mock_verify_proc_,
-                VerifyInternal(_, _, _, _, test_config.expected_flag, _, _, _))
+    EXPECT_CALL(
+        *mock_verify_proc_,
+        VerifyInternal(_, _, _, _, test_config.expected_flag, _, _, _, _))
         .WillRepeatedly(
             DoAll(SetCertVerifyRevokedResult(), Return(ERR_CERT_REVOKED)));
 
diff --git a/net/cert/nss_cert_database_unittest.cc b/net/cert/nss_cert_database_unittest.cc
index 56b5cf7..d3b6bdd 100644
--- a/net/cert/nss_cert_database_unittest.cc
+++ b/net/cert/nss_cert_database_unittest.cc
@@ -29,6 +29,7 @@
 #include "net/cert/crl_set.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util_nss.h"
+#include "net/log/net_log_with_source.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/gtest_util.h"
 #include "net/test/test_data_directory.h"
@@ -567,7 +568,7 @@
   int error = verify_proc->Verify(
       x509_found_server_cert.get(), "127.0.0.1",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID));
   EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status);
 }
@@ -599,7 +600,7 @@
   int error = verify_proc->Verify(
       x509_puny_cert.get(), "xn--wgv71a119e.com",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID));
   EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result.cert_status);
 }
@@ -632,7 +633,7 @@
   int error = verify_proc->Verify(
       x509_puny_cert.get(), "xn--wgv71a119e.com",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_EQ(0U, verify_result.cert_status);
 }
@@ -668,7 +669,7 @@
   int error = verify_proc->Verify(
       x509_server_cert.get(), "127.0.0.1",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_EQ(0U, verify_result.cert_status);
 }
@@ -709,7 +710,7 @@
   int error = verify_proc->Verify(
       x509_server_cert.get(), "127.0.0.1",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_REVOKED));
   EXPECT_EQ(CERT_STATUS_REVOKED, verify_result.cert_status);
 }
@@ -759,7 +760,7 @@
   int error = verify_proc->Verify(
       x509_server_cert.get(), "127.0.0.1",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_EQ(0U, verify_result.cert_status);
 
@@ -785,7 +786,8 @@
   error = verify_proc->Verify(x509_server_cert.get(), "127.0.0.1",
                               /*ocsp_response=*/std::string(),
                               /*sct_list=*/std::string(), flags, crl_set_.get(),
-                              empty_cert_list_, &verify_result2);
+                              empty_cert_list_, &verify_result2,
+                              NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_REVOKED));
   EXPECT_EQ(CERT_STATUS_REVOKED, verify_result2.cert_status);
 }
@@ -826,7 +828,7 @@
   int error = verify_proc->Verify(
       x509_server_cert.get(), "127.0.0.1",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_EQ(0U, verify_result.cert_status);
 
@@ -839,7 +841,8 @@
   error = verify_proc->Verify(x509_server_cert.get(), "127.0.0.1",
                               /*ocsp_response=*/std::string(),
                               /*sct_list=*/std::string(), flags, crl_set_.get(),
-                              empty_cert_list_, &verify_result2);
+                              empty_cert_list_, &verify_result2,
+                              NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID));
   EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result2.cert_status);
 }
@@ -890,7 +893,7 @@
   int error = verify_proc->Verify(
       x509_server_cert.get(), "127.0.0.1",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_EQ(0U, verify_result.cert_status);
 
@@ -903,7 +906,8 @@
   error = verify_proc->Verify(x509_server_cert.get(), "127.0.0.1",
                               /*ocsp_response=*/std::string(),
                               /*sct_list=*/std::string(), flags, crl_set_.get(),
-                              empty_cert_list_, &verify_result2);
+                              empty_cert_list_, &verify_result2,
+                              NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_AUTHORITY_INVALID));
   EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, verify_result2.cert_status);
 }
@@ -954,7 +958,7 @@
   int error = verify_proc->Verify(
       x509_server_cert.get(), "127.0.0.1",
       /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
-      crl_set_.get(), empty_cert_list_, &verify_result);
+      crl_set_.get(), empty_cert_list_, &verify_result, NetLogWithSource());
   EXPECT_THAT(error, IsError(ERR_CERT_REVOKED));
   EXPECT_EQ(CERT_STATUS_REVOKED, verify_result.cert_status);
 
@@ -967,7 +971,8 @@
   error = verify_proc->Verify(x509_server_cert.get(), "127.0.0.1",
                               /*ocsp_response=*/std::string(),
                               /*sct_list=*/std::string(), flags, crl_set_.get(),
-                              empty_cert_list_, &verify_result2);
+                              empty_cert_list_, &verify_result2,
+                              NetLogWithSource());
   EXPECT_THAT(error, IsOk());
   EXPECT_EQ(0U, verify_result2.cert_status);
 }
diff --git a/net/cert/test_root_certs_unittest.cc b/net/cert/test_root_certs_unittest.cc
index 5740686..6cb28d8 100644
--- a/net/cert/test_root_certs_unittest.cc
+++ b/net/cert/test_root_certs_unittest.cc
@@ -14,6 +14,7 @@
 #include "net/cert/cert_verify_result.h"
 #include "net/cert/crl_set.h"
 #include "net/cert/x509_certificate.h"
+#include "net/log/net_log_with_source.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/gtest_util.h"
 #include "net/test/test_data_directory.h"
@@ -109,7 +110,7 @@
   int bad_status = verify_proc->Verify(
       test_cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, net::CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &bad_verify_result);
+      CertificateList(), &bad_verify_result, NetLogWithSource());
   EXPECT_NE(OK, bad_status);
   EXPECT_NE(0u, bad_verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID);
 
@@ -124,7 +125,7 @@
   int good_status = verify_proc->Verify(
       test_cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &good_verify_result);
+      CertificateList(), &good_verify_result, NetLogWithSource());
   EXPECT_THAT(good_status, IsOk());
   EXPECT_EQ(0u, good_verify_result.cert_status);
 
@@ -138,7 +139,7 @@
   int restored_status = verify_proc->Verify(
       test_cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, CRLSet::BuiltinCRLSet().get(),
-      CertificateList(), &restored_verify_result);
+      CertificateList(), &restored_verify_result, NetLogWithSource());
   EXPECT_NE(OK, restored_status);
   EXPECT_NE(0u,
             restored_verify_result.cert_status & CERT_STATUS_AUTHORITY_INVALID);
diff --git a/net/cert/trial_comparison_cert_verifier_unittest.cc b/net/cert/trial_comparison_cert_verifier_unittest.cc
index b3c304e..cab44903d 100644
--- a/net/cert/trial_comparison_cert_verifier_unittest.cc
+++ b/net/cert/trial_comparison_cert_verifier_unittest.cc
@@ -126,7 +126,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 
   // Runs on the main thread
   void VerifyCalled();
@@ -148,7 +149,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   *verify_result = result_;
   main_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&FakeCertVerifyProc::VerifyCalled, this));
@@ -179,7 +181,8 @@
                      int flags,
                      CRLSet* crl_set,
                      const CertificateList& additional_trust_anchors,
-                     CertVerifyResult* verify_result) override;
+                     CertVerifyResult* verify_result,
+                     const NetLogWithSource& net_log) override;
 
   DISALLOW_COPY_AND_ASSIGN(NotCalledCertVerifyProc);
 };
@@ -192,7 +195,8 @@
     int flags,
     CRLSet* crl_set,
     const CertificateList& additional_trust_anchors,
-    CertVerifyResult* verify_result) {
+    CertVerifyResult* verify_result,
+    const NetLogWithSource& net_log) {
   ADD_FAILURE() << "NotCalledCertVerifyProc was called!";
   return ERR_UNEXPECTED;
 }
@@ -206,7 +210,7 @@
   MockCertVerifyProc() = default;
   // CertVerifyProc implementation:
   bool SupportsAdditionalTrustAnchors() const override { return false; }
-  MOCK_METHOD8(VerifyInternal,
+  MOCK_METHOD9(VerifyInternal,
                int(X509Certificate* cert,
                    const std::string& hostname,
                    const std::string& ocsp_response,
@@ -214,7 +218,8 @@
                    int flags,
                    CRLSet* crl_set,
                    const CertificateList& additional_trust_anchors,
-                   CertVerifyResult* verify_result));
+                   CertVerifyResult* verify_result,
+                   const NetLogWithSource& net_log));
 
  protected:
   ~MockCertVerifyProc() override = default;
@@ -972,11 +977,11 @@
       base::MakeRefCounted<MockCertVerifyProc>();
   // Primary verifier returns ok status and chain1 if verifying the leaf alone.
   EXPECT_CALL(*verify_proc1,
-              VerifyInternal(leaf_cert_1_.get(), _, _, _, _, _, _, _))
+              VerifyInternal(leaf_cert_1_.get(), _, _, _, _, _, _, _, _))
       .WillOnce(DoAll(SetArgPointee<7>(chain1_result), Return(OK)));
   // Primary verifier returns ok status and chain2 if verifying chain2.
   EXPECT_CALL(*verify_proc1,
-              VerifyInternal(cert_chain_2_.get(), _, _, _, _, _, _, _))
+              VerifyInternal(cert_chain_2_.get(), _, _, _, _, _, _, _, _))
       .WillOnce(DoAll(SetArgPointee<7>(chain2_result), Return(OK)));
 
   // Trial verifier returns ok status and chain2.
@@ -1072,12 +1077,12 @@
       base::MakeRefCounted<MockCertVerifyProc>();
   // Primary verifier returns ok status and different_chain if verifying leaf
   // alone.
-  EXPECT_CALL(*verify_proc1, VerifyInternal(leaf.get(), _, _, _, _, _, _, _))
+  EXPECT_CALL(*verify_proc1, VerifyInternal(leaf.get(), _, _, _, _, _, _, _, _))
       .WillOnce(DoAll(SetArgPointee<7>(different_chain_result), Return(OK)));
   // Primary verifier returns ok status and nonev_chain_result if verifying
   // cert_chain.
   EXPECT_CALL(*verify_proc1,
-              VerifyInternal(cert_chain.get(), _, _, _, _, _, _, _))
+              VerifyInternal(cert_chain.get(), _, _, _, _, _, _, _, _))
       .WillOnce(DoAll(SetArgPointee<7>(nonev_chain_result), Return(OK)));
 
   // Trial verifier returns ok status and ev_chain_result.
@@ -1504,7 +1509,7 @@
   scoped_refptr<MockCertVerifyProc> verify_proc2 =
       base::MakeRefCounted<MockCertVerifyProc>();
   // Secondary verifier returns ok status...
-  EXPECT_CALL(*verify_proc2, VerifyInternal(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*verify_proc2, VerifyInternal(_, _, _, _, _, _, _, _, _))
       .WillOnce(DoAll(SetArgPointee<7>(ok_result), Return(OK)));
 
 #if defined(OS_MACOSX)
@@ -1513,7 +1518,7 @@
   EXPECT_CALL(
       *verify_proc2,
       VerifyInternal(_, _, _, _, CertVerifyProc::VERIFY_REV_CHECKING_ENABLED, _,
-                     _, _))
+                     _, _, _))
       .WillOnce(
           DoAll(SetArgPointee<7>(revoked_result), Return(ERR_CERT_REVOKED)));
 #endif
@@ -1579,7 +1584,7 @@
   // REV_CHECKING_ENABLED was passed.
   scoped_refptr<MockCertVerifyProc> verify_proc2 =
       base::MakeRefCounted<MockCertVerifyProc>();
-  EXPECT_CALL(*verify_proc2, VerifyInternal(_, _, _, _, _, _, _, _))
+  EXPECT_CALL(*verify_proc2, VerifyInternal(_, _, _, _, _, _, _, _, _))
 #if defined(OS_MACOSX)
       // The secondary should have been called twice on Mac due to attempting
       // the kIgnoredMacUndesiredRevocationCheckingWorkaround.
diff --git a/net/cert/x509_certificate_net_log_param.cc b/net/cert/x509_certificate_net_log_param.cc
index f77cb42..61faf8a 100644
--- a/net/cert/x509_certificate_net_log_param.cc
+++ b/net/cert/x509_certificate_net_log_param.cc
@@ -15,15 +15,13 @@
 
 namespace net {
 
-base::Value NetLogX509CertificateParams(const X509Certificate* certificate) {
-  base::Value dict(base::Value::Type::DICTIONARY);
+base::Value NetLogX509CertificateList(const X509Certificate* certificate) {
   base::Value certs(base::Value::Type::LIST);
   std::vector<std::string> encoded_chain;
   certificate->GetPEMEncodedChain(&encoded_chain);
   for (auto& pem : encoded_chain)
     certs.Append(std::move(pem));
-  dict.SetKey("certificates", std::move(certs));
-  return dict;
+  return certs;
 }
 
 }  // namespace net
diff --git a/net/cert/x509_certificate_net_log_param.h b/net/cert/x509_certificate_net_log_param.h
index 22dd9cc1..f5b91d5 100644
--- a/net/cert/x509_certificate_net_log_param.h
+++ b/net/cert/x509_certificate_net_log_param.h
@@ -17,19 +17,11 @@
 
 class X509Certificate;
 
-// Creates NetLog parameter to describe an X509Certificate.
-NET_EXPORT base::Value NetLogX509CertificateParams(
+// Creates a base::Value::Type::LIST NetLog parameter to describe an
+// X509Certificate chain.
+NET_EXPORT base::Value NetLogX509CertificateList(
     const X509Certificate* certificate);
 
-// Creates NetLog parameter to describe verification inputs: an X509Certificate,
-// hostname, VerifyFlags and optional OCSP response and SCT list.
-NET_EXPORT base::Value NetLogX509CertificateVerifyParams(
-    const X509Certificate* certificate,
-    const std::string& hostname,
-    int verify_flags,
-    const std::string& ocsp_response,
-    const std::string& sct_list);
-
 }  // namespace net
 
 #endif  // NET_CERT_X509_CERTIFICATE_NET_LOG_PARAM_H_
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h
index 5180a730..433f4a8 100644
--- a/net/log/net_log_event_type_list.h
+++ b/net/log/net_log_event_type_list.h
@@ -2847,6 +2847,7 @@
 //                                 has been installed locally. This is
 //                                 meaningless if the certificate was not
 //                                 trusted.>
+//     "net_error": <net error code returned from the verification.>
 //     "public_key_hashes": <If the certificate was successfully verified then
 //                           this contains the hashes, in several hash
 //                           algorithms, of the SubjectPublicKeyInfos of the
@@ -2870,6 +2871,127 @@
 //   }
 EVENT_TYPE(CERT_VERIFIER_REQUEST_BOUND_TO_JOB)
 
+// This event is created when a CertVerifier task is about to be posted.
+EVENT_TYPE(CERT_VERIFIER_TASK)
+
+// This event is created when a CertVerifier task is created for a job.
+//
+// The event parameters are:
+//   {
+//      "source_dependency": <Source identifier for the job we are bound to>,
+//   }
+EVENT_TYPE(CERT_VERIFIER_TASK_BOUND)
+
+// This event is created when CertVerifyProc is verifying a certificate.
+// The BEGIN phase event parameters are:
+// {
+//   "additional_trust_anchors": <Optionally, a list of PEM encoded
+//                                certificates to be used as trust anchors
+//                                in addition to the trust store.>
+//   "certificates": <A list of PEM encoded certificates, the first one
+//                    being the certificate to verify and the remaining
+//                    being intermediate certificates to assist path
+//                    building.>
+//   "crlset_sequence": <Sequence number of the CRLSet.>
+//   "crlset_is_expired": <Boolean indicating whether the CRLSet is considered
+//                         expired.>
+//   "ocsp_response": <Optionally, a PEM encoded stapled OCSP response.>
+//   "sct_list": <Optionally, a PEM encoded SignedCertificateTimestampList.>
+//   "host": <The hostname verification is being performed for.>
+//   "verify_flags": <The CertVerifyProc::VerifyFlags.>
+// }
+//
+// The END phase event parameters are:
+//   {
+//     "cert_status": <Bitmask of CERT_STATUS_*
+//                     from net/base/cert_status_flags.h>
+//     "has_md2": <True if a certificate in the certificate chain is signed with
+//                 a MD2 signature.>
+//     "has_md4": <True if a certificate in the certificate chain is signed with
+//                 a MD4 signature.>
+//     "has_md5": <True if a certificate in the certificate chain is signed with
+//                 a MD5 signature.>
+//     "is_issued_by_additional_trust_anchor": <True if the root CA used for
+//                                              this verification came from the
+//                                              list of additional trust
+//                                              anchors.>
+//     "is_issued_by_known_root": <True if we recognise the root CA as a
+//                                 standard root.  If it isn't then it's
+//                                 probably the case that this certificate
+//                                 was generated by a MITM proxy whose root
+//                                 has been installed locally. This is
+//                                 meaningless if the certificate was not
+//                                 trusted.>
+//     "net_error": <net error code returned from the verification.>
+//     "public_key_hashes": <If the certificate was successfully verified then
+//                           this contains the hashes, in several hash
+//                           algorithms, of the SubjectPublicKeyInfos of the
+//                           chain.>
+//     "verified_cert": <The certificate chain that was constructed
+//                       during verification. Note that though the verified
+//                       certificate will match the originally supplied
+//                       certificate, the intermediate certificates stored
+//                       within may be substantially different. In the event
+//                       of a verification failure, this will contain the
+//                       chain as supplied by the server. This may be NULL
+//                       if running within the sandbox.>
+//   }
+EVENT_TYPE(CERT_VERIFY_PROC)
+
+// This event is created for the target cert passed into CertVerifyProcBulitin.
+// The event parameters are:
+//   {
+//      "certificate": <The PEM encoded certificate.>
+//      "errors": <Optionally, a string describing any errors or warnings
+//                 encountered while parsing the certificate.>
+//   }
+EVENT_TYPE(CERT_VERIFY_PROC_TARGET_CERT)
+
+// This event is created for each additional certificate passed into
+// CertVerifyProcBulitin.
+// The parameters are the same as for CERT_VERIFY_PROC_TARGET_CERT.
+EVENT_TYPE(CERT_VERIFY_PROC_INPUT_CERT)
+
+// This event is created for each additional trust anchor passed into
+// CertVerifyProcBulitin.
+// The parameters are the same as for CERT_VERIFY_PROC_TARGET_CERT.
+EVENT_TYPE(CERT_VERIFY_PROC_ADDITIONAL_TRUST_ANCHOR)
+
+// This event is created for each path building attempt performed by
+// CertVerifyProcBulitin.
+// The BEGIN phase contains the following information:
+// {
+//      "digest_policy": <Specifies which digest methods are accepted in this
+//                        attempt.>
+//      "is_ev_attempt": <True if this is an EV verification attempt.>
+// }
+//
+// The END phase contains the following information:
+// {
+//      "best_result_index": <Index of the best path that was found.>
+//      "has_valid_path": <True if one of the paths found was valid and
+//                         trusted.>
+//      "exceeded_iteration_limit": <True if the iteration limit was exceeded
+//                                   during path building.>
+//      "exceeded_deadline": <True if the time limit was exceeded during path
+//                            building.>
+// }
+EVENT_TYPE(CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT)
+
+// This event is created for each path built during a
+// CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT.
+//
+// The event parameters are:
+//   {
+//      "certificates": <The certificate chain that was built.>
+//      "is_valid": <True if the chain is valid and trusted.>
+//      "last_cert_trust": <The trust setting found for the last cert in
+//                          the chain.>
+//      "errors": <Optionally, a string describing any errors or warnings
+//                 encountered while building or verifying the path.>
+//   }
+EVENT_TYPE(CERT_VERIFY_PROC_PATH_BUILT)
+
 // This event is created when a TrialComparisonCertVerifier starts a
 // verification using the trial verifier.
 //
diff --git a/net/log/net_log_source_type_list.h b/net/log/net_log_source_type_list.h
index f283199..ccde569 100644
--- a/net/log/net_log_source_type_list.h
+++ b/net/log/net_log_source_type_list.h
@@ -31,6 +31,7 @@
 SOURCE_TYPE(EXPONENTIAL_BACKOFF_THROTTLING)
 SOURCE_TYPE(UDP_SOCKET)
 SOURCE_TYPE(CERT_VERIFIER_JOB)
+SOURCE_TYPE(CERT_VERIFIER_TASK)
 SOURCE_TYPE(PROXY_CLIENT_SOCKET)
 SOURCE_TYPE(BIDIRECTIONAL_STREAM)
 SOURCE_TYPE(NETWORK_QUALITY_ESTIMATOR)
diff --git a/net/log/net_log_util.cc b/net/log/net_log_util.cc
index 8ead980..925abba2 100644
--- a/net/log/net_log_util.cc
+++ b/net/log/net_log_util.cc
@@ -20,6 +20,8 @@
 #include "net/base/load_states.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_verifier.h"
+#include "net/cert/internal/simple_path_builder_delegate.h"
+#include "net/cert/internal/trust_store.h"
 #include "net/disk_cache/disk_cache.h"
 #include "net/dns/host_cache.h"
 #include "net/dns/host_resolver.h"
@@ -170,6 +172,45 @@
     constants_dict->Set("certVerifierFlags", std::move(dict));
   }
 
+  {
+    std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
+
+    dict->SetInteger(
+        "kStrong",
+        static_cast<int>(SimplePathBuilderDelegate::DigestPolicy::kStrong));
+    dict->SetInteger(
+        "kWeakAllowSha1",
+        static_cast<int>(
+            SimplePathBuilderDelegate::DigestPolicy::kWeakAllowSha1));
+
+    static_assert(SimplePathBuilderDelegate::DigestPolicy::kMaxValue ==
+                      SimplePathBuilderDelegate::DigestPolicy::kWeakAllowSha1,
+                  "Update with new flags");
+
+    constants_dict->Set("certPathBuilderDigestPolicy", std::move(dict));
+  }
+
+  {
+    std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
+
+    dict->SetInteger("DISTRUSTED",
+                     static_cast<int>(CertificateTrustType::DISTRUSTED));
+    dict->SetInteger("UNSPECIFIED",
+                     static_cast<int>(CertificateTrustType::UNSPECIFIED));
+    dict->SetInteger("TRUSTED_ANCHOR",
+                     static_cast<int>(CertificateTrustType::TRUSTED_ANCHOR));
+    dict->SetInteger(
+        "TRUSTED_ANCHOR_WITH_CONSTRAINTS",
+        static_cast<int>(
+            CertificateTrustType::TRUSTED_ANCHOR_WITH_CONSTRAINTS));
+
+    static_assert(CertificateTrustType::LAST ==
+                      CertificateTrustType::TRUSTED_ANCHOR_WITH_CONSTRAINTS,
+                  "Update with new flags");
+
+    constants_dict->Set("certificateTrustType", std::move(dict));
+  }
+
   // Add a dictionary with information about the relationship between load flag
   // enums and their symbolic names.
   {
diff --git a/net/log/net_log_values.cc b/net/log/net_log_values.cc
index fdbb443d..d92d3fa 100644
--- a/net/log/net_log_values.cc
+++ b/net/log/net_log_values.cc
@@ -71,6 +71,10 @@
   return NetLogNumberValueHelper(num);
 }
 
+base::Value NetLogNumberValue(uint32_t num) {
+  return NetLogNumberValueHelper(num);
+}
+
 base::Value NetLogParamsWithInt(base::StringPiece name, int value) {
   base::Value params(base::Value::Type::DICTIONARY);
   params.SetIntKey(name, value);
diff --git a/net/log/net_log_values.h b/net/log/net_log_values.h
index a97be03..d7e5401 100644
--- a/net/log/net_log_values.h
+++ b/net/log/net_log_values.h
@@ -57,6 +57,7 @@
 // no loss of precision when de-serializing from JavaScript.
 NET_EXPORT base::Value NetLogNumberValue(int64_t num);
 NET_EXPORT base::Value NetLogNumberValue(uint64_t num);
+NET_EXPORT base::Value NetLogNumberValue(uint32_t num);
 
 }  // namespace net
 
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
index baddf65..568b2db 100644
--- a/net/socket/ssl_client_socket_impl.cc
+++ b/net/socket/ssl_client_socket_impl.cc
@@ -1170,7 +1170,9 @@
   }
 
   net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED, [&] {
-    return NetLogX509CertificateParams(server_cert_.get());
+    base::Value dict(base::Value::Type::DICTIONARY);
+    dict.SetKey("certificates", NetLogX509CertificateList(server_cert_.get()));
+    return dict;
   });
 
   // If the certificate is bad and has been previously accepted, use
diff --git a/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc b/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc
index e8be853..a26f07e 100644
--- a/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc
+++ b/net/tools/cert_verify_tool/verify_using_cert_verify_proc.cc
@@ -19,6 +19,7 @@
 #include "net/cert/test_root_certs.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
+#include "net/log/net_log_with_source.h"
 #include "net/tools/cert_verify_tool/cert_verify_tool_util.h"
 
 namespace {
@@ -171,12 +172,12 @@
     x509_additional_trust_anchors.clear();
   }
 
+  // TODO(crbug.com/634484): use a real netlog and print the results?
   net::CertVerifyResult result;
-  int rv =
-      cert_verify_proc->Verify(x509_target_and_intermediates.get(), hostname,
-                               /*ocsp_response=*/std::string(),
-                               /*sct_list=*/std::string(), flags, crl_set,
-                               x509_additional_trust_anchors, &result);
+  int rv = cert_verify_proc->Verify(
+      x509_target_and_intermediates.get(), hostname,
+      /*ocsp_response=*/std::string(), /*sct_list=*/std::string(), flags,
+      crl_set, x509_additional_trust_anchors, &result, net::NetLogWithSource());
 
   // Remove any temporary trust anchors.
   test_root_certs->Clear();
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc
index dee4555..3db44ab 100644
--- a/pdf/out_of_process_instance.cc
+++ b/pdf/out_of_process_instance.cc
@@ -1670,27 +1670,8 @@
     OnGeometryChanged(0, 0);
   }
 
-  pp::VarDictionary metadata_message;
-  metadata_message.Set(pp::Var(kType), pp::Var(kJSMetadataType));
-  const DocumentMetadata& metadata = engine_->GetDocumentMetadata();
-  HistogramEnumeration("PDF.Version", metadata.version);
-
-  const std::string& title = metadata.title;
-  if (!base::TrimWhitespace(base::UTF8ToUTF16(title), base::TRIM_ALL).empty())
-    metadata_message.Set(pp::Var(kJSTitle), pp::Var(title));
-
-  metadata_message.Set(
-      pp::Var(kJSCanSerializeDocument),
-      pp::Var(IsSaveDataSizeValid(engine_->GetLoadedByteSize())));
-
-  pp::VarArray bookmarks = engine_->GetBookmarks();
-  metadata_message.Set(pp::Var(kJSBookmarks), bookmarks);
-  PostMessage(metadata_message);
-
-  pp::VarDictionary progress_message;
-  progress_message.Set(pp::Var(kType), pp::Var(kJSLoadProgressType));
-  progress_message.Set(pp::Var(kJSProgressPercentage), pp::Var(100));
-  PostMessage(progress_message);
+  SendDocumentMetadata();
+  SendLoadingProgress(/*percentage=*/100);
 
   if (accessibility_state_ == ACCESSIBILITY_STATE_PENDING)
     LoadAccessibility();
@@ -1723,6 +1704,7 @@
   HistogramEnumerationDeprecated(
       "PDF.FormType", static_cast<int32_t>(document_features.form_type),
       static_cast<int32_t>(PDFEngine::FormType::kCount));
+  HistogramEnumeration("PDF.Version", engine_->GetDocumentMetadata().version);
 }
 
 void OutOfProcessInstance::RotateClockwise() {
@@ -1779,10 +1761,7 @@
   paint_manager_.InvalidateRect(pp::Rect(pp::Point(), plugin_size_));
 
   // Send a progress value of -1 to indicate a failure.
-  pp::VarDictionary message;
-  message.Set(pp::Var(kType), pp::Var(kJSLoadProgressType));
-  message.Set(pp::Var(kJSProgressPercentage), pp::Var(-1));
-  PostMessage(message);
+  SendLoadingProgress(-1);
 }
 
 void OutOfProcessInstance::PreviewDocumentLoadFailed() {
@@ -1844,10 +1823,7 @@
   // Avoid sending too many progress messages over PostMessage.
   if (progress > last_progress_sent_ + 1) {
     last_progress_sent_ = progress;
-    pp::VarDictionary message;
-    message.Set(pp::Var(kType), pp::Var(kJSLoadProgressType));
-    message.Set(pp::Var(kJSProgressPercentage), pp::Var(progress));
-    PostMessage(message);
+    SendLoadingProgress(progress);
   }
 }
 
@@ -2017,6 +1993,32 @@
   PostMessage(loaded_message);
 }
 
+void OutOfProcessInstance::SendDocumentMetadata() {
+  pp::VarDictionary metadata_message;
+  metadata_message.Set(pp::Var(kType), pp::Var(kJSMetadataType));
+
+  const std::string& title = engine_->GetDocumentMetadata().title;
+  if (!base::TrimWhitespace(base::UTF8ToUTF16(title), base::TRIM_ALL).empty())
+    metadata_message.Set(pp::Var(kJSTitle), pp::Var(title));
+
+  pp::VarArray bookmarks = engine_->GetBookmarks();
+  metadata_message.Set(pp::Var(kJSBookmarks), bookmarks);
+
+  metadata_message.Set(
+      pp::Var(kJSCanSerializeDocument),
+      pp::Var(IsSaveDataSizeValid(engine_->GetLoadedByteSize())));
+
+  PostMessage(metadata_message);
+}
+
+void OutOfProcessInstance::SendLoadingProgress(double percentage) {
+  DCHECK(percentage == -1 || (percentage >= 0 && percentage <= 100));
+  pp::VarDictionary progress_message;
+  progress_message.Set(pp::Var(kType), pp::Var(kJSLoadProgressType));
+  progress_message.Set(pp::Var(kJSProgressPercentage), pp::Var(percentage));
+  PostMessage(progress_message);
+}
+
 void OutOfProcessInstance::UserMetricsRecordAction(const std::string& action) {
   // TODO(raymes): Move this function to PPB_UMA_Private.
   pp::PDF::UserMetricsRecordAction(this, pp::Var(action));
diff --git a/pdf/out_of_process_instance.h b/pdf/out_of_process_instance.h
index 9294e951..028bb14 100644
--- a/pdf/out_of_process_instance.h
+++ b/pdf/out_of_process_instance.h
@@ -235,6 +235,13 @@
   // Send a notification that the print preview has loaded.
   void SendPrintPreviewLoadedNotification();
 
+  // Send document metadata. (e.g. PDF title and bookmarks.)
+  void SendDocumentMetadata();
+
+  // Send the loading progress, where |percentage| represents the progress, or
+  // -1 for loading error.
+  void SendLoadingProgress(double percentage);
+
   // Bound the given scroll offset to the document.
   pp::FloatPoint BoundScrollOffsetToDocument(
       const pp::FloatPoint& scroll_offset);
diff --git a/printing/emf_win.cc b/printing/emf_win.cc
index da060ce..b2e1ce5 100644
--- a/printing/emf_win.cc
+++ b/printing/emf_win.cc
@@ -75,13 +75,12 @@
   return !!hdc_;
 }
 
-bool Emf::InitFromData(const void* src_buffer, size_t src_buffer_size) {
+bool Emf::InitFromData(base::span<const uint8_t> data) {
   DCHECK(!emf_ && !hdc_);
-  if (!base::IsValueInRangeForNumericType<UINT>(src_buffer_size))
+  if (!base::IsValueInRangeForNumericType<UINT>(data.size()))
     return false;
 
-  emf_ = SetEnhMetaFileBits(static_cast<UINT>(src_buffer_size),
-                            reinterpret_cast<const BYTE*>(src_buffer));
+  emf_ = SetEnhMetaFileBits(static_cast<UINT>(data.size()), data.data());
   return !!emf_;
 }
 
diff --git a/printing/emf_win.h b/printing/emf_win.h
index 20356bb..d7cc329 100644
--- a/printing/emf_win.h
+++ b/printing/emf_win.h
@@ -52,7 +52,7 @@
 
   // Metafile methods.
   bool Init() override;
-  bool InitFromData(const void* src_buffer, size_t src_buffer_size) override;
+  bool InitFromData(base::span<const uint8_t> data) override;
 
   // Inserts a custom GDICOMMENT records indicating StartPage/EndPage calls
   // (since StartPage and EndPage do not work in a metafile DC). Only valid
diff --git a/printing/emf_win_unittest.cc b/printing/emf_win_unittest.cc
index 9be7d0e..2c4ac7ad 100644
--- a/printing/emf_win_unittest.cc
+++ b/printing/emf_win_unittest.cc
@@ -53,7 +53,6 @@
 
 TEST(EmfTest, DC) {
   // Simplest use case.
-  uint32_t size;
   std::vector<char> data;
   {
     Emf emf;
@@ -62,15 +61,16 @@
     // An empty EMF is invalid, so we put at least a rectangle in it.
     ::Rectangle(emf.context(), 10, 10, 190, 190);
     EXPECT_TRUE(emf.FinishDocument());
-    size = emf.GetDataSize();
+    uint32_t size = emf.GetDataSize();
     EXPECT_GT(size, EMF_HEADER_SIZE);
     EXPECT_TRUE(emf.GetDataAsVector(&data));
-    EXPECT_EQ(data.size(), size);
+    ASSERT_EQ(data.size(), size);
   }
 
   // Playback the data.
   Emf emf;
-  EXPECT_TRUE(emf.InitFromData(&data.front(), size));
+  // TODO(thestig): Make |data| uint8_t and avoid the base::as_bytes() call.
+  EXPECT_TRUE(emf.InitFromData(base::as_bytes(base::make_span(data))));
   HDC hdc = CreateCompatibleDC(nullptr);
   EXPECT_TRUE(hdc);
   RECT output_rect = {0, 0, 10, 10};
@@ -106,7 +106,7 @@
   ASSERT_TRUE(emf_data.size());
 
   Emf emf;
-  EXPECT_TRUE(emf.InitFromData(&emf_data[0], emf_data.size()));
+  EXPECT_TRUE(emf.InitFromData(base::as_bytes(base::make_span(emf_data))));
 
   // This will print to file. The reason is that when running inside a
   // unit_test, PrintingContext automatically dumps its files to the
@@ -137,7 +137,6 @@
       CreateDC(L"WINSPOOL", L"UnitTest Printer", nullptr, nullptr));
   if (!dc.Get())
     return;
-  uint32_t size;
   std::vector<char> data;
   {
     Emf emf;
@@ -152,9 +151,9 @@
     }
     EXPECT_EQ(3U, emf.GetPageCount());
     EXPECT_TRUE(emf.FinishDocument());
-    size = emf.GetDataSize();
+    uint32_t size = emf.GetDataSize();
     EXPECT_TRUE(emf.GetDataAsVector(&data));
-    EXPECT_EQ(data.size(), size);
+    ASSERT_EQ(data.size(), size);
   }
 
   // Playback the data.
@@ -163,7 +162,8 @@
   di.lpszDocName = L"Test Job";
   int job_id = ::StartDoc(dc.Get(), &di);
   Emf emf;
-  EXPECT_TRUE(emf.InitFromData(&data.front(), size));
+  // TODO(thestig): Make |data| uint8_t and avoid the base::as_bytes() call.
+  EXPECT_TRUE(emf.InitFromData(base::as_bytes(base::make_span(data))));
   EXPECT_TRUE(emf.SafePlayback(dc.Get()));
   ::EndDoc(dc.Get());
   // Since presumably the printer is not real, let us just delete the job from
diff --git a/printing/metafile.h b/printing/metafile.h
index d012d019..bf823ca 100644
--- a/printing/metafile.h
+++ b/printing/metafile.h
@@ -9,6 +9,7 @@
 
 #include <vector>
 
+#include "base/containers/span.h"
 #include "base/macros.h"
 #include "build/build_config.h"
 #include "printing/native_drawing_context.h"
@@ -114,10 +115,9 @@
   // rendering resources.
   virtual bool Init() = 0;
 
-  // Initializes the metafile with the data in |src_buffer|. Returns true
-  // on success.
+  // Initializes the metafile with |data|. Returns true on success.
   // Note: It should only be called from within the browser process.
-  virtual bool InitFromData(const void* src_buffer, size_t src_buffer_size) = 0;
+  virtual bool InitFromData(base::span<const uint8_t> data) = 0;
 
   // Prepares a context for rendering a new page with the given |page_size|,
   // |content_area| and a |scale_factor| to use for the drawing. The units are
diff --git a/printing/metafile_skia.cc b/printing/metafile_skia.cc
index d30994d..7baa981 100644
--- a/printing/metafile_skia.cc
+++ b/printing/metafile_skia.cc
@@ -108,10 +108,9 @@
 // TODO(halcanary): Create a Metafile class that only stores data.
 // Metafile::InitFromData is orthogonal to what the rest of
 // MetafileSkia does.
-bool MetafileSkia::InitFromData(const void* src_buffer,
-                                size_t src_buffer_size) {
+bool MetafileSkia::InitFromData(base::span<const uint8_t> data) {
   data_->data_stream = std::make_unique<SkMemoryStream>(
-      src_buffer, src_buffer_size, true /* copy_data? */);
+      data.data(), data.size(), /*copy_data=*/true);
   return true;
 }
 
@@ -289,7 +288,7 @@
     size_t length = data_->data_stream->getLength();
     std::vector<uint8_t> buffer(length);
     (void)WriteAssetToBuffer(data_->data_stream.get(), &buffer[0], length);
-    data_->pdf_cg.InitFromData(&buffer[0], length);
+    data_->pdf_cg.InitFromData(buffer);
   }
   return data_->pdf_cg.RenderPage(page_number, context, rect, params);
 }
diff --git a/printing/metafile_skia.h b/printing/metafile_skia.h
index 444ad96..eeff98a 100644
--- a/printing/metafile_skia.h
+++ b/printing/metafile_skia.h
@@ -38,7 +38,7 @@
 
   // Metafile methods.
   bool Init() override;
-  bool InitFromData(const void* src_buffer, size_t src_buffer_size) override;
+  bool InitFromData(base::span<const uint8_t> data) override;
 
   void StartPage(const gfx::Size& page_size,
                  const gfx::Rect& content_area,
diff --git a/printing/pdf_metafile_cg_mac.cc b/printing/pdf_metafile_cg_mac.cc
index 8370979..53420ab 100644
--- a/printing/pdf_metafile_cg_mac.cc
+++ b/printing/pdf_metafile_cg_mac.cc
@@ -88,20 +88,18 @@
   return true;
 }
 
-bool PdfMetafileCg::InitFromData(const void* src_buffer,
-                                 size_t src_buffer_size) {
+bool PdfMetafileCg::InitFromData(base::span<const uint8_t> data) {
   DCHECK(!context_.get());
   DCHECK(!pdf_data_.get());
 
-  if (!src_buffer || !src_buffer_size)
+  if (data.empty())
     return false;
 
-  if (!base::IsValueInRangeForNumericType<CFIndex>(src_buffer_size))
+  if (!base::IsValueInRangeForNumericType<CFIndex>(data.size()))
     return false;
 
-  pdf_data_.reset(CFDataCreateMutable(kCFAllocatorDefault, src_buffer_size));
-  CFDataAppendBytes(pdf_data_, static_cast<const UInt8*>(src_buffer),
-                    src_buffer_size);
+  pdf_data_.reset(CFDataCreateMutable(kCFAllocatorDefault, data.size()));
+  CFDataAppendBytes(pdf_data_, data.data(), data.size());
   return true;
 }
 
diff --git a/printing/pdf_metafile_cg_mac.h b/printing/pdf_metafile_cg_mac.h
index 4d3edd5..6a51669 100644
--- a/printing/pdf_metafile_cg_mac.h
+++ b/printing/pdf_metafile_cg_mac.h
@@ -24,7 +24,7 @@
 
   // Metafile methods.
   bool Init() override;
-  bool InitFromData(const void* src_buffer, size_t src_buffer_size) override;
+  bool InitFromData(base::span<const uint8_t> data) override;
   void StartPage(const gfx::Size& page_size,
                  const gfx::Rect& content_area,
                  float scale_factor) override;
diff --git a/printing/pdf_metafile_cg_mac_unittest.cc b/printing/pdf_metafile_cg_mac_unittest.cc
index bf50b1f..3b52c21 100644
--- a/printing/pdf_metafile_cg_mac_unittest.cc
+++ b/printing/pdf_metafile_cg_mac_unittest.cc
@@ -71,7 +71,8 @@
 
   // Test browser-side constructor.
   PdfMetafileCg pdf2;
-  EXPECT_TRUE(pdf2.InitFromData(&buffer.front(), size));
+  // TODO(thestig): Make |buffer| uint8_t and avoid the base::as_bytes() call.
+  EXPECT_TRUE(pdf2.InitFromData(base::as_bytes(base::make_span(buffer))));
 
   // Get the first 4 characters from pdf2.
   std::vector<char> buffer2(4, 0);
@@ -100,7 +101,7 @@
 
   // Initialize and check metafile.
   PdfMetafileCg pdf_cg;
-  ASSERT_TRUE(pdf_cg.InitFromData(pdf_data.data(), pdf_data.size()));
+  ASSERT_TRUE(pdf_cg.InitFromData(base::as_bytes(base::make_span(pdf_data))));
   ASSERT_EQ(5u, pdf_cg.GetPageCount());
 
   // Since the input into GetPageBounds() is a 1-indexed page number, 0 and 6
@@ -141,7 +142,7 @@
   constexpr int kExpectedWidth = 200;
   constexpr int kExpectedHeight = 300;
   PdfMetafileCg pdf_cg;
-  ASSERT_TRUE(pdf_cg.InitFromData(pdf_data.data(), pdf_data.size()));
+  ASSERT_TRUE(pdf_cg.InitFromData(base::as_bytes(base::make_span(pdf_data))));
   ASSERT_EQ(1u, pdf_cg.GetPageCount());
   gfx::Rect bounds = pdf_cg.GetPageBounds(1);
   ASSERT_EQ(0, bounds.x());
diff --git a/services/network/cert_verify_proc_chromeos.cc b/services/network/cert_verify_proc_chromeos.cc
index d559a2a..5ffb66a 100644
--- a/services/network/cert_verify_proc_chromeos.cc
+++ b/services/network/cert_verify_proc_chromeos.cc
@@ -48,7 +48,8 @@
     int flags,
     net::CRLSet* crl_set,
     const net::CertificateList& additional_trust_anchors,
-    net::CertVerifyResult* verify_result) {
+    net::CertVerifyResult* verify_result,
+    const net::NetLogWithSource& net_log) {
   ChainVerifyArgs chain_verify_args = {this, additional_trust_anchors};
 
   CERTChainVerifyCallback chain_verify_callback;
diff --git a/services/network/cert_verify_proc_chromeos.h b/services/network/cert_verify_proc_chromeos.h
index dcbfac5..1beafdd 100644
--- a/services/network/cert_verify_proc_chromeos.h
+++ b/services/network/cert_verify_proc_chromeos.h
@@ -41,7 +41,8 @@
                      int flags,
                      net::CRLSet* crl_set,
                      const net::CertificateList& additional_trust_anchors,
-                     net::CertVerifyResult* verify_result) override;
+                     net::CertVerifyResult* verify_result,
+                     const net::NetLogWithSource& net_log) override;
 
   // Check if the trust root of |current_chain| is allowed.
   // |is_chain_valid_arg| is actually a ChainVerifyArgs*, which is used to pass
diff --git a/services/network/cert_verify_proc_chromeos_unittest.cc b/services/network/cert_verify_proc_chromeos_unittest.cc
index 160198e..ec5fca4f 100644
--- a/services/network/cert_verify_proc_chromeos_unittest.cc
+++ b/services/network/cert_verify_proc_chromeos_unittest.cc
@@ -16,6 +16,7 @@
 #include "net/cert/nss_cert_database_chromeos.h"
 #include "net/cert/x509_util.h"
 #include "net/cert/x509_util_nss.h"
+#include "net/log/net_log_with_source.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/test_data_directory.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -106,11 +107,11 @@
       std::string* root_subject_name) {
     int flags = 0;
     net::CertVerifyResult verify_result;
-    int error = verify_proc->Verify(cert, "127.0.0.1",
-                                    /*ocsp_response=*/std::string(),
-                                    /*sct_list=*/std::string(), flags,
-                                    net::CRLSet::BuiltinCRLSet().get(),
-                                    additional_trust_anchors, &verify_result);
+    int error = verify_proc->Verify(
+        cert, "127.0.0.1",
+        /*ocsp_response=*/std::string(),
+        /*sct_list=*/std::string(), flags, net::CRLSet::BuiltinCRLSet().get(),
+        additional_trust_anchors, &verify_result, net::NetLogWithSource());
     if (!verify_result.verified_cert->intermediate_buffers().empty()) {
       root_subject_name->assign(GetSubjectCN(
           verify_result.verified_cert->intermediate_buffers().back().get()));
diff --git a/testing/buildbot/chrome.ci.json b/testing/buildbot/chrome.ci.json
index d1d98b4a..8ddf20a 100644
--- a/testing/buildbot/chrome.ci.json
+++ b/testing/buildbot/chrome.ci.json
@@ -2823,25 +2823,6 @@
           ],
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04",
-              "pool": "chrome.tests.template",
-              "ssd": "0"
-            }
-          ],
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index 73c87f1b..d956a46 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -2082,25 +2082,6 @@
           ],
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04",
-              "pool": "chrome.tests.template",
-              "ssd": "0"
-            }
-          ],
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index c4c0d141..54639a4 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -3608,65 +3608,6 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "os": "Ubuntu-16.04",
-              "pool": "chromium.tests.avd.template",
-              "ssd": "1"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android23.textpb",
           "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter"
         ],
@@ -7876,65 +7817,6 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "os": "Ubuntu-16.04",
-              "pool": "chromium.tests.avd.template",
-              "ssd": "1"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android28",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_28_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android28.textpb",
           "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter"
         ],
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 0f54cd4..94ea78c0 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -3978,52 +3978,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -6837,53 +6791,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84Z",
-              "device_os_type": "userdebug",
-              "device_type": "flo",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -10155,53 +10062,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY48I",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -13465,53 +13325,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY49B",
-              "device_os_type": "userdebug",
-              "device_type": "flo",
-              "os": "Android"
-            }
-          ],
-          "expiration": 21600,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -16925,52 +16738,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -20207,53 +19974,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MRA58Z",
-              "device_os_type": "userdebug",
-              "device_type": "flo",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -24638,52 +24358,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -29571,52 +29245,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -32824,52 +32452,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY48M",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -36114,53 +35696,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -40018,53 +39553,6 @@
       {
         "args": [
           "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "PQ3A.190801.002",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "walleye",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--gtest_filter=-AAudio/AudioOutputTest.Play200HzTone/0"
         ],
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index b04496a78..ce14accb 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -1755,23 +1755,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -3359,24 +3342,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.ci.json b/testing/buildbot/chromium.ci.json
index 8735781..9c45cfc03 100644
--- a/testing/buildbot/chromium.ci.json
+++ b/testing/buildbot/chromium.ci.json
@@ -4530,52 +4530,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -14083,23 +14037,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -15292,23 +15229,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -16192,23 +16112,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -17544,24 +17447,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -19247,24 +19132,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -26833,52 +26700,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -29692,53 +29513,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84Z",
-              "device_os_type": "userdebug",
-              "device_type": "flo",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -31813,26 +31587,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -33516,23 +33270,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -35144,26 +34881,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -37010,27 +36727,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -41516,6 +41212,34 @@
         },
         "test": "content_browsertests",
         "test_target": "//content/test:content_browsertests"
+      },
+      {
+        "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--disable-headless-mode",
+          "--no-xvfb"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "vulkan_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "intel-hd-630-ubuntu-stable",
+              "os": "linux-intel-stable",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vulkan_tests",
+        "test_target": "//gpu/vulkan:vulkan_tests"
       }
     ],
     "isolated_scripts": [
@@ -41923,6 +41647,34 @@
         },
         "test": "content_browsertests",
         "test_target": "//content/test:content_browsertests"
+      },
+      {
+        "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--disable-headless-mode",
+          "--no-xvfb"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "vulkan_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "nvidia-quadro-p400-ubuntu-stable",
+              "os": "linux-nvidia-stable",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vulkan_tests",
+        "test_target": "//gpu/vulkan:vulkan_tests"
       }
     ],
     "isolated_scripts": [
@@ -43732,27 +43484,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -46072,26 +45803,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -47644,24 +47355,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -49578,23 +49271,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -52865,53 +52541,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY48I",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -56175,53 +55804,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY49B",
-              "device_os_type": "userdebug",
-              "device_type": "flo",
-              "os": "Android"
-            }
-          ],
-          "expiration": 21600,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -58156,21 +57738,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -67311,24 +66878,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.10"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -69015,24 +68564,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.11"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -70719,24 +70250,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -72453,24 +71966,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -74194,24 +73689,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -75898,25 +75375,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -77707,24 +77165,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.14.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -79469,24 +78909,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.15"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -82586,52 +82008,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -85868,53 +85244,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MRA58Z",
-              "device_os_type": "userdebug",
-              "device_type": "flo",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -93003,52 +92332,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -96308,52 +95591,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -98239,23 +97476,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -99869,26 +99089,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -101473,23 +100673,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -102947,23 +102130,6 @@
           ],
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -104406,23 +103572,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -105899,23 +105048,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -107393,23 +106525,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -108605,18 +107720,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -109936,21 +109039,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -110971,18 +110059,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -112282,18 +111358,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -113518,18 +112582,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -114720,18 +113772,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -116306,24 +115346,6 @@
           ],
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -118126,24 +117148,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -119946,24 +118950,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -121416,18 +120402,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -122652,18 +121626,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -123888,18 +122850,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -125124,18 +124074,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -125641,6 +124579,1311 @@
       }
     ]
   },
+  "ToTiOS": {
+    "additional_compile_targets": [
+      "all"
+    ],
+    "isolated_scripts": [
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "base_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "base_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//base:base_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "boringssl_crypto_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "boringssl_crypto_tests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//third_party/boringssl:boringssl_crypto_tests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "boringssl_ssl_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "boringssl_ssl_tests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//third_party/boringssl:boringssl_ssl_tests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "components_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "components_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//components:components_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "crypto_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "crypto_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//crypto:crypto_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "gfx_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gfx_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ui/gfx:gfx_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "google_apis_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "google_apis_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//google_apis:google_apis_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_chrome_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_chrome_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/chrome/test:ios_chrome_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_net_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_net_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/net:ios_net_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_inttests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_inttests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web:ios_web_inttests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web:ios_web_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_view_inttests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_view_inttests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web_view:ios_web_view_inttests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "net_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "net_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//net:net_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "skia_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "skia_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//skia:skia_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "sql_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "sql_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//sql:sql_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ui_base_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ui_base_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ui/base:ui_base_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "url_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "url_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//url:url_unittests"
+      }
+    ]
+  },
+  "ToTiOSDevice": {
+    "additional_compile_targets": [
+      "base_unittests",
+      "boringssl_crypto_tests",
+      "boringssl_ssl_tests",
+      "components_unittests",
+      "crypto_unittests",
+      "gfx_unittests",
+      "google_apis_unittests",
+      "ios_chrome_unittests",
+      "ios_net_unittests",
+      "ios_web_inttests",
+      "ios_web_unittests",
+      "ios_web_view_inttests",
+      "net_unittests",
+      "skia_unittests",
+      "sql_unittests",
+      "ui_base_unittests",
+      "url_unittests"
+    ],
+    "isolated_scripts": [
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "base_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "base_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//base:base_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "boringssl_crypto_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "boringssl_crypto_tests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//third_party/boringssl:boringssl_crypto_tests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "boringssl_ssl_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "boringssl_ssl_tests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//third_party/boringssl:boringssl_ssl_tests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "components_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "components_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//components:components_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "crypto_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "crypto_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//crypto:crypto_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "gfx_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gfx_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ui/gfx:gfx_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "google_apis_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "google_apis_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//google_apis:google_apis_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_chrome_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_chrome_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/chrome/test:ios_chrome_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_net_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_net_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/net:ios_net_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_inttests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_inttests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web:ios_web_inttests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web:ios_web_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_view_inttests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_view_inttests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web_view:ios_web_view_inttests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "net_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "net_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//net:net_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "skia_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "skia_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//skia:skia_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "sql_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "sql_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//sql:sql_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ui_base_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ui_base_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ui/base:ui_base_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "url_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "url_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//url:url_unittests"
+      }
+    ]
+  },
   "UBSan Release": {
     "additional_compile_targets": [
       "chromium_builder_asan"
@@ -126524,23 +126767,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -128071,17 +128297,6 @@
         "swarming": {
           "can_use_on_swarming_builders": false
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -129225,18 +129440,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -139489,24 +139692,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -141572,24 +141757,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -143609,24 +143776,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-17134"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -145807,25 +145956,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -153728,18 +153858,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -155173,18 +155291,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -158186,52 +158292,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -161375,52 +161435,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -164931,53 +164945,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -167884,54 +167851,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "PQ3A.190801.002",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "walleye",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -172253,52 +172172,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -175506,52 +175379,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY48M",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -178796,53 +178623,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -183006,65 +182786,6 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android23.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "os": "Ubuntu-16.04",
-              "pool": "chromium.tests.avd.template",
-              "ssd": "1"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android23",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_23_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android23.textpb",
           "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter"
         ],
@@ -187330,53 +187051,6 @@
       {
         "args": [
           "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "PQ3A.190801.002",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "walleye",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--gtest_filter=-AAudio/AudioOutputTest.Play200HzTone/0"
         ],
@@ -191608,65 +191282,6 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "device_os": null,
-              "device_type": null,
-              "os": "Ubuntu-16.04",
-              "pool": "chromium.tests.avd.template",
-              "ssd": "1"
-            }
-          ],
-          "named_caches": [
-            {
-              "name": "avd_generic_android28",
-              "path": ".android"
-            },
-            {
-              "name": "system_images_android_28_google_apis_x86",
-              "path": ".emulator_sdk"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android28.textpb",
           "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter"
         ],
@@ -213213,23 +212828,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -214249,26 +213847,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--enable-features=BlinkHeapConcurrentMarking"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -215032,23 +214610,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -216315,24 +215876,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -217916,23 +217459,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -219520,24 +219046,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -221099,23 +220607,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -223025,24 +222516,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -226213,23 +225686,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-14.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -228220,23 +227676,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -229864,25 +229303,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -231383,25 +230803,6 @@
           "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.15"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -233522,23 +232923,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -236165,19 +235549,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 6fdc08f..844e651 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -881,23 +881,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -2533,24 +2516,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -4236,24 +4201,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -7003,52 +6950,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -10308,52 +10209,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -12239,23 +12094,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -13869,26 +13707,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -15473,23 +15291,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -16947,23 +16748,6 @@
           ],
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -18406,23 +18190,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -19899,23 +19666,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -21393,23 +21143,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -22605,18 +22338,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -23936,21 +23657,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -24971,18 +24677,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -26282,18 +25976,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -27518,18 +27200,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -28720,18 +28390,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -30306,24 +29964,6 @@
           ],
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -32126,24 +31766,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -33946,24 +33568,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -35416,18 +35020,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -36652,18 +36244,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -37888,18 +37468,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -39124,18 +38692,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -39641,6 +39197,1311 @@
       }
     ]
   },
+  "ToTiOS": {
+    "additional_compile_targets": [
+      "all"
+    ],
+    "isolated_scripts": [
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "base_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "base_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//base:base_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "boringssl_crypto_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "boringssl_crypto_tests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//third_party/boringssl:boringssl_crypto_tests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "boringssl_ssl_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "boringssl_ssl_tests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//third_party/boringssl:boringssl_ssl_tests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "components_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "components_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//components:components_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "crypto_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "crypto_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//crypto:crypto_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "gfx_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gfx_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ui/gfx:gfx_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "google_apis_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "google_apis_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//google_apis:google_apis_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_chrome_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_chrome_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/chrome/test:ios_chrome_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_net_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_net_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/net:ios_net_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_inttests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_inttests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web:ios_web_inttests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web:ios_web_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_view_inttests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_view_inttests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web_view:ios_web_view_inttests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "net_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "net_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//net:net_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "skia_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "skia_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//skia:skia_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "sql_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "sql_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//sql:sql_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ui_base_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ui_base_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ui/base:ui_base_unittests"
+      },
+      {
+        "args": [
+          "--platform",
+          "iPhone 6s",
+          "--version",
+          "13.3",
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "url_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "url_unittests_iPhone 6s 13.3",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//url:url_unittests"
+      }
+    ]
+  },
+  "ToTiOSDevice": {
+    "additional_compile_targets": [
+      "base_unittests",
+      "boringssl_crypto_tests",
+      "boringssl_ssl_tests",
+      "components_unittests",
+      "crypto_unittests",
+      "gfx_unittests",
+      "google_apis_unittests",
+      "ios_chrome_unittests",
+      "ios_net_unittests",
+      "ios_web_inttests",
+      "ios_web_unittests",
+      "ios_web_view_inttests",
+      "net_unittests",
+      "skia_unittests",
+      "sql_unittests",
+      "ui_base_unittests",
+      "url_unittests"
+    ],
+    "isolated_scripts": [
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "base_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "base_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//base:base_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "boringssl_crypto_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "boringssl_crypto_tests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//third_party/boringssl:boringssl_crypto_tests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "boringssl_ssl_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "boringssl_ssl_tests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//third_party/boringssl:boringssl_ssl_tests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "components_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "components_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//components:components_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "crypto_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "crypto_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//crypto:crypto_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "gfx_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gfx_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ui/gfx:gfx_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "google_apis_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "google_apis_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//google_apis:google_apis_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_chrome_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_chrome_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/chrome/test:ios_chrome_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_net_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_net_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/net:ios_net_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_inttests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_inttests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web:ios_web_inttests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web:ios_web_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ios_web_view_inttests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ios_web_view_inttests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ios/web_view:ios_web_view_inttests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "net_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "net_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//net:net_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "skia_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "skia_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//skia:skia_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "sql_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "sql_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//sql:sql_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "ui_base_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "ui_base_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//ui/base:ui_base_unittests"
+      },
+      {
+        "args": [
+          "--out-dir",
+          "${ISOLATED_OUTDIR}"
+        ],
+        "isolate_name": "url_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "url_unittests_iPhone 6S 12.3.1",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/mac_toolchain/${platform}",
+              "location": ".",
+              "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "device": "iPhone8,1",
+              "os": "Mac-10.14.6"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "xcode_ios_11c29",
+              "path": "Xcode.app"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//url:url_unittests"
+      }
+    ]
+  },
   "UBSanVptr Linux": {
     "gtest_tests": [
       {
@@ -40514,23 +41375,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -42107,23 +42951,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 5810429..c085ee02 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -1043,24 +1043,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.15"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -3233,17 +3215,6 @@
         "swarming": {
           "can_use_on_swarming_builders": false
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": false
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -4747,24 +4718,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-17134"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -8102,53 +8055,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -11055,54 +10961,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "PQ3A.190801.002",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "walleye",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -31100,23 +30958,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -32136,26 +31977,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--enable-features=BlinkHeapConcurrentMarking"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -32919,23 +32740,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -34202,24 +34006,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -35781,23 +35567,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -37707,24 +37476,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -39802,25 +39553,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -41321,25 +41053,6 @@
           "expiration": 21600,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.15"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -43285,19 +42998,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 644a9a3..b4c573d 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -10540,6 +10540,34 @@
         },
         "test": "content_browsertests",
         "test_target": "//content/test:content_browsertests"
+      },
+      {
+        "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--disable-headless-mode",
+          "--no-xvfb"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "vulkan_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "intel-hd-630-ubuntu-stable",
+              "os": "linux-intel-stable",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vulkan_tests",
+        "test_target": "//gpu/vulkan:vulkan_tests"
       }
     ],
     "isolated_scripts": [
@@ -10947,6 +10975,34 @@
         },
         "test": "content_browsertests",
         "test_target": "//content/test:content_browsertests"
+      },
+      {
+        "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--disable-headless-mode",
+          "--no-xvfb"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "vulkan_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "nvidia-quadro-p400-ubuntu-stable",
+              "os": "linux-nvidia-stable",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vulkan_tests",
+        "test_target": "//gpu/vulkan:vulkan_tests"
       }
     ],
     "isolated_scripts": [
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 8c22f212..e822e5ce 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -607,23 +607,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -1507,23 +1490,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -3775,24 +3741,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -5709,23 +5657,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -7603,23 +7534,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-14.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index cd3b220..05b5179 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -885,24 +885,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.10"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -2589,24 +2571,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.11"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -4293,24 +4257,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "os": "Mac-10.12.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -6027,24 +5973,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -7768,24 +7696,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -9472,25 +9382,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -11281,24 +11172,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.14.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 61c4583f..46dc8391 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -2105,52 +2105,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -4211,26 +4165,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -5890,23 +5824,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -7518,26 +7435,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -9384,27 +9281,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -11266,27 +11142,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -13028,26 +12883,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -14420,21 +14255,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -16735,52 +16555,6 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "media_service_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "args": [
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
             "media_unittests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
@@ -18707,23 +18481,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.try.json b/testing/buildbot/chromium.try.json
index 53a59a9..c4124fb 100644
--- a/testing/buildbot/chromium.try.json
+++ b/testing/buildbot/chromium.try.json
@@ -1119,24 +1119,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index d73ef5e..cb4e2ac 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -739,18 +739,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -2602,24 +2590,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -4685,24 +4655,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -6787,25 +6739,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-15063"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -8674,18 +8607,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
@@ -10119,18 +10040,6 @@
           "can_use_on_swarming_builders": true,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
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 543c8f8..0673a30 100644
--- a/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator.chrome_public_test_apk.filter
@@ -125,9 +125,5 @@
 # crbug.com/1063991
 -org.chromium.chrome.features.start_surface.StartSurfaceLayoutTest.testIncognitoToggle_tabCount
 
-# crbug.com/1064367
--org.chromium.chrome.features.start_surface.StartSurfaceLayoutTest.testSearchTermChip_adaptiveIcon
--org.chromium.chrome.features.start_surface.StartSurfaceLayoutTest.testSearchTermChip_withChip
-
 # crbug.com/1064058
 -org.chromium.chrome.features.start_surface.StartSurfaceLayoutTest.testRecycling_aspectRatioPoint75
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index a0bd353..f0deb0a 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1195,10 +1195,6 @@
     "script": "//tools/perf/contrib/media_router_benchmarks/run_benchmark.py",
     "type": "script",
   },
-  "media_service_unittests": {
-    "label": "//media/mojo/services:media_service_unittests",
-    "type": "console_test_launcher",
-  },
   "media_unittests": {
     "label": "//media:media_unittests",
     "type": "windowed_test_launcher",
@@ -1797,6 +1793,10 @@
     "script": "//chrome/test/vr/perf/vrcore_fps/run_vrcore_fps_test.py",
     "type": "script",
   },
+  "vulkan_tests": {
+    "label": "//gpu/vulkan:vulkan_tests",
+    "type": "windowed_test_launcher",
+  },
   "wayland_client_perftests": {
     "label": "//components/exo/wayland:wayland_client_perftests",
     "type": "windowed_test_launcher",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 7d9df885..c6dbb63c 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -698,7 +698,6 @@
       'latency_unittests': {},
       'libjingle_xmpp_unittests': {},
       'media_blink_unittests': {},
-      'media_service_unittests': {},
       'media_unittests': {},
       'midi_unittests': {},
       'mojo_unittests': {},
@@ -2131,6 +2130,17 @@
         'linux_args': [ '--no-xvfb' ],
         'test': 'content_browsertests',
       },
+      'vulkan_tests': {
+        'args': [
+          '--enable-gpu',
+          '--test-launcher-bot-mode',
+          '--test-launcher-jobs=1',
+          '--disable-headless-mode',
+        ],
+        'linux_args': [ '--no-xvfb' ],
+        'test': 'vulkan_tests',
+      },
+
     },
 
     'gpu_fyi_vulkan_swiftshader_gtests': {
@@ -2741,6 +2751,26 @@
       },
     },
 
+    'ios_clang_tests': {
+      'base_unittests': {},
+      'boringssl_crypto_tests': {},
+      'boringssl_ssl_tests': {},
+      'components_unittests': {},
+      'crypto_unittests': {},
+      'gfx_unittests': {},
+      'google_apis_unittests': {},
+      'ios_chrome_unittests': {},
+      'ios_net_unittests': {},
+      'ios_web_inttests': {},
+      'ios_web_unittests': {},
+      'ios_web_view_inttests': {},
+      'net_unittests': {},
+      'skia_unittests': {},
+      'sql_unittests': {},
+      'ui_base_unittests': {},
+      'url_unittests': {},
+    },
+
     'ios_common_tests': {
       'boringssl_crypto_tests': {},
       'boringssl_ssl_tests': {},
@@ -4757,6 +4787,22 @@
       },
     },
 
+    'ios_clang_tot_device_tests': {
+      'ios_clang_tests': {
+        'variants': [
+          'IPHONE_6S_12_3_1',
+        ],
+      }
+    },
+
+    'ios_clang_tot_sim_tests': {
+      'ios_clang_tests': {
+        'variants': [
+          'SIM_IPHONE_6S_13_3',
+        ]
+      }
+    },
+
     'ios_code_coverage_tests': {
       'ios_common_tests': {
         'variants': [
diff --git a/testing/buildbot/tryserver.chromium.mac.json b/testing/buildbot/tryserver.chromium.mac.json
index c2b1f0b..ca85641 100644
--- a/testing/buildbot/tryserver.chromium.mac.json
+++ b/testing/buildbot/tryserver.chromium.mac.json
@@ -870,24 +870,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "media_service_unittests",
-        "test_target": "//media/mojo/services:media_service_unittests"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "media_unittests",
         "test_target": "//media:media_unittests"
       },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index b5c075c7..fc3f0c59 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -9,6 +9,17 @@
 # * trailing commas are allowed.
 
 {
+    'IPHONE_6S_12_3_1': {
+        'swarming': {
+            'dimension_sets': [
+                {
+                    'os': 'iOS-12.3.1',
+                    'device': 'iPhone8,1'
+                }
+            ]
+        },
+        'identifier': 'iPhone 6S 12.3.1'
+    },
     'SIM_IPAD_AIR_2_12_4': {
         'args': [
             '--platform',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index a9552d0..d7414315d 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1200,6 +1200,50 @@
           'isolated_scripts': 'win_specific_isolated_scripts',
         },
       },
+      'ToTiOS': {
+        'additional_compile_targets': [
+          'all'
+        ],
+        'mixins': [
+          'mac_10.14',
+          'mac_toolchain',
+          'out_dir_arg',
+          'xcode_11c29',
+        ],
+        'test_suites': {
+          'isolated_scripts': 'ios_clang_tot_sim_tests'
+        }
+      },
+      'ToTiOSDevice': {
+        'additional_compile_targets': [
+          'base_unittests',
+          'boringssl_crypto_tests',
+          'boringssl_ssl_tests',
+          'components_unittests',
+          'crypto_unittests',
+          'gfx_unittests',
+          'google_apis_unittests',
+          'ios_chrome_unittests',
+          'ios_net_unittests',
+          'ios_web_inttests',
+          'ios_web_unittests',
+          'ios_web_view_inttests',
+          'net_unittests',
+          'skia_unittests',
+          'sql_unittests',
+          'ui_base_unittests',
+          'url_unittests'
+        ],
+        'mixins': [
+          'mac_10.14',
+          'mac_toolchain',
+          'out_dir_arg',
+          'xcode_11c29',
+        ],
+        'test_suites': {
+          'isolated_scripts': 'ios_clang_tot_device_tests'
+        },
+      },
       'UBSanVptr Linux': {
         'mixins': [
           'linux-xenial',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index e655c58..7ed9dafa 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3653,7 +3653,6 @@
                         "OmniboxOnFocusSuggestions",
                         "OmniboxRemoveSuggestionsFromClipboard",
                         "OmniboxRichEntitySuggestions",
-                        "OmniboxSuggestionTransparencyOptions",
                         "OmniboxUIExperimentMaxAutocompleteMatches",
                         "QueryInOmnibox"
                     ]
diff --git a/third_party/blink/public/strings/translations/blink_strings_am.xtb b/third_party/blink/public/strings/translations/blink_strings_am.xtb
index c9efd62..b96ddbf 100644
--- a/third_party/blink/public/strings/translations/blink_strings_am.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_am.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">የተዘጉ የሥዕል መግለጫ ጽሑፎችን ምናሌ ደብቅ</translation>
 <translation id="1729654308190250600">እባክዎ ባዶ ያልሆነ የኢሜይል አድራሻ ያስገቡ።</translation>
 <translation id="1758486001363313524">ሌላ...</translation>
+<translation id="1787192514241997742">ጠቅላላ ጊዜ፦ <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">የማንቂያ_መገናኛ</translation>
 <translation id="1821985195704844674">የዛፍ ፍርግርግ</translation>
 <translation id="1822429046913737220">ጥዋት/ከሰዓት</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ar.xtb b/third_party/blink/public/strings/translations/blink_strings_ar.xtb
index 03e8eded..14c7b1b 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ar.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ar.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">إخفاء قائمة مقاطع الترجمة والشرح</translation>
 <translation id="1729654308190250600">يُرجى إدخال عنوان البريد الإلكتروني وعدم ترك الحق فارغًا.</translation>
 <translation id="1758486001363313524">آخر...</translation>
+<translation id="1787192514241997742">الوقت الإجمالي: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">مربع حوار_للتنبيه</translation>
 <translation id="1821985195704844674">شبكة متفرعة</translation>
 <translation id="1822429046913737220">صباحًا/مساءً</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_az.xtb b/third_party/blink/public/strings/translations/blink_strings_az.xtb
index b9336f91..b63cbb4 100644
--- a/third_party/blink/public/strings/translations/blink_strings_az.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_az.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">bağlanmış subtitrlər menyusunu gizlədin</translation>
 <translation id="1729654308190250600">Boş olmayan e-poçt ünvanı daxil edin.</translation>
 <translation id="1758486001363313524">Digər...</translation>
+<translation id="1787192514241997742">cəmi vaxt: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">siqnal_dialoqu</translation>
 <translation id="1821985195704844674">ağac şəbəkəsi</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_be.xtb b/third_party/blink/public/strings/translations/blink_strings_be.xtb
index 5642134..b0d05dab 100644
--- a/third_party/blink/public/strings/translations/blink_strings_be.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_be.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">закрыць меню субцітраў</translation>
 <translation id="1729654308190250600">Увядзіце адрас электроннай пошты.</translation>
 <translation id="1758486001363313524">Іншая...</translation>
+<translation id="1787192514241997742">агульны час: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">дыялогавае_акно_абвесткі</translation>
 <translation id="1821985195704844674">сетка дрэва</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_bg.xtb b/third_party/blink/public/strings/translations/blink_strings_bg.xtb
index aa7f1f1e..c589c8a 100644
--- a/third_party/blink/public/strings/translations/blink_strings_bg.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_bg.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">скриване на менюто за надписи</translation>
 <translation id="1729654308190250600">Моля, въведете имейл адрес.</translation>
 <translation id="1758486001363313524">Други...</translation>
+<translation id="1787192514241997742">общо време: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">диалогов прозорец със сигнал</translation>
 <translation id="1821985195704844674">дървовидна таблица</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_cs.xtb b/third_party/blink/public/strings/translations/blink_strings_cs.xtb
index 173ebd4..908f2a8c 100644
--- a/third_party/blink/public/strings/translations/blink_strings_cs.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_cs.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">skrýt nabídku titulků</translation>
 <translation id="1729654308190250600">Vyplňte e-mailovou adresu.</translation>
 <translation id="1758486001363313524">Jiné…</translation>
+<translation id="1787192514241997742">celkový čas: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">dialog upozornění</translation>
 <translation id="1821985195704844674">stromová mřížka</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_da.xtb b/third_party/blink/public/strings/translations/blink_strings_da.xtb
index bcf378a..a2dccde 100644
--- a/third_party/blink/public/strings/translations/blink_strings_da.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_da.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">skjul menuen for undertekster</translation>
 <translation id="1729654308190250600">Angiv en mailadresse, der ikke er tom.</translation>
 <translation id="1758486001363313524">Andet...</translation>
+<translation id="1787192514241997742">tid i alt: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">trægitter</translation>
 <translation id="1822429046913737220">f.m./e.m.</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_de.xtb b/third_party/blink/public/strings/translations/blink_strings_de.xtb
index 896820b..5fc1642 100644
--- a/third_party/blink/public/strings/translations/blink_strings_de.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_de.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">Untertitelmenü ausblenden</translation>
 <translation id="1729654308190250600">Geben Sie eine E-Mail-Adresse ein.</translation>
 <translation id="1758486001363313524">Andere...</translation>
+<translation id="1787192514241997742">Gesamtzeit: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">Baumraster</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_es-419.xtb b/third_party/blink/public/strings/translations/blink_strings_es-419.xtb
index f1fbaf2d..35a11f9 100644
--- a/third_party/blink/public/strings/translations/blink_strings_es-419.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_es-419.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">oculta el menú de subtítulos opcionales</translation>
 <translation id="1729654308190250600">Ingresa una dirección de correo electrónico que no esté vacía.</translation>
 <translation id="1758486001363313524">Otra...</translation>
+<translation id="1787192514241997742">Tiempo total: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">cuadrícula de árbol</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_eu.xtb b/third_party/blink/public/strings/translations/blink_strings_eu.xtb
index 7c3eaf9..d36a9f5 100644
--- a/third_party/blink/public/strings/translations/blink_strings_eu.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_eu.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">ezkutatu azpitituluen menua</translation>
 <translation id="1729654308190250600">Idatzi helbide elektronikoa.</translation>
 <translation id="1758486001363313524">Beste batzuk…</translation>
+<translation id="1787192514241997742">iraupena, guztira: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">zuhaitz-sareta</translation>
 <translation id="1822429046913737220">AM//PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_fa.xtb b/third_party/blink/public/strings/translations/blink_strings_fa.xtb
index de37c8e4..60906a79 100644
--- a/third_party/blink/public/strings/translations/blink_strings_fa.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_fa.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">پنهان کردن منوی زیرنویس ناشنوایان</translation>
 <translation id="1729654308190250600">لطفاً یک نشانی ایمیل غیرخالی وارد کنید.</translation>
 <translation id="1758486001363313524">موارد دیگر...</translation>
+<translation id="1787192514241997742">زمان کل: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">شبکه درختی</translation>
 <translation id="1822429046913737220">ق.ظ/ب.ظ</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_fi.xtb b/third_party/blink/public/strings/translations/blink_strings_fi.xtb
index c8c7f95..94a131c 100644
--- a/third_party/blink/public/strings/translations/blink_strings_fi.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_fi.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">sulje tekstitysvalikko</translation>
 <translation id="1729654308190250600">Kirjoita ei-tyhjä sähköpostiosoite.</translation>
 <translation id="1758486001363313524">Muu...</translation>
+<translation id="1787192514241997742">kokonaisaika: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">ilmoitusvalintaikkuna</translation>
 <translation id="1821985195704844674">puuruudukko</translation>
 <translation id="1822429046913737220">AP/IP</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_fil.xtb b/third_party/blink/public/strings/translations/blink_strings_fil.xtb
index 5cbfe89..34ba2d47 100644
--- a/third_party/blink/public/strings/translations/blink_strings_fil.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_fil.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">itago ang menu ng mga nakasarang caption</translation>
 <translation id="1729654308190250600">Mangyaring maglagay ng isang non-empty na email address.</translation>
 <translation id="1758486001363313524">Iba pa...</translation>
+<translation id="1787192514241997742">kabuuang oras: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">tree grid</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_fr-CA.xtb b/third_party/blink/public/strings/translations/blink_strings_fr-CA.xtb
index c625d4f..8a94c77 100644
--- a/third_party/blink/public/strings/translations/blink_strings_fr-CA.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_fr-CA.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">masquer le menu des sous-titres</translation>
 <translation id="1729654308190250600">Veuillez entrer une adresse de courriel.</translation>
 <translation id="1758486001363313524">Autres...</translation>
+<translation id="1787192514241997742">durée totale : <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">boîte de dialogue d'alerte</translation>
 <translation id="1821985195704844674">arborescence</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_fr.xtb b/third_party/blink/public/strings/translations/blink_strings_fr.xtb
index 78c04425..d6fb70b4 100644
--- a/third_party/blink/public/strings/translations/blink_strings_fr.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_fr.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">masquer le menu des sous-titres</translation>
 <translation id="1729654308190250600">Veuillez saisir une adresse e-mail dans le champ correspondant.</translation>
 <translation id="1758486001363313524">Autre…</translation>
+<translation id="1787192514241997742">Durée totale : <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">arborescence</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_gl.xtb b/third_party/blink/public/strings/translations/blink_strings_gl.xtb
index 3e540b1..82d8e99 100644
--- a/third_party/blink/public/strings/translations/blink_strings_gl.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_gl.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">oculta o menú de subtítulos</translation>
 <translation id="1729654308190250600">Introduce un enderezo de correo electrónico que non estea baleiro.</translation>
 <translation id="1758486001363313524">Outras...</translation>
+<translation id="1787192514241997742">tempo total: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">grade en árbore</translation>
 <translation id="1822429046913737220">a.m./p.m.</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_hi.xtb b/third_party/blink/public/strings/translations/blink_strings_hi.xtb
index 40fc64c..91113ef 100644
--- a/third_party/blink/public/strings/translations/blink_strings_hi.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_hi.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">बंद कैप्शन मेन्यू छिपाएं</translation>
 <translation id="1729654308190250600">कृपया गैर-खाली ईमेल पता डालें.</translation>
 <translation id="1758486001363313524">अन्य...</translation>
+<translation id="1787192514241997742">कुल समय: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">सूचना संवाद</translation>
 <translation id="1821985195704844674">ट्री ग्रिड</translation>
 <translation id="1822429046913737220">पूर्वाह्न/अपराह्न</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_hy.xtb b/third_party/blink/public/strings/translations/blink_strings_hy.xtb
index caff9a3..c4d1db5b 100644
--- a/third_party/blink/public/strings/translations/blink_strings_hy.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_hy.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">թաքցնել փակված ենթագրերի ընտրացանկը</translation>
 <translation id="1729654308190250600">Էլփոստի հասցեի տողը չպետք է դատարկ լինի:</translation>
 <translation id="1758486001363313524">Այլ…</translation>
+<translation id="1787192514241997742">ընդհանուր ժամանակը` <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">ծանուցման երկխոսության պատուհան</translation>
 <translation id="1821985195704844674">ծառի տեսքով ցանց</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_id.xtb b/third_party/blink/public/strings/translations/blink_strings_id.xtb
index 5277592d4..57a330c 100644
--- a/third_party/blink/public/strings/translations/blink_strings_id.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_id.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">sembunyikan menu subtitel</translation>
 <translation id="1729654308190250600">Jangan mengosongkan bidang alamat email.</translation>
 <translation id="1758486001363313524">Lainnya...</translation>
+<translation id="1787192514241997742">waktu total: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">kisi pohon</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ja.xtb b/third_party/blink/public/strings/translations/blink_strings_ja.xtb
index 39f86de..7fe74c58 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ja.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ja.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">字幕メニューを表示しない</translation>
 <translation id="1729654308190250600">メール アドレスを入力してください。</translation>
 <translation id="1758486001363313524">その他...</translation>
+<translation id="1787192514241997742">合計時間: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">アラート ダイアログ</translation>
 <translation id="1821985195704844674">ツリーグリッド</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ka.xtb b/third_party/blink/public/strings/translations/blink_strings_ka.xtb
index 3465463..442be76 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ka.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ka.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">დახურული სუბტიტრების მენიუს დამალვა</translation>
 <translation id="1729654308190250600">გთხოვთ შეიყვანოთ შევსებული ელექტრონული ფოსტის მისამართი.</translation>
 <translation id="1758486001363313524">სხვა…</translation>
+<translation id="1787192514241997742">საერთო დრო: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">გაფრთხილების დიალოგი</translation>
 <translation id="1821985195704844674">ხისებრი ბადე</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_kk.xtb b/third_party/blink/public/strings/translations/blink_strings_kk.xtb
index 6fd076aa..1a473bbe 100644
--- a/third_party/blink/public/strings/translations/blink_strings_kk.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_kk.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">субтитрді жасыру мәзірі</translation>
 <translation id="1729654308190250600">Электрондық пошта мекенжайын енгізіңіз.</translation>
 <translation id="1758486001363313524">Басқа…</translation>
+<translation id="1787192514241997742">Жалпы уақыт: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">ескерту диалогтық терезесі</translation>
 <translation id="1821985195704844674">ағаш тәрізді тор</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_km.xtb b/third_party/blink/public/strings/translations/blink_strings_km.xtb
index b7ac6d0..f08460e 100644
--- a/third_party/blink/public/strings/translations/blink_strings_km.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_km.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">លាក់​ម៉ឺនុយចំណង​ជើង​បន្ថែម</translation>
 <translation id="1729654308190250600">សូមបញ្ចូលអាសយដ្ឋានអ៊ីម៉ែលដែលមិនទទេ</translation>
 <translation id="1758486001363313524">ផ្សេងទៀត...</translation>
+<translation id="1787192514241997742">រយៈពេល​សរុប៖ <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">ក្រឡាជាមែងធាង</translation>
 <translation id="1822429046913737220">ព្រឹក/ល្ងាច</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ko.xtb b/third_party/blink/public/strings/translations/blink_strings_ko.xtb
index b9bde97..2d55f121 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ko.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ko.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">자막 메뉴 숨기기</translation>
 <translation id="1729654308190250600">비어 있지 않은 이메일 주소를 입력해 주세요.</translation>
 <translation id="1758486001363313524">다른 일자...</translation>
+<translation id="1787192514241997742">총 시간: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">알림 대화상자</translation>
 <translation id="1821985195704844674">트리 격자</translation>
 <translation id="1822429046913737220">오전/오후</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ky.xtb b/third_party/blink/public/strings/translations/blink_strings_ky.xtb
index 2e8f330..6dc3f1a 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ky.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ky.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">коштомо жазуулар менюсун жашыруу</translation>
 <translation id="1729654308190250600">Бош эмес электрондук почта дарегин киргизиңиз.</translation>
 <translation id="1758486001363313524">Башка…</translation>
+<translation id="1787192514241997742">жалпы убакыт: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">айгай кабар_диалогу</translation>
 <translation id="1821985195704844674">дарак торчосу</translation>
 <translation id="1822429046913737220">күндүзгү-түнкү</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_lo.xtb b/third_party/blink/public/strings/translations/blink_strings_lo.xtb
index 8948efa7..d693e76 100644
--- a/third_party/blink/public/strings/translations/blink_strings_lo.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_lo.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">ເຊື່ອງເມນູຄໍາອະທິບາຍພາບ</translation>
 <translation id="1729654308190250600">ກະ​ລຸ​ນາ​ໃສ່​ທີ່​ຢູ່​ອີ​ເມວທີ່​ບໍ່​ວ່າງ​ເປົ່າ​.</translation>
 <translation id="1758486001363313524">ອື່ນ...</translation>
+<translation id="1787192514241997742">ເວລາທັງໝົດ: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">ກ່ອງໂຕ້ຕອບການເຕືອນ</translation>
 <translation id="1821985195704844674">ຕາໜ່າງຕົ້ນໄມ້</translation>
 <translation id="1822429046913737220">ໂມງເຊົ້າ/ໂມງແລງ</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_lv.xtb b/third_party/blink/public/strings/translations/blink_strings_lv.xtb
index 208ba81..206bc96 100644
--- a/third_party/blink/public/strings/translations/blink_strings_lv.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_lv.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">paslēpt slēgto parakstu izvēlni</translation>
 <translation id="1729654308190250600">Lūdzu, ievadiet e-pasta adresi.</translation>
 <translation id="1758486001363313524">Cits...</translation>
+<translation id="1787192514241997742">Kopējais laiks: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">brīdinājuma dialoglodziņš</translation>
 <translation id="1821985195704844674">koka režģis</translation>
 <translation id="1822429046913737220">priekšpusdienā/pēcpusdienā</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_mn.xtb b/third_party/blink/public/strings/translations/blink_strings_mn.xtb
index 2957b78..b3c29e70 100644
--- a/third_party/blink/public/strings/translations/blink_strings_mn.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_mn.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">хаалттай тайлбаруудын цэсийг нуух</translation>
 <translation id="1729654308190250600">Заавал имэйл хаяг оруулах ёстой.</translation>
 <translation id="1758486001363313524">Бусад ...</translation>
+<translation id="1787192514241997742">нийт хугацаа: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">анхааруулах_мэдэгдэл</translation>
 <translation id="1821985195704844674">шаталсан хүснэгт</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ms.xtb b/third_party/blink/public/strings/translations/blink_strings_ms.xtb
index d10b65c6..eb1f48e7 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ms.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ms.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">sembunyikan menu sari kata</translation>
 <translation id="1729654308190250600">Sila masukkan alamat e-mel bukan kosong.</translation>
 <translation id="1758486001363313524">Lain-lain...</translation>
+<translation id="1787192514241997742">jumlah masa: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">dialog_makluman</translation>
 <translation id="1821985195704844674">grid pohon</translation>
 <translation id="1822429046913737220">PG / P/M</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_my.xtb b/third_party/blink/public/strings/translations/blink_strings_my.xtb
index 8740832..fac0220 100644
--- a/third_party/blink/public/strings/translations/blink_strings_my.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_my.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">စာတန်းများမီနူးကို ဖျောက်ရန်</translation>
 <translation id="1729654308190250600">ကျေးဇူးပြု၍ ဗလာမဟုတ်သည့် အီးမေးလ် လိပ်စာ ရိုက်ထည့်ပါ။</translation>
 <translation id="1758486001363313524">အခြား...</translation>
+<translation id="1787192514241997742">စုစုပေါင်းအချိန်- <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">သတိပေးချက် ဒိုင်ယာလော့</translation>
 <translation id="1821985195704844674">သစ်ပင်ပုံစံဇယားကွက်</translation>
 <translation id="1822429046913737220">နံ။</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_pt-PT.xtb b/third_party/blink/public/strings/translations/blink_strings_pt-PT.xtb
index e0e7c333..6309ec6 100644
--- a/third_party/blink/public/strings/translations/blink_strings_pt-PT.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_pt-PT.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">ocultar menu de legendas ocultas</translation>
 <translation id="1729654308190250600">Introduza um endereço de email que não esteja vazio.</translation>
 <translation id="1758486001363313524">Outra...</translation>
+<translation id="1787192514241997742">tempo total: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">grelha de árvore</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ro.xtb b/third_party/blink/public/strings/translations/blink_strings_ro.xtb
index 0d6978a..c12a215 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ro.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ro.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">ascunde meniul de subtitrări</translation>
 <translation id="1729654308190250600">Introduceți o adresă de e-mail concretă.</translation>
 <translation id="1758486001363313524">Altele...</translation>
+<translation id="1787192514241997742">Durată totală: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">dialog de alertă</translation>
 <translation id="1821985195704844674">grilă arbore</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ru.xtb b/third_party/blink/public/strings/translations/blink_strings_ru.xtb
index 408283f..e0c80d6 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ru.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ru.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">скрыть меню субтитров</translation>
 <translation id="1729654308190250600">Введите адрес электронной почты.</translation>
 <translation id="1758486001363313524">Другое…</translation>
+<translation id="1787192514241997742">общее время: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">диалоговое окно оповещения</translation>
 <translation id="1821985195704844674">сетка в виде дерева</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_sk.xtb b/third_party/blink/public/strings/translations/blink_strings_sk.xtb
index 67f6b3b2e..df5962b 100644
--- a/third_party/blink/public/strings/translations/blink_strings_sk.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_sk.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">skryť ponuku skrytých titulkov</translation>
 <translation id="1729654308190250600">Zadajte e-mailovú adresu, ktorá nie je prázdna hodnota.</translation>
 <translation id="1758486001363313524">Iné...</translation>
+<translation id="1787192514241997742">celkový čas: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">dialóg_upozornenia</translation>
 <translation id="1821985195704844674">stromová mriežka</translation>
 <translation id="1822429046913737220">AM / PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_sq.xtb b/third_party/blink/public/strings/translations/blink_strings_sq.xtb
index 1ebf29b..d2be40a 100644
--- a/third_party/blink/public/strings/translations/blink_strings_sq.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_sq.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">fshih menynë e titrave</translation>
 <translation id="1729654308190250600">Fut një adresë mail-i jo boshe.</translation>
 <translation id="1758486001363313524">Tjetër...</translation>
+<translation id="1787192514241997742">koha totale: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">dialogu i sinjalizimit</translation>
 <translation id="1821985195704844674">rrjeta pemë</translation>
 <translation id="1822429046913737220">Paradite/Pasdite</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_sv.xtb b/third_party/blink/public/strings/translations/blink_strings_sv.xtb
index 3402832..8467b1e 100644
--- a/third_party/blink/public/strings/translations/blink_strings_sv.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_sv.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">dölj textningsmenyn</translation>
 <translation id="1729654308190250600">Ange en e-postadress som inte är tom.</translation>
 <translation id="1758486001363313524">Annat ...</translation>
+<translation id="1787192514241997742">total tid: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">varningsdialogruta</translation>
 <translation id="1821985195704844674">träddiagram</translation>
 <translation id="1822429046913737220">FM/EM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_th.xtb b/third_party/blink/public/strings/translations/blink_strings_th.xtb
index b6ce692..7332266 100644
--- a/third_party/blink/public/strings/translations/blink_strings_th.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_th.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">ซ่อนเมนูคำอธิบายภาพ</translation>
 <translation id="1729654308190250600">โปรดป้อนที่อยู่อีเมลที่ไม่ว่างเปล่า</translation>
 <translation id="1758486001363313524">อื่นๆ...</translation>
+<translation id="1787192514241997742">เวลารวม: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">แผนผังต้นไม้</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_tr.xtb b/third_party/blink/public/strings/translations/blink_strings_tr.xtb
index 96e6c81d..a11cdc7 100644
--- a/third_party/blink/public/strings/translations/blink_strings_tr.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_tr.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">altyazı menüsünü gizle</translation>
 <translation id="1729654308190250600">Lütfen e-posta adresini boş bırakmayın.</translation>
 <translation id="1758486001363313524">Diğer...</translation>
+<translation id="1787192514241997742">toplam süre: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">ağaç tablo</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_uk.xtb b/third_party/blink/public/strings/translations/blink_strings_uk.xtb
index c30bbf2..272a34e 100644
--- a/third_party/blink/public/strings/translations/blink_strings_uk.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_uk.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">сховати меню субтитрів</translation>
 <translation id="1729654308190250600">Введіть електронну адресу.</translation>
 <translation id="1758486001363313524">Інші...</translation>
+<translation id="1787192514241997742">загальний час: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">вікно сповіщення</translation>
 <translation id="1821985195704844674">сітка дерева</translation>
 <translation id="1822429046913737220">д.п./п.п.</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_ur.xtb b/third_party/blink/public/strings/translations/blink_strings_ur.xtb
index 0fb17d4..3db6882 100644
--- a/third_party/blink/public/strings/translations/blink_strings_ur.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_ur.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">سب ٹائٹلز مینو چھپائیں</translation>
 <translation id="1729654308190250600">براہ کرم ایک غیر خالی ای میل پتہ درج کریں</translation>
 <translation id="1758486001363313524">دیگر…</translation>
+<translation id="1787192514241997742">کل وقت: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">ٹری گرڈ</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_uz.xtb b/third_party/blink/public/strings/translations/blink_strings_uz.xtb
index 2066f29..87b1019 100644
--- a/third_party/blink/public/strings/translations/blink_strings_uz.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_uz.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">taglavha menyusini yopish</translation>
 <translation id="1729654308190250600">Bo‘sh bo‘lmagan e-pochta manzilini kiriting.</translation>
 <translation id="1758486001363313524">Boshqa...</translation>
+<translation id="1787192514241997742">umimiy vaqt: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">ogohlantirish muloqot oynasi</translation>
 <translation id="1821985195704844674">daraxtsimon jadval</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_vi.xtb b/third_party/blink/public/strings/translations/blink_strings_vi.xtb
index 05e3253..9ca9276 100644
--- a/third_party/blink/public/strings/translations/blink_strings_vi.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_vi.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">ẩn menu phụ đề chi tiết</translation>
 <translation id="1729654308190250600">Vui lòng nhập địa chỉ email không trống.</translation>
 <translation id="1758486001363313524">Khác...</translation>
+<translation id="1787192514241997742">tổng thời gian: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">alert_dialog</translation>
 <translation id="1821985195704844674">lưới dạng cây</translation>
 <translation id="1822429046913737220">SA/CH</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_zh-CN.xtb b/third_party/blink/public/strings/translations/blink_strings_zh-CN.xtb
index 4cf67757..d937d386 100644
--- a/third_party/blink/public/strings/translations/blink_strings_zh-CN.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_zh-CN.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">隐藏字幕菜单</translation>
 <translation id="1729654308190250600">请输入有效的电子邮件地址。</translation>
 <translation id="1758486001363313524">其他...</translation>
+<translation id="1787192514241997742">总时间:<ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">提醒对话框</translation>
 <translation id="1821985195704844674">树状网格</translation>
 <translation id="1822429046913737220">上午/下午</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_zh-HK.xtb b/third_party/blink/public/strings/translations/blink_strings_zh-HK.xtb
index 2bda4c2..b57304a 100644
--- a/third_party/blink/public/strings/translations/blink_strings_zh-HK.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_zh-HK.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">唔好顯示隱藏式字幕選單</translation>
 <translation id="1729654308190250600">請輸入一個非空的電郵地址。</translation>
 <translation id="1758486001363313524">其他日期…</translation>
+<translation id="1787192514241997742">總時間:<ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">警示對話方塊</translation>
 <translation id="1821985195704844674">樹狀目錄網格</translation>
 <translation id="1822429046913737220">上午/下午</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_zh-TW.xtb b/third_party/blink/public/strings/translations/blink_strings_zh-TW.xtb
index 16fb8bf..eb4a183 100644
--- a/third_party/blink/public/strings/translations/blink_strings_zh-TW.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_zh-TW.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">不要顯示隱藏式輔助字幕選單</translation>
 <translation id="1729654308190250600">請輸入電子郵件地址。</translation>
 <translation id="1758486001363313524">其他...</translation>
+<translation id="1787192514241997742">時間總計:<ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">警示對話方塊</translation>
 <translation id="1821985195704844674">樹狀目錄網格</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_zu.xtb b/third_party/blink/public/strings/translations/blink_strings_zu.xtb
index 992b7e8..3b2df40 100644
--- a/third_party/blink/public/strings/translations/blink_strings_zu.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_zu.xtb
@@ -23,6 +23,7 @@
 <translation id="1727886345390570319">fihla imenyu yamazwibela avaliwe</translation>
 <translation id="1729654308190250600">Sicela ufake ikheli le imeyili elinokuthile.</translation>
 <translation id="1758486001363313524">Okunye...</translation>
+<translation id="1787192514241997742">isikhathi esiphelele: <ph name="REMAINING_TIME" /></translation>
 <translation id="1806710327868736751">ingxoxo_yokwazisa</translation>
 <translation id="1821985195704844674">igridi yesihlahla</translation>
 <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.cc b/third_party/blink/renderer/core/animation/animation_timeline.cc
index 78a16ee8..df6a529 100644
--- a/third_party/blink/renderer/core/animation/animation_timeline.cc
+++ b/third_party/blink/renderer/core/animation/animation_timeline.cc
@@ -39,7 +39,7 @@
 }
 
 double AnimationTimeline::currentTime(bool& is_null) {
-  base::Optional<base::TimeDelta> result = CurrentTimeInternal();
+  base::Optional<base::TimeDelta> result = CurrentPhaseAndTime().time;
 
   is_null = !result.has_value();
   return result ? result->InMillisecondsF()
@@ -47,24 +47,24 @@
 }
 
 double AnimationTimeline::currentTime() {
-  base::Optional<base::TimeDelta> result = CurrentTimeInternal();
+  base::Optional<base::TimeDelta> result = CurrentPhaseAndTime().time;
   return result ? result->InMillisecondsF()
                 : std::numeric_limits<double>::quiet_NaN();
 }
 
 base::Optional<double> AnimationTimeline::CurrentTime() {
-  base::Optional<base::TimeDelta> result = CurrentTimeInternal();
+  base::Optional<base::TimeDelta> result = CurrentPhaseAndTime().time;
   return result ? base::make_optional(result->InMillisecondsF())
                 : base::nullopt;
 }
 
 base::Optional<double> AnimationTimeline::CurrentTimeSeconds() {
-  base::Optional<base::TimeDelta> result = CurrentTimeInternal();
+  base::Optional<base::TimeDelta> result = CurrentPhaseAndTime().time;
   return result ? base::make_optional(result->InSecondsF()) : base::nullopt;
 }
 
-String AnimationTimeline::phase() const {
-  switch (Phase()) {
+String AnimationTimeline::phase() {
+  switch (CurrentPhaseAndTime().phase) {
     case TimelinePhase::kInactive:
       return "inactive";
     case TimelinePhase::kBefore:
@@ -82,14 +82,15 @@
 }
 
 bool AnimationTimeline::NeedsAnimationTimingUpdate() {
-  if (CurrentTimeInternal() == last_current_time_internal_)
+  PhaseAndTime current_phase_and_time = CurrentPhaseAndTime();
+  if (current_phase_and_time == last_current_phase_and_time_)
     return false;
 
-  // We allow |last_current_time_internal_| to advance here when there
+  // We allow |last_current_phase_and_time_| to advance here when there
   // are no animations to allow animations spawned during style
   // recalc to not invalidate this flag.
   if (animations_needing_update_.IsEmpty())
-    last_current_time_internal_ = CurrentTimeInternal();
+    last_current_phase_and_time_ = current_phase_and_time;
 
   return !animations_needing_update_.IsEmpty();
 }
@@ -97,15 +98,15 @@
 void AnimationTimeline::ServiceAnimations(TimingUpdateReason reason) {
   TRACE_EVENT0("blink", "AnimationTimeline::serviceAnimations");
 
-  auto current_time_internal = CurrentTimeInternal();
+  auto current_phase_and_time = CurrentPhaseAndTime();
   bool maybe_update_compositor_scroll_timeline = false;
 
   if (IsScrollTimeline() &&
-      last_current_time_internal_ != current_time_internal) {
+      last_current_phase_and_time_ != current_phase_and_time) {
     maybe_update_compositor_scroll_timeline = true;
   }
 
-  last_current_time_internal_ = current_time_internal;
+  last_current_phase_and_time_ = current_phase_and_time;
 
   HeapVector<Member<Animation>> animations;
   animations.ReserveInitialCapacity(animations_needing_update_.size());
@@ -124,7 +125,7 @@
   }
 
   DCHECK_EQ(outdated_animation_count_, 0U);
-  DCHECK(last_current_time_internal_ == CurrentTimeInternal());
+  DCHECK(last_current_phase_and_time_ == CurrentPhaseAndTime());
 
 #if DCHECK_IS_ON()
   for (const auto& animation : animations_needing_update_)
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.h b/third_party/blink/renderer/core/animation/animation_timeline.h
index 20fac27..1c024f2 100644
--- a/third_party/blink/renderer/core/animation/animation_timeline.h
+++ b/third_party/blink/renderer/core/animation/animation_timeline.h
@@ -21,6 +21,17 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
+  struct PhaseAndTime {
+    TimelinePhase phase;
+    base::Optional<base::TimeDelta> time;
+    bool operator==(const PhaseAndTime& other) const {
+      return phase == other.phase && time == other.time;
+    }
+    bool operator!=(const PhaseAndTime& other) const {
+      return !(*this == other);
+    }
+  };
+
   AnimationTimeline(Document*);
   ~AnimationTimeline() override = default;
 
@@ -29,8 +40,7 @@
   base::Optional<double> CurrentTime();
   base::Optional<double> CurrentTimeSeconds();
 
-  String phase() const;
-  virtual TimelinePhase Phase() const = 0;
+  String phase();
 
   virtual bool IsDocumentTimeline() const { return false; }
   virtual bool IsScrollTimeline() const { return false; }
@@ -78,7 +88,7 @@
   void Trace(Visitor*) override;
 
  protected:
-  virtual base::Optional<base::TimeDelta> CurrentTimeInternal() = 0;
+  virtual PhaseAndTime CurrentPhaseAndTime() = 0;
   void RemoveReplacedAnimations();
 
   Member<Document> document_;
@@ -91,7 +101,7 @@
 
   std::unique_ptr<CompositorAnimationTimeline> compositor_timeline_;
 
-  base::Optional<base::TimeDelta> last_current_time_internal_;
+  base::Optional<PhaseAndTime> last_current_phase_and_time_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/document_animations_test.cc b/third_party/blink/renderer/core/animation/document_animations_test.cc
index 195ae86..f0ebf9c 100644
--- a/third_party/blink/renderer/core/animation/document_animations_test.cc
+++ b/third_party/blink/renderer/core/animation/document_animations_test.cc
@@ -23,7 +23,6 @@
   MockAnimationTimeline(Document* document) : AnimationTimeline(document) {}
 
   MOCK_CONST_METHOD0(IsActive, bool());
-  MOCK_CONST_METHOD0(Phase, TimelinePhase());
   MOCK_METHOD0(InitialStartTimeForAnimations,
                base::Optional<base::TimeDelta>());
   MOCK_METHOD0(NeedsAnimationTimingUpdate, bool());
@@ -37,7 +36,7 @@
   void Trace(Visitor* visitor) override { AnimationTimeline::Trace(visitor); }
 
  protected:
-  MOCK_METHOD0(CurrentTimeInternal, base::Optional<base::TimeDelta>());
+  MOCK_METHOD0(CurrentPhaseAndTime, PhaseAndTime());
 };
 
 class DocumentAnimationsTest : public RenderingTest {
diff --git a/third_party/blink/renderer/core/animation/document_timeline.cc b/third_party/blink/renderer/core/animation/document_timeline.cc
index 106bf2c..63dd9e74 100644
--- a/third_party/blink/renderer/core/animation/document_timeline.cc
+++ b/third_party/blink/renderer/core/animation/document_timeline.cc
@@ -167,30 +167,23 @@
   zero_time_ = base::TimeTicks() + origin_time_;
   zero_time_initialized_ = true;
   playback_rate_ = 1;
-  last_current_time_internal_.reset();
+  last_current_phase_and_time_.reset();
 }
 
 void DocumentTimeline::SetTimingForTesting(PlatformTiming* timing) {
   timing_ = timing;
 }
 
-base::Optional<base::TimeDelta> DocumentTimeline::CurrentTimeInternal() {
+AnimationTimeline::PhaseAndTime DocumentTimeline::CurrentPhaseAndTime() {
   if (!IsActive()) {
-    return base::nullopt;
+    return {TimelinePhase::kInactive, /*current_time*/ base::nullopt};
   }
 
   base::Optional<base::TimeDelta> result =
       playback_rate_ == 0
           ? ZeroTime().since_origin()
           : (CurrentAnimationTime(GetDocument()) - ZeroTime()) * playback_rate_;
-  return result;
-}
-
-TimelinePhase DocumentTimeline::Phase() const {
-  if (IsActive()) {
-    return TimelinePhase::kActive;
-  }
-  return TimelinePhase::kInactive;
+  return {TimelinePhase::kActive, result};
 }
 
 void DocumentTimeline::PauseAnimationsForTesting(double pause_time) {
@@ -202,7 +195,7 @@
 void DocumentTimeline::SetPlaybackRate(double playback_rate) {
   if (!IsActive())
     return;
-  base::TimeDelta current_time = CurrentTimeInternal().value();
+  base::TimeDelta current_time = CurrentPhaseAndTime().time.value();
   playback_rate_ = playback_rate;
   zero_time_ = playback_rate == 0 ? base::TimeTicks() + current_time
                                   : CurrentAnimationTime(GetDocument()) -
diff --git a/third_party/blink/renderer/core/animation/document_timeline.h b/third_party/blink/renderer/core/animation/document_timeline.h
index 87a65e0..2aa7eef 100644
--- a/third_party/blink/renderer/core/animation/document_timeline.h
+++ b/third_party/blink/renderer/core/animation/document_timeline.h
@@ -74,7 +74,6 @@
   Animation* Play(AnimationEffect*);
 
   bool IsActive() const override;
-  TimelinePhase Phase() const override;
   base::Optional<base::TimeDelta> InitialStartTimeForAnimations() override;
   bool HasPendingUpdates() const {
     return !animations_needing_update_.IsEmpty();
@@ -97,7 +96,7 @@
   void Trace(Visitor*) override;
 
  protected:
-  base::Optional<base::TimeDelta> CurrentTimeInternal() override;
+  PhaseAndTime CurrentPhaseAndTime() override;
 
  private:
   // Origin time for the timeline relative to the time origin of the document.
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.cc b/third_party/blink/renderer/core/animation/scroll_timeline.cc
index ca95e200..48238b9 100644
--- a/third_party/blink/renderer/core/animation/scroll_timeline.cc
+++ b/third_party/blink/renderer/core/animation/scroll_timeline.cc
@@ -162,14 +162,14 @@
 
 bool ScrollTimeline::IsActive() const {
   DCHECK(!IsSnapshottingAllowed() ||
-         (phase_and_time_snapshotted_ == ComputePhaseAndCurrentTime()));
+         (phase_and_time_snapshotted_ == ComputeCurrentPhaseAndTime()));
   return phase_and_time_snapshotted_.phase != TimelinePhase::kInactive;
 }
 
 void ScrollTimeline::Invalidate() {
   if (!IsSnapshottingAllowed())
     return;
-  if (phase_and_time_snapshotted_ == ComputePhaseAndCurrentTime())
+  if (phase_and_time_snapshotted_ == ComputeCurrentPhaseAndTime())
     return;
   SnapshotState();
   for (Animation* animation : animations_needing_update_)
@@ -198,25 +198,19 @@
          layout_box->GetScrollableArea();
 }
 
-TimelinePhase ScrollTimeline::Phase() const {
+AnimationTimeline::PhaseAndTime ScrollTimeline::CurrentPhaseAndTime() {
   DCHECK(!IsSnapshottingAllowed() ||
-         phase_and_time_snapshotted_ == ComputePhaseAndCurrentTime());
-  return phase_and_time_snapshotted_.phase;
+         phase_and_time_snapshotted_ == ComputeCurrentPhaseAndTime());
+  return phase_and_time_snapshotted_;
 }
 
-base::Optional<base::TimeDelta> ScrollTimeline::CurrentTimeInternal() {
-  DCHECK(!IsSnapshottingAllowed() ||
-         phase_and_time_snapshotted_ == ComputePhaseAndCurrentTime());
-  return phase_and_time_snapshotted_.current_time;
-}
-
-ScrollTimeline::PhaseAndTime ScrollTimeline::ComputePhaseAndCurrentTime()
+AnimationTimeline::PhaseAndTime ScrollTimeline::ComputeCurrentPhaseAndTime()
     const {
   // 1. If scroll timeline is inactive, return an unresolved time value.
   // https://github.com/WICG/scroll-animations/issues/31
   // https://wicg.github.io/scroll-animations/#current-time-algorithm
   if (!ComputeIsActive()) {
-    return {TimelinePhase::kInactive, base::nullopt};
+    return {TimelinePhase::kInactive, /*current_time*/ base::nullopt};
   }
   LayoutBox* layout_box = resolved_scroll_source_->GetLayoutBox();
   // 2. Otherwise, let current scroll offset be the current scroll offset of
@@ -267,13 +261,12 @@
 void ScrollTimeline::ScheduleNextService() {
   if (AnimationsNeedingUpdateCount() == 0)
     return;
-  // TODO(gerchiko): Phase also needs to be compared with the last phase.
-  if (ComputePhaseAndCurrentTime().current_time != last_current_time_internal_)
+  if (ComputeCurrentPhaseAndTime() != last_current_phase_and_time_)
     ScheduleServiceOnNextFrame();
 }
 
 void ScrollTimeline::SnapshotState() {
-  phase_and_time_snapshotted_ = ComputePhaseAndCurrentTime();
+  phase_and_time_snapshotted_ = ComputeCurrentPhaseAndTime();
 }
 
 Element* ScrollTimeline::scrollSource() {
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.h b/third_party/blink/renderer/core/animation/scroll_timeline.h
index f11abde..3f9c1c5 100644
--- a/third_party/blink/renderer/core/animation/scroll_timeline.h
+++ b/third_party/blink/renderer/core/animation/scroll_timeline.h
@@ -57,7 +57,6 @@
   // have a CSS layout box, or if its layout box is not a scroll container.
   // https://github.com/WICG/scroll-animations/issues/31
   bool IsActive() const override;
-  TimelinePhase Phase() const override;
   base::Optional<base::TimeDelta> InitialStartTimeForAnimations() override;
 
   void ScheduleNextService() override;
@@ -113,7 +112,7 @@
   static void Invalidate(Node* node);
 
  protected:
-  base::Optional<base::TimeDelta> CurrentTimeInternal() override;
+  PhaseAndTime CurrentPhaseAndTime() override;
 
  private:
   // https://wicg.github.io/scroll-animations/#avoiding-cycles
@@ -130,15 +129,7 @@
   Member<Element> scroll_source_;
   Member<Node> resolved_scroll_source_;
 
-  struct PhaseAndTime {
-    TimelinePhase phase;
-    base::Optional<base::TimeDelta> current_time;
-    bool operator==(const PhaseAndTime& other) const {
-      return phase == other.phase && current_time == other.current_time;
-    }
-  };
-
-  PhaseAndTime ComputePhaseAndCurrentTime() const;
+  PhaseAndTime ComputeCurrentPhaseAndTime() const;
 
   ScrollDirection orientation_;
   Member<CSSPrimitiveValue> start_scroll_offset_;
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 f861e72..c9145d5 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
@@ -395,7 +395,11 @@
   // subtree and we don't need to lock as a result.
   needs_deferred_not_intersecting_signal_ = false;
   UpdateLifecycleNotificationRegistration();
-  SetRenderAffectingState(RenderAffectingState::kIntersectsViewport, true);
+  // If we're not connected, then there is no need to change any state.
+  // This could be the case if we were disconnected while a viewport
+  // intersection notification was pending.
+  if (ConnectedToView())
+    SetRenderAffectingState(RenderAffectingState::kIntersectsViewport, true);
 }
 
 void DisplayLockContext::NotifyIsNotIntersectingViewport() {
@@ -404,6 +408,15 @@
     return;
   }
 
+  // We might have been disconnected while the intersection observation
+  // notification was pending. Ensure to unregister from lifecycle
+  // notifications if we're doing that, and early out.
+  if (!ConnectedToView()) {
+    needs_deferred_not_intersecting_signal_ = false;
+    UpdateLifecycleNotificationRegistration();
+    return;
+  }
+
   // There are two situations we need to consider here:
   // 1. We are off-screen but not nested in any other lock. This means we should
   //    re-lock (also verify that the reason we're in this state is that we're
@@ -415,7 +428,6 @@
   //    So, we simply delay this check to the next frame (via LocalFrameView),
   //    which will call this function again and so we can perform the check
   //    again.
-  DCHECK(ConnectedToView());
   auto* locked_ancestor =
       DisplayLockUtilities::NearestLockedExclusiveAncestor(*element_);
   if (locked_ancestor) {
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 20efa757..de17ebd 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -685,7 +685,17 @@
       mutation_observer_types_(0),
       visited_link_state_(MakeGarbageCollected<VisitedLinkState>(*this)),
       visually_ordered_(false),
-      ready_state_(kComplete),
+      // https://html.spec.whatwg.org/multipage/dom.html#current-document-readiness
+      // says the ready state starts as 'loading' if there's an associated
+      // parser and 'complete' otherwise. We don't know whether there's an
+      // associated parser here (we create the parser in ImplicitOpen). But
+      // waiting to set the ready state to 'loading' in ImplicitOpen fires a
+      // readystatechange event, which can be observed in the case where we
+      // reuse a window. If there's a window being reused, then there must be
+      // a frame, and if there's a frame, there must be an associated parser, so
+      // setting based on frame_ here is sufficient to ensure that the quirk of
+      // when we set the ready state is not web-observable.
+      ready_state_(frame_ ? kLoading : kComplete),
       parsing_state_(kFinishedParsing),
       contains_plugins_(false),
       ignore_destructive_write_count_(0),
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 5294afb..483b439f 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -911,6 +911,7 @@
   // https://html.spec.whatwg.org/C/#documentreadystate
   enum DocumentReadyState { kLoading, kInteractive, kComplete };
 
+  DocumentReadyState GetReadyState() const { return ready_state_; }
   void SetReadyState(DocumentReadyState);
   bool IsLoadCompleted() const;
 
diff --git a/third_party/blink/renderer/core/dom/document_timing.cc b/third_party/blink/renderer/core/dom/document_timing.cc
index 89e6da1..cb5d4b3 100644
--- a/third_party/blink/renderer/core/dom/document_timing.cc
+++ b/third_party/blink/renderer/core/dom/document_timing.cc
@@ -12,7 +12,10 @@
 
 namespace blink {
 
-DocumentTiming::DocumentTiming(Document& document) : document_(document) {}
+DocumentTiming::DocumentTiming(Document& document) : document_(document) {
+  if (document_->GetReadyState() == Document::kLoading)
+    MarkDomLoading();
+}
 
 void DocumentTiming::Trace(Visitor* visitor) {
   visitor->Trace(document_);
diff --git a/third_party/blink/renderer/core/frame/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation.cc
index c1e426e..62e4ed0 100644
--- a/third_party/blink/renderer/core/frame/deprecation.cc
+++ b/third_party/blink/renderer/core/frame/deprecation.cc
@@ -62,6 +62,7 @@
   kM81 = 81,
   kM82 = 82,
   kM83 = 83,
+  kM84 = 84,
 };
 
 // Returns estimated milestone dates as milliseconds since January 1, 1970.
@@ -99,11 +100,17 @@
     case kM80:
       return {2020, 2, 0, 4, 4};
     case kM81:
-      return {2020, 3, 0, 17, 4};
+      return {2020, 4, 0, 7, 4};
     case kM82:
-      return {2020, 4, 0, 28, 4};
+      // This release was cancelled, so this is the (new) M83 date.
+      // https://groups.google.com/a/chromium.org/d/msg/chromium-dev/N1NxbSVOZas/ySlEKDKkBgAJ
+      return {2020, 5, 0, 18, 4};
     case kM83:
-      return {2020, 6, 0, 9, 4};
+      return {2020, 5, 0, 18, 4};
+    case kM84:
+      // This release is not yet scheduled, so this date is a guess.
+      // https://groups.google.com/a/chromium.org/d/msg/chromium-dev/N1NxbSVOZas/ySlEKDKkBgAJ
+      return {2020, 6, 0, 29, 4};
   }
 
   NOTREACHED();
@@ -511,14 +518,14 @@
 
     case WebFeature::kCssStyleSheetReplaceWithImport:
       return {
-          "CssStyleSheetReplaceWithImport", kM83,
+          "CssStyleSheetReplaceWithImport", kM84,
           String::Format(
               "Support for calls to CSSStyleSheet.replace() with stylesheet "
               "text that includes @import has been deprecated, and will be "
               "removed in %s. See "
               "https://chromestatus.com/feature/4735925877735424 for more "
               "details.",
-              MilestoneString(kM83).Ascii().c_str())};
+              MilestoneString(kM84).Ascii().c_str())};
 
     // Features that aren't deprecated don't have a deprecation message.
     default:
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.cc b/third_party/blink/renderer/core/layout/layout_replaced.cc
index 2348987..e5b86b519 100644
--- a/third_party/blink/renderer/core/layout/layout_replaced.cc
+++ b/third_party/blink/renderer/core/layout/layout_replaced.cc
@@ -724,12 +724,14 @@
 
 static inline LayoutUnit ResolveWidthForRatio(LayoutUnit height,
                                               const FloatSize& aspect_ratio) {
-  return LayoutUnit(height * aspect_ratio.Width() / aspect_ratio.Height());
+  return LayoutUnit(height.ToDouble() * aspect_ratio.Width() /
+                    aspect_ratio.Height());
 }
 
 static inline LayoutUnit ResolveHeightForRatio(LayoutUnit width,
                                                const FloatSize& aspect_ratio) {
-  return LayoutUnit(width * aspect_ratio.Height() / aspect_ratio.Width());
+  return LayoutUnit(width.ToDouble() * aspect_ratio.Height() /
+                    aspect_ratio.Width());
 }
 
 LayoutUnit LayoutReplaced::ComputeConstrainedLogicalWidth(
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 237ac7b..be3ef4af 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1344,7 +1344,6 @@
 }
 
 void DocumentLoader::DidInstallNewDocument(Document* document) {
-  document->SetReadyState(Document::kLoading);
   if (content_security_policy_)
     document->BindContentSecurityPolicy();
 
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc
index e4af0e7..a5f02639 100644
--- a/third_party/blink/renderer/core/loader/image_loader.cc
+++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -307,6 +307,9 @@
 }
 
 bool ImageLoader::ImageIsPotentiallyAvailable() const {
+  bool is_lazyload = lazy_image_load_state_ == LazyImageLoadState::kDeferred &&
+                     was_fully_deferred_;
+
   bool image_has_loaded = image_content_ && !image_content_->IsLoading() &&
                           !image_content_->ErrorOccurred();
   bool image_still_loading = !image_has_loaded && HasPendingActivity() &&
@@ -329,7 +332,7 @@
   // ImageResourceContent has non-null image data associated with it, which
   // isn't folded into |image_has_loaded| above.
   return (image_has_loaded && image_has_image) || image_still_loading ||
-         image_is_document;
+         image_is_document || is_lazyload;
 }
 
 void ImageLoader::ClearImage() {
@@ -594,11 +597,16 @@
       new_image_content == old_image_content) {
     ToLayoutImage(element_->GetLayoutObject())->IntrinsicSizeChanged();
   } else {
+    bool is_lazyload =
+        lazy_image_load_state_ == LazyImageLoadState::kDeferred &&
+        was_fully_deferred_;
+
     // Loading didn't start (loading of images was disabled). We show fallback
     // contents here, while we don't dispatch an 'error' event etc., because
     // spec-wise the image remains in the "Unavailable" state.
     if (new_image_content &&
-        new_image_content->GetContentStatus() == ResourceStatus::kNotStarted)
+        new_image_content->GetContentStatus() == ResourceStatus::kNotStarted &&
+        !is_lazyload)
       NoImageResourceToLoad();
 
     if (pending_load_event_.IsActive())
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index cf5d358..025a405b 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -251,6 +251,12 @@
     full_context_.clip_changed |= cleared;
   }
 
+  CompositorElementId GetCompositorElementId(
+      CompositorElementIdNamespace namespace_id) const {
+    return CompositorElementIdFromUniqueObjectId(fragment_data_.UniqueId(),
+                                                 namespace_id);
+  }
+
   const LayoutObject& object_;
   // The tree builder context for the whole object.
   PaintPropertyTreeBuilderContext& full_context_;
@@ -535,8 +541,7 @@
       const auto& box_model = ToLayoutBoxModelObject(object_);
       TransformPaintPropertyNode::State state{
           FloatSize(box_model.StickyPositionOffset())};
-      state.compositor_element_id = CompositorElementIdFromUniqueObjectId(
-          box_model.UniqueId(),
+      state.compositor_element_id = GetCompositorElementId(
           CompositorElementIdNamespace::kStickyTranslation);
 
       auto* layer = box_model.Layer();
@@ -802,8 +807,8 @@
           object_.HasHiddenBackface()
               ? TransformPaintPropertyNode::BackfaceVisibility::kHidden
               : TransformPaintPropertyNode::BackfaceVisibility::kVisible;
-      state.compositor_element_id = CompositorElementIdFromUniqueObjectId(
-          object_.UniqueId(), CompositorElementIdNamespace::kPrimaryTransform);
+      state.compositor_element_id = GetCompositorElementId(
+          CompositorElementIdNamespace::kPrimaryTransform);
 
       TransformPaintPropertyNode::AnimationState animation_state;
       animation_state.is_running_animation_on_compositor =
@@ -1046,8 +1051,8 @@
 
       CompositorElementId mask_compositor_element_id;
       if (mask_clip || has_spv1_composited_clip_path) {
-        mask_compositor_element_id = CompositorElementIdFromUniqueObjectId(
-            object_.UniqueId(), CompositorElementIdNamespace::kEffectMask);
+        mask_compositor_element_id =
+            GetCompositorElementId(CompositorElementIdNamespace::kEffectMask);
       }
 
       EffectPaintPropertyNode::State state;
@@ -1084,15 +1089,15 @@
           full_context_.direct_compositing_reasons &
           CompositingReasonsForEffectProperty();
       if (state.direct_compositing_reasons) {
-        state.compositor_element_id = CompositorElementIdFromUniqueObjectId(
-            object_.UniqueId(), CompositorElementIdNamespace::kPrimaryEffect);
+        state.compositor_element_id = GetCompositorElementId(
+            CompositorElementIdNamespace::kPrimaryEffect);
       } else {
         // The effect node CompositorElementId is used to uniquely identify
         // renderpasses so even if we don't need one for animations we still
         // need to set an id. Using kPrimary avoids confusing cc::Animation
         // into thinking the element has been composited for animations.
-        state.compositor_element_id = CompositorElementIdFromUniqueObjectId(
-            object_.UniqueId(), CompositorElementIdNamespace::kPrimary);
+        state.compositor_element_id =
+            GetCompositorElementId(CompositorElementIdNamespace::kPrimary);
       }
 
       // TODO(crbug.com/900241): Remove these setters when we can use
@@ -1149,10 +1154,8 @@
         clip_path_state.local_transform_space = context_.current.transform;
         clip_path_state.output_clip = output_clip;
         clip_path_state.blend_mode = SkBlendMode::kDstIn;
-        clip_path_state.compositor_element_id =
-            CompositorElementIdFromUniqueObjectId(
-                object_.UniqueId(),
-                CompositorElementIdNamespace::kEffectClipPath);
+        clip_path_state.compositor_element_id = GetCompositorElementId(
+            CompositorElementIdNamespace::kEffectClipPath);
         OnUpdate(
             properties_->UpdateClipPath(parent, std::move(clip_path_state)));
       } else {
@@ -1266,8 +1269,8 @@
       state.direct_compositing_reasons =
           full_context_.direct_compositing_reasons &
           CompositingReasonsForFilterProperty();
-      state.compositor_element_id = CompositorElementIdFromUniqueObjectId(
-          object_.UniqueId(), CompositorElementIdNamespace::kEffectFilter);
+      state.compositor_element_id =
+          GetCompositorElementId(CompositorElementIdNamespace::kEffectFilter);
 
       // TODO(crbug.com/900241): Remove the setter when we can use
       // state.direct_compositing_reasons to check for active animations.
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
index 27f58ff3..ad245c6 100644
--- a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
+++ b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
@@ -231,7 +231,7 @@
     return presentation_time_;
 
   base::TimeDelta time_offset =
-      GetDocument().Timeline().CurrentTimeInternal().value_or(
+      GetDocument().Timeline().CurrentPhaseAndTime().time.value_or(
           base::TimeDelta()) -
       reference_time_;
   DCHECK_GE(time_offset, base::TimeDelta());
@@ -260,8 +260,9 @@
 }
 
 void SMILTimeContainer::SynchronizeToDocumentTimeline() {
-  reference_time_ = GetDocument().Timeline().CurrentTimeInternal().value_or(
-      base::TimeDelta());
+  reference_time_ =
+      GetDocument().Timeline().CurrentPhaseAndTime().time.value_or(
+          base::TimeDelta());
 }
 
 bool SMILTimeContainer::IsPaused() const {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 9062c639..65659087 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -2791,14 +2791,22 @@
 }
 
 bool AXObject::IsUserScrollable() const {
-  if (!GetScrollableAreaIfScrollable() || !GetLayoutObject())
-    return false;
+  // TODO(accessibility) Actually expose correct info on whether a doc is
+  // is scrollable or not. Unfortunately IsScrollableContainer() always returns
+  // true anyway. For now, just expose as scrollable unless overflow is hidden.
+  if (IsWebArea()) {
+    if (!GetScrollableAreaIfScrollable() || !GetLayoutObject())
+      return false;
 
-  const ComputedStyle* style = GetLayoutObject()->Style();
-  if (!style)
-    return false;
+    const ComputedStyle* style = GetLayoutObject()->Style();
+    if (!style)
+      return false;
 
-  return style->ScrollsOverflowY() || style->ScrollsOverflowX();
+    return style->ScrollsOverflowY() || style->ScrollsOverflowX();
+  }
+
+  return GetLayoutObject() && GetLayoutObject()->IsBox() &&
+         ToLayoutBox(GetLayoutObject())->CanBeScrolledAndHasScrollableArea();
 }
 
 IntPoint AXObject::GetScrollOffset() const {
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
index 07ded51..1164ddb 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -1049,11 +1049,20 @@
   BuildEffectNodesRecursively(*next_effect.Parent());
   DCHECK_EQ(&next_effect.Parent()->Unalias(), current_.effect);
 
-#if DCHECK_IS_ON()
-  DCHECK(!GetEffectTree().Node(next_effect.CcNodeId(new_sequence_number_)))
-      << "Malformed paint artifact. Paint chunks under the same effect should "
-         "be contiguous.";
-#endif
+  bool has_multiple_groups = false;
+  if (GetEffectTree().Node(next_effect.CcNodeId(new_sequence_number_))) {
+    if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) {
+      // TODO(crbug.com/1064341): We have to allow one blink effect node to
+      // apply to multiple groups in block fragments (multicol, etc.) due to
+      // the current FragmentClip implementation. This can only be fixed by
+      // LayoutNG block fragments. For now we'll create multiple cc effect
+      // nodes in the case.
+      has_multiple_groups = true;
+    } else {
+      NOTREACHED() << "Malformed paint artifact. Paint chunks under the same"
+                      " effect should be contiguous.";
+    }
+  }
 
   auto backdrop_effect_state = kNoBackdropEffect;
   int output_clip_id = 0;
@@ -1080,14 +1089,16 @@
   int effect_node_id =
       GetEffectTree().Insert(cc::EffectNode(), current_.effect_id);
   auto& effect_node = *GetEffectTree().Node(effect_node_id);
-  next_effect.SetCcNodeId(new_sequence_number_, effect_node_id);
+
+  if (!has_multiple_groups)
+    next_effect.SetCcNodeId(new_sequence_number_, effect_node_id);
 
   PopulateCcEffectNode(effect_node, next_effect, output_clip_id,
                        backdrop_effect_state);
 
   CompositorElementId compositor_element_id =
       next_effect.GetCompositorElementId();
-  if (compositor_element_id) {
+  if (compositor_element_id && !has_multiple_groups) {
     DCHECK(!property_trees_.element_id_to_effect_node_index.contains(
         compositor_element_id));
     property_trees_.element_id_to_effect_node_index[compositor_element_id] =
diff --git a/third_party/blink/renderer/platform/mojo/blink_typemaps.gni b/third_party/blink/renderer/platform/mojo/blink_typemaps.gni
index 22ecc78..8af9005 100644
--- a/third_party/blink/renderer/platform/mojo/blink_typemaps.gni
+++ b/third_party/blink/renderer/platform/mojo/blink_typemaps.gni
@@ -24,7 +24,6 @@
   "//third_party/blink/public/common/screen_orientation/screen_orientation_lock_types.typemap",
   "//third_party/blink/public/mojom/bluetooth/bluetooth.typemap",
   "//ui/gfx/geometry/mojom/geometry.typemap",
-  "//ui/gfx/mojom/buffer_types_for_blink.typemap",
   "//ui/gfx/mojom/color_space.typemap",
   "//ui/gfx/mojom/transform.typemap",
 ]
diff --git a/third_party/blink/web_tests/FlagExpectations/composite-after-paint b/third_party/blink/web_tests/FlagExpectations/composite-after-paint
index dd4f1bec..9051e6c 100644
--- a/third_party/blink/web_tests/FlagExpectations/composite-after-paint
+++ b/third_party/blink/web_tests/FlagExpectations/composite-after-paint
@@ -72,7 +72,7 @@
 transforms/3d/general/background-visibility-layers.html [ Failure ]
 virtual/forced-high-contrast-colors/fast/css/forced-colors-mode/forced-colors-mode-22.html [ Crash ]
 
-# Raster invalidation doesn't work for huge layers. 
+# Raster invalidation doesn't work for huge layers.
 paint/invalidation/raster-under-invalidation-checking.html [ Failure ]
 
 # No composited scrolling for overflow:hidden (on marquee).
@@ -80,7 +80,7 @@
 
 # We paint the iframe's content background in the scrolling layer, causing invalidation on scroll.
 paint/invalidation/scroll/iframe-scroll-repaint.html [ Failure ]
-# will-transform on descendant doesn't trigger compositing of iframe. 
+# will-transform on descendant doesn't trigger compositing of iframe.
 paint/invalidation/scroll/composited-iframe-scroll-repaint.html [ Failure ]
 
 # Extra layers for non-fast scrolling areas.
@@ -105,16 +105,8 @@
 # Missing WheelEventHandler
 http/tests/devtools/layers/layer-scroll-rects-get.js [ Failure ]
 
-# Crash on non-contiguous effect on multiple columns
-crbug.com/1064341 fast/multicol/composited-layer-will-change.html [ Crash ]
-crbug.com/1064341 paint/clipath/change-mask-clip-path-multicol-crash.html [ Crash ]
-crbug.com/1064341 fast/multicol/composited-layer-multiple-fragments-translated.html [ Crash ]
-crbug.com/1064341 fast/multicol/composited-layer-multiple-fragments.html [ Crash ]
-crbug.com/1064341 fast/multicol/composited-layer-nested.html [ Crash ]
-
-# Outline paints incorrectly with columns. For now this is hidden by crbug.com/1064341.
-# crbug.com/1047358 paint/pagination/composited-paginated-outlined-box.html [ Failure ]
-crbug.com/1064341 paint/pagination/composited-paginated-outlined-box.html [ Crash ]
+# Outline paints incorrectly with columns.
+crbug.com/1047358 paint/pagination/composited-paginated-outlined-box.html [ Failure ]
 
 # Crash on weird clip hierarchy in multiple columns
 compositing/geometry/composited-in-columns.html [ Crash ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index ac25e260..42bd8042 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2023,6 +2023,7 @@
 crbug.com/613672 [ Mac ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-in-slow-desktop.html [ Skip ]
 crbug.com/613672 [ Mac ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-desktop.html [ Skip ]
 
+crbug.com/652536 fast/events/mouse-cursor-change-after-image-load.html [ Failure Pass Crash ]
 crbug.com/520188 [ Win ] http/tests/local/fileapi/file-last-modified-after-delete.html [ Failure Pass ]
 crbug.com/520611 [ Debug ] fast/filesystem/workers/file-writer-events-shared-worker.html [ Failure Pass ]
 crbug.com/520194 http/tests/xmlhttprequest/timeout/xmlhttprequest-timeout-worker-overridesexpires.html [ Failure Pass ]
@@ -2128,6 +2129,8 @@
 crbug.com/944583 [ Mac ] fast/scrolling/percentage-mousewheel-scroll.html [ Pass Failure ]
 crbug.com/944583 [ Mac ] virtual/scroll_customization/fast/scrolling/percentage-mousewheel-scroll-on-iframe.html [ Pass Failure ]
 crbug.com/944583 [ Mac ] virtual/scroll_customization/fast/scrolling/percentage-mousewheel-scroll.html [ Pass Failure ]
+crbug.com/944583 [ Mac ] fast/events/platform-wheelevent-paging-x-in-scrolling-page.html [ Pass Failure Timeout ]
+crbug.com/944583 [ Mac ] fast/events/platform-wheelevent-paging-y-in-scrolling-page.html [ Pass Failure Timeout ]
 
 # In external/wpt/html/, we prefer checking in failure
 # expectation files. The following tests with [ Failure ] don't have failure
@@ -6624,9 +6627,6 @@
 crbug.com/1059123 http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces-worklet-scope.html [ Pass Failure ]
 crbug.com/1059123 virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces-worklet-scope.html [ Pass Failure ]
 
-# Temporarily disabled to land https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2101972
-crbug.com/174309 http/tests/devtools/quick-open/command-menu.js [ Pass Failure ]
-
 # Support for SharedWorker must be added.
 crbug.com/1058785 external/wpt/html/cross-origin-embedder-policy/cache-storage-reporting-shared-worker.https.html [ Timeout ]
 
diff --git a/third_party/blink/web_tests/css3/flexbox/bug580586.html b/third_party/blink/web_tests/css3/flexbox/bug580586.html
deleted file mode 100644
index 467b864..0000000
--- a/third_party/blink/web_tests/css3/flexbox/bug580586.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-
-<style>
-body {
-  height: 200vh;
-}
-
-section {
-    height: 400px;
-    display: flex;
-    flex-direction: column;
-}
-
-.side-menu {
-    border: 1px solid black;
-    width: 200px;
-    display: flex;
-    flex-direction: column;
-}
-
-.box-body {
-    height: 1000px;
-    flex: 1 1 0%;
-    display: flex;
-    min-height: 0px;
-}
-
-.list {
-    list-style: none;
-    padding: 0;
-    overflow: auto;
-    flex: 1 1 0;
-}
-
-li {
-    height: 20px;
-    background-color: red;
-}
-</style>
-
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/check-layout-th.js"></script>
-<body onload="checkLayout('section')">
-
-<div id=log></div>
-
-<section>
-  <div class="box-body">
-    <div class="side-menu">
-      <ul class="list">
-        <li data-expected-width="200">
-        </li>
-      </ul>
-    </div>
-    <div style="height: 1000px;"></div>
-  </div>
-</section>
diff --git a/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import-expected.txt b/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import-expected.txt
index 3d1f528b..759d43d 100644
--- a/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import-expected.txt
+++ b/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE MESSAGE: line 6: Start script - there should be a deprecation message below about replace() and @import.
-CONSOLE WARNING: line 9: Support for calls to CSSStyleSheet.replace() with stylesheet text that includes @import has been deprecated, and will be removed in M83, around June 2020. See https://chromestatus.com/feature/4735925877735424 for more details.
+CONSOLE WARNING: line 9: Support for calls to CSSStyleSheet.replace() with stylesheet text that includes @import has been deprecated, and will be removed in M84, around June 2020. See https://chromestatus.com/feature/4735925877735424 for more details.
 CONSOLE MESSAGE: line 15: Finish script
 CONSOLE MESSAGE: line 10: Replace resolved
 
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/otpcredential-get-basics.https.html b/third_party/blink/web_tests/external/wpt/credential-management/otpcredential-get-basics.https.html
new file mode 100644
index 0000000..aca4822
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/credential-management/otpcredential-get-basics.https.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/WICG/WebOTP">
+<title>Tests OTPCredential</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/otpcredential-helper.js"></script>
+<script>
+'use strict';
+
+promise_test(async t => {
+  await expect(receive).andReturn(async () => {
+      return {status: Status.kSuccess, otp: "ABC"};
+  });
+
+  let cred = await navigator.credentials.get({otp: {transport: ["sms"]}});
+
+  assert_equals(cred.code, "ABC");
+}, 'Basic usage');
+
+promise_test(async t => {
+  await expect(receive).andReturn(async () => {
+      return {status: Status.kSuccess, otp: "ABC"};
+  });
+  await expect(receive).andReturn(async () => {
+      return {status: Status.kSuccess, otp: "ABC2"};
+  });
+
+  let sms1 = navigator.credentials.get({otp: {transport: ["sms"]}});
+  let sms2 = navigator.credentials.get({otp: {transport: ["sms"]}});
+
+  let cred2= await sms2;
+  let cred1 = await sms1;
+
+  assert_equals(cred1.code, "ABC");
+  assert_equals(cred2.code, "ABC2");
+}, 'Handle multiple requests in different order.');
+
+promise_test(async t => {
+  await expect(receive).andReturn(async () => {
+      return {status: Status.kCancelled};
+  });
+  await expect(receive).andReturn(async () => {
+      return {status: Status.kSuccess, otp: "success"};
+  });
+
+  let cancelled_sms = navigator.credentials.get({otp: {transport: ["sms"]}});
+  let successful_sms = navigator.credentials.get({otp: {transport: ["sms"]}});
+
+  let successful_cred = await successful_sms;
+  assert_equals(successful_cred.code, "success");
+
+  try {
+    await cancelled_sms;
+    assert_unreached('Expected AbortError to be thrown.');
+  } catch (error) {
+    assert_equals(error.name, "AbortError");
+  }
+}, 'Handle multiple requests with success and error.');
+
+promise_test(async t => {
+  await expect(receive).andReturn(async () => {
+      return {status: Status.kCancelled};
+  });
+
+  await promise_rejects_dom(t, 'AbortError', navigator.credentials.get(
+    {otp: {transport: ["sms"]}}));
+}, '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.credentials.get(
+    {otp: {transport: ["sms"]}, signal: signal}));
+}, 'Should abort request');
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/otpcredential-iframe.https.html b/third_party/blink/web_tests/external/wpt/credential-management/otpcredential-iframe.https.html
new file mode 100644
index 0000000..8af17b5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/credential-management/otpcredential-iframe.https.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<div id=log>
+<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 + "support/otpcredential-iframe.html";
+
+  document.body.appendChild(iframe);
+
+  const message = await messageWatcher.wait_for("message");
+  assert_equals(message.data.result, "Pass");
+  assert_equals(message.data.code, "ABC123");
+
+}, "Test OTPCredential enabled in same origin iframes");
+
+promise_test(async t => {
+  const messageWatcher = new EventWatcher(t, window, "message");
+  var iframe = document.createElement("iframe");
+  iframe.src = remoteBaseURL + "support/otpcredential-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 OTPCredential disabled in cross origin iframes");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/README.md b/third_party/blink/web_tests/external/wpt/credential-management/support/README.md
new file mode 100644
index 0000000..cacd959
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/credential-management/support/README.md
@@ -0,0 +1,30 @@
+# CredentialManagement Testing
+
+## OTPCredential Testing
+
+In this test suite `otpcredential-helper.js` is a testing framework that enables
+engines to test OTPCredential by intercepting the connection between the browser
+and the underlying operating system and mock its behavior.
+
+Usage:
+
+1. Include `<script src="./support/otpcredential-helper.js"></script>` in your
+test
+2. Set expectations
+```
+await expect(receive).andReturn(() => {
+  // mock behavior
+})
+```
+3. Call `navigator.credentials.get({otp: {transport: ["sms"]}})`
+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
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/otpcredential-helper.js b/third_party/blink/web_tests/external/wpt/credential-management/support/otpcredential-helper.js
new file mode 100644
index 0000000..d5a7eb8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/credential-management/support/otpcredential-helper.js
@@ -0,0 +1,65 @@
+'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
+
+async function loadChromiumResources() {
+  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/mock-sms-receiver.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/credential-management/support/otpcredential-iframe.html b/third_party/blink/web_tests/external/wpt/credential-management/support/otpcredential-iframe.html
new file mode 100644
index 0000000..37fe6e1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/credential-management/support/otpcredential-iframe.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<script src="./otpcredential-helper.js"></script>
+<script>
+'use strict';
+
+// Loading otpcredential-iframe.html in the test will make an OTPCredentials
+// call on load, and trigger a postMessage upon completion.
+//
+// message {
+//   string result: "Pass" | "Fail"
+//   string code: credentials.code
+//   string errorType: error.name
+// }
+
+// Intercept successful calls and return mocked value.
+(async function() {
+    await expect(receive).andReturn(() => {
+        return Promise.resolve({
+            status: Status.kSuccess,
+            otp: "ABC123",
+        });
+    });
+}());
+
+window.onload = async () => {
+    try {
+        const credentials =
+            await navigator.credentials.get({otp: {transport: ["sms"]}});
+        window.parent.postMessage({result: "Pass", code: credentials.code}, '*');
+    } catch (error) {
+        window.parent.postMessage({result: "Fail", errorType: error.name}, '*');
+    }
+}
+
+</script>
diff --git a/third_party/blink/web_tests/css3/flexbox/bug527039.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-outer-flexbox-column-recalculate-height-on-resize-001.html
similarity index 73%
rename from third_party/blink/web_tests/css3/flexbox/bug527039.html
rename to third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-outer-flexbox-column-recalculate-height-on-resize-001.html
index 20a8940..0b0b5b4 100644
--- a/third_party/blink/web_tests/css3/flexbox/bug527039.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-outer-flexbox-column-recalculate-height-on-resize-001.html
@@ -1,4 +1,10 @@
 <!DOCTYPE html>
+<html>
+<title>CSS Flexbox: height resizing with flex-direction: column</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-direction-property">
+<link rel="help" href="https://crbug.com/527039">
+<meta name="assert" content="This test checks that resizing the height of a layout with two nested flexboxes using 'flex-direction: column' correctly recalculates the outer box's height." />
+
 <style>
 body,
 html {
@@ -24,9 +30,9 @@
 }
 </style>
 
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/check-layout-th.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
 
 <body onload="update()">
 
@@ -64,3 +70,5 @@
   checkLayout('.OuterFlexbox');
 }
 </script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/css3/flexbox/flexbox-overflow-auto.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-overflow-auto-001.html
similarity index 74%
rename from third_party/blink/web_tests/css3/flexbox/flexbox-overflow-auto.html
rename to third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-overflow-auto-001.html
index 28141475..ee5a1af 100644
--- a/third_party/blink/web_tests/css3/flexbox/flexbox-overflow-auto.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flexbox-overflow-auto-001.html
@@ -1,6 +1,10 @@
 <!DOCTYPE html>
 <html>
-<head>
+<title>CSS Flexbox: overflow:auto support.</title>
+<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#propdef-overflow">
+<link rel="help" href="https://www.w3.org/TR/css-overflow-4/#classic-scrollbars">
+<link rel="match" href="reference/flexbox-overflow-auto-001-ref.html">
+<meta name="assert" content="This test ensures that flexbox with 'overflow: auto' is supported, including in combination with different writing-mode and flex-direction values."/>
 <style>
 .test-row {
     display: flex;
@@ -55,12 +59,11 @@
 .flexbox > div {
     width: 200px;
     height: 200px;
-    background: -webkit-radial-gradient(center, ellipse cover, rgba(30,87,153,1) 0%,rgba(89,148,202,1) 62%,rgba(95,154,207,0.7) 68%,rgba(125,185,232,0) 100%);
+    background: radial-gradient(at right 60%, red, yellow, green);
     flex: none;
 }
 
 </style>
-</head>
 <body>
     <p>Scrollbars should work in all the flexboxes.</p>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-auto-002.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-auto-002.html
new file mode 100644
index 0000000..2bb04a26
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-auto-002.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Flexbox: correct width for non-overflowing content with flex-direction: column</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-direction-property">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-3/#overflow-properties">
+<link rel="help" href="https://crbug.com/580586">
+<meta name="assert" content="This test checks that no unnecessary extra horizontal space is considered for vertical scrollbars for non-overflowing content using flex-direction: column." />
+
+<style>
+body {
+  height: 200vh;
+}
+
+section {
+    height: 400px;
+    display: flex;
+    flex-direction: column;
+}
+
+.side-menu {
+    border: 1px solid black;
+    width: 200px;
+    display: flex;
+    flex-direction: column;
+}
+
+.box-body {
+    height: 1000px;
+    flex: 1 1 0%;
+    display: flex;
+    min-height: 0px;
+}
+
+.list {
+    list-style: none;
+    padding: 0;
+    overflow: auto;
+    flex: 1 1 0;
+}
+
+li {
+    height: 20px;
+    background-color: red;
+}
+</style>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('section')">
+
+<div id=log></div>
+
+<section>
+  <div class="box-body">
+    <div class="side-menu">
+      <ul class="list">
+        <li data-expected-width="200">
+        </li>
+      </ul>
+    </div>
+    <div style="height: 1000px;"></div>
+  </div>
+</section>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/css3/flexbox/flexbox-overflow-auto-expected.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/reference/flexbox-overflow-auto-001-ref.html
similarity index 89%
rename from third_party/blink/web_tests/css3/flexbox/flexbox-overflow-auto-expected.html
rename to third_party/blink/web_tests/external/wpt/css/css-flexbox/reference/flexbox-overflow-auto-001-ref.html
index 6c6095b..ace792e 100644
--- a/third_party/blink/web_tests/css3/flexbox/flexbox-overflow-auto-expected.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/reference/flexbox-overflow-auto-001-ref.html
@@ -26,7 +26,7 @@
 .flexbox > div {
     width: 200px;
     height: 200px;
-    background: -webkit-radial-gradient(center, ellipse cover, rgba(30,87,153,1) 0%,rgba(89,148,202,1) 62%,rgba(95,154,207,0.7) 68%,rgba(125,185,232,0) 100%);
+    background: radial-gradient(at right 60%, red, yellow, green);
 }
 </style>
 </head>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/replaced-fractional-height-from-aspect-ratio.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/replaced-fractional-height-from-aspect-ratio.html
new file mode 100644
index 0000000..d97c3f1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/replaced-fractional-height-from-aspect-ratio.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1052370" >
+<meta name="assert" content="When determining the size of a replaced element, if it has an aspect ratio of 1/1 then the final height should be exactly equal to its width." />
+<script src="../../resources/check-layout.js"></script>
+<style>
+canvas {
+  float: left;
+  background: green;
+}
+</style>
+<div style="position: relative; width: 254px; zoom: 0.8;">
+  <canvas style="width: 30%;" width="1" height="1"></canvas>
+  <canvas style="width: 30%;" width="708" height="708"></canvas>
+  <canvas id="target" style="width: 60%;" width="2" height="1" data-offset-x="0"></canvas>
+</div>
+<script>
+checkLayout('#target');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-aspect-ratio-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-aspect-ratio-ref.html
new file mode 100644
index 0000000..6de01a9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-aspect-ratio-ref.html
@@ -0,0 +1,2 @@
+<!doctype HTML>
+<span style="display: inline-block; width: 100px; height: 50px; border: 1px solid black">
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-aspect-ratio.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-aspect-ratio.html
new file mode 100644
index 0000000..15df330
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-aspect-ratio.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html style="reftest-wait">
+  <link rel="match" href="image-loading-lazy-slow-aspect-ratio-ref.html">
+  <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+  <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-img-element">
+  <script src="/common/reftest-wait.js"></script>
+  <img id=target loading="lazy" src="resources/image.png"
+      width="200" height="100" style="width: 100px; height: auto; border: 1px solid black">
+<script>
+  let loaded = false;
+  target.onload = () => {
+    if (loaded) return;
+    loaded = true;
+    target.src = "";
+    requestAnimationFrame(() => requestAnimationFrame(() => {
+      target.src = "resources/image.png?pipe=trickle(d2)";
+      takeScreenshot();
+    }));
+  };
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-ref.html
new file mode 100644
index 0000000..20fbb9b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<span style="display: inline-block; width: 330px; height: 254px; border: 1px solid black"></span>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow.html
new file mode 100644
index 0000000..15a3056f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/image-loading-lazy-slow.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html style="reftest-wait">
+  <link rel="match" href="image-loading-lazy-slow-ref.html">
+  <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+  <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-img-element">
+
+  <script src="/common/reftest-wait.js"></script>
+  <img id=target loading="lazy" src="resources/image.png"
+       width="330" height="254" style="border: 1px solid black">
+<script>
+  let loaded = false;
+  target.onload = () => {
+    if (loaded) return;
+    loaded = true;
+    target.src = "";
+    requestAnimationFrame(() => requestAnimationFrame(() => {
+      target.src = "resources/image.png?pipe=trickle(d2)";
+      takeScreenshot();
+    }));
+  };
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/lint.whitelist b/third_party/blink/web_tests/external/wpt/lint.whitelist
index 65494c7..0b9ebb9 100644
--- a/third_party/blink/web_tests/external/wpt/lint.whitelist
+++ b/third_party/blink/web_tests/external/wpt/lint.whitelist
@@ -689,7 +689,7 @@
 # https://github.com/web-platform-tests/wpt/issues/16455
 # Please consult with ecosystem-infra@chromium.org before adding more.
 MISSING DEPENDENCY: idle-detection/interceptor.https.html
-MISSING DEPENDENCY: sms/resources/helper.js
+MISSING DEPENDENCY: credential-management/support/otpcredential-helper.js
 MISSING DEPENDENCY: web-nfc/resources/nfc-helpers.js
 MISSING DEPENDENCY: shape-detection/resources/shapedetection-helpers.js
 MISSING DEPENDENCY: webxr/resources/webxr_util.js
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/mock-sms-receiver.js b/third_party/blink/web_tests/external/wpt/resources/chromium/mock-sms-receiver.js
new file mode 100644
index 0000000..c4aa9a8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/mock-sms-receiver.js
@@ -0,0 +1,51 @@
+'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/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
index a189324..fff2b0b 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is navigated. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
index c655c9d..b26d8914 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
index 9d6f73d3..5a78f6b 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index fd4a8a843..36b5b46 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is navigated. Test should not crash and properties read from the cached DOMWindow should be identical to properties through the 'current' DOMWindow.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
index bed1c75..76e2ab0 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
index 315002c..83da442 100644
--- a/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/events/mouse-cursor-change-after-image-load.html b/third_party/blink/web_tests/fast/events/mouse-cursor-change-after-image-load.html
index 9dad516a..6572e35 100644
--- a/third_party/blink/web_tests/fast/events/mouse-cursor-change-after-image-load.html
+++ b/third_party/blink/web_tests/fast/events/mouse-cursor-change-after-image-load.html
@@ -34,8 +34,10 @@
     }
 
     function testSetCursorImage(url, expectedCursorInfo, complete) {
+        const currentCursorInfo = internals.getCurrentCursorInfo();
         target.style.cursor = `url(${url}),auto`;
-        waitForCondition(() => internals.getCurrentCursorInfo() != expectedCursorInfo, cursorTest.step_func(() => {
+        waitForCondition(() => internals.getCurrentCursorInfo() != currentCursorInfo, cursorTest.step_func(() => {
+            assert_equals(internals.getCurrentCursorInfo(), expectedCursorInfo);
             complete();
         }));
     }
diff --git a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-x-in-scrolling-page.html b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-x-in-scrolling-page.html
index 8ceba76..8913a9a 100644
--- a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-x-in-scrolling-page.html
+++ b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-x-in-scrolling-page.html
@@ -29,7 +29,7 @@
 
     await smoothScroll(givenScrollLeft, 100, 110, source, 'right', SPEED_INSTANT, false /* precise_scrolling_deltas */, true /* scroll_by_page */);
     await waitFor( () => {
-        return navigator.platform.indexOf("Mac") != -1 ? true : document.scrollingElement.scrollLeft == window.expectedScrollLeft;
+        return document.scrollingElement.scrollLeft == window.expectedScrollLeft;
     });
     assert_equals(last_event.wheelDeltaX, -Math.floor(expectedWheelDeltaX));
     assert_equals(last_event.wheelDelta, -Math.floor(expectedWheelDeltaX));
diff --git a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-div.html b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-div.html
index a012c9b..0267838 100644
--- a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-div.html
+++ b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-div.html
@@ -1,41 +1,7 @@
 <!DOCTYPE html>
 <script src='../../resources/testharness.js'></script>
 <script src='../../resources/testharnessreport.js'></script>
-<script>
-    const scrollDelta = 2;
-    const test = async_test("Page-based wheel scrolls provide correct delta " +
-                            "in event handler, don't scroll if there's no " +
-                            "overflow in direction.");
-
-    if (window.testRunner)
-        testRunner.waitUntilDone();
-
-    function mousewheelHandler(e)
-    {
-      test.step(() => {
-        const overflowElement = document.getElementById("overflow");
-        assert_equals(e.wheelDeltaY, scrollDelta * -3);
-        assert_equals(e.wheelDeltaX, 0);
-        assert_equals(e.wheelDelta, scrollDelta * -3);
-        assert_equals(overflowElement.scrollTop, 0);
-      });
-
-      test.done();
-    }
-
-    window.onload = async () => {
-      const overflowElement = document.getElementById("overflow");
-      overflowElement.addEventListener("mousewheel", mousewheelHandler, false);
-
-      // TODO(bokan): This should really be using gpuBenchmarking or similar to
-      // ensure the wheels are injected at the browser level, however,
-      // gpuBenchmarking today doesn't support "page" granularity wheels.
-      if (window.eventSender) {
-        eventSender.mouseMoveTo(100, 110);
-        eventSender.continuousMouseScrollBy(0, -scrollDelta, true);
-      }
-    };
-</script>
+<script src='../../resources/gesture-util.js'></script>
 <style>
   body {
     margin: 0;
@@ -67,3 +33,30 @@
     <div class="box" style="background-color:green"></div>
   </div>
 </div>
+
+<script>
+    const scrollDelta = 2;
+    var last_event = null;
+    var source = GestureSourceType.MOUSE_INPUT;
+    const numTicksY = scrollDelta / pixelsPerTick();
+    const expectedWheelDeltaY = numTicksY * LEGACY_MOUSE_WHEEL_TICK_MULTIPLIER;
+
+    function mousewheelHandler(e)
+    {
+        last_event = e;
+    }
+
+    promise_test(async () => {
+      const overflowElement = document.getElementById("overflow");
+      overflowElement.addEventListener("mousewheel", mousewheelHandler, false);
+
+      await smoothScroll(scrollDelta, 100, 110, source, 'down', SPEED_INSTANT, false /* precise_scrolling_deltas */, true /* scroll_by_page */);
+      await conditionHolds( () => {
+          return overflowElement.scrollTop == 0;
+      });
+      assert_equals(last_event.wheelDeltaY, -Math.floor(expectedWheelDeltaY));
+      assert_equals(last_event.wheelDeltaX, 0);
+      assert_equals(last_event.wheelDelta, -Math.floor(expectedWheelDeltaY));
+    }, "Page-based wheel scrolls provide correct delta in event handler, don't scroll if there's no " +
+       "overflow in direction when scrolling on div.");
+</script>
diff --git a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-page-expected.txt b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-page-expected.txt
deleted file mode 100644
index 7e87927..0000000
--- a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-page-expected.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
-PASS event.wheelDeltaY is window.givenScrollTop * -3
-PASS event.wheelDeltaX is 0
-PASS event.wheelDelta is window.givenScrollTop * -3
-PASS document.scrollingElement.scrollTop is window.expectedScrollTop
-PASS document.scrollingElement.scrollLeft is window.expectedScrollLeft
diff --git a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-page.html b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-page.html
index 81d4ef5f..d1aa0129 100644
--- a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-page.html
+++ b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-non-scrolling-page.html
@@ -1,61 +1,38 @@
-<html>
-    <head>
-        <script src="../../resources/js-test.js"></script>
-        <script>
-            var givenScrollTop = 2;
-            var givenScrollLeft = 0;
-            var expectedScrollTop = 0;
-            var expectedScrollLeft = 0;
-            var event;
-            var div;
+<!DOCTYPE html>
+<script src='../../resources/testharness.js'></script>
+<script src='../../resources/testharnessreport.js'></script>
+<script src='../../resources/gesture-util.js'></script>
+<div style="height:200px;width:2400px">
+  <div style="background-color:red;height:200px;width:1200px;position:relative;left:0px;top:0px"></div>
+  <div style="background-color:green;height:200px;width:1200px;position:relative;left:1200px;top:-200px"></div>
+</div>
+<div style="height:200px;width:2400px">
+  <div style="background-color:blue;height:200px;width:1200px;position:relative;left:0px;top:0px"></div>
+  <div style="background-color:yellow;height:200px;width:1200px;position:relative;left:1200px;top:-200px"></div>
+</div>
 
-            if (window.testRunner)
-                testRunner.waitUntilDone();
+<script>
+    const scrollDelta = 2;
+    var last_event = null;
+    var source = GestureSourceType.MOUSE_INPUT;
+    const numTicksY = scrollDelta / pixelsPerTick();
+    const expectedWheelDeltaY = numTicksY * LEGACY_MOUSE_WHEEL_TICK_MULTIPLIER;
 
-            function dispatchWheelEvent()
-            {
-                document.body.addEventListener("mousewheel", mousewheelHandler, false);
+    function mousewheelHandler(e)
+    {
+        last_event = e;
+    }
 
-                if (window.eventSender) {
-                    eventSender.mouseMoveTo(100, 110);
-                    eventSender.continuousMouseScrollBy(-window.givenScrollLeft, -window.givenScrollTop, true);
-                }
+    promise_test(async () => {
+      document.body.addEventListener("mousewheel", mousewheelHandler, false);
 
-                setTimeout('checkOffsets();', 100);
-            }
-
-            function checkOffsets()
-            {
-                shouldBe("document.scrollingElement.scrollTop", "window.expectedScrollTop");
-                shouldBe("document.scrollingElement.scrollLeft", "window.expectedScrollLeft");
-
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            }
-
-            function mousewheelHandler(e)
-            {
-				event = e;
-				shouldBe("event.wheelDeltaY", "window.givenScrollTop * -3");
-				shouldBe("event.wheelDeltaX", "0");
-
-				if (e.wheelDeltaY)
-					shouldBe("event.wheelDelta", "window.givenScrollTop * -3");
-				else
-					shouldBe("event.wheelDelta", "0");
-            }
-        </script>
-    </head>
-
-    <body style="margin:0" onload="setTimeout('dispatchWheelEvent();', 100)">
-        <div style="height:200px;width:2400px">
-          <div style="background-color:red;height:200px;width:1200px;position:relative;left:0px;top:0px"></div>
-          <div style="background-color:green;height:200px;width:1200px;position:relative;left:1200px;top:-200px"></div>
-        </div>
-        <div style="height:200px;width:2400px">
-          <div style="background-color:blue;height:200px;width:1200px;position:relative;left:0px;top:0px"></div>
-          <div style="background-color:yellow;height:200px;width:1200px;position:relative;left:1200px;top:-200px"></div>
-        </div>
-        <div id="console"></div>
-    </body>
-</html>
+      await smoothScroll(scrollDelta, 100, 110, source, 'down', SPEED_INSTANT, false /* precise_scrolling_deltas */, true /* scroll_by_page */);
+      await conditionHolds( () => {
+          return document.scrollingElement.scrollTop == 0;
+      });
+      assert_equals(last_event.wheelDeltaY, -Math.floor(expectedWheelDeltaY));
+      assert_equals(last_event.wheelDeltaX, 0);
+      assert_equals(last_event.wheelDelta, -Math.floor(expectedWheelDeltaY));
+    }, "Page-based wheel scrolls provide correct delta in event handler, don't scroll if there's no " +
+       "overflow in direction when scrolling on document.");
+</script>
diff --git a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-div-expected.txt b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-div-expected.txt
deleted file mode 100644
index 0468b3edb..0000000
--- a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-div-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-PASS event.wheelDeltaY is window.givenScrollTop * -3
-PASS event.wheelDeltaX is 0
-PASS event.wheelDelta is window.givenScrollTop * -3
-PASS div.scrollTop == window.expectedScrollTop && div.scrollLeft == window.expectedScrollLeft became true
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-div.html b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-div.html
index cad4e13c..66bf9de6 100644
--- a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-div.html
+++ b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-div.html
@@ -1,60 +1,45 @@
-<html>
-    <head>
-        <script src="../../resources/js-test.js"></script>
-        <script>
-            window.jsTestIsAsync = true;
-            var givenScrollTop = 2; // When paging, this is ignored. Every event is one page.
-            var givenScrollLeft = 0;
-            var expectedScrollTop = 161;
-            var expectedScrollLeft = 0;
-            var event;
-            var div;
+<!DOCTYPE html>
+<script src='../../resources/testharness.js'></script>
+<script src='../../resources/testharnessreport.js'></script>
+<script src='../../resources/gesture-util.js'></script>
+<!-- This div is 200 pixels high. The content results in scrool bars on
+  both edges, resulting in an effective content area of 185 x 185 on
+  linux. The paging context overlap is 24 pixels. So one page of scroll
+  moves the content by 185 - 24 -= 161 pixels. -->
+<div id="overflow" style="border:2px solid black;overflow:auto;height:200px;width:200px;">
+    <div style="height:300px;width:600px">
+      <div style="background-color:red;height:300px;width:300px;position:relative;left:0px;top:0px"></div>
+      <div style="background-color:green;height:300px;width:300px;position:relative;left:300px;top:-300px"></div>
+    </div>
+    <div style="height:300px;width:600px">
+      <div style="background-color:blue;height:300px;width:300px;position:relative;left:0px;top:0px"></div>
+      <div style="background-color:yellow;height:300px;width:300px;position:relative;left:300px;top:-300px"></div>
+    </div>
+</div>
 
-            function runTest()
-            {
-                var overflowElement = document.getElementById("overflow");
-                if (overflowElement)
-                    overflowElement.addEventListener("mousewheel", mousewheelHandler, false);
+<script>
+    var givenScrollTop = 2; // When paging, this is ignored. Every event is one page.
+    var expectedScrollTop = 161;
+    var last_event = null;
+    var source = GestureSourceType.MOUSE_INPUT;
+    const numTicksY = givenScrollTop / pixelsPerTick();
+    const expectedWheelDeltaY = numTicksY * LEGACY_MOUSE_WHEEL_TICK_MULTIPLIER;
 
-                if (window.eventSender) {
-                    eventSender.mouseMoveTo(100, 110);
-                    eventSender.continuousMouseScrollBy(-window.givenScrollLeft, -window.givenScrollTop, true);
-                }
+    function mousewheelHandler(e)
+    {
+        last_event = e;
+    }
 
-                div = document.getElementById("overflow");
-                shouldBecomeEqual("div.scrollTop == window.expectedScrollTop && " +
-                    "div.scrollLeft == window.expectedScrollLeft", "true", finishJSTest);
-            }
+    promise_test(async () => {
+      const overflowElement = document.getElementById("overflow");
+      overflowElement.addEventListener("mousewheel", mousewheelHandler, false);
 
-            function mousewheelHandler(e)
-            {
-                event = e;
-                shouldBe("event.wheelDeltaY", "window.givenScrollTop * -3");
-                shouldBe("event.wheelDeltaX", "0");
-
-                if (e.wheelDeltaY)
-                    shouldBe("event.wheelDelta", "window.givenScrollTop * -3");
-                else
-                    shouldBe("event.wheelDelta", "0");
-            }
-        </script>
-    </head>
-
-    <body style="margin:0" onload="runTest()">
-        <!-- This div is 200 pixels high. The content results in scrool bars on
-          both edges, resulting in an effective content area of 185 x 185 on
-          linux. The paging context overlap is 24 pixels. So one page of scroll
-          moves the content by 185 - 24 -= 161 pixels. -->
-        <div id="overflow" style="border:2px solid black;overflow:auto;height:200px;width:200px;">
-            <div style="height:300px;width:600px">
-              <div style="background-color:red;height:300px;width:300px;position:relative;left:0px;top:0px"></div>
-              <div style="background-color:green;height:300px;width:300px;position:relative;left:300px;top:-300px"></div>
-            </div>
-            <div style="height:300px;width:600px">
-              <div style="background-color:blue;height:300px;width:300px;position:relative;left:0px;top:0px"></div>
-              <div style="background-color:yellow;height:300px;width:300px;position:relative;left:300px;top:-300px"></div>
-            </div>
-        </div>
-        <div id="console"></div>
-    </body>
-</html>
+      await smoothScroll(givenScrollTop, 100, 110, source, 'down', SPEED_INSTANT, false /* precise_scrolling_deltas */, true /* scroll_by_page */);
+      await waitFor( () => {
+          return overflowElement.scrollTop == window.expectedScrollTop;
+      });
+      assert_equals(last_event.wheelDeltaY, -Math.floor(expectedWheelDeltaY));
+      assert_equals(last_event.wheelDeltaX, 0);
+      assert_equals(last_event.wheelDelta, -Math.floor(expectedWheelDeltaY));
+    }, "Page-based wheel scrolls provide correct delta in event handler, scrolling on overflow div.");
+</script>
diff --git a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-page.html b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-page.html
index c109a6f0..94d45680 100644
--- a/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-page.html
+++ b/third_party/blink/web_tests/fast/events/platform-wheelevent-paging-y-in-scrolling-page.html
@@ -1,52 +1,38 @@
-<html>
-    <head>
-        <script src="../../resources/js-test.js"></script>
-        <script>
-            window.jsTestIsAsync = true;
-            var givenScrollTop = 2; // Only page is scrolled per event, regardless of this number.
-            var givenScrollLeft = 0;
-            var expectedScrollTop = 525; // Window is 800x600. Scroll 87.5% of visible.
-            var expectedScrollLeft = 0;
-            var event;
-            var div;
+<!DOCTYPE html>
+<script src='../../resources/testharness.js'></script>
+<script src='../../resources/testharnessreport.js'></script>
+<script src='../../resources/gesture-util.js'></script>
+<div style="height:900px;width:400px">
+  <div style="background-color:red;height:900px;width:200px;position:relative;left:0px;top:0px"></div>
+  <div style="background-color:green;height:900px;width:200px;position:relative;left:200px;top:-900px"></div>
+</div>
+<div style="height:900px;width:400px">
+  <div style="background-color:blue;height:900px;width:200px;position:relative;left:0px;top:0px"></div>
+  <div style="background-color:yellow;height:900px;width:200px;position:relative;left:200px;top:-900px"></div>
+</div>
 
-            function runTest()
-            {
-                document.body.addEventListener("mousewheel", mousewheelHandler, false);
+<script>
+    var givenScrollTop = 2; // When paging, this is ignored. Every event is one page.
+    var expectedScrollTop = 525; // Window is 800x600. Scroll 87.5% of visible.
+    var last_event = null;
+    var source = GestureSourceType.MOUSE_INPUT;
+    const numTicksY = givenScrollTop / pixelsPerTick();
+    const expectedWheelDeltaY = numTicksY * LEGACY_MOUSE_WHEEL_TICK_MULTIPLIER;
 
-                if (window.eventSender) {
-                    eventSender.mouseMoveTo(100, 110);
-                    eventSender.continuousMouseScrollBy(-window.givenScrollLeft, -window.givenScrollTop, true);
-                }
+    function mousewheelHandler(e)
+    {
+      last_event = e;
+    }
 
-                // This test expects failure on mac: crbug.com/552694.
-                shouldBecomeEqual("document.scrollingElement.scrollTop == window.expectedScrollTop && " +
-                    "document.scrollingElement.scrollLeft == window.expectedScrollLeft", "true", finishJSTest);
-            }
+    promise_test(async () => {
+      document.body.addEventListener("mousewheel", mousewheelHandler, false);
 
-            function mousewheelHandler(e)
-            {
-                event = e;
-                shouldBe("event.wheelDeltaY", "window.givenScrollTop * -3");
-                shouldBe("event.wheelDeltaX", "0");
-
-                if (e.wheelDeltaY)
-                    shouldBe("event.wheelDelta", "window.givenScrollTop * -3");
-                else
-                    shouldBe("event.wheelDelta", "0");
-            }
-        </script>
-    </head>
-
-    <body style="margin:0" onload="runTest()">
-        <div style="height:900px;width:400px">
-          <div style="background-color:red;height:900px;width:200px;position:relative;left:0px;top:0px"></div>
-          <div style="background-color:green;height:900px;width:200px;position:relative;left:200px;top:-900px"></div>
-        </div>
-        <div style="height:900px;width:400px">
-          <div style="background-color:blue;height:900px;width:200px;position:relative;left:0px;top:0px"></div>
-          <div style="background-color:yellow;height:900px;width:200px;position:relative;left:200px;top:-900px"></div>
-        </div>
-        <div id="console"></div>
-    </body>
-</html>
+      await smoothScroll(givenScrollTop, 100, 110, source, 'down', SPEED_INSTANT, false /* precise_scrolling_deltas */, true /* scroll_by_page */);
+      await waitFor( () => {
+          return document.scrollingElement.scrollTop == window.expectedScrollTop;
+      });
+      assert_equals(last_event.wheelDeltaY, -Math.floor(expectedWheelDeltaY));
+      assert_equals(last_event.wheelDeltaX, 0);
+      assert_equals(last_event.wheelDelta, -Math.floor(expectedWheelDeltaY));
+    }, "Page-based wheel scrolls provide correct delta in event handler, scrolling on overflow document.");
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/loader/frame-detach-during-onreadystatechange-loading-expected.txt b/third_party/blink/web_tests/fast/loader/frame-detach-during-onreadystatechange-loading-expected.txt
new file mode 100644
index 0000000..4c5caa9
--- /dev/null
+++ b/third_party/blink/web_tests/fast/loader/frame-detach-during-onreadystatechange-loading-expected.txt
@@ -0,0 +1 @@
+PASS if no crash. 
diff --git a/third_party/blink/web_tests/fast/loader/frame-detach-during-onreadystatechange-loading.html b/third_party/blink/web_tests/fast/loader/frame-detach-during-onreadystatechange-loading.html
new file mode 100644
index 0000000..d1c4811
--- /dev/null
+++ b/third_party/blink/web_tests/fast/loader/frame-detach-during-onreadystatechange-loading.html
@@ -0,0 +1,16 @@
+<body>
+PASS if no crash.
+<script>
+if (window.testRunner)
+  testRunner.dumpAsText();
+
+var i = document.createElement("iframe");
+i.id = "i";
+i.srcdoc = "";
+document.body.appendChild(i);
+i.contentWindow.addEventListener('readystatechange', () => {
+  if (i.contentDocument.readyState == "loading")
+    i.remove();
+}, true);
+</script>
+</body>
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/http/tests/appcache/foreign-iframe-main-expected.txt b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/http/tests/appcache/foreign-iframe-main-expected.txt
index f84ca34..7c02cde 100644
--- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/http/tests/appcache/foreign-iframe-main-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/http/tests/appcache/foreign-iframe-main-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test for <rdar://problem/6284708> AppCache crashes in ApplicationCacheResource::addType().
 
 checking
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/http/tests/security/cross-origin-appcache-allowed-expected.txt b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/http/tests/security/cross-origin-appcache-allowed-expected.txt
index 4cebfa8..49aa587 100644
--- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/http/tests/security/cross-origin-appcache-allowed-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/http/tests/security/cross-origin-appcache-allowed-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This iframe should have a cache:
 
 This iframe should have a cache:
diff --git a/third_party/blink/web_tests/http/tests/appcache/404-manifest-expected.txt b/third_party/blink/web_tests/http/tests/appcache/404-manifest-expected.txt
index 6cba988..52b2b46f 100644
--- a/third_party/blink/web_tests/http/tests/appcache/404-manifest-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/404-manifest-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 34: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that subresources can be loaded if manifest is not available.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/404-resource-cross-origin-expected.txt b/third_party/blink/web_tests/http/tests/appcache/404-resource-cross-origin-expected.txt
index 76db3b9..5f10277 100644
--- a/third_party/blink/web_tests/http/tests/appcache/404-resource-cross-origin-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/404-resource-cross-origin-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a missing cross-origin resource failure doesn't leak details.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/http/tests/appcache/404-resource-expected.txt b/third_party/blink/web_tests/http/tests/appcache/404-resource-expected.txt
index 06a6bfe..9b4fbfa 100644
--- a/third_party/blink/web_tests/http/tests/appcache/404-resource-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/404-resource-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a missing explicit resource makes caching fail.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-expected.txt b/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-expected.txt
index 4a4d34c..ebdfdb9 100644
--- a/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that download process was aborted after checking event.
 FAILURE CACHED
diff --git a/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-manifest-404-expected.txt b/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-manifest-404-expected.txt
index c2b5347..ed2660a8 100644
--- a/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-manifest-404-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-manifest-404-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that download process was aborted after checking event and before update failed.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-resource-404-expected.txt b/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-resource-404-expected.txt
index c2b5347..ed2660a8 100644
--- a/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-resource-404-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/abort-cache-onchecking-resource-404-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that download process was aborted after checking event and before update failed.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-expected.txt b/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-expected.txt
index dba9c03..ea7b1c7 100644
--- a/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that download process was aborted after downloading event.
 FAILURE CACHED
diff --git a/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-manifest-404-expected.txt b/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-manifest-404-expected.txt
index 2ab2721..a3a626be 100644
--- a/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-manifest-404-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-manifest-404-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that download process was not aborted after downloading event since manifest was not found.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-resource-404-expected.txt b/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-resource-404-expected.txt
index 89cf3d8..f328996a 100644
--- a/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-resource-404-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/abort-cache-ondownloading-resource-404-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that download process was aborted after downloading event although resource was not found.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/abort-cache-onprogress-expected.txt b/third_party/blink/web_tests/http/tests/appcache/abort-cache-onprogress-expected.txt
index 736921c..3279236f 100644
--- a/third_party/blink/web_tests/http/tests/appcache/abort-cache-onprogress-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/abort-cache-onprogress-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that download process was aborted after progress event.
 loading resource: 0 / 4 loading resource: 1 / 4 loading resource: 2 / 4 loading resource: 3 / 4 loading resource: 4 / 4 FAILURE CACHED
diff --git a/third_party/blink/web_tests/http/tests/appcache/access-via-redirect-expected.txt b/third_party/blink/web_tests/http/tests/appcache/access-via-redirect-expected.txt
index bc1fffe4..2e5dfcaa 100644
--- a/third_party/blink/web_tests/http/tests/appcache/access-via-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/access-via-redirect-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 16: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 This tests that the start of redirect chain doesn't get into an application cache if the end of the chain has a manifest.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/crash-when-navigating-away-then-back-expected.txt b/third_party/blink/web_tests/http/tests/appcache/crash-when-navigating-away-then-back-expected.txt
index 42bc7e6d..f7a6800 100644
--- a/third_party/blink/web_tests/http/tests/appcache/crash-when-navigating-away-then-back-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/crash-when-navigating-away-then-back-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that loading a page with a manifest, navigating away from the page, and then back does not cause a crash.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/credential-url-expected.txt b/third_party/blink/web_tests/http/tests/appcache/credential-url-expected.txt
index 320b1819..18b246a 100644
--- a/third_party/blink/web_tests/http/tests/appcache/credential-url-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/credential-url-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that application cache doesn't block loading resources from the same origin with credential.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/cyrillic-uri-expected.txt b/third_party/blink/web_tests/http/tests/appcache/cyrillic-uri-expected.txt
index 42eab79..fa90174 100644
--- a/third_party/blink/web_tests/http/tests/appcache/cyrillic-uri-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/cyrillic-uri-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 33: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that non-ASCII URIs work correctly in cache manifests.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/deferred-events-delete-while-raising-expected.txt b/third_party/blink/web_tests/http/tests/appcache/deferred-events-delete-while-raising-expected.txt
index b6ff78d..768624c 100644
--- a/third_party/blink/web_tests/http/tests/appcache/deferred-events-delete-while-raising-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/deferred-events-delete-while-raising-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test the destruction of an iframe while deferred events are being raised does not crash the system.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/deferred-events-delete-while-raising-timer-expected.txt b/third_party/blink/web_tests/http/tests/appcache/deferred-events-delete-while-raising-timer-expected.txt
index b6ff78d..768624c 100644
--- a/third_party/blink/web_tests/http/tests/appcache/deferred-events-delete-while-raising-timer-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/deferred-events-delete-while-raising-timer-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test the destruction of an iframe while deferred events are being raised does not crash the system.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/deferred-events-expected.txt b/third_party/blink/web_tests/http/tests/appcache/deferred-events-expected.txt
index ddc9b8e..50099ad 100644
--- a/third_party/blink/web_tests/http/tests/appcache/deferred-events-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/deferred-events-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that AppicationCache events are deferred until after onload has been fired.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/different-https-origin-resource-main-expected.txt b/third_party/blink/web_tests/http/tests/appcache/different-https-origin-resource-main-expected.txt
index acde08e..56a62e6 100644
--- a/third_party/blink/web_tests/http/tests/appcache/different-https-origin-resource-main-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/different-https-origin-resource-main-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a resource from a different https origin is not cached.
 
 FAIL: Different https origin resource is getting downloaded to cache.
diff --git a/third_party/blink/web_tests/http/tests/appcache/different-origin-manifest-expected.txt b/third_party/blink/web_tests/http/tests/appcache/different-origin-manifest-expected.txt
index ced99cb..061b6af6 100644
--- a/third_party/blink/web_tests/http/tests/appcache/different-origin-manifest-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/different-origin-manifest-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: line 28: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 28: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a different origin manifest is completely ignored.
 
 PASS
diff --git a/third_party/blink/web_tests/http/tests/appcache/different-scheme-expected.txt b/third_party/blink/web_tests/http/tests/appcache/different-scheme-expected.txt
index 0c2dbf548..12fdc90 100644
--- a/third_party/blink/web_tests/http/tests/appcache/different-scheme-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/different-scheme-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that application cache doesn't block loading resources with different schemes.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/document-write-html-element-2-expected.txt b/third_party/blink/web_tests/http/tests/appcache/document-write-html-element-2-expected.txt
index d45bc6d..7892afe 100644
--- a/third_party/blink/web_tests/http/tests/appcache/document-write-html-element-2-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/document-write-html-element-2-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: line 11: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 11: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 SUCCESS, no assertion failure
 applicationCache.status == 1
diff --git a/third_party/blink/web_tests/http/tests/appcache/empty-manifest-expected.txt b/third_party/blink/web_tests/http/tests/appcache/empty-manifest-expected.txt
index 36e5d12..8a6ec56 100644
--- a/third_party/blink/web_tests/http/tests/appcache/empty-manifest-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/empty-manifest-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that the cached event gets sent even if the manifest is empty.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/exceptions-expected.txt b/third_party/blink/web_tests/http/tests/appcache/exceptions-expected.txt
index b845fab..36b4cd2 100644
--- a/third_party/blink/web_tests/http/tests/appcache/exceptions-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/exceptions-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that 'ApplicationCache' methods throw exceptions with reasonable messages.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/http/tests/appcache/fallback-expected.txt b/third_party/blink/web_tests/http/tests/appcache/fallback-expected.txt
index d491465..ff31e820 100644
--- a/third_party/blink/web_tests/http/tests/appcache/fallback-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/fallback-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 24: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test application cache fallback entries.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/foreign-fallback-expected.txt b/third_party/blink/web_tests/http/tests/appcache/foreign-fallback-expected.txt
index cf2e6a0..0dade46 100644
--- a/third_party/blink/web_tests/http/tests/appcache/foreign-fallback-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/foreign-fallback-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test for bug 44406: Application Cache crash when a fallback document has a manifest URL.
 
 PASS
diff --git a/third_party/blink/web_tests/http/tests/appcache/foreign-iframe-main-expected.txt b/third_party/blink/web_tests/http/tests/appcache/foreign-iframe-main-expected.txt
index 7e67c97..e8ddb27 100644
--- a/third_party/blink/web_tests/http/tests/appcache/foreign-iframe-main-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/foreign-iframe-main-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test for <rdar://problem/6284708> AppCache crashes in ApplicationCacheResource::addType().
 
 checking
diff --git a/third_party/blink/web_tests/http/tests/appcache/local-content-expected.txt b/third_party/blink/web_tests/http/tests/appcache/local-content-expected.txt
index 73b2d72..fc4879e 100644
--- a/third_party/blink/web_tests/http/tests/appcache/local-content-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/local-content-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE ERROR: line 28: Not allowed to load local resource: stdio.h
 Test that documents loaded from application cache don't get access to local resources accidentally.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/main-resource-hash-expected.txt b/third_party/blink/web_tests/http/tests/appcache/main-resource-hash-expected.txt
index 68a7160..47310e7 100644
--- a/third_party/blink/web_tests/http/tests/appcache/main-resource-hash-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/main-resource-hash-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 21: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that offline applications' main resources are not affected by URL hashes.
 
 Should say SUCCESS:
diff --git a/third_party/blink/web_tests/http/tests/appcache/main-resource-redirect-expected.txt b/third_party/blink/web_tests/http/tests/appcache/main-resource-redirect-expected.txt
index bef7e98c..c893327 100644
--- a/third_party/blink/web_tests/http/tests/appcache/main-resource-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/main-resource-redirect-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: line 3: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 3: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that application cache is consulted again after a redirect response.
 
 PASS
diff --git a/third_party/blink/web_tests/http/tests/appcache/manifest-containing-itself-expected.txt b/third_party/blink/web_tests/http/tests/appcache/manifest-containing-itself-expected.txt
index 666dc2b..86675cce 100644
--- a/third_party/blink/web_tests/http/tests/appcache/manifest-containing-itself-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/manifest-containing-itself-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that a manifest can contain itself as a resource.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/manifest-parsing-expected.txt b/third_party/blink/web_tests/http/tests/appcache/manifest-parsing-expected.txt
index b100450..650c095 100644
--- a/third_party/blink/web_tests/http/tests/appcache/manifest-parsing-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/manifest-parsing-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 21: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test application cache manifest parsing.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/manifest-redirect-2-expected.txt b/third_party/blink/web_tests/http/tests/appcache/manifest-redirect-2-expected.txt
index 11c0971..3f9f53c 100644
--- a/third_party/blink/web_tests/http/tests/appcache/manifest-redirect-2-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/manifest-redirect-2-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: line 25: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 25: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a redirect makes resource caching fail.
 
 Should say SUCCESS:
diff --git a/third_party/blink/web_tests/http/tests/appcache/manifest-redirect-expected.txt b/third_party/blink/web_tests/http/tests/appcache/manifest-redirect-expected.txt
index 11c0971..3f9f53c 100644
--- a/third_party/blink/web_tests/http/tests/appcache/manifest-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/manifest-redirect-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: line 25: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 25: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a redirect makes resource caching fail.
 
 Should say SUCCESS:
diff --git a/third_party/blink/web_tests/http/tests/appcache/manifest-with-empty-file-expected.txt b/third_party/blink/web_tests/http/tests/appcache/manifest-with-empty-file-expected.txt
index 2561765..8bf5c4ef0 100644
--- a/third_party/blink/web_tests/http/tests/appcache/manifest-with-empty-file-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/manifest-with-empty-file-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that a manifest that contains an empty file will not crash the browser.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/modified-manifest-expected.txt b/third_party/blink/web_tests/http/tests/appcache/modified-manifest-expected.txt
index 2ffdc7e6..f64fce2 100644
--- a/third_party/blink/web_tests/http/tests/appcache/modified-manifest-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/modified-manifest-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a manifest that changes during an update fails.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/http/tests/appcache/multi-fallback-expected.txt b/third_party/blink/web_tests/http/tests/appcache/multi-fallback-expected.txt
index cf95cad2..d506d39 100644
--- a/third_party/blink/web_tests/http/tests/appcache/multi-fallback-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/multi-fallback-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 24: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test application cache fallback entries with multiple candidates.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/navigating-away-while-cache-attempt-in-progress-expected.txt b/third_party/blink/web_tests/http/tests/appcache/navigating-away-while-cache-attempt-in-progress-expected.txt
index e8c3739..856a4ad 100644
--- a/third_party/blink/web_tests/http/tests/appcache/navigating-away-while-cache-attempt-in-progress-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/navigating-away-while-cache-attempt-in-progress-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that navigating away while a cache is loading does not crash.
 SUCCESS - did not crash
diff --git a/third_party/blink/web_tests/http/tests/appcache/non-html-expected.txt b/third_party/blink/web_tests/http/tests/appcache/non-html-expected.txt
index e34d0e7..2c05a99 100644
--- a/third_party/blink/web_tests/http/tests/appcache/non-html-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/non-html-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 47: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that non-HTML main resources work with application cache correctly.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/offline-access-expected.txt b/third_party/blink/web_tests/http/tests/appcache/offline-access-expected.txt
index fa0f090..5af98c3 100644
--- a/third_party/blink/web_tests/http/tests/appcache/offline-access-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/offline-access-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 21: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that offline applications work when there is no network access (simulated).
 
 Should say SUCCESS:
diff --git a/third_party/blink/web_tests/http/tests/appcache/online-fallback-layering-expected.txt b/third_party/blink/web_tests/http/tests/appcache/online-fallback-layering-expected.txt
index 88a93c1..f88cdf6 100644
--- a/third_party/blink/web_tests/http/tests/appcache/online-fallback-layering-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/online-fallback-layering-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 22: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that a network namespace trumps a fallback namespace where they overlap.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/online-whitelist-expected.txt b/third_party/blink/web_tests/http/tests/appcache/online-whitelist-expected.txt
index 2f06beb..aa34a876 100644
--- a/third_party/blink/web_tests/http/tests/appcache/online-whitelist-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/online-whitelist-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 35: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test online whitelist functionality. Should say PASS:
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/progress-counter-expected.txt b/third_party/blink/web_tests/http/tests/appcache/progress-counter-expected.txt
index 2ff5587..b85e3ef 100644
--- a/third_party/blink/web_tests/http/tests/appcache/progress-counter-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/progress-counter-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This tests that the lengthComputable / loaded / total properties of the progress event are set correctly.
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/reload-expected.txt b/third_party/blink/web_tests/http/tests/appcache/reload-expected.txt
index c828fda..d4258b7 100644
--- a/third_party/blink/web_tests/http/tests/appcache/reload-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/reload-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 8: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that the manifest is picked correctly when reloading.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/resource-redirect-2-expected.txt b/third_party/blink/web_tests/http/tests/appcache/resource-redirect-2-expected.txt
index 11c0971..3f9f53c 100644
--- a/third_party/blink/web_tests/http/tests/appcache/resource-redirect-2-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/resource-redirect-2-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: line 25: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 25: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a redirect makes resource caching fail.
 
 Should say SUCCESS:
diff --git a/third_party/blink/web_tests/http/tests/appcache/resource-redirect-expected.txt b/third_party/blink/web_tests/http/tests/appcache/resource-redirect-expected.txt
index 932cefc..e3d6cbf4a 100644
--- a/third_party/blink/web_tests/http/tests/appcache/resource-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/resource-redirect-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a redirect makes resource caching fail.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/http/tests/appcache/simple-expected.txt b/third_party/blink/web_tests/http/tests/appcache/simple-expected.txt
index cab92b6..c9031e9e 100644
--- a/third_party/blink/web_tests/http/tests/appcache/simple-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/simple-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 15: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 This tests that the application cache works by first loading a file that does not exist in the cache (to verify that a cache has been associated) and then loads a file that is in the cache
 SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/appcache/top-frame-1-expected.txt b/third_party/blink/web_tests/http/tests/appcache/top-frame-1-expected.txt
index 7c5c65d..ab9f4943 100644
--- a/third_party/blink/web_tests/http/tests/appcache/top-frame-1-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/top-frame-1-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 3: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that a subframe without manifest doesn't pick an application cache from parent frame (as long as no relevant cache contains its resource).
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/top-frame-2-expected.txt b/third_party/blink/web_tests/http/tests/appcache/top-frame-2-expected.txt
index a8df8c4c..e924a475 100644
--- a/third_party/blink/web_tests/http/tests/appcache/top-frame-2-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/top-frame-2-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 4: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that a subframe without manifest gets picked by a relevant application cache that contains its resource.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/top-frame-3-expected.txt b/third_party/blink/web_tests/http/tests/appcache/top-frame-3-expected.txt
index c484be6..444b1e0 100644
--- a/third_party/blink/web_tests/http/tests/appcache/top-frame-3-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/top-frame-3-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 9: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that a subframe with manifest that matches top frame manifest works correctly.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/top-frame-4-expected.txt b/third_party/blink/web_tests/http/tests/appcache/top-frame-4-expected.txt
index f4557bc2..dd422b6 100644
--- a/third_party/blink/web_tests/http/tests/appcache/top-frame-4-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/top-frame-4-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 9: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that a subframe with manifest that matches top frame manifest works correctly.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/update-cache-expected.txt b/third_party/blink/web_tests/http/tests/appcache/update-cache-expected.txt
index e8a7d4f..2f46132 100644
--- a/third_party/blink/web_tests/http/tests/appcache/update-cache-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/update-cache-expected.txt
@@ -1,6 +1,6 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 20: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test a simple offline application self-update process. Should print a series of messages followed with DONE:
 
 Updating cache group...
diff --git a/third_party/blink/web_tests/http/tests/appcache/whitelist-wildcard-expected.txt b/third_party/blink/web_tests/http/tests/appcache/whitelist-wildcard-expected.txt
index bd896da..882d630 100644
--- a/third_party/blink/web_tests/http/tests/appcache/whitelist-wildcard-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/whitelist-wildcard-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 14: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that online whitelist wildcard flag is implemented.
 
diff --git a/third_party/blink/web_tests/http/tests/appcache/wrong-content-type-expected.txt b/third_party/blink/web_tests/http/tests/appcache/wrong-content-type-expected.txt
index c40f13f..fe33e1ea 100644
--- a/third_party/blink/web_tests/http/tests/appcache/wrong-content-type-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/wrong-content-type-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: line 26: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 26: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a manifest served with an arbitrary content-type is OK.
 
 Should say SUCCESS:
diff --git a/third_party/blink/web_tests/http/tests/appcache/wrong-signature-2-expected.txt b/third_party/blink/web_tests/http/tests/appcache/wrong-signature-2-expected.txt
index 536baa2..0bde23b 100644
--- a/third_party/blink/web_tests/http/tests/appcache/wrong-signature-2-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/wrong-signature-2-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a manifest served with a wrong signature isn't treated as such.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/http/tests/appcache/wrong-signature-expected.txt b/third_party/blink/web_tests/http/tests/appcache/wrong-signature-expected.txt
index 536baa2..0bde23b 100644
--- a/third_party/blink/web_tests/http/tests/appcache/wrong-signature-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/wrong-signature-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Test that a manifest served with a wrong signature isn't treated as such.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/http/tests/appcache/xhr-foreign-resource-expected.txt b/third_party/blink/web_tests/http/tests/appcache/xhr-foreign-resource-expected.txt
index e12515b..6f4e585a 100644
--- a/third_party/blink/web_tests/http/tests/appcache/xhr-foreign-resource-expected.txt
+++ b/third_party/blink/web_tests/http/tests/appcache/xhr-foreign-resource-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: line 18: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Test that a resource marked as foreign can still be loaded via XHR.
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/quick-open/command-menu-expected.txt b/third_party/blink/web_tests/http/tests/devtools/quick-open/command-menu-expected.txt
index a587793..ae77112 100644
--- a/third_party/blink/web_tests/http/tests/devtools/quick-open/command-menu-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/quick-open/command-menu-expected.txt
@@ -4,9 +4,9 @@
 Has category: Appearance
 Has category: Console
 Has category: Debugger
-Has category: DevTools
 Has category: Drawer
 Has category: Elements
+Has category: Global
 Has category: Mobile
 Has category: Network
 Has category: Panel
diff --git a/third_party/blink/web_tests/http/tests/devtools/quick-open/command-menu.js b/third_party/blink/web_tests/http/tests/devtools/quick-open/command-menu.js
index 79a13c5c..694cbe4 100644
--- a/third_party/blink/web_tests/http/tests/devtools/quick-open/command-menu.js
+++ b/third_party/blink/web_tests/http/tests/devtools/quick-open/command-menu.js
@@ -20,7 +20,7 @@
     TestRunner.addResult('');
     var whitelist = [
       'Panel: Show Console', 'Drawer: Show Console', 'Appearance: Switch to dark theme',
-      'DevTools: Auto-open DevTools for popups'
+      'Global: Auto-open DevTools for popups'
     ];
     whitelist.forEach(item => {
       if (!commands.has(item))
diff --git a/third_party/blink/web_tests/http/tests/loading/appcache-delay/appcache-loads-subresource-expected.txt b/third_party/blink/web_tests/http/tests/loading/appcache-delay/appcache-loads-subresource-expected.txt
index 7f3ab3d..a1464a2 100644
--- a/third_party/blink/web_tests/http/tests/loading/appcache-delay/appcache-loads-subresource-expected.txt
+++ b/third_party/blink/web_tests/http/tests/loading/appcache-delay/appcache-loads-subresource-expected.txt
@@ -1,7 +1,7 @@
 main frame - DidStartNavigation
 main frame - ReadyToCommitNavigation
 main frame - didCommitLoadForFrame
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 main frame - didFinishDocumentLoadForFrame
 main frame - didHandleOnloadEventsForFrame
 main frame - didFinishLoadForFrame
diff --git a/third_party/blink/web_tests/http/tests/security/cross-origin-appcache-allowed-expected.txt b/third_party/blink/web_tests/http/tests/security/cross-origin-appcache-allowed-expected.txt
index 87e2513..b02d72c 100644
--- a/third_party/blink/web_tests/http/tests/security/cross-origin-appcache-allowed-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/cross-origin-appcache-allowed-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 This iframe should have a cache:
 
 This iframe should have a cache:
diff --git a/third_party/blink/web_tests/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin-expected.txt b/third_party/blink/web_tests/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin-expected.txt
index 7777b27..2a75998 100644
--- a/third_party/blink/web_tests/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/powerfulFeatureRestrictions/old-powerful-features-on-insecure-origin-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: Application Cache API manifest selection is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 CONSOLE WARNING: Application Cache was previously restricted to secure origins only from M70 on but now secure origin use is deprecated and will be removed in M82.  Please shift your use case over to Service Workers.
 CONSOLE WARNING: line 21: getCurrentPosition() and watchPosition() no longer work on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details.
 This is a testharness.js-based test.
diff --git a/third_party/blink/web_tests/platform/mac/fast/events/platform-wheelevent-paging-y-in-scrolling-page-expected.txt b/third_party/blink/web_tests/platform/mac/fast/events/platform-wheelevent-paging-y-in-scrolling-page-expected.txt
deleted file mode 100644
index 64e2df2..0000000
--- a/third_party/blink/web_tests/platform/mac/fast/events/platform-wheelevent-paging-y-in-scrolling-page-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-PASS event.wheelDeltaY is window.givenScrollTop * -3
-PASS event.wheelDeltaX is 0
-PASS event.wheelDelta is window.givenScrollTop * -3
-FAIL document.scrollingElement.scrollTop == window.expectedScrollTop && document.scrollingElement.scrollLeft == window.expectedScrollLeft failed to change to true in 0.5 seconds.
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/blink/web_tests/platform/win/fast/events/platform-wheelevent-paging-y-in-scrolling-page-expected.txt b/third_party/blink/web_tests/platform/win/fast/events/platform-wheelevent-paging-y-in-scrolling-page-expected.txt
deleted file mode 100644
index 8e1ecfc..0000000
--- a/third_party/blink/web_tests/platform/win/fast/events/platform-wheelevent-paging-y-in-scrolling-page-expected.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-PASS event.wheelDeltaY is window.givenScrollTop * -3
-PASS event.wheelDeltaX is 0
-PASS event.wheelDelta is window.givenScrollTop * -3
-PASS document.scrollingElement.scrollTop == window.expectedScrollTop && document.scrollingElement.scrollLeft == window.expectedScrollLeft became true
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
index e64508f..1779d0e 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is navigated. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
index 45b5e2b..6ff9e5c 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
index 117922f..156d81d 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests access of cached DOMWindow properties after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index 66bee0d9..41b97da 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is navigated. Test should not crash and properties read from the cached DOMWindow should be identical to properties through the 'current' DOMWindow.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
index 4ca7f56..f1642f1 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
index 2e19f7e..9d7ae0c7 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE WARNING: line 138: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
-CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around April 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
+CONSOLE WARNING: line 138: Application Cache API use is deprecated and will be removed in M82, around May 2020. See https://www.chromestatus.com/features/6192449487634432 for more details.
 Tests property access on a cached DOMWindow after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/webmidi/implicit-open-expected.txt b/third_party/blink/web_tests/webmidi/implicit-open-expected.txt
index a22f519..0311c527 100644
--- a/third_party/blink/web_tests/webmidi/implicit-open-expected.txt
+++ b/third_party/blink/web_tests/webmidi/implicit-open-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 61: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around April 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
+CONSOLE WARNING: line 61: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around May 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
 Tests MIDIPort implicit open.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/webmidi/open-close-expected.txt b/third_party/blink/web_tests/webmidi/open-close-expected.txt
index 13702e2..27eb844 100644
--- a/third_party/blink/web_tests/webmidi/open-close-expected.txt
+++ b/third_party/blink/web_tests/webmidi/open-close-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 59: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around April 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
+CONSOLE WARNING: line 59: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around May 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
 Tests MIDIPort.open and MIDIPort.close.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/webmidi/requestmidiaccess-basic-expected.txt b/third_party/blink/web_tests/webmidi/requestmidiaccess-basic-expected.txt
index 85a173a..ab20784 100644
--- a/third_party/blink/web_tests/webmidi/requestmidiaccess-basic-expected.txt
+++ b/third_party/blink/web_tests/webmidi/requestmidiaccess-basic-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 12: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around April 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
+CONSOLE WARNING: line 12: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around May 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
 Test if requestMIDIAccess is available.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/webmidi/requestmidiaccess-expected.txt b/third_party/blink/web_tests/webmidi/requestmidiaccess-expected.txt
index 29db228..7c496d0 100644
--- a/third_party/blink/web_tests/webmidi/requestmidiaccess-expected.txt
+++ b/third_party/blink/web_tests/webmidi/requestmidiaccess-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 164: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around April 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
+CONSOLE WARNING: line 164: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around May 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
 Tests navigator.requestMIDIAccess.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/webmidi/requestmidiaccess-fail-expected.txt b/third_party/blink/web_tests/webmidi/requestmidiaccess-fail-expected.txt
index afd81d8..f987b5d 100644
--- a/third_party/blink/web_tests/webmidi/requestmidiaccess-fail-expected.txt
+++ b/third_party/blink/web_tests/webmidi/requestmidiaccess-fail-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 33: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around April 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
+CONSOLE WARNING: line 33: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around May 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
 Tests navigator.requestMIDIAccess failure.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/webmidi/requestmidiaccess-options-expected.txt b/third_party/blink/web_tests/webmidi/requestmidiaccess-options-expected.txt
index d7d18d7..a4651e8 100644
--- a/third_party/blink/web_tests/webmidi/requestmidiaccess-options-expected.txt
+++ b/third_party/blink/web_tests/webmidi/requestmidiaccess-options-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 58: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around April 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
+CONSOLE WARNING: line 58: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around May 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
 Test requestMIDIAccess with various options.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/webmidi/send-system-messages-expected.txt b/third_party/blink/web_tests/webmidi/send-system-messages-expected.txt
index bac95458..1dd425f4 100644
--- a/third_party/blink/web_tests/webmidi/send-system-messages-expected.txt
+++ b/third_party/blink/web_tests/webmidi/send-system-messages-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 40: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around April 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
+CONSOLE WARNING: line 40: Web MIDI will ask a permission to use even if the sysex is not specified in the MIDIOptions since around M82, around May 2020. See https://www.chromestatus.com/feature/5138066234671104 for more details.
 Test if various kinds of system messages can be validated.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-074.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-074.html
new file mode 100644
index 0000000..90842091
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-subtree-visibility/subtree-visibility-074.html
@@ -0,0 +1,53 @@
+<!doctype HTML>
+<html>
+<meta charset="utf8">
+<title>Subtree Visibility: pending visibility changes</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<link rel="help" href="https://github.com/WICG/display-locking">
+<meta name="assert" content="disconnecting elements while visibility state adjustments are pending does not crash">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+body {
+  margin: 0;
+  padding: 0;
+}
+.spacer {
+  height: 3000px;
+}
+.auto {
+  subtree-visibility: auto;
+  width: 5px;
+  height: 5px;
+}
+</style>
+
+<body id="body">
+<div id=one class=auto>text</div>
+<div class=spacer></div>
+<div id=two class=auto>text</div>
+<div class=spacer></div>
+</body>
+
+<script>
+async_test((t) => {
+  function runTest() {
+    document.scrollingElement.scrollTop = 2990;
+
+    const range = document.createRange();
+    range.selectNodeContents(one);
+    window.getSelection().addRange(range);
+
+    requestAnimationFrame(() => {
+      one.remove();
+      two.remove();
+      t.done();
+    });
+  }
+  onload = requestAnimationFrame(() => requestAnimationFrame(runTest));
+});
+
+</script>
+</html>
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 6a32fad..f075fa2 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -67,7 +67,7 @@
       'android-cronet-x86-rel': 'android_cronet_release_bot_minimal_symbols_x86',
       'android-incremental-dbg': 'android_incremental_debug_bot',
       'android-kitkat-arm-rel': 'android_release_bot_minimal_symbols_fastbuild',
-      'android-lollipop-arm-rel': 'android_release_bot_minimal_symbols_fastbuild',
+      'android-lollipop-arm-rel': 'android_release_bot_minimal_symbols_fastbuild_webview_google',
 
       # This bot must use the gpu_tests mixin to match 'Android FYI Release (Nexus 5X)'
       # on the chromium.gpu waterfall, which it mirrors via trybots.pyl.
@@ -148,7 +148,8 @@
       'ToTWinCFI': 'clang_tot_win_cfi_full_cfi_diag_thin_lto_release_static_dcheck_always_on_x86',
       'ToTWinCFI64': 'clang_tot_win_cfi_full_cfi_diag_thin_lto_release_static_dcheck_always_on',
       'ToTWinThinLTO64': 'clang_tot_win_official_full_symbols_thin_lto_static',
-      'ToTiOS': 'ios_error',
+      'ToTiOS': 'ios_clang_tot',
+      'ToTiOSDevice': 'ios_clang_device_tot',
       'UBSanVptr Linux': 'ubsan_vptr_release_bot',
     },
 
@@ -673,7 +674,7 @@
       # shared library loading is fixed.
       'android-cronet-arm-dbg': 'android_cronet_debug_static_bot_arm_no_neon',
       'android-kitkat-arm-rel': 'android_release_trybot_fastbuild',
-      'android-lollipop-arm-rel': 'android_release_trybot_fastbuild',
+      'android-lollipop-arm-rel': 'android_release_trybot_fastbuild_webview_google',
       'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_resource_whitelisting_fastbuild_java_coverage',
       'android-marshmallow-x86-fyi-rel': 'android_release_trybot_x86_fastbuild_resource_whitelisting',
       'android-oreo-arm64-cts-networkservice-dbg': 'android_debug_trybot_arm64',
@@ -1188,6 +1189,11 @@
       'strip_debug_info', 'android_fastbuild',
     ],
 
+    'android_release_bot_minimal_symbols_fastbuild_webview_google': [
+      'android', 'release_bot', 'minimal_symbols',
+      'strip_debug_info', 'android_fastbuild', 'webview_google',
+    ],
+
     'android_release_bot_minimal_symbols_x86_fastbuild_resource_whitelisting': [
       'android', 'release_bot', 'minimal_symbols', 'x86',
       'android_fastbuild', 'resource_whitelisting',
@@ -1224,7 +1230,12 @@
 
     'android_release_trybot_fastbuild': [
       'android', 'release_trybot', 'strip_debug_info', 'android_fastbuild',
-      'android_no_proguard',
+      'android_no_proguard', 
+    ],
+
+    'android_release_trybot_fastbuild_webview_google': [
+      'android', 'release_trybot', 'strip_debug_info', 'android_fastbuild',
+      'android_no_proguard', 'webview_google',
     ],
 
     'android_release_trybot_x86_fastbuild_resource_whitelisting': [
@@ -1819,6 +1830,14 @@
     # build files.
     'ios_error': [ 'error'],
 
+    'ios_clang_tot': [
+      'clang_tot', 'ios_device', 'ios_disable_code_signing', 'release', 'static',
+    ],
+
+    'ios_clang_device_tot': [
+      'clang_tot', 'ios_device', 'release',
+    ],
+
     'ios_cronet': [
       'additional_target_cpus_x86', 'cronet_ios', 'debug_static_bot',
       'ios_deployment_target_9_0', 'ios_simulator'
diff --git a/tools/mb/mb_config_buckets.pyl b/tools/mb/mb_config_buckets.pyl
index ce297ffd..4fb8d5c 100644
--- a/tools/mb/mb_config_buckets.pyl
+++ b/tools/mb/mb_config_buckets.pyl
@@ -199,6 +199,7 @@
       'android-cronet-x86-rel': 'android_cronet_release_bot_minimal_symbols_x86',
       'android-incremental-dbg': 'android_incremental_debug_bot',
       'android-kitkat-arm-rel': 'android_release_trybot_fastbuild',
+      'android-lollipop-arm-rel': 'android_release_trybot_fastbuild_webview_google',
       'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_resource_whitelisting_fastbuild_java_coverage',
       'android-marshmallow-x86-fyi-rel': 'android_release_trybot_x86_resource_whitelisting',
       'android-mojo-webview-rel': 'android_release_bot_minimal_symbols_arm64',
@@ -642,6 +643,7 @@
       'android-deterministic-dbg': 'android_debug_bot',
       'android-deterministic-rel': 'android_without_codecs_release_trybot',
       'android-kitkat-arm-rel': 'android_release_trybot_fastbuild',
+      'android-lollipop-arm-rel': 'android_release_trybot_fastbuild_webview_google',
       'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_resource_whitelisting_fastbuild_java_coverage',
       'android-marshmallow-x86-fyi-rel': 'android_release_trybot_x86_resource_whitelisting',
       'android-opus-kitkat-arm-rel': 'android_release_trybot',
@@ -970,6 +972,7 @@
       'android-deterministic-dbg': 'android_debug_bot',
       'android-deterministic-rel': 'android_without_codecs_release_trybot',
       'android-kitkat-arm-rel': 'android_release_trybot_fastbuild',
+      'android-lollipop-arm-rel': 'android_release_trybot_fastbuild_webview_google',
       'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_resource_whitelisting_fastbuild_java_coverage',
       'android-marshmallow-x86-fyi-rel': 'android_release_trybot_x86_resource_whitelisting',
       'android-opus-kitkat-arm-rel': 'android_release_trybot',
@@ -1226,6 +1229,7 @@
       'android-deterministic-dbg': 'android_debug_bot',
       'android-deterministic-rel': 'android_without_codecs_release_trybot',
       'android-kitkat-arm-rel': 'android_release_trybot_fastbuild',
+      'android-lollipop-arm-rel': 'android_release_trybot_fastbuild_webview_google',
       'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_resource_whitelisting_fastbuild_java_coverage',
       'android-marshmallow-x86-fyi-rel': 'android_release_trybot_x86_resource_whitelisting',
       'android-opus-kitkat-arm-rel': 'android_release_trybot',
@@ -1806,7 +1810,15 @@
       'release_trybot',
       'strip_debug_info',
       'android_fastbuild',
-      'android_no_proguard'
+      'android_no_proguard',
+    ],
+    'android_release_trybot_fastbuild_webview_google': [
+      'android',
+      'release_trybot',
+      'strip_debug_info',
+      'android_fastbuild',
+      'android_no_proguard',
+      'webview_google'
     ],
     'android_release_trybot_x86': [
       'android',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 72426fc..edbe2f6 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -17659,6 +17659,8 @@
   <int value="5" label="ANGLE OpenGL"/>
   <int value="6" label="ANGLE OpenGL ES"/>
   <int value="13" label="Angle D3D11on12"/>
+  <int value="15" label="Angle OpenGL EGL"/>
+  <int value="16" label="Angle OpenGL ES EGL"/>
 </enum>
 
 <enum name="EmbeddedWorkerStartingPhase">
@@ -38867,6 +38869,7 @@
   <int value="-426815606" label="HomepageTile:enabled"/>
   <int value="-424701311" label="SignedHTTPExchange:disabled"/>
   <int value="-424134004" label="WebPaymentsExperimentalFeatures:disabled"/>
+  <int value="-419733676" label="IsolatePrerendersMustProbeOrigin:disabled"/>
   <int value="-418868128" label="enable-experimental-web-platform-features"/>
   <int value="-418676305" label="ScanningUI:enabled"/>
   <int value="-416660617" label="EnforceTLS13Downgrade:disabled"/>
@@ -39930,6 +39933,7 @@
   <int value="857445869" label="enable-captive-portal-bypass-proxy"/>
   <int value="860336036" label="ChromeModernDesign:enabled"/>
   <int value="862453793" label="TranslateUI2016Q2:enabled"/>
+  <int value="864024033" label="IsolatePrerendersMustProbeOrigin:enabled"/>
   <int value="867512869" label="mark-non-secure-as"/>
   <int value="868009556" label="AutofillUpstream:enabled"/>
   <int value="869531646" label="enable-session-crashed-bubble"/>
@@ -42807,6 +42811,13 @@
   <int value="5" label="Play/Pause"/>
 </enum>
 
+<enum name="MediaHistoryInitResult">
+  <int value="0" label="Success"/>
+  <int value="1" label="Failed due to no foreign key support"/>
+  <int value="2" label="Failed since database is too new"/>
+  <int value="3" label="Failed to create tables"/>
+</enum>
+
 <enum name="MediaKeyError">
   <int value="1" label="kUnknownError"/>
   <int value="2" label="kClientError"/>
@@ -57323,6 +57334,12 @@
   <int value="5" label="Failed to get token"/>
 </enum>
 
+<enum name="SafeBrowsingDelayedWarningEvent">
+  <int value="0" label="User loaded a page with a delayed warning"/>
+  <int value="1" label="User left the page and the warning was never shown"/>
+  <int value="2" label="The warning is shown because the user pressed a key"/>
+</enum>
+
 <enum name="SafeBrowsingParseV4HashResult">
   <int value="0" label="PARSE_FROM_STRING_ERROR"/>
   <int value="1" label="UNEXPECTED_THREAT_ENTRY_TYPE_ERROR"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 7114bce..3e661cd2 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4107,7 +4107,7 @@
 </histogram>
 
 <histogram name="Android.SearchEngineChoice.ChosenSearchEngine"
-    enum="OmniboxSearchEngineType" expires_after="2020-04-01">
+    enum="OmniboxSearchEngineType" expires_after="M85">
   <owner>fgorski@chromium.org</owner>
   <owner>lzbylut@chromium.org</owner>
   <summary>
@@ -4117,7 +4117,7 @@
 </histogram>
 
 <histogram name="Android.SearchEngineChoice.Events"
-    enum="AndroidSearchEngineChoiceEvents" expires_after="2020-04-01">
+    enum="AndroidSearchEngineChoiceEvents" expires_after="M85">
   <owner>fgorski@chromium.org</owner>
   <owner>lzbylut@chromium.org</owner>
   <summary>
@@ -4126,7 +4126,7 @@
 </histogram>
 
 <histogram name="Android.SearchEngineChoice.EventsV2"
-    enum="AndroidSearchEngineChoiceEventsV2" expires_after="2020-10-07">
+    enum="AndroidSearchEngineChoiceEventsV2" expires_after="M85">
   <owner>fgorski@chromium.org</owner>
   <owner>pavely@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
@@ -4138,7 +4138,7 @@
 </histogram>
 
 <histogram name="Android.SearchEngineChoice.SearchEngineBeforeChoicePrompt"
-    enum="OmniboxSearchEngineType" expires_after="2020-04-01">
+    enum="OmniboxSearchEngineType" expires_after="M85">
   <owner>fgorski@chromium.org</owner>
   <owner>lzbylut@chromium.org</owner>
   <summary>
@@ -50799,6 +50799,18 @@
   </summary>
 </histogram>
 
+<histogram name="Extensions.ApiUrlNavigationDevtools" enum="Boolean"
+    expires_after="2020-09-13">
+  <owner>tjudkins@chromium.org</owner>
+  <owner>extensions-core@chromium.org</owner>
+  <summary>
+    Reports whether a URL navigated to by an extension through the extensions
+    API has the devtools scheme. Reported once per call to tabs.update(),
+    tabs.create() or browser.openTab(). Also reported from windows.create() and
+    will be reported once for each url passed to that function.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.APIUse_RelativeURL" enum="UrlResolutionResult"
     expires_after="2016-04-29">
   <obsolete>
@@ -71580,9 +71592,11 @@
 </histogram>
 
 <histogram name="Media.AudioRendererImpl.SinkStatus" enum="OutputDeviceStatus"
-    expires_after="2020-04-05">
-  <owner>olka@chromium.org</owner>
+    expires_after="2021-04-05">
+  <owner>armax@chromium.org</owner>
   <owner>dalecurtis@chromium.org</owner>
+  <owner>guidou@chromium.org</owner>
+  <owner>olka@chromium.org</owner>
   <summary>
     Status of audio sink used by AudioRendererImpl. If not OK, a NullAudioSink
     will be used for audio output instead. This is logged for every call to
@@ -73338,6 +73352,15 @@
   </summary>
 </histogram>
 
+<histogram name="Media.History.Init.Result" enum="MediaHistoryInitResult"
+    expires_after="2020-12-31">
+  <owner>beccahughes@chromium.org</owner>
+  <owner>media-dev@chromium.org</owner>
+  <summary>
+    Recorded when Media History is initialized when the browser is started.
+  </summary>
+</histogram>
+
 <histogram name="Media.InfoLoadDelay" units="ms" expires_after="2017-06-26">
   <obsolete>
     Removed June 2017. Found that the MediaInfoLoader class (the only user of
@@ -83218,6 +83241,20 @@
   </summary>
 </histogram>
 
+<histogram name="NativeTheme.GetSystemColor" units="ms"
+    expires_after="2020-12-02">
+  <owner>pkasting@chromium.org</owner>
+  <owner>robliao@chromium.org</owner>
+  <summary>Time required to run ui::NativeTheme::GetSystemColor().</summary>
+</histogram>
+
+<histogram name="NativeTheme.GetSystemColor.UsesColorProvider" enum="Boolean"
+    expires_after="2020-12-02">
+  <owner>pkasting@chromium.org</owner>
+  <owner>robliao@chromium.org</owner>
+  <summary>Records if the color provider computed the color.</summary>
+</histogram>
+
 <histogram name="Navigation.BackForward.AllBackTargetsSkippable" enum="Boolean"
     expires_after="2019-12-31">
   <owner>shivanisha@chromium.org</owner>
@@ -135165,7 +135202,7 @@
   </summary>
 </histogram>
 
-<histogram name="SafeBrowsing.CheckUrl.Timeout" units="Boolean"
+<histogram name="SafeBrowsing.CheckUrl.Timeout" enum="BooleanTimedOut"
     expires_after="2020-08-05">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
@@ -135667,6 +135704,17 @@
   </summary>
 </histogram>
 
+<histogram name="SafeBrowsing.DelayedWarnings.Event"
+    enum="SafeBrowsingDelayedWarningEvent" expires_after="M85">
+  <owner>meacer@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Records when a user in the Delayed Warnings experiment group visits a page
+    with a delayed SafeBrowsing phishing warning, triggers the delayed warning
+    (via keypress), or leaves the page without interacting.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.EnabledSettingChanged" enum="BooleanEnabled"
     expires_after="2015-10-16">
   <obsolete>
diff --git a/ui/accessibility/ax_node_position.cc b/ui/accessibility/ax_node_position.cc
index 99df665..1f1e121 100644
--- a/ui/accessibility/ax_node_position.cc
+++ b/ui/accessibility/ax_node_position.cc
@@ -181,8 +181,10 @@
   const AXNode* anchor = GetAnchor();
   DCHECK(anchor);
   // TODO(nektar): Replace with PlatformChildCount when AXNodePosition and
-  // BrowserAccessibilityPosition will make one.
+  // BrowserAccessibilityPosition are merged into one class.
   if (!AnchorChildCount()) {
+    // Special case: Allows us to get text even in non-web content, e.g. in the
+    // browser's UI.
     text =
         anchor->data().GetString16Attribute(ax::mojom::StringAttribute::kValue);
     if (!text.empty())
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index b44bb25..b8fb7097 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -3590,7 +3590,7 @@
     return;
   }
 
-  ui::AXTree::Selection selection = GetDelegate()->GetUnignoredSelection();
+  AXTree::Selection selection = GetDelegate()->GetUnignoredSelection();
   *anchor_node_id = selection.anchor_object_id;
   *anchor_offset = selection.anchor_offset;
   *focus_node_id = selection.focus_object_id;
@@ -3721,10 +3721,11 @@
 }
 
 void AXPlatformNodeAuraLinux::OnValueChanged() {
-  // If this is a non-web-content text entry, then we need to trigger text
-  // change signals when the value changes. This is handled by browser
-  // accessibility for web content.
-  if (IsPlainTextField() && !GetDelegate()->IsWebContent())
+  // For the AtkText interface to work on non-web content nodes, we need to
+  // update the nodes' hypertext and trigger text change signals when the value
+  // changes. Otherwise, for web and PDF content, this is handled by
+  // "BrowserAccessibilityAuraLinux".
+  if (!GetDelegate()->IsWebContent())
     UpdateHypertext();
 
   if (!GetData().IsRangeValueSupported())
@@ -4341,13 +4342,6 @@
   SetWeakGPtrToAtkObject(&document_parent_, new_document_parent);
 }
 
-base::string16 AXPlatformNodeAuraLinux::GetHypertext() const {
-  // Special case allows us to get text even in non-HTML case, e.g. browser UI.
-  if (IsPlainTextField())
-    return GetString16Attribute(ax::mojom::StringAttribute::kValue);
-  return hypertext_.hypertext;
-}
-
 bool AXPlatformNodeAuraLinux::IsNameExposed() {
   const AXNodeData& data = GetData();
   switch (data.role) {
@@ -4510,7 +4504,7 @@
   gfx::Point scroll_to(x, y);
   scroll_to = ConvertPointToScreenCoordinates(scroll_to, atk_coord_type);
 
-  ui::AXActionData action_data;
+  AXActionData action_data;
   action_data.target_node_id = GetData().id;
   action_data.action = ax::mojom::Action::kScrollToPoint;
   action_data.target_point = scroll_to;
@@ -4520,7 +4514,7 @@
 void AXPlatformNodeAuraLinux::ScrollNodeRectIntoView(
     gfx::Rect rect,
     AtkScrollType atk_scroll_type) {
-  ui::AXActionData action_data;
+  AXActionData action_data;
   action_data.target_node_id = GetData().id;
   action_data.action = ax::mojom::Action::kScrollToMakeVisible;
   action_data.target_rect = rect;
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.h b/ui/accessibility/platform/ax_platform_node_auralinux.h
index 5029309a..5786f8a6 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.h
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -229,7 +229,6 @@
 
   // AXPlatformNodeBase overrides.
   void Init(AXPlatformNodeDelegate* delegate) override;
-  base::string16 GetHypertext() const override;
 
   bool IsNameExposed();
 
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc
index 81478de..fc26514f 100644
--- a/ui/accessibility/platform/ax_platform_node_base.cc
+++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -486,10 +486,11 @@
   return ui::IsText(GetData().role);
 }
 
+bool AXPlatformNodeBase::IsTextField() const {
+  return IsPlainTextField() || IsRichTextField();
+}
+
 bool AXPlatformNodeBase::IsPlainTextField() const {
-  // We need to check both the role and editable state, because some ARIA text
-  // fields may in fact not be editable, whilst some editable fields might not
-  // have the role.
   return GetData().IsPlainTextField();
 }
 
@@ -499,27 +500,50 @@
 }
 
 base::string16 AXPlatformNodeBase::GetHypertext() const {
-  return base::string16();
+  // Hypertext of platform leaves, which internally are composite objects, are
+  // represented with the inner text of the internal composite object. These
+  // don't exist on non-web content.
+  if (IsChildOfLeaf())
+    return GetDelegate()->GetInnerText();
+
+  if (hypertext_.needs_update)
+    UpdateComputedHypertext();
+  return hypertext_.hypertext;
 }
 
 base::string16 AXPlatformNodeBase::GetInnerText() const {
+  // In order to get the inner text for web content, we potentially need access
+  // to nodes that are not exposed to platform APIs, i.e. they are only visible
+  // in the internal accessibility tree. For example, nodes representing the
+  // shadow DOM inside a native text field.
+  if (GetDelegate()->IsWebContent())
+    return GetDelegate()->GetInnerText();
+
+  // Allows us to get text even in non-web content, e.g. in the browser's UI
+  // (AKA Views).
+  //
+  // Unlike in web content The "kValue" attribute takes precedence, because the
+  // accessibility of Views controls are carefully crafted by hand, in contrast
+  // to HTML pages, where any content that might be present in the shadow DOM
+  // (i.e. in the internal accessibility tree) is actually used by the renderer.
+  base::string16 value =
+      GetString16Attribute(ax::mojom::StringAttribute::kValue);
+  if (!value.empty())
+    return value;
+
   // TODO(https://crbug.com/1030703): The check for IsInvisibleOrIgnored()
   // should not be needed. ChildAtIndex() and GetChildCount() are already
   // supposed to skip over nodes that are invisible or ignored, but
   // ViewAXPlatformNodeDelegate does not currently implement this behavior.
-  if (IsTextOnlyObject() && !IsInvisibleOrIgnored())
+  if (!GetChildCount() && !IsInvisibleOrIgnored())
     return GetNameAsString16();
 
   base::string16 text;
-  for (int i = 0; i < GetChildCount(); ++i) {
-    gfx::NativeViewAccessible child_accessible =
-        const_cast<AXPlatformNodeBase*>(this)->ChildAtIndex(i);
-    AXPlatformNodeBase* child = FromNativeViewAccessible(child_accessible);
-    if (!child)
-      continue;
-
+  // TODO(Nektar): Remove const_cast by making all tree traversal methods const.
+  AXPlatformNodeBase* child =
+      const_cast<AXPlatformNodeBase*>(this)->GetFirstChild();
+  for (; child; child = child->GetNextSibling())
     text += child->GetInnerText();
-  }
   return text;
 }
 
@@ -811,8 +835,8 @@
   return focus_object->IsDescendantOf(this);
 }
 
-bool AXPlatformNodeBase::IsLeaf() {
-  if (GetChildCount() == 0)
+bool AXPlatformNodeBase::IsLeaf() const {
+  if (!GetChildCount())
     return true;
 
   // These types of objects may have children that we use as internal
@@ -1180,7 +1204,7 @@
   // object (as opposed to treating it like a native Windows text box).
   // The text-model:a1 attribute is documented here:
   // http://www.linuxfoundation.org/collaborate/workgroups/accessibility/ia2/ia2_implementation_guide
-  if (IsPlainTextField() || IsRichTextField())
+  if (IsTextField())
     AddAttributeToList("text-model", "a1", attributes);
 
   // Expose input-text type attribute.
@@ -1239,23 +1263,16 @@
 }
 
 AXHypertext::AXHypertext() = default;
-AXHypertext::AXHypertext(const AXHypertext& other) = default;
 AXHypertext::~AXHypertext() = default;
+AXHypertext::AXHypertext(const AXHypertext& other) = default;
+AXHypertext& AXHypertext::operator=(const AXHypertext& other) = default;
 
-void AXPlatformNodeBase::UpdateComputedHypertext() {
+void AXPlatformNodeBase::UpdateComputedHypertext() const {
   hypertext_ = AXHypertext();
 
-  if (IsPlainTextField()) {
-    hypertext_.hypertext = GetValue();
-    return;
-  }
-
-  if (!GetChildCount()) {
-    if (IsRichTextField()) {
-      // We don't want to expose any associated label in IA2 Hypertext.
-      return;
-    }
-    hypertext_.hypertext = GetNameAsString16();
+  if (IsLeaf()) {
+    hypertext_.hypertext = GetInnerText();
+    hypertext_.needs_update = false;
     return;
   }
 
@@ -1265,9 +1282,13 @@
   // the character index of each embedded object character to the id of the
   // child object it points to.
   base::string16 hypertext;
-  for (AXPlatformNodeBase* child = GetFirstChild(); child;
-       child = child->GetNextSibling()) {
-    // Similar to Firefox, we don't expose text-only objects in IA2 hypertext.
+  // TODO(Nektar): Remove const_cast by making all tree traversal methods const.
+  AXPlatformNodeBase* child =
+      const_cast<AXPlatformNodeBase*>(this)->GetFirstChild();
+  for (; child; child = child->GetNextSibling()) {
+    // Similar to Firefox, we don't expose text-only objects in IA2 and ATK
+    // hypertext with the embedded object character. We copy all of their text
+    // instead.
     if (child->IsTextOnlyObject()) {
       hypertext_.hypertext += child->GetNameAsString16();
     } else {
@@ -1279,6 +1300,8 @@
       hypertext_.hypertext += kEmbeddedCharacter;
     }
   }
+
+  hypertext_.needs_update = false;
 }
 
 void AXPlatformNodeBase::AddAttributeToList(const char* name,
diff --git a/ui/accessibility/platform/ax_platform_node_base.h b/ui/accessibility/platform/ax_platform_node_base.h
index efd15b7..b46cf48 100644
--- a/ui/accessibility/platform/ax_platform_node_base.h
+++ b/ui/accessibility/platform/ax_platform_node_base.h
@@ -29,8 +29,15 @@
 
 struct AX_EXPORT AXHypertext {
   AXHypertext();
-  AXHypertext(const AXHypertext& other);
   ~AXHypertext();
+  AXHypertext(const AXHypertext& other);
+  AXHypertext& operator=(const AXHypertext& other);
+
+  // A flag that should be set if the hypertext information in this struct is
+  // out-of-date and needs to be updated. This flag should always be set upon
+  // construction because constructing this struct doesn't compute the
+  // hypertext.
+  bool needs_update = true;
 
   // Maps an embedded character offset in |hypertext| to an index in
   // |hyperlinks|.
@@ -209,7 +216,7 @@
   // The definition of a leaf may vary depending on the platform,
   // but a leaf node should never have children that are focusable or
   // that might send notifications.
-  bool IsLeaf();
+  bool IsLeaf() const;
 
   bool IsInvisibleOrIgnored() const;
 
@@ -227,19 +234,31 @@
   // InlineTextBox
   bool IsTextOnlyObject() const;
 
+  // A text field is any widget in which the user should be able to enter and
+  // edit text.
+  //
+  // Examples include <input type="text">, <input type="password">, <textarea>,
+  // <div contenteditable="true">, <div role="textbox">, <div role="searchbox">
+  // and <div role="combobox">. Note that when an ARIA role that indicates that
+  // the widget is editable is used, such as "role=textbox", the element doesn't
+  // need to be contenteditable for this method to return true, as in theory
+  // JavaScript could be used to implement editing functionality. In practice,
+  // this situation should be rare.
+  bool IsTextField() const;
+
   // Returns true if the node is an editable text field.
   bool IsPlainTextField() const;
 
   bool HasFocus();
 
-  // Returns the text of this node and represent the text of descendant nodes
-  // with a special character in place of every embedded object. This represents
-  // the concept of text in ATK and IA2 APIs.
-  virtual base::string16 GetHypertext() const;
+  // If this node is a leaf, returns the text of this node, otherwise represents
+  // each child node with a special "embedded object" character. This is how
+  // text is represented in ATK and IA2 APIs.
+  base::string16 GetHypertext() const;
 
   // Returns the text of this node and all descendant nodes; including text
   // found in embedded objects.
-  virtual base::string16 GetInnerText() const;
+  base::string16 GetInnerText() const;
 
   virtual base::string16 GetValue() const;
 
@@ -378,7 +397,7 @@
   // Compute the hypertext for this node to be exposed via IA2 and ATK This
   // method is responsible for properly embedding children using the special
   // embedded element character.
-  void UpdateComputedHypertext();
+  void UpdateComputedHypertext() const;
 
   // Selection helper functions.
   // The following functions retrieve the endpoints of the current selection.
@@ -435,7 +454,7 @@
 
   std::string GetInvalidValue() const;
 
-  AXHypertext hypertext_;
+  mutable AXHypertext hypertext_;
 
  private:
   // Return true if the index represents a text character.
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index 9454688..8dff087 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -288,7 +288,7 @@
   if (!accessible)
     return nullptr;
   Microsoft::WRL::ComPtr<AXPlatformNodeWin> ax_platform_node;
-  accessible->QueryInterface(ax_platform_node.GetAddressOf());
+  accessible->QueryInterface(IID_PPV_ARGS(&ax_platform_node));
   return ax_platform_node.Get();
 }
 
@@ -604,7 +604,7 @@
       event_type = ax::mojom::Event::kFocus;
     } else if (role == ROLE_SYSTEM_LISTITEM) {
       if (AXPlatformNodeBase* container = GetSelectionContainer()) {
-        const ui::AXNodeData& data = container->GetData();
+        const AXNodeData& data = container->GetData();
         if (data.role == ax::mojom::Role::kListBox &&
             !data.HasState(ax::mojom::State::kMultiselectable) &&
             GetDelegate()->GetFocus() == GetNativeViewAccessible()) {
@@ -620,6 +620,15 @@
     }
   }
 
+  if (event_type == ax::mojom::Event::kValueChanged) {
+    // For the IAccessibleText interface to work on non-web content nodes, we
+    // need to update the nodes' hypertext
+    // when the value changes. Otherwise, for web and PDF content, this is
+    // handled by "BrowserAccessibilityComWin".
+    if (!GetDelegate()->IsWebContent())
+      UpdateComputedHypertext();
+  }
+
   if (base::Optional<DWORD> native_event = MojoEventToMSAAEvent(event_type)) {
     HWND hwnd = GetDelegate()->GetTargetForNativeAccessibilityEvent();
     if (!hwnd)
@@ -648,21 +657,6 @@
     AddAlertTarget();
 }
 
-base::string16 AXPlatformNodeWin::GetHypertext() const {
-  // Special case allows us to get text even in non-HTML case, e.g. browser UI.
-  if (!GetDelegate()->IsWebContent()) {
-    if (IsPlainTextField())
-      return GetString16Attribute(ax::mojom::StringAttribute::kValue);
-  }
-
-  // Hypertext of platform leaves, which internally are composite objects, are
-  // represented with the inner text of the internal composite object.
-  if (IsChildOfLeaf())
-    return GetInnerText();
-
-  return hypertext_.hypertext;
-}
-
 bool AXPlatformNodeWin::HasActiveComposition() const {
   return active_composition_range_.end() > active_composition_range_.start();
 }
@@ -1564,7 +1558,7 @@
     return E_INVALIDARG;
   }
 
-  ui::AXActionData action_data;
+  AXActionData action_data;
   action_data.target_node_id = GetData().id;
   action_data.action = ax::mojom::Action::kScrollToPoint;
   action_data.target_point = scroll_to;
@@ -1678,7 +1672,7 @@
   if (ranges->anchorOffset < 0 || ranges->activeOffset < 0)
     return E_INVALIDARG;
 
-  if (anchor_node->IsTextOnlyObject() || anchor_node->IsPlainTextField()) {
+  if (anchor_node->IsLeaf()) {
     if (size_t{ranges->anchorOffset} > anchor_node->GetHypertext().length()) {
       return E_INVALIDARG;
     }
@@ -1687,7 +1681,7 @@
       return E_INVALIDARG;
   }
 
-  if (focus_node->IsTextOnlyObject() || focus_node->IsPlainTextField()) {
+  if (focus_node->IsLeaf()) {
     if (size_t{ranges->activeOffset} > focus_node->GetHypertext().length())
       return E_INVALIDARG;
   } else {
@@ -3298,7 +3292,7 @@
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_CHARACTERS);
   COM_OBJECT_VALIDATE_1_ARG(n_characters);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes |
-                                       ui::AXMode::kInlineTextBoxes);
+                                       AXMode::kInlineTextBoxes);
 
   base::string16 text = GetHypertext();
   *n_characters = static_cast<LONG>(text.size());
@@ -3409,7 +3403,7 @@
     BSTR* text) {
   COM_OBJECT_VALIDATE_3_ARGS(start_offset, end_offset, text);
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes |
-                                       ui::AXMode::kInlineTextBoxes);
+                                       AXMode::kInlineTextBoxes);
 
   // https://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/_accessible_text_8idl.html
   // IA2_TEXT_BOUNDARY_SENTENCE is optional and we can let the screenreader
@@ -3867,7 +3861,7 @@
   gfx::AcceleratedWidget widget =
       delegate_->GetTargetForNativeAccessibilityEvent();
   if (widget) {
-    ui::AXFragmentRootWin* root =
+    AXFragmentRootWin* root =
         AXFragmentRootWin::GetForAcceleratedWidget(widget);
     if (root != nullptr) {
       root->GetNativeViewAccessible()->QueryInterface(
@@ -4320,7 +4314,7 @@
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_SHOWCONTEXTMENU);
   UIA_VALIDATE_CALL();
 
-  ui::AXActionData action_data;
+  AXActionData action_data;
   action_data.action = ax::mojom::Action::kShowContextMenu;
   delegate_->AccessibilityPerformAction(action_data);
   return S_OK;
@@ -4382,7 +4376,7 @@
     if (!IsCellOrTableHeader(accessible->GetData().role))
       return E_NOINTERFACE;
   } else if (riid == IID_IAccessibleText || riid == IID_IAccessibleHypertext) {
-    if (ui::IsImageOrVideo(accessible->GetData().role)) {
+    if (IsImageOrVideo(accessible->GetData().role)) {
       return E_NOINTERFACE;
     }
   }
@@ -5188,7 +5182,7 @@
   if (data.HasState(ax::mojom::State::kEditable))
     ia2_state |= IA2_STATE_EDITABLE;
 
-  if (IsPlainTextField() || IsRichTextField()) {
+  if (IsTextField()) {
     if (data.HasState(ax::mojom::State::kMultiline)) {
       ia2_state |= IA2_STATE_MULTI_LINE;
     } else {
@@ -6745,7 +6739,7 @@
     return true;
   }
   // non web-content case.
-  const ui::AXNodeData& data = GetData();
+  const AXNodeData& data = GetData();
   return !((IsReadOnlySupported(data.role) && data.IsReadOnlyOrDisabled()) ||
            data.HasState(ax::mojom::State::kInvisible) ||
            (data.IsIgnored() && !data.HasState(ax::mojom::State::kFocusable)));
@@ -7013,7 +7007,7 @@
       data.GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) {
     AXPlatformNodeBase* container = FromNativeViewAccessible(GetParent());
     if (container && container->GetParent() == focus) {
-      ui::AXNodeData container_data = container->GetData();
+      AXNodeData container_data = container->GetData();
       if ((container_data.role == ax::mojom::Role::kListBox ||
            container_data.role == ax::mojom::Role::kMenu) &&
           !container_data.HasState(ax::mojom::State::kMultiselectable)) {
@@ -7358,7 +7352,7 @@
       static_cast<AXPlatformNodeWin*>(FromNativeViewAccessible(GetParent()));
   // Static text nodes are always expected to have a parent.
   DCHECK(parent);
-  return (parent->IsPlainTextField() || parent->IsRichTextField()) &&
+  return parent->IsTextField() &&
          parent->HasStringAttribute(ax::mojom::StringAttribute::kPlaceholder);
 }
 
diff --git a/ui/accessibility/platform/ax_platform_node_win.h b/ui/accessibility/platform/ax_platform_node_win.h
index 08ab395..b4e95f27 100644
--- a/ui/accessibility/platform/ax_platform_node_win.h
+++ b/ui/accessibility/platform/ax_platform_node_win.h
@@ -415,7 +415,6 @@
   // AXPlatformNodeBase overrides.
   void Destroy() override;
   base::string16 GetValue() const override;
-  base::string16 GetHypertext() const override;
 
   //
   // IAccessible methods.
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index 79478f9a..045237c 100644
--- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -2909,7 +2909,7 @@
 TEST_F(AXPlatformNodeWinTest, TestIAccessibleTextGetNCharacters) {
   AXNodeData root;
   root.id = 1;
-  root.role = ax::mojom::Role::kStaticText;
+  root.role = ax::mojom::Role::kRootWebArea;
 
   AXNodeData node;
   node.id = 2;
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index cbfd25d..ce75b50 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -322,6 +322,7 @@
     "java/src/org/chromium/ui/modaldialog/ModalDialogManager.java",
     "java/src/org/chromium/ui/modaldialog/ModalDialogManagerHolder.java",
     "java/src/org/chromium/ui/modaldialog/ModalDialogProperties.java",
+    "java/src/org/chromium/ui/modaldialog/SimpleModalDialogController.java",
     "java/src/org/chromium/ui/modelutil/ForwardingListObservable.java",
     "java/src/org/chromium/ui/modelutil/LayoutViewBuilder.java",
     "java/src/org/chromium/ui/modelutil/LazyConstructionPropertyMcp.java",
diff --git a/ui/android/java/src/org/chromium/ui/modaldialog/SimpleModalDialogController.java b/ui/android/java/src/org/chromium/ui/modaldialog/SimpleModalDialogController.java
new file mode 100644
index 0000000..6246d422
--- /dev/null
+++ b/ui/android/java/src/org/chromium/ui/modaldialog/SimpleModalDialogController.java
@@ -0,0 +1,46 @@
+// 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.
+
+package org.chromium.ui.modaldialog;
+
+import androidx.annotation.NonNull;
+
+import org.chromium.base.Callback;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/**
+ * A default implementation of Controller which dismisses the dialog when a button is clicked.
+ *
+ * The result of the dialog is passed back via a Callback.
+ */
+public class SimpleModalDialogController implements ModalDialogProperties.Controller {
+    private final ModalDialogManager mModalDialogManager;
+    private Callback<Integer> mActionCallback;
+
+    /**
+     * @param modalDialogManager the dialog manager where the dialog will be shown.
+     * @param action a callback which will be run with the result of the confirmation.
+     */
+    public SimpleModalDialogController(
+            ModalDialogManager modalDialogManager, @NonNull Callback<Integer> action) {
+        mModalDialogManager = modalDialogManager;
+        mActionCallback = action;
+    }
+
+    @Override
+    public void onClick(PropertyModel model, int buttonType) {
+        if (buttonType == ModalDialogProperties.ButtonType.POSITIVE) {
+            mModalDialogManager.dismissDialog(model, DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
+        } else {
+            mModalDialogManager.dismissDialog(model, DialogDismissalCause.NEGATIVE_BUTTON_CLICKED);
+        }
+    }
+
+    @Override
+    public void onDismiss(PropertyModel model, int dismissalCause) {
+        Callback<Integer> action = mActionCallback;
+        mActionCallback = null;
+        action.onResult(dismissalCause);
+    }
+}
diff --git a/ui/aura/test/aura_test_helper.cc b/ui/aura/test/aura_test_helper.cc
index 31b4a24..00c3dec9 100644
--- a/ui/aura/test/aura_test_helper.cc
+++ b/ui/aura/test/aura_test_helper.cc
@@ -30,7 +30,6 @@
 #include "ui/display/screen.h"
 #include "ui/wm/core/default_activation_client.h"
 #include "ui/wm/core/default_screen_position_client.h"
-#include "ui/wm/core/wm_state.h"
 
 #if defined(OS_LINUX)
 #include "ui/platform_window/common/platform_window_defaults.h"  // nogncheck
@@ -53,10 +52,8 @@
 
 }  // namespace
 
-AuraTestHelper::AuraTestHelper() : AuraTestHelper(nullptr) {}
-
-AuraTestHelper::AuraTestHelper(std::unique_ptr<Env> env)
-    : wm_state_(std::make_unique<wm::WMState>()), env_(std::move(env)) {
+AuraTestHelper::AuraTestHelper(ui::ContextFactory* context_factory,
+                               bool disable_animations) {
   DCHECK(!g_instance);
   g_instance = this;
 
@@ -69,17 +66,27 @@
   ui::test::EventGeneratorDelegate::SetFactoryFunction(
       base::BindRepeating(&EventGeneratorDelegateAura::Create));
 
-  zero_duration_mode_ = std::make_unique<ui::ScopedAnimationDurationScaleMode>(
-      ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
+  if (disable_animations) {
+    zero_duration_mode_ =
+        std::make_unique<ui::ScopedAnimationDurationScaleMode>(
+            ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
+  }
 
   // Some tests suites create Env globally.
   if (Env::HasInstance())
     context_factory_to_restore_ = Env::GetInstance()->context_factory();
   else
     env_ = Env::CreateInstance();
+  Env* env = GetEnv();
+
+  if (!context_factory) {
+    context_factories_ = std::make_unique<ui::TestContextFactories>(false);
+    context_factory = context_factories_->GetContextFactory();
+  }
+  env->set_context_factory(context_factory);
 
   // Reset aura::Env to eliminate test dependency (https://crbug.com/586514).
-  EnvTestHelper env_helper(GetEnv());
+  EnvTestHelper env_helper(env);
   env_helper.ResetEnvForTesting();
   // Unit tests generally don't want to query the system, rather use the state
   // from RootWindow.
@@ -92,8 +99,8 @@
 }
 
 AuraTestHelper::~AuraTestHelper() {
-  CHECK(setup_called_) << "AuraTestHelper::SetUp() never called.";
-  CHECK(teardown_called_) << "AuraTestHelper::TearDown() never called.";
+  if (g_instance)
+    TearDown();
 }
 
 // static
@@ -101,15 +108,7 @@
   return g_instance;
 }
 
-void AuraTestHelper::SetUp(ui::ContextFactory* context_factory) {
-  setup_called_ = true;
-
-  if (!context_factory) {
-    context_factories_ = std::make_unique<ui::TestContextFactories>(false);
-    context_factory = context_factories_->GetContextFactory();
-  }
-  GetEnv()->set_context_factory(context_factory);
-
+void AuraTestHelper::SetUp() {
   display::Screen* screen = display::Screen::GetScreen();
   gfx::Size host_size(screen ? screen->GetPrimaryDisplay().GetSizeInPixel()
                              : gfx::Size(800, 600));
@@ -138,11 +137,9 @@
 }
 
 void AuraTestHelper::TearDown() {
-  teardown_called_ = true;
-
   g_instance = nullptr;
 
-  if (display::Screen::GetScreen() == test_screen_.get())
+  if (test_screen_ && (display::Screen::GetScreen() == GetTestScreen()))
     display::Screen::SetScreenInstance(nullptr);
 
   if (!env_)
diff --git a/ui/aura/test/aura_test_helper.h b/ui/aura/test/aura_test_helper.h
index 2f13fbe3..4f66525 100644
--- a/ui/aura/test/aura_test_helper.h
+++ b/ui/aura/test/aura_test_helper.h
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "build/build_config.h"
 #include "ui/aura/window_event_dispatcher.h"
+#include "ui/wm/core/wm_state.h"
 
 namespace ui {
 class ContextFactory;
@@ -17,10 +18,6 @@
 class TestContextFactories;
 }
 
-namespace wm {
-class WMState;
-}
-
 namespace aura {
 class Env;
 class TestScreen;
@@ -41,18 +38,21 @@
 // that are necessary to run test on Aura.
 class AuraTestHelper {
  public:
-  AuraTestHelper();
-  explicit AuraTestHelper(std::unique_ptr<Env> env);
+  // Instantiates/destroys an AuraTestHelper. This can happen in a
+  // single-threaded phase without a backing task environment, and must not
+  // create one lest the caller wish to do so.
+  explicit AuraTestHelper(ui::ContextFactory* context_factory = nullptr,
+                          bool disable_animations = true);
   ~AuraTestHelper();
 
   // Returns the current AuraTestHelper, or nullptr if it's not alive.
   static AuraTestHelper* GetInstance();
 
   // Creates and initializes (shows and sizes) the RootWindow for use in tests.
-  void SetUp(ui::ContextFactory* context_factory = nullptr);
+  void SetUp();
 
-  // Clean up objects that are created for tests. This also deletes the Env
-  // object.
+  // Destroys the window, Env, and most other objects.  This will be called
+  // automatically on destruction if it is not called manually earlier.
   void TearDown();
 
   // Flushes message loop.
@@ -66,13 +66,12 @@
 
   Env* GetEnv();
 
+ protected:
   // May only be called between SetUp() and TearDown().
   ui::ContextFactory* GetContextFactory();
 
  private:
-  bool setup_called_ = false;
-  bool teardown_called_ = false;
-  std::unique_ptr<wm::WMState> wm_state_;
+  std::unique_ptr<wm::WMState> wm_state_ = std::make_unique<wm::WMState>();
   std::unique_ptr<ui::ScopedAnimationDurationScaleMode> zero_duration_mode_;
   std::unique_ptr<Env> env_;
   ui::ContextFactory* context_factory_to_restore_ = nullptr;
diff --git a/ui/aura/window_tree_host_platform.cc b/ui/aura/window_tree_host_platform.cc
index 55e6e8b..cf8d788 100644
--- a/ui/aura/window_tree_host_platform.cc
+++ b/ui/aura/window_tree_host_platform.cc
@@ -74,9 +74,12 @@
 #elif defined(OS_WIN)
   platform_window_.reset(new ui::WinWindow(this, properties.bounds));
 #elif defined(USE_X11)
-  auto x11_window = std::make_unique<ui::X11Window>(this);
+  auto platform_window = std::make_unique<ui::X11Window>(this);
+  auto* x11_window = platform_window.get();
+  // platform_window() may be called during Initialize(), so call
+  // SetPlatformWindow() now.
+  SetPlatformWindow(std::move(platform_window));
   x11_window->Initialize(std::move(properties));
-  SetPlatformWindow(std::move(x11_window));
 #else
   NOTIMPLEMENTED();
 #endif
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index f93a4af8..144c559 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -6,6 +6,7 @@
 import("//build/config/compiler/compiler.gni")
 import("//build/config/dcheck_always_on.gni")
 import("//build/config/jumbo.gni")
+import("//build/config/linux/gtk/gtk.gni")
 import("//build/config/linux/pangocairo/pangocairo.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/config/ui.gni")
@@ -68,6 +69,7 @@
     "USE_ATK=$use_atk",
     "USE_XKBCOMMON=$use_xkbcommon",
     "HAS_NATIVE_ACCESSIBILITY=$has_native_accessibility",
+    "USE_GTK=$use_gtk",
   ]
 }
 
diff --git a/ui/base/x/BUILD.gn b/ui/base/x/BUILD.gn
index 5ff69988..4d09693f 100644
--- a/ui/base/x/BUILD.gn
+++ b/ui/base/x/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/jumbo.gni")
+import("//build/config/linux/gtk/gtk.gni")
 import("//build/config/ui.gni")
 import("//ui/ozone/ozone.gni")
 
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc
index 17e531a..1facb28 100644
--- a/ui/base/x/x11_util.cc
+++ b/ui/base/x/x11_util.cc
@@ -1039,6 +1039,45 @@
   return true;
 }
 
+bool IsWmTiling(WindowManagerName window_manager) {
+  switch (window_manager) {
+    case WM_BLACKBOX:
+    case WM_COMPIZ:
+    case WM_ENLIGHTENMENT:
+    case WM_FLUXBOX:
+    case WM_ICE_WM:
+    case WM_KWIN:
+    case WM_MATCHBOX:
+    case WM_METACITY:
+    case WM_MUFFIN:
+    case WM_MUTTER:
+    case WM_OPENBOX:
+    case WM_XFWM4:
+      // Stacking window managers.
+      return false;
+
+    case WM_I3:
+    case WM_ION3:
+    case WM_NOTION:
+    case WM_RATPOISON:
+    case WM_STUMPWM:
+      // Tiling window managers.
+      return true;
+
+    case WM_AWESOME:
+    case WM_QTILE:
+    case WM_XMONAD:
+    case WM_WMII:
+      // Dynamic (tiling and stacking) window managers.  Assume tiling.
+      return true;
+
+    case WM_OTHER:
+    case WM_UNNAMED:
+      // Unknown.  Assume stacking.
+      return false;
+  }
+}
+
 bool GetWindowDesktop(XID window, int* desktop) {
   return GetIntProperty(window, "_NET_WM_DESKTOP", desktop);
 }
diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h
index 721a0707..0f6c539 100644
--- a/ui/base/x/x11_util.h
+++ b/ui/base/x/x11_util.h
@@ -303,6 +303,10 @@
 // can't determine it, return "Unknown".
 COMPONENT_EXPORT(UI_BASE_X) std::string GuessWindowManagerName();
 
+// Returns a buest-effort guess as to whether |window_manager| is tiling (true)
+// or stacking (false).
+COMPONENT_EXPORT(UI_BASE_X) bool IsWmTiling(WindowManagerName window_manager);
+
 // Returns true if a compositing manager is present.
 COMPONENT_EXPORT(UI_BASE_X) bool IsCompositingManagerPresent();
 
diff --git a/ui/base/x/x11_window.cc b/ui/base/x/x11_window.cc
index 2c9c97b..6f5f225d 100644
--- a/ui/base/x/x11_window.cc
+++ b/ui/base/x/x11_window.cc
@@ -185,7 +185,7 @@
       break;
   }
   // An in-activatable window should not interact with the system wm.
-  if (!activatable_)
+  if (!activatable_ || config.override_redirect)
     swa.override_redirect = x11::True;
 
 #if !defined(USE_X11)
@@ -1452,6 +1452,17 @@
   XLowerWindow(xdisplay_, xwindow_);
 }
 
+void XWindow::SetOverrideRedirect(bool override_redirect) {
+  bool remap = window_mapped_in_client_;
+  if (remap)
+    Hide();
+  XSetWindowAttributes swa;
+  swa.override_redirect = override_redirect;
+  XChangeWindowAttributes(xdisplay_, xwindow_, CWOverrideRedirect, &swa);
+  if (remap)
+    Map();
+}
+
 bool XWindow::ContainsPointInRegion(const gfx::Point& point) const {
   if (!shape())
     return true;
diff --git a/ui/base/x/x11_window.h b/ui/base/x/x11_window.h
index 9939835..d0f852b 100644
--- a/ui/base/x/x11_window.h
+++ b/ui/base/x/x11_window.h
@@ -81,6 +81,7 @@
     bool visible_on_all_workspaces;
     bool remove_standard_frame;
     bool prefer_dark_theme;
+    bool override_redirect;
     std::string workspace;
     std::string wm_class_name;
     std::string wm_class_class;
@@ -138,6 +139,7 @@
   void NotifySwapAfterResize();
   void ConfineCursorTo(const gfx::Rect& bounds);
   void LowerWindow();
+  void SetOverrideRedirect(bool override_redirect);
 
   // Returns if the point is within XWindow shape. If shape is not set, always
   // returns true.
diff --git a/ui/gfx/mojom/BUILD.gn b/ui/gfx/mojom/BUILD.gn
index e5d469d..f6fffd3 100644
--- a/ui/gfx/mojom/BUILD.gn
+++ b/ui/gfx/mojom/BUILD.gn
@@ -24,13 +24,76 @@
   ]
 
   public_deps = [
+    ":native_handle_types",
     "//mojo/public/mojom/base",
     "//ui/gfx/geometry/mojom",
   ]
 
+  buffer_types_shared_cpp_typemap = {
+    types = [
+      {
+        mojom = "gfx.mojom.BufferFormat"
+        cpp = "::gfx::BufferFormat"
+      },
+      {
+        mojom = "gfx.mojom.BufferUsage"
+        cpp = "::gfx::BufferUsage"
+      },
+      {
+        mojom = "gfx.mojom.BufferUsageAndFormat"
+        cpp = "::gfx::BufferUsageAndFormat"
+      },
+      {
+        mojom = "gfx.mojom.GpuMemoryBufferHandle"
+        cpp = "::gfx::GpuMemoryBufferHandle"
+        move_only = true
+        nullable_is_same_type = true
+      },
+      {
+        mojom = "gfx.mojom.GpuMemoryBufferId"
+        cpp = "::gfx::GpuMemoryBufferId"
+        copyable_pass_by_value = true
+      },
+      {
+        mojom = "gfx.mojom.GpuMemoryBufferType"
+        cpp = "::gfx::GpuMemoryBufferType"
+      },
+    ]
+
+    traits_headers = [ "buffer_types_mojom_traits.h" ]
+    traits_public_deps = [ ":shared_mojom_traits" ]
+  }
+
+  cpp_typemaps = [ buffer_types_shared_cpp_typemap ]
+  blink_cpp_typemaps = [ buffer_types_shared_cpp_typemap ]
+}
+
+mojom("native_handle_types") {
+  sources = [ "native_handle_types.mojom" ]
   if (is_linux || use_ozone) {
     enabled_features = [ "supports_native_pixmap" ]
   }
+  public_deps = [ "//mojo/public/mojom/base" ]
+  generate_java = true
+
+  shared_cpp_typemap = {
+    types = [
+      {
+        mojom = "gfx.mojom.NativePixmapHandle"
+        cpp = "::gfx::NativePixmapHandle"
+        move_only = true
+      },
+      {
+        mojom = "gfx.mojom.NativePixmapPlane"
+        cpp = "::gfx::NativePixmapPlane"
+        move_only = true
+      },
+    ]
+    traits_headers = [ "native_handle_types_mojom_traits.h" ]
+    traits_public_deps = [ ":native_handle_types_mojom_traits" ]
+  }
+  cpp_typemaps = [ shared_cpp_typemap ]
+  blink_cpp_typemaps = [ shared_cpp_typemap ]
 }
 
 mojom("test_interfaces") {
@@ -50,3 +113,33 @@
   ]
   defines = [ "IS_UI_GFX_MOJOM_TRAITS_IMPL" ]
 }
+
+component("native_handle_types_mojom_traits") {
+  output_name = "gfx_native_types_shared_mojom_traits"
+  defines = [ "IS_GFX_NATIVE_HANDLE_TYPES_SHARED_MOJOM_TRAITS_IMPL" ]
+  sources = [
+    "native_handle_types_mojom_traits.cc",
+    "native_handle_types_mojom_traits.h",
+  ]
+
+  public_deps = [
+    ":native_handle_types_shared",
+    "//base",
+    "//mojo/public/mojom/base",
+    "//ui/gfx",
+  ]
+}
+
+component("shared_mojom_traits") {
+  output_name = "gfx_shared_mojom_traits"
+  defines = [ "IS_GFX_SHARED_MOJOM_TRAITS_IMPL" ]
+  sources = [
+    "buffer_types_mojom_traits.cc",
+    "buffer_types_mojom_traits.h",
+  ]
+  public_deps = [
+    ":mojom_shared",
+    ":native_handle_types",
+    "//ui/gfx",
+  ]
+}
diff --git a/ui/gfx/mojom/buffer_types.mojom b/ui/gfx/mojom/buffer_types.mojom
index 6feeb148..95ad129 100644
--- a/ui/gfx/mojom/buffer_types.mojom
+++ b/ui/gfx/mojom/buffer_types.mojom
@@ -4,8 +4,7 @@
 
 module gfx.mojom;
 
-import "mojo/public/mojom/base/shared_memory.mojom";
-import "mojo/public/mojom/base/unguessable_token.mojom";
+import "ui/gfx/mojom/native_handle_types.mojom";
 
 // gfx::BufferFormat
 enum BufferFormat {
@@ -48,65 +47,6 @@
   int32 id;
 };
 
-// gfx::NativePixmapPlane
-[EnableIf=supports_native_pixmap]
-struct NativePixmapPlane {
-  uint32 stride;
-  uint64 offset;
-  uint64 size;
-
-  // A platform-specific handle the underlying memory object.
-  handle<platform> buffer_handle;
-};
-
-// gfx::NativePixmapHandle
-[EnableIf=supports_native_pixmap]
-struct NativePixmapHandle {
-  array<NativePixmapPlane> planes;
-
-  [EnableIf=is_linux]
-  uint64 modifier;
-  [EnableIf=is_chromeos]
-  uint64 modifier;
-
-  [EnableIf=is_fuchsia]
-  mojo_base.mojom.UnguessableToken? buffer_collection_id;
-  [EnableIf=is_fuchsia]
-  uint32 buffer_index;
-  [EnableIf=is_fuchsia]
-  bool ram_coherency;
-};
-
-[EnableIf=is_android]
-struct AHardwareBufferHandle {
-  // The actual file descriptor used to wrap the AHardwareBuffer object for
-  // serialization.
-  handle<platform> buffer_handle;
-
-  // A message pipe handle which tracks the lifetime of this
-  // AHardwareBufferHandle. The sender may use this to observe the lifetime
-  // remotely by watching the other end of this pipe. Useful for retaining a
-  // sender-side AHB ref until the receiver deserializes the AHB and acquires its
-  // own ref.
-  handle<message_pipe> tracking_pipe;
-};
-
-union GpuMemoryBufferPlatformHandle {
-  mojo_base.mojom.UnsafeSharedMemoryRegion shared_memory_handle;
-
-  [EnableIf=supports_native_pixmap]
-  NativePixmapHandle native_pixmap_handle;
-
-  [EnableIf=is_mac]
-  handle<platform> mach_port;
-
-  [EnableIf=is_win]
-  handle<platform> dxgi_handle;
-
-  [EnableIf=is_android]
-  AHardwareBufferHandle android_hardware_buffer_handle;
-};
-
 // gfx::GpuMemoryBufferHandle
 struct GpuMemoryBufferHandle {
   GpuMemoryBufferId id;
diff --git a/ui/gfx/mojom/buffer_types.typemap b/ui/gfx/mojom/buffer_types.typemap
deleted file mode 100644
index cb837b9..0000000
--- a/ui/gfx/mojom/buffer_types.typemap
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//ui/gfx/mojom/buffer_types.mojom"
-public_headers = [
-  "//ui/gfx/buffer_types.h",
-  "//ui/gfx/gpu_memory_buffer.h",
-  "//ui/gfx/native_pixmap_handle.h",
-]
-traits_headers = [ "//ui/gfx/mojom/buffer_types_mojom_traits.h" ]
-sources = [
-  "//ui/gfx/mojom/buffer_types_mojom_traits.cc",
-]
-public_deps = [
-  "//ui/gfx",
-]
-type_mappings = [
-  "gfx.mojom.BufferFormat=::gfx::BufferFormat",
-  "gfx.mojom.BufferUsage=::gfx::BufferUsage",
-  "gfx.mojom.BufferUsageAndFormat=::gfx::BufferUsageAndFormat",
-  "gfx.mojom.GpuMemoryBufferHandle=::gfx::GpuMemoryBufferHandle[move_only,nullable_is_same_type]",
-  "gfx.mojom.GpuMemoryBufferId=::gfx::GpuMemoryBufferId[copyable_pass_by_value]",
-  "gfx.mojom.GpuMemoryBufferType=::gfx::GpuMemoryBufferType",
-  "gfx.mojom.NativePixmapHandle=::gfx::NativePixmapHandle[move_only]",
-  "gfx.mojom.NativePixmapPlane=::gfx::NativePixmapPlane[move_only]",
-]
diff --git a/ui/gfx/mojom/buffer_types_for_blink.typemap b/ui/gfx/mojom/buffer_types_for_blink.typemap
deleted file mode 100644
index dd0a327..0000000
--- a/ui/gfx/mojom/buffer_types_for_blink.typemap
+++ /dev/null
@@ -1,24 +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.
-
-mojom = "//ui/gfx/mojom/buffer_types.mojom"
-public_headers = [
-  "//ui/gfx/buffer_types.h",
-  "//ui/gfx/gpu_memory_buffer.h",
-  "//ui/gfx/native_pixmap_handle.h",
-]
-traits_headers = [ "//ui/gfx/mojom/buffer_types_mojom_traits.h" ]
-public_deps = [
-  "//ui/gfx/mojom",
-]
-type_mappings = [
-  "gfx.mojom.BufferFormat=gfx::BufferFormat",
-  "gfx.mojom.BufferUsage=gfx::BufferUsage",
-  "gfx.mojom.BufferUsageAndFormat=gfx::BufferUsageAndFormat",
-  "gfx.mojom.GpuMemoryBufferHandle=gfx::GpuMemoryBufferHandle[move_only,nullable_is_same_type]",
-  "gfx.mojom.GpuMemoryBufferId=gfx::GpuMemoryBufferId[copyable_pass_by_value]",
-  "gfx.mojom.GpuMemoryBufferType=gfx::GpuMemoryBufferType",
-  "gfx.mojom.NativePixmapHandle=gfx::NativePixmapHandle[move_only]",
-  "gfx.mojom.NativePixmapPlane=gfx::NativePixmapPlane[move_only]",
-]
diff --git a/ui/gfx/mojom/buffer_types_mojom_traits.cc b/ui/gfx/mojom/buffer_types_mojom_traits.cc
index 3d02643..3bf27b7 100644
--- a/ui/gfx/mojom/buffer_types_mojom_traits.cc
+++ b/ui/gfx/mojom/buffer_types_mojom_traits.cc
@@ -5,7 +5,6 @@
 #include "ui/gfx/mojom/buffer_types_mojom_traits.h"
 
 #include "build/build_config.h"
-#include "mojo/public/cpp/base/shared_memory_mojom_traits.h"
 
 #if defined(OS_ANDROID)
 #include "base/android/scoped_hardware_buffer_handle.h"
@@ -23,58 +22,6 @@
   return data.ReadUsage(&out->usage) && data.ReadFormat(&out->format);
 }
 
-#if defined(OS_LINUX) || defined(USE_OZONE)
-mojo::PlatformHandle StructTraits<
-    gfx::mojom::NativePixmapPlaneDataView,
-    gfx::NativePixmapPlane>::buffer_handle(gfx::NativePixmapPlane& plane) {
-#if defined(OS_LINUX)
-  return mojo::PlatformHandle(std::move(plane.fd));
-#elif defined(OS_FUCHSIA)
-  return mojo::PlatformHandle(std::move(plane.vmo));
-#endif  // defined(OS_LINUX)
-}
-
-bool StructTraits<
-    gfx::mojom::NativePixmapPlaneDataView,
-    gfx::NativePixmapPlane>::Read(gfx::mojom::NativePixmapPlaneDataView data,
-                                  gfx::NativePixmapPlane* out) {
-  out->stride = data.stride();
-  out->offset = data.offset();
-  out->size = data.size();
-
-  mojo::PlatformHandle handle = data.TakeBufferHandle();
-#if defined(OS_LINUX)
-  if (!handle.is_fd())
-    return false;
-  out->fd = handle.TakeFD();
-#elif defined(OS_FUCHSIA)
-  if (!handle.is_handle())
-    return false;
-  out->vmo = zx::vmo(handle.TakeHandle());
-#endif  // defined(OS_LINUX)
-
-  return true;
-}
-
-bool StructTraits<
-    gfx::mojom::NativePixmapHandleDataView,
-    gfx::NativePixmapHandle>::Read(gfx::mojom::NativePixmapHandleDataView data,
-                                   gfx::NativePixmapHandle* out) {
-#if defined(OS_LINUX)
-  out->modifier = data.modifier();
-#endif
-
-#if defined(OS_FUCHSIA)
-  if (!data.ReadBufferCollectionId(&out->buffer_collection_id))
-    return false;
-  out->buffer_index = data.buffer_index();
-  out->ram_coherency = data.ram_coherency();
-#endif
-
-  return data.ReadPlanes(&out->planes);
-}
-#endif  // defined(OS_LINUX) || defined(USE_OZONE)
-
 gfx::mojom::GpuMemoryBufferPlatformHandlePtr StructTraits<
     gfx::mojom::GpuMemoryBufferHandleDataView,
     gfx::GpuMemoryBufferHandle>::platform_handle(gfx::GpuMemoryBufferHandle&
diff --git a/ui/gfx/mojom/buffer_types_mojom_traits.h b/ui/gfx/mojom/buffer_types_mojom_traits.h
index 0237131e..6d309d03 100644
--- a/ui/gfx/mojom/buffer_types_mojom_traits.h
+++ b/ui/gfx/mojom/buffer_types_mojom_traits.h
@@ -7,16 +7,20 @@
 
 #include <vector>
 
-#include "base/containers/span.h"
+#include "base/component_export.h"
 #include "build/build_config.h"
-#include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
+#include "mojo/public/cpp/bindings/enum_traits.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
 #include "ui/gfx/buffer_types.h"
-#include "ui/gfx/mojom/buffer_types.mojom.h"
+#include "ui/gfx/gpu_memory_buffer.h"
+#include "ui/gfx/mojom/buffer_types.mojom-shared.h"
+#include "ui/gfx/mojom/native_handle_types.mojom.h"
 
 namespace mojo {
 
 template <>
-struct EnumTraits<gfx::mojom::BufferFormat, gfx::BufferFormat> {
+struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
+    EnumTraits<gfx::mojom::BufferFormat, gfx::BufferFormat> {
   static gfx::mojom::BufferFormat ToMojom(gfx::BufferFormat format) {
     switch (format) {
       case gfx::BufferFormat::R_8:
@@ -109,7 +113,8 @@
 };
 
 template <>
-struct EnumTraits<gfx::mojom::BufferUsage, gfx::BufferUsage> {
+struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
+    EnumTraits<gfx::mojom::BufferUsage, gfx::BufferUsage> {
   static gfx::mojom::BufferUsage ToMojom(gfx::BufferUsage usage) {
     switch (usage) {
       case gfx::BufferUsage::GPU_READ:
@@ -167,8 +172,9 @@
 };
 
 template <>
-struct StructTraits<gfx::mojom::BufferUsageAndFormatDataView,
-                    gfx::BufferUsageAndFormat> {
+struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
+    StructTraits<gfx::mojom::BufferUsageAndFormatDataView,
+                 gfx::BufferUsageAndFormat> {
   static gfx::BufferUsage usage(const gfx::BufferUsageAndFormat& input) {
     return input.usage;
   }
@@ -182,8 +188,9 @@
 };
 
 template <>
-struct StructTraits<gfx::mojom::GpuMemoryBufferIdDataView,
-                    gfx::GpuMemoryBufferId> {
+struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
+    StructTraits<gfx::mojom::GpuMemoryBufferIdDataView,
+                 gfx::GpuMemoryBufferId> {
   static int32_t id(const gfx::GpuMemoryBufferId& buffer_id) {
     return buffer_id.id;
   }
@@ -194,61 +201,10 @@
   }
 };
 
-#if defined(OS_LINUX) || defined(USE_OZONE)
 template <>
-struct StructTraits<gfx::mojom::NativePixmapPlaneDataView,
-                    gfx::NativePixmapPlane> {
-  static uint32_t stride(const gfx::NativePixmapPlane& plane) {
-    return plane.stride;
-  }
-  static int32_t offset(const gfx::NativePixmapPlane& plane) {
-    return plane.offset;
-  }
-  static uint64_t size(const gfx::NativePixmapPlane& plane) {
-    return plane.size;
-  }
-  static mojo::PlatformHandle buffer_handle(gfx::NativePixmapPlane& plane);
-  static bool Read(gfx::mojom::NativePixmapPlaneDataView data,
-                   gfx::NativePixmapPlane* out);
-};
-
-template <>
-struct StructTraits<gfx::mojom::NativePixmapHandleDataView,
-                    gfx::NativePixmapHandle> {
-  static std::vector<gfx::NativePixmapPlane>& planes(
-      gfx::NativePixmapHandle& pixmap_handle) {
-    return pixmap_handle.planes;
-  }
-
-#if defined(OS_LINUX)
-  static uint64_t modifier(const gfx::NativePixmapHandle& pixmap_handle) {
-    return pixmap_handle.modifier;
-  }
-#endif
-
-#if defined(OS_FUCHSIA)
-  static const base::Optional<base::UnguessableToken>& buffer_collection_id(
-      const gfx::NativePixmapHandle& pixmap_handle) {
-    return pixmap_handle.buffer_collection_id;
-  }
-
-  static uint32_t buffer_index(gfx::NativePixmapHandle& pixmap_handle) {
-    return pixmap_handle.buffer_index;
-  }
-
-  static bool ram_coherency(gfx::NativePixmapHandle& pixmap_handle) {
-    return pixmap_handle.ram_coherency;
-  }
-#endif  // defined(OS_FUCHSIA)
-
-  static bool Read(gfx::mojom::NativePixmapHandleDataView data,
-                   gfx::NativePixmapHandle* out);
-};
-#endif  // defined(OS_LINUX) || defined(USE_OZONE)
-
-template <>
-struct StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView,
-                    gfx::GpuMemoryBufferHandle> {
+struct COMPONENT_EXPORT(GFX_SHARED_MOJOM_TRAITS)
+    StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView,
+                 gfx::GpuMemoryBufferHandle> {
   static gfx::GpuMemoryBufferId id(const gfx::GpuMemoryBufferHandle& handle) {
     return handle.id;
   }
@@ -258,8 +214,8 @@
   static uint32_t stride(const gfx::GpuMemoryBufferHandle& handle) {
     return handle.stride;
   }
-  static gfx::mojom::GpuMemoryBufferPlatformHandlePtr platform_handle(
-      gfx::GpuMemoryBufferHandle& handle);
+  static mojo::StructPtr<gfx::mojom::GpuMemoryBufferPlatformHandle>
+  platform_handle(gfx::GpuMemoryBufferHandle& handle);
 
   static bool Read(gfx::mojom::GpuMemoryBufferHandleDataView data,
                    gfx::GpuMemoryBufferHandle* handle);
diff --git a/ui/gfx/mojom/native_handle_types.mojom b/ui/gfx/mojom/native_handle_types.mojom
new file mode 100644
index 0000000..5cf1461
--- /dev/null
+++ b/ui/gfx/mojom/native_handle_types.mojom
@@ -0,0 +1,67 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module gfx.mojom;
+
+import "mojo/public/mojom/base/shared_memory.mojom";
+import "mojo/public/mojom/base/unguessable_token.mojom";
+
+// gfx::NativePixmapPlane
+[EnableIf=supports_native_pixmap]
+struct NativePixmapPlane {
+  uint32 stride;
+  uint64 offset;
+  uint64 size;
+
+  // A platform-specific handle the underlying memory object.
+  handle<platform> buffer_handle;
+};
+
+// gfx::NativePixmapHandle
+[EnableIf=supports_native_pixmap]
+struct NativePixmapHandle {
+  array<NativePixmapPlane> planes;
+
+  [EnableIf=is_linux]
+  uint64 modifier;
+  [EnableIf=is_chromeos]
+  uint64 modifier;
+
+  [EnableIf=is_fuchsia]
+  mojo_base.mojom.UnguessableToken? buffer_collection_id;
+  [EnableIf=is_fuchsia]
+  uint32 buffer_index;
+  [EnableIf=is_fuchsia]
+  bool ram_coherency;
+};
+
+[EnableIf=is_android]
+struct AHardwareBufferHandle {
+  // The actual file descriptor used to wrap the AHardwareBuffer object for
+  // serialization.
+  handle<platform> buffer_handle;
+
+  // A message pipe handle which tracks the lifetime of this
+  // AHardwareBufferHandle. The sender may use this to observe the lifetime
+  // remotely by watching the other end of this pipe. Useful for retaining a
+  // sender-side AHB ref until the receiver deserializes the AHB and acquires
+  // its own ref.
+  handle<message_pipe> tracking_pipe;
+};
+
+union GpuMemoryBufferPlatformHandle {
+  mojo_base.mojom.UnsafeSharedMemoryRegion shared_memory_handle;
+
+  [EnableIf=supports_native_pixmap]
+  NativePixmapHandle native_pixmap_handle;
+
+  [EnableIf=is_mac]
+  handle<platform> mach_port;
+
+  [EnableIf=is_win]
+  handle<platform> dxgi_handle;
+
+  [EnableIf=is_android]
+  AHardwareBufferHandle android_hardware_buffer_handle;
+};
diff --git a/ui/gfx/mojom/native_handle_types_mojom_traits.cc b/ui/gfx/mojom/native_handle_types_mojom_traits.cc
new file mode 100644
index 0000000..6263574a
--- /dev/null
+++ b/ui/gfx/mojom/native_handle_types_mojom_traits.cc
@@ -0,0 +1,63 @@
+// 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 "ui/gfx/mojom/native_handle_types_mojom_traits.h"
+
+#include "build/build_config.h"
+
+namespace mojo {
+
+#if defined(OS_LINUX) || defined(USE_OZONE)
+mojo::PlatformHandle StructTraits<
+    gfx::mojom::NativePixmapPlaneDataView,
+    gfx::NativePixmapPlane>::buffer_handle(gfx::NativePixmapPlane& plane) {
+#if defined(OS_LINUX)
+  return mojo::PlatformHandle(std::move(plane.fd));
+#elif defined(OS_FUCHSIA)
+  return mojo::PlatformHandle(std::move(plane.vmo));
+#endif  // defined(OS_LINUX)
+}
+
+bool StructTraits<
+    gfx::mojom::NativePixmapPlaneDataView,
+    gfx::NativePixmapPlane>::Read(gfx::mojom::NativePixmapPlaneDataView data,
+                                  gfx::NativePixmapPlane* out) {
+  out->stride = data.stride();
+  out->offset = data.offset();
+  out->size = data.size();
+
+  mojo::PlatformHandle handle = data.TakeBufferHandle();
+#if defined(OS_LINUX)
+  if (!handle.is_fd())
+    return false;
+  out->fd = handle.TakeFD();
+#elif defined(OS_FUCHSIA)
+  if (!handle.is_handle())
+    return false;
+  out->vmo = zx::vmo(handle.TakeHandle());
+#endif  // defined(OS_LINUX)
+
+  return true;
+}
+
+bool StructTraits<
+    gfx::mojom::NativePixmapHandleDataView,
+    gfx::NativePixmapHandle>::Read(gfx::mojom::NativePixmapHandleDataView data,
+                                   gfx::NativePixmapHandle* out) {
+#if defined(OS_LINUX)
+  out->modifier = data.modifier();
+#endif
+
+#if defined(OS_FUCHSIA)
+  if (!data.ReadBufferCollectionId(&out->buffer_collection_id))
+    return false;
+  out->buffer_index = data.buffer_index();
+  out->ram_coherency = data.ram_coherency();
+#endif
+
+  return data.ReadPlanes(&out->planes);
+}
+#endif  // defined(OS_LINUX) || defined(USE_OZONE)
+
+}  // namespace mojo
diff --git a/ui/gfx/mojom/native_handle_types_mojom_traits.h b/ui/gfx/mojom/native_handle_types_mojom_traits.h
new file mode 100644
index 0000000..4836957
--- /dev/null
+++ b/ui/gfx/mojom/native_handle_types_mojom_traits.h
@@ -0,0 +1,79 @@
+// 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 UI_GFX_MOJOM_NATIVE_HANDLE_TYPES_MOJOM_TRAITS_H_
+#define UI_GFX_MOJOM_NATIVE_HANDLE_TYPES_MOJOM_TRAITS_H_
+
+#include "base/component_export.h"
+#include "base/numerics/safe_conversions.h"
+#include "build/build_config.h"
+#include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
+#include "mojo/public/cpp/bindings/union_traits.h"
+#include "mojo/public/cpp/system/platform_handle.h"
+#include "ui/gfx/mojom/native_handle_types.mojom-shared.h"
+
+#if defined(OS_LINUX) || defined(USE_OZONE)
+#include "ui/gfx/native_pixmap_handle.h"
+#endif
+
+namespace mojo {
+
+#if defined(OS_LINUX) || defined(USE_OZONE)
+template <>
+struct COMPONENT_EXPORT(GFX_NATIVE_HANDLE_TYPES_SHARED_MOJOM_TRAITS)
+    StructTraits<gfx::mojom::NativePixmapPlaneDataView,
+                 gfx::NativePixmapPlane> {
+  static uint32_t stride(const gfx::NativePixmapPlane& plane) {
+    return plane.stride;
+  }
+  static int32_t offset(const gfx::NativePixmapPlane& plane) {
+    return base::saturated_cast<int32_t>(plane.offset);
+  }
+  static uint64_t size(const gfx::NativePixmapPlane& plane) {
+    return plane.size;
+  }
+  static mojo::PlatformHandle buffer_handle(gfx::NativePixmapPlane& plane);
+  static bool Read(gfx::mojom::NativePixmapPlaneDataView data,
+                   gfx::NativePixmapPlane* out);
+};
+
+template <>
+struct COMPONENT_EXPORT(GFX_NATIVE_HANDLE_TYPES_SHARED_MOJOM_TRAITS)
+    StructTraits<gfx::mojom::NativePixmapHandleDataView,
+                 gfx::NativePixmapHandle> {
+  static std::vector<gfx::NativePixmapPlane>& planes(
+      gfx::NativePixmapHandle& pixmap_handle) {
+    return pixmap_handle.planes;
+  }
+
+#if defined(OS_LINUX)
+  static uint64_t modifier(const gfx::NativePixmapHandle& pixmap_handle) {
+    return pixmap_handle.modifier;
+  }
+#endif
+
+#if defined(OS_FUCHSIA)
+  static const base::Optional<base::UnguessableToken>& buffer_collection_id(
+      const gfx::NativePixmapHandle& pixmap_handle) {
+    return pixmap_handle.buffer_collection_id;
+  }
+
+  static uint32_t buffer_index(gfx::NativePixmapHandle& pixmap_handle) {
+    return pixmap_handle.buffer_index;
+  }
+
+  static bool ram_coherency(gfx::NativePixmapHandle& pixmap_handle) {
+    return pixmap_handle.ram_coherency;
+  }
+#endif  // defined(OS_FUCHSIA)
+
+  static bool Read(gfx::mojom::NativePixmapHandleDataView data,
+                   gfx::NativePixmapHandle* out);
+};
+#endif  // defined(OS_LINUX) || defined(USE_OZONE)
+
+}  // namespace mojo
+
+#endif  // UI_GFX_MOJOM_NATIVE_HANDLE_TYPES_MOJOM_TRAITS_H_
diff --git a/ui/gfx/typemaps.gni b/ui/gfx/typemaps.gni
index d6625c1..4646e0cb 100644
--- a/ui/gfx/typemaps.gni
+++ b/ui/gfx/typemaps.gni
@@ -6,7 +6,6 @@
   "//ui/gfx/geometry/mojom/geometry.typemap",
   "//ui/gfx/image/mojom/image.typemap",
   "//ui/gfx/mojom/accelerated_widget.typemap",
-  "//ui/gfx/mojom/buffer_types.typemap",
   "//ui/gfx/mojom/ca_layer_params.typemap",
   "//ui/gfx/mojom/color_space.typemap",
   "//ui/gfx/mojom/display_color_spaces.typemap",
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc
index 65d0cc4..72268904 100644
--- a/ui/gl/gl_surface_egl.cc
+++ b/ui/gl/gl_surface_egl.cc
@@ -80,6 +80,7 @@
 #define EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3206
 #define EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE 0x3451
 #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209
+#define EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE 0x348E
 #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE 0x320A
 #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x345E
 #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE 0x3487
@@ -397,6 +398,13 @@
           native_display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,
           enabled_angle_features, disabled_angle_features,
           extra_display_attribs);
+    case ANGLE_OPENGL_EGL:
+      extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+      extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE);
+      return GetPlatformANGLEDisplay(
+          native_display, EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE,
+          enabled_angle_features, disabled_angle_features,
+          extra_display_attribs);
     case ANGLE_OPENGL_NULL:
       extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
       extra_display_attribs.push_back(
@@ -410,6 +418,13 @@
           native_display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE,
           enabled_angle_features, disabled_angle_features,
           extra_display_attribs);
+    case ANGLE_OPENGLES_EGL:
+      extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
+      extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_EGL_ANGLE);
+      return GetPlatformANGLEDisplay(
+          native_display, EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE,
+          enabled_angle_features, disabled_angle_features,
+          extra_display_attribs);
     case ANGLE_OPENGLES_NULL:
       extra_display_attribs.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE);
       extra_display_attribs.push_back(
@@ -514,6 +529,10 @@
       return "D3D11on12";
     case ANGLE_SWIFTSHADER:
       return "SwiftShader";
+    case ANGLE_OPENGL_EGL:
+      return "OpenGLEGL";
+    case ANGLE_OPENGLES_EGL:
+      return "OpenGLESEGL";
     default:
       NOTREACHED();
       return "Err";
@@ -742,6 +761,7 @@
                         bool supports_angle_null,
                         bool supports_angle_vulkan,
                         bool supports_angle_swiftshader,
+                        bool supports_angle_egl,
                         const base::CommandLine* command_line,
                         std::vector<DisplayType>* init_displays) {
   // SwiftShader does not use the platform extensions
@@ -812,6 +832,12 @@
         AddInitDisplay(init_displays, ANGLE_OPENGL_NULL);
       } else if (requested_renderer == kANGLEImplementationOpenGLESNULLName) {
         AddInitDisplay(init_displays, ANGLE_OPENGLES_NULL);
+      } else if (requested_renderer == kANGLEImplementationOpenGLEGLName &&
+                 supports_angle_egl) {
+        AddInitDisplay(init_displays, ANGLE_OPENGL_EGL);
+      } else if (requested_renderer == kANGLEImplementationOpenGLESEGLName &&
+                 supports_angle_egl) {
+        AddInitDisplay(init_displays, ANGLE_OPENGLES_EGL);
       }
     }
   }
@@ -1135,6 +1161,7 @@
   bool supports_angle_null = false;
   bool supports_angle_vulkan = false;
   bool supports_angle_swiftshader = false;
+  bool supports_angle_egl = false;
   // Check for availability of ANGLE extensions.
   if (client_extensions &&
       ExtensionsContain(client_extensions, "EGL_ANGLE_platform_angle")) {
@@ -1148,6 +1175,8 @@
         ExtensionsContain(client_extensions, "EGL_ANGLE_platform_angle_vulkan");
     supports_angle_swiftshader = ExtensionsContain(
         client_extensions, "EGL_ANGLE_platform_angle_device_type_swiftshader");
+    supports_angle_egl = ExtensionsContain(
+        client_extensions, "EGL_ANGLE_platform_angle_device_type_egl_angle");
   }
 
   bool supports_angle = supports_angle_d3d || supports_angle_opengl ||
@@ -1163,7 +1192,8 @@
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   GetEGLInitDisplays(supports_angle_d3d, supports_angle_opengl,
                      supports_angle_null, supports_angle_vulkan,
-                     supports_angle_swiftshader, command_line, &init_displays);
+                     supports_angle_swiftshader, supports_angle_egl,
+                     command_line, &init_displays);
 
   std::vector<std::string> enabled_angle_features =
       GetStringVectorFromCommandLine(command_line,
diff --git a/ui/gl/gl_surface_egl.h b/ui/gl/gl_surface_egl.h
index 54f15b0..10099277 100644
--- a/ui/gl/gl_surface_egl.h
+++ b/ui/gl/gl_surface_egl.h
@@ -55,7 +55,7 @@
 class GLSurfacePresentationHelper;
 
 // If adding a new type, also add it to EGLDisplayType in
-// tools/metrics/histograms/histograms.xml. Don't remove or reorder entries.
+// tools/metrics/histograms/enums.xml. Don't remove or reorder entries.
 enum DisplayType {
   DEFAULT = 0,
   SWIFT_SHADER = 1,
@@ -72,7 +72,9 @@
   ANGLE_VULKAN_NULL = 12,
   ANGLE_D3D11on12 = 13,
   ANGLE_SWIFTSHADER = 14,
-  DISPLAY_TYPE_MAX = 15,
+  ANGLE_OPENGL_EGL = 15,
+  ANGLE_OPENGLES_EGL = 16,
+  DISPLAY_TYPE_MAX = 17,
 };
 
 GL_EXPORT void GetEGLInitDisplays(bool supports_angle_d3d,
@@ -80,6 +82,7 @@
                                   bool supports_angle_null,
                                   bool supports_angle_vulkan,
                                   bool supports_angle_swiftshader,
+                                  bool supports_angle_egl,
                                   const base::CommandLine* command_line,
                                   std::vector<DisplayType>* init_displays);
 
diff --git a/ui/gl/gl_switches.cc b/ui/gl/gl_switches.cc
index eb0f618..a0c332a 100644
--- a/ui/gl/gl_switches.cc
+++ b/ui/gl/gl_switches.cc
@@ -23,7 +23,9 @@
 const char kANGLEImplementationD3D11Name[]    = "d3d11";
 const char kANGLEImplementationD3D11on12Name[] = "d3d11on12";
 const char kANGLEImplementationOpenGLName[]   = "gl";
+const char kANGLEImplementationOpenGLEGLName[] = "gl-egl";
 const char kANGLEImplementationOpenGLESName[] = "gles";
+const char kANGLEImplementationOpenGLESEGLName[] = "gles-egl";
 const char kANGLEImplementationNullName[] = "null";
 const char kANGLEImplementationVulkanName[] = "vulkan";
 const char kANGLEImplementationSwiftShaderName[] = "swiftshader";
diff --git a/ui/gl/gl_switches.h b/ui/gl/gl_switches.h
index 4c34454..bd36328d 100644
--- a/ui/gl/gl_switches.h
+++ b/ui/gl/gl_switches.h
@@ -28,7 +28,9 @@
 GL_EXPORT extern const char kANGLEImplementationD3D11Name[];
 GL_EXPORT extern const char kANGLEImplementationD3D11on12Name[];
 GL_EXPORT extern const char kANGLEImplementationOpenGLName[];
+GL_EXPORT extern const char kANGLEImplementationOpenGLEGLName[];
 GL_EXPORT extern const char kANGLEImplementationOpenGLESName[];
+GL_EXPORT extern const char kANGLEImplementationOpenGLESEGLName[];
 GL_EXPORT extern const char kANGLEImplementationNullName[];
 GL_EXPORT extern const char kANGLEImplementationVulkanName[];
 GL_EXPORT extern const char kANGLEImplementationSwiftShaderName[];
diff --git a/ui/gl/test/egl_initialization_displays_unittest.cc b/ui/gl/test/egl_initialization_displays_unittest.cc
index 1699a3e..0ed3173 100644
--- a/ui/gl/test/egl_initialization_displays_unittest.cc
+++ b/ui/gl/test/egl_initialization_displays_unittest.cc
@@ -17,7 +17,7 @@
   // using --disable-d3d11 with the default --use-angle should never return
   // D3D11.
   command_line->AppendSwitch(switches::kDisableD3D11);
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_FALSE(base::Contains(displays, gl::ANGLE_D3D11));
 
@@ -26,7 +26,7 @@
   command_line->AppendSwitchASCII(switches::kUseANGLE,
                                   gl::kANGLEImplementationD3D11Name);
   displays.clear();
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_TRUE(base::Contains(displays, gl::ANGLE_D3D11));
   EXPECT_EQ(displays.size(), 1u);
@@ -34,7 +34,7 @@
   // Specifically requesting D3D11 should not return D3D11 if the extension is
   // not available
   displays.clear();
-  GetEGLInitDisplays(false, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(false, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_FALSE(base::Contains(displays, gl::ANGLE_D3D11));
 }
@@ -49,7 +49,7 @@
   command_line->AppendSwitchASCII(switches::kUseGL,
                                   gl::kGLImplementationSwiftShaderForWebGLName);
   displays.clear();
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_TRUE(base::Contains(displays, gl::SWIFT_SHADER));
   EXPECT_EQ(displays.size(), 1u);
@@ -58,7 +58,7 @@
   command_line->AppendSwitchASCII(switches::kUseANGLE,
                                   gl::kANGLEImplementationD3D11Name);
   displays.clear();
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_TRUE(base::Contains(displays, gl::SWIFT_SHADER));
   EXPECT_EQ(displays.size(), 1u);
@@ -70,7 +70,7 @@
 
   // Default without --use-angle flag
   std::vector<gl::DisplayType> default_no_flag_displays;
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &default_no_flag_displays);
   EXPECT_FALSE(default_no_flag_displays.empty());
 
@@ -78,7 +78,7 @@
   command_line->AppendSwitchASCII(switches::kUseANGLE,
                                   gl::kANGLEImplementationDefaultName);
   std::vector<gl::DisplayType> default_with_flag_displays;
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &default_with_flag_displays);
   EXPECT_FALSE(default_with_flag_displays.empty());
 
@@ -96,7 +96,7 @@
   command_line->AppendSwitchASCII(switches::kUseANGLE,
                                   gl::kANGLEImplementationOpenGLName);
   displays.clear();
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_TRUE(base::Contains(displays, gl::ANGLE_OPENGL));
   EXPECT_EQ(displays.size(), 1u);
@@ -105,7 +105,7 @@
   command_line->AppendSwitchASCII(switches::kUseANGLE,
                                   gl::kANGLEImplementationOpenGLESName);
   displays.clear();
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_TRUE(base::Contains(displays, gl::ANGLE_OPENGLES));
   EXPECT_EQ(displays.size(), 1u);
@@ -114,7 +114,7 @@
   command_line->AppendSwitchASCII(switches::kUseANGLE,
                                   gl::kANGLEImplementationNullName);
   displays.clear();
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_TRUE(base::Contains(displays, gl::ANGLE_NULL));
   EXPECT_EQ(displays.size(), 1u);
@@ -123,7 +123,7 @@
   command_line->AppendSwitchASCII(switches::kUseANGLE,
                                   gl::kANGLEImplementationVulkanName);
   displays.clear();
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_TRUE(base::Contains(displays, gl::ANGLE_VULKAN));
   EXPECT_EQ(displays.size(), 1u);
@@ -132,10 +132,28 @@
   command_line->AppendSwitchASCII(switches::kUseANGLE,
                                   gl::kANGLEImplementationSwiftShaderName);
   displays.clear();
-  GetEGLInitDisplays(true, true, true, true, true, command_line.get(),
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
                      &displays);
   EXPECT_TRUE(base::Contains(displays, gl::ANGLE_SWIFTSHADER));
   EXPECT_EQ(displays.size(), 1u);
+
+  // OpenGL EGL
+  command_line->AppendSwitchASCII(switches::kUseANGLE,
+                                  gl::kANGLEImplementationOpenGLEGLName);
+  displays.clear();
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
+                     &displays);
+  EXPECT_TRUE(base::Contains(displays, gl::ANGLE_OPENGL_EGL));
+  EXPECT_EQ(displays.size(), 1u);
+
+  // OpenGLES EGL
+  command_line->AppendSwitchASCII(switches::kUseANGLE,
+                                  gl::kANGLEImplementationOpenGLESEGLName);
+  displays.clear();
+  GetEGLInitDisplays(true, true, true, true, true, true, command_line.get(),
+                     &displays);
+  EXPECT_TRUE(base::Contains(displays, gl::ANGLE_OPENGLES_EGL));
+  EXPECT_EQ(displays.size(), 1u);
 }
 
 TEST(EGLInitializationDisplaysTest, NoExtensions) {
@@ -144,8 +162,8 @@
 
   // With no angle platform extensions, only DEFAULT should be available
   std::vector<gl::DisplayType> displays;
-  GetEGLInitDisplays(false, false, false, false, false, command_line.get(),
-                     &displays);
+  GetEGLInitDisplays(false, false, false, false, false, false,
+                     command_line.get(), &displays);
   EXPECT_TRUE(base::Contains(displays, gl::DEFAULT));
   EXPECT_EQ(displays.size(), 1u);
 }
diff --git a/ui/gtk/BUILD.gn b/ui/gtk/BUILD.gn
new file mode 100644
index 0000000..d76b321
--- /dev/null
+++ b/ui/gtk/BUILD.gn
@@ -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.
+
+import("//build/config/linux/gtk/gtk.gni")
+import("//build/config/ui.gni")
+import("//ui/ozone/ozone.gni")
+
+component("gtk") {
+  output_name = "ui_gtk"
+  sources = [
+    "gtk_ui_delegate.cc",
+    "gtk_ui_delegate.h",
+  ]
+  public_deps = [
+    "//build/config/linux/gtk",
+    "//ui/base:buildflags",
+    "//ui/gfx:native_widget_types",
+  ]
+  defines = [ "IS_UI_GTK_IMPL" ]
+}
+
+component("x") {
+  output_name = "ui_gtk_x"
+  sources = [
+    "gtk_ui_delegate_x11.cc",
+    "gtk_ui_delegate_x11.h",
+  ]
+  public_deps = [ ":gtk" ]
+  deps = [
+    "//base",
+    "//ui/gfx/x",
+  ]
+  defines = [ "IS_UI_GTK_X_IMPL" ]
+  configs += [ "//build/config/linux:x11" ]
+}
diff --git a/ui/gtk/DEPS b/ui/gtk/DEPS
new file mode 100644
index 0000000..f7b2c04
--- /dev/null
+++ b/ui/gtk/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+ui/gfx",
+  "+ui/gfx/x",
+]
diff --git a/ui/gtk/OWNERS b/ui/gtk/OWNERS
new file mode 100644
index 0000000..280ba478
--- /dev/null
+++ b/ui/gtk/OWNERS
@@ -0,0 +1 @@
+thomasanderson@chromium.org
diff --git a/ui/gtk/gtk_ui_delegate.cc b/ui/gtk/gtk_ui_delegate.cc
new file mode 100644
index 0000000..9936e87
--- /dev/null
+++ b/ui/gtk/gtk_ui_delegate.cc
@@ -0,0 +1,23 @@
+// 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 "ui/gtk/gtk_ui_delegate.h"
+
+namespace ui {
+
+namespace {
+
+GtkUiDelegate* g_gtk_ui_delegate = nullptr;
+
+}  // namespace
+
+void GtkUiDelegate::SetInstance(GtkUiDelegate* instance) {
+  g_gtk_ui_delegate = instance;
+}
+
+GtkUiDelegate* GtkUiDelegate::instance() {
+  return g_gtk_ui_delegate;
+}
+
+}  // namespace ui
diff --git a/ui/gtk/gtk_ui_delegate.h b/ui/gtk/gtk_ui_delegate.h
new file mode 100644
index 0000000..6bdab39e
--- /dev/null
+++ b/ui/gtk/gtk_ui_delegate.h
@@ -0,0 +1,53 @@
+// 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 UI_GTK_GTK_UI_DELEGATE_H_
+#define UI_GTK_GTK_UI_DELEGATE_H_
+
+#include "base/component_export.h"
+#include "ui/gfx/native_widget_types.h"
+
+using GdkKeymap = struct _GdkKeymap;
+using GdkWindow = struct _GdkWindow;
+
+namespace ui {
+
+// GtkUiDelegate encapsulates platform-specific functionalities required by
+// a Gtk-based LinuxUI implementation. The main goal of this interface is to
+// make GtkUi platform agnostic, moving the platform specifics to lower level
+// layers (e.g: ozone). Linux backends (e.g: ozone/x11, aura/x11, ozone/wayland)
+// must provide a GtkUiDelegate implementation and inject its singleton instance
+// of it via |SetInstance| in order to be able to use GtkUi.
+class COMPONENT_EXPORT(UI_GTK) GtkUiDelegate {
+ public:
+  virtual ~GtkUiDelegate() = default;
+
+  // Sets the singleton delegate instance to be used by GtkUi. This makes it
+  // possible for ozone-based backends, for example, to inject the GtkUiDelegate
+  // object without polluting Ozone API, since just a small subset of ozone
+  // backends make use of GtkUi. This pointer is not owned, and if this method
+  // is called a second time, the first instance is not deleted.
+  static void SetInstance(GtkUiDelegate* instance);
+
+  // Returns the current active instance.
+  static GtkUiDelegate* instance();
+
+  // Gets the GdkKeymap instance, which is used to translate KeyEvents into
+  // GdkEvents before filtering them through GtkIM API.
+  virtual GdkKeymap* GetGdkKeymap() = 0;
+
+  // Creates/Gets a GdkWindow out of a Aura window id. Caller owns the returned
+  // object. This function is meant to be used in GtkIM-based IME implementation
+  // and is supported only in X11 backend (both Aura and Ozone).
+  virtual GdkWindow* GetGdkWindow(gfx::AcceleratedWidget window_id) = 0;
+
+  // Gtk dialog windows must be set transient for the browser window. This
+  // function abstracts away such functionality.
+  virtual bool SetGdkWindowTransientFor(GdkWindow* window,
+                                        gfx::AcceleratedWidget parent) = 0;
+};
+
+}  // namespace ui
+
+#endif  // UI_GTK_GTK_UI_DELEGATE_H_
diff --git a/ui/gtk/gtk_ui_delegate_x11.cc b/ui/gtk/gtk_ui_delegate_x11.cc
new file mode 100644
index 0000000..a8f2d3c
--- /dev/null
+++ b/ui/gtk/gtk_ui_delegate_x11.cc
@@ -0,0 +1,50 @@
+// 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 "ui/gtk/gtk_ui_delegate_x11.h"
+
+#include <gdk/gdkx.h>
+
+#include "base/logging.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/x/x11.h"
+
+namespace ui {
+
+GtkUiDelegateX11::GtkUiDelegateX11(XDisplay* display) : xdisplay_(display) {
+  DCHECK(xdisplay_);
+  gdk_set_allowed_backends("x11");
+}
+
+GtkUiDelegateX11::~GtkUiDelegateX11() = default;
+
+GdkKeymap* GtkUiDelegateX11::GetGdkKeymap() {
+  return gdk_keymap_get_for_display(GetGdkDisplay());
+}
+
+GdkWindow* GtkUiDelegateX11::GetGdkWindow(gfx::AcceleratedWidget window_id) {
+  GdkDisplay* display = GetGdkDisplay();
+  GdkWindow* gdk_window = gdk_x11_window_lookup_for_display(display, window_id);
+  if (gdk_window)
+    g_object_ref(gdk_window);
+  else
+    gdk_window = gdk_x11_window_foreign_new_for_display(display, window_id);
+  return gdk_window;
+}
+
+bool GtkUiDelegateX11::SetGdkWindowTransientFor(GdkWindow* window,
+                                                gfx::AcceleratedWidget parent) {
+  XSetTransientForHint(xdisplay_, GDK_WINDOW_XID(window), parent);
+  return true;
+}
+
+GdkDisplay* GtkUiDelegateX11::GetGdkDisplay() {
+  if (!display_) {
+    GdkDisplay* display = gdk_x11_lookup_xdisplay(xdisplay_);
+    display_ = !display ? gdk_display_get_default() : display;
+  }
+  return display_;
+}
+
+}  // namespace ui
diff --git a/ui/gtk/gtk_ui_delegate_x11.h b/ui/gtk/gtk_ui_delegate_x11.h
new file mode 100644
index 0000000..aaa7850
--- /dev/null
+++ b/ui/gtk/gtk_ui_delegate_x11.h
@@ -0,0 +1,44 @@
+// 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 UI_GTK_GTK_UI_DELEGATE_X11_H_
+#define UI_GTK_GTK_UI_DELEGATE_X11_H_
+
+#include "base/component_export.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/x/x11_types.h"
+#include "ui/gtk/gtk_ui_delegate.h"
+
+using GdkDisplay = struct _GdkDisplay;
+
+namespace ui {
+
+// GtkUiDelegate implementation for desktop Linux X11 backends.
+//
+// TODO(crbug.com/1002674): For now, this is used by both Aura (legacy) and
+// Ozone X11. Move this into X11 Ozone backend once Linux Chrome migration to
+// Ozone is completed.
+class COMPONENT_EXPORT(UI_GTK_X) GtkUiDelegateX11 : public GtkUiDelegate {
+ public:
+  explicit GtkUiDelegateX11(XDisplay* display);
+  GtkUiDelegateX11(const GtkUiDelegateX11&) = delete;
+  GtkUiDelegateX11& operator=(const GtkUiDelegateX11&) = delete;
+  ~GtkUiDelegateX11() override;
+
+  // GtkUiDelegate:
+  GdkKeymap* GetGdkKeymap() override;
+  GdkWindow* GetGdkWindow(gfx::AcceleratedWidget window_id) override;
+  bool SetGdkWindowTransientFor(GdkWindow* window,
+                                gfx::AcceleratedWidget parent) override;
+
+ private:
+  GdkDisplay* GetGdkDisplay();
+
+  XDisplay* const xdisplay_;
+  GdkDisplay* display_ = nullptr;
+};
+
+}  // namespace ui
+
+#endif  // UI_GTK_GTK_UI_DELEGATE_X11_H_
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc
index f1635a8..2d4ec42 100644
--- a/ui/native_theme/native_theme.cc
+++ b/ui/native_theme/native_theme.cc
@@ -10,6 +10,7 @@
 #include "base/command_line.h"
 #include "base/containers/flat_map.h"
 #include "base/feature_list.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
 #include "build/build_config.h"
 #include "ui/base/ui_base_features.h"
@@ -141,6 +142,11 @@
   return *map;
 }
 
+void ReportHistogramBooleanUsesColorProvider(bool uses_color_provider) {
+  UMA_HISTOGRAM_BOOLEAN("NativeTheme.GetSystemColor.UsesColorProvider",
+                        uses_color_provider);
+}
+
 }  // namespace
 
 NativeTheme::ExtraParams::ExtraParams() {
@@ -160,6 +166,7 @@
 
 SkColor NativeTheme::GetSystemColor(ColorId color_id,
                                     ColorScheme color_scheme) const {
+  SCOPED_UMA_HISTOGRAM_TIMER("NativeTheme.GetSystemColor");
   if (color_scheme == NativeTheme::ColorScheme::kDefault)
     color_scheme = GetDefaultSystemColorScheme();
 
@@ -174,9 +181,12 @@
         color_mode, ColorProviderManager::ContrastMode::kNormal);
     auto color_id_map = NativeThemeColorIdToColorIdMap();
     auto result = color_id_map.find(color_id);
-    if (result != color_id_map.cend())
+    if (result != color_id_map.cend()) {
+      ReportHistogramBooleanUsesColorProvider(true);
       return color_provider->GetColor(result->second);
+    }
   }
+  ReportHistogramBooleanUsesColorProvider(false);
   return GetAuraColor(color_id, this, color_scheme);
 }
 
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
index ac9538b..9f1a785 100644
--- a/ui/ozone/platform/wayland/BUILD.gn
+++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -4,6 +4,7 @@
 
 visibility = [ "//ui/ozone/*" ]
 
+import("//build/config/linux/gtk/gtk.gni")
 import("//build/config/linux/pkg_config.gni")
 import("//testing/libfuzzer/fuzzer_test.gni")
 import("//ui/ozone/platform/wayland/wayland.gni")
@@ -164,6 +165,14 @@
     deps += [ "//ui/base/ime/linux" ]
   }
 
+  if (use_gtk) {
+    sources += [
+      "host/gtk_ui_delegate_wayland.cc",
+      "host/gtk_ui_delegate_wayland.h",
+    ]
+    deps += [ "//ui/gtk" ]
+  }
+
   defines = [ "OZONE_IMPLEMENTATION" ]
 
   if (use_wayland_gbm) {
diff --git a/ui/ozone/platform/wayland/DEPS b/ui/ozone/platform/wayland/DEPS
index 052d3c7b..d61519a 100644
--- a/ui/ozone/platform/wayland/DEPS
+++ b/ui/ozone/platform/wayland/DEPS
@@ -2,6 +2,7 @@
   "+ui/base/buildflags.h",  # Doesn't bring in all of ui/base.
   "+ui/base/hit_test.h", # UI hit test doesn't bring in all of ui/base.
   "+ui/base/ui_base_features.h",
+  "+ui/gtk/gtk_ui_delegate.h",
   "+mojo/public",
   "+ui/base/clipboard/clipboard_constants.h",
   "+ui/base/dragdrop/drag_drop_types.h",
diff --git a/ui/ozone/platform/wayland/host/gtk_ui_delegate_wayland.cc b/ui/ozone/platform/wayland/host/gtk_ui_delegate_wayland.cc
new file mode 100644
index 0000000..dd21a40
--- /dev/null
+++ b/ui/ozone/platform/wayland/host/gtk_ui_delegate_wayland.cc
@@ -0,0 +1,42 @@
+// 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 "ui/ozone/platform/wayland/host/gtk_ui_delegate_wayland.h"
+
+#include <gdk/gdkwayland.h>
+#include <gtk/gtk.h>
+
+#include "base/logging.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+
+namespace ui {
+
+GtkUiDelegateWayland::GtkUiDelegateWayland(WaylandConnection* connection)
+    : connection_(connection) {
+  DCHECK(connection_);
+  gdk_set_allowed_backends("wayland");
+}
+
+GtkUiDelegateWayland::~GtkUiDelegateWayland() = default;
+
+GdkKeymap* GtkUiDelegateWayland::GetGdkKeymap() {
+  NOTIMPLEMENTED_LOG_ONCE();
+  return nullptr;
+}
+
+GdkWindow* GtkUiDelegateWayland::GetGdkWindow(
+    gfx::AcceleratedWidget window_id) {
+  NOTIMPLEMENTED_LOG_ONCE();
+  return nullptr;
+}
+
+bool GtkUiDelegateWayland::SetGdkWindowTransientFor(
+    GdkWindow* window,
+    gfx::AcceleratedWidget parent) {
+  NOTIMPLEMENTED_LOG_ONCE();
+  return false;
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/gtk_ui_delegate_wayland.h b/ui/ozone/platform/wayland/host/gtk_ui_delegate_wayland.h
new file mode 100644
index 0000000..89834e7
--- /dev/null
+++ b/ui/ozone/platform/wayland/host/gtk_ui_delegate_wayland.h
@@ -0,0 +1,34 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_GTK_UI_DELEGATE_WAYLAND_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_GTK_UI_DELEGATE_WAYLAND_H_
+
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gtk/gtk_ui_delegate.h"
+
+namespace ui {
+
+class WaylandConnection;
+
+class GtkUiDelegateWayland : public GtkUiDelegate {
+ public:
+  explicit GtkUiDelegateWayland(WaylandConnection* connection);
+  GtkUiDelegateWayland(const GtkUiDelegateWayland&) = delete;
+  GtkUiDelegateWayland& operator=(const GtkUiDelegateWayland&) = delete;
+  ~GtkUiDelegateWayland() override;
+
+  // GtkUiDelegate:
+  GdkKeymap* GetGdkKeymap() override;
+  GdkWindow* GetGdkWindow(gfx::AcceleratedWidget window_id) override;
+  bool SetGdkWindowTransientFor(GdkWindow* window,
+                                gfx::AcceleratedWidget parent) override;
+
+ private:
+  WaylandConnection* const connection_;
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_WAYLAND_HOST_GTK_UI_DELEGATE_WAYLAND_H_
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index 93e08fd..949df2a 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -51,6 +51,11 @@
 #include "ui/ozone/platform/wayland/gpu/drm_render_node_handle.h"
 #endif
 
+#if BUILDFLAG(USE_GTK)
+#include "ui/gtk/gtk_ui_delegate.h"  // nogncheck
+#include "ui/ozone/platform/wayland/host/gtk_ui_delegate_wayland.h"  //nogncheck
+#endif
+
 namespace ui {
 
 namespace {
@@ -184,6 +189,12 @@
 
     supported_buffer_formats_ =
         connection_->buffer_manager_host()->GetSupportedBufferFormats();
+#if BUILDFLAG(USE_GTK)
+    DCHECK(!GtkUiDelegate::instance());
+    gtk_ui_delegate_ =
+        std::make_unique<GtkUiDelegateWayland>(connection_.get());
+    GtkUiDelegate::SetInstance(gtk_ui_delegate_.get());
+#endif
   }
 
   void InitializeGPU(const InitParams& args) override {
@@ -252,6 +263,10 @@
   // render node is available.
   DrmRenderNodePathFinder path_finder_;
 
+#if BUILDFLAG(USE_GTK)
+  std::unique_ptr<GtkUiDelegateWayland> gtk_ui_delegate_;
+#endif
+
   DISALLOW_COPY_AND_ASSIGN(OzonePlatformWayland);
 };
 
diff --git a/ui/ozone/platform/x11/BUILD.gn b/ui/ozone/platform/x11/BUILD.gn
index 8b5ab82..f1941921 100644
--- a/ui/ozone/platform/x11/BUILD.gn
+++ b/ui/ozone/platform/x11/BUILD.gn
@@ -2,7 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/linux/gtk/gtk.gni")
 import("//gpu/vulkan/features.gni")
+import("//ui/base/ui_features.gni")
 
 visibility = [ "//ui/ozone/*" ]
 
@@ -40,9 +42,11 @@
 
   deps = [
     "//base",
+    "//build:chromecast_buildflags",
     "//gpu/vulkan:buildflags",
     "//skia",
-    "//ui/base",
+    "//ui/base:base",
+    "//ui/base:buildflags",
     "//ui/base/clipboard:clipboard_types",
     "//ui/base/ime",
     "//ui/base/x",
@@ -75,6 +79,14 @@
     deps += [ "//gpu/vulkan/x" ]
   }
 
+  if (use_gtk) {
+    deps += [ "//ui/gtk:x" ]
+  }
+
+  if (use_xkbcommon) {
+    configs += [ "//ui/events/ozone/layout:xkbcommon" ]
+  }
+
   configs += [
     "//build/config/linux:x11",
     "//build/config/linux:xrandr",
diff --git a/ui/ozone/platform/x11/DEPS b/ui/ozone/platform/x11/DEPS
index 3b6346a..c4251a75 100644
--- a/ui/ozone/platform/x11/DEPS
+++ b/ui/ozone/platform/x11/DEPS
@@ -1,4 +1,6 @@
 include_rules = [
   "+ui/base/x",
   "+ui/base",
+  "+ui/gtk/gtk_ui_delegate.h",
+  "+ui/gtk/gtk_ui_delegate_x11.h",
 ]
diff --git a/ui/ozone/platform/x11/ozone_platform_x11.cc b/ui/ozone/platform/x11/ozone_platform_x11.cc
index 07206a3a..78ea2a9 100644
--- a/ui/ozone/platform/x11/ozone_platform_x11.cc
+++ b/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -9,6 +9,7 @@
 
 #include "base/message_loop/message_pump_type.h"
 #include "base/strings/utf_string_conversions.h"
+#include "ui/base/buildflags.h"
 #include "ui/base/ime/linux/linux_input_method_context_factory.h"
 #include "ui/base/x/x11_util.h"
 #include "ui/display/fake/fake_display_delegate.h"
@@ -38,6 +39,18 @@
 #include "ui/base/ime/linux/input_method_auralinux.h"
 #endif
 
+#if BUILDFLAG(USE_GTK)
+#include "ui/gtk/gtk_ui_delegate.h"      // nogncheck
+#include "ui/gtk/gtk_ui_delegate_x11.h"  // nogncheck
+#endif
+
+#if BUILDFLAG(USE_XKBCOMMON)
+#include "ui/events/ozone/layout/xkb/xkb_evdev_codes.h"
+#include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h"
+#else
+#include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
+#endif
+
 namespace ui {
 
 namespace {
@@ -138,12 +151,24 @@
     cursor_factory_ozone_ = std::make_unique<X11CursorFactoryOzone>();
     gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost());
 
-    // TODO(spang): Support XKB.
+#if BUILDFLAG(USE_XKBCOMMON)
+    keyboard_layout_engine_ =
+        std::make_unique<XkbKeyboardLayoutEngine>(xkb_evdev_code_converter_);
+    // TODO(nickdiego): debugging..
     keyboard_layout_engine_ = std::make_unique<StubKeyboardLayoutEngine>();
+#else
+    keyboard_layout_engine_ = std::make_unique<StubKeyboardLayoutEngine>();
+#endif
     KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
         keyboard_layout_engine_.get());
 
     TouchFactory::SetTouchDeviceListFromCommandLine();
+
+#if BUILDFLAG(USE_GTK)
+    DCHECK(!GtkUiDelegate::instance());
+    gtk_ui_delegate_ = std::make_unique<GtkUiDelegateX11>(gfx::GetXDisplay());
+    GtkUiDelegate::SetInstance(gtk_ui_delegate_.get());
+#endif
   }
 
   void InitializeGPU(const InitParams& params) override {
@@ -189,6 +214,10 @@
 
   bool common_initialized_ = false;
 
+#if BUILDFLAG(USE_XKBCOMMON)
+  XkbEvdevCodes xkb_evdev_code_converter_;
+#endif
+
   // Objects in the UI process.
   std::unique_ptr<KeyboardLayoutEngine> keyboard_layout_engine_;
   std::unique_ptr<OverlayManagerOzone> overlay_manager_;
@@ -203,6 +232,10 @@
   // Objects in both UI and GPU process.
   std::unique_ptr<X11EventSource> event_source_;
 
+#if BUILDFLAG(USE_GTK)
+  std::unique_ptr<GtkUiDelegate> gtk_ui_delegate_;
+#endif
+
   DISALLOW_COPY_AND_ASSIGN(OzonePlatformX11);
 };
 
diff --git a/ui/platform_window/extensions/x11_extension.h b/ui/platform_window/extensions/x11_extension.h
index 326d6f2..e39c9f6 100644
--- a/ui/platform_window/extensions/x11_extension.h
+++ b/ui/platform_window/extensions/x11_extension.h
@@ -17,26 +17,32 @@
 // APIs. Please refer to README for more details.
 class COMPONENT_EXPORT(EXTENSIONS) X11Extension {
  public:
-  // X11-specific.  Returns whether an XSync extension is available at the
-  // current platform.
+  // Returns whether an XSync extension is available at the current platform.
   virtual bool IsSyncExtensionAvailable() const = 0;
 
-  // X11-specific.  Handles CompleteSwapAfterResize event coming from the
-  // compositor observer.
+  // Returns a best-effort guess as to whether the WM is tiling (true) or
+  // stacking (false).
+  virtual bool IsWmTiling() const = 0;
+
+  // Handles CompleteSwapAfterResize event coming from the compositor observer.
   virtual void OnCompleteSwapAfterResize() = 0;
 
-  // X11-specific.  Returns the current bounds in terms of the X11 Root Window
-  // including the borders provided by the window manager (if any).
+  // Returns the current bounds in terms of the X11 Root Window including the
+  // borders provided by the window manager (if any).
   virtual gfx::Rect GetXRootWindowOuterBounds() const = 0;
 
-  // X11-specific.  Says if the X11 Root Window contains the point within its
-  // set shape. If shape is not set, returns true.
+  // Says if the X11 Root Window contains the point within its set shape. If
+  // shape is not set, returns true.
   virtual bool ContainsPointInXRegion(const gfx::Point& point) const = 0;
 
-  // X11-specific.  Asks X11 to lower the Xwindow down the stack so that it does
-  // not obscure any sibling windows.
+  // Asks X11 to lower the Xwindow down the stack so that it does not obscure
+  // any sibling windows.
   virtual void LowerXWindow() = 0;
 
+  // Forces this window to be unmanaged by the window manager if
+  // |override_redirect| is true.
+  virtual void SetOverrideRedirect(bool override_redirect) = 0;
+
   virtual void SetX11ExtensionDelegate(X11ExtensionDelegate* delegate) = 0;
 
  protected:
diff --git a/ui/platform_window/extensions/x11_extension_delegate.h b/ui/platform_window/extensions/x11_extension_delegate.h
index b5eb71d4..71411d2 100644
--- a/ui/platform_window/extensions/x11_extension_delegate.h
+++ b/ui/platform_window/extensions/x11_extension_delegate.h
@@ -38,6 +38,10 @@
   virtual bool OnAtkKeyEvent(AtkKeyEventStruct* atk_key_event) = 0;
 #endif
 
+  // Returns true if this window should be in a forced override-redirect state
+  // (not maanged by the window manager).
+  virtual bool IsOverrideRedirect() const = 0;
+
  protected:
   virtual ~X11ExtensionDelegate() = default;
 };
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc
index fb6b7ac..b495ee0 100644
--- a/ui/platform_window/x11/x11_window.cc
+++ b/ui/platform_window/x11/x11_window.cc
@@ -127,6 +127,9 @@
   gfx::Size adjusted_size_in_pixels =
       AdjustSizeForDisplay(config.bounds.size());
   config.bounds.set_size(adjusted_size_in_pixels);
+  config.override_redirect =
+      properties.x11_extension_delegate &&
+      properties.x11_extension_delegate->IsOverrideRedirect();
 
   workspace_extension_delegate_ = properties.workspace_extension_delegate;
   x11_extension_delegate_ = properties.x11_extension_delegate;
@@ -472,6 +475,10 @@
   return ui::IsSyncExtensionAvailable();
 }
 
+bool X11Window::IsWmTiling() const {
+  return ui::IsWmTiling(ui::GuessWindowManager());
+}
+
 void X11Window::OnCompleteSwapAfterResize() {
   XWindow::NotifySwapAfterResize();
 }
@@ -488,6 +495,10 @@
   XWindow::LowerWindow();
 }
 
+void X11Window::SetOverrideRedirect(bool override_redirect) {
+  XWindow::SetOverrideRedirect(override_redirect);
+}
+
 void X11Window::SetX11ExtensionDelegate(X11ExtensionDelegate* delegate) {
   x11_extension_delegate_ = delegate;
 }
diff --git a/ui/platform_window/x11/x11_window.h b/ui/platform_window/x11/x11_window.h
index 97cce2fb..6999082 100644
--- a/ui/platform_window/x11/x11_window.h
+++ b/ui/platform_window/x11/x11_window.h
@@ -108,10 +108,12 @@
 
   // X11Extension:
   bool IsSyncExtensionAvailable() const override;
+  bool IsWmTiling() const override;
   void OnCompleteSwapAfterResize() override;
   gfx::Rect GetXRootWindowOuterBounds() const override;
   bool ContainsPointInXRegion(const gfx::Point& point) const override;
   void LowerXWindow() override;
+  void SetOverrideRedirect(bool override_redirect) override;
   void SetX11ExtensionDelegate(X11ExtensionDelegate* delegate) override;
 
   // Overridden from ui::XEventDispatcher:
diff --git a/ui/snapshot/snapshot_aura_unittest.cc b/ui/snapshot/snapshot_aura_unittest.cc
index df2b4371..08b4053 100644
--- a/ui/snapshot/snapshot_aura_unittest.cc
+++ b/ui/snapshot/snapshot_aura_unittest.cc
@@ -108,15 +108,16 @@
     context_factories_ = std::make_unique<ui::TestContextFactories>(
         enable_pixel_output, GetParam());
 
-    helper_ = std::make_unique<aura::test::AuraTestHelper>();
-    helper_->SetUp(context_factories_->GetContextFactory());
+    helper_ = std::make_unique<aura::test::AuraTestHelper>(
+        context_factories_->GetContextFactory());
+    helper_->SetUp();
   }
 
   void TearDown() override {
     test_window_.reset();
     delegate_.reset();
     helper_->RunAllPendingInMessageLoop();
-    helper_->TearDown();
+    helper_.reset();
     context_factories_.reset();
     task_environment_.reset();
     testing::Test::TearDown();
diff --git a/ui/views/layout/animating_layout_manager.cc b/ui/views/layout/animating_layout_manager.cc
index 41ee491..a2e7276 100644
--- a/ui/views/layout/animating_layout_manager.cc
+++ b/ui/views/layout/animating_layout_manager.cc
@@ -980,12 +980,6 @@
   return child_layout;
 }
 
-SizeBounds AnimatingLayoutManager::GetAvailableHostSize() const {
-  DCHECK(host_view());
-  const auto* const parent = host_view()->parent();
-  return parent ? parent->GetAvailableSize(host_view()) : SizeBounds();
-}
-
 // Returns the space in which to calculate the target layout.
 gfx::Size AnimatingLayoutManager::GetAvailableTargetLayoutSize() {
   if (!should_animate_bounds_)
diff --git a/ui/views/layout/animating_layout_manager.h b/ui/views/layout/animating_layout_manager.h
index 13fa99f..207c1ed 100644
--- a/ui/views/layout/animating_layout_manager.h
+++ b/ui/views/layout/animating_layout_manager.h
@@ -243,9 +243,6 @@
                                  double scale_percent,
                                  bool slide_from_leading) const;
 
-  // Returns the size available to the host view from its parent.
-  SizeBounds GetAvailableHostSize() const;
-
   // Returns the space in which to calculate the target layout.
   gfx::Size GetAvailableTargetLayoutSize();
 
@@ -285,7 +282,13 @@
   double current_offset_ = 1.0;
 
   // The restrictions on the layout's size the last time we recalculated our
-  // target layout.
+  // target layout. If they have changed, we may need to recalculate the target
+  // of the current animation.
+  //
+  // Contrast with LayoutManagerBase::cached_available_size_, which tracks
+  // changes from one layout application to the next and affects re-layout of
+  // children; this value tracks changes from one layout *calculation* to
+  // the next and affects recalculation of *this* layout.
   SizeBounds last_available_host_size_;
 
   // The layout being animated away from.
diff --git a/ui/views/layout/layout_manager_base.cc b/ui/views/layout/layout_manager_base.cc
index dd11684..13622be 100644
--- a/ui/views/layout/layout_manager_base.cc
+++ b/ui/views/layout/layout_manager_base.cc
@@ -121,6 +121,12 @@
 
 LayoutManagerBase::LayoutManagerBase() = default;
 
+SizeBounds LayoutManagerBase::GetAvailableHostSize() const {
+  DCHECK(host_view());
+  const auto* const parent = host_view()->parent();
+  return parent ? parent->GetAvailableSize(host_view()) : SizeBounds();
+}
+
 bool LayoutManagerBase::IsChildIncludedInLayout(const View* child,
                                                 bool include_hidden) const {
   const auto it = child_infos_.find(child);
@@ -151,6 +157,8 @@
 }
 
 void LayoutManagerBase::ApplyLayout(const ProposedLayout& layout) {
+  const SizeBounds new_available_size = GetAvailableHostSize();
+
   for (auto& child_layout : layout.child_layouts) {
     DCHECK_EQ(host_view_, child_layout.child_view->parent());
 
@@ -165,7 +173,8 @@
     // If the child view is not visible and we haven't bothered to specify
     // bounds, don't bother setting them (which would cause another cascade of
     // events that wouldn't do anything useful).
-    if (child_layout.visible || !child_layout.bounds.IsEmpty()) {
+    if (new_available_size != cached_available_size_ || child_layout.visible ||
+        !child_layout.bounds.IsEmpty()) {
       if (child_view->bounds() != child_layout.bounds)
         child_view->SetBoundsRect(child_layout.bounds);
       // Child layouts which are not invalid will not be laid out by the default
@@ -177,6 +186,8 @@
         child_view->Layout();
     }
   }
+
+  cached_available_size_ = new_available_size;
 }
 
 void LayoutManagerBase::InvalidateHost(bool mark_layouts_changed) {
diff --git a/ui/views/layout/layout_manager_base.h b/ui/views/layout/layout_manager_base.h
index 5801f6b5..cec6a2e 100644
--- a/ui/views/layout/layout_manager_base.h
+++ b/ui/views/layout/layout_manager_base.h
@@ -94,6 +94,9 @@
     cached_layout_ = layout;
   }
 
+  // Returns the size available to the host view from its parent.
+  SizeBounds GetAvailableHostSize() const;
+
   // Returns true if the specified view is a child of the host view and is not
   // ignored. Views hidden by external code are only included if
   // |include_hidden| is set.
@@ -207,6 +210,11 @@
   // or while invalidating the host view without invalidating the layout.
   bool suppress_invalidate_ = false;
 
+  // Used during layout to determine if available size has changed for children;
+  // when it changes, children are always laid out regardless of visibility or
+  // whether their bounds have changed.
+  SizeBounds cached_available_size_;
+
   // Do some really simple caching because layout generation can cost as much
   // as 1ms or more for complex views.
   mutable base::Optional<gfx::Size> cached_minimum_size_;
diff --git a/ui/views/layout/layout_manager_base_unittest.cc b/ui/views/layout/layout_manager_base_unittest.cc
index f7e1659..6de04b8 100644
--- a/ui/views/layout/layout_manager_base_unittest.cc
+++ b/ui/views/layout/layout_manager_base_unittest.cc
@@ -57,9 +57,18 @@
     return layout;
   }
 
+  void LayoutImpl() override {
+    ++layout_count_;
+    LayoutManagerBase::LayoutImpl();
+  }
+
+  size_t layout_count() const { return layout_count_; }
+
  private:
   // If specified, will always return this layout.
   base::Optional<ProposedLayout> forced_layout_;
+
+  size_t layout_count_ = 0;
 };
 
 // This layout layout lays out included child views in the upper-left of the
@@ -753,4 +762,60 @@
   EXPECT_EQ(kGrandchildAvailableSize, child->GetAvailableSize(grandchild));
 }
 
+TEST_F(LayoutManagerBaseAvailableSizeTest,
+       AvaialbleSizeChangeTriggersDescendantLayout) {
+  View* const child = view()->AddChildView(std::make_unique<View>());
+  TestLayoutManagerBase* const child_layout =
+      child->SetLayoutManager(std::make_unique<TestLayoutManagerBase>());
+  View* const grandchild = child->AddChildView(std::make_unique<View>());
+  TestLayoutManagerBase* const grandchild_layout =
+      grandchild->SetLayoutManager(std::make_unique<TestLayoutManagerBase>());
+  View* const great_grandchild =
+      grandchild->AddChildView(std::make_unique<View>());
+  TestLayoutManagerBase* const great_grandchild_layout =
+      great_grandchild->SetLayoutManager(
+          std::make_unique<TestLayoutManagerBase>());
+
+  // Create a default root layout with non-visible, zero-size child with no
+  // available size.
+  ProposedLayout root_layout;
+  root_layout.child_layouts.push_back(ChildLayout());
+  root_layout.child_layouts[0].child_view = child;
+  root_layout.child_layouts[0].available_size = SizeBounds(0, 0);
+
+  // Set some default layouts for the rest of the hierarchy.
+  layout()->OverrideProposedLayout(root_layout);
+  child_layout->OverrideProposedLayout({{}, {{grandchild, false, {}, {0, 0}}}});
+  grandchild_layout->OverrideProposedLayout(
+      {{}, {{great_grandchild, false, {}, {0, 0}}}});
+
+  view()->Layout();
+
+  const size_t num_grandchild_layouts = grandchild_layout->layout_count();
+  const size_t num_great_grandchild_layouts =
+      great_grandchild_layout->layout_count();
+
+  // Set the same rootlayout again as a control. This should not have an effect
+  // on the layout of the grand- and great-grandchild views.
+  layout()->OverrideProposedLayout(root_layout);
+  view()->Layout();
+
+  EXPECT_EQ(num_grandchild_layouts, grandchild_layout->layout_count());
+  EXPECT_EQ(num_great_grandchild_layouts,
+            great_grandchild_layout->layout_count());
+
+  // Now set the child view to be visible with nonzero size and even larger
+  // available size. Applying this layout should change the size available to
+  // all views down the hierarchy, forcing a re-layout.
+  root_layout.child_layouts[0].visible = true;
+  root_layout.child_layouts[0].bounds = gfx::Rect(0, 0, 5, 5);
+  root_layout.child_layouts[0].available_size = SizeBounds(10, 10);
+  layout()->OverrideProposedLayout(root_layout);
+  view()->Layout();
+
+  EXPECT_EQ(num_grandchild_layouts + 1, grandchild_layout->layout_count());
+  EXPECT_EQ(num_great_grandchild_layouts + 1,
+            great_grandchild_layout->layout_count());
+}
+
 }  // namespace views
diff --git a/ui/views/test/views_test_helper_aura.cc b/ui/views/test/views_test_helper_aura.cc
index 2c37ab0..b194ed5 100644
--- a/ui/views/test/views_test_helper_aura.cc
+++ b/ui/views/test/views_test_helper_aura.cc
@@ -5,7 +5,6 @@
 #include "ui/views/test/views_test_helper_aura.h"
 
 #include "ui/views/test/test_views_delegate.h"
-#include "ui/wm/core/capture_controller.h"
 
 namespace views {
 
@@ -39,11 +38,6 @@
     DCHECK(root_window->children().empty()) << "Not all windows were closed.";
   }
 
-  aura_test_helper_->TearDown();
-
-  const wm::CaptureController* const controller = wm::CaptureController::Get();
-  CHECK(!controller || !controller->is_active());
-
   g_instance = nullptr;
 }
 
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
index 44edb4b..91cfaf7 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -293,6 +293,14 @@
   DesktopWindowTreeHostPlatform::OnActivationChanged(active);
 }
 
+ui::X11Extension* DesktopWindowTreeHostLinux::GetX11Extension() {
+  return ui::GetX11Extension(*(platform_window()));
+}
+
+const ui::X11Extension* DesktopWindowTreeHostLinux::GetX11Extension() const {
+  return ui::GetX11Extension(*(platform_window()));
+}
+
 #if BUILDFLAG(USE_ATK)
 bool DesktopWindowTreeHostLinux::OnAtkKeyEvent(AtkKeyEventStruct* atk_event) {
   if (!IsActive() && !HasCapture())
@@ -302,6 +310,11 @@
 }
 #endif
 
+bool DesktopWindowTreeHostLinux::IsOverrideRedirect() const {
+  // BrowserDesktopWindowTreeHostLinux implements this for browser windows.
+  return false;
+}
+
 void DesktopWindowTreeHostLinux::AddAdditionalInitProperties(
     const Widget::InitParams& params,
     ui::PlatformWindowInitProperties* properties) {
@@ -376,14 +389,6 @@
     targeter_for_modal_.reset();
 }
 
-ui::X11Extension* DesktopWindowTreeHostLinux::GetX11Extension() {
-  return ui::GetX11Extension(*(platform_window()));
-}
-
-const ui::X11Extension* DesktopWindowTreeHostLinux::GetX11Extension() const {
-  return ui::GetX11Extension(*(platform_window()));
-}
-
 std::list<gfx::AcceleratedWidget>& DesktopWindowTreeHostLinux::open_windows() {
   if (!open_windows_)
     open_windows_ = new std::list<gfx::AcceleratedWidget>();
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
index de60b85..1351c2a 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
@@ -89,6 +89,9 @@
   void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override;
   void OnActivationChanged(bool active) override;
 
+  ui::X11Extension* GetX11Extension();
+  const ui::X11Extension* GetX11Extension() const;
+
  private:
   friend class DesktopWindowTreeHostX11Test;
   FRIEND_TEST_ALL_PREFIXES(DesktopWindowTreeHostLinuxTest, HitTest);
@@ -114,13 +117,11 @@
 #if BUILDFLAG(USE_ATK)
   bool OnAtkKeyEvent(AtkKeyEventStruct* atk_key_event) override;
 #endif
+  bool IsOverrideRedirect() const override;
 
   // Enables event listening after closing |dialog|.
   void EnableEventListening();
 
-  ui::X11Extension* GetX11Extension();
-  const ui::X11Extension* GetX11Extension() const;
-
   // See comment for variable open_windows_.
   static std::list<gfx::AcceleratedWidget>& open_windows();
 
diff --git a/weblayer/BUILD.gn b/weblayer/BUILD.gn
index fe58fd89..4322a623 100644
--- a/weblayer/BUILD.gn
+++ b/weblayer/BUILD.gn
@@ -18,6 +18,7 @@
 import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
 if (is_android) {
   import("//build/config/android/config.gni")
+  import("//build/config/android/rules.gni")
 } else if (is_mac) {
   import("//build/config/mac/rules.gni")
   import("//build/mac/tweak_info_plist.gni")
@@ -33,6 +34,12 @@
 }
 
 if (is_android) {
+  weblayer_components_strings_java_resources =
+      [ "java/res/values/components_strings.xml" ] +
+      process_file_template(
+          android_bundle_locales_as_resources,
+          [ "java/res/values-{{source_name_part}}/components_strings.xml" ])
+
   grit("generate_components_strings") {
     source = "../components/components_strings.grd"
 
@@ -46,13 +53,8 @@
       whitelist,
     ]
     outputs =
-        [
-          "grit/components_strings.h",
-          "java/res/values/components_strings.xml",
-        ] +
-        process_file_template(
-            android_bundle_locales_as_resources,
-            [ "java/res/values-{{source_name_part}}/components_strings.xml" ]) +
+        weblayer_components_strings_java_resources +
+        [ "grit/components_strings.h" ] +
         process_file_template(locales_with_fake_bidi,
                               [ "components_strings_{{source_name_part}}.pak" ])
   }
@@ -84,6 +86,13 @@
     treat_as_locale_paks = true
     deps = [ ":weblayer_locales" ]
   }
+
+  java_strings_grd_prebuilt("components_java_strings") {
+    grit_output_dir = "$root_gen_dir/weblayer/java/res"
+    generated_files =
+        rebase_path(weblayer_components_strings_java_resources, "java/res", ".")
+    deps = [ ":generate_components_strings" ]
+  }
 }
 
 source_set("weblayer_lib_base") {
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
index 5312680..4e3f099 100644
--- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
+++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
@@ -7,6 +7,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import static org.chromium.content_public.browser.test.util.TestThreadUtils.runOnUiThreadBlocking;
@@ -27,6 +28,7 @@
 import org.chromium.weblayer.NavigationController;
 import org.chromium.weblayer.NavigationState;
 import org.chromium.weblayer.Tab;
+import org.chromium.weblayer.TabCallback;
 import org.chromium.weblayer.shell.InstrumentationActivity;
 
 import java.util.ArrayList;
@@ -324,9 +326,6 @@
             assertEquals("Page A", navigationController.getNavigationEntryTitle(0));
             assertEquals("Page B", navigationController.getNavigationEntryTitle(1));
             assertEquals("Page C", navigationController.getNavigationEntryTitle(2));
-
-            // An out of bounds index will return an empty string.
-            assertEquals("", navigationController.getNavigationEntryTitle(1234));
         });
     }
 
@@ -442,6 +441,41 @@
         assertEquals(mCallback.onCompletedCallback.getNavigationState(), NavigationState.COMPLETE);
     }
 
+    @Test
+    @SmallTest
+    public void testRepostConfirmation() throws Exception {
+        // Load a page with a form.
+        InstrumentationActivity activity =
+                mActivityTestRule.launchShellWithUrl(mActivityTestRule.getTestDataURL("form.html"));
+        assertNotNull(activity);
+        setNavigationCallback(activity);
+
+        // Touch the page; this should submit the form.
+        int currentCallCount = mCallback.onCompletedCallback.getCallCount();
+        EventUtils.simulateTouchCenterOfView(activity.getWindow().getDecorView());
+        String targetUrl = mActivityTestRule.getTestDataURL("simple_page.html");
+        mCallback.onCompletedCallback.assertCalledWith(currentCallCount, targetUrl);
+
+        // Make sure a tab modal shows after we attempt a reload.
+        Boolean isTabModalShowingResult[] = new Boolean[1];
+        CallbackHelper callbackHelper = new CallbackHelper();
+        runOnUiThreadBlocking(() -> {
+            Tab tab = activity.getTab();
+            TabCallback callback = new TabCallback() {
+                @Override
+                public void onTabModalStateChanged(boolean isTabModalShowing) {
+                    isTabModalShowingResult[0] = isTabModalShowing;
+                    callbackHelper.notifyCalled();
+                }
+            };
+            tab.registerTabCallback(callback);
+            tab.getNavigationController().reload();
+        });
+
+        callbackHelper.waitForFirst();
+        assertTrue(isTabModalShowingResult[0]);
+    }
+
     private void setNavigationCallback(InstrumentationActivity activity) {
         runOnUiThreadBlocking(
                 ()
diff --git a/weblayer/browser/browser_context_impl.cc b/weblayer/browser/browser_context_impl.cc
index 8a4f76f..850d2a5 100644
--- a/weblayer/browser/browser_context_impl.cc
+++ b/weblayer/browser/browser_context_impl.cc
@@ -158,6 +158,7 @@
 
 content::ClientHintsControllerDelegate*
 BrowserContextImpl::GetClientHintsControllerDelegate() {
+  // TODO(crbug.com/1065537): implement me.
   return nullptr;
 }
 
diff --git a/weblayer/browser/content_browser_client_impl.cc b/weblayer/browser/content_browser_client_impl.cc
index a2a650c..9b9825ee 100644
--- a/weblayer/browser/content_browser_client_impl.cc
+++ b/weblayer/browser/content_browser_client_impl.cc
@@ -18,6 +18,7 @@
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
 #include "components/captive_portal/core/buildflags.h"
 #include "components/embedder_support/switches.h"
+#include "components/permissions/quota_permission_context_impl.h"
 #include "components/safe_browsing/core/features.h"
 #include "components/security_interstitials/content/ssl_cert_reporter.h"
 #include "components/security_interstitials/content/ssl_error_handler.h"
@@ -500,6 +501,11 @@
 #endif
 }
 
+scoped_refptr<content::QuotaPermissionContext>
+ContentBrowserClientImpl::CreateQuotaPermissionContext() {
+  return base::MakeRefCounted<permissions::QuotaPermissionContextImpl>();
+}
+
 void ContentBrowserClientImpl::CreateFeatureListAndFieldTrials() {
   feature_list_creator_->CreateFeatureListAndFieldTrials();
 }
diff --git a/weblayer/browser/content_browser_client_impl.h b/weblayer/browser/content_browser_client_impl.h
index 677e45e..f043217b 100644
--- a/weblayer/browser/content_browser_client_impl.h
+++ b/weblayer/browser/content_browser_client_impl.h
@@ -88,6 +88,8 @@
       service_manager::BinderMapWithContext<content::RenderFrameHost*>* map)
       override;
   void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
+  scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
+      override;
 
 #if defined(OS_LINUX) || defined(OS_ANDROID)
   void GetAdditionalMappedFilesForChildProcess(
diff --git a/weblayer/browser/java/BUILD.gn b/weblayer/browser/java/BUILD.gn
index 79ce4f11..123a4e8 100644
--- a/weblayer/browser/java/BUILD.gn
+++ b/weblayer/browser/java/BUILD.gn
@@ -9,7 +9,11 @@
 android_resources("weblayer_resources") {
   sources = [ "res/layout/weblayer_url_bar.xml" ]
   custom_package = "org.chromium.weblayer_private"
-  deps = [ "//components/permissions/android:java_resources" ]
+  deps = [
+    "//components/browser_ui/strings/android:browser_ui_strings_grd",
+    "//components/permissions/android:java_resources",
+    "//weblayer:components_java_strings",
+  ]
 }
 
 generate_product_config_srcjar("weblayer_product_config") {
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
index a6e6aae..3cec028 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
@@ -5,6 +5,7 @@
 package org.chromium.weblayer_private;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.os.RemoteException;
 import android.util.AndroidRuntimeException;
 import android.view.View;
@@ -20,6 +21,8 @@
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modaldialog.SimpleModalDialogController;
 import org.chromium.ui.modelutil.PropertyModel;
 
 /**
@@ -223,4 +226,39 @@
         return mModalDialogManager.dismissActiveDialogOfType(
                 ModalDialogType.TAB, DialogDismissalCause.NAVIGATE_BACK_OR_TOUCH_OUTSIDE);
     }
+
+    /**
+     * Asks the user to confirm a page reload on a POSTed page.
+     */
+    public void showRepostFormWarningDialog() {
+        ModalDialogProperties.Controller dialogController =
+                new SimpleModalDialogController(mModalDialogManager, (Integer dismissalCause) -> {
+                    WebContents webContents = mTab == null ? null : mTab.getWebContents();
+                    if (webContents == null) return;
+                    switch (dismissalCause) {
+                        case DialogDismissalCause.POSITIVE_BUTTON_CLICKED:
+                            webContents.getNavigationController().continuePendingReload();
+                            break;
+                        default:
+                            webContents.getNavigationController().cancelPendingReload();
+                            break;
+                    }
+                });
+
+        Resources resources = mWindowAndroid.getContext().get().getResources();
+        PropertyModel dialogModel =
+                new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
+                        .with(ModalDialogProperties.CONTROLLER, dialogController)
+                        .with(ModalDialogProperties.TITLE, resources,
+                                R.string.http_post_warning_title)
+                        .with(ModalDialogProperties.MESSAGE, resources, R.string.http_post_warning)
+                        .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, resources,
+                                R.string.http_post_warning_resend)
+                        .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT, resources,
+                                R.string.cancel)
+                        .with(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true)
+                        .build();
+
+        mModalDialogManager.showDialog(dialogModel, ModalDialogManager.ModalDialogType.TAB, true);
+    }
 }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java
index b29c817..e4c66d5 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java
@@ -560,6 +560,16 @@
         mBrowserControlsDelegates.get(reason).set(constraint);
     }
 
+    @CalledByNative
+    public void showRepostFormWarningDialog() {
+        BrowserViewController viewController = getViewController();
+        if (viewController == null) {
+            mWebContents.getNavigationController().cancelPendingReload();
+        } else {
+            viewController.showRepostFormWarningDialog();
+        }
+    }
+
     private static String nonEmptyOrNull(String s) {
         return TextUtils.isEmpty(s) ? null : s;
     }
diff --git a/weblayer/browser/navigation_controller_impl.cc b/weblayer/browser/navigation_controller_impl.cc
index 1cc2054..62f3911 100644
--- a/weblayer/browser/navigation_controller_impl.cc
+++ b/weblayer/browser/navigation_controller_impl.cc
@@ -113,7 +113,7 @@
 }
 
 void NavigationControllerImpl::Reload() {
-  web_contents()->GetController().Reload(content::ReloadType::NORMAL, false);
+  web_contents()->GetController().Reload(content::ReloadType::NORMAL, true);
 }
 
 void NavigationControllerImpl::Stop() {
diff --git a/weblayer/browser/tab_impl.cc b/weblayer/browser/tab_impl.cc
index 662be87..74a1431 100644
--- a/weblayer/browser/tab_impl.cc
+++ b/weblayer/browser/tab_impl.cc
@@ -449,6 +449,15 @@
   return source;
 }
 
+void TabImpl::ShowRepostFormWarningDialog(content::WebContents* source) {
+#if defined(OS_ANDROID)
+  Java_TabImpl_showRepostFormWarningDialog(base::android::AttachCurrentThread(),
+                                           java_impl_);
+#else
+  source->GetController().CancelPendingReload();
+#endif
+}
+
 void TabImpl::NavigationStateChanged(content::WebContents* source,
                                      content::InvalidateTypes changed_flags) {
   DCHECK_EQ(web_contents_.get(), source);
diff --git a/weblayer/browser/tab_impl.h b/weblayer/browser/tab_impl.h
index 9acc253..41e0462 100644
--- a/weblayer/browser/tab_impl.h
+++ b/weblayer/browser/tab_impl.h
@@ -152,6 +152,7 @@
   content::WebContents* OpenURLFromTab(
       content::WebContents* source,
       const content::OpenURLParams& params) override;
+  void ShowRepostFormWarningDialog(content::WebContents* source) override;
   void NavigationStateChanged(content::WebContents* source,
                               content::InvalidateTypes changed_flags) override;
   content::JavaScriptDialogManager* GetJavaScriptDialogManager(
diff --git a/weblayer/grit_strings_whitelist.txt b/weblayer/grit_strings_whitelist.txt
index d21db8a4..9be42c6 100644
--- a/weblayer/grit_strings_whitelist.txt
+++ b/weblayer/grit_strings_whitelist.txt
@@ -62,7 +62,9 @@
 IDS_GEOLOCATION_INFOBAR_PERMISSION_FRAGMENT
 IDS_GEOLOCATION_INFOBAR_TEXT
 IDS_GEOLOCATION_INFOBAR_TEXT
-IDS_INFOBAR_UPDATE_PERMISSIONS_BUTTON_TEXT
+IDS_HTTP_POST_WARNING
+IDS_HTTP_POST_WARNING_RESEND
+IDS_HTTP_POST_WARNING_TITLE
 IDS_JAVASCRIPT_MESSAGEBOX_TITLE
 IDS_JAVASCRIPT_MESSAGEBOX_TITLE_IFRAME
 IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL
@@ -85,6 +87,9 @@
 IDS_PROTECTED_MEDIA_IDENTIFIER_PERMISSION_FRAGMENT
 IDS_PROTECTED_MEDIA_IDENTIFIER_PER_DEVICE_PROVISIONING_INFOBAR_TEXT
 IDS_PROTECTED_MEDIA_IDENTIFIER_PER_ORIGIN_PROVISIONING_INFOBAR_TEXT
+IDS_REQUEST_LARGE_QUOTA_INFOBAR_TEXT
+IDS_REQUEST_QUOTA_INFOBAR_TEXT
+IDS_REQUEST_QUOTA_PERMISSION_FRAGMENT
 IDS_SSL_CLOSE_DETAILS_BUTTON
 IDS_SSL_NONOVERRIDABLE_HSTS
 IDS_SSL_NONOVERRIDABLE_INVALID
diff --git a/weblayer/public/java/org/chromium/weblayer/NavigationController.java b/weblayer/public/java/org/chromium/weblayer/NavigationController.java
index 47734f1..214ffb0 100644
--- a/weblayer/public/java/org/chromium/weblayer/NavigationController.java
+++ b/weblayer/public/java/org/chromium/weblayer/NavigationController.java
@@ -68,8 +68,16 @@
         }
     }
 
-    public void goBack() {
+    /**
+     * Navigates to the previous navigation.
+     *
+     * @throws IndexOutOfBoundsException If {@link #canGoBack} returns false.
+     */
+    public void goBack() throws IndexOutOfBoundsException {
         ThreadCheck.ensureOnUiThread();
+        if (!canGoBack()) {
+            throw new IndexOutOfBoundsException();
+        }
         try {
             mNavigationController.goBack();
         } catch (RemoteException e) {
@@ -77,8 +85,16 @@
         }
     }
 
-    public void goForward() {
+    /**
+     * Navigates to the next navigation.
+     *
+     * @throws IndexOutOfBoundsException If {@link #canGoForward} returns false.
+     */
+    public void goForward() throws IndexOutOfBoundsException {
         ThreadCheck.ensureOnUiThread();
+        if (!canGoForward()) {
+            throw new IndexOutOfBoundsException();
+        }
         try {
             mNavigationController.goForward();
         } catch (RemoteException e) {
@@ -86,6 +102,11 @@
         }
     }
 
+    /**
+     * Returns true if there is a navigation before the current one.
+     *
+     * @return Whether there is a navigation before the current one.
+     */
     public boolean canGoBack() {
         ThreadCheck.ensureOnUiThread();
         try {
@@ -95,6 +116,11 @@
         }
     }
 
+    /**
+     * Returns true if there is a navigation after the current one.
+     *
+     * @return Whether there is a navigation after the current one.
+     */
     public boolean canGoForward() {
         ThreadCheck.ensureOnUiThread();
         try {
@@ -105,13 +131,20 @@
     }
 
     /**
+     * Navigates to the entry at {@link index}.
+     *
+     * @throws IndexOutOfBoundsException If index is not between 0 and {@link
+     *         getNavigationListCurrentIndex}.
+     * @throws IndexOutOfBoundsException
+     *
      * @since 81
      */
-    public void goToIndex(int index) {
+    public void goToIndex(int index) throws IndexOutOfBoundsException {
         ThreadCheck.ensureOnUiThread();
         if (WebLayer.getSupportedMajorVersionInternal() < 81) {
             throw new UnsupportedOperationException();
         }
+        checkNavigationIndex(index);
         try {
             mNavigationController.goToIndex(index);
         } catch (RemoteException e) {
@@ -119,6 +152,9 @@
         }
     }
 
+    /**
+     * Reloads the current entry. Does nothing if there are no navigations.
+     */
     public void reload() {
         ThreadCheck.ensureOnUiThread();
         try {
@@ -128,6 +164,9 @@
         }
     }
 
+    /**
+     * Stops in progress loading. Does nothing if not in the process of loading.
+     */
     public void stop() {
         ThreadCheck.ensureOnUiThread();
         try {
@@ -137,6 +176,11 @@
         }
     }
 
+    /**
+     * Returns the number of navigations entries.
+     *
+     * @return The number of navigation entries, 0 if empty.
+     */
     public int getNavigationListSize() {
         ThreadCheck.ensureOnUiThread();
         try {
@@ -146,6 +190,11 @@
         }
     }
 
+    /**
+     * Returns the index of the current navigation, -1 if there are no navigations.
+     *
+     * @return The index of the current navigation.
+     */
     public int getNavigationListCurrentIndex() {
         ThreadCheck.ensureOnUiThread();
         try {
@@ -155,8 +204,15 @@
         }
     }
 
+    /**
+     * Returns the uri to display for the navigation at index.
+     *
+     * @param index The index of the navigation.
+     * @throws IndexOutOfBoundsException If index is not between 0 and {@link
+     *         getNavigationListCurrentIndex}.
+     */
     @NonNull
-    public Uri getNavigationEntryDisplayUri(int index) {
+    public Uri getNavigationEntryDisplayUri(int index) throws IndexOutOfBoundsException {
         ThreadCheck.ensureOnUiThread();
         try {
             return Uri.parse(mNavigationController.getNavigationEntryDisplayUri(index));
@@ -165,15 +221,26 @@
         }
     }
 
+    private void checkNavigationIndex(int index) throws IndexOutOfBoundsException {
+        if (index < 0 || index >= getNavigationListSize()) {
+            throw new IndexOutOfBoundsException();
+        }
+    }
+
     /**
+     * Returns the title of the navigation entry at the supplied index.
+     *
+     * @throws IndexOutOfBoundsException If index is not between 0 and {@link
+     *         getNavigationListCurrentIndex}.
      * @since 81
      */
     @NonNull
-    public String getNavigationEntryTitle(int index) {
+    public String getNavigationEntryTitle(int index) throws IndexOutOfBoundsException {
         ThreadCheck.ensureOnUiThread();
         if (WebLayer.getSupportedMajorVersionInternal() < 81) {
             throw new UnsupportedOperationException();
         }
+        checkNavigationIndex(index);
         try {
             return mNavigationController.getNavigationEntryTitle(index);
         } catch (RemoteException e) {
diff --git a/weblayer/test/data/form.html b/weblayer/test/data/form.html
new file mode 100644
index 0000000..4511dcf
--- /dev/null
+++ b/weblayer/test/data/form.html
@@ -0,0 +1,14 @@
+<html>
+  <body>
+    <form id="form1" action="simple_page.html" method="post">
+      <input type="text" name="name" value="Name"><br>
+      <input type="text" name="address" value="Address"><br>
+      <input type="text" name="city" value="City"><br>
+    </form>
+  </body>
+  <script>
+    document.addEventListener('touchend', function(e) {
+      document.forms['form1'].submit();
+    }, false);
+  </script>
+</html>