diff --git a/DEPS b/DEPS
index 10764301..adcac60 100644
--- a/DEPS
+++ b/DEPS
@@ -167,11 +167,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': '54548626a977a72804242af934d01f94d8c02225',
+  'skia_revision': 'e27a503a0a21af167e6a19d2e5c7b7e1039964bf',
   # 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': '50e5ba2dd3e763aa78740945c04555d859a6e502',
+  'v8_revision': '0aff71c3ecaa48d359801e7f8864793f04aeee04',
   # 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.
@@ -179,7 +179,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '8e7d9d6c2326a36ff57335ceeb41eb86cb639a7f',
+  'angle_revision': 'ef4c25e71c32487feade5e9f8e79cb569545b846',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -218,7 +218,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': '5a1a79c0e8de8e886cc347ad22801982e8298a06',
+  'freetype_revision': '1e9229f0fcb46fd4cd8e0fdc48fb4a44ddb7a8a1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
@@ -230,7 +230,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': '70a8316d8b67cc343c7b19aa9399fe17b53deba1',
+  'catapult_revision': 'e74b5c944eda8877ae8d1058b427f61694b57f21',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -294,15 +294,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'spirv_cross_revision': 'ffca8735ff42a9e7a3d1dbb984cf3bf2ca724ebc',
+  'spirv_cross_revision': 'e5d3a6655e13870a6f38f40bd88cc662b14e3cdf',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'shaderc_revision': '614d79248ef2dea617085475f8d64148b37d7296',
+  'shaderc_revision': '621605ce2644d55ab74cb27a8afef97dc40f1b0f',
   # 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': 'c932f3309322b833cf13556a408fab75fa51c77d',
+  'dawn_revision': 'e09869ed526818cb01b4bdbe728ffe638ab5f861',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -1470,7 +1470,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '7c4e67ff117d6c640e6dd17989afe2fb7da7eecb',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'e1092c0bc8b8a2865da7ce6284ec19d189f71e02',
+    Var('webrtc_git') + '/src.git' + '@' + '955f8fd0477ea2d4137eff032184e02de8508043',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1532,7 +1532,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9608b4a1db16fa2e05497bc934fbf8d36c1b3d54',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b91063d99c88b47f7c603daa423f2a49910445bd',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc b/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
index 04f4f66..a157f13 100644
--- a/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
+++ b/android_webview/browser/network_service/aw_proxying_url_loader_factory.cc
@@ -669,17 +669,17 @@
     target_client_->OnComplete(status);
 
   if (proxied_loader_binding_ && wait_for_loader_error) {
+    // Since the original client is gone no need to continue loading the
+    // request.
+    proxied_client_binding_.Close();
+    target_loader_.reset();
+
     // Don't delete |this| yet, in case the |proxied_loader_binding_|'s
     // error_handler is called with a reason to indicate an error which we want
     // to send to the client bridge. Also reset |target_client_| so we don't
     // get its error_handler called and then delete |this|.
     target_client_.reset();
 
-    // Since the original client is gone no need to continue loading the
-    // request.
-    proxied_client_binding_.Close();
-    target_loader_.reset();
-
     // In case there are pending checks as to whether this request should be
     // intercepted, we don't want that causing |target_client_| to be used
     // later.
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc
index cd9825a..e334965 100644
--- a/ash/app_list/app_list_presenter_delegate_unittest.cc
+++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -2074,20 +2074,20 @@
       gfx::Point(peeking_top.x(), (peeking_top.y() + fullscreen_y) / 2));
   GetAppListTestHelper()->WaitUntilIdle();
 
-  EXPECT_LE(std::abs(GetAppListView()->GetAppListTransitionProgress(
-                         AppListView::kProgressFlagNone) -
-                     1.5f),
-            0.01f);
-
   gfx::Rect search_box_bounds =
       GetAppListView()->search_box_view()->GetBoundsInScreen();
   search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets());
 
+  float progress = GetAppListView()->GetAppListTransitionProgress(
+      AppListView::kProgressFlagNone);
+  EXPECT_LE(std::abs(progress - 1.5f), 0.01f);
+
   EXPECT_EQ((peeking_top.y() + fullscreen_y) / 2 +
-                (config.search_box_peeking_top_padding() +
-                 fullscreen_search_box_padding) /
-                    2,
+                gfx::Tween::IntValueBetween(
+                    progress - 1, config.search_box_peeking_top_padding(),
+                    fullscreen_search_box_padding),
             search_box_bounds.y());
+
   EXPECT_EQ(ExpectedAppsGridTop(config, 900, search_box_bounds),
             apps_grid_view()->GetBoundsInScreen().y());
   EXPECT_TRUE(apps_grid_view()->GetVisible());
@@ -2118,18 +2118,17 @@
       gfx::Point(peeking_top.x(), (peeking_top.y() + closed_y) / 2));
   GetAppListTestHelper()->WaitUntilIdle();
 
-  EXPECT_LE(std::abs(GetAppListView()->GetAppListTransitionProgress(
-                         AppListView::kProgressFlagNone) -
-                     0.5f),
-            0.01f);
-
   search_box_bounds = GetAppListView()->search_box_view()->GetBoundsInScreen();
   search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets());
 
+  progress = GetAppListView()->GetAppListTransitionProgress(
+      AppListView::kProgressFlagNone);
+  EXPECT_LE(std::abs(progress - 0.5f), 0.01f);
+
   EXPECT_EQ((peeking_top.y() + closed_y) / 2 +
-                (config.search_box_peeking_top_padding() +
-                 config.search_box_closed_top_padding()) /
-                    2,
+                gfx::Tween::IntValueBetween(
+                    progress, config.search_box_peeking_top_padding(),
+                    config.search_box_closed_top_padding()),
             search_box_bounds.y());
   EXPECT_EQ(ExpectedAppsGridTop(config, 900, search_box_bounds),
             apps_grid_view()->GetBoundsInScreen().y());
@@ -2186,19 +2185,18 @@
       gfx::Point(half_top.x(), (half_top.y() + fullscreen_y) / 2));
   GetAppListTestHelper()->WaitUntilIdle();
 
-  EXPECT_LE(std::abs(GetAppListView()->GetAppListTransitionProgress(
-                         AppListView::kProgressFlagSearchResults) -
-                     1.5f),
-            0.01f);
-
   gfx::Rect search_box_bounds =
       GetAppListView()->search_box_view()->GetBoundsInScreen();
   search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets());
 
+  float progress = GetAppListView()->GetAppListTransitionProgress(
+      AppListView::kProgressFlagSearchResults);
+  EXPECT_LE(std::abs(progress - 1.5f), 0.01f);
+
   EXPECT_EQ((half_top.y() + fullscreen_y) / 2 +
-                (config.search_box_fullscreen_top_padding() +
-                 fullscreen_search_box_padding) /
-                    2,
+                gfx::Tween::IntValueBetween(
+                    progress - 1, config.search_box_fullscreen_top_padding(),
+                    fullscreen_search_box_padding),
             search_box_bounds.y());
   EXPECT_EQ(search_box_bounds.y(),
             search_result_page()->GetBoundsInScreen().y());
@@ -2243,18 +2241,18 @@
   // should be half distance between closed and peeking padding.
   generator->MoveTouch(gfx::Point(half_top.x(), (half_top.y() + closed_y) / 2));
   GetAppListTestHelper()->WaitUntilIdle();
-  EXPECT_LE(std::abs(GetAppListView()->GetAppListTransitionProgress(
-                         AppListView::kProgressFlagSearchResults) -
-                     0.5f),
-            0.01f);
+
+  progress = GetAppListView()->GetAppListTransitionProgress(
+      AppListView::kProgressFlagSearchResults);
+  EXPECT_LE(std::abs(progress - 0.5f), 0.01f);
 
   search_box_bounds = GetAppListView()->search_box_view()->GetBoundsInScreen();
   search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets());
 
   EXPECT_EQ((half_top.y() + closed_y) / 2 +
-                (config.search_box_fullscreen_top_padding() +
-                 config.search_box_closed_top_padding()) /
-                    2,
+                gfx::Tween::IntValueBetween(
+                    progress, config.search_box_fullscreen_top_padding(),
+                    config.search_box_closed_top_padding()),
             search_box_bounds.y());
   EXPECT_EQ(search_box_bounds.y(),
             search_result_page()->GetBoundsInScreen().y());
@@ -2332,10 +2330,13 @@
       GetAppListView()->search_box_view()->GetBoundsInScreen();
   search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets());
 
+  float progress = GetAppListView()->GetAppListTransitionProgress(
+      AppListView::kProgressFlagSearchResults);
+  EXPECT_LE(std::abs(progress - 1.5f), 0.01f);
   EXPECT_EQ((half_top.y() + fullscreen_y) / 2 +
-                (config.search_box_fullscreen_top_padding() +
-                 fullscreen_search_box_padding) /
-                    2,
+                gfx::Tween::IntValueBetween(
+                    progress - 1, config.search_box_fullscreen_top_padding(),
+                    fullscreen_search_box_padding),
             search_box_bounds.y());
   EXPECT_EQ(search_box_bounds.y(),
             search_result_page()->GetBoundsInScreen().y());
@@ -2392,10 +2393,13 @@
   search_box_bounds = GetAppListView()->search_box_view()->GetBoundsInScreen();
   search_box_bounds.Inset(GetAppListView()->search_box_view()->GetInsets());
 
+  progress = GetAppListView()->GetAppListTransitionProgress(
+      AppListView::kProgressFlagSearchResults);
+  EXPECT_LE(std::abs(progress - 1.5f), 0.01f);
   EXPECT_EQ((half_top.y() + fullscreen_y) / 2 +
-                (config.search_box_fullscreen_top_padding() +
-                 fullscreen_search_box_padding) /
-                    2,
+                gfx::Tween::IntValueBetween(
+                    progress - 1, config.search_box_fullscreen_top_padding(),
+                    fullscreen_search_box_padding),
             search_box_bounds.y());
   EXPECT_EQ(search_box_bounds.y(),
             search_result_page()->GetBoundsInScreen().y());
diff --git a/ash/system/audio/unified_volume_view.cc b/ash/system/audio/unified_volume_view.cc
index f0877d1b..e75d6706 100644
--- a/ash/system/audio/unified_volume_view.cc
+++ b/ash/system/audio/unified_volume_view.cc
@@ -22,9 +22,9 @@
 #include "ui/views/animation/ink_drop_highlight.h"
 #include "ui/views/animation/ink_drop_impl.h"
 #include "ui/views/animation/ink_drop_mask.h"
+#include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/layout/box_layout.h"
-#include "ui/views/view_class_properties.h"
 
 using chromeos::CrasAudioHandler;
 
@@ -88,10 +88,7 @@
     SetTooltipText(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_AUDIO));
     TrayPopupUtils::ConfigureTrayPopupButton(this);
 
-    auto path = std::make_unique<SkPath>();
-    path->addRoundRect(gfx::RectToSkRect(gfx::Rect(CalculatePreferredSize())),
-                       kTrayItemSize / 2, kTrayItemSize / 2);
-    SetProperty(views::kHighlightPathKey, path.release());
+    views::InstallPillHighlightPathGenerator(this);
   }
 
   ~MoreButton() override = default;
@@ -126,11 +123,6 @@
         UnifiedSystemTrayView::GetBackgroundColor());
   }
 
-  std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override {
-    return std::make_unique<views::RoundRectInkDropMask>(size(), gfx::Insets(),
-                                                         kTrayItemSize / 2);
-  }
-
   const char* GetClassName() const override { return "MoreButton"; }
 
  private:
diff --git a/ash/system/unified/rounded_label_button.cc b/ash/system/unified/rounded_label_button.cc
index bec4b62c..46b7d7b 100644
--- a/ash/system/unified/rounded_label_button.cc
+++ b/ash/system/unified/rounded_label_button.cc
@@ -14,7 +14,7 @@
 #include "ui/views/animation/ink_drop_mask.h"
 #include "ui/views/animation/ink_drop_ripple.h"
 #include "ui/views/border.h"
-#include "ui/views/view_class_properties.h"
+#include "ui/views/controls/highlight_path_generator.h"
 
 namespace ash {
 
@@ -30,11 +30,7 @@
   label()->SetFontList(views::Label::GetDefaultFontList().Derive(
       1, gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM));
   TrayPopupUtils::ConfigureTrayPopupButton(this);
-
-  auto path = std::make_unique<SkPath>();
-  path->addRoundRect(gfx::RectToSkRect(gfx::Rect(CalculatePreferredSize())),
-                     kTrayItemSize / 2, kTrayItemSize / 2);
-  SetProperty(views::kHighlightPathKey, path.release());
+  views::InstallPillHighlightPathGenerator(this);
 }
 
 RoundedLabelButton::~RoundedLabelButton() = default;
diff --git a/ash/system/unified/top_shortcuts_view.cc b/ash/system/unified/top_shortcuts_view.cc
index 7ef376b..87e7eb1 100644
--- a/ash/system/unified/top_shortcuts_view.cc
+++ b/ash/system/unified/top_shortcuts_view.cc
@@ -23,6 +23,7 @@
 #include "ash/system/unified/user_chooser_view.h"
 #include "base/numerics/ranges.h"
 #include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/view_class_properties.h"
@@ -50,12 +51,7 @@
   SetInstallFocusRingOnFocus(true);
   SetFocusForPlatform();
 
-  int focus_ring_radius =
-      kTrayItemSize + kUnifiedCircularButtonFocusPadding.width();
-  auto path = std::make_unique<SkPath>();
-  path->addOval(gfx::RectToSkRect(
-      gfx::Rect(gfx::Size(focus_ring_radius, focus_ring_radius))));
-  SetProperty(views::kHighlightPathKey, path.release());
+  views::InstallCircleHighlightPathGenerator(this);
 }
 
 }  // namespace
diff --git a/ash/wallpaper/wallpaper_view.cc b/ash/wallpaper/wallpaper_view.cc
index d9e7fa53..b90568ef 100644
--- a/ash/wallpaper/wallpaper_view.cc
+++ b/ash/wallpaper/wallpaper_view.cc
@@ -10,6 +10,7 @@
 #include "ash/shell.h"
 #include "ash/wallpaper/wallpaper_controller_impl.h"
 #include "ash/wallpaper/wallpaper_widget_controller.h"
+#include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "cc/paint/render_surface_filters.h"
 #include "ui/aura/window.h"
 #include "ui/display/display.h"
@@ -133,8 +134,14 @@
   // Create the blur and brightness filter to apply to the downsampled image.
   cc::PaintFlags filter_flags;
   cc::FilterOperations operations;
-  operations.Append(
-      cc::FilterOperation::CreateBrightnessFilter(repaint_opacity_));
+  // In tablet mode, the wallpaper already has a color filter applied in
+  // |OnPaint| so we don't need to darken here.
+  // TODO(crbug.com/944152): Merge this with the color filter in
+  // WallpaperBaseView.
+  if (!Shell::Get()->tablet_mode_controller()->InTabletMode()) {
+    operations.Append(
+        cc::FilterOperation::CreateBrightnessFilter(repaint_opacity_));
+  }
   operations.Append(cc::FilterOperation::CreateBlurFilter(
       blur, SkBlurImageFilter::kClamp_TileMode));
   sk_sp<cc::PaintFilter> filter = cc::RenderSurfaceFilters::BuildImageFilter(
diff --git a/base/BUILD.gn b/base/BUILD.gn
index ac9ad8f..3c925480 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2702,6 +2702,7 @@
     "task/common/operations_controller_unittest.cc",
     "task/common/task_annotator_unittest.cc",
     "task/lazy_task_runner_unittest.cc",
+    "task/post_job_unittest.cc",
     "task/post_task_unittest.cc",
     "task/promise/abstract_promise_unittest.cc",
     "task/promise/dependent_list_unittest.cc",
diff --git a/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java b/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java
index 1af91c6..06b62375 100644
--- a/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java
+++ b/base/android/java/src/org/chromium/base/task/DefaultTaskExecutor.java
@@ -4,6 +4,7 @@
 
 package org.chromium.base.task;
 
+import android.os.Handler;
 import android.view.Choreographer;
 
 import org.chromium.base.ThreadUtils;
@@ -20,22 +21,26 @@
     @Override
     public TaskRunner createTaskRunner(TaskTraits taskTraits) {
         if (taskTraits.mIsChoreographerFrame) return createChoreographerTaskRunner();
+        if (taskTraits.mUseCurrentThread) return postCurrentThreadTask(taskTraits);
         return new TaskRunnerImpl(taskTraits);
     }
 
     @Override
     public SequencedTaskRunner createSequencedTaskRunner(TaskTraits taskTraits) {
         if (taskTraits.mIsChoreographerFrame) return createChoreographerTaskRunner();
+        if (taskTraits.mUseCurrentThread) return postCurrentThreadTask(taskTraits);
         return new SequencedTaskRunnerImpl(taskTraits);
     }
 
     /**
-     * This maps to a single thread within the native thread pool. Due to that contract we
-     * can't run tasks posted on it until native has started.
+     * If CurrentThread is not specified, or we are being called from within a threadpool task
+     * this maps to a single thread within the native thread pool. If so we can't run tasks
+     * posted on it until native has started.
      */
     @Override
     public SingleThreadTaskRunner createSingleThreadTaskRunner(TaskTraits taskTraits) {
         if (taskTraits.mIsChoreographerFrame) return createChoreographerTaskRunner();
+        if (taskTraits.mUseCurrentThread) return postCurrentThreadTask(taskTraits);
         // Tasks posted via this API will not execute until after native has started.
         return new SingleThreadTaskRunnerImpl(null, taskTraits);
     }
@@ -64,6 +69,16 @@
         return false;
     }
 
+    private SingleThreadTaskRunner postCurrentThreadTask(TaskTraits taskTraits) {
+        // Until native has loaded we only support CurrentThread on the UI thread, migration from
+        // threadpool or other java threads adds a lot of complexity for likely zero usage.
+        assert PostTask.getNativeSchedulerReady() || ThreadUtils.runningOnUiThread();
+        // A handler is only needed before the native scheduler is ready.
+        Handler preNativeHandler =
+                PostTask.getNativeSchedulerReady() ? null : ThreadUtils.getUiThreadHandler();
+        return new SingleThreadTaskRunnerImpl(preNativeHandler, taskTraits);
+    }
+
     private synchronized ChoreographerTaskRunner createChoreographerTaskRunner() {
         // TODO(alexclarke): Migrate to the new Android UI thread trait when available.
         return ThreadUtils.runOnUiThreadBlockingNoException(
diff --git a/base/android/java/src/org/chromium/base/task/PostTask.java b/base/android/java/src/org/chromium/base/task/PostTask.java
index 648eb05..f9a71e7 100644
--- a/base/android/java/src/org/chromium/base/task/PostTask.java
+++ b/base/android/java/src/org/chromium/base/task/PostTask.java
@@ -28,6 +28,7 @@
     private static final Executor sPrenativeThreadPoolExecutor = new ChromeThreadPoolExecutor();
     private static Executor sPrenativeThreadPoolExecutorOverride;
     private static final TaskExecutor sTaskExecutors[] = getInitialTaskExecutors();
+    private static boolean sNativeSchedulerReady;
 
     private static TaskExecutor[] getInitialTaskExecutors() {
         TaskExecutor taskExecutors[] = new TaskExecutor[TaskTraits.MAX_EXTENSION_ID + 1];
@@ -88,7 +89,8 @@
             } else {
                 PostTaskJni.get().postDelayedTask(taskTraits.mPrioritySetExplicitly,
                         taskTraits.mPriority, taskTraits.mMayBlock, taskTraits.mUseThreadPool,
-                        taskTraits.mExtensionId, taskTraits.mExtensionData, task, delay);
+                        taskTraits.mUseCurrentThread, taskTraits.mExtensionId,
+                        taskTraits.mExtensionData, task, delay);
             }
         }
     }
@@ -210,8 +212,9 @@
      */
     static Executor getPrenativeThreadPoolExecutor() {
         synchronized (sLock) {
-            if (sPrenativeThreadPoolExecutorOverride != null)
+            if (sPrenativeThreadPoolExecutorOverride != null) {
                 return sPrenativeThreadPoolExecutorOverride;
+            }
             return sPrenativeThreadPoolExecutor;
         }
     }
@@ -237,11 +240,21 @@
         return sTaskExecutors[traits.mExtensionId];
     }
 
+    /**
+     * @return True if the native scheduler is ready.
+     */
+    static boolean getNativeSchedulerReady() {
+        synchronized (sLock) {
+            return sNativeSchedulerReady;
+        }
+    }
+
     @CalledByNative
     private static void onNativeSchedulerReady() {
         synchronized (sLock) {
             Set<TaskRunner> preNativeTaskRunners = sPreNativeTaskRunners;
             sPreNativeTaskRunners = null;
+            sNativeSchedulerReady = true;
             for (TaskRunner taskRunner : preNativeTaskRunners) {
                 taskRunner.initNativeTaskRunner();
             }
@@ -254,13 +267,14 @@
         synchronized (sLock) {
             sPreNativeTaskRunners =
                     Collections.newSetFromMap(new WeakHashMap<TaskRunner, Boolean>());
+            sNativeSchedulerReady = false;
         }
     }
 
     @NativeMethods
     interface Natives {
         void postDelayedTask(boolean prioritySetExplicitly, int priority, boolean mayBlock,
-                boolean useThreadPool, byte extensionId, byte[] extensionData, Runnable task,
-                long delay);
+                boolean useThreadPool, boolean useCurrentThread, byte extensionId,
+                byte[] extensionData, Runnable task, long delay);
     }
 }
diff --git a/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java b/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java
index 5a5e1f3..f77354f 100644
--- a/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java
+++ b/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java
@@ -74,8 +74,9 @@
 
     @GuardedBy("mLock")
     protected void destroyInternal() {
-        if (mNativeTaskRunnerAndroid != 0)
+        if (mNativeTaskRunnerAndroid != 0) {
             TaskRunnerImplJni.get().destroy(mNativeTaskRunnerAndroid);
+        }
         mNativeTaskRunnerAndroid = 0;
     }
 
@@ -163,7 +164,8 @@
         if (mNativeTaskRunnerAndroid == 0) {
             mNativeTaskRunnerAndroid = TaskRunnerImplJni.get().init(mTaskRunnerType,
                     mTaskTraits.mPrioritySetExplicitly, mTaskTraits.mPriority,
-                    mTaskTraits.mMayBlock, mTaskTraits.mUseThreadPool, mTaskTraits.mExtensionId,
+                    mTaskTraits.mMayBlock, mTaskTraits.mUseThreadPool,
+                    mTaskTraits.mUseCurrentThread, mTaskTraits.mExtensionId,
                     mTaskTraits.mExtensionData);
         }
     }
@@ -191,7 +193,8 @@
     interface Natives {
         // NB due to Proguard obfuscation it's easiest to pass the traits via arguments.
         long init(@TaskRunnerType int taskRunnerType, boolean prioritySetExplicitly, int priority,
-                boolean mayBlock, boolean useThreadPool, byte extensionId, byte[] extensionData);
+                boolean mayBlock, boolean useThreadPool, boolean useCurrentThread, byte extensionId,
+                byte[] extensionData);
 
         void destroy(long nativeTaskRunnerAndroid);
         void postDelayedTask(long nativeTaskRunnerAndroid, Runnable task, long delay);
diff --git a/base/android/java/src/org/chromium/base/task/TaskTraits.java b/base/android/java/src/org/chromium/base/task/TaskTraits.java
index ebc98d0..af1203c 100644
--- a/base/android/java/src/org/chromium/base/task/TaskTraits.java
+++ b/base/android/java/src/org/chromium/base/task/TaskTraits.java
@@ -66,9 +66,8 @@
     // For tasks that should run on the thread pool instead of the main thread.
     // Note that currently also tasks which lack this trait will execute on the
     // thread pool unless a trait for a named thread is given.
-    // TODO(skyostil@): Make it required to state the thread affinity for all
-    // tasks.
-    public static final TaskTraits THREAD_POOL = new TaskTraits().threadPool();
+    public static final TaskTraits THREAD_POOL =
+            new TaskTraits().threadPool().taskPriority(TaskPriority.USER_BLOCKING);
     public static final TaskTraits THREAD_POOL_USER_BLOCKING =
             THREAD_POOL.taskPriority(TaskPriority.USER_BLOCKING);
     public static final TaskTraits THREAD_POOL_USER_VISIBLE =
@@ -76,12 +75,23 @@
     public static final TaskTraits THREAD_POOL_BEST_EFFORT =
             THREAD_POOL.taskPriority(TaskPriority.BEST_EFFORT);
 
+    // For tasks that should run on the current thread.
+    public static final TaskTraits CURRENT_THREAD =
+            new TaskTraits().currentThread().taskPriority(TaskPriority.USER_BLOCKING);
+    public static final TaskTraits CURRENT_THREAD_USER_BLOCKING =
+            CURRENT_THREAD.taskPriority(TaskPriority.USER_BLOCKING);
+    public static final TaskTraits CURRENT_THREAD_USER_VISIBLE =
+            CURRENT_THREAD.taskPriority(TaskPriority.USER_VISIBLE);
+    public static final TaskTraits CURRENT_THREAD_BEST_EFFORT =
+            CURRENT_THREAD.taskPriority(TaskPriority.BEST_EFFORT);
+
     // For convenience of the JNI code, we use primitive types only.
     // Note shutdown behavior is not supported on android.
     boolean mPrioritySetExplicitly;
     int mPriority;
     boolean mMayBlock;
     boolean mUseThreadPool;
+    boolean mUseCurrentThread;
     byte mExtensionId;
     byte mExtensionData[];
     boolean mIsChoreographerFrame;
@@ -97,6 +107,7 @@
         mMayBlock = other.mMayBlock;
         mUseThreadPool = other.mUseThreadPool;
         mExtensionId = other.mExtensionId;
+        mUseCurrentThread = other.mUseCurrentThread;
         mExtensionData = other.mExtensionData;
     }
 
@@ -126,6 +137,12 @@
         return taskTraits;
     }
 
+    public TaskTraits currentThread() {
+        TaskTraits taskTraits = new TaskTraits(this);
+        taskTraits.mUseCurrentThread = true;
+        return taskTraits;
+    }
+
     /**
      * @return true if this task is using some TaskTraits extension.
      */
@@ -166,8 +183,12 @@
         } else if (object instanceof TaskTraits) {
             TaskTraits other = (TaskTraits) object;
             return mPrioritySetExplicitly == other.mPrioritySetExplicitly
-                    && mPriority == other.mPriority && mExtensionId == other.mExtensionId
-                    && Arrays.equals(mExtensionData, other.mExtensionData);
+                    && mPriority == other.mPriority && mMayBlock == other.mMayBlock
+                    && mUseThreadPool == other.mUseThreadPool
+                    && mUseCurrentThread == other.mUseCurrentThread
+                    && mExtensionId == other.mExtensionId
+                    && Arrays.equals(mExtensionData, other.mExtensionData)
+                    && mIsChoreographerFrame == other.mIsChoreographerFrame;
         } else {
             return false;
         }
@@ -180,6 +201,7 @@
         hash = 37 * hash + mPriority;
         hash = 37 * hash + (mMayBlock ? 0 : 1);
         hash = 37 * hash + (mUseThreadPool ? 0 : 1);
+        hash = 37 * hash + (mUseCurrentThread ? 0 : 1);
         hash = 37 * hash + (int) mExtensionId;
         hash = 37 * hash + Arrays.hashCode(mExtensionData);
         hash = 37 * hash + (mIsChoreographerFrame ? 0 : 1);
diff --git a/base/android/task_scheduler/post_task_android.cc b/base/android/task_scheduler/post_task_android.cc
index 78f1cf7..743dd01 100644
--- a/base/android/task_scheduler/post_task_android.cc
+++ b/base/android/task_scheduler/post_task_android.cc
@@ -49,11 +49,12 @@
     jint priority,
     jboolean may_block,
     jboolean use_thread_pool,
+    jboolean current_thread,
     jbyte extension_id,
     const base::android::JavaParamRef<jbyteArray>& extension_data) {
   return TaskTraits(priority_set_explicitly,
                     static_cast<TaskPriority>(priority), may_block,
-                    use_thread_pool,
+                    use_thread_pool, current_thread,
                     TaskTraitsExtensionStorage(
                         extension_id, GetExtensionData(env, extension_data)));
 }
@@ -64,19 +65,21 @@
     jint priority,
     jboolean may_block,
     jboolean use_thread_pool,
+    jboolean current_thread,
     jbyte extension_id,
     const base::android::JavaParamRef<jbyteArray>& extension_data,
     const base::android::JavaParamRef<jobject>& task,
     jlong delay) {
   // This could be run on any java thread, so we can't cache |env| in the
   // BindOnce because JNIEnv is thread specific.
-  PostDelayedTask(FROM_HERE,
-                  PostTaskAndroid::CreateTaskTraits(
-                      env, priority_set_explicitly, priority, may_block,
-                      use_thread_pool, extension_id, extension_data),
-                  BindOnce(&PostTaskAndroid::RunJavaTask,
-                           base::android::ScopedJavaGlobalRef<jobject>(task)),
-                  TimeDelta::FromMilliseconds(delay));
+  PostDelayedTask(
+      FROM_HERE,
+      PostTaskAndroid::CreateTaskTraits(
+          env, priority_set_explicitly, priority, may_block, use_thread_pool,
+          current_thread, extension_id, extension_data),
+      BindOnce(&PostTaskAndroid::RunJavaTask,
+               base::android::ScopedJavaGlobalRef<jobject>(task)),
+      TimeDelta::FromMilliseconds(delay));
 }
 
 // static
diff --git a/base/android/task_scheduler/post_task_android.h b/base/android/task_scheduler/post_task_android.h
index c15c822..80fdb3b3 100644
--- a/base/android/task_scheduler/post_task_android.h
+++ b/base/android/task_scheduler/post_task_android.h
@@ -28,6 +28,7 @@
       jint priority,
       jboolean may_block,
       jboolean use_thread_pool,
+      jboolean current_thread,
       jbyte extension_id,
       const base::android::JavaParamRef<jbyteArray>& extension_data);
 
diff --git a/base/android/task_scheduler/task_runner_android.cc b/base/android/task_scheduler/task_runner_android.cc
index 18730e17..7531028d 100644
--- a/base/android/task_scheduler/task_runner_android.cc
+++ b/base/android/task_scheduler/task_runner_android.cc
@@ -20,11 +20,12 @@
     jint priority,
     jboolean may_block,
     jboolean thread_pool,
+    jboolean current_thread,
     jbyte extension_id,
     const base::android::JavaParamRef<jbyteArray>& extension_data) {
   TaskTraits task_traits = PostTaskAndroid::CreateTaskTraits(
       env, priority_set_explicitly, priority, may_block, thread_pool,
-      extension_id, extension_data);
+      current_thread, extension_id, extension_data);
   scoped_refptr<TaskRunner> task_runner;
   switch (static_cast<TaskRunnerType>(task_runner_type)) {
     case TaskRunnerType::BASE:
diff --git a/base/task/post_job.cc b/base/task/post_job.cc
index 1e0b4d9..3c83068 100644
--- a/base/task/post_job.cc
+++ b/base/task/post_job.cc
@@ -7,6 +7,8 @@
 #include "base/task/scoped_set_task_priority_for_current_thread.h"
 #include "base/task/thread_pool/job_task_source.h"
 #include "base/task/thread_pool/pooled_task_runner_delegate.h"
+#include "base/task/thread_pool/thread_pool_impl.h"
+#include "base/task/thread_pool/thread_pool_instance.h"
 
 namespace base {
 namespace experimental {
@@ -100,6 +102,8 @@
 #endif  // DCHECK_IS_ON()
 }
 
+JobHandle::JobHandle() = default;
+
 JobHandle::JobHandle(scoped_refptr<internal::JobTaskSource> task_source)
     : task_source_(std::move(task_source)) {}
 
@@ -157,5 +161,32 @@
   task_source_ = nullptr;
 }
 
+JobHandle PostJob(const Location& from_here,
+                  const TaskTraits& traits,
+                  RepeatingCallback<void(JobDelegate*)> worker_task,
+                  RepeatingCallback<size_t()> max_concurrency_callback) {
+  DCHECK(ThreadPoolInstance::Get())
+      << "Ref. Prerequisite section of post_task.h.\n\n"
+         "Hint: if this is in a unit test, you're likely merely missing a "
+         "base::test::TaskEnvironment member in your fixture.\n";
+  DCHECK(traits.use_thread_pool())
+      << "The base::ThreadPool() trait is mandatory with PostJob().";
+  DCHECK_EQ(traits.extension_id(),
+            TaskTraitsExtensionStorage::kInvalidExtensionId)
+      << "Extension traits cannot be used with PostJob().";
+  TaskTraits adjusted_traits = traits;
+  adjusted_traits.InheritPriority(internal::GetTaskPriorityForCurrentThread());
+  auto task_source = base::MakeRefCounted<internal::JobTaskSource>(
+      from_here, adjusted_traits, std::move(worker_task),
+      std::move(max_concurrency_callback),
+      static_cast<internal::ThreadPoolImpl*>(ThreadPoolInstance::Get()));
+  const bool queued =
+      static_cast<internal::ThreadPoolImpl*>(ThreadPoolInstance::Get())
+          ->EnqueueJobTaskSource(task_source);
+  if (queued)
+    return internal::JobTaskSource::CreateJobHandle(std::move(task_source));
+  return JobHandle();
+}
+
 }  // namespace experimental
 }  // namespace base
\ No newline at end of file
diff --git a/base/task/post_job.h b/base/task/post_job.h
index b9a3283..cf8ca1a 100644
--- a/base/task/post_job.h
+++ b/base/task/post_job.h
@@ -6,6 +6,8 @@
 #define BASE_TASK_POST_JOB_H_
 
 #include "base/base_export.h"
+#include "base/callback.h"
+#include "base/location.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
@@ -45,7 +47,7 @@
   void YieldIfNeeded();
 
   // Notifies the scheduler that max concurrency was increased, and the number
-  // of worker should be adjusted.
+  // of worker should be adjusted accordingly. See PostJob() for more details.
   void NotifyConcurrencyIncrease();
 
  private:
@@ -74,6 +76,7 @@
 // the posted Job.
 class BASE_EXPORT JobHandle {
  public:
+  JobHandle();
   // A job must either be joined, canceled or detached before the JobHandle is
   // destroyed.
   ~JobHandle();
@@ -85,12 +88,7 @@
   void UpdatePriority(TaskPriority new_priority);
 
   // Notifies the scheduler that max concurrency was increased, and the number
-  // of worker should be adjusted accordingly. This *must* be invoked shortly
-  // after |max_concurrency_callback| starts returning a value larger than
-  // previously returned values. This usually happens when new work items are
-  // added and the API user wants additional |worker_task| to run concurrently.
-  // TODO(839091): Update comment to be more specific about
-  // |max_concurrency_callback| once PostJob() landed.
+  // of workers should be adjusted accordingly. See PostJob() for more details.
   void NotifyConcurrencyIncrease();
 
   // Contributes to the job on this thread. Doesn't return until all tasks have
@@ -111,7 +109,6 @@
   void Detach();
 
  private:
-  // TODO(839091): Update friendship once PostJob is used.
   friend class internal::JobTaskSource;
 
   explicit JobHandle(scoped_refptr<internal::JobTaskSource> task_source);
@@ -121,6 +118,49 @@
   DISALLOW_COPY_AND_ASSIGN(JobHandle);
 };
 
+// Posts a repeating |worker_task| with specific |traits| to run in parallel.
+// Returns a JobHandle associated with the Job, which can be joined, canceled or
+// detached.
+// To avoid scheduling overhead, |worker_task| should do as much work as
+// possible in a loop when invoked, and JobDelegate::ShouldYield() should be
+// periodically invoked to conditionally exit and let the scheduler prioritize
+// work.
+//
+// A canonical implementation of |worker_task| looks like:
+//   void WorkerTask(JobDelegate* job_delegate) {
+//     while (!job_delegate->ShouldYield()) {
+//       auto work_item = worker_queue.TakeWorkItem(); // Smallest unit of work.
+//       if (!work_item)
+//         return:
+//       ProcessWork(work_item);
+//     }
+//   }
+//
+// |max_concurrency_callback| controls the maximum number of threads calling
+// |worker_task| concurrently. |worker_task| is only invoked if the number of
+// threads previously running |worker_task| was less than the value returned by
+// |max_concurrency_callback|. In general, |max_concurrency_callback| should
+// return the latest number of incomplete work items (smallest unit of work)
+// left to processed. JobHandle/JobDelegate::NotifyConcurrencyIncrease() *must*
+// be invoked shortly after |max_concurrency_callback| starts returning a value
+// larger than previously returned values. This usually happens when new work
+// items are added and the API user wants additional threads to invoke
+// |worker_task| concurrently. The callbacks may be called concurrently on any
+// thread until the job is complete. If the job handle is detached, the
+// callbacks may still be called, so they must not access global state that
+// could be destroyed.
+//
+// |traits| requirements:
+// - base::ThreadPool() must be specified.
+// - Extension traits (e.g. BrowserThread) cannot be specified.
+// - base::ThreadPolicy must be specified if the priority of the task runner
+//   will ever be increased from BEST_EFFORT.
+JobHandle BASE_EXPORT
+PostJob(const Location& from_here,
+        const TaskTraits& traits,
+        RepeatingCallback<void(JobDelegate*)> worker_task,
+        RepeatingCallback<size_t()> max_concurrency_callback);
+
 }  // namespace experimental
 }  // namespace base
 
diff --git a/base/task/post_job_unittest.cc b/base/task/post_job_unittest.cc
new file mode 100644
index 0000000..3fc3d6d4
--- /dev/null
+++ b/base/task/post_job_unittest.cc
@@ -0,0 +1,40 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/task/post_job.h"
+
+#include <atomic>
+
+#include "base/task/test_task_traits_extension.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/gtest_util.h"
+#include "base/test/task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+
+TEST(PostJobTest, PostJobSimple) {
+  test::TaskEnvironment task_environment;
+  std::atomic_size_t num_tasks_to_run(4);
+  auto handle = experimental::PostJob(
+      FROM_HERE, ThreadPool(),
+      BindLambdaForTesting(
+          [&](experimental::JobDelegate* delegate) { --num_tasks_to_run; }),
+      BindLambdaForTesting([&]() -> size_t { return num_tasks_to_run; }));
+  handle.Join();
+  DCHECK_EQ(num_tasks_to_run, 0U);
+}
+
+TEST(PostJobTest, PostJobExtension) {
+  testing::FLAGS_gtest_death_test_style = "threadsafe";
+  EXPECT_DCHECK_DEATH({
+    auto handle = experimental::PostJob(
+        FROM_HERE, TestExtensionBoolTrait(),
+        BindRepeating([](experimental::JobDelegate* delegate) {}),
+        BindRepeating([]() -> size_t { return 0; }));
+  });
+}
+
+}  // namespace base
\ No newline at end of file
diff --git a/base/task/post_task.cc b/base/task/post_task.cc
index 1e7e65c..244e5f6 100644
--- a/base/task/post_task.cc
+++ b/base/task/post_task.cc
@@ -41,6 +41,13 @@
 }
 
 TaskExecutor* GetTaskExecutorForTraits(const TaskTraits& traits) {
+  if (traits.use_current_thread()) {
+    TaskExecutor* executor = GetTaskExecutorForCurrentThread();
+    DCHECK(executor) << "Couldn't find a TaskExecutor for this thread. Note "
+                        "you can't use base::CurrentThread in a one-off "
+                        "base::ThreadPool task.";
+    return executor;
+  }
   TaskExecutor* executor = GetRegisteredTaskExecutorForTraits(traits);
   DCHECK(executor || ThreadPoolInstance::Get())
       << "Ref. Prerequisite section of post_task.h.\n\n"
diff --git a/base/task/post_task_unittest.cc b/base/task/post_task_unittest.cc
index f81f9d1c..798eba8 100644
--- a/base/task/post_task_unittest.cc
+++ b/base/task/post_task_unittest.cc
@@ -225,6 +225,115 @@
   run_loop.Run();
 }
 
+TEST_F(PostTaskTestWithExecutor, ThreadPoolTaskRunnerCurrentThreadTrait) {
+  auto task_runner = CreateTaskRunner({ThreadPool()});
+  RunLoop run_loop;
+
+  EXPECT_TRUE(task_runner->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
+                                      // CurrentThread is meaningless in this
+                                      // context.
+                                      EXPECT_DCHECK_DEATH(
+                                          PostTask(FROM_HERE, {CurrentThread()},
+                                                   DoNothing()));
+                                      run_loop.Quit();
+                                    })));
+
+  run_loop.Run();
+}
+
+TEST_F(PostTaskTestWithExecutor,
+       ThreadPoolSequencedTaskRunnerCurrentThreadTrait) {
+  auto sequenced_task_runner = CreateSequencedTaskRunner({ThreadPool()});
+  RunLoop run_loop;
+
+  auto current_thread_task = BindLambdaForTesting([&]() {
+    EXPECT_TRUE(sequenced_task_runner->RunsTasksInCurrentSequence());
+    run_loop.Quit();
+  });
+
+  EXPECT_TRUE(sequenced_task_runner->PostTask(
+      FROM_HERE, BindLambdaForTesting([&]() {
+        EXPECT_TRUE(
+            PostTask(FROM_HERE, {CurrentThread()}, current_thread_task));
+      })));
+
+  run_loop.Run();
+}
+
+TEST_F(PostTaskTestWithExecutor,
+       ThreadPoolSingleThreadTaskRunnerCurrentThreadTrait) {
+  auto single_thread_task_runner = CreateSingleThreadTaskRunner({ThreadPool()});
+  RunLoop run_loop;
+
+  auto current_thread_task = BindLambdaForTesting([&]() {
+    EXPECT_TRUE(single_thread_task_runner->RunsTasksInCurrentSequence());
+    run_loop.Quit();
+  });
+
+  EXPECT_TRUE(single_thread_task_runner->PostTask(
+      FROM_HERE, BindLambdaForTesting([&]() {
+        EXPECT_TRUE(
+            PostTask(FROM_HERE, {CurrentThread()}, current_thread_task));
+      })));
+
+  run_loop.Run();
+}
+
+TEST_F(PostTaskTestWithExecutor, ThreadPoolCurrentThreadChangePriority) {
+  auto single_thread_task_runner =
+      CreateSingleThreadTaskRunner({ThreadPool(), TaskPriority::USER_BLOCKING});
+  RunLoop run_loop;
+
+  auto current_thread_task = BindLambdaForTesting([&]() {
+    EXPECT_TRUE(single_thread_task_runner->RunsTasksInCurrentSequence());
+    run_loop.Quit();
+  });
+
+  EXPECT_TRUE(single_thread_task_runner->PostTask(
+      FROM_HERE, BindLambdaForTesting([&]() {
+        // We should be able to request a priority change, although it may be
+        // ignored.
+        EXPECT_TRUE(PostTask(FROM_HERE,
+                             {CurrentThread(), TaskPriority::USER_VISIBLE},
+                             current_thread_task));
+      })));
+
+  run_loop.Run();
+}
+
+TEST_F(PostTaskTestWithExecutor,
+       ThreadPoolCurrentThreadCantChangeShutdownBehavior) {
+  auto single_thread_task_runner = CreateSingleThreadTaskRunner(
+      {ThreadPool(), TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
+  RunLoop run_loop;
+
+  EXPECT_TRUE(single_thread_task_runner->PostTask(
+      FROM_HERE, BindLambdaForTesting([&]() {
+        EXPECT_DCHECK_DEATH(PostTask(
+            FROM_HERE, {CurrentThread(), TaskShutdownBehavior::BLOCK_SHUTDOWN},
+            DoNothing()));
+        run_loop.Quit();
+      })));
+
+  run_loop.Run();
+}
+
+TEST_F(PostTaskTestWithExecutor,
+       ThreadPoolCurrentThreadCantSetSyncPrimitivesInNonSyncTaskRunner) {
+  auto single_thread_task_runner = CreateSingleThreadTaskRunner({ThreadPool()});
+  RunLoop run_loop;
+
+  EXPECT_TRUE(single_thread_task_runner->PostTask(
+      FROM_HERE, BindLambdaForTesting([&]() {
+        EXPECT_DCHECK_DEATH(
+            PostTask(FROM_HERE, {CurrentThread(), WithBaseSyncPrimitives()},
+                     DoNothing()));
+        run_loop.Quit();
+      })));
+
+  run_loop.Run();
+}
+
 TEST_F(PostTaskTestWithExecutor, RegisterExecutorTwice) {
   testing::FLAGS_gtest_death_test_style = "threadsafe";
   EXPECT_DCHECK_DEATH(
diff --git a/base/task/sequence_manager/sequence_manager.h b/base/task/sequence_manager/sequence_manager.h
index 8ec2cf3..6e1cb0b 100644
--- a/base/task/sequence_manager/sequence_manager.h
+++ b/base/task/sequence_manager/sequence_manager.h
@@ -20,6 +20,7 @@
 namespace base {
 
 class MessagePump;
+class TaskObserver;
 
 namespace sequence_manager {
 
@@ -248,6 +249,14 @@
   virtual std::unique_ptr<NativeWorkHandle> OnNativeWorkPending(
       TaskQueue::QueuePriority priority) = 0;
 
+  // Adds an observer which reports task execution. Can only be called on the
+  // same thread that |this| is running on.
+  virtual void AddTaskObserver(TaskObserver* task_observer) = 0;
+
+  // Removes an observer which reports task execution. Can only be called on the
+  // same thread that |this| is running on.
+  virtual void RemoveTaskObserver(TaskObserver* task_observer) = 0;
+
  protected:
   virtual std::unique_ptr<internal::TaskQueueImpl> CreateTaskQueueImpl(
       const TaskQueue::Spec& spec) = 0;
diff --git a/base/task/sequence_manager/sequence_manager_impl.h b/base/task/sequence_manager/sequence_manager_impl.h
index d490475..1ee7944 100644
--- a/base/task/sequence_manager/sequence_manager_impl.h
+++ b/base/task/sequence_manager/sequence_manager_impl.h
@@ -42,8 +42,6 @@
 
 namespace base {
 
-class TaskObserver;
-
 namespace trace_event {
 class ConvertableToTraceFormat;
 }  // namespace trace_event
@@ -128,6 +126,8 @@
   std::string DescribeAllPendingTasks() const override;
   std::unique_ptr<NativeWorkHandle> OnNativeWorkPending(
       TaskQueue::QueuePriority priority) override;
+  void AddTaskObserver(TaskObserver* task_observer) override;
+  void RemoveTaskObserver(TaskObserver* task_observer) override;
 
   // SequencedTaskSource implementation:
   Task* SelectNextTask() override;
@@ -136,8 +136,6 @@
   bool HasPendingHighResolutionTasks() override;
   bool OnSystemIdle() override;
 
-  void AddTaskObserver(TaskObserver* task_observer);
-  void RemoveTaskObserver(TaskObserver* task_observer);
   void AddDestructionObserver(
       MessageLoopCurrent::DestructionObserver* destruction_observer);
   void RemoveDestructionObserver(
diff --git a/base/task/single_thread_task_executor_unittest.cc b/base/task/single_thread_task_executor_unittest.cc
index 8919298b..b64294f 100644
--- a/base/task/single_thread_task_executor_unittest.cc
+++ b/base/task/single_thread_task_executor_unittest.cc
@@ -5,6 +5,7 @@
 #include "base/task/single_thread_task_executor.h"
 
 #include "base/run_loop.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -42,4 +43,16 @@
   run_loop.Run();
 }
 
+TEST(SingleThreadTaskExecutorTest, CurrentThread) {
+  SingleThreadTaskExecutor single_thread_task_executor;
+
+  EXPECT_EQ(single_thread_task_executor.task_runner(),
+            base::CreateSingleThreadTaskRunner({base::CurrentThread()}));
+
+  // There's only one task queue so priority is ignored.
+  EXPECT_EQ(single_thread_task_executor.task_runner(),
+            base::CreateSingleThreadTaskRunner(
+                {base::CurrentThread(), base::TaskPriority::BEST_EFFORT}));
+}
+
 }  // namespace base
diff --git a/base/task/task_executor.cc b/base/task/task_executor.cc
index 0bb86510..355fa3f 100644
--- a/base/task/task_executor.cc
+++ b/base/task/task_executor.cc
@@ -74,4 +74,4 @@
   return nullptr;
 }
 
-}  // namespace base
\ No newline at end of file
+}  // namespace base
diff --git a/base/task/task_traits.h b/base/task/task_traits.h
index c1e52ed..03abf17 100644
--- a/base/task/task_traits.h
+++ b/base/task/task_traits.h
@@ -185,6 +185,14 @@
 // between tasks, see base::PostTask::CreateSequencedTaskRunner.
 struct ThreadPool {};
 
+// Tasks and task runners with this thread will run tasks on the virtual thread
+// (sequence) they are posted/created from. Other traits may be specified
+// alongside this one to refine properties for the associated tasks
+// (e.g. base::TaskPriority or content::BrowserTaskType) as long as those traits
+// are compatible with the current thread (e.g. cannot specify base::MayBlock()
+// on a non-blocking thread or alter base::TaskShutdownBehavior).
+struct CurrentThread {};
+
 // Describes metadata for a single task or a group of tasks.
 class BASE_EXPORT TaskTraits {
  public:
@@ -196,6 +204,7 @@
     ValidTrait(MayBlock);
     ValidTrait(WithBaseSyncPrimitives);
     ValidTrait(ThreadPool);
+    ValidTrait(CurrentThread);
   };
 
   // Invoking this constructor without arguments produces TaskTraits that are
@@ -255,15 +264,22 @@
         may_block_(trait_helpers::HasTrait<MayBlock, ArgTypes...>()),
         with_base_sync_primitives_(
             trait_helpers::HasTrait<WithBaseSyncPrimitives, ArgTypes...>()),
-        use_thread_pool_(trait_helpers::HasTrait<ThreadPool, ArgTypes...>()) {
+        use_thread_pool_(trait_helpers::HasTrait<ThreadPool, ArgTypes...>()),
+        use_current_thread_(
+            trait_helpers::HasTrait<CurrentThread, ArgTypes...>()) {
     constexpr bool has_thread_pool =
         trait_helpers::HasTrait<ThreadPool, ArgTypes...>();
     constexpr bool has_extension =
         !trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>::value;
+    constexpr bool has_current_thread =
+        trait_helpers::HasTrait<CurrentThread, ArgTypes...>();
     static_assert(
-        has_thread_pool ^ has_extension,
+        !has_current_thread || !has_thread_pool,
+        "base::CurrentThread is mutually exclusive with base::ThreadPool");
+    static_assert(
+        has_thread_pool ^ has_extension || has_current_thread,
         "Traits must explicitly specify a destination (e.g. ThreadPool or a "
-        "named thread like BrowserThread)");
+        "named thread like BrowserThread, or CurrentThread)");
   }
 
   constexpr TaskTraits(const TaskTraits& other) = default;
@@ -271,14 +287,15 @@
 
   // TODO(eseckler): Default the comparison operator once C++20 arrives.
   bool operator==(const TaskTraits& other) const {
-    static_assert(sizeof(TaskTraits) == 15,
+    static_assert(sizeof(TaskTraits) == 16,
                   "Update comparison operator when TaskTraits change");
     return extension_ == other.extension_ && priority_ == other.priority_ &&
            shutdown_behavior_ == other.shutdown_behavior_ &&
            thread_policy_ == other.thread_policy_ &&
            may_block_ == other.may_block_ &&
            with_base_sync_primitives_ == other.with_base_sync_primitives_ &&
-           use_thread_pool_ == other.use_thread_pool_;
+           use_thread_pool_ == other.use_thread_pool_ &&
+           use_current_thread_ == other.use_current_thread_;
   }
 
   // Sets the priority of tasks with these traits to |priority|.
@@ -335,6 +352,10 @@
   // Returns true if tasks with these traits execute on the thread pool.
   constexpr bool use_thread_pool() const { return use_thread_pool_; }
 
+  // Returns true if tasks with these traits execute on the virtual thread
+  // (sequence) they are posted/created from.
+  constexpr bool use_current_thread() const { return use_current_thread_; }
+
   uint8_t extension_id() const { return extension_.extension_id; }
 
   // Access the extension data by parsing it into the provided extension type.
@@ -353,6 +374,7 @@
              TaskPriority priority,
              bool may_block,
              bool use_thread_pool,
+             bool use_current_thread,
              TaskTraitsExtensionStorage extension)
       : extension_(extension),
         priority_(static_cast<uint8_t>(priority) |
@@ -362,8 +384,9 @@
         thread_policy_(static_cast<uint8_t>(ThreadPolicy::PREFER_BACKGROUND)),
         may_block_(may_block),
         with_base_sync_primitives_(false),
-        use_thread_pool_(use_thread_pool) {
-    static_assert(sizeof(TaskTraits) == 15, "Keep this constructor up to date");
+        use_thread_pool_(use_thread_pool),
+        use_current_thread_(use_current_thread) {
+    static_assert(sizeof(TaskTraits) == 16, "Keep this constructor up to date");
   }
 
   // This bit is set in |priority_|, |shutdown_behavior_| and |thread_policy_|
@@ -378,6 +401,7 @@
   bool may_block_;
   bool with_base_sync_primitives_;
   bool use_thread_pool_;
+  bool use_current_thread_;
 };
 
 // Returns string literals for the enums defined in this file. These methods
diff --git a/base/task/task_traits_unittest.nc b/base/task/task_traits_unittest.nc
index 8755ca0..73fc7be55 100644
--- a/base/task/task_traits_unittest.nc
+++ b/base/task/task_traits_unittest.nc
@@ -26,6 +26,8 @@
                                TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
 #elif defined(NCTEST_TASK_TRAITS_INVALID_TYPE)  // [r"no matching constructor for initialization of 'const base::TaskTraits'"]
 constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN, true};
+#elif defined(NCTEST_TASK_TRAITS_CURRENT_THREAD_AND_THREADPOOL)  // [r"base::CurrentThread is mutually exclusive with base::ThreadPool"]
+constexpr TaskTraits traits = {ThreadPool(), CurrentThread()};
 #endif
 
 }  // namespace base
diff --git a/base/task/thread_pool/job_task_source.h b/base/task/thread_pool/job_task_source.h
index cf0c76d..57838679 100644
--- a/base/task/thread_pool/job_task_source.h
+++ b/base/task/thread_pool/job_task_source.h
@@ -38,8 +38,9 @@
                 RepeatingCallback<size_t()> max_concurrency_callback,
                 PooledTaskRunnerDelegate* delegate);
 
-  experimental::JobHandle GetHandleForTesting() {
-    return experimental::JobHandle(this);
+  static experimental::JobHandle CreateJobHandle(
+      scoped_refptr<internal::JobTaskSource> task_source) {
+    return experimental::JobHandle(std::move(task_source));
   }
 
   // Notifies this task source that max concurrency was increased, and the
diff --git a/base/task/thread_pool/task_tracker.cc b/base/task/thread_pool/task_tracker.cc
index c6f664b..a74f140 100644
--- a/base/task/thread_pool/task_tracker.cc
+++ b/base/task/thread_pool/task_tracker.cc
@@ -120,9 +120,11 @@
   // |sequenced_task_runner| and |single_thread_task_runner| must outlive this
   // EphemeralTaskExecutor.
   EphemeralTaskExecutor(SequencedTaskRunner* sequenced_task_runner,
-                        SingleThreadTaskRunner* single_thread_task_runner)
+                        SingleThreadTaskRunner* single_thread_task_runner,
+                        const TaskTraits* sequence_traits)
       : sequenced_task_runner_(sequenced_task_runner),
-        single_thread_task_runner_(single_thread_task_runner) {
+        single_thread_task_runner_(single_thread_task_runner),
+        sequence_traits_(sequence_traits) {
     SetTaskExecutorForCurrentThread(this);
   }
 
@@ -135,23 +137,27 @@
                        const TaskTraits& traits,
                        OnceClosure task,
                        TimeDelta delay) override {
+    CheckTraitsCompatibleWithSequenceTraits(traits);
     return sequenced_task_runner_->PostDelayedTask(from_here, std::move(task),
                                                    delay);
   }
 
   scoped_refptr<TaskRunner> CreateTaskRunner(
       const TaskTraits& traits) override {
+    CheckTraitsCompatibleWithSequenceTraits(traits);
     return sequenced_task_runner_;
   }
 
   scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunner(
       const TaskTraits& traits) override {
+    CheckTraitsCompatibleWithSequenceTraits(traits);
     return sequenced_task_runner_;
   }
 
   scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunner(
       const TaskTraits& traits,
       SingleThreadTaskRunnerThreadMode thread_mode) override {
+    CheckTraitsCompatibleWithSequenceTraits(traits);
     return single_thread_task_runner_;
   }
 
@@ -159,13 +165,30 @@
   scoped_refptr<SingleThreadTaskRunner> CreateCOMSTATaskRunner(
       const TaskTraits& traits,
       SingleThreadTaskRunnerThreadMode thread_mode) override {
+    CheckTraitsCompatibleWithSequenceTraits(traits);
     return single_thread_task_runner_;
   }
 #endif  // defined(OS_WIN)
 
  private:
-  SequencedTaskRunner* sequenced_task_runner_;
-  SingleThreadTaskRunner* single_thread_task_runner_;
+  // Currently ignores |traits.priority()|.
+  void CheckTraitsCompatibleWithSequenceTraits(const TaskTraits& traits) {
+    if (traits.shutdown_behavior_set_explicitly()) {
+      DCHECK_EQ(traits.shutdown_behavior(),
+                sequence_traits_->shutdown_behavior());
+    }
+
+    DCHECK(!traits.may_block() ||
+           traits.may_block() == sequence_traits_->may_block());
+
+    DCHECK(!traits.with_base_sync_primitives() ||
+           traits.with_base_sync_primitives() ==
+               sequence_traits_->with_base_sync_primitives());
+  }
+
+  SequencedTaskRunner* const sequenced_task_runner_;
+  SingleThreadTaskRunner* const single_thread_task_runner_;
+  const TaskTraits* const sequence_traits_;
 };
 
 }  // namespace
@@ -547,7 +570,7 @@
             static_cast<SequencedTaskRunner*>(task_source->task_runner()));
         ephemiral_task_executor.emplace(
             static_cast<SequencedTaskRunner*>(task_source->task_runner()),
-            nullptr);
+            nullptr, &traits);
         break;
       case TaskSourceExecutionMode::kSingleThread:
         DCHECK(task_source->task_runner());
@@ -555,7 +578,8 @@
             static_cast<SingleThreadTaskRunner*>(task_source->task_runner()));
         ephemiral_task_executor.emplace(
             static_cast<SequencedTaskRunner*>(task_source->task_runner()),
-            static_cast<SingleThreadTaskRunner*>(task_source->task_runner()));
+            static_cast<SingleThreadTaskRunner*>(task_source->task_runner()),
+            &traits);
         break;
     }
 
diff --git a/base/task/thread_pool/thread_group_unittest.cc b/base/task/thread_pool/thread_group_unittest.cc
index d09567b8..3ed430a 100644
--- a/base/task/thread_pool/thread_group_unittest.cc
+++ b/base/task/thread_pool/thread_group_unittest.cc
@@ -681,8 +681,9 @@
   scoped_refptr<JobTaskSource> task_source = job_task->GetJobTaskSource(
       FROM_HERE, {ThreadPool()}, &mock_pooled_task_runner_delegate_);
 
-  experimental::JobHandle job_handle = task_source->GetHandleForTesting();
   mock_pooled_task_runner_delegate_.EnqueueJobTaskSource(task_source);
+  experimental::JobHandle job_handle =
+      internal::JobTaskSource::CreateJobHandle(task_source);
 
   // Wait for at least 1 task to start running.
   {
@@ -796,8 +797,9 @@
   scoped_refptr<JobTaskSource> task_source = job_task->GetJobTaskSource(
       FROM_HERE, {ThreadPool()}, &mock_pooled_task_runner_delegate_);
 
-  experimental::JobHandle job_handle = task_source->GetHandleForTesting();
   mock_pooled_task_runner_delegate_.EnqueueJobTaskSource(task_source);
+  experimental::JobHandle job_handle =
+      internal::JobTaskSource::CreateJobHandle(task_source);
   job_handle.Join();
   // All worker tasks should complete before Join() returns.
   EXPECT_EQ(0U, job_task->GetMaxConcurrency());
diff --git a/base/test/task_environment.cc b/base/test/task_environment.cc
index 99b1ebe..3f9d6af 100644
--- a/base/test/task_environment.cc
+++ b/base/test/task_environment.cc
@@ -19,6 +19,7 @@
 #include "base/task/post_task.h"
 #include "base/task/sequence_manager/sequence_manager_impl.h"
 #include "base/task/sequence_manager/time_domain.h"
+#include "base/task/simple_task_executor.h"
 #include "base/task/thread_pool/thread_pool_impl.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "base/test/bind_test_util.h"
@@ -395,6 +396,7 @@
             .SetTimeDomain(mock_time_domain_.get()));
     task_runner_ = task_queue_->task_runner();
     sequence_manager_->SetDefaultTaskRunner(task_runner_);
+    simple_task_executor_ = std::make_unique<SimpleTaskExecutor>(task_runner_);
     CHECK(base::ThreadTaskRunnerHandle::IsSet())
         << "ThreadTaskRunnerHandle should've been set now.";
     CompleteInitialization();
diff --git a/base/test/task_environment.h b/base/test/task_environment.h
index c222141..ac45058 100644
--- a/base/test/task_environment.h
+++ b/base/test/task_environment.h
@@ -23,6 +23,7 @@
 
 class Clock;
 class FileDescriptorWatcher;
+class SimpleTaskExecutor;
 class TickClock;
 
 namespace subtle {
@@ -348,6 +349,9 @@
 
   std::unique_ptr<bool> owns_instance_ = std::make_unique<bool>(true);
 
+  // To support base::CurrentThread().
+  std::unique_ptr<SimpleTaskExecutor> simple_task_executor_;
+
   // Used to verify thread-affinity of operations that must occur on the main
   // thread. This is the case for anything that modifies or drives the
   // |sequence_manager_|.
diff --git a/base/test/task_environment_unittest.cc b/base/test/task_environment_unittest.cc
index b82f49db..e6a929e 100644
--- a/base/test/task_environment_unittest.cc
+++ b/base/test/task_environment_unittest.cc
@@ -1188,5 +1188,16 @@
   EXPECT_EQ(TimeTicks::Now(), start_time + kDelay);
 }
 
+TEST_F(TaskEnvironmentTest, CurrentThread) {
+  SingleThreadTaskEnvironment task_environment;
+  RunLoop run_loop;
+
+  PostTask(FROM_HERE, {CurrentThread()}, BindLambdaForTesting([&]() {
+             PostTask(FROM_HERE, {CurrentThread()}, run_loop.QuitClosure());
+           }));
+
+  run_loop.Run();
+}
+
 }  // namespace test
 }  // namespace base
diff --git a/base/threading/thread_unittest.cc b/base/threading/thread_unittest.cc
index ab986326..5f17228 100644
--- a/base/threading/thread_unittest.cc
+++ b/base/threading/thread_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task/post_task.h"
 #include "base/task/sequence_manager/sequence_manager_impl.h"
 #include "base/task/task_executor.h"
 #include "base/test/bind_test_util.h"
@@ -530,8 +531,7 @@
   Thread a("GetTaskExecutorForCurrentThread");
   ASSERT_TRUE(a.Start());
 
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+  base::WaitableEvent event;
 
   a.task_runner()->PostTask(
       FROM_HERE, base::BindLambdaForTesting([&]() {
@@ -543,6 +543,28 @@
   a.Stop();
 }
 
+TEST_F(ThreadTest, CurrentThread) {
+  Thread a("CurrentThread");
+  ASSERT_TRUE(a.Start());
+
+  base::WaitableEvent event;
+
+  a.task_runner()->PostTask(
+      FROM_HERE, base::BindLambdaForTesting([&]() {
+        EXPECT_EQ(a.task_runner(),
+                  base::CreateSingleThreadTaskRunner({base::CurrentThread()}));
+
+        // There's only a single task runner so base::TaskPriority is ignored.
+        EXPECT_EQ(a.task_runner(), base::CreateSingleThreadTaskRunner(
+                                       {base::CurrentThread(),
+                                        base::TaskPriority::BEST_EFFORT}));
+        event.Signal();
+      }));
+
+  event.Wait();
+  a.Stop();
+}
+
 namespace {
 
 class SequenceManagerThreadDelegate : public Thread::Delegate {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index d388999..75c7271 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8900101731286284048
\ No newline at end of file
+8900075814043677168
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index d544d1e..3cb6c2e 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8900103511840373520
\ No newline at end of file
+8900078822768978496
\ No newline at end of file
diff --git a/build_overrides/shaderc.gni b/build_overrides/shaderc.gni
index a67f427..6cce450 100644
--- a/build_overrides/shaderc.gni
+++ b/build_overrides/shaderc.gni
@@ -5,3 +5,6 @@
 shaderc_glslang_dir = "//third_party/glslang/src"
 shaderc_spirv_tools_dir = "//third_party/SPIRV-Tools/src"
 shaderc_spirv_cross_dir = "//third_party/dawn/third_party"
+shaderc_spirv_headers_dir = "//third_party/spirv-headers/src"
+
+shaderc_enable_spvc_parser = false
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 305a667..fe3b9bb 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -110,9 +110,10 @@
     "layers/recording_source.h",
     "layers/render_surface_impl.cc",
     "layers/render_surface_impl.h",
+    "layers/scrollbar_layer_base.cc",
+    "layers/scrollbar_layer_base.h",
     "layers/scrollbar_layer_impl_base.cc",
     "layers/scrollbar_layer_impl_base.h",
-    "layers/scrollbar_layer_interface.h",
     "layers/solid_color_layer.cc",
     "layers/solid_color_layer.h",
     "layers/solid_color_layer_impl.cc",
diff --git a/cc/input/scrollbar_animation_controller_unittest.cc b/cc/input/scrollbar_animation_controller_unittest.cc
index b00998f..d88bbdb 100644
--- a/cc/input/scrollbar_animation_controller_unittest.cc
+++ b/cc/input/scrollbar_animation_controller_unittest.cc
@@ -76,15 +76,12 @@
     const int kTrackStart = 0;
     const int kTrackLength = 100;
     const bool kIsLeftSideVerticalScrollbar = false;
-    const bool kIsOverlayScrollbar = true;
 
     scroll_layer_ = AddLayer<LayerImpl>();
     h_scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>(
-        HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar,
-        kIsOverlayScrollbar);
+        HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar);
     v_scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>(
-        VERTICAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar,
-        kIsOverlayScrollbar);
+        VERTICAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar);
     SetElementIdsForTesting();
 
     clip_layer_ = root_layer();
@@ -1380,13 +1377,12 @@
   void SetUp() override {
     const int kTrackStart = 0;
     const bool kIsLeftSideVerticalScrollbar = false;
-    const bool kIsOverlayScrollbar = true;  // Allow opacity animations.
 
     LayerImpl* root = root_layer();
     scroll_layer_ = AddLayer<LayerImpl>();
     scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>(
         orientation(), kThumbThickness, kTrackStart,
-        kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar);
+        kIsLeftSideVerticalScrollbar);
     SetElementIdsForTesting();
 
     scroll_layer_->SetBounds(gfx::Size(200, 200));
diff --git a/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc b/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc
index 6b8668b2..b851a58 100644
--- a/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc
+++ b/cc/input/single_scrollbar_animation_controller_thinning_unittest.cc
@@ -70,11 +70,9 @@
     const int kTrackStart = 0;
     const int kTrackLength = 100;
     const bool kIsLeftSideVerticalScrollbar = false;
-    const bool kIsOverlayScrollbar = true;
 
     scrollbar_layer_ = AddLayer<SolidColorScrollbarLayerImpl>(
-        HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar,
-        kIsOverlayScrollbar);
+        HORIZONTAL, kThumbThickness, kTrackStart, kIsLeftSideVerticalScrollbar);
 
     scrollbar_layer_->SetBounds(gfx::Size(kThumbThickness, kTrackLength));
     scrollbar_layer_->SetScrollElementId(scroll_layer->element_id());
diff --git a/cc/layers/painted_overlay_scrollbar_layer.cc b/cc/layers/painted_overlay_scrollbar_layer.cc
index 5a9e1605..d46146e 100644
--- a/cc/layers/painted_overlay_scrollbar_layer.cc
+++ b/cc/layers/painted_overlay_scrollbar_layer.cc
@@ -44,31 +44,20 @@
   DCHECK(scrollbar_->HasThumb());
   DCHECK(scrollbar_->IsOverlay());
   DCHECK(scrollbar_->UsesNinePatchThumbResource());
-  SetIsScrollbar(true);
 }
 
 PaintedOverlayScrollbarLayer::~PaintedOverlayScrollbarLayer() = default;
 
-void PaintedOverlayScrollbarLayer::SetScrollElementId(ElementId element_id) {
-  if (element_id == scroll_element_id_)
-    return;
-
-  scroll_element_id_ = element_id;
-  SetNeedsCommit();
-}
-
 bool PaintedOverlayScrollbarLayer::OpacityCanAnimateOnImplThread() const {
   return scrollbar_->IsOverlay();
 }
 
 void PaintedOverlayScrollbarLayer::PushPropertiesTo(LayerImpl* layer) {
-  Layer::PushPropertiesTo(layer);
+  ScrollbarLayerBase::PushPropertiesTo(layer);
 
   PaintedOverlayScrollbarLayerImpl* scrollbar_layer =
       static_cast<PaintedOverlayScrollbarLayerImpl*>(layer);
 
-  scrollbar_layer->SetScrollElementId(scroll_element_id_);
-
   scrollbar_layer->SetThumbThickness(thumb_thickness_);
   scrollbar_layer->SetThumbLength(thumb_length_);
   if (scrollbar_->Orientation() == HORIZONTAL) {
@@ -105,7 +94,7 @@
     track_resource_.reset();
   }
 
-  Layer::SetLayerTreeHost(host);
+  ScrollbarLayerBase::SetLayerTreeHost(host);
 }
 
 gfx::Rect PaintedOverlayScrollbarLayer::OriginThumbRectForPainting() const {
diff --git a/cc/layers/painted_overlay_scrollbar_layer.h b/cc/layers/painted_overlay_scrollbar_layer.h
index 06b4926..4838fb8 100644
--- a/cc/layers/painted_overlay_scrollbar_layer.h
+++ b/cc/layers/painted_overlay_scrollbar_layer.h
@@ -8,15 +8,14 @@
 #include "cc/cc_export.h"
 #include "cc/input/scrollbar.h"
 #include "cc/layers/layer.h"
-#include "cc/layers/scrollbar_layer_interface.h"
+#include "cc/layers/scrollbar_layer_base.h"
 #include "cc/resources/scoped_ui_resource.h"
 
 namespace cc {
 
 // For composited overlay scrollbars with nine-patch thumb. For overlay
 // scrollbars whose thumb is not nine-patch, use PaintedScrollbarLayer.
-class CC_EXPORT PaintedOverlayScrollbarLayer : public ScrollbarLayerInterface,
-                                               public Layer {
+class CC_EXPORT PaintedOverlayScrollbarLayer : public ScrollbarLayerBase {
  public:
   std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
 
@@ -27,11 +26,6 @@
       std::unique_ptr<Scrollbar> scrollbar);
 
   bool OpacityCanAnimateOnImplThread() const override;
-
-  // ScrollbarLayerInterface
-  void SetScrollElementId(ElementId element_id) override;
-
-  // Layer interface
   bool Update() override;
   void SetLayerTreeHost(LayerTreeHost* host) override;
   void PushPropertiesTo(LayerImpl* layer) override;
@@ -56,7 +50,6 @@
   bool PaintTickmarks();
 
   std::unique_ptr<Scrollbar> scrollbar_;
-  ElementId scroll_element_id_;
 
   int thumb_thickness_;
   int thumb_length_;
diff --git a/cc/layers/painted_scrollbar_layer.cc b/cc/layers/painted_scrollbar_layer.cc
index 3f23827..eca1517 100644
--- a/cc/layers/painted_scrollbar_layer.cc
+++ b/cc/layers/painted_scrollbar_layer.cc
@@ -34,31 +34,20 @@
       thumb_length_(scrollbar_->ThumbLength()),
       is_overlay_(scrollbar_->IsOverlay()),
       has_thumb_(scrollbar_->HasThumb()),
-      thumb_opacity_(scrollbar_->ThumbOpacity()) {
-  SetIsScrollbar(true);
-}
+      thumb_opacity_(scrollbar_->ThumbOpacity()) {}
 
 PaintedScrollbarLayer::~PaintedScrollbarLayer() = default;
 
-void PaintedScrollbarLayer::SetScrollElementId(ElementId element_id) {
-  if (element_id == scroll_element_id_)
-    return;
-
-  scroll_element_id_ = element_id;
-  SetNeedsCommit();
-}
-
 bool PaintedScrollbarLayer::OpacityCanAnimateOnImplThread() const {
   return scrollbar_->IsOverlay();
 }
 
 void PaintedScrollbarLayer::PushPropertiesTo(LayerImpl* layer) {
-  Layer::PushPropertiesTo(layer);
+  ScrollbarLayerBase::PushPropertiesTo(layer);
 
   PaintedScrollbarLayerImpl* scrollbar_layer =
       static_cast<PaintedScrollbarLayerImpl*>(layer);
 
-  scrollbar_layer->SetScrollElementId(scroll_element_id_);
   scrollbar_layer->set_internal_contents_scale_and_bounds(
       internal_contents_scale_, internal_content_bounds_);
 
@@ -97,7 +86,7 @@
     thumb_resource_ = nullptr;
   }
 
-  Layer::SetLayerTreeHost(host);
+  ScrollbarLayerBase::SetLayerTreeHost(host);
 }
 
 gfx::Rect PaintedScrollbarLayer::ScrollbarLayerRectToContentRect(
@@ -165,7 +154,7 @@
 bool PaintedScrollbarLayer::Update() {
   {
     auto ignore_set_needs_commit = IgnoreSetNeedsCommit();
-    Layer::Update();
+    ScrollbarLayerBase::Update();
     UpdateInternalContentScale();
   }
 
diff --git a/cc/layers/painted_scrollbar_layer.h b/cc/layers/painted_scrollbar_layer.h
index c9ea59ba..444c042 100644
--- a/cc/layers/painted_scrollbar_layer.h
+++ b/cc/layers/painted_scrollbar_layer.h
@@ -8,13 +8,12 @@
 #include "cc/cc_export.h"
 #include "cc/input/scrollbar.h"
 #include "cc/layers/layer.h"
-#include "cc/layers/scrollbar_layer_interface.h"
+#include "cc/layers/scrollbar_layer_base.h"
 #include "cc/resources/scoped_ui_resource.h"
 
 namespace cc {
 
-class CC_EXPORT PaintedScrollbarLayer : public ScrollbarLayerInterface,
-                                        public Layer {
+class CC_EXPORT PaintedScrollbarLayer : public ScrollbarLayerBase {
  public:
   std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
 
@@ -25,11 +24,6 @@
   PaintedScrollbarLayer& operator=(const PaintedScrollbarLayer&) = delete;
 
   bool OpacityCanAnimateOnImplThread() const override;
-
-  // ScrollbarLayerInterface
-  void SetScrollElementId(ElementId element_id) override;
-
-  // Layer interface
   bool Update() override;
   void SetLayerTreeHost(LayerTreeHost* host) override;
   void PushPropertiesTo(LayerImpl* layer) override;
diff --git a/cc/layers/scrollbar_layer_base.cc b/cc/layers/scrollbar_layer_base.cc
new file mode 100644
index 0000000..14c743b
--- /dev/null
+++ b/cc/layers/scrollbar_layer_base.cc
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/layers/scrollbar_layer_base.h"
+
+#include "cc/layers/scrollbar_layer_impl_base.h"
+
+namespace cc {
+
+ScrollbarLayerBase::ScrollbarLayerBase() {
+  SetIsScrollbar(true);
+}
+
+ScrollbarLayerBase::~ScrollbarLayerBase() = default;
+
+void ScrollbarLayerBase::SetScrollElementId(ElementId element_id) {
+  if (element_id == scroll_element_id_)
+    return;
+
+  scroll_element_id_ = element_id;
+  SetNeedsCommit();
+}
+
+void ScrollbarLayerBase::PushPropertiesTo(LayerImpl* layer) {
+  Layer::PushPropertiesTo(layer);
+  static_cast<ScrollbarLayerImplBase*>(layer)->SetScrollElementId(
+      scroll_element_id_);
+}
+
+}  // namespace cc
diff --git a/cc/layers/scrollbar_layer_base.h b/cc/layers/scrollbar_layer_base.h
new file mode 100644
index 0000000..00c5dfa
--- /dev/null
+++ b/cc/layers/scrollbar_layer_base.h
@@ -0,0 +1,29 @@
+// 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 CC_LAYERS_SCROLLBAR_LAYER_BASE_H_
+#define CC_LAYERS_SCROLLBAR_LAYER_BASE_H_
+
+#include "cc/cc_export.h"
+#include "cc/layers/layer.h"
+
+namespace cc {
+
+class CC_EXPORT ScrollbarLayerBase : public Layer {
+ public:
+  void SetScrollElementId(ElementId element_id);
+
+  void PushPropertiesTo(LayerImpl* layer) override;
+
+ protected:
+  ScrollbarLayerBase();
+  ~ScrollbarLayerBase() override;
+
+ private:
+  ElementId scroll_element_id_;
+};
+
+}  // namespace cc
+
+#endif  // CC_LAYERS_SCROLLBAR_LAYER_BASE_H_
diff --git a/cc/layers/scrollbar_layer_interface.h b/cc/layers/scrollbar_layer_interface.h
deleted file mode 100644
index 661028e4..0000000
--- a/cc/layers/scrollbar_layer_interface.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 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 CC_LAYERS_SCROLLBAR_LAYER_INTERFACE_H_
-#define CC_LAYERS_SCROLLBAR_LAYER_INTERFACE_H_
-
-#include "cc/cc_export.h"
-#include "cc/input/scrollbar.h"
-
-namespace cc {
-
-class CC_EXPORT ScrollbarLayerInterface {
- public:
-  ScrollbarLayerInterface(const ScrollbarLayerInterface&) = delete;
-  ScrollbarLayerInterface& operator=(const ScrollbarLayerInterface&) = delete;
-
-  virtual void SetScrollElementId(ElementId element_id) = 0;
-
- protected:
-  ScrollbarLayerInterface() {}
-  virtual ~ScrollbarLayerInterface() {}
-};
-
-}  // namespace cc
-
-#endif  // CC_LAYERS_SCROLLBAR_LAYER_INTERFACE_H_
diff --git a/cc/layers/scrollbar_layer_unittest.cc b/cc/layers/scrollbar_layer_unittest.cc
index b9a03eb..98a5011c 100644
--- a/cc/layers/scrollbar_layer_unittest.cc
+++ b/cc/layers/scrollbar_layer_unittest.cc
@@ -13,7 +13,7 @@
 #include "cc/layers/painted_overlay_scrollbar_layer.h"
 #include "cc/layers/painted_scrollbar_layer.h"
 #include "cc/layers/painted_scrollbar_layer_impl.h"
-#include "cc/layers/scrollbar_layer_interface.h"
+#include "cc/layers/scrollbar_layer_base.h"
 #include "cc/layers/solid_color_scrollbar_layer.h"
 #include "cc/layers/solid_color_scrollbar_layer_impl.h"
 #include "cc/resources/ui_resource_manager.h"
@@ -144,19 +144,16 @@
       int track_start) {
     scoped_refptr<Layer> layer_tree_root = Layer::Create();
     scoped_refptr<Layer> child1 = Layer::Create();
-    scoped_refptr<Layer> child2;
+    scoped_refptr<ScrollbarLayerBase> child2;
     if (use_solid_color_scrollbar) {
       const bool kIsLeftSideVerticalScrollbar = false;
       child2 = SolidColorScrollbarLayer::Create(scrollbar->Orientation(),
                                                 thumb_thickness, track_start,
                                                 kIsLeftSideVerticalScrollbar);
-      static_cast<SolidColorScrollbarLayer*>(child2.get())
-          ->SetScrollElementId(child1->element_id());
     } else {
       child2 = PaintedScrollbarLayer::Create(std::move(scrollbar));
-      static_cast<PaintedScrollbarLayer*>(child2.get())
-          ->SetScrollElementId(child1->element_id());
     }
+    child2->SetScrollElementId(child1->element_id());
     layer_tree_root->AddChild(child1);
     layer_tree_root->InsertChild(child2, reverse_order ? 0 : 1);
     scrollbar_layer_id_ = reverse_order ? child1->id() : child2->id();
@@ -822,12 +819,11 @@
   const int kTrackStart = 0;
   const int kThumbThickness = 10;
   const bool kIsLeftSideVerticalScrollbar = false;
-  const bool kIsOverlayScrollbar = false;
 
   SolidColorScrollbarLayerImpl* scrollbar_layer =
-      impl.AddLayer<SolidColorScrollbarLayerImpl>(
-          HORIZONTAL, kThumbThickness, kTrackStart,
-          kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar);
+      impl.AddLayer<SolidColorScrollbarLayerImpl>(HORIZONTAL, kThumbThickness,
+                                                  kTrackStart,
+                                                  kIsLeftSideVerticalScrollbar);
 
   scrollbar_layer->SetScrollElementId(scroll_layer->element_id());
   scroll_layer->SetScrollable(gfx::Size(980, 980));
@@ -863,11 +859,10 @@
   const int kTrackStart = 0;
   const int kThumbThickness = 10;
   const bool kIsLeftSideVerticalScrollbar = false;
-  const bool kIsOverlayScrollbar = false;
   SolidColorScrollbarLayerImpl* scrollbar_layer =
-      impl.AddLayer<SolidColorScrollbarLayerImpl>(
-          HORIZONTAL, kThumbThickness, kTrackStart,
-          kIsLeftSideVerticalScrollbar, kIsOverlayScrollbar);
+      impl.AddLayer<SolidColorScrollbarLayerImpl>(HORIZONTAL, kThumbThickness,
+                                                  kTrackStart,
+                                                  kIsLeftSideVerticalScrollbar);
   scrollbar_layer->SetScrollElementId(scroll_layer->element_id());
   EXPECT_TRUE(impl.host_impl()->active_tree()->ScrollbarGeometriesNeedUpdate());
   impl.host_impl()->active_tree()->UpdateScrollbarGeometries();
@@ -951,24 +946,13 @@
     const int kThumbThickness = 3;
     const int kTrackStart = 0;
     const bool kIsLeftSideVerticalScrollbar = false;
-    const bool kIsOverlayScrollbar = false;
 
-    horizontal_scrollbar_layer_ =
-        SolidColorScrollbarLayerImpl::Create(host_impl_->active_tree(),
-                                             1,
-                                             HORIZONTAL,
-                                             kThumbThickness,
-                                             kTrackStart,
-                                             kIsLeftSideVerticalScrollbar,
-                                             kIsOverlayScrollbar);
-    vertical_scrollbar_layer_ =
-        SolidColorScrollbarLayerImpl::Create(host_impl_->active_tree(),
-                                             2,
-                                             VERTICAL,
-                                             kThumbThickness,
-                                             kTrackStart,
-                                             kIsLeftSideVerticalScrollbar,
-                                             kIsOverlayScrollbar);
+    horizontal_scrollbar_layer_ = SolidColorScrollbarLayerImpl::Create(
+        host_impl_->active_tree(), 1, HORIZONTAL, kThumbThickness, kTrackStart,
+        kIsLeftSideVerticalScrollbar);
+    vertical_scrollbar_layer_ = SolidColorScrollbarLayerImpl::Create(
+        host_impl_->active_tree(), 2, VERTICAL, kThumbThickness, kTrackStart,
+        kIsLeftSideVerticalScrollbar);
   }
 
  protected:
@@ -1054,7 +1038,7 @@
     std::unique_ptr<Scrollbar> scrollbar(new FakeScrollbar(false, true, false));
     scoped_refptr<Layer> layer_tree_root = Layer::Create();
     scoped_refptr<Layer> content_layer = Layer::Create();
-    scoped_refptr<Layer> scrollbar_layer;
+    scoped_refptr<ScrollbarLayerBase> scrollbar_layer;
     if (use_solid_color_scrollbar) {
       const int kThumbThickness = 3;
       const int kTrackStart = 0;
@@ -1062,13 +1046,10 @@
       scrollbar_layer = SolidColorScrollbarLayer::Create(
           scrollbar->Orientation(), kThumbThickness, kTrackStart,
           kIsLeftSideVerticalScrollbar);
-      static_cast<SolidColorScrollbarLayer*>(scrollbar_layer.get())
-          ->SetScrollElementId(layer_tree_root->element_id());
     } else {
       scrollbar_layer = PaintedScrollbarLayer::Create(std::move(scrollbar));
-      static_cast<PaintedScrollbarLayer*>(scrollbar_layer.get())
-          ->SetScrollElementId(layer_tree_root->element_id());
     }
+    scrollbar_layer->SetScrollElementId(layer_tree_root->element_id());
     layer_tree_root->AddChild(content_layer);
     layer_tree_root->AddChild(scrollbar_layer);
 
diff --git a/cc/layers/solid_color_scrollbar_layer.cc b/cc/layers/solid_color_scrollbar_layer.cc
index edf26390..92e321f 100644
--- a/cc/layers/solid_color_scrollbar_layer.cc
+++ b/cc/layers/solid_color_scrollbar_layer.cc
@@ -13,10 +13,9 @@
 
 std::unique_ptr<LayerImpl> SolidColorScrollbarLayer::CreateLayerImpl(
     LayerTreeImpl* tree_impl) {
-  const bool kIsOverlayScrollbar = true;
-  return SolidColorScrollbarLayerImpl::Create(
-      tree_impl, id(), orientation_, thumb_thickness_, track_start_,
-      is_left_side_vertical_scrollbar_, kIsOverlayScrollbar);
+  return SolidColorScrollbarLayerImpl::Create(tree_impl, id(), orientation_,
+                                              thumb_thickness_, track_start_,
+                                              is_left_side_vertical_scrollbar_);
 }
 
 scoped_refptr<SolidColorScrollbarLayer> SolidColorScrollbarLayer::Create(
@@ -39,7 +38,6 @@
       track_start_(track_start),
       is_left_side_vertical_scrollbar_(is_left_side_vertical_scrollbar) {
   Layer::SetOpacity(0.f);
-  SetIsScrollbar(true);
 }
 
 SolidColorScrollbarLayer::~SolidColorScrollbarLayer() = default;
@@ -50,16 +48,6 @@
   Layer::SetOpacity(opacity);
 }
 
-void SolidColorScrollbarLayer::PushPropertiesTo(LayerImpl* layer) {
-  Layer::PushPropertiesTo(layer);
-  SolidColorScrollbarLayerImpl* scrollbar_layer =
-      static_cast<SolidColorScrollbarLayerImpl*>(layer);
-
-  DCHECK(!scrollbar_layer->HitTestable());
-
-  scrollbar_layer->SetScrollElementId(scroll_element_id_);
-}
-
 void SolidColorScrollbarLayer::SetNeedsDisplayRect(const gfx::Rect& rect) {
   // Never needs repaint.
 }
@@ -68,14 +56,6 @@
   return true;
 }
 
-void SolidColorScrollbarLayer::SetScrollElementId(ElementId element_id) {
-  if (element_id == scroll_element_id_)
-    return;
-
-  scroll_element_id_ = element_id;
-  SetNeedsCommit();
-}
-
 bool SolidColorScrollbarLayer::HitTestable() const {
   // Android scrollbars can't be interacted with by user input. They should
   // avoid hit testing so we don't enter any scrollbar scrolling code paths.
diff --git a/cc/layers/solid_color_scrollbar_layer.h b/cc/layers/solid_color_scrollbar_layer.h
index c759ae5..8aed2f50 100644
--- a/cc/layers/solid_color_scrollbar_layer.h
+++ b/cc/layers/solid_color_scrollbar_layer.h
@@ -7,12 +7,11 @@
 
 #include "cc/cc_export.h"
 #include "cc/layers/layer.h"
-#include "cc/layers/scrollbar_layer_interface.h"
+#include "cc/layers/scrollbar_layer_base.h"
 
 namespace cc {
 
-class CC_EXPORT SolidColorScrollbarLayer : public ScrollbarLayerInterface,
-                                           public Layer {
+class CC_EXPORT SolidColorScrollbarLayer : public ScrollbarLayerBase {
  public:
   std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
 
@@ -27,17 +26,10 @@
 
   // Layer overrides.
   bool OpacityCanAnimateOnImplThread() const override;
-
   void SetOpacity(float opacity) override;
-  void PushPropertiesTo(LayerImpl* layer) override;
-
   void SetNeedsDisplayRect(const gfx::Rect& rect) override;
-
   bool HitTestable() const override;
 
-  // ScrollbarLayerInterface
-  void SetScrollElementId(ElementId element_id) override;
-
  protected:
   SolidColorScrollbarLayer(ScrollbarOrientation orientation,
                            int thumb_thickness,
@@ -45,7 +37,6 @@
                            bool is_left_side_vertical_scrollbar);
   ~SolidColorScrollbarLayer() override;
 
-  ElementId scroll_element_id_;
   ScrollbarOrientation orientation_;
   int thumb_thickness_;
   int track_start_;
diff --git a/cc/layers/solid_color_scrollbar_layer_impl.cc b/cc/layers/solid_color_scrollbar_layer_impl.cc
index b96e4bc3..e37741c 100644
--- a/cc/layers/solid_color_scrollbar_layer_impl.cc
+++ b/cc/layers/solid_color_scrollbar_layer_impl.cc
@@ -18,24 +18,19 @@
                                      ScrollbarOrientation orientation,
                                      int thumb_thickness,
                                      int track_start,
-                                     bool is_left_side_vertical_scrollbar,
-                                     bool is_overlay) {
+                                     bool is_left_side_vertical_scrollbar) {
   return base::WrapUnique(new SolidColorScrollbarLayerImpl(
       tree_impl, id, orientation, thumb_thickness, track_start,
-      is_left_side_vertical_scrollbar, is_overlay));
+      is_left_side_vertical_scrollbar));
 }
 
 SolidColorScrollbarLayerImpl::~SolidColorScrollbarLayerImpl() = default;
 
 std::unique_ptr<LayerImpl> SolidColorScrollbarLayerImpl::CreateLayerImpl(
     LayerTreeImpl* tree_impl) {
-  return SolidColorScrollbarLayerImpl::Create(tree_impl,
-                                              id(),
-                                              orientation(),
-                                              thumb_thickness_,
-                                              track_start_,
-                                              is_left_side_vertical_scrollbar(),
-                                              is_overlay_scrollbar());
+  return SolidColorScrollbarLayerImpl::Create(
+      tree_impl, id(), orientation(), thumb_thickness_, track_start_,
+      is_left_side_vertical_scrollbar());
 }
 
 SolidColorScrollbarLayerImpl::SolidColorScrollbarLayerImpl(
@@ -44,17 +39,15 @@
     ScrollbarOrientation orientation,
     int thumb_thickness,
     int track_start,
-    bool is_left_side_vertical_scrollbar,
-    bool is_overlay)
+    bool is_left_side_vertical_scrollbar)
     : ScrollbarLayerImplBase(tree_impl,
                              id,
                              orientation,
                              is_left_side_vertical_scrollbar,
-                             is_overlay),
+                             /*is_overlay*/ true),
       thumb_thickness_(thumb_thickness),
       track_start_(track_start),
-      color_(tree_impl->settings().solid_color_scrollbar_color) {
-}
+      color_(tree_impl->settings().solid_color_scrollbar_color) {}
 
 void SolidColorScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) {
   ScrollbarLayerImplBase::PushPropertiesTo(layer);
diff --git a/cc/layers/solid_color_scrollbar_layer_impl.h b/cc/layers/solid_color_scrollbar_layer_impl.h
index 710b4d6..7a3a72d 100644
--- a/cc/layers/solid_color_scrollbar_layer_impl.h
+++ b/cc/layers/solid_color_scrollbar_layer_impl.h
@@ -18,8 +18,7 @@
       ScrollbarOrientation orientation,
       int thumb_thickness,
       int track_start,
-      bool is_left_side_vertical_scrollbar,
-      bool is_overlay);
+      bool is_left_side_vertical_scrollbar);
   ~SolidColorScrollbarLayerImpl() override;
 
   // LayerImpl overrides.
@@ -37,8 +36,7 @@
                                ScrollbarOrientation orientation,
                                int thumb_thickness,
                                int track_start,
-                               bool is_left_side_vertical_scrollbar,
-                               bool is_overlay);
+                               bool is_left_side_vertical_scrollbar);
 
   // ScrollbarLayerImplBase implementation.
   int ThumbLength() const override;
diff --git a/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc b/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc
index 5f1b460..8544ce17 100644
--- a/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc
+++ b/cc/layers/solid_color_scrollbar_layer_impl_unittest.cc
@@ -22,12 +22,11 @@
   int thumb_thickness = layer_size.width();
   int track_start = 0;
   bool is_left_side_vertical_scrollbar = false;
-  bool is_overlay = false;
 
   SolidColorScrollbarLayerImpl* scrollbar_layer_impl =
       impl.AddLayer<SolidColorScrollbarLayerImpl>(
           orientation, thumb_thickness, track_start,
-          is_left_side_vertical_scrollbar, is_overlay);
+          is_left_side_vertical_scrollbar);
   scrollbar_layer_impl->SetBounds(layer_size);
   scrollbar_layer_impl->SetDrawsContent(true);
   scrollbar_layer_impl->SetCurrentPos(25.f);
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index c81c31a..986eca85 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -3498,7 +3498,7 @@
     host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 4.f);
 
     auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-        host_impl_->active_tree(), VERTICAL, 10, 0, false, true);
+        host_impl_->active_tree(), VERTICAL, 10, 0, false);
     SetupScrollbarLayer(OuterViewportScrollLayer(), scrollbar);
 
     host_impl_->active_tree()->DidBecomeActive();
@@ -3712,7 +3712,7 @@
     LayerImpl* scroll =
         host_impl_->pending_tree()->OuterViewportScrollLayerForTesting();
     auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-        host_impl_->pending_tree(), VERTICAL, 10, 0, false, true);
+        host_impl_->pending_tree(), VERTICAL, 10, 0, false);
     SetupScrollbarLayer(scroll, scrollbar);
     scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(90, 0));
 
@@ -3807,7 +3807,7 @@
 
     // scrollbar_1 on root scroll.
     scrollbar_1_ = AddLayer<SolidColorScrollbarLayerImpl>(
-        host_impl_->active_tree(), VERTICAL, 15, 0, true, true);
+        host_impl_->active_tree(), VERTICAL, 15, 0, true);
     SetupScrollbarLayer(root_scroll, scrollbar_1_);
     scrollbar_1_->SetBounds(scrollbar_size_1);
     TouchActionRegion touch_action_region;
@@ -3820,7 +3820,7 @@
     GetTransformNode(child)->post_translation = gfx::Vector2dF(50, 50);
 
     scrollbar_2_ = AddLayer<SolidColorScrollbarLayerImpl>(
-        host_impl_->active_tree(), VERTICAL, 15, 0, true, true);
+        host_impl_->active_tree(), VERTICAL, 15, 0, true);
     SetupScrollbarLayer(child, scrollbar_2_);
     scrollbar_2_->SetBounds(scrollbar_size_2);
 
@@ -3998,7 +3998,7 @@
   LayerImpl* scroll =
       host_impl_->pending_tree()->OuterViewportScrollLayerForTesting();
   auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->pending_tree(), VERTICAL, 10, 0, false, true);
+      host_impl_->pending_tree(), VERTICAL, 10, 0, false);
   SetupScrollbarLayer(scroll, scrollbar);
   scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(90, 0));
 
@@ -4089,19 +4089,19 @@
   auto* container = InnerViewportScrollLayer();
   auto* root_scroll = OuterViewportScrollLayer();
   auto* vert_1_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), VERTICAL, 5, 5, true, true);
+      host_impl_->active_tree(), VERTICAL, 5, 5, true);
   CopyProperties(container, vert_1_scrollbar);
 
   auto* horiz_1_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), HORIZONTAL, 5, 5, true, true);
+      host_impl_->active_tree(), HORIZONTAL, 5, 5, true);
   CopyProperties(container, horiz_1_scrollbar);
 
   auto* vert_2_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), VERTICAL, 5, 5, true, true);
+      host_impl_->active_tree(), VERTICAL, 5, 5, true);
   CopyProperties(container, vert_2_scrollbar);
 
   auto* horiz_2_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), HORIZONTAL, 5, 5, true, true);
+      host_impl_->active_tree(), HORIZONTAL, 5, 5, true);
   CopyProperties(container, horiz_2_scrollbar);
 
   UpdateDrawProperties(host_impl_->active_tree());
@@ -4177,7 +4177,7 @@
   auto* root_scroll = OuterViewportScrollLayer();
 
   auto* vert_scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), VERTICAL, 5, 0, false, true);
+      host_impl_->active_tree(), VERTICAL, 5, 0, false);
   SetupScrollbarLayer(root_scroll, vert_scrollbar);
   vert_scrollbar->SetBounds(gfx::Size(10, 200));
   vert_scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(300, 0));
@@ -4238,7 +4238,7 @@
   LayerImpl* root_scroll = OuterViewportScrollLayer();
   // The scrollbar is on the left side.
   auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), VERTICAL, 15, 0, true, true);
+      host_impl_->active_tree(), VERTICAL, 15, 0, true);
   SetupScrollbarLayer(root_scroll, scrollbar);
   scrollbar->SetBounds(scrollbar_size);
   TouchActionRegion touch_action_region;
@@ -5170,7 +5170,7 @@
   // Create a horizontal scrollbar.
   gfx::Size scrollbar_size(gfx::Size(50, 15));
   auto* scrollbar_layer = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), HORIZONTAL, 3, 20, false, true);
+      host_impl_->active_tree(), HORIZONTAL, 3, 20, false);
   SetupScrollbarLayer(OuterViewportScrollLayer(), scrollbar_layer);
   scrollbar_layer->SetBounds(scrollbar_size);
   TouchActionRegion touch_action_region;
@@ -12207,7 +12207,7 @@
 
   // scrollbar_1 on root scroll.
   auto* scrollbar_1 = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), VERTICAL, 15, 0, true, true);
+      host_impl_->active_tree(), VERTICAL, 15, 0, true);
   SetupScrollbarLayer(root_scroll, scrollbar_1);
   scrollbar_1->SetBounds(scrollbar_size_1);
   TouchActionRegion touch_action_region;
@@ -12292,7 +12292,7 @@
 
   // scrollbar_2 on child.
   auto* scrollbar_2 = AddLayer<SolidColorScrollbarLayerImpl>(
-      host_impl_->active_tree(), VERTICAL, 15, 0, true, true);
+      host_impl_->active_tree(), VERTICAL, 15, 0, true);
   LayerImpl* child =
       AddScrollableLayer(root_scroll, gfx::Size(100, 100), child_layer_size);
   child->SetOffsetToTransformParent(gfx::Vector2dF(50, 50));
@@ -13366,7 +13366,7 @@
       AddScrollableLayer(root, viewport_size, scroll_content_size);
 
   auto* scrollbar = AddLayer<SolidColorScrollbarLayerImpl>(
-      layer_tree_impl, VERTICAL, 10, 0, false, true);
+      layer_tree_impl, VERTICAL, 10, 0, false);
   SetupScrollbarLayer(content, scrollbar);
   scrollbar->SetBounds(scrollbar_size);
   scrollbar->SetOffsetToTransformParent(gfx::Vector2dF(345, 0));
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
index 02646e5..c4573d4 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantOverlayUiTest.java
@@ -53,7 +53,7 @@
 
     // TODO(crbug.com/806868): Create a more specific test site for overlay testing.
     private static final String TEST_PAGE =
-            "/components/test/data/autofill_assistant/autofill_assistant_target_website.html";
+            "/components/test/data/autofill_assistant/html/autofill_assistant_target_website.html";
 
     @Before
     public void setUp() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
index c63ea9e..ddc54f8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -10,7 +10,6 @@
 import android.graphics.RectF;
 
 import org.chromium.base.ActivityState;
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
@@ -23,7 +22,6 @@
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
 import org.chromium.chrome.browser.compositor.scene_layer.ContextualSearchSceneLayer;
 import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer;
-import org.chromium.chrome.browser.contextualsearch.ContextualSearchFieldTrial;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate;
 import org.chromium.chrome.browser.contextualsearch.ResolvedSearchTerm.CardTag;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -36,8 +34,6 @@
  * Controls the Contextual Search Panel.
  */
 public class ContextualSearchPanel extends OverlayPanel {
-    /** The number of times to allow scrolling.  After this limit we'll close. */
-    private static final int SCROLL_COUNT_LIMIT = 3;
 
     /** Restricts the maximized panel height to the given fraction of a tab. */
     private static final float MAXIMIZED_HEIGHT_FRACTION = 0.95f;
@@ -45,9 +41,6 @@
     /** Used for logging state changes. */
     private final ContextualSearchPanelMetrics mPanelMetrics;
 
-    /** The height of the bar shadow, in pixels. */
-    private final float mBarShadowHeightPx;
-
     /** The distance of the divider from the end of the bar, in dp. */
     private final float mEndButtonWidthDp;
 
@@ -75,9 +68,6 @@
      */
     private ScrimParams mScrimParams;
 
-    /** Number of times the panel has been scrolled already. */
-    private int mScrollCount;
-
     // ============================================================================================
     // Constructor
     // ============================================================================================
@@ -93,10 +83,6 @@
         mSceneLayer = createNewContextualSearchSceneLayer();
         mPanelMetrics = new ContextualSearchPanelMetrics();
 
-        mBarShadowHeightPx =
-                ApiCompatibilityUtils
-                        .getDrawable(mContext.getResources(), R.drawable.modern_toolbar_shadow)
-                        .getIntrinsicHeight();
         mEndButtonWidthDp = mContext.getResources().getDimensionPixelSize(
                                     R.dimen.contextual_search_padded_button_width)
                 * mPxToDp;
@@ -236,7 +222,6 @@
         setProgressBarCompletion(0);
         setProgressBarVisible(false);
         getImageControl().hideCustomImage(false);
-        mScrollCount = 0;
 
         super.onClosed(reason);
 
@@ -465,28 +450,6 @@
     }
 
     /**
-     * Makes the panel not visible by either hiding it or closing it completely.
-     * Decides which method is most appropriate, and then makes it not visible based on that
-     * decision.
-     * @param reason The reason we want the panel to not be visible.
-     */
-    public void makePanelNotVisible(@StateChangeReason int reason) {
-        if (++mScrollCount >= SCROLL_COUNT_LIMIT) {
-            closePanel(StateChangeReason.BASE_PAGE_SCROLL, true);
-        } else if (isHideDuringScrollEnabled()) {
-            hidePanel(reason);
-        }
-    }
-
-    /** @return whether hiding during scrolling is enabled for the Longpress-Resolve feature. */
-    private boolean isHideDuringScrollEnabled() {
-        return ContextualSearchFieldTrial.LONGPRESS_RESOLVE_HIDE_ON_SCROLL.equals(
-                ChromeFeatureList.getFieldTrialParamByFeature(
-                        ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE,
-                        ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PARAM_NAME));
-    }
-
-    /**
      * Called after the panel has navigated to prefetched Search Results.
      * If the user has the panel open then they will see the prefetched result starting to load.
      * Currently this just logs the time between the start of the search until the results start to
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java
index 5e4b951..8cef9a45 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java
@@ -282,6 +282,7 @@
      * Specifies that this resolve must return a non-expanding result.
      */
     void setRestrictedResolve() {
+        // TODO(donnd): Improve by sending full context plus a boolean.
         mSurroundingText = mInitialSelectedWord;
         mSelectionStartOffset = 0;
         mSelectionEndOffset = mSurroundingText.length();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
index 33dd7e8a..44061ca0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
@@ -26,8 +26,6 @@
     // Public settings synchronized with src/components/contextual_search/core/browser/public.cc
     //==========================================================================================
     public static final String LONGPRESS_RESOLVE_PARAM_NAME = "longpress_resolve_variation";
-    public static final String LONGPRESS_RESOLVE_HIDE_ON_SCROLL = "1";
-    public static final String LONGPRESS_RESOLVE_PRIVACY_AGGRESSIVE = "2";
     public static final String LONGPRESS_RESOLVE_PRESERVE_TAP = "3";
 
     //==========================================================================================
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
index 439b00a8..f60adde 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -23,7 +23,6 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayContentDelegate;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.PanelState;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
@@ -1351,12 +1350,7 @@
     public void handleScrollStart() {
         if (mIsAccessibilityModeEnabled) return;
 
-        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE)
-                || mSelectionController.getSelectionType() == SelectionType.TAP) {
-            hideContextualSearch(StateChangeReason.BASE_PAGE_SCROLL);
-        } else if (mSelectionController.getSelectionType() == SelectionType.RESOLVING_LONG_PRESS) {
-            mSearchPanel.makePanelNotVisible(StateChangeReason.BASE_PAGE_SCROLL);
-        }
+        hideContextualSearch(StateChangeReason.BASE_PAGE_SCROLL);
     }
 
     @Override
@@ -1681,11 +1675,8 @@
 
                 String selection = mSelectionController.getSelectedText();
                 assert !TextUtils.isEmpty(selection);
-                boolean isRestrictedResolve =
-                        mPolicy.isPrivacyAggressiveResolveEnabled() && mPolicy.isPromoAvailable()
-                        || mSelectionController.isAdjustedSelection();
                 mNetworkCommunicator.startSearchTermResolutionRequest(
-                        selection, isRestrictedResolve);
+                        selection, mSelectionController.isAdjustedSelection());
                 // If the we were unable to start the resolve, we've hidden the UI and set the
                 // context to null.
                 if (mContext == null || mSearchPanel == null) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
index 6cbf30a..046a1774 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -147,11 +147,6 @@
             return false;
         }
 
-        if (isPrivacyAggressiveResolveEnabled()
-                && mSelectionController.getSelectionType() == SelectionType.RESOLVING_LONG_PRESS) {
-            return true;
-        }
-
         return isPromoAvailable() ? isBasePageHTTP(mNetworkCommunicator.getBasePageUrl()) : true;
     }
 
@@ -255,29 +250,10 @@
      *         is no existing request.
      */
     boolean shouldCreateVerbatimRequest() {
-        if (isPrivacyAggressiveResolveEnabled()) return false;
-
         @SelectionType
         int selectionType = mSelectionController.getSelectionType();
         return (mSelectionController.getSelectedText() != null
-                && (selectionType == SelectionType.LONG_PRESS
-                        || (selectionType == SelectionType.TAP
-                                && !shouldPreviousGestureResolve())));
-    }
-
-    /**
-     * Returns whether doing a privacy aggressive resolve is enabled (as opposed to privacy
-     * conservative).  When this is enabled, the selection is sent to the server immediately instead
-     * of waiting for the panel to be opened.  This allows the server to resolve the selection which
-     * will recognize entities, etc. and display those attributes in the Bar.
-     * @return Whether the privacy-aggressive behavior of immediately sending the selection to the
-     *         server is enabled.
-     */
-    boolean isPrivacyAggressiveResolveEnabled() {
-        return ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PRIVACY_AGGRESSIVE.equals(
-                ChromeFeatureList.getFieldTrialParamByFeature(
-                        ChromeFeatureList.CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE,
-                        ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PARAM_NAME));
+                && (selectionType == SelectionType.LONG_PRESS || !shouldPreviousGestureResolve()));
     }
 
     /** @return whether Tap is disabled due to the longpress experiment. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
index e7d75af..07013a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
@@ -72,7 +72,6 @@
     private boolean mWasTapGestureDetected;
     // Reflects whether the last tap was valid and whether we still have a tap-based selection.
     private ContextualSearchTapState mLastTapState;
-    private boolean mShouldHandleSelectionModification;
     // Whether the selection was automatically expanded due to an adjustment (e.g. Resolve).
     private boolean mDidExpandSelection;
 
@@ -100,9 +99,9 @@
     private boolean mClearingSelection;
 
     /**
-     * Whether the current selection has been adjusted or not.  If it has been adjusted we must
-     * request a resolve for this exact term rather than anything that overlaps as we get with
-     * normal expanding resolves.
+     * Whether the current selection has been adjusted or not.  If the user has adjusted the
+     * selection we must request a resolve for this exact term rather than anything that overlaps,
+     * and not expand the selection (since it was explicitly set by the user).
      */
     private boolean mIsAdjustedSelection;
 
@@ -173,14 +172,6 @@
      * @param reason The reason for ending the Contextual Search.
      */
     void onSearchEnded(@OverlayPanel.StateChangeReason int reason) {
-        // If the user explicitly closes the panel after establishing a selection with long press,
-        // it should not reappear until a new selection is made. This prevents the panel from
-        // reappearing when a long press selection is modified after the user has taken action to
-        // get rid of the panel. See crbug.com/489461.
-        if (shouldPreventHandlingCurrentSelectionModification(reason)) {
-            preventHandlingCurrentSelectionModification();
-        }
-
         // Long press selections should remain visible after ending a Contextual Search.
         if (mSelectionType == SelectionType.TAP) clearSelection();
     }
@@ -334,7 +325,7 @@
                 resetAllStates();
                 break;
             case SelectionEventType.SELECTION_HANDLE_DRAG_STOPPED:
-                shouldHandleSelection = mShouldHandleSelectionModification;
+                shouldHandleSelection = true;
                 mIsAdjustedSelection = true;
                 break;
             default:
@@ -356,7 +347,6 @@
      * @param type The type of selection made by the user.
      */
     private void handleSelection(String selection, @SelectionType int type) {
-        mShouldHandleSelectionModification = true;
         boolean isValidSelection = validateSelectionSuppression(selection);
         mHandler.handleSelection(selection, isValidSelection, type, mX, mY);
     }
@@ -520,37 +510,6 @@
     }
 
     // ============================================================================================
-    // Selection Modification
-    // ============================================================================================
-
-    /**
-     * This method checks whether the selection modification should be handled. This method
-     * is needed to allow modifying selections that are occluded by the Panel.
-     * See crbug.com/489461.
-     *
-     * @param reason The reason the panel is closing.
-     * @return Whether the selection modification should be handled.
-     */
-    private boolean shouldPreventHandlingCurrentSelectionModification(
-            @OverlayPanel.StateChangeReason int reason) {
-        return getSelectionType() == SelectionType.LONG_PRESS
-                && (reason == OverlayPanel.StateChangeReason.BACK_PRESS
-                || reason == OverlayPanel.StateChangeReason.BASE_PAGE_SCROLL
-                || reason == OverlayPanel.StateChangeReason.SWIPE
-                || reason == OverlayPanel.StateChangeReason.FLING
-                || reason == OverlayPanel.StateChangeReason.CLOSE_BUTTON);
-    }
-
-    /**
-     * Temporarily prevents the controller from handling selection modification events on the
-     * current selection. Handling will be re-enabled when a new selection is made through either a
-     * tap or long press.
-     */
-    private void preventHandlingCurrentSelectionModification() {
-        mShouldHandleSelectionModification = false;
-    }
-
-    // ============================================================================================
     // Misc.
     // ============================================================================================
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index c29743b..0eb2ed8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -3172,26 +3172,4 @@
         Assert.assertEquals("States", getSelectedText());
         waitForPanelToPeek();
     }
-
-    @Test
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    @CommandLineFlags.Add({"enable-features=ContextualSearchLongpressResolve<FakeStudyName",
-            "force-fieldtrials=FakeStudyName/FakeGroup",
-            "force-fieldtrial-params=FakeStudyName.FakeGroup:longpress_resolve_variation/"
-                    + ContextualSearchFieldTrial.LONGPRESS_RESOLVE_PRIVACY_AGGRESSIVE})
-    public void
-    testLongpressResolvesWithLongpressResolveEnabledAndVariationPrivacyAggressive()
-            throws TimeoutException {
-        mPolicy.overrideDecidedStateForTesting(false);
-        mFakeServer.setShouldUseHttps(true);
-        longPressNode("states");
-        assertLoadedNoUrl();
-        assertSearchTermRequested();
-
-        fakeResponse(false, 200, "states", "United States Intelligence", "alternate-term", false);
-        waitForPanelToPeek();
-        assertLoadedLowPriorityUrl();
-        assertContainsParameters("states", "alternate-term");
-    }
 }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 6e6aa09..67ae427 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -2498,13 +2498,16 @@
 
       <!-- Cookie controls strings. -->
       <message name="IDS_COOKIE_CONTROLS_DIALOG_TITLE" desc="Title of the dialog that allows users to control cookie blocking.">
-        Third-party cookie blocking is on
+        {COUNT, plural,
+              =0 {No third-party cookies}
+              =1 {1 third-party cookie is blocked}
+              other {# third-party cookies are blocked}}
       </message>
       <message name="IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF" desc="Text shown in the dialog that allows users to control cookie blocking. Shown when cookie blocking was disabled for this specific site.">
-        Third-party cookie blocking is turned off for this site
+        Third-party cookies are allowed on this site
       </message>
       <message name="IDS_COOKIE_CONTROLS_TURN_ON_BUTTON" desc="Label shown on a button that turns cookie blocking on after it was disabled for a specific site.">
-        Turn on
+        Block cookies
       </message>
       <message name="IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON" desc="Label shown on a button that turns off cookie blocking for a specific site.">
         Turn off for this site
@@ -2512,14 +2515,17 @@
       <message name="IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE" desc="Label shown on a dialog that allows users to turn off third-party cookie blocking for a specific site.">
         Site not working?
       </message>
+      <message name="IDS_COOKIE_CONTROLS_TURNED_ON_TITLE" desc="Label shown to a user after cookie blocking has been turned on for a specific site.">
+        Third-party cookie blocking is on
+      </message>
      <message name="IDS_COOKIE_CONTROLS_NOT_WORKING_DESCRIPTION" desc="Label shown on a dialog that allows users to turn off third-party cookie blocking for a specific site.">
         Some sites use third-party cookies to load their pages. If a site isn't working, you can try turning off cookie blocking.
       </message>
-      <message name="IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE" desc="Text shown in the dialog that allows users to control cookie blocking. Shows the number of sites for which cookies have been blocked.">
-        {COUNT, plural,
-              =0 {This site doesn't use cookies for cross-site tracking}
-              =1 {Chrome is blocking cookies from 1 site}
-              other {Chrome is blocking cookies from # sites}}
+      <message name="IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE" desc="Text shown in the dialog that allows users to control cookie blocking.">
+        This site is free of cookies that can be used to track you across the web
+      </message>
+      <message name="IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE" desc="Text shown in the dialog that allows users to control cookie blocking.">
+        Chrome is blocking cookies that can be used to track you across the web
       </message>
       <message name="IDS_COOKIE_CONTROLS_TOOLTIP" desc="Tooltip shown on a page action icon that is shown when cookie blocking is enabled.">
         Third-party cookie blocking
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE.png.sha1
new file mode 100644
index 0000000..cedf0d2
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE.png.sha1
@@ -0,0 +1 @@
+35cf61169272da7e8e35f0b4cc77bf41082baf48
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE.png.sha1
new file mode 100644
index 0000000..073b534
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@
+18cbca2a59506a01b12ce7e0de6ad7a5d54dfc23
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF.png.sha1
new file mode 100644
index 0000000..b9badb9a
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF.png.sha1
@@ -0,0 +1 @@
+dac2e1b0f064051d79c5270a743d2ec7b3225f6c
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE.png.sha1
new file mode 100644
index 0000000..91e5213
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE.png.sha1
@@ -0,0 +1 @@
+297129e478e4fe2073e74cde18acdbe71b455756
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURNED_ON_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURNED_ON_TITLE.png.sha1
new file mode 100644
index 0000000..6fc751e
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURNED_ON_TITLE.png.sha1
@@ -0,0 +1 @@
+f75771d80ea4534f8aee1f9e9a6786947ccdffbc
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON.png.sha1
new file mode 100644
index 0000000..9891671
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON.png.sha1
@@ -0,0 +1 @@
+55ec4ca6ba6aab18bf86f0b48b708e781a507e28
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_ON_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_ON_BUTTON.png.sha1
new file mode 100644
index 0000000..b9badb9a
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_COOKIE_CONTROLS_TURN_ON_BUTTON.png.sha1
@@ -0,0 +1 @@
+dac2e1b0f064051d79c5270a743d2ec7b3225f6c
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 15edad8..3003eff 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1130,19 +1130,10 @@
 const FeatureEntry::FeatureVariation kSimplifiedServerVariations[] = {
     {"and allow all CoCa cards", &kSimplifiedServerAllCocaCards, 1, nullptr}};
 
-const FeatureEntry::FeatureParam kLongpressResolveHideOnScroll = {
-    contextual_search::kLongpressResolveParamName,
-    contextual_search::kLongpressResolveHideOnScroll};
-const FeatureEntry::FeatureParam kLongpressResolvePrivacyAggressive = {
-    contextual_search::kLongpressResolveParamName,
-    contextual_search::kLongpressResolvePrivacyAggressive};
 const FeatureEntry::FeatureParam kLongpressResolvePreserveTap = {
     contextual_search::kLongpressResolveParamName,
     contextual_search::kLongpressResolvePreserveTap};
 const FeatureEntry::FeatureVariation kLongpressResolveVariations[] = {
-    {"and hide on scroll", &kLongpressResolveHideOnScroll, 1, nullptr},
-    {"and allow privacy-aggressive behavior",
-     &kLongpressResolvePrivacyAggressive, 1, nullptr},
     {"and preserve Tap behavior", &kLongpressResolvePreserveTap, 1, nullptr},
 };
 
diff --git a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc
index 8e848f2..5d96f57 100644
--- a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc
+++ b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc
@@ -26,9 +26,14 @@
     : browser_context_(browser_context),
       event_router_(EventRouter::Get(browser_context)),
       print_job_history_service_observer_(this) {
-  print_job_history_service_observer_.Add(
+  auto* history_service =
       chromeos::PrintJobHistoryServiceFactory::GetForBrowserContext(
-          browser_context));
+          browser_context);
+
+  // The print job history service is not available on the lock screen.
+  if (history_service) {
+    print_job_history_service_observer_.Add(history_service);
+  }
 }
 
 PrintJobFinishedEventDispatcher::~PrintJobFinishedEventDispatcher() {}
diff --git a/chrome/browser/chromeos/note_taking_helper.cc b/chrome/browser/chromeos/note_taking_helper.cc
index a24299b..ee4c8762 100644
--- a/chrome/browser/chromeos/note_taking_helper.cc
+++ b/chrome/browser/chromeos/note_taking_helper.cc
@@ -10,6 +10,7 @@
 #include "apps/launcher.h"
 #include "ash/public/cpp/stylus_utils.h"
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
@@ -29,6 +30,7 @@
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
 #include "components/arc/metrics/arc_metrics_constants.h"
+#include "components/arc/mojom/file_system.mojom.h"
 #include "components/arc/session/arc_bridge_service.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
@@ -478,6 +480,20 @@
                                            weak_ptr_factory_.GetWeakPtr()));
 }
 
+arc::mojom::ActivityNamePtr AppIdToActivityName(const std::string& id) {
+  auto name = arc::mojom::ActivityName::New();
+
+  const size_t separator = id.find('/');
+  if (separator == std::string::npos) {
+    name->package_name = id;
+    name->activity_name = std::string();
+  } else {
+    name->package_name = id.substr(0, separator);
+    name->activity_name = id.substr(separator + 1);
+  }
+  return name;
+}
+
 void NoteTakingHelper::OnGotAndroidApps(
     std::vector<arc::mojom::IntentHandlerInfoPtr> handlers) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -497,6 +513,21 @@
     observer.OnAvailableNoteTakingAppsUpdated();
 }
 
+arc::mojom::OpenUrlsRequestPtr CreateArcNoteRequest(const std::string& app_id,
+                                                    const GURL& clip_data_uri) {
+  auto request = arc::mojom::OpenUrlsRequest::New();
+  request->action_type = arc::mojom::ActionType::CREATE_NOTE;
+  request->activity_name = AppIdToActivityName(app_id);
+  if (!clip_data_uri.is_empty()) {
+    auto url_with_type = arc::mojom::ContentUrlWithMimeType::New();
+    url_with_type->content_url = clip_data_uri;
+    url_with_type->mime_type = "image/png";
+    request->urls.push_back(std::move(url_with_type));
+  }
+
+  return request;
+}
+
 NoteTakingHelper::LaunchResult NoteTakingHelper::LaunchAppInternal(
     Profile* profile,
     const std::string& app_id,
@@ -531,7 +562,15 @@
 
     // TODO(derat): Is there some way to detect whether this fails due to the
     // package no longer being available?
-    helper->HandleIntent(CreateIntentInfo(clip_data_uri), std::move(activity));
+    auto request = CreateArcNoteRequest(app_id, clip_data_uri);
+    arc::mojom::FileSystemInstance* arc_file_system =
+        ARC_GET_INSTANCE_FOR_METHOD(
+            arc::ArcServiceManager::Get()->arc_bridge_service()->file_system(),
+            OpenUrlsWithPermission);
+    if (!arc_file_system)
+      return LaunchResult::ANDROID_NOT_RUNNING;
+    arc_file_system->OpenUrlsWithPermission(std::move(request),
+                                            base::DoNothing());
 
     UMA_HISTOGRAM_ENUMERATION(
         "Arc.UserInteraction",
diff --git a/chrome/browser/chromeos/note_taking_helper_unittest.cc b/chrome/browser/chromeos/note_taking_helper_unittest.cc
index 12ec36c..e473db6 100644
--- a/chrome/browser/chromeos/note_taking_helper_unittest.cc
+++ b/chrome/browser/chromeos/note_taking_helper_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/chromeos/arc/fileapi/arc_file_system_bridge.h"
 #include "chrome/browser/chromeos/file_manager/path_util.h"
 #include "chrome/browser/chromeos/note_taking_controller_client.h"
 #include "chrome/browser/extensions/extension_service.h"
@@ -33,9 +34,11 @@
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/arc_util.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
+#include "components/arc/mojom/file_system.mojom.h"
 #include "components/arc/mojom/intent_helper.mojom.h"
 #include "components/arc/session/arc_bridge_service.h"
 #include "components/arc/test/connection_holder_util.h"
+#include "components/arc/test/fake_file_system_instance.h"
 #include "components/arc/test/fake_intent_helper_instance.h"
 #include "components/crx_file/id_util.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
@@ -82,21 +85,6 @@
                       info.lock_screen_support);
 }
 
-// Helper functions returning strings that can be used to compare launched
-// intents.
-std::string GetIntentString(const std::string& package,
-                            const std::string& clip_data_uri) {
-  return base::StringPrintf(
-      "%s %s", package.c_str(),
-      clip_data_uri.empty() ? "[unset]" : clip_data_uri.c_str());
-}
-std::string GetIntentString(const HandledIntent& intent) {
-  EXPECT_EQ(NoteTakingHelper::kIntentAction, intent.intent->action);
-  return GetIntentString(
-      intent.activity->package_name,
-      (intent.intent->clip_data_uri ? *intent.intent->clip_data_uri : ""));
-}
-
 // Creates an ARC IntentHandlerInfo object.
 IntentHandlerInfoPtr CreateIntentHandlerInfo(const std::string& name,
                                              const std::string& package) {
@@ -165,8 +153,13 @@
           ->arc_bridge_service()
           ->intent_helper()
           ->CloseInstance(&intent_helper_);
+      arc::ArcServiceManager::Get()
+          ->arc_bridge_service()
+          ->file_system()
+          ->CloseInstance(file_system_.get());
       NoteTakingHelper::Shutdown();
       intent_helper_bridge_.reset();
+      file_system_bridge_.reset();
       arc_test_.TearDown();
     }
     extensions::ExtensionSystem::Get(profile())->Shutdown();
@@ -218,6 +211,18 @@
     WaitForInstanceReady(
         arc::ArcServiceManager::Get()->arc_bridge_service()->intent_helper());
 
+    file_system_bridge_ = std::make_unique<arc::ArcFileSystemBridge>(
+        profile(), arc::ArcServiceManager::Get()->arc_bridge_service());
+    file_system_ = std::make_unique<arc::FakeFileSystemInstance>();
+
+    arc::ArcServiceManager::Get()
+        ->arc_bridge_service()
+        ->file_system()
+        ->SetInstance(file_system_.get());
+    WaitForInstanceReady(
+        arc::ArcServiceManager::Get()->arc_bridge_service()->file_system());
+    ASSERT_TRUE(file_system_->InitCalled());
+
     if (flags & ENABLE_PALETTE) {
       base::CommandLine::ForCurrentProcess()->AppendSwitch(
           ash::switches::kAshForceEnableStylusTools);
@@ -405,6 +410,10 @@
 
   arc::FakeIntentHelperInstance intent_helper_;
 
+  std::unique_ptr<arc::ArcFileSystemBridge> file_system_bridge_;
+
+  std::unique_ptr<arc::FakeFileSystemInstance> file_system_;
+
   // Pointer to the primary profile (returned by |profile()|) prefs - owned by
   // the profile.
   sync_preferences::TestingPrefServiceSyncable* profile_prefs_ = nullptr;
@@ -903,9 +912,16 @@
   // The installed app should be launched.
   std::unique_ptr<HistogramTester> histogram_tester(new HistogramTester());
   helper()->LaunchAppForNewNote(profile(), base::FilePath());
-  ASSERT_EQ(1u, intent_helper_.handled_intents().size());
-  EXPECT_EQ(GetIntentString(kPackage1, ""),
-            GetIntentString(intent_helper_.handled_intents()[0]));
+  ASSERT_EQ(1u, file_system_->handledUrlRequests().size());
+  EXPECT_EQ(arc::mojom::ActionType::CREATE_NOTE,
+            file_system_->handledUrlRequests().at(0)->action_type);
+  EXPECT_EQ(
+      kPackage1,
+      file_system_->handledUrlRequests().at(0)->activity_name->package_name);
+  EXPECT_EQ(
+      std::string(),
+      file_system_->handledUrlRequests().at(0)->activity_name->activity_name);
+  ASSERT_EQ(0u, file_system_->handledUrlRequests().at(0)->urls.size());
 
   histogram_tester->ExpectUniqueSample(
       NoteTakingHelper::kPreferredLaunchResultHistogramName,
@@ -926,11 +942,19 @@
 
   // The second app should be launched now.
   intent_helper_.clear_handled_intents();
+  file_system_->clear_handled_requests();
   histogram_tester.reset(new HistogramTester());
   helper()->LaunchAppForNewNote(profile(), base::FilePath());
-  ASSERT_EQ(1u, intent_helper_.handled_intents().size());
-  EXPECT_EQ(GetIntentString(kPackage2, ""),
-            GetIntentString(intent_helper_.handled_intents()[0]));
+  ASSERT_EQ(1u, file_system_->handledUrlRequests().size());
+  EXPECT_EQ(arc::mojom::ActionType::CREATE_NOTE,
+            file_system_->handledUrlRequests().at(0)->action_type);
+  EXPECT_EQ(
+      kPackage2,
+      file_system_->handledUrlRequests().at(0)->activity_name->package_name);
+  EXPECT_EQ(
+      std::string(),
+      file_system_->handledUrlRequests().at(0)->activity_name->activity_name);
+  ASSERT_EQ(0u, file_system_->handledUrlRequests().at(0)->urls.size());
 
   histogram_tester->ExpectUniqueSample(
       NoteTakingHelper::kPreferredLaunchResultHistogramName,
@@ -954,25 +978,45 @@
       file_manager::util::GetDownloadsFolderForProfile(profile()).Append(
           "image.jpg"));
   helper()->LaunchAppForNewNote(profile(), kDownloadedPath);
-  ASSERT_EQ(1u, intent_helper_.handled_intents().size());
-  EXPECT_EQ(GetIntentString(kPackage, GetArcUrl(kDownloadedPath)),
-            GetIntentString(intent_helper_.handled_intents()[0]));
+  ASSERT_EQ(1u, file_system_->handledUrlRequests().size());
+  EXPECT_EQ(arc::mojom::ActionType::CREATE_NOTE,
+            file_system_->handledUrlRequests().at(0)->action_type);
+  EXPECT_EQ(
+      kPackage,
+      file_system_->handledUrlRequests().at(0)->activity_name->package_name);
+  EXPECT_EQ(
+      std::string(),
+      file_system_->handledUrlRequests().at(0)->activity_name->activity_name);
+  ASSERT_EQ(1u, file_system_->handledUrlRequests().at(0)->urls.size());
+  ASSERT_EQ(GetArcUrl(kDownloadedPath),
+            file_system_->handledUrlRequests().at(0)->urls.at(0)->content_url);
 
   const base::FilePath kRemovablePath =
       base::FilePath(file_manager::util::kRemovableMediaPath)
           .Append("image.jpg");
   intent_helper_.clear_handled_intents();
+  file_system_->clear_handled_requests();
   helper()->LaunchAppForNewNote(profile(), kRemovablePath);
-  ASSERT_EQ(1u, intent_helper_.handled_intents().size());
-  EXPECT_EQ(GetIntentString(kPackage, GetArcUrl(kRemovablePath)),
-            GetIntentString(intent_helper_.handled_intents()[0]));
+  ASSERT_EQ(1u, file_system_->handledUrlRequests().size());
+  EXPECT_EQ(arc::mojom::ActionType::CREATE_NOTE,
+            file_system_->handledUrlRequests().at(0)->action_type);
+  EXPECT_EQ(
+      kPackage,
+      file_system_->handledUrlRequests().at(0)->activity_name->package_name);
+  EXPECT_EQ(
+      std::string(),
+      file_system_->handledUrlRequests().at(0)->activity_name->activity_name);
+  ASSERT_EQ(1u, file_system_->handledUrlRequests().at(0)->urls.size());
+  ASSERT_EQ(GetArcUrl(kRemovablePath),
+            file_system_->handledUrlRequests().at(0)->urls.at(0)->content_url);
 
   // When a path that isn't accessible to ARC is passed, the request should be
   // dropped.
   HistogramTester histogram_tester;
   intent_helper_.clear_handled_intents();
+  file_system_->clear_handled_requests();
   helper()->LaunchAppForNewNote(profile(), base::FilePath("/bad/path.jpg"));
-  EXPECT_TRUE(intent_helper_.handled_intents().empty());
+  EXPECT_TRUE(file_system_->handledUrlRequests().empty());
 
   histogram_tester.ExpectUniqueSample(
       NoteTakingHelper::kPreferredLaunchResultHistogramName,
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index b04c883..4bb130b 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -435,13 +435,17 @@
   }
 
   if (policy.has_device_login_screen_system_info_enforced()) {
-    const em::DeviceLoginScreenSystemInfoEnforcedProto& container(
+    const em::BooleanPolicyProto& container(
         policy.device_login_screen_system_info_enforced());
-    if (container.has_enabled()) {
-      policies->Set(
-          key::kDeviceLoginScreenSystemInfoEnforced, POLICY_LEVEL_MANDATORY,
-          POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
-          std::make_unique<base::Value>(container.enabled()), nullptr);
+    if (container.has_value()) {
+      PolicyLevel level;
+      if (GetPolicyLevel(container.has_policy_options(),
+                         container.policy_options(), &level)) {
+        policies->Set(key::kDeviceLoginScreenSystemInfoEnforced, level,
+                      POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+                      std::make_unique<base::Value>(container.value()),
+                      nullptr);
+      }
     }
   }
 
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc b/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
index abe5717..6958a1b 100644
--- a/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
@@ -4,9 +4,13 @@
 
 #include "chrome/browser/chromeos/printing/history/print_job_history_service_factory.h"
 
+#include <memory>
+#include <utility>
+
 #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h"
 #include "chrome/browser/chromeos/printing/history/print_job_database_impl.h"
 #include "chrome/browser/chromeos/printing/history/print_job_history_service_impl.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "content/public/browser/storage_partition.h"
@@ -38,6 +42,13 @@
     content::BrowserContext* context) const {
   Profile* profile = Profile::FromBrowserContext(context);
 
+  // We do not want an instance of PrintJobHistory on the lock screen.  The
+  // result is multiple print job notifications. https://crbug.com/1011532
+  if (ProfileHelper::IsLockScreenAppProfile(profile) ||
+      ProfileHelper::IsSigninProfile(profile)) {
+    return nullptr;
+  }
+
   leveldb_proto::ProtoDatabaseProvider* database_provider =
       content::BrowserContext::GetDefaultStoragePartition(profile)
           ->GetProtoDatabaseProvider();
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index 2ee0568..8fd42d7 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -392,10 +392,10 @@
   }
 
   if (policy.has_device_login_screen_system_info_enforced() &&
-      policy.device_login_screen_system_info_enforced().has_enabled()) {
+      policy.device_login_screen_system_info_enforced().has_value()) {
     new_values_cache->SetBoolean(
         kDeviceLoginScreenSystemInfoEnforced,
-        policy.device_login_screen_system_info_enforced().enabled());
+        policy.device_login_screen_system_info_enforced().value());
   }
 
   if (policy.has_saml_login_authentication_type() &&
diff --git a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
index 166f4db..d8a3a85 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
@@ -313,10 +313,10 @@
 
   // Helper routine to set DeviceLoginScreenSystemInfoEnforced policy.
   void SetSystemInfoEnforced(bool enabled) {
-    em::DeviceLoginScreenSystemInfoEnforcedProto* proto =
+    em::BooleanPolicyProto* proto =
         device_policy_->payload()
             .mutable_device_login_screen_system_info_enforced();
-    proto->set_enabled(enabled);
+    proto->set_value(enabled);
     BuildAndInstallDevicePolicy();
   }
 
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
index cdc5786..4530f54 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
@@ -12,6 +12,8 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/macros.h"
+#include "base/values.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h"
 #include "chrome/browser/chromeos/certificate_provider/pin_dialog_manager.h"
@@ -19,6 +21,7 @@
 #include "chrome/common/extensions/api/certificate_provider.h"
 #include "chrome/common/extensions/api/certificate_provider_internal.h"
 #include "chromeos/constants/security_token_pin_types.h"
+#include "extensions/browser/quota_service.h"
 #include "net/cert/x509_certificate.h"
 #include "net/ssl/ssl_private_key.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom.h"
@@ -75,6 +78,51 @@
     "Previous request not finished";
 const char kCertificateProviderNoUserInput[] = "No user input received";
 
+// The BucketMapper implementation for the requestPin API that avoids using the
+// quota when the current request uses the requestId that is strictly greater
+// than all previous ones.
+class RequestPinExceptFirstQuotaBucketMapper final
+    : public QuotaLimitHeuristic::BucketMapper {
+ public:
+  RequestPinExceptFirstQuotaBucketMapper() = default;
+  ~RequestPinExceptFirstQuotaBucketMapper() override = default;
+
+  void GetBucketsForArgs(const base::ListValue* args,
+                         QuotaLimitHeuristic::BucketList* buckets) override {
+    if (args->GetList().empty())
+      return;
+    const base::Value& details = args->GetList()[0];
+    if (!details.is_dict())
+      return;
+    const base::Value* sign_request_id =
+        details.FindKeyOfType("signRequestId", base::Value::Type::INTEGER);
+    if (!sign_request_id)
+      return;
+    if (sign_request_id->GetInt() > biggest_request_id_) {
+      // Either it's the first request with the newly issued requestId, or it's
+      // an invalid requestId (bigger than the real one). Return a new bucket in
+      // order to apply no quota for the former case; for the latter case the
+      // quota doesn't matter much, except that we're maybe making it stricter
+      // for future requests (which is bearable).
+      biggest_request_id_ = sign_request_id->GetInt();
+      new_request_bucket_ = std::make_unique<QuotaLimitHeuristic::Bucket>();
+      buckets->push_back(new_request_bucket_.get());
+      return;
+    }
+    // Either it's a repeatitive request for the given requestId, or the
+    // extension reordered the requests. Fall back to the default bucket (shared
+    // between all requests) in that case.
+    buckets->push_back(&default_bucket_);
+  }
+
+ private:
+  int biggest_request_id_ = -1;
+  QuotaLimitHeuristic::Bucket default_bucket_;
+  std::unique_ptr<QuotaLimitHeuristic::Bucket> new_request_bucket_;
+
+  DISALLOW_COPY_AND_ASSIGN(RequestPinExceptFirstQuotaBucketMapper);
+};
+
 }  // namespace
 
 const int api::certificate_provider::kMaxClosedDialogsPerMinute = 10;
@@ -257,19 +305,25 @@
 }
 
 void CertificateProviderRequestPinFunction::GetQuotaLimitHeuristics(
-    extensions::QuotaLimitHeuristics* heuristics) const {
+    QuotaLimitHeuristics* heuristics) const {
+  // Apply a 1-minute and a 10-minute quotas. A special bucket mapper is used in
+  // order to, approximately, skip applying quotas to the first request for each
+  // requestId (such logic cannot be done in ShouldSkipQuotaLimiting(), since
+  // it's not called with the request's parameters). The limitation constants
+  // are decremented below to account the first request.
+
   QuotaLimitHeuristic::Config short_limit_config = {
-      api::certificate_provider::kMaxClosedDialogsPerMinute,
+      api::certificate_provider::kMaxClosedDialogsPerMinute - 1,
       base::TimeDelta::FromMinutes(1)};
   heuristics->push_back(std::make_unique<QuotaService::TimedLimit>(
-      short_limit_config, new QuotaLimitHeuristic::SingletonBucketMapper(),
+      short_limit_config, new RequestPinExceptFirstQuotaBucketMapper,
       "MAX_PIN_DIALOGS_CLOSED_PER_MINUTE"));
 
   QuotaLimitHeuristic::Config long_limit_config = {
-      api::certificate_provider::kMaxClosedDialogsPer10Minutes,
+      api::certificate_provider::kMaxClosedDialogsPer10Minutes - 1,
       base::TimeDelta::FromMinutes(10)};
   heuristics->push_back(std::make_unique<QuotaService::TimedLimit>(
-      long_limit_config, new QuotaLimitHeuristic::SingletonBucketMapper(),
+      long_limit_config, new RequestPinExceptFirstQuotaBucketMapper,
       "MAX_PIN_DIALOGS_CLOSED_PER_10_MINUTES"));
 }
 
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
index cf69be6..507dbad 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
@@ -171,9 +171,9 @@
     CertificateProviderApiTest::TearDownOnMainThread();
   }
 
-  void AddFakeSignRequest() {
+  void AddFakeSignRequest(int sign_request_id) {
     cert_provider_service_->pin_dialog_manager()->AddSignRequestId(
-        extension_->id(), kFakeSignRequestId, {});
+        extension_->id(), sign_request_id, {});
   }
 
   void NavigateTo(const std::string& test_page_file_name) {
@@ -373,7 +373,7 @@
 
 // User enters the correct PIN.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ShowPinDialogAccept) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("basic.html");
 
   // Enter the valid PIN.
@@ -386,7 +386,7 @@
 // User closes the dialog kMaxClosedDialogsPerMinute times, and the extension
 // should be blocked from showing it again.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ShowPinDialogClose) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("basic.html");
 
   for (int i = 0;
@@ -411,7 +411,7 @@
 // User enters a wrong PIN first and a correct PIN on the second try.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest,
                        ShowPinDialogWrongPin) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("basic.html");
   EnterWrongPinAndWaitForMessage();
 
@@ -429,7 +429,7 @@
 // User enters wrong PIN three times.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest,
                        ShowPinDialogWrongPinThreeTimes) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("basic.html");
   for (int i = 0; i < kWrongPinAttemptsLimit; i++)
     EnterWrongPinAndWaitForMessage();
@@ -447,7 +447,7 @@
 // User closes the dialog while the extension is processing the request.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest,
                        ShowPinDialogCloseWhileProcessing) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommandAndWaitForMessage("Request", "request1:begun"));
@@ -473,7 +473,7 @@
        i <
        extensions::api::certificate_provider::kMaxClosedDialogsPerMinute + 1;
        i++) {
-    AddFakeSignRequest();
+    AddFakeSignRequest(kFakeSignRequestId);
     EXPECT_TRUE(SendCommandAndWaitForMessage(
         "Request", base::StringPrintf("request%d:begun", i + 1)));
 
@@ -483,7 +483,7 @@
     EXPECT_FALSE(GetActivePinDialogView());
   }
 
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   EXPECT_TRUE(SendCommandAndWaitForMessage(
       "Request",
       base::StringPrintf(
@@ -496,7 +496,7 @@
 
 // Extension erroneously attempts to close the PIN dialog twice.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, DoubleClose) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommand("Request"));
@@ -516,14 +516,14 @@
        i <
        extensions::api::certificate_provider::kMaxClosedDialogsPerMinute + 1;
        i++) {
-    AddFakeSignRequest();
+    AddFakeSignRequest(kFakeSignRequestId);
     EXPECT_TRUE(SendCommand("Request"));
     EXPECT_TRUE(SendCommandAndWaitForMessage(
         "Stop", base::StringPrintf("stop%d:success", i + 1)));
     EXPECT_FALSE(GetActivePinDialogView());
   }
 
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   EXPECT_TRUE(SendCommandAndWaitForMessage(
       "Request",
       base::StringPrintf(
@@ -538,7 +538,7 @@
 // the user provided any input.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest,
                        StopWithErrorBeforeInput) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommand("Request"));
@@ -558,7 +558,7 @@
 
 // Extension specifies zero left attempts in the very first PIN request.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, ZeroAttemptsAtStart) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommandAndWaitForMessage("RequestWithZeroAttempts",
@@ -574,7 +574,7 @@
 
 // Extension erroneously passes a negative attempts left count.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, NegativeAttempts) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommandAndWaitForMessage(
@@ -584,7 +584,7 @@
 
 // Extension erroneously attempts to close a non-existing dialog.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, CloseNonExisting) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommandAndWaitForMessage(
@@ -594,7 +594,7 @@
 
 // Extension erroneously attempts to stop a non-existing dialog with an error.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, StopNonExisting) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommandAndWaitForMessage(
@@ -606,7 +606,7 @@
 // user closed the previously stopped with an error PIN request.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest,
                        UpdateAlreadyStopped) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommandAndWaitForMessage("Request", "request1:begun"));
@@ -623,7 +623,7 @@
 // Extension starts a new PIN request after it stopped the previous one with an
 // error.
 IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest, StartAfterStop) {
-  AddFakeSignRequest();
+  AddFakeSignRequest(kFakeSignRequestId);
   NavigateTo("operated.html");
 
   EXPECT_TRUE(SendCommandAndWaitForMessage("Request", "request1:begun"));
@@ -638,3 +638,28 @@
   EXPECT_TRUE(listener.WaitUntilSatisfied());
   EXPECT_FALSE(GetActivePinDialogView()->textfield_for_testing()->GetEnabled());
 }
+
+// Test that no quota is applied to the first PIN requests for each requestId.
+IN_PROC_BROWSER_TEST_F(CertificateProviderRequestPinTest,
+                       RepeatedCloseWithDifferentIds) {
+  NavigateTo("operated.html");
+
+  for (int i = 0;
+       i <
+       extensions::api::certificate_provider::kMaxClosedDialogsPer10Minutes + 2;
+       i++) {
+    AddFakeSignRequest(kFakeSignRequestId + i);
+    EXPECT_TRUE(SendCommandAndWaitForMessage(
+        "Request", base::StringPrintf("request%d:begun", i + 1)));
+
+    ExtensionTestMessageListener listener(
+        base::StringPrintf("request%d:empty", i + 1), false);
+    ASSERT_TRUE(GetActivePinDialogView());
+    GetActivePinDialogView()->GetWidget()->CloseWithReason(
+        views::Widget::ClosedReason::kCloseButtonClicked);
+    EXPECT_TRUE(listener.WaitUntilSatisfied());
+    EXPECT_FALSE(GetActivePinDialogView());
+
+    EXPECT_TRUE(SendCommand("IncrementRequestId"));
+  }
+}
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc
index 8a6867d..afc7eb0 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc
@@ -35,6 +35,7 @@
 #include "net/base/net_errors.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
+#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h"
 #include "ui/base/page_transition_types.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
@@ -65,6 +66,14 @@
                    handle->GetFrameTreeNodeId());
 }
 
+void RecordFeatureUsage(content::RenderFrameHost* rfh,
+                        blink::mojom::WebFeature web_feature) {
+  page_load_metrics::mojom::PageLoadFeatures page_load_features(
+      {web_feature}, {} /* css_properties */, {} /* animated_css_properties */);
+  page_load_metrics::MetricsWebContentsObserver::RecordFeatureUsage(
+      rfh, page_load_features);
+}
+
 using ResourceMimeType = AdsPageLoadMetricsObserver::ResourceMimeType;
 const char kDisallowedByBlocklistHistogramName[] =
     "PageLoad.Clients.Ads.HeavyAds.DisallowedByBlocklist";
@@ -202,6 +211,9 @@
       render_frame_host, render_frame_host->GetLastCommittedURL(),
       heavy_ads::PrepareHeavyAdPage(), net::ERR_BLOCKED_BY_CLIENT);
 
+  RecordFeatureUsage(render_frame_host,
+                     blink::mojom::WebFeature::kHeavyAdIntervention);
+
   ADS_HISTOGRAM("HeavyAds.InterventionType2", UMA_HISTOGRAM_ENUMERATION,
                 FrameData::FrameVisibility::kAnyVisibility,
                 frame_data->heavy_ad_status_with_noise());
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
index 11d79cd..b5e804b 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -44,6 +44,7 @@
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_source.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
 #include "url/url_constants.h"
@@ -907,6 +908,9 @@
 
   histogram_tester.ExpectUniqueSample(kHeavyAdInterventionTypeHistogramId,
                                       FrameData::HeavyAdStatus::kNetwork, 1);
+  histogram_tester.ExpectBucketCount(
+      "Blink.UseCounter.Features",
+      blink::mojom::WebFeature::kHeavyAdIntervention, 1);
 }
 
 // Check that when the heavy ad feature is disabled we don't navigate
@@ -938,6 +942,10 @@
   // load is not synchronous. Instead check that we didn't log intervention UMA
   // that is always recorded when the intervention occurs.
   histogram_tester.ExpectTotalCount(kHeavyAdInterventionTypeHistogramId, 0);
+
+  histogram_tester.ExpectBucketCount(
+      "Blink.UseCounter.Features",
+      blink::mojom::WebFeature::kHeavyAdIntervention, 0);
 }
 
 // Check that we don't activate a HeavyAdIntervention field trial if we don't
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 83918c5..b1c7e21a 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -828,7 +828,6 @@
   if (PasswordGenerationController::AllowedForWebContents(web_contents())) {
     PasswordManagerDriver* driver = driver_factory_->GetDriverForFrame(
         password_generation_driver_bindings_.GetCurrentTargetFrame());
-    DCHECK(driver);
 
     PasswordGenerationController* generation_controller =
         PasswordGenerationController::GetIfExisting(web_contents());
@@ -860,7 +859,6 @@
     return;
   auto* driver = driver_factory_->GetDriverForFrame(
       password_generation_driver_bindings_.GetCurrentTargetFrame());
-  DCHECK(driver);
   gfx::RectF element_bounds_in_screen_space =
       GetBoundsInScreenSpace(TransformToRootCoordinates(
           password_generation_driver_bindings_.GetCurrentTargetFrame(),
@@ -1158,7 +1156,6 @@
     password_manager::ContentPasswordManagerDriver* driver,
     const autofill::password_generation::PasswordGenerationUIData& ui_data,
     bool is_manually_triggered) {
-  DCHECK(driver);
   gfx::RectF element_bounds_in_top_frame_space =
       TransformToRootCoordinates(driver->render_frame_host(), ui_data.bounds);
   if (!is_manually_triggered &&
diff --git a/chrome/browser/password_manager/password_accessory_controller_impl.cc b/chrome/browser/password_manager/password_accessory_controller_impl.cc
index fe6c7b71..f770783 100644
--- a/chrome/browser/password_manager/password_accessory_controller_impl.cc
+++ b/chrome/browser/password_manager/password_accessory_controller_impl.cc
@@ -98,12 +98,8 @@
   password_manager::ContentPasswordManagerDriverFactory* factory =
       password_manager::ContentPasswordManagerDriverFactory::FromWebContents(
           web_contents_);
-  DCHECK(factory);
   password_manager::ContentPasswordManagerDriver* driver =
       factory->GetDriverForFrame(web_contents_->GetFocusedFrame());
-  if (!driver) {
-    return;
-  }  // |driver| can be NULL if the tab is being closed.
   driver->FillIntoFocusedField(selection.is_obfuscated(),
                                selection.display_text());
 }
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index dfab012..3d716ec 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -1900,7 +1900,6 @@
       ObservingAutofillClient::FromWebContents(WebContents());
   password_manager::ContentPasswordManagerDriver* driver =
       driver_factory->GetDriverForFrame(WebContents()->GetMainFrame());
-  DCHECK(driver);
   driver->GetPasswordAutofillManager()->set_autofill_client(
       observing_autofill_client);
 
diff --git a/chrome/browser/previews/previews_lite_page_redirect_url_loader.cc b/chrome/browser/previews/previews_lite_page_redirect_url_loader.cc
index a757dc7..fb2fc0d 100644
--- a/chrome/browser/previews/previews_lite_page_redirect_url_loader.cc
+++ b/chrome/browser/previews/previews_lite_page_redirect_url_loader.cc
@@ -12,6 +12,7 @@
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.h"
 #include "chrome/browser/profiles/profile.h"
+#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_request_options.h"
 #include "components/previews/core/previews_experiments.h"
 #include "components/previews/core/previews_lite_page_redirect.h"
 #include "content/public/browser/browser_context.h"
@@ -130,6 +131,9 @@
         network_loader_factory,
     int frame_tree_node_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(data_reduction_proxy::DataReductionProxyRequestOptions::
+             GetSessionKeyFromRequestHeaders(chrome_proxy_headers)
+                 .has_value());
 
   GURL original_url = modified_resource_request_.url;
   GURL lite_page_url =
diff --git a/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.cc b/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.cc
index d27ee6b..66fc4460 100644
--- a/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.cc
+++ b/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/command_line.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "base/stl_util.h"
@@ -71,8 +72,14 @@
     uint64_t page_id) {
   net::HttpRequestHeaders headers;
   // Return empty headers for unittests.
-  if (!browser_context)
+  if (!browser_context) {
+    if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+            "add-chrome-proxy-header-for-lpr-tests")) {
+      headers.SetHeader(data_reduction_proxy::chrome_proxy_header(),
+                        "s=secret");
+    }
     return headers;
+  }
 
   auto* settings =
       DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
diff --git a/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor_unittest.cc b/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor_unittest.cc
index a20b2f93..1f6bdbe 100644
--- a/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor_unittest.cc
+++ b/chrome/browser/previews/previews_lite_page_redirect_url_loader_interceptor_unittest.cc
@@ -74,6 +74,9 @@
   void TearDown() override {}
 
   void SetUp() override {
+    base::CommandLine::ForCurrentProcess()->AppendSwitch(
+        "add-chrome-proxy-header-for-lpr-tests");
+
     interceptor_ =
         std::make_unique<PreviewsLitePageRedirectURLLoaderInterceptor>(
             shared_factory_, 1, 2);
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
index a6e6114..ec9c5b8 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -544,9 +544,6 @@
   // Set up password manager stuff.
   ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient(
       web_contents(), nullptr);
-  password_manager::ContentPasswordManagerDriverFactory::FromWebContents(
-      web_contents())
-      ->RenderFrameCreated(web_contents()->GetMainFrame());
 
   NavigateAndCommit(GURL("http://www.foo.com/"));
   content::ContextMenuParams params = CreateParams(MenuItem::EDITABLE);
@@ -568,9 +565,6 @@
   // Set up password manager stuff.
   ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient(
       incognito_web_contents.get(), nullptr);
-  password_manager::ContentPasswordManagerDriverFactory::FromWebContents(
-      incognito_web_contents.get())
-      ->RenderFrameCreated(incognito_web_contents->GetMainFrame());
 
   content::WebContentsTester::For(incognito_web_contents.get())
       ->NavigateAndCommit(GURL("http://www.foo.com/"));
diff --git a/chrome/browser/resources/chromeos/login/md_screen_container.css b/chrome/browser/resources/chromeos/login/md_screen_container.css
index 2c6f3493..5ff1570 100644
--- a/chrome/browser/resources/chromeos/login/md_screen_container.css
+++ b/chrome/browser/resources/chromeos/login/md_screen_container.css
@@ -114,6 +114,7 @@
   height: 100%;
   max-height: 864px; /* 768 + 48*2 */
   max-width: 864px; /* 768 + 48*2 */
+  min-height: 560px; /* 464 + 48*2 */
   padding-bottom: 48px;
   padding-inline-end: 48px;
   padding-inline-start: 48px;
diff --git a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
index 3c0f854..7c87df1 100644
--- a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
+++ b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
@@ -29,6 +29,11 @@
   <template>
     <link rel="stylesheet" href="oobe_popup_overlay.css">
     <style include="shared-style multidevice-setup-shared ">
+      multidevice-setup {
+        --multidevice-setup-height: var(--oobe-dialog-host-height);
+        --multidevice-setup-width: var(--oobe-dialog-host-width);
+      }
+
       #multidevice-help-overlay-container {
         width: 768px;
       }
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
index 0d0a8da..ec5cbd7 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.html
@@ -10,6 +10,11 @@
 <dom-module id="multidevice-setup-post-oobe">
   <template>
     <style include="multidevice-setup-shared">
+      multidevice-setup {
+        --multidevice-setup-height: 640px;
+        --multidevice-setup-width: 768px;
+      }
+
       #backward-button,
       #cancel-button,
       #forward-button {
diff --git a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h
index 7d3c6d3e..8c67af0 100644
--- a/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h
+++ b/chrome/browser/signin/chrome_signin_proxying_url_loader_factory.h
@@ -78,10 +78,6 @@
   void RemoveRequest(InProgressRequest* request);
   void MaybeDestroySelf();
 
-  const content::WebContents::Getter& web_contents_getter() {
-    return web_contents_getter_;
-  }
-
   std::unique_ptr<HeaderModificationDelegate> delegate_;
   content::WebContents::Getter web_contents_getter_;
 
diff --git a/chrome/browser/signin/dice_response_handler.h b/chrome/browser/signin/dice_response_handler.h
index bc55f76e..ab6eac1 100644
--- a/chrome/browser/signin/dice_response_handler.h
+++ b/chrome/browser/signin/dice_response_handler.h
@@ -120,11 +120,6 @@
   // Deletes the token fetcher.
   void DeleteTokenFetcher(DiceTokenFetcher* token_fetcher);
 
-  // Returns true if it is acceptable to get a new token for the account.
-  // Always returns true when using kDice.
-  bool CanGetTokenForAccount(const std::string& gaia_id,
-                             const std::string& email);
-
   // Process the Dice signin action.
   void ProcessDiceSigninHeader(
       const std::string& gaia_id,
diff --git a/chrome/browser/signin/signin_global_error.cc b/chrome/browser/signin/signin_global_error.cc
index f1f279ea..f479568 100644
--- a/chrome/browser/signin/signin_global_error.cc
+++ b/chrome/browser/signin/signin_global_error.cc
@@ -47,13 +47,6 @@
   return HasMenuItem();
 }
 
-void SigninGlobalError::AttemptToFixError(Browser* browser) {
-  if (!HasError())
-    return;
-
-  ExecuteMenuItem(browser);
-}
-
 void SigninGlobalError::Shutdown() {
   error_controller_->RemoveObserver(this);
   error_controller_ = NULL;
diff --git a/chrome/browser/signin/signin_global_error.h b/chrome/browser/signin/signin_global_error.h
index 320b39f..9240265 100644
--- a/chrome/browser/signin/signin_global_error.h
+++ b/chrome/browser/signin/signin_global_error.h
@@ -27,10 +27,6 @@
   // Returns true if there is an authentication error.
   bool HasError();
 
-  // Shows re-authentication UI to the user in an attempt to fix the error.
-  // The re-authentication UI will be shown in |browser|.
-  void AttemptToFixError(Browser* browser);
-
  private:
   FRIEND_TEST_ALL_PREFIXES(SigninGlobalErrorTest, Basic);
   FRIEND_TEST_ALL_PREFIXES(SigninGlobalErrorTest, AuthStatusEnumerateAllErrors);
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc
index b92d70963..9a1452cd 100644
--- a/chrome/browser/signin/signin_ui_util.cc
+++ b/chrome/browser/signin/signin_ui_util.cc
@@ -175,23 +175,6 @@
 }
 }  // namespace internal
 
-std::string GetDisplayEmail(Profile* profile, const std::string& account_id) {
-  signin::IdentityManager* identity_manager =
-      IdentityManagerFactory::GetForProfile(profile);
-  std::string email =
-      identity_manager
-          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
-              account_id)
-          ->email;
-  if (email.empty()) {
-    DCHECK_EQ(
-        signin::IdentityManager::AccountIdMigrationState::MIGRATION_NOT_STARTED,
-        identity_manager->GetAccountIdMigrationState());
-    return account_id;
-  }
-  return email;
-}
-
 std::vector<AccountInfo> GetAccountsForDicePromos(Profile* profile) {
   // Fetch account ids for accounts that have a token.
   signin::IdentityManager* identity_manager =
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h
index 156f0b1..ca329ae 100644
--- a/chrome/browser/signin/signin_ui_util.h
+++ b/chrome/browser/signin/signin_ui_util.h
@@ -53,12 +53,6 @@
                          bool is_default_promo_account);
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-// Returns the display email string for the given account.  If the profile
-// has not been migrated to use gaia ids, then its possible for the display
-// to not ne known yet.  In this case, use |account_id|, which is assumed to
-// be an email address.
-std::string GetDisplayEmail(Profile* profile, const std::string& account_id);
-
 // Returns the list of all accounts that have a token. The default account in
 // the Gaia cookies will be the first account in the list.
 std::vector<AccountInfo> GetAccountsForDicePromos(Profile* profile);
diff --git a/chrome/browser/touch_to_fill/android/internal/BUILD.gn b/chrome/browser/touch_to_fill/android/internal/BUILD.gn
index 49f44f5..7792ea5 100644
--- a/chrome/browser/touch_to_fill/android/internal/BUILD.gn
+++ b/chrome/browser/touch_to_fill/android/internal/BUILD.gn
@@ -12,6 +12,7 @@
     "//base:jni_java",
     "//chrome/android:chrome_java",
     "//chrome/browser/touch_to_fill/android:public_java",
+    "//chrome/browser/util/android:java",
     "//ui/android:ui_java",
   ]
 
diff --git a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_credential_item.xml b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_credential_item.xml
index 745ffca7..af57e8a5 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_credential_item.xml
+++ b/chrome/browser/touch_to_fill/android/internal/java/res/layout/touch_to_fill_credential_item.xml
@@ -8,37 +8,48 @@
     android:descendantFocusability="blocksDescendants"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:minHeight="70dp"
+    android:minHeight="72dp"
     android:gravity="center_vertical"
     android:orientation="horizontal"
     android:background="@drawable/touch_to_fill_credential_background">
 
     <ImageView
         android:id="@+id/favicon"
-        android:layout_width="20dp"
-        android:layout_height="20dp"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:layout_marginStart="12dp"
         android:importantForAccessibility="no"
         android:layout_gravity="center"/>
     <LinearLayout
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_margin="8dp"
-        android:layout_marginStart="16dp"
+        android:layout_margin="6dp"
+        android:layout_marginStart="12dp"
         android:layout_weight="1"
         android:orientation="vertical">
         <TextView
+            android:id="@+id/credential_origin"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:minHeight="20dp"
+            android:ellipsize="start"
+            android:singleLine="true"
+            android:textAppearance="@style/TextAppearance.BlackBody" />
+        <TextView
             android:id="@+id/username"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:minHeight="20dp"
             android:ellipsize="end"
             android:singleLine="true"
-            android:textAppearance="@style/TextAppearance.BlackTitle1" />
+            android:textAppearance="@style/TextAppearance.BlackBodyDefault" />
         <TextView
             android:id="@+id/password"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:minHeight="20dp"
             android:ellipsize="end"
             android:singleLine="true"
-            android:textAppearance="@style/TextAppearance.BlackBody" />
+            android:textAppearance="@style/TextAppearance.BlackBodyDefault" />
     </LinearLayout>
 </LinearLayout>
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java
index 644da774..d6ab53b 100644
--- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java
+++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewBinder.java
@@ -8,6 +8,7 @@
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.FORMATTED_URL;
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VIEW_EVENT_LISTENER;
 import static org.chromium.chrome.browser.touch_to_fill.TouchToFillProperties.VISIBLE;
+import static org.chromium.chrome.browser.util.UrlUtilities.stripScheme;
 
 import android.text.method.PasswordTransformationMethod;
 import android.view.LayoutInflater;
@@ -41,6 +42,12 @@
      * @param credential The {@link Credential} whose data needs to be displayed.
      */
     static void bindCredentialView(View view, Credential credential) {
+        TextView pslOriginText = view.findViewById(R.id.credential_origin);
+        String formattedOrigin = stripScheme(credential.getOriginUrl());
+        formattedOrigin = formattedOrigin.replaceFirst("/$", ""); // Strip possibly trailing slash.
+        pslOriginText.setText(formattedOrigin);
+        pslOriginText.setVisibility(credential.isPublicSuffixMatch() ? View.VISIBLE : View.GONE);
+
         TextView usernameText = view.findViewById(R.id.username);
         usernameText.setText(credential.getFormattedUsername());
 
diff --git a/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java b/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java
index eb3ed519..934b2e2 100644
--- a/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java
+++ b/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/data/Credential.java
@@ -24,6 +24,7 @@
      */
     public Credential(String username, String password, String formattedUsername, String originUrl,
             boolean isPublicSuffixMatch) {
+        assert originUrl != null : "Credential origin is null! Pass an empty one instead.";
         mUsername = username;
         mPassword = password;
         mFormattedUsername = formattedUsername;
diff --git a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java
index f1c82c6..d3498f7 100644
--- a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java
+++ b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillViewTest.java
@@ -18,6 +18,7 @@
 
 import android.support.test.filters.MediumTest;
 import android.text.method.PasswordTransformationMethod;
+import android.view.View;
 import android.widget.ListView;
 import android.widget.TextView;
 
@@ -111,20 +112,31 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mTouchToFillView.setVisible(true);
             mModel.get(CREDENTIAL_LIST)
-                    .addAll(Arrays.asList(new Credential("Ana", "S3cr3t", "Ana", null, false),
-                            new Credential("", "***", "No Username", "m.example.xyz", true)));
+                    .addAll(Arrays.asList(new Credential("Ana", "S3cr3t", "Ana", "", false),
+                            new Credential("", "***", "No Username", "http://m.example.xyz/", true),
+                            new Credential(
+                                    "Bob", "***", "Bob", "http://mobile.example.xyz", true)));
         });
 
         pollUiThread(() -> getBottomSheetState() == SheetState.FULL);
-        assertThat(getCredentials().getChildCount(), is(2));
+        assertThat(getCredentials().getChildCount(), is(3));
+        assertThat(getCredentialOriginAt(0).getVisibility(), is(View.GONE));
         assertThat(getCredentialNameAt(0).getText(), is("Ana"));
         assertThat(getCredentialPasswordAt(0).getText(), is("S3cr3t"));
         assertThat(getCredentialPasswordAt(0).getTransformationMethod(),
                 instanceOf(PasswordTransformationMethod.class));
+        assertThat(getCredentialOriginAt(1).getVisibility(), is(View.VISIBLE));
+        assertThat(getCredentialOriginAt(1).getText(), is("m.example.xyz"));
         assertThat(getCredentialNameAt(1).getText(), is("No Username"));
         assertThat(getCredentialPasswordAt(1).getText(), is("***"));
         assertThat(getCredentialPasswordAt(1).getTransformationMethod(),
                 instanceOf(PasswordTransformationMethod.class));
+        assertThat(getCredentialOriginAt(2).getVisibility(), is(View.VISIBLE));
+        assertThat(getCredentialOriginAt(2).getText(), is("mobile.example.xyz"));
+        assertThat(getCredentialNameAt(2).getText(), is("Bob"));
+        assertThat(getCredentialPasswordAt(2).getText(), is("***"));
+        assertThat(getCredentialPasswordAt(2).getTransformationMethod(),
+                instanceOf(PasswordTransformationMethod.class));
     }
 
     @Test
@@ -180,6 +192,10 @@
         return getCredentials().getChildAt(index).findViewById(R.id.password);
     }
 
+    private TextView getCredentialOriginAt(int index) {
+        return getCredentials().getChildAt(index).findViewById(R.id.credential_origin);
+    }
+
     TouchToFillProperties.ViewEventListener waitForEvent() {
         return verify(mMockListener,
                 timeout(ScalableTimeout.scaleTimeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL)));
diff --git a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
index 878b27c..9cd0b06 100644
--- a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
+++ b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
@@ -36,7 +36,7 @@
 public class TouchToFillControllerTest {
     private static final String TEST_URL = "www.example.xyz";
     private static final String TEST_MOBILE_URL = "www.example.xyz";
-    private static final Credential ANA = new Credential("Ana", "S3cr3t", "Ana", null, false);
+    private static final Credential ANA = new Credential("Ana", "S3cr3t", "Ana", "", false);
     private static final Credential BOB =
             new Credential("Bob", "*****", "Bob", TEST_MOBILE_URL, true);
     private static final Credential CARL = new Credential("Carl", "G3h3!m", "Carl", "", false);
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_controller.cc b/chrome/browser/ui/cookie_controls/cookie_controls_controller.cc
index 5aaefb7..f0e2456 100644
--- a/chrome/browser/ui/cookie_controls/cookie_controls_controller.cc
+++ b/chrome/browser/ui/cookie_controls/cookie_controls_controller.cc
@@ -54,8 +54,7 @@
         this, TabSpecificContentSettings::FromWebContents(web_contents));
   }
   for (auto& observer : observers_)
-    observer.OnStatusChanged(GetStatus(web_contents));
-  PresentBlockedCookieCounter();
+    observer.OnStatusChanged(GetStatus(web_contents), GetBlockedCookieCount());
 }
 
 CookieControlsController::Status CookieControlsController::GetStatus(
@@ -87,19 +86,17 @@
   Update(GetWebContents());
 }
 
-int CookieControlsController::GetBlockedDomainCount() {
+int CookieControlsController::GetBlockedCookieCount() {
   const LocalSharedObjectsContainer& blocked_objects =
       tab_observer_->tab_specific_content_settings()
           ->blocked_local_shared_objects();
-  return blocked_objects.GetDomainCount();
+  return blocked_objects.GetObjectCount();
 }
 
 void CookieControlsController::PresentBlockedCookieCounter() {
-  const LocalSharedObjectsContainer& blocked_objects =
-      tab_observer_->tab_specific_content_settings()
-          ->blocked_local_shared_objects();
+  int blocked_cookies = GetBlockedCookieCount();
   for (auto& observer : observers_)
-    observer.OnBlockedCookiesCountChanged(blocked_objects.GetObjectCount());
+    observer.OnBlockedCookiesCountChanged(blocked_cookies);
 }
 
 void CookieControlsController::OnPrefChanged() {
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_controller.h b/chrome/browser/ui/cookie_controls/cookie_controls_controller.h
index d945a7a2..2481c483 100644
--- a/chrome/browser/ui/cookie_controls/cookie_controls_controller.h
+++ b/chrome/browser/ui/cookie_controls/cookie_controls_controller.h
@@ -47,8 +47,6 @@
   // blocking.
   void OnCookieBlockingEnabledForSite(bool block_third_party_cookies);
 
-  // Returns the number of registrable domains with blocked cookies.
-  int GetBlockedDomainCount();
 
   void AddObserver(CookieControlsView* obs);
   void RemoveObserver(CookieControlsView* obs);
@@ -79,6 +77,9 @@
   // Updates the blocked cookie count of |icon_|.
   void PresentBlockedCookieCounter();
 
+  // Returns the number of blocked cookies.
+  int GetBlockedCookieCount();
+
   // Callback for when the cookie controls or third-party cookie blocking
   // preference changes.
   void OnPrefChanged();
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc b/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc
index f2396a8..cd0c50c 100644
--- a/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc
+++ b/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc
@@ -20,7 +20,7 @@
 
 class MockCookieControlsView : public CookieControlsView {
  public:
-  MOCK_METHOD1(OnStatusChanged, void(CookieControlsController::Status));
+  MOCK_METHOD2(OnStatusChanged, void(CookieControlsController::Status, int));
   MOCK_METHOD1(OnBlockedCookiesCountChanged, void(int));
 };
 
@@ -80,8 +80,7 @@
 
 TEST_F(CookieControlsTest, NewTabPage) {
   EXPECT_CALL(*mock(),
-              OnStatusChanged(CookieControlsController::Status::kDisabled));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+              OnStatusChanged(CookieControlsController::Status::kDisabled, 0));
   cookie_controls()->Update(web_contents());
 }
 
@@ -89,8 +88,7 @@
   // Visiting a website should enable the UI.
   NavigateAndCommit(GURL("https://example.com"));
   EXPECT_CALL(*mock(),
-              OnStatusChanged(CookieControlsController::Status::kEnabled));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+              OnStatusChanged(CookieControlsController::Status::kEnabled, 0));
   cookie_controls()->Update(web_contents());
   testing::Mock::VerifyAndClearExpectations(mock());
 
@@ -98,36 +96,31 @@
   EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
   tab_specific_content_settings()->OnWebDatabaseAccessed(
       GURL("https://example.com"), /*blocked=*/false);
-  EXPECT_EQ(0, cookie_controls()->GetBlockedDomainCount());
   testing::Mock::VerifyAndClearExpectations(mock());
 
   // Blocking cookies should update the blocked cookie count.
   EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(1));
   tab_specific_content_settings()->OnWebDatabaseAccessed(
       GURL("https://thirdparty.com"), /*blocked=*/true);
-  EXPECT_EQ(1, cookie_controls()->GetBlockedDomainCount());
   testing::Mock::VerifyAndClearExpectations(mock());
 
   // Navigating somewhere else should reset the cookie count.
   NavigateAndCommit(GURL("https://somethingelse.com"));
   EXPECT_CALL(*mock(),
-              OnStatusChanged(CookieControlsController::Status::kEnabled));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+              OnStatusChanged(CookieControlsController::Status::kEnabled, 0));
   cookie_controls()->Update(web_contents());
 }
 
 TEST_F(CookieControlsTest, PreferenceDisabled) {
   NavigateAndCommit(GURL("https://example.com"));
   EXPECT_CALL(*mock(),
-              OnStatusChanged(CookieControlsController::Status::kEnabled));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+              OnStatusChanged(CookieControlsController::Status::kEnabled, 0));
   cookie_controls()->Update(web_contents());
   testing::Mock::VerifyAndClearExpectations(mock());
 
   // Disabling the feature should disable the UI.
   EXPECT_CALL(*mock(),
-              OnStatusChanged(CookieControlsController::Status::kDisabled));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+              OnStatusChanged(CookieControlsController::Status::kDisabled, 0));
   profile()->GetPrefs()->SetInteger(
       prefs::kCookieControlsMode,
       static_cast<int>(content_settings::CookieControlsMode::kOff));
@@ -137,38 +130,35 @@
 TEST_F(CookieControlsTest, DisableForSite) {
   NavigateAndCommit(GURL("https://example.com"));
   EXPECT_CALL(*mock(),
-              OnStatusChanged(CookieControlsController::Status::kEnabled));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+              OnStatusChanged(CookieControlsController::Status::kEnabled, 0));
   cookie_controls()->Update(web_contents());
   testing::Mock::VerifyAndClearExpectations(mock());
 
   // Disabling cookie blocking for example.com should update the ui.
-  EXPECT_CALL(*mock(), OnStatusChanged(
-                           CookieControlsController::Status::kDisabledForSite));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+  EXPECT_CALL(
+      *mock(),
+      OnStatusChanged(CookieControlsController::Status::kDisabledForSite, 0));
   cookie_controls()->OnCookieBlockingEnabledForSite(false);
   testing::Mock::VerifyAndClearExpectations(mock());
 
   // Visiting some other site, should switch back to kEnabled.
   NavigateAndCommit(GURL("https://somethingelse.com"));
   EXPECT_CALL(*mock(),
-              OnStatusChanged(CookieControlsController::Status::kEnabled));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+              OnStatusChanged(CookieControlsController::Status::kEnabled, 0));
   cookie_controls()->Update(web_contents());
   testing::Mock::VerifyAndClearExpectations(mock());
 
   // Visiting example.com should set status to kDisabledForSite.
   NavigateAndCommit(GURL("https://example.com"));
-  EXPECT_CALL(*mock(), OnStatusChanged(
-                           CookieControlsController::Status::kDisabledForSite));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+  EXPECT_CALL(
+      *mock(),
+      OnStatusChanged(CookieControlsController::Status::kDisabledForSite, 0));
   cookie_controls()->Update(web_contents());
   testing::Mock::VerifyAndClearExpectations(mock());
 
   // Enabling example.com again should change status to kEnabled.
   EXPECT_CALL(*mock(),
-              OnStatusChanged(CookieControlsController::Status::kEnabled));
-  EXPECT_CALL(*mock(), OnBlockedCookiesCountChanged(0));
+              OnStatusChanged(CookieControlsController::Status::kEnabled, 0));
   cookie_controls()->OnCookieBlockingEnabledForSite(true);
   testing::Mock::VerifyAndClearExpectations(mock());
 }
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_view.h b/chrome/browser/ui/cookie_controls/cookie_controls_view.h
index 71f32103..9616dd3 100644
--- a/chrome/browser/ui/cookie_controls/cookie_controls_view.h
+++ b/chrome/browser/ui/cookie_controls/cookie_controls_view.h
@@ -11,7 +11,8 @@
 // Interface for the CookieControls UI.
 class CookieControlsView : public base::CheckedObserver {
  public:
-  virtual void OnStatusChanged(CookieControlsController::Status status) = 0;
+  virtual void OnStatusChanged(CookieControlsController::Status status,
+                               int blocked_cookies) = 0;
   virtual void OnBlockedCookiesCountChanged(int blocked_cookies) = 0;
 };
 
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
index 1c30735..bbcbcca 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
@@ -18,7 +18,7 @@
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/link.h"
-#include "ui/views/layout/fill_layout.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/dialog_client_view.h"
 
@@ -55,19 +55,22 @@
 }
 
 void CookieControlsBubbleView::OnStatusChanged(
-    CookieControlsController::Status new_status) {
-  if (status_ == new_status)
+    CookieControlsController::Status new_status,
+    int blocked_cookies) {
+  if (status_ == new_status) {
+    OnBlockedCookiesCountChanged(blocked_cookies);
     return;
-
-  show_disable_cookie_blocking_ui_ = false;
+  }
+  intermediate_step_ = IntermediateStep::kNone;
   status_ = new_status;
+  blocked_cookies_ = blocked_cookies;
   UpdateUi();
 }
 
 void CookieControlsBubbleView::OnBlockedCookiesCountChanged(
     int blocked_cookies) {
   // The blocked cookie count changes quite frequently, so avoid unnecessary
-  // UI updates and unnecessarily calling GetBlockedDomainCount() if possible.
+  // UI updates if possible.
   if (blocked_cookies_ == blocked_cookies)
     return;
 
@@ -75,14 +78,12 @@
       !blocked_cookies_ || (*blocked_cookies_ > 0) != (blocked_cookies > 0);
   blocked_cookies_ = blocked_cookies;
 
-  text_->SetText(
-      l10n_util::GetPluralStringFUTF16(IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE,
-                                       controller_->GetBlockedDomainCount()));
-
-  // If this only incremented the number of blocked sites, no UI update is
-  // necessary besides the |text_| text.
+  // If this only incremented the number of blocked sites, no full UI update is
+  // necessary besides the title text.
   if (has_blocked_changed)
     UpdateUi();
+  else
+    GetBubbleFrameView()->UpdateWindowTitle();
 }
 
 CookieControlsBubbleView::CookieControlsBubbleView(
@@ -111,10 +112,18 @@
   text_->SetVisible(false);
   header_view_->SetVisible(false);
 
-  if (show_disable_cookie_blocking_ui_) {
+  if (intermediate_step_ == IntermediateStep::kTurnOffButton) {
     text_->SetVisible(true);
     text_->SetText(
         l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_DESCRIPTION));
+  } else if (intermediate_step_ == IntermediateStep::kBlockingIsOn) {
+    header_view_->SetVisible(true);
+    header_view_->SetImage(
+        ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+            IDR_COOKIE_BLOCKING_ON_HEADER));
+    text_->SetVisible(true);
+    text_->SetText(
+        l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE));
   } else if (status_ == CookieControlsController::Status::kEnabled) {
     header_view_->SetVisible(true);
     header_view_->SetImage(
@@ -122,6 +131,9 @@
             has_blocked_cookies ? IDR_COOKIE_BLOCKING_ON_HEADER
                                 : IDR_COOKIE_BLOCKING_INACTIVE_HEADER));
     text_->SetVisible(true);
+    text_->SetText(l10n_util::GetStringUTF16(
+        has_blocked_cookies ? IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE
+                            : IDS_COOKIE_CONTROLS_NOTHING_BLOCKED_MESSAGE));
     not_working_link_->SetVisible(has_blocked_cookies);
     blocked_cookies_.reset();
   } else {
@@ -136,7 +148,7 @@
   // The show_disable_cookie_blocking_ui_ state has a different title
   // configuration. To avoid jumping UI, don't resize the bubble. This should be
   // safe as the bubble in this state has less content than in Enabled state.
-  if (!show_disable_cookie_blocking_ui_)
+  if (intermediate_step_ != IntermediateStep::kTurnOffButton)
     SizeToContents();
 }
 
@@ -148,7 +160,7 @@
 }
 
 int CookieControlsBubbleView::GetDialogButtons() const {
-  if (show_disable_cookie_blocking_ui_ ||
+  if (intermediate_step_ == IntermediateStep::kTurnOffButton ||
       status_ == CookieControlsController::Status::kDisabledForSite) {
     return ui::DIALOG_BUTTON_OK;
   }
@@ -157,16 +169,21 @@
 
 base::string16 CookieControlsBubbleView::GetDialogButtonLabel(
     ui::DialogButton button) const {
-  if (show_disable_cookie_blocking_ui_)
+  if (intermediate_step_ == IntermediateStep::kTurnOffButton)
     return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON);
   DCHECK_EQ(status_, CookieControlsController::Status::kDisabledForSite);
+  DCHECK_EQ(intermediate_step_, IntermediateStep::kNone);
   return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_ON_BUTTON);
 }
 
 void CookieControlsBubbleView::Init() {
-  SetLayoutManager(std::make_unique<views::FillLayout>());
+  // Use a BoxLayout because the view might be larger than |text_| and we want
+  // |text_| at the top.
+  SetLayoutManager(std::make_unique<views::BoxLayout>(
+      views::BoxLayout::Orientation::kVertical));
   auto text = std::make_unique<views::Label>(base::string16(),
-                                             views::style::CONTEXT_LABEL);
+                                             views::style::CONTEXT_LABEL,
+                                             views::style::STYLE_SECONDARY);
   text->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
   text->SetMultiLine(true);
   text_ = AddChildView(std::move(text));
@@ -196,11 +213,19 @@
 }
 
 base::string16 CookieControlsBubbleView::GetWindowTitle() const {
-  if (show_disable_cookie_blocking_ui_)
-    return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE);
+  switch (intermediate_step_) {
+    case IntermediateStep::kTurnOffButton:
+      return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE);
+    case IntermediateStep::kBlockingIsOn:
+      return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURNED_ON_TITLE);
+    case IntermediateStep::kNone: {
+      // Determine title based on status_ instead.
+    }
+  }
   switch (status_) {
     case CookieControlsController::Status::kEnabled:
-      return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_DIALOG_TITLE);
+      return l10n_util::GetPluralStringFUTF16(IDS_COOKIE_CONTROLS_DIALOG_TITLE,
+                                              blocked_cookies_.value_or(0));
     case CookieControlsController::Status::kDisabledForSite:
       return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_DIALOG_TITLE_OFF);
     case CookieControlsController::Status::kUninitialized:
@@ -230,11 +255,14 @@
 }
 
 bool CookieControlsBubbleView::Accept() {
-  if (show_disable_cookie_blocking_ui_) {
+  if (intermediate_step_ == IntermediateStep::kTurnOffButton) {
     controller_->OnCookieBlockingEnabledForSite(false);
   } else {
     DCHECK_EQ(status_, CookieControlsController::Status::kDisabledForSite);
+    DCHECK_EQ(intermediate_step_, IntermediateStep::kNone);
     controller_->OnCookieBlockingEnabledForSite(true);
+    intermediate_step_ = IntermediateStep::kBlockingIsOn;
+    UpdateUi();
   }
   return false;
 }
@@ -249,6 +277,6 @@
   DCHECK_EQ(status_, CookieControlsController::Status::kEnabled);
   // Don't go through the controller as this is an intermediary state that
   // is only relevant for the bubble UI.
-  show_disable_cookie_blocking_ui_ = true;
+  intermediate_step_ = IntermediateStep::kTurnOffButton;
   UpdateUi();
 }
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
index 79e17f1..78b0864 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
@@ -38,10 +38,19 @@
   static CookieControlsBubbleView* GetCookieBubble();
 
   // CookieControlsView:
-  void OnStatusChanged(CookieControlsController::Status status) override;
+  void OnStatusChanged(CookieControlsController::Status status,
+                       int blocked_cookies) override;
   void OnBlockedCookiesCountChanged(int blocked_cookies) override;
 
  private:
+  enum class IntermediateStep {
+    kNone,
+    // Show a button to disable cookie blocking on the current site.
+    kTurnOffButton,
+    // Show a confirmation that cookie blocking was turned on.
+    kBlockingIsOn,
+  };
+
   CookieControlsBubbleView(views::View* anchor_view,
                            content::WebContents* web_contents,
                            CookieControlsController* cookie_contols);
@@ -72,9 +81,7 @@
   CookieControlsController::Status status_ =
       CookieControlsController::Status::kUninitialized;
 
-  // If true, display an intermediate step with a button to disable cookie
-  // blocking on the current site.
-  bool show_disable_cookie_blocking_ui_ = false;
+  IntermediateStep intermediate_step_ = IntermediateStep::kNone;
 
   base::Optional<int> blocked_cookies_;
 
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.cc
index 617c706..95b616f4 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.cc
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.cc
@@ -40,12 +40,14 @@
 }
 
 void CookieControlsIconView::OnStatusChanged(
-    CookieControlsController::Status status) {
+    CookieControlsController::Status status,
+    int blocked_cookies) {
   if (status_ != status) {
     status_ = status;
     SetVisible(ShouldBeVisible());
     UpdateIconImage();
   }
+  OnBlockedCookiesCountChanged(blocked_cookies);
 }
 
 void CookieControlsIconView::OnBlockedCookiesCountChanged(int blocked_cookies) {
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h b/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h
index 6669394..51d70664 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_icon_view.h
@@ -21,7 +21,8 @@
   ~CookieControlsIconView() override;
 
   // CookieControlsUI:
-  void OnStatusChanged(CookieControlsController::Status status) override;
+  void OnStatusChanged(CookieControlsController::Status status,
+                       int blocked_cookies) override;
   void OnBlockedCookiesCountChanged(int blocked_cookies) override;
 
   // PageActionIconView:
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
index adddf25..12d4f78 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -80,6 +80,37 @@
   return 20;
 }
 
+// Returns the avatar image for the current profile. May be called only in
+// "normal" states where the user is guaranteed to have an avatar image (i.e.
+// not kGenericProfile, not kGuestSession and not kIncognitoProfile).
+const gfx::Image& GetAvatarImage(Profile* profile,
+                                 const gfx::Image& user_identity_image) {
+  ProfileAttributesEntry* entry = GetProfileAttributesEntry(profile);
+  DCHECK(entry);
+  // TODO(crbug.com/1012179): If kPersistUPAInProfileInfoCache feature is on, it
+  // should suffice to call entry->GetAvatarIcon(). For this to work well, this
+  // class needs to observe ProfileAttributesStorage instead of (or on top of)
+  // IdentityManager. Only then we can rely on |entry| being up to date (as the
+  // storage also observes IdentityManager so there's no guarantee on the order
+  // of notifications).
+  if (entry->IsUsingGAIAPicture() && entry->GetGAIAPicture())
+    return *entry->GetGAIAPicture();
+
+  // Show |user_identity_image| when the following conditions are satisfied:
+  //  - the user is migrated to Dice
+  //  - the user isn't syncing
+  //  - the profile icon wasn't explicitly changed
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile);
+  if (!user_identity_image.IsEmpty() &&
+      AccountConsistencyModeManager::IsDiceEnabledForProfile(profile) &&
+      !identity_manager->HasPrimaryAccount() && entry->IsUsingDefaultAvatar()) {
+    return user_identity_image;
+  }
+
+  return entry->GetAvatarIcon();
+}
+
 }  // namespace
 
 AvatarToolbarButton::AvatarToolbarButton(Browser* browser)
@@ -155,13 +186,13 @@
   // button is not yet added to the ToolbarView's hierarchy.
   if (!GetWidget())
     return;
-  gfx::Image gaia_image = GetGaiaImage();
-  SetImage(views::Button::STATE_NORMAL, GetAvatarIcon(gaia_image));
+  gfx::Image user_identity_image = GetUserIdentityImage();
+  SetImage(views::Button::STATE_NORMAL, GetAvatarIcon(user_identity_image));
 
   // TODO(crbug.com/990286): Get rid of this logic completely when we cache the
   // Google account image in the profile cache and thus it is always available.
   if (identity_animation_state_ == IdentityAnimationState::kWaitingForImage &&
-      !gaia_image.IsEmpty()) {
+      !user_identity_image.IsEmpty()) {
     ShowIdentityAnimation();
   }
 }
@@ -230,12 +261,6 @@
   SetHighlight(text, color);
 }
 
-void AvatarToolbarButton::SetAutofillIconVisible(bool autofill_icon_visible) {
-  DCHECK_NE(GetState(), State::kIncognitoProfile);
-  autofill_icon_visible_ = autofill_icon_visible;
-  UpdateText();
-}
-
 void AvatarToolbarButton::ShowAvatarHighlightAnimation() {
   DCHECK_NE(GetState(), State::kIncognitoProfile);
   DCHECK_NE(GetState(), State::kGuestSession);
@@ -448,7 +473,7 @@
 }
 
 gfx::ImageSkia AvatarToolbarButton::GetAvatarIcon(
-    const gfx::Image& gaia_image) const {
+    const gfx::Image& user_identity_image) const {
   const int icon_size = ui::MaterialDesignController::touch_ui()
                             ? kDefaultTouchableIconSize
                             : GetIconSizeForNonTouchUi();
@@ -472,15 +497,10 @@
     case State::kSyncError:
     case State::kSyncPaused:
     case State::kNormal:
-      if (!gaia_image.IsEmpty()) {
-        return profiles::GetSizedAvatarIcon(gaia_image, true, icon_size,
-                                            icon_size, profiles::SHAPE_CIRCLE)
-            .AsImageSkia();
-      }
       // Profile attributes are non-null since the state is not kGenericProfile.
-      gfx::Image avatar_icon =
-          GetProfileAttributesEntry(profile_)->GetAvatarIcon();
-      return profiles::GetSizedAvatarIcon(avatar_icon, true, icon_size,
+      const gfx::Image& avatar_image =
+          GetAvatarImage(profile_, user_identity_image);
+      return profiles::GetSizedAvatarIcon(avatar_image, true, icon_size,
                                           icon_size, profiles::SHAPE_CIRCLE)
           .AsImageSkia();
   }
@@ -488,35 +508,10 @@
   return gfx::ImageSkia();
 }
 
-gfx::Image AvatarToolbarButton::GetGaiaImage() const {
-  ProfileAttributesEntry* entry = GetProfileAttributesEntry(profile_);
-  if (!entry) {
-    // This can happen if the user deletes the current profile.
-    return gfx::Image();
-  }
-
-  // If there is a GAIA image available, try to use that.
-  if (entry->IsUsingGAIAPicture()) {
-    // The GetGAIAPicture API call will trigger an async image load from disk if
-    // it has not been loaded.
-    const gfx::Image* gaia_image = entry->GetGAIAPicture();
-
-    if (gaia_image)
-      return *gaia_image;
-    return gfx::Image();
-  }
-
-  // Try to show the first account icon of the sync promo when the following
-  // conditions are satisfied:
-  //  - the user is migrated to Dice
-  //  - the user isn't signed in
-  //  - the profile icon wasn't explicitly changed
+gfx::Image AvatarToolbarButton::GetUserIdentityImage() const {
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile_);
-  if (AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_) &&
-      !identity_manager->HasPrimaryAccount() &&
-      identity_manager->HasUnconsentedPrimaryAccount() &&
-      entry->IsUsingDefaultAvatar()) {
+  if (identity_manager && identity_manager->HasUnconsentedPrimaryAccount()) {
     base::Optional<AccountInfo> account_info =
         identity_manager
             ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
@@ -553,7 +548,7 @@
 
 #if !defined(OS_CHROMEOS)
   if (identity_manager->HasPrimaryAccount() && profile_->IsSyncAllowed() &&
-      error_controller_.HasAvatarError() && !autofill_icon_visible_) {
+      error_controller_.HasAvatarError()) {
     // When DICE is enabled and the error is an auth error, the sync-paused
     // icon is shown.
     int unused;
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
index 308d550..621e08e 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
@@ -36,7 +36,6 @@
 
   void UpdateIcon();
   void UpdateText();
-  void SetAutofillIconVisible(bool autofill_icon_visible);
   void ShowAvatarHighlightAnimation();
 
  private:
@@ -109,8 +108,12 @@
 
   base::string16 GetAvatarTooltipText() const;
   base::string16 GetProfileName() const;
-  gfx::ImageSkia GetAvatarIcon(const gfx::Image& gaia_image) const;
-  gfx::Image GetGaiaImage() const;
+  gfx::ImageSkia GetAvatarIcon(const gfx::Image& user_identity_image) const;
+
+  // Returns the image of the unconsented primary account (if exists and already
+  // loaded), otherwise empty.
+  gfx::Image GetUserIdentityImage() const;
+
   State GetState() const;
 
   void SetInsets();
@@ -132,11 +135,6 @@
   // button sync paused/error state and update highlight color.
   bool highlight_animation_visible_ = false;
 
-  // Whether any autofill icon is visible in |this|'s parent container. Set by
-  // |ToolbarPageActionIconContainerView|. If true, hide avatar button sync
-  // paused/error state.
-  bool autofill_icon_visible_ = false;
-
   IdentityAnimationState identity_animation_state_ =
       IdentityAnimationState::kNotShowing;
 
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
index e0c5595..f452966 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -296,7 +296,7 @@
   gfx::ImageSkia sized_image =
       image.isNull()
           ? gfx::CreateVectorIcon(kUserAccountAvatarIcon, kIdentityImageSize,
-                                  kIdentityImageSize)
+                                  GetDefaultIconColor())
           : CropCircle(SizeImage(image, kIdentityImageSize));
   gfx::ImageSkia sized_badge =
       AddCircularBackground(SizeImage(badge, kBadgeSize), SK_ColorWHITE,
@@ -409,9 +409,6 @@
             views::BoxLayout::Orientation::kVertical));
   }
 
-  account_features_container_->AddChildView(
-      std::make_unique<views::Separator>());
-
   views::Button* button =
       account_features_container_->AddChildView(std::make_unique<HoverButton>(
           this, SizeImage(ColorImage(icon, GetDefaultIconColor()), kIconSize),
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
index 496e453..3d5bb3d 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -60,6 +60,7 @@
 #include "ui/events/event_utils.h"
 #include "ui/views/controls/button/label_button.h"
 #include "ui/views/controls/webview/webview.h"
+#include "ui/views/test/widget_test.h"
 
 namespace {
 
@@ -631,7 +632,9 @@
     ASSERT_NO_FATAL_FAILURE(OpenProfileMenu());
     AdvanceFocus(/*count=*/GetParam() + 1);
     ASSERT_TRUE(GetFocusedItem());
-    ClickFocusedItem();
+    Click(GetFocusedItem());
+    LOG(INFO) << "Clicked item at index " << GetParam();
+    base::RunLoop().RunUntilIdle();
 
     histogram_tester_.ExpectUniqueSample(
         "Profile.Menu.ClickedActionableItem",
@@ -655,15 +658,30 @@
   void OpenProfileMenu() {
     BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(
         target_browser_ ? target_browser_ : browser());
+
+    // Click the avatar button to open the menu.
     views::View* avatar_button =
         browser_view->toolbar()->GetAvatarToolbarButton();
-    DCHECK(avatar_button);
+    ASSERT_TRUE(avatar_button);
+    Click(avatar_button);
 
-    ui::MouseEvent e(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
-                     ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0);
-    avatar_button->OnMousePressed(e);
+    ASSERT_TRUE(profile_menu_view());
+    profile_menu_view()->set_close_on_deactivate(false);
 
-    ASSERT_TRUE(ProfileMenuView::IsShowing());
+#if defined(OS_MACOSX)
+    base::RunLoop().RunUntilIdle();
+#else
+    // If possible wait until the menu is active.
+    views::Widget* menu_widget = profile_menu_view()->GetWidget();
+    ASSERT_TRUE(menu_widget);
+    if (menu_widget->CanActivate()) {
+      views::test::WidgetActivationWaiter(menu_widget, /*active=*/true).Wait();
+    } else {
+      LOG(ERROR) << "menu_widget can not be activated";
+    }
+#endif
+
+    LOG(INFO) << "Opening profile menu was successful";
   }
 
   void AdvanceFocus(int count) {
@@ -675,19 +693,20 @@
     return profile_menu_view()->GetFocusManager()->GetFocusedView();
   }
 
-  void ClickFocusedItem() {
+  void Click(views::View* clickable_view) {
     // Simulate a mouse click. Note: Buttons are either fired when pressed or
     // when released, so the corresponding methods need to be called.
-    GetFocusedItem()->OnMousePressed(
+    clickable_view->OnMousePressed(
         ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
                        ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0));
-    GetFocusedItem()->OnMouseReleased(
+    clickable_view->OnMouseReleased(
         ui::MouseEvent(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
                        ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 0));
   }
 
-  views::View* profile_menu_view() {
-    return ProfileMenuViewBase::GetBubbleForTesting();
+  ProfileMenuView* profile_menu_view() {
+    return static_cast<ProfileMenuView*>(
+        ProfileMenuViewBase::GetBubbleForTesting());
   }
 
   base::test::ScopedFeatureList scoped_feature_list_;
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc
index d8ab19a..0ce5545 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -1915,6 +1915,15 @@
   for (size_t i = 0; i < tabs_dragging.size(); ++i)
     tabs_dragging[i]->Paint(paint_info);
 
+  // If dragging more than one grouped tab, paint the group underline above
+  // those tabs. Otherwise, the non-active tabs will not get an underline.
+  // All dragging tabs should belong to the same group, per TabDragController.
+  if (tabs_dragging.size() > 0) {
+    const base::Optional<TabGroupId> dragged_group = tabs_dragging[0]->group();
+    if (dragged_group.has_value())
+      group_underlines_[dragged_group.value()]->Paint(paint_info);
+  }
+
   // If the active tab is being dragged, it goes last.
   if (active_tab && is_dragging)
     active_tab->Paint(paint_info);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc
index 6bf4a7c6d..9fcf99a 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.cc
@@ -73,18 +73,6 @@
   UpdateAllIcons();
 }
 
-void ToolbarAccountIconContainerView::ChildVisibilityChanged(View* child) {
-  // The avatar should not show UI for paused state or error state when any icon
-  // in the toolbar page action icon container view is visible.
-  // If it is in Incognito window, the avatar button shows a text "Incognito"
-  // which should not be updated in any case.
-  if (browser_->profile()->IsIncognitoProfile())
-    return;
-
-  avatar_->SetAutofillIconVisible(
-      page_action_icon_container_view_->IsAnyIconVisible());
-}
-
 SkColor ToolbarAccountIconContainerView::GetIconColor() const {
   return GetThemeProvider()->GetColor(
       ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.h b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.h
index 6e48c71..a0ce1a6 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_view.h
@@ -32,7 +32,6 @@
 
   // views::View:
   void OnThemeChanged() override;
-  void ChildVisibilityChanged(View* child) override;
 
   PageActionIconContainerView* page_action_icon_container() {
     return page_action_icon_container_view_;
diff --git a/chrome/browser/ui/webui/signin/user_manager_screen_handler.h b/chrome/browser/ui/webui/signin/user_manager_screen_handler.h
index 0e405c5..87dc733 100644
--- a/chrome/browser/ui/webui/signin/user_manager_screen_handler.h
+++ b/chrome/browser/ui/webui/signin/user_manager_screen_handler.h
@@ -69,7 +69,6 @@
   void HandleRemoveUser(const base::ListValue* args);
   void HandleAreAllProfilesLocked(const base::ListValue* args);
   void HandleRemoveUserWarningLoadStats(const base::ListValue* args);
-  void HandleGetRemoveWarningDialogMessage(const base::ListValue* args);
 
   // Function used to gather statistics from a profile.
   void GatherStatistics(base::Time start_time, Profile* profile);
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
index 7351322..bf4ac9e 100644
--- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -3286,11 +3286,9 @@
 
 #if BUILDFLAG(SAFE_BROWSING_DB_LOCAL)
 // Verify CheckSafeBrowsingReputation() is called when user starts filling
-// username or password field, and that this function is only called once.
-// TODO(crbug.com/1008402): Enable this test after fixing the linked bug.
-TEST_F(
-    PasswordAutofillAgentTest,
-    DISABLED_CheckSafeBrowsingReputationWhenUserStartsFillingUsernamePassword) {
+// a password field, and that this function is only called once.
+TEST_F(PasswordAutofillAgentTest,
+       CheckSafeBrowsingReputationWhenUserStartsFillingUsernamePassword) {
   ASSERT_EQ(0, fake_driver_.called_check_safe_browsing_reputation_cnt());
   // Simulate a click on password field to set its on focus,
   // CheckSafeBrowsingReputation() should be called.
@@ -3302,14 +3300,20 @@
   SimulatePasswordTyping("modify");
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, fake_driver_.called_check_safe_browsing_reputation_cnt());
+
+  // No CheckSafeBrowsingReputation() call on username field click.
   SimulateElementClick(kUsernameName);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1, fake_driver_.called_check_safe_browsing_reputation_cnt());
 
-  // Navigate to another page and click on username field,
+  SimulateElementClick(kPasswordName);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(1, fake_driver_.called_check_safe_browsing_reputation_cnt());
+
+  // Navigate to another page and click on password field,
   // CheckSafeBrowsingReputation() should be triggered again.
   LoadHTML(kFormHTML);
-  SimulateElementClick(kUsernameName);
+  SimulateElementClick(kPasswordName);
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(2, fake_driver_.called_check_safe_browsing_reputation_cnt());
 }
diff --git a/chrome/renderer/translate/translate_script_browsertest.cc b/chrome/renderer/translate/translate_script_browsertest.cc
index 80d3ac87..69740d0 100644
--- a/chrome/renderer/translate/translate_script_browsertest.cc
+++ b/chrome/renderer/translate/translate_script_browsertest.cc
@@ -79,11 +79,9 @@
 
  protected:
   void InjectElementLibrary() {
-    std::string script;
-    base::StringPiece translate_js =
-        ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
+    std::string script =
+        ui::ResourceBundle::GetSharedInstance().DecompressDataResource(
             IDR_TRANSLATE_JS);
-    translate_js.CopyToString(&script);
     script += kElementJs;
     ExecuteScript(script);
   }
diff --git a/chrome/test/data/extensions/api_test/certificate_provider/request_pin/operated.js b/chrome/test/data/extensions/api_test/certificate_provider/request_pin/operated.js
index c3e0264..f270c478 100644
--- a/chrome/test/data/extensions/api_test/certificate_provider/request_pin/operated.js
+++ b/chrome/test/data/extensions/api_test/certificate_provider/request_pin/operated.js
@@ -5,8 +5,9 @@
 // The script runs commands against the PIN API that it receives from the C++
 // side.
 
-const SIGN_REQUEST_ID = 123;
+const INITIAL_SIGN_REQUEST_ID = 123;
 
+let signRequestId = INITIAL_SIGN_REQUEST_ID;
 let pinRequestCount = 0;
 let pinRequestStopCount = 0;
 
@@ -59,20 +60,23 @@
 function processTestCommand(command) {
   switch (command) {
     case 'Request':
-      requestPin({signRequestId: SIGN_REQUEST_ID});
+      requestPin({signRequestId: signRequestId});
       break;
     case 'RequestWithZeroAttempts':
-      requestPin({signRequestId: SIGN_REQUEST_ID, attemptsLeft: 0});
+      requestPin({signRequestId: signRequestId, attemptsLeft: 0});
       break;
     case 'RequestWithNegativeAttempts':
-      requestPin({signRequestId: SIGN_REQUEST_ID, attemptsLeft: -1});
+      requestPin({signRequestId: signRequestId, attemptsLeft: -1});
       break;
     case 'Stop':
-      stopPinRequest({signRequestId: SIGN_REQUEST_ID});
+      stopPinRequest({signRequestId: signRequestId});
       break;
     case 'StopWithUnknownError':
       stopPinRequest(
-          {signRequestId: SIGN_REQUEST_ID, errorType: 'UNKNOWN_ERROR'});
+          {signRequestId: signRequestId, errorType: 'UNKNOWN_ERROR'});
+      break;
+    case 'IncrementRequestId':
+      ++signRequestId;
       break;
     default:
       chrome.test.fail();
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
index 85c1ea8..5ebb16b 100644
--- a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
+++ b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
@@ -351,7 +351,7 @@
   ]),
 };
 
-TEST_F('CrElementsFingerprintProgressArcTest', 'All', function() {
+TEST_F('CrElementsFingerprintProgressArcTest', 'DISABLED_All', function() {
   mocha.run();
 });
 
diff --git a/components/arc/mojom/intent_common.mojom b/components/arc/mojom/intent_common.mojom
index d18b11e..aedd017e 100644
--- a/components/arc/mojom/intent_common.mojom
+++ b/components/arc/mojom/intent_common.mojom
@@ -10,6 +10,7 @@
   VIEW,           // Can handle only one URL.
   SEND,           // Can handle only one URL.
   SEND_MULTIPLE,  // Can handle multiple URLs.
+  CREATE_NOTE,    // Can handle only one URL.
 };
 
 // Describes an activity.
diff --git a/components/arc/session/arc_vm_client_adapter.cc b/components/arc/session/arc_vm_client_adapter.cc
index 5e13fe0..cec142fd 100644
--- a/components/arc/session/arc_vm_client_adapter.cc
+++ b/components/arc/session/arc_vm_client_adapter.cc
@@ -32,11 +32,19 @@
 }  // namespace
 
 class ArcVmClientAdapter : public ArcClientAdapter,
-                           public chromeos::ConciergeClient::VmObserver {
+                           public chromeos::ConciergeClient::VmObserver,
+                           public chromeos::ConciergeClient::Observer {
  public:
-  ArcVmClientAdapter() { GetConciergeClient()->AddVmObserver(this); }
+  ArcVmClientAdapter() {
+    auto* client = GetConciergeClient();
+    client->AddVmObserver(this);
+    client->AddObserver(this);
+  }
+
   ~ArcVmClientAdapter() override {
-    GetConciergeClient()->RemoveVmObserver(this);
+    auto* client = GetConciergeClient();
+    client->RemoveObserver(this);
+    client->RemoveVmObserver(this);
   }
 
   // chromeos::ConciergeClient::VmObserver overrides:
@@ -95,6 +103,8 @@
 
   void StopArcInstance() override {
     VLOG(1) << "Stopping arcvm";
+    // TODO(yusukes): This method should eventually call ArcInstanceStopped()
+    // even when only the (yet nonexistent) 'mini' VM is running.
     std::vector<std::string> env{{"USER_ID_HASH=" + user_id_hash_}};
     chromeos::UpstartClient::Get()->StopJob(
         "arcvm", env,
@@ -107,6 +117,16 @@
     user_id_hash_ = hash;
   }
 
+  // chromeos::ConciergeClient::Observer overrides:
+  void ConciergeServiceStopped() override {
+    VLOG(1) << "vm_concierge stopped";
+    // At this point, all crosvm processes are gone. Notify the observer of the
+    // event.
+    OnArcInstanceStopped();
+  }
+
+  void ConciergeServiceRestarted() override {}
+
  private:
   void OnArcInstanceStopped() {
     VLOG(1) << "arcvm stopped.";
diff --git a/components/arc/test/fake_file_system_instance.cc b/components/arc/test/fake_file_system_instance.cc
index 5a10403..ef07647 100644
--- a/components/arc/test/fake_file_system_instance.cc
+++ b/components/arc/test/fake_file_system_instance.cc
@@ -565,6 +565,7 @@
     mojom::OpenUrlsRequestPtr request,
     OpenUrlsWithPermissionCallback callback) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  handled_url_requests_.emplace_back(std::move(request));
 }
 
 std::string FakeFileSystemInstance::FindChildDocumentId(
diff --git a/components/arc/test/fake_file_system_instance.h b/components/arc/test/fake_file_system_instance.h
index ffe8595..47f64df 100644
--- a/components/arc/test/fake_file_system_instance.h
+++ b/components/arc/test/fake_file_system_instance.h
@@ -217,6 +217,14 @@
   // |bytes| bytes.
   std::string GetFileContent(const std::string& url, size_t bytes);
 
+  // For clearing the list of handled requests
+  void clear_handled_requests() { handled_url_requests_.clear(); }
+
+  // For validating the url requests in testing.
+  const std::vector<mojom::OpenUrlsRequestPtr>& handledUrlRequests() const {
+    return handled_url_requests_;
+  }
+
   // mojom::FileSystemInstance:
   void AddWatcher(const std::string& authority,
                   const std::string& document_id,
@@ -326,6 +334,9 @@
   // Mapping from a watcher ID to a document key.
   std::map<int64_t, DocumentKey> watcher_to_document_;
 
+  // List of all OpenUrlsRequests made to the fake_file_system_instance
+  std::vector<mojom::OpenUrlsRequestPtr> handled_url_requests_;
+
   // List of roots added by AddRoot().
   std::vector<Root> roots_;
 
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
index 16cb2898..88ff0eaf 100644
--- a/components/autofill/content/renderer/password_autofill_agent.cc
+++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -736,33 +736,27 @@
   return true;
 }
 
-bool PasswordAutofillAgent::IsUsernameOrPasswordField(
+void PasswordAutofillAgent::MaybeCheckSafeBrowsingReputation(
     const WebInputElement& element) {
+  // Enabled on desktop and Android
+#if BUILDFLAG(FULL_SAFE_BROWSING) || BUILDFLAG(SAFE_BROWSING_DB_REMOTE)
   // Note: A site may use a Password field to collect a CVV or a Credit Card
   // number, but showing a slightly misleading warning here is better than
   // showing no warning at all.
-  if (element.IsPasswordFieldForAutofill())
-    return true;
+  if (!element.IsPasswordFieldForAutofill())
+    return;
+  if (checked_safe_browsing_reputation_)
+    return;
 
-  // If a field declares itself a username input, show the warning.
-  if (AutocompleteFlagForElement(element) == AutocompleteFlag::USERNAME)
-    return true;
-
-  // Otherwise, analyze the form and return true if this input element seems
-  // to be the username field.
-  std::unique_ptr<PasswordForm> password_form;
-  if (element.Form().IsNull()) {
-    // To double check that element's frame and |render_frame()->GetWebFrame()|
-    // which is used in |GetPasswordFormFromUnownedInputElements| are identical.
-    DCHECK_EQ(element.GetDocument().GetFrame(), render_frame()->GetWebFrame());
-    password_form = GetPasswordFormFromUnownedInputElements();
-  } else {
-    password_form = GetPasswordFormFromWebForm(element.Form());
-  }
-
-  if (!password_form)
-    return false;
-  return (password_form->username_element == element.NameForAutofill().Utf16());
+  checked_safe_browsing_reputation_ = true;
+  WebLocalFrame* frame = render_frame()->GetWebFrame();
+  GURL frame_url = GURL(frame->GetDocument().Url());
+  GURL action_url = element.Form().IsNull()
+                        ? GURL()
+                        : form_util::GetCanonicalActionForForm(element.Form());
+  GetPasswordManagerDriver()->CheckSafeBrowsingReputation(action_url,
+                                                          frame_url);
+#endif
 }
 
 bool PasswordAutofillAgent::TryToShowTouchToFill(
@@ -793,22 +787,7 @@
 
   if (!FindPasswordInfoForElement(element, &username_element, &password_element,
                                   &password_info)) {
-    if (IsUsernameOrPasswordField(element)) {
-      WebLocalFrame* frame = render_frame()->GetWebFrame();
-      GURL frame_url = GURL(frame->GetDocument().Url());
-// Enabled on desktop and Android
-#if BUILDFLAG(FULL_SAFE_BROWSING) || BUILDFLAG(SAFE_BROWSING_DB_REMOTE)
-      if (!checked_safe_browsing_reputation_) {
-        checked_safe_browsing_reputation_ = true;
-        GURL action_url =
-            element.Form().IsNull()
-                ? GURL()
-                : form_util::GetCanonicalActionForForm(element.Form());
-        GetPasswordManagerDriver()->CheckSafeBrowsingReputation(action_url,
-                                                                frame_url);
-      }
-#endif
-    }
+    MaybeCheckSafeBrowsingReputation(element);
     return false;
   }
 
diff --git a/components/autofill/content/renderer/password_autofill_agent.h b/components/autofill/content/renderer/password_autofill_agent.h
index 8f910d4..22a03b2 100644
--- a/components/autofill/content/renderer/password_autofill_agent.h
+++ b/components/autofill/content/renderer/password_autofill_agent.h
@@ -172,8 +172,9 @@
   bool DidClearAutofillSelection(
       const blink::WebFormControlElement& control_element);
 
-  // Returns whether the element is a username or password textfield.
-  bool IsUsernameOrPasswordField(const blink::WebInputElement& element);
+  // Sends a reputation check request in case if |element| has type password and
+  // no check request were sent from this frame load.
+  void MaybeCheckSafeBrowsingReputation(const blink::WebInputElement& element);
 
   // Asks the agent to show the touch to fill UI for |control_element|. Returns
   // whether the agent was able to do so.
diff --git a/components/autofill/content/renderer/password_form_conversion_utils.cc b/components/autofill/content/renderer/password_form_conversion_utils.cc
index 597a023..c60a5360fb 100644
--- a/components/autofill/content/renderer/password_form_conversion_utils.cc
+++ b/components/autofill/content/renderer/password_form_conversion_utils.cc
@@ -33,83 +33,6 @@
 
 namespace {
 
-constexpr char kAutocompleteUsername[] = "username";
-constexpr char kAutocompleteCurrentPassword[] = "current-password";
-constexpr char kAutocompleteNewPassword[] = "new-password";
-constexpr char kAutocompleteCreditCardPrefix[] = "cc-";
-
-// Parses the string with the value of an autocomplete attribute. If any of the
-// tokens "username", "current-password" or "new-password" are present, returns
-// an appropriate enum value, picking an arbitrary one if more are applicable.
-// Otherwise, it returns CREDIT_CARD if a token with a "cc-" prefix is found.
-// Otherwise, returns NONE.
-AutocompleteFlag ExtractAutocompleteFlag(const std::string& attribute) {
-  std::vector<base::StringPiece> tokens =
-      base::SplitStringPiece(attribute, base::kWhitespaceASCII,
-                             base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
-  bool cc_seen = false;
-  for (base::StringPiece token : tokens) {
-    if (base::LowerCaseEqualsASCII(token, kAutocompleteUsername))
-      return AutocompleteFlag::USERNAME;
-    if (base::LowerCaseEqualsASCII(token, kAutocompleteCurrentPassword))
-      return AutocompleteFlag::CURRENT_PASSWORD;
-    if (base::LowerCaseEqualsASCII(token, kAutocompleteNewPassword))
-      return AutocompleteFlag::NEW_PASSWORD;
-
-    if (!cc_seen) {
-      cc_seen = base::StartsWith(token, kAutocompleteCreditCardPrefix,
-                                 base::CompareCase::SENSITIVE);
-    }
-  }
-  return cc_seen ? AutocompleteFlag::CREDIT_CARD : AutocompleteFlag::NONE;
-}
-
-// Helper to spare map::find boilerplate when caching field's autocomplete
-// attributes.
-class AutocompleteCache {
- public:
-  AutocompleteCache();
-
-  ~AutocompleteCache();
-
-  // Computes and stores the AutocompleteFlag for |field| based on its
-  // autocomplete attribute. Note that this cannot be done on-demand during
-  // RetrieveFor, because the cache spares space and look-up time by not storing
-  // AutocompleteFlag::NONE values, hence for all elements without an
-  // autocomplete attribute, every retrieval would result in a new computation.
-  void Store(const FormFieldData* field);
-
-  // Retrieves the value previously stored for |field|.
-  AutocompleteFlag RetrieveFor(const FormFieldData* field) const;
-
- private:
-  std::map<const FormFieldData*, AutocompleteFlag> cache_;
-
-  DISALLOW_COPY_AND_ASSIGN(AutocompleteCache);
-};
-
-AutocompleteCache::AutocompleteCache() = default;
-
-AutocompleteCache::~AutocompleteCache() = default;
-
-void AutocompleteCache::Store(const FormFieldData* field) {
-  const AutocompleteFlag flag =
-      ExtractAutocompleteFlag(field->autocomplete_attribute);
-  // Only store non-trivial flags. Most of the elements will have the NONE
-  // value, so spare storage and lookup time by assuming anything not stored in
-  // |cache_| has the NONE flag.
-  if (flag != AutocompleteFlag::NONE)
-    cache_[field] = flag;
-}
-
-AutocompleteFlag AutocompleteCache::RetrieveFor(
-    const FormFieldData* field) const {
-  auto it = cache_.find(field);
-  if (it == cache_.end())
-    return AutocompleteFlag::NONE;
-  return it->second;
-}
-
 const char kPasswordSiteUrlRegex[] =
     "passwords(?:-[a-z-]+\\.corp)?\\.google\\.com";
 
@@ -151,13 +74,6 @@
 
 }  // namespace
 
-AutocompleteFlag AutocompleteFlagForElement(const WebInputElement& element) {
-  static const base::NoDestructor<WebString> kAutocomplete(("autocomplete"));
-  return ExtractAutocompleteFlag(
-      element.GetAttribute(*kAutocomplete)
-          .Utf8(WebString::UTF8ConversionMode::kStrictReplacingErrorsWithFFFD));
-}
-
 re2::RE2* CreateMatcher(void* instance, const char* pattern) {
   re2::RE2::Options options;
   options.set_case_sensitive(false);
diff --git a/components/autofill/content/renderer/password_form_conversion_utils.h b/components/autofill/content/renderer/password_form_conversion_utils.h
index 40585c4..3674d43 100644
--- a/components/autofill/content/renderer/password_form_conversion_utils.h
+++ b/components/autofill/content/renderer/password_form_conversion_utils.h
@@ -19,7 +19,6 @@
 
 namespace blink {
 class WebFormElement;
-class WebInputElement;
 class WebLocalFrame;
 }
 
@@ -30,23 +29,8 @@
 namespace autofill {
 
 struct PasswordForm;
-
 class FieldDataManager;
 
-// The susbset of autocomplete flags related to passwords.
-enum class AutocompleteFlag {
-  NONE,
-  USERNAME,
-  CURRENT_PASSWORD,
-  NEW_PASSWORD,
-  // Represents the whole family of cc-* flags.
-  CREDIT_CARD
-};
-
-// Returns the AutocompleteFlag derived from |element|'s autocomplete attribute.
-AutocompleteFlag AutocompleteFlagForElement(
-    const blink::WebInputElement& element);
-
 // The caller of this function is responsible for deleting the returned object.
 re2::RE2* CreateMatcher(void* instance, const char* pattern);
 
diff --git a/components/autofill_assistant/browser/devtools/devtools_api/domain_cc.template b/components/autofill_assistant/browser/devtools/devtools_api/domain_cc.template
index ffa1cde..309c087 100644
--- a/components/autofill_assistant/browser/devtools/devtools_api/domain_cc.template
+++ b/components/autofill_assistant/browser/devtools/devtools_api/domain_cc.template
@@ -48,8 +48,9 @@
     {% set method_name = command.name | sanitize_literal | to_title_case %}
 void {{class_name}}::{{method_name}}(
     std::unique_ptr<{{method_name}}Params> params,
+    const std::string& optional_node_frame_id,
     base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback) {
-  dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), base::BindOnce(&Domain::Handle{{method_name}}Response, std::move(callback)));
+  dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), optional_node_frame_id, base::BindOnce(&Domain::Handle{{method_name}}Response, std::move(callback)));
 }
     {# Generate convenience methods that take the required parameters directly. #}
     {% if not "parameters" in command %}{% continue %}{% endif %}
@@ -65,6 +66,7 @@
 {{resolve_type(parameter).pass_type}} {{parameter.name | camelcase_to_hacker_style -}}
     {% endfor %}
     {% if command.get("parameters", []) and not command.parameters[0].get("optional", False) %}, {% endif %}{# -#}
+    const std::string& optional_node_frame_id,
     {% if command.get("returns", []) -%}
       base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback{##}
     {% else -%}
@@ -81,16 +83,16 @@
       .Build();
     {# Send the message. #}
     {% if command.get("returns", []) -%}
-  dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), base::BindOnce(&Domain::Handle{{method_name}}Response, std::move(callback)));
+  dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), optional_node_frame_id, base::BindOnce(&Domain::Handle{{method_name}}Response, std::move(callback)));
     {% else %}
-  dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), std::move(callback));
+  dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), optional_node_frame_id, std::move(callback));
     {% endif %}
 }
     {# If the command has no return value, generate a convenience method that #}
     {# accepts a base::OnceClosure together with the parameters object. #}
     {% if not command.get("returns", []) %}
-void {{class_name}}::{{method_name}}(std::unique_ptr<{{method_name}}Params> params, base::OnceClosure callback) {
-  dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), std::move(callback));
+void {{class_name}}::{{method_name}}(std::unique_ptr<{{method_name}}Params> params, const std::string& optional_node_frame_id, base::OnceClosure callback) {
+  dispatcher_->SendMessage("{{domain.domain}}.{{command.name}}", params->Serialize(), optional_node_frame_id, std::move(callback));
 }
     {% endif %}
   {% endfor %}
diff --git a/components/autofill_assistant/browser/devtools/devtools_api/domain_h.template b/components/autofill_assistant/browser/devtools/devtools_api/domain_h.template
index 785d4cd..0d0afca 100644
--- a/components/autofill_assistant/browser/devtools/devtools_api/domain_h.template
+++ b/components/autofill_assistant/browser/devtools/devtools_api/domain_h.template
@@ -23,7 +23,7 @@
   {% if command.description %}
   // {{ command.description.replace('\n', '\n  // ') }}
   {% endif %}
-  void {{method_name}}(std::unique_ptr<{{method_name}}Params> params, base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback = base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)>());
+  void {{method_name}}(std::unique_ptr<{{method_name}}Params> params, const std::string& optional_node_frame_id, base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback = base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)>());
   {# Generate convenience methods that take the required parameters directly. #}
   {# Don't generate these for experimental commands. #}
   {% if "parameters" in command and not command.experimental %}
@@ -36,6 +36,7 @@
 {{resolve_type(parameter).pass_type}} {{parameter.name | camelcase_to_hacker_style -}}
     {% endfor %}
     {% if command.get("parameters", []) and not command.parameters[0].get("optional", False) %}, {% endif %}{# -#}
+    const std::string& optional_node_frame_id,
     {% if command.get("returns", []) -%}
       base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)> callback = base::OnceCallback<void(const MessageDispatcher::ReplyStatus&, std::unique_ptr<{{method_name}}Result>)>(){##}
     {% else -%}
@@ -44,7 +45,7 @@
     {# If the command has no return value, generate a convenience method that #}
     {# accepts a base::Closure together with the parameters object. #}
     {% if not command.get("returns", []) %}
-  void {{method_name}}(std::unique_ptr<{{method_name}}Params> params, base::OnceClosure callback);
+  void {{method_name}}(std::unique_ptr<{{method_name}}Params> params, const std::string& optional_node_frame_id, base::OnceClosure callback);
     {% endif %}
   {% endif %}
 {% endmacro %}
diff --git a/components/autofill_assistant/browser/devtools/devtools_client.cc b/components/autofill_assistant/browser/devtools/devtools_client.cc
index 39911cd..964d07bb 100644
--- a/components/autofill_assistant/browser/devtools/devtools_client.cc
+++ b/components/autofill_assistant/browser/devtools/devtools_client.cc
@@ -26,14 +26,18 @@
       dom_domain_(this),
       runtime_domain_(this),
       network_domain_(this),
+      target_domain_(this),
       renderer_crashed_(false),
-      next_message_id_(0) {
+      next_message_id_(0),
+      frame_tracker_(this) {
   browser_main_thread_ =
       base::CreateSingleThreadTaskRunner({content::BrowserThread::UI});
   agent_host_->AttachClient(this);
+  frame_tracker_.Start();
 }
 
 DevtoolsClient::~DevtoolsClient() {
+  frame_tracker_.Stop();
   agent_host_->DetachClient(this);
 }
 
@@ -53,27 +57,43 @@
   return &network_domain_;
 }
 
+target::ExperimentalDomain* DevtoolsClient::GetTarget() {
+  return &target_domain_;
+}
+
 void DevtoolsClient::SendMessage(
     const char* method,
     std::unique_ptr<base::Value> params,
+    const std::string& optional_node_frame_id,
     base::OnceCallback<void(const ReplyStatus&, const base::Value&)> callback) {
-  SendMessageWithParams(method, std::move(params), std::move(callback));
+  SendMessageWithParams(method, std::move(params), optional_node_frame_id,
+                        std::move(callback));
 }
 
 void DevtoolsClient::SendMessage(const char* method,
                                  std::unique_ptr<base::Value> params,
+                                 const std::string& optional_node_frame_id,
                                  base::OnceClosure callback) {
-  SendMessageWithParams(method, std::move(params), std::move(callback));
+  SendMessageWithParams(method, std::move(params), optional_node_frame_id,
+                        std::move(callback));
 }
 
 template <typename CallbackType>
-void DevtoolsClient::SendMessageWithParams(const char* method,
-                                           std::unique_ptr<base::Value> params,
-                                           CallbackType callback) {
+void DevtoolsClient::SendMessageWithParams(
+    const char* method,
+    std::unique_ptr<base::Value> params,
+    const std::string& optional_node_frame_id,
+    CallbackType callback) {
   base::DictionaryValue message;
   message.SetString("method", method);
   message.Set("params", std::move(params));
 
+  std::string optional_session_id =
+      GetSessionIdForFrame(optional_node_frame_id);
+  if (!optional_session_id.empty()) {
+    message.SetString("sessionId", optional_session_id);
+  }
+
   if (renderer_crashed_)
     return;
   int id = next_message_id_;
@@ -95,6 +115,11 @@
   event_handlers_[method] = std::move(callback);
 }
 
+void DevtoolsClient::UnregisterEventHandler(const char* method) {
+  DCHECK(event_handlers_.find(method) != event_handlers_.end());
+  event_handlers_.erase(method);
+}
+
 void DevtoolsClient::DispatchProtocolMessage(
     content::DevToolsAgentHost* agent_host,
     const std::string& json_message) {
@@ -254,6 +279,11 @@
   renderer_crashed_ = true;
 }
 
+std::string DevtoolsClient::GetSessionIdForFrame(
+    const std::string& frame_id) const {
+  return frame_tracker_.GetSessionIdForFrame(frame_id);
+}
+
 DevtoolsClient::Callback::Callback() = default;
 
 DevtoolsClient::Callback::Callback(Callback&& other) = default;
@@ -270,4 +300,114 @@
 DevtoolsClient::Callback& DevtoolsClient::Callback::operator=(
     Callback&& other) = default;
 
+DevtoolsClient::FrameTracker::FrameTracker(DevtoolsClient* client)
+    : client_(client) {}
+
+DevtoolsClient::FrameTracker::~FrameTracker() = default;
+
+void DevtoolsClient::FrameTracker::Start() {
+  client_->RegisterEventHandler(
+      "Target.attachedToTarget",
+      base::BindRepeating(&DevtoolsClient::FrameTracker::OnAttachedToTarget,
+                          weak_ptr_factory_.GetWeakPtr()));
+  client_->RegisterEventHandler(
+      "Target.detachedFromTarget",
+      base::BindRepeating(&DevtoolsClient::FrameTracker::OnDetachedFromTarget,
+                          weak_ptr_factory_.GetWeakPtr()));
+
+  started_ = true;
+
+  // Start auto attaching so that we can keep track of what session got started
+  // for what target. We use flatten = true to cover the entire frame tree.
+  client_->GetTarget()->SetAutoAttach(
+      target::SetAutoAttachParams::Builder()
+          .SetAutoAttach(true)
+          .SetWaitForDebuggerOnStart(false)
+          .SetFlatten(true)
+          .Build(),
+      /* node_frame_id= */ "",
+      base::BindOnce(&DevtoolsClient::FrameTracker::OnSetAutoAttach,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void DevtoolsClient::FrameTracker::Stop() {
+  if (!started_) {
+    return;
+  }
+
+  client_->UnregisterEventHandler("Target.attachedToTarget");
+  client_->UnregisterEventHandler("Target.detachedFromTarget");
+
+  started_ = false;
+}
+
+void DevtoolsClient::FrameTracker::OnSetAutoAttach(
+    const DevtoolsClient::ReplyStatus& reply_status,
+    std::unique_ptr<target::SetAutoAttachResult> result) {
+  // This is not used since result doesn't contain anything useful. The real
+  // action is happening in the On(Attached|Detached) functions.
+  DCHECK(result);
+}
+
+std::string DevtoolsClient::FrameTracker::GetSessionIdForFrame(
+    std::string frame_id) const {
+  if (frame_id.empty()) {
+    return std::string();
+  }
+
+  auto it = sessions_map_.find(frame_id);
+  if (it != sessions_map_.end()) {
+    return it->second;
+  }
+  DVLOG(3) << "No session id for frame_id: " << frame_id;
+  return std::string();
+}
+
+std::string DevtoolsClient::FrameTracker::FindTargetId(
+    const base::Value& value) {
+  const base::Value* target_info = value.FindKey("targetInfo");
+  if (!target_info) {
+    DVLOG(3) << "No target_info found in " << value;
+    return std::string();
+  }
+  const std::string* target_id = target_info->FindStringKey("targetId");
+  if (!target_id) {
+    DVLOG(3) << "No target_id found in " << *target_info;
+    return std::string();
+  }
+
+  return *target_id;
+}
+
+std::string DevtoolsClient::FrameTracker::FindSessionId(
+    const base::Value& value) {
+  const std::string* session_id = value.FindStringKey("sessionId");
+  if (!session_id) {
+    DVLOG(3) << "No session_id found in " << value;
+    return std::string();
+  }
+
+  return *session_id;
+}
+
+void DevtoolsClient::FrameTracker::OnAttachedToTarget(
+    const base::Value& value) {
+  std::string session_id = FindSessionId(value);
+  std::string target_id = FindTargetId(value);
+
+  if (!session_id.empty() && !target_id.empty()) {
+    sessions_map_[target_id] = session_id;
+  }
+}
+
+void DevtoolsClient::FrameTracker::OnDetachedFromTarget(
+    const base::Value& value) {
+  std::string target_id = FindTargetId(value);
+
+  auto it = sessions_map_.find(target_id);
+  if (it != sessions_map_.end()) {
+    sessions_map_.erase(it);
+  }
+}
+
 }  // namespace autofill_assistant.
diff --git a/components/autofill_assistant/browser/devtools/devtools_client.h b/components/autofill_assistant/browser/devtools/devtools_client.h
index 4b86b9e..2ec99084 100644
--- a/components/autofill_assistant/browser/devtools/devtools_client.h
+++ b/components/autofill_assistant/browser/devtools/devtools_client.h
@@ -23,6 +23,7 @@
 #include "components/autofill_assistant/browser/devtools/devtools/domains/input.h"
 #include "components/autofill_assistant/browser/devtools/devtools/domains/network.h"
 #include "components/autofill_assistant/browser/devtools/devtools/domains/runtime.h"
+#include "components/autofill_assistant/browser/devtools/devtools/domains/target.h"
 #include "components/autofill_assistant/browser/devtools/message_dispatcher.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/devtools_agent_host_client.h"
@@ -39,19 +40,23 @@
   dom::Domain* GetDOM();
   runtime::Domain* GetRuntime();
   network::Domain* GetNetwork();
+  target::ExperimentalDomain* GetTarget();
 
   // MessageDispatcher implementation:
   void SendMessage(
       const char* method,
       std::unique_ptr<base::Value> params,
+      const std::string& optional_node_frame_id,
       base::OnceCallback<void(const ReplyStatus&, const base::Value&)> callback)
       override;
   void SendMessage(const char* method,
                    std::unique_ptr<base::Value> params,
+                   const std::string& optional_node_frame_id,
                    base::OnceClosure callback) override;
   void RegisterEventHandler(
       const char* method,
       base::RepeatingCallback<void(const base::Value&)> callback) override;
+  void UnregisterEventHandler(const char* method) override;
 
   // content::DevToolsAgentHostClient overrides:
   void DispatchProtocolMessage(content::DevToolsAgentHost* agent_host,
@@ -76,9 +81,52 @@
         callback_with_result;
   };
 
+  // Manages a map to retrieve a session id from a given frame id. Registers
+  // itself to client events.
+  class FrameTracker {
+   public:
+    // Register the event handlers and start tracking new targets. |client|
+    // must outlive this frame tracker.
+    FrameTracker(DevtoolsClient* client);
+    ~FrameTracker();
+
+    void Start();
+    void Stop();
+
+    // Returns empty string if there is no session for the given |frame_id|.
+    std::string GetSessionIdForFrame(std::string frame_id) const;
+
+   private:
+    void OnSetAutoAttach(const DevtoolsClient::ReplyStatus& reply_status,
+                         std::unique_ptr<target::SetAutoAttachResult> result);
+    void OnAttachedToTarget(const base::Value& value);
+    void OnDetachedFromTarget(const base::Value& value);
+
+    // Save find of targetInfo.targetId in the given value. Returns
+    // empty string if nothing is found.
+    std::string FindTargetId(const base::Value& value);
+
+    // Find sessionId in the given value. Returns empty string if nothing is
+    // found.
+    std::string FindSessionId(const base::Value& value);
+
+    DevtoolsClient* client_;
+    bool started_ = false;
+
+    // Holds the mappings from frame id to session id.
+    std::unordered_map<std::string, std::string> sessions_map_;
+
+    base::WeakPtrFactory<FrameTracker> weak_ptr_factory_{this};
+    DISALLOW_COPY_AND_ASSIGN(FrameTracker);
+  };
+
+  // If the frame is known to devtools, return the session id for it.
+  std::string GetSessionIdForFrame(const std::string& frame_id) const;
+
   template <typename CallbackType>
   void SendMessageWithParams(const char* method,
                              std::unique_ptr<base::Value> params,
+                             const std::string& optional_node_frame_id,
                              CallbackType callback);
   bool DispatchMessageReply(std::unique_ptr<base::Value> owning_message,
                             const base::DictionaryValue& message_dict);
@@ -105,10 +153,12 @@
   dom::ExperimentalDomain dom_domain_;
   runtime::ExperimentalDomain runtime_domain_;
   network::ExperimentalDomain network_domain_;
+  target::ExperimentalDomain target_domain_;
   std::unordered_map<int, Callback> pending_messages_;
   EventHandlerMap event_handlers_;
   bool renderer_crashed_;
   int next_message_id_;
+  FrameTracker frame_tracker_;
 
   base::WeakPtrFactory<DevtoolsClient> weak_ptr_factory_{this};
   DISALLOW_COPY_AND_ASSIGN(DevtoolsClient);
diff --git a/components/autofill_assistant/browser/devtools/message_dispatcher.h b/components/autofill_assistant/browser/devtools/message_dispatcher.h
index a517138..71126c85 100644
--- a/components/autofill_assistant/browser/devtools/message_dispatcher.h
+++ b/components/autofill_assistant/browser/devtools/message_dispatcher.h
@@ -38,15 +38,18 @@
   virtual void SendMessage(
       const char* method,
       std::unique_ptr<base::Value> params,
+      const std::string& optional_node_frame_id,
       base::OnceCallback<void(const ReplyStatus&, const base::Value&)>
           callback) = 0;
   virtual void SendMessage(const char* method,
                            std::unique_ptr<base::Value> params,
+                           const std::string& optional_node_frame_id,
                            base::OnceClosure callback) = 0;
 
   virtual void RegisterEventHandler(
       const char* method,
       base::RepeatingCallback<void(const base::Value&)> callback) = 0;
+  virtual void UnregisterEventHandler(const char* method) = 0;
 
  protected:
   virtual ~MessageDispatcher() {}
diff --git a/components/autofill_assistant/browser/web/element_finder.cc b/components/autofill_assistant/browser/web/element_finder.cc
index 86fadcc..8e2387f 100644
--- a/components/autofill_assistant/browser/web/element_finder.cc
+++ b/components/autofill_assistant/browser/web/element_finder.cc
@@ -135,10 +135,11 @@
     SendResult(ClientStatus(INVALID_SELECTOR));
     return;
   }
+
   devtools_client_->GetRuntime()->Evaluate(
-      std::string(kGetDocumentElement),
+      std::string(kGetDocumentElement), /* node_frame_id= */ std::string(),
       base::BindOnce(&ElementFinder::OnGetDocumentElement,
-                     weak_ptr_factory_.GetWeakPtr()));
+                     weak_ptr_factory_.GetWeakPtr(), 0));
 }
 
 void ElementFinder::SendResult(const ClientStatus& status) {
@@ -148,6 +149,7 @@
 }
 
 void ElementFinder::OnGetDocumentElement(
+    size_t index,
     const DevtoolsClient::ReplyStatus& reply_status,
     std::unique_ptr<runtime::EvaluateResult> result) {
   ClientStatus status =
@@ -163,10 +165,14 @@
     SendResult(ClientStatus(ELEMENT_RESOLUTION_FAILED));
     return;
   }
+
+  // The frame gets set again when we encounter an iFrame, even an OOPIF.
+  // Setting the correct host frame is handled by
+  // FindCorrespondingRenderFrameHost further down.
   element_result_->container_frame_host = web_contents_->GetMainFrame();
-  element_result_->container_frame_selector_index = 0;
-  element_result_->object_id = "";
-  RecursiveFindElement(object_id, 0);
+  element_result_->container_frame_selector_index = index;
+  element_result_->object_id = std::string();
+  RecursiveFindElement(object_id, index);
 }
 
 void ElementFinder::RecursiveFindElement(const std::string& object_id,
@@ -214,6 +220,7 @@
           .SetArguments(std::move(argument))
           .SetFunctionDeclaration(function)
           .Build(),
+      element_result_->node_frame_id,
       base::BindOnce(&ElementFinder::OnQuerySelectorAll,
                      weak_ptr_factory_.GetWeakPtr(), index));
 }
@@ -273,6 +280,7 @@
 
     devtools_client_->GetDOM()->DescribeNode(
         dom::DescribeNodeParams::Builder().SetObjectId(object_id).Build(),
+        element_result_->node_frame_id,
         base::BindOnce(&ElementFinder::OnDescribeNodeForPseudoElement,
                        weak_ptr_factory_.GetWeakPtr(), pseudo_type));
     return;
@@ -280,6 +288,7 @@
 
   devtools_client_->GetDOM()->DescribeNode(
       dom::DescribeNodeParams::Builder().SetObjectId(object_id).Build(),
+      element_result_->node_frame_id,
       base::BindOnce(&ElementFinder::OnDescribeNode,
                      weak_ptr_factory_.GetWeakPtr(), object_id, index));
 }
@@ -303,6 +312,7 @@
             dom::ResolveNodeParams::Builder()
                 .SetBackendNodeId(pseudo_element->GetBackendNodeId())
                 .Build(),
+            element_result_->node_frame_id,
             base::BindOnce(&ElementFinder::OnResolveNodeForPseudoElement,
                            weak_ptr_factory_.GetWeakPtr()));
         return;
@@ -366,9 +376,14 @@
       return;
     }
   } else if (node->HasFrameId()) {
-    // TODO(crbug.com/806868): Support out-of-process iframe.
-    DVLOG(3) << "Warning (unsupported): the element is inside an OOPIF.";
-    SendResult(ClientStatus(UNSUPPORTED));
+    element_result_->container_frame_selector_index = index;
+    element_result_->node_frame_id = node->GetFrameId();
+
+    // Kick off another find element chain to walk down the OOP iFrame.
+    devtools_client_->GetRuntime()->Evaluate(
+        std::string(kGetDocumentElement), element_result_->node_frame_id,
+        base::BindOnce(&ElementFinder::OnGetDocumentElement,
+                       weak_ptr_factory_.GetWeakPtr(), index + 1));
     return;
   }
 
@@ -383,6 +398,7 @@
         dom::ResolveNodeParams::Builder()
             .SetBackendNodeId(backend_ids[0])
             .Build(),
+        element_result_->node_frame_id,
         base::BindOnce(&ElementFinder::OnResolveNode,
                        weak_ptr_factory_.GetWeakPtr(), index));
     return;
diff --git a/components/autofill_assistant/browser/web/element_finder.h b/components/autofill_assistant/browser/web/element_finder.h
index 3acc08bd..3103d6f 100644
--- a/components/autofill_assistant/browser/web/element_finder.h
+++ b/components/autofill_assistant/browser/web/element_finder.h
@@ -44,6 +44,9 @@
 
     // The object id of the element.
     std::string object_id;
+
+    // The id of the frame the element's node is in.
+    std::string node_frame_id;
   };
 
   // |web_contents| and |devtools_client| must be valid for the lifetime of the
@@ -62,7 +65,8 @@
 
  private:
   void SendResult(const ClientStatus& status);
-  void OnGetDocumentElement(const DevtoolsClient::ReplyStatus& reply_status,
+  void OnGetDocumentElement(size_t index,
+                            const DevtoolsClient::ReplyStatus& reply_status,
                             std::unique_ptr<runtime::EvaluateResult> result);
   void RecursiveFindElement(const std::string& object_id, size_t index);
   void OnQuerySelectorAll(
@@ -83,6 +87,7 @@
   void OnResolveNode(size_t index,
                      const DevtoolsClient::ReplyStatus& reply_status,
                      std::unique_ptr<dom::ResolveNodeResult> result);
+
   content::RenderFrameHost* FindCorrespondingRenderFrameHost(
       std::string name,
       std::string document_url);
@@ -90,6 +95,7 @@
   content::WebContents* const web_contents_;
   DevtoolsClient* const devtools_client_;
   const Selector selector_;
+
   const bool strict_;
   Callback callback_;
   std::unique_ptr<Result> element_result_;
diff --git a/components/autofill_assistant/browser/web/element_position_getter.cc b/components/autofill_assistant/browser/web/element_position_getter.cc
index ad63a0c..6cc0ff3 100644
--- a/components/autofill_assistant/browser/web/element_position_getter.cc
+++ b/components/autofill_assistant/browser/web/element_position_getter.cc
@@ -24,11 +24,14 @@
 
 namespace autofill_assistant {
 
-ElementPositionGetter::ElementPositionGetter(DevtoolsClient* devtools_client,
-                                             const ClientSettings& settings)
+ElementPositionGetter::ElementPositionGetter(
+    DevtoolsClient* devtools_client,
+    const ClientSettings& settings,
+    const std::string& optional_node_frame_id)
     : check_interval_(settings.box_model_check_interval),
       max_rounds_(settings.box_model_check_count),
       devtools_client_(devtools_client),
+      node_frame_id_(optional_node_frame_id),
       weak_ptr_factory_(this) {}
 
 ElementPositionGetter::~ElementPositionGetter() = default;
@@ -64,6 +67,7 @@
 void ElementPositionGetter::GetAndWaitBoxModelStable() {
   devtools_client_->GetDOM()->GetBoxModel(
       dom::GetBoxModelParams::Builder().SetObjectId(object_id_).Build(),
+      node_frame_id_,
       base::BindOnce(&ElementPositionGetter::OnGetBoxModelForStableCheck,
                      weak_ptr_factory_.GetWeakPtr()));
 }
@@ -124,6 +128,7 @@
             .SetFunctionDeclaration(std::string(kScrollIntoViewIfNeededScript))
             .SetReturnByValue(true)
             .Build(),
+        node_frame_id_,
         base::BindOnce(&ElementPositionGetter::OnScrollIntoView,
                        weak_ptr_factory_.GetWeakPtr()));
     return;
diff --git a/components/autofill_assistant/browser/web/element_position_getter.h b/components/autofill_assistant/browser/web/element_position_getter.h
index 6639c419..8ed1969 100644
--- a/components/autofill_assistant/browser/web/element_position_getter.h
+++ b/components/autofill_assistant/browser/web/element_position_getter.h
@@ -30,7 +30,8 @@
  public:
   // |devtools_client| must be valid for the lifetime of the instance.
   ElementPositionGetter(DevtoolsClient* devtools_client,
-                        const ClientSettings& settings);
+                        const ClientSettings& settings,
+                        const std::string& optional_node_frame_id);
   ~ElementPositionGetter() override;
 
   // Callback that receives the position that corresponds to the center
@@ -75,6 +76,8 @@
   int point_x_ = 0;
   int point_y_ = 0;
 
+  std::string node_frame_id_;
+
   base::WeakPtrFactory<ElementPositionGetter> weak_ptr_factory_;
 };
 
diff --git a/components/autofill_assistant/browser/web/web_controller.cc b/components/autofill_assistant/browser/web/web_controller.cc
index 85c2ae72..b9a30b4 100644
--- a/components/autofill_assistant/browser/web/web_controller.cc
+++ b/components/autofill_assistant/browser/web/web_controller.cc
@@ -299,6 +299,7 @@
   std::string element_object_id = result->object_id;
   WaitForDocumentToBecomeInteractive(
       settings_->document_ready_check_count, element_object_id,
+      result->node_frame_id,
       base::BindOnce(
           &WebController::OnWaitDocumentToBecomeInteractiveForClickOrTap,
           weak_ptr_factory_.GetWeakPtr(), std::move(callback), click_type,
@@ -333,6 +334,7 @@
           .SetFunctionDeclaration(std::string(kScrollIntoViewCenterScript))
           .SetReturnByValue(true)
           .Build(),
+      target_element->node_frame_id,
       base::BindOnce(&WebController::OnScrollIntoView,
                      weak_ptr_factory_.GetWeakPtr(), std::move(target_element),
                      std::move(callback), click_type));
@@ -364,20 +366,22 @@
             .SetArguments(std::move(argument))
             .SetFunctionDeclaration(kClickElement)
             .Build(),
+        target_element->node_frame_id,
         base::BindOnce(&WebController::OnClickJS,
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
     return;
   }
 
   std::unique_ptr<ElementPositionGetter> getter =
-      std::make_unique<ElementPositionGetter>(devtools_client_.get(),
-                                              *settings_);
+      std::make_unique<ElementPositionGetter>(
+          devtools_client_.get(), *settings_, target_element->node_frame_id);
   auto* ptr = getter.get();
   pending_workers_.emplace_back(std::move(getter));
-  ptr->Start(target_element->container_frame_host, target_element->object_id,
-             base::BindOnce(&WebController::TapOrClickOnCoordinates,
-                            weak_ptr_factory_.GetWeakPtr(), ptr,
-                            std::move(callback), click_type));
+  ptr->Start(
+      target_element->container_frame_host, target_element->object_id,
+      base::BindOnce(&WebController::TapOrClickOnCoordinates,
+                     weak_ptr_factory_.GetWeakPtr(), ptr, std::move(callback),
+                     target_element->node_frame_id, click_type));
 }
 
 void WebController::OnClickJS(
@@ -395,6 +399,7 @@
 void WebController::TapOrClickOnCoordinates(
     ElementPositionGetter* getter_to_release,
     base::OnceCallback<void(const ClientStatus&)> callback,
+    const std::string& node_frame_id,
     ClickAction::ClickType click_type,
     bool has_coordinates,
     int x,
@@ -419,9 +424,10 @@
             .SetButton(input::DispatchMouseEventButton::LEFT)
             .SetType(input::DispatchMouseEventType::MOUSE_PRESSED)
             .Build(),
+        node_frame_id,
         base::BindOnce(&WebController::OnDispatchPressMouseEvent,
-                       weak_ptr_factory_.GetWeakPtr(), std::move(callback), x,
-                       y));
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback),
+                       node_frame_id, x, y));
     return;
   }
 
@@ -434,12 +440,15 @@
           .SetType(input::DispatchTouchEventType::TOUCH_START)
           .SetTouchPoints(std::move(touch_points))
           .Build(),
+      node_frame_id,
       base::BindOnce(&WebController::OnDispatchTouchEventStart,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback),
+                     node_frame_id));
 }
 
 void WebController::OnDispatchPressMouseEvent(
     base::OnceCallback<void(const ClientStatus&)> callback,
+    const std::string& node_frame_id,
     int x,
     int y,
     const DevtoolsClient::ReplyStatus& reply_status,
@@ -460,6 +469,7 @@
           .SetButton(input::DispatchMouseEventButton::LEFT)
           .SetType(input::DispatchMouseEventType::MOUSE_RELEASED)
           .Build(),
+      node_frame_id,
       base::BindOnce(&WebController::OnDispatchReleaseMouseEvent,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -479,6 +489,7 @@
 
 void WebController::OnDispatchTouchEventStart(
     base::OnceCallback<void(const ClientStatus&)> callback,
+    const std::string& node_frame_id,
     const DevtoolsClient::ReplyStatus& reply_status,
     std::unique_ptr<input::DispatchTouchEventResult> result) {
   if (!result) {
@@ -495,6 +506,7 @@
           .SetType(input::DispatchTouchEventType::TOUCH_END)
           .SetTouchPoints(std::move(touch_points))
           .Build(),
+      node_frame_id,
       base::BindOnce(&WebController::OnDispatchTouchEventEnd,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -539,6 +551,7 @@
           .SetExpression(kWaitForWindowHeightChange)
           .SetAwaitPromise(true)
           .Build(),
+      /* node_frame_id= */ std::string(),
       base::BindOnce(&WebController::OnWaitForWindowHeightChange,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -576,6 +589,7 @@
             .SetReturnByValue(true)
             .SetAwaitPromise(true)
             .Build(),
+        /* node_frame_id= */ std::string(),
         base::BindOnce(&OnWaitForDocumentReadyState<runtime::EvaluateResult>,
                        std::move(callback)));
     return;
@@ -614,6 +628,7 @@
           .SetReturnByValue(true)
           .SetAwaitPromise(true)
           .Build(),
+      element->node_frame_id,
       base::BindOnce(
           &OnWaitForDocumentReadyState<runtime::CallFunctionOnResult>,
           std::move(callback)));
@@ -655,6 +670,7 @@
   std::string element_object_id = element_result->object_id;
   WaitForDocumentToBecomeInteractive(
       settings_->document_ready_check_count, element_object_id,
+      element_result->node_frame_id,
       base::BindOnce(
           &WebController::OnWaitDocumentToBecomeInteractiveForFocusElement,
           weak_ptr_factory_.GetWeakPtr(), top_padding, std::move(callback),
@@ -690,6 +706,7 @@
           .SetFunctionDeclaration(std::string(kScrollIntoViewWithPaddingScript))
           .SetReturnByValue(true)
           .Build(),
+      target_element->node_frame_id,
       base::BindOnce(&WebController::OnFocusElement,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -830,6 +847,7 @@
           .SetFunctionDeclaration(std::string(kSelectOptionScript))
           .SetReturnByValue(true)
           .Build(),
+      element_result->node_frame_id,
       base::BindOnce(&WebController::OnSelectOption,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -891,6 +909,7 @@
           .SetFunctionDeclaration(std::string(kHighlightElementScript))
           .SetReturnByValue(true)
           .Build(),
+      element_result->node_frame_id,
       base::BindOnce(&WebController::OnHighlightElement,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -944,6 +963,7 @@
           .SetFunctionDeclaration(std::string(kGetValueAttributeScript))
           .SetReturnByValue(true)
           .Build(),
+      element_result->node_frame_id,
       base::BindOnce(&WebController::OnGetValueAttribute,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -1011,6 +1031,7 @@
 }
 
 void WebController::OnClickElementForSendKeyboardInput(
+    const std::string& node_frame_id,
     const std::vector<UChar32>& codepoints,
     int delay_in_millisecond,
     base::OnceCallback<void(const ClientStatus&)> callback,
@@ -1019,11 +1040,13 @@
     std::move(callback).Run(click_status);
     return;
   }
-  DispatchKeyboardTextDownEvent(codepoints, 0, /*delay=*/false,
-                                delay_in_millisecond, std::move(callback));
+  DispatchKeyboardTextDownEvent(node_frame_id, codepoints, 0,
+                                /* delay= */ false, delay_in_millisecond,
+                                std::move(callback));
 }
 
 void WebController::DispatchKeyboardTextDownEvent(
+    const std::string& node_frame_id,
     const std::vector<UChar32>& codepoints,
     size_t index,
     bool delay,
@@ -1037,10 +1060,10 @@
   if (delay && delay_in_millisecond > 0) {
     base::PostDelayedTask(
         FROM_HERE, {content::BrowserThread::UI},
-        base::BindOnce(&WebController::DispatchKeyboardTextDownEvent,
-                       weak_ptr_factory_.GetWeakPtr(), codepoints, index,
-                       /*delay=*/false, delay_in_millisecond,
-                       std::move(callback)),
+        base::BindOnce(
+            &WebController::DispatchKeyboardTextDownEvent,
+            weak_ptr_factory_.GetWeakPtr(), node_frame_id, codepoints, index,
+            /* delay= */ false, delay_in_millisecond, std::move(callback)),
         base::TimeDelta::FromMilliseconds(delay_in_millisecond));
     return;
   }
@@ -1049,12 +1072,14 @@
       CreateKeyEventParamsForCharacter(
           autofill_assistant::input::DispatchKeyEventType::KEY_DOWN,
           codepoints[index]),
+      node_frame_id,
       base::BindOnce(&WebController::DispatchKeyboardTextUpEvent,
-                     weak_ptr_factory_.GetWeakPtr(), codepoints, index,
-                     delay_in_millisecond, std::move(callback)));
+                     weak_ptr_factory_.GetWeakPtr(), node_frame_id, codepoints,
+                     index, delay_in_millisecond, std::move(callback)));
 }
 
 void WebController::DispatchKeyboardTextUpEvent(
+    const std::string& node_frame_id,
     const std::vector<UChar32>& codepoints,
     size_t index,
     int delay_in_millisecond,
@@ -1064,10 +1089,11 @@
       CreateKeyEventParamsForCharacter(
           autofill_assistant::input::DispatchKeyEventType::KEY_UP,
           codepoints[index]),
-      base::BindOnce(&WebController::DispatchKeyboardTextDownEvent,
-                     weak_ptr_factory_.GetWeakPtr(), codepoints, index + 1,
-                     /*delay=*/true, delay_in_millisecond,
-                     std::move(callback)));
+      node_frame_id,
+      base::BindOnce(
+          &WebController::DispatchKeyboardTextDownEvent,
+          weak_ptr_factory_.GetWeakPtr(), node_frame_id, codepoints, index + 1,
+          /* delay= */ true, delay_in_millisecond, std::move(callback)));
 }
 
 auto WebController::CreateKeyEventParamsForCharacter(
@@ -1115,6 +1141,7 @@
           .SetArguments(std::move(argument))
           .SetFunctionDeclaration(std::string(kSetValueAttributeScript))
           .Build(),
+      element_result->node_frame_id,
       base::BindOnce(&WebController::OnSetValueAttribute,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -1175,6 +1202,7 @@
           .SetArguments(std::move(arguments))
           .SetFunctionDeclaration(std::string(kSetAttributeScript))
           .Build(),
+      element_result->node_frame_id,
       base::BindOnce(&WebController::OnSetAttribute,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -1202,8 +1230,7 @@
 
   DCHECK(!selector.empty());
   FindElement(
-      selector,
-      /* strict_mode= */ true,
+      selector, /* strict_mode= */ true,
       base::BindOnce(&WebController::OnFindElementForSendKeyboardInput,
                      weak_ptr_factory_.GetWeakPtr(), selector, codepoints,
                      delay_in_millisecond, std::move(callback)));
@@ -1223,7 +1250,8 @@
   ClickOrTapElement(
       selector, ClickAction::CLICK,
       base::BindOnce(&WebController::OnClickElementForSendKeyboardInput,
-                     weak_ptr_factory_.GetWeakPtr(), codepoints,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     element_result->node_frame_id, codepoints,
                      delay_in_millisecond, std::move(callback)));
 }
 
@@ -1246,6 +1274,7 @@
           .SetExpression(std::string(kGetVisualViewport))
           .SetReturnByValue(true)
           .Build(),
+      /* node_frame_id= */ std::string(),
       base::BindOnce(&WebController::OnGetVisualViewport,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -1311,6 +1340,7 @@
           .SetFunctionDeclaration(std::string(kGetBoundingClientRectAsList))
           .SetReturnByValue(true)
           .Build(),
+      result->node_frame_id,
       base::BindOnce(&WebController::OnGetElementPositionResult,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -1358,6 +1388,7 @@
           .SetFunctionDeclaration(std::string(kGetOuterHtmlScript))
           .SetReturnByValue(true)
           .Build(),
+      element_result->node_frame_id,
       base::BindOnce(&WebController::OnGetOuterHtml,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -1380,7 +1411,8 @@
 
 void WebController::WaitForDocumentToBecomeInteractive(
     int remaining_rounds,
-    std::string object_id,
+    const std::string& object_id,
+    const std::string& node_frame_id,
     base::OnceCallback<void(bool)> callback) {
   devtools_client_->GetRuntime()->CallFunctionOn(
       runtime::CallFunctionOnParams::Builder()
@@ -1388,14 +1420,16 @@
           .SetFunctionDeclaration(std::string(kIsDocumentReadyForInteract))
           .SetReturnByValue(true)
           .Build(),
+      node_frame_id,
       base::BindOnce(&WebController::OnWaitForDocumentToBecomeInteractive,
                      weak_ptr_factory_.GetWeakPtr(), remaining_rounds,
-                     object_id, std::move(callback)));
+                     object_id, node_frame_id, std::move(callback)));
 }
 
 void WebController::OnWaitForDocumentToBecomeInteractive(
     int remaining_rounds,
-    std::string object_id,
+    const std::string& object_id,
+    const std::string& node_frame_id,
     base::OnceCallback<void(bool)> callback,
     const DevtoolsClient::ReplyStatus& reply_status,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
@@ -1420,7 +1454,7 @@
       FROM_HERE, {content::BrowserThread::UI},
       base::BindOnce(&WebController::WaitForDocumentToBecomeInteractive,
                      weak_ptr_factory_.GetWeakPtr(), --remaining_rounds,
-                     object_id, std::move(callback)),
+                     object_id, node_frame_id, std::move(callback)),
       settings_->document_ready_check_interval);
 }
 
diff --git a/components/autofill_assistant/browser/web/web_controller.h b/components/autofill_assistant/browser/web/web_controller.h
index 31c32e2..7a98bff 100644
--- a/components/autofill_assistant/browser/web/web_controller.h
+++ b/components/autofill_assistant/browser/web/web_controller.h
@@ -247,12 +247,14 @@
   void TapOrClickOnCoordinates(
       ElementPositionGetter* getter_to_release,
       base::OnceCallback<void(const ClientStatus&)> callback,
+      const std::string& node_frame_id,
       ClickAction::ClickType click_type,
       bool has_coordinates,
       int x,
       int y);
   void OnDispatchPressMouseEvent(
       base::OnceCallback<void(const ClientStatus&)> callback,
+      const std::string& node_frame_id,
       int x,
       int y,
       const DevtoolsClient::ReplyStatus& reply_status,
@@ -263,6 +265,7 @@
       std::unique_ptr<input::DispatchMouseEventResult> result);
   void OnDispatchTouchEventStart(
       base::OnceCallback<void(const ClientStatus&)> callback,
+      const std::string& node_frame_id,
       const DevtoolsClient::ReplyStatus& reply_status,
       std::unique_ptr<input::DispatchTouchEventResult> result);
   void OnDispatchTouchEventEnd(
@@ -347,17 +350,20 @@
       base::OnceCallback<void(const ClientStatus&)> callback,
       const ClientStatus& status);
   void OnClickElementForSendKeyboardInput(
+      const std::string& node_frame_id,
       const std::vector<UChar32>& codepoints,
       int delay_in_milli,
       base::OnceCallback<void(const ClientStatus&)> callback,
       const ClientStatus& click_status);
   void DispatchKeyboardTextDownEvent(
+      const std::string& node_frame_id,
       const std::vector<UChar32>& codepoints,
       size_t index,
       bool delay,
       int delay_in_milli,
       base::OnceCallback<void(const ClientStatus&)> callback);
   void DispatchKeyboardTextUpEvent(
+      const std::string& node_frame_id,
       const std::vector<UChar32>& codepoints,
       size_t index,
       int delay_in_milli,
@@ -420,11 +426,13 @@
   // Waits for the document.readyState to be 'interactive' or 'complete'.
   void WaitForDocumentToBecomeInteractive(
       int remaining_rounds,
-      std::string object_id,
+      const std::string& object_id,
+      const std::string& node_frame_id,
       base::OnceCallback<void(bool)> callback);
   void OnWaitForDocumentToBecomeInteractive(
       int remaining_rounds,
-      std::string object_id,
+      const std::string& object_id,
+      const std::string& node_frame_id,
       base::OnceCallback<void(bool)> callback,
       const DevtoolsClient::ReplyStatus& reply_status,
       std::unique_ptr<runtime::CallFunctionOnResult> result);
diff --git a/components/autofill_assistant/browser/web/web_controller_browsertest.cc b/components/autofill_assistant/browser/web/web_controller_browsertest.cc
index 6358d984..9fbae121 100644
--- a/components/autofill_assistant/browser/web/web_controller_browsertest.cc
+++ b/components/autofill_assistant/browser/web/web_controller_browsertest.cc
@@ -24,6 +24,8 @@
 using ::testing::AnyOf;
 using ::testing::IsEmpty;
 
+// Flag to enable site per process to enforce OOPIFs.
+const char* kSitePerProcess = "site-per-process";
 const char* kTargetWebsitePath = "/autofill_assistant_target_website.html";
 
 class WebControllerBrowserTest : public content::ContentBrowserTest,
@@ -32,13 +34,26 @@
   WebControllerBrowserTest() {}
   ~WebControllerBrowserTest() override {}
 
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    command_line->AppendSwitch(kSitePerProcess);
+  }
+
   void SetUpOnMainThread() override {
     ContentBrowserTest::SetUpOnMainThread();
+
+    // Start a mock server for hosting an OOPIF.
+    http_server_iframe_ = std::make_unique<net::EmbeddedTestServer>(
+        net::EmbeddedTestServer::TYPE_HTTP);
+    http_server_iframe_->ServeFilesFromSourceDirectory(
+        "components/test/data/autofill_assistant/html_iframe");
+    ASSERT_TRUE(http_server_iframe_->Start(8081));
+
+    // Start the main server hosting the test page.
     http_server_ = std::make_unique<net::EmbeddedTestServer>(
         net::EmbeddedTestServer::TYPE_HTTP);
     http_server_->ServeFilesFromSourceDirectory(
-        "components/test/data/autofill_assistant");
-    ASSERT_TRUE(http_server_->Start());
+        "components/test/data/autofill_assistant/html");
+    ASSERT_TRUE(http_server_->Start(8080));
     ASSERT_TRUE(
         NavigateToURL(shell(), http_server_->GetURL(kTargetWebsitePath)));
     web_controller_ = WebController::CreateForWebContents(
@@ -460,6 +475,7 @@
 
  private:
   std::unique_ptr<net::EmbeddedTestServer> http_server_;
+  std::unique_ptr<net::EmbeddedTestServer> http_server_iframe_;
   ClientSettings settings_;
 
   DISALLOW_COPY_AND_ASSIGN(WebControllerBrowserTest);
@@ -485,6 +501,18 @@
 
   // A non-existent pseudo-element
   RunLaxElementCheck(Selector({"#button"}, AFTER), false);
+
+  // An iFrame.
+  RunLaxElementCheck(Selector({"#iframe"}), true);
+
+  // An element in a same-origin iFrame.
+  RunLaxElementCheck(Selector({"#iframe", "#button"}), true);
+
+  // An OOPIF.
+  RunLaxElementCheck(Selector({"#iframeExternal"}), true);
+
+  // An element in an OOPIF.
+  RunLaxElementCheck(Selector({"#iframeExternal", "#button"}), true);
 }
 
 IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, VisibilityRequirementCheck) {
@@ -506,6 +534,19 @@
 
   // A non-existent pseudo-element
   RunLaxElementCheck(Selector({"#button"}, AFTER).MustBeVisible(), false);
+
+  // An iFrame.
+  RunLaxElementCheck(Selector({"#iframe"}).MustBeVisible(), true);
+
+  // An element in a same-origin iFrame.
+  RunLaxElementCheck(Selector({"#iframe", "#button"}).MustBeVisible(), true);
+
+  // An OOPIF.
+  RunLaxElementCheck(Selector({"#iframeExternal"}).MustBeVisible(), true);
+
+  // An element in an OOPIF.
+  RunLaxElementCheck(Selector({"#iframeExternal", "#button"}).MustBeVisible(),
+                     true);
 }
 
 IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, MultipleVisibleElementCheck) {
@@ -634,6 +675,13 @@
   selectors.emplace_back(a_selector);
   results.emplace_back(true);
 
+  // OOPIF.
+  a_selector.selectors.clear();
+  a_selector.selectors.emplace_back("#iframeExternal");
+  a_selector.selectors.emplace_back("#button");
+  selectors.emplace_back(a_selector);
+  results.emplace_back(true);
+
   // Shadow DOM.
   a_selector.selectors.clear();
   a_selector.selectors.emplace_back("#iframe");
@@ -688,6 +736,18 @@
   WaitForElementRemove(selector);
 }
 
+IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, ClickElementInOOPIF) {
+  Selector selector;
+  selector.selectors.emplace_back("#iframeExternal");
+  selector.selectors.emplace_back("#button");
+  ClickOrTapElement(selector, ClickAction::CLICK);
+
+  selector.selectors.clear();
+  selector.selectors.emplace_back("#iframeExternal");
+  selector.selectors.emplace_back("#div");
+  WaitForElementRemove(selector);
+}
+
 IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest,
                        ClickElementInScrollContainer) {
   // Make sure #scroll_item_3 is not visible, no matter the screen height. It
@@ -1057,6 +1117,28 @@
           .proto_status());
 }
 
+IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, GetAndSetFieldValueInIFrame) {
+  Selector a_selector;
+
+  // IFrame.
+  a_selector.selectors.clear();
+  a_selector.selectors.emplace_back("#iframe");
+  a_selector.selectors.emplace_back("#input");
+  EXPECT_EQ(ACTION_APPLIED, SetFieldValue(a_selector, "text",
+                                          /* simulate_key_presses= */ false)
+                                .proto_status());
+  GetFieldsValue({a_selector}, {"text"});
+
+  // OOPIF.
+  a_selector.selectors.clear();
+  a_selector.selectors.emplace_back("#iframeExternal");
+  a_selector.selectors.emplace_back("#input");
+  EXPECT_EQ(ACTION_APPLIED, SetFieldValue(a_selector, "text",
+                                          /* simulate_key_presses= */ false)
+                                .proto_status());
+  GetFieldsValue({a_selector}, {"text"});
+}
+
 IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, SendKeyboardInput) {
   auto input = UTF8ToUnicode("Zürich");
   std::string expected_output = "Zürich";
diff --git a/components/embedder_support/android/delegate/web_contents_delegate_android.cc b/components/embedder_support/android/delegate/web_contents_delegate_android.cc
index 5316b981..a7de4a9 100644
--- a/components/embedder_support/android/delegate/web_contents_delegate_android.cc
+++ b/components/embedder_support/android/delegate/web_contents_delegate_android.cc
@@ -111,6 +111,7 @@
       params.should_replace_current_entry;
   load_params.is_renderer_initiated = params.is_renderer_initiated;
   load_params.has_user_gesture = params.user_gesture;
+  load_params.initiator_origin = params.initiator_origin;
 
   if (params.uses_post) {
     load_params.load_type = content::NavigationController::LOAD_TYPE_HTTP_POST;
diff --git a/components/exo/display.cc b/components/exo/display.cc
index f65d1ee..bc1fa15 100644
--- a/components/exo/display.cc
+++ b/components/exo/display.cc
@@ -111,22 +111,14 @@
   // Using zero-copy for optimal performance.
   bool use_zero_copy = true;
 
-#if defined(ARCH_CPU_X86_FAMILY)
-  // TODO(dcastagna): Re-enable NV12 format as HW overlay once b/113362843
-  // is addressed.
-  bool is_overlay_candidate = format != gfx::BufferFormat::YUV_420_BIPLANAR;
-#else
-  bool is_overlay_candidate = true;
-#endif
-
   return std::make_unique<Buffer>(
       std::move(gpu_memory_buffer),
       gpu::NativeBufferNeedsPlatformSpecificTextureTarget(format)
           ? gpu::GetPlatformSpecificTextureTarget()
           : GL_TEXTURE_2D,
       // COMMANDS_COMPLETED queries are required by native pixmaps.
-      GL_COMMANDS_COMPLETED_CHROMIUM, use_zero_copy, is_overlay_candidate,
-      y_invert);
+      GL_COMMANDS_COMPLETED_CHROMIUM, use_zero_copy,
+      /*is_overlay_candidate=*/true, y_invert);
 }
 #endif  // defined(USE_OZONE)
 
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index faa1d160..b80fc63a 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -669,6 +669,10 @@
     // available.
     if (!exact_keyword.empty() && !keywords.count(exact_keyword)) {
       keywords.insert(exact_keyword);
+      // If the match has an answer, it will look strange to try to display
+      // it along with a keyword hint. Prefer the keyword hint, and revert
+      // to a typical search.
+      match->answer.reset();
       match->associated_keyword.reset(new AutocompleteMatch(
           keyword_provider_->CreateVerbatimMatch(exact_keyword,
                                                  exact_keyword, input_)));
diff --git a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
index 3421dd7..bfe608e 100644
--- a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
+++ b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
@@ -136,6 +136,7 @@
           WebFeature::kThirdPartyServiceWorker,
           WebFeature::kThirdPartySharedWorker,
           WebFeature::kThirdPartyBroadcastChannel,
+          WebFeature::kHeavyAdIntervention,
       }));
   return *opt_in_features;
 }
diff --git a/components/password_manager/content/browser/content_password_manager_driver.cc b/components/password_manager/content/browser/content_password_manager_driver.cc
index 1511a616..cd798f6 100644
--- a/components/password_manager/content/browser/content_password_manager_driver.cc
+++ b/components/password_manager/content/browser/content_password_manager_driver.cc
@@ -14,7 +14,6 @@
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/content/browser/bad_message.h"
 #include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
-#include "components/password_manager/content/browser/form_submission_tracker_util.h"
 #include "components/password_manager/core/browser/password_manager.h"
 #include "components/password_manager/core/browser/password_manager_client.h"
 #include "components/password_manager/core/browser/password_manager_metrics_recorder.h"
@@ -185,19 +184,6 @@
   return render_frame_host_->GetLastCommittedURL();
 }
 
-void ContentPasswordManagerDriver::DidNavigateFrame(
-    content::NavigationHandle* navigation_handle) {
-  // Clear page specific data after main frame navigation.
-  if (navigation_handle->IsInMainFrame() &&
-      !navigation_handle->IsSameDocument()) {
-    NotifyDidNavigateMainFrame(navigation_handle->IsRendererInitiated(),
-                               navigation_handle->GetPageTransition(),
-                               navigation_handle->WasInitiatedByLinkClick(),
-                               GetPasswordManager());
-    GetPasswordAutofillManager()->DidNavigateMainFrame();
-  }
-}
-
 void ContentPasswordManagerDriver::GeneratePassword(
     autofill::mojom::PasswordGenerationAgent::
         UserTriggeredGeneratePasswordCallback callback) {
diff --git a/components/password_manager/content/browser/content_password_manager_driver.h b/components/password_manager/content/browser/content_password_manager_driver.h
index a2a62bc8..b84c7ea 100644
--- a/components/password_manager/content/browser/content_password_manager_driver.h
+++ b/components/password_manager/content/browser/content_password_manager_driver.h
@@ -27,7 +27,6 @@
 }
 
 namespace content {
-class NavigationHandle;
 class RenderFrameHost;
 }
 
@@ -78,7 +77,6 @@
   bool IsMainFrame() const override;
   const GURL& GetLastCommittedURL() const override;
 
-  void DidNavigateFrame(content::NavigationHandle* navigation_handle);
   // Notify the renderer that the user wants to generate password manually.
   void GeneratePassword(autofill::mojom::PasswordGenerationAgent::
                             UserTriggeredGeneratePasswordCallback callback);
diff --git a/components/password_manager/content/browser/content_password_manager_driver_factory.cc b/components/password_manager/content/browser/content_password_manager_driver_factory.cc
index df81c48..ebc498d 100644
--- a/components/password_manager/content/browser/content_password_manager_driver_factory.cc
+++ b/components/password_manager/content/browser/content_password_manager_driver_factory.cc
@@ -15,6 +15,7 @@
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/content/browser/content_password_manager_driver.h"
+#include "components/password_manager/content/browser/form_submission_tracker_util.h"
 #include "components/password_manager/core/browser/password_manager_client.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_entry.h"
@@ -42,18 +43,10 @@
     return;
 
   // NOTE: Can't use |std::make_unique| due to private constructor.
-  auto new_factory = base::WrapUnique(new ContentPasswordManagerDriverFactory(
-      web_contents, password_client, autofill_client));
-  const std::vector<content::RenderFrameHost*> frames =
-      web_contents->GetAllFrames();
-  for (content::RenderFrameHost* frame : frames) {
-    if (frame->IsRenderFrameLive())
-      new_factory->RenderFrameCreated(frame);
-  }
-
   web_contents->SetUserData(
       kContentPasswordManagerDriverFactoryWebContentsUserDataKey,
-      std::move(new_factory));
+      base::WrapUnique(new ContentPasswordManagerDriverFactory(
+          web_contents, password_client, autofill_client)));
 }
 
 ContentPasswordManagerDriverFactory::ContentPasswordManagerDriverFactory(
@@ -95,29 +88,23 @@
   if (!factory)
     return;
 
-  ContentPasswordManagerDriver* driver =
-      factory->GetDriverForFrame(render_frame_host);
-  if (driver)
-    driver->BindPendingReceiver(std::move(pending_receiver));
+  factory->GetDriverForFrame(render_frame_host)
+      ->BindPendingReceiver(std::move(pending_receiver));
 }
 
 ContentPasswordManagerDriver*
 ContentPasswordManagerDriverFactory::GetDriverForFrame(
     content::RenderFrameHost* render_frame_host) {
-  auto mapping = frame_driver_map_.find(render_frame_host);
-  return mapping == frame_driver_map_.end() ? nullptr : mapping->second.get();
-}
+  DCHECK_EQ(web_contents(),
+            content::WebContents::FromRenderFrameHost(render_frame_host));
+  DCHECK(render_frame_host->IsRenderFrameCreated());
 
-void ContentPasswordManagerDriverFactory::RenderFrameCreated(
-    content::RenderFrameHost* render_frame_host) {
-  auto insertion_result =
-      frame_driver_map_.insert(std::make_pair(render_frame_host, nullptr));
-  // This is called twice for the main frame.
-  if (insertion_result.second) {  // This was the first time.
-    insertion_result.first->second =
-        std::make_unique<ContentPasswordManagerDriver>(
-            render_frame_host, password_client_, autofill_client_);
+  auto& driver = frame_driver_map_[render_frame_host];
+  if (!driver) {
+    driver = std::make_unique<ContentPasswordManagerDriver>(
+        render_frame_host, password_client_, autofill_client_);
   }
+  return driver.get();
 }
 
 void ContentPasswordManagerDriverFactory::RenderFrameDeleted(
@@ -126,12 +113,20 @@
 }
 
 void ContentPasswordManagerDriverFactory::DidFinishNavigation(
-    content::NavigationHandle* navigation_handle) {
-  if (!navigation_handle->HasCommitted())
+    content::NavigationHandle* navigation) {
+  if (!navigation->IsInMainFrame() || navigation->IsSameDocument() ||
+      !navigation->HasCommitted()) {
     return;
+  }
 
-  if (auto* driver = GetDriverForFrame(navigation_handle->GetRenderFrameHost()))
-    driver->DidNavigateFrame(navigation_handle);
+  // Clear page specific data after main frame navigation.
+  NotifyDidNavigateMainFrame(navigation->IsRendererInitiated(),
+                             navigation->GetPageTransition(),
+                             navigation->WasInitiatedByLinkClick(),
+                             password_client_->GetPasswordManager());
+  GetDriverForFrame(navigation->GetRenderFrameHost())
+      ->GetPasswordAutofillManager()
+      ->DidNavigateMainFrame();
 }
 
 void ContentPasswordManagerDriverFactory::RequestSendLoggingAvailability() {
diff --git a/components/password_manager/content/browser/content_password_manager_driver_factory.h b/components/password_manager/content/browser/content_password_manager_driver_factory.h
index 39616d1..083130d 100644
--- a/components/password_manager/content/browser/content_password_manager_driver_factory.h
+++ b/components/password_manager/content/browser/content_password_manager_driver_factory.h
@@ -54,18 +54,17 @@
   // chrome://password-manager-internals is available.
   void RequestSendLoggingAvailability();
 
-  // content::WebContentsObserver:
-  void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
-  void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
-  void DidFinishNavigation(
-      content::NavigationHandle* navigation_handle) override;
-
  private:
   ContentPasswordManagerDriverFactory(
       content::WebContents* web_contents,
       PasswordManagerClient* client,
       autofill::AutofillClient* autofill_client);
 
+  // content::WebContentsObserver:
+  void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
+  void DidFinishNavigation(
+      content::NavigationHandle* navigation_handle) override;
+
   std::map<content::RenderFrameHost*,
            std::unique_ptr<ContentPasswordManagerDriver>>
       frame_driver_map_;
diff --git a/components/password_manager/core/browser/leaked_credentials_table.cc b/components/password_manager/core/browser/leaked_credentials_table.cc
index dbc94dd..65d0a1e 100644
--- a/components/password_manager/core/browser/leaked_credentials_table.cc
+++ b/components/password_manager/core/browser/leaked_credentials_table.cc
@@ -106,17 +106,57 @@
   return s.Run();
 }
 
-bool LeakedCredentialsTable::RemoveRowsCreatedBetween(base::Time remove_begin,
-                                                      base::Time remove_end) {
-  sql::Statement s(
-      db_->GetCachedStatement(SQL_FROM_HERE,
-                              "DELETE FROM leaked_credentials WHERE "
-                              "create_time >= ? AND create_time < ?"));
-  s.BindInt64(0, remove_begin.ToDeltaSinceWindowsEpoch().InMicroseconds());
-  s.BindInt64(1, remove_end.is_null()
-                     ? std::numeric_limits<int64_t>::max()
-                     : remove_end.ToDeltaSinceWindowsEpoch().InMicroseconds());
-  return s.Run();
+bool LeakedCredentialsTable::RemoveRowsByUrlAndTime(
+    const base::RepeatingCallback<bool(const GURL&)>& url_filter,
+    base::Time remove_begin,
+    base::Time remove_end) {
+  if (remove_end.is_null())
+    remove_end = base::Time::Max();
+
+  const int64_t remove_begin_us =
+      remove_begin.ToDeltaSinceWindowsEpoch().InMicroseconds();
+  const int64_t remove_end_us =
+      remove_end.ToDeltaSinceWindowsEpoch().InMicroseconds();
+
+  // If |url_filter| is null, remove all records in given date range.
+  if (!url_filter) {
+    sql::Statement s(
+        db_->GetCachedStatement(SQL_FROM_HERE,
+                                "DELETE FROM leaked_credentials WHERE "
+                                "create_time >= ? AND create_time < ?"));
+    s.BindInt64(0, remove_begin_us);
+    s.BindInt64(1, remove_end_us);
+    return s.Run();
+  }
+
+  // Otherwise, filter urls.
+  sql::Statement s(db_->GetCachedStatement(
+      SQL_FROM_HERE,
+      "SELECT DISTINCT url FROM leaked_credentials WHERE "
+      "create_time >= ? AND create_time < ?"));
+  s.BindInt64(0, remove_begin_us);
+  s.BindInt64(1, remove_end_us);
+
+  std::vector<std::string> urls;
+  while (s.Step()) {
+    std::string url = s.ColumnString(0);
+    if (url_filter.Run(GURL(url))) {
+      urls.push_back(std::move(url));
+    }
+  }
+
+  bool success = true;
+  for (const std::string& url : urls) {
+    sql::Statement s(
+        db_->GetCachedStatement(SQL_FROM_HERE,
+                                "DELETE FROM leaked_credentials WHERE url = ? "
+                                "AND create_time >= ? AND create_time < ?"));
+    s.BindString(0, url);
+    s.BindInt64(1, remove_begin_us);
+    s.BindInt64(2, remove_end_us);
+    success = success && s.Run();
+  }
+  return success;
 }
 
 std::vector<LeakedCredentials> LeakedCredentialsTable::GetAllRows() {
diff --git a/components/password_manager/core/browser/leaked_credentials_table.h b/components/password_manager/core/browser/leaked_credentials_table.h
index f08e62b..a4ed2037 100644
--- a/components/password_manager/core/browser/leaked_credentials_table.h
+++ b/components/password_manager/core/browser/leaked_credentials_table.h
@@ -54,8 +54,13 @@
 
   // Removes all leaked credentials created between |remove_begin| inclusive and
   // |remove_end| exclusive. Using a null Time value will do an unbounded delete
-  // in either direction.
-  bool RemoveRowsCreatedBetween(base::Time remove_begin, base::Time remove_end);
+  // in either direction. If |url_filter| is not null, only leaked credentials
+  // for matching urls are removed. Returns true if the SQL completed
+  // successfully.
+  bool RemoveRowsByUrlAndTime(
+      const base::RepeatingCallback<bool(const GURL&)>& url_filter,
+      base::Time remove_begin,
+      base::Time remove_end);
 
   // Returns all leaked credentials from the database.
   std::vector<LeakedCredentials> GetAllRows();
diff --git a/components/password_manager/core/browser/leaked_credentials_table_unittest.cc b/components/password_manager/core/browser/leaked_credentials_table_unittest.cc
index f4df298..35f3f63a 100644
--- a/components/password_manager/core/browser/leaked_credentials_table_unittest.cc
+++ b/components/password_manager/core/browser/leaked_credentials_table_unittest.cc
@@ -4,6 +4,9 @@
 
 #include "components/password_manager/core/browser/leaked_credentials_table.h"
 
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/callback.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/strings/utf_string_conversions.h"
 #include "sql/database.h"
@@ -15,6 +18,7 @@
 
 const char kTestDomain[] = "http://example.com";
 const char kTestDomain2[] = "http://test.com";
+const char kTestDomain3[] = "http://google.com";
 const char kUsername[] = "user";
 const char kUsername2[] = "user2";
 const char kUsername3[] = "user3";
@@ -116,8 +120,9 @@
               ElementsAre(leaked_credentials1, leaked_credentials2,
                           leaked_credentials3));
 
-  EXPECT_TRUE(db()->RemoveRowsCreatedBetween(base::Time::FromTimeT(15),
-                                             base::Time::FromTimeT(25)));
+  EXPECT_TRUE(db()->RemoveRowsByUrlAndTime(base::NullCallback(),
+                                           base::Time::FromTimeT(15),
+                                           base::Time::FromTimeT(25)));
 
   EXPECT_THAT(db()->GetAllRows(),
               ElementsAre(leaked_credentials1, leaked_credentials3));
@@ -138,7 +143,8 @@
   EXPECT_THAT(db()->GetAllRows(),
               ElementsAre(leaked_credentials_begin, leaked_credentials_end));
 
-  EXPECT_TRUE(db()->RemoveRowsCreatedBetween(begin_time, end_time));
+  EXPECT_TRUE(
+      db()->RemoveRowsByUrlAndTime(base::NullCallback(), begin_time, end_time));
   // RemoveRowsCreatedBetween takes |begin_time| inclusive and |end_time|
   // exclusive, hence the credentials with |end_time| should remain in the
   // database.
@@ -163,11 +169,39 @@
               ElementsAre(leaked_credentials1, leaked_credentials2,
                           leaked_credentials3));
 
-  EXPECT_TRUE(db()->RemoveRowsCreatedBetween(base::Time(), base::Time()));
+  EXPECT_TRUE(db()->RemoveRowsByUrlAndTime(base::NullCallback(), base::Time(),
+                                           base::Time()));
 
   EXPECT_THAT(db()->GetAllRows(), IsEmpty());
 }
 
+TEST_F(LeakedCredentialsTableTest, RemoveRowsByUrlAndTime) {
+  LeakedCredentials leaked_credentials1 = test_data();
+  LeakedCredentials leaked_credentials2 = test_data();
+  LeakedCredentials leaked_credentials3 = test_data();
+  LeakedCredentials leaked_credentials4 = test_data();
+  leaked_credentials2.username = base::ASCIIToUTF16(kUsername2);
+  leaked_credentials3.url = GURL(kTestDomain2);
+  leaked_credentials4.url = GURL(kTestDomain3);
+
+  EXPECT_TRUE(db()->AddRow(leaked_credentials1));
+  EXPECT_TRUE(db()->AddRow(leaked_credentials2));
+  EXPECT_TRUE(db()->AddRow(leaked_credentials3));
+  EXPECT_TRUE(db()->AddRow(leaked_credentials4));
+
+  EXPECT_THAT(db()->GetAllRows(),
+              ElementsAre(leaked_credentials1, leaked_credentials2,
+                          leaked_credentials3, leaked_credentials4));
+
+  EXPECT_TRUE(db()->RemoveRowsByUrlAndTime(
+      base::BindRepeating(std::not_equal_to<GURL>(), leaked_credentials1.url),
+      base::Time(), base::Time()));
+  // With unbounded time range and given url filter all rows that are not
+  // matching the |leaked_credentials1.url| should be removed.
+  EXPECT_THAT(db()->GetAllRows(),
+              ElementsAre(leaked_credentials1, leaked_credentials2));
+}
+
 TEST_F(LeakedCredentialsTableTest, BadURL) {
   test_data().url = GURL("bad");
   EXPECT_FALSE(db()->AddRow(test_data()));
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h
index 9b27461..8b7f256 100644
--- a/components/password_manager/core/browser/mock_password_store.h
+++ b/components/password_manager/core/browser/mock_password_store.h
@@ -76,8 +76,10 @@
   MOCK_METHOD2(RemoveLeakedCredentialsImpl,
                void(const GURL&, const base::string16&));
   MOCK_METHOD0(GetAllLeakedCredentialsImpl, std::vector<LeakedCredentials>());
-  MOCK_METHOD2(RemoveLeakedCredentialsCreatedBetweenImpl,
-               void(base::Time, base::Time));
+  MOCK_METHOD3(RemoveLeakedCredentialsByUrlAndTimeImpl,
+               void(const base::RepeatingCallback<bool(const GURL&)>&,
+                    base::Time,
+                    base::Time));
   MOCK_CONST_METHOD0(IsAbleToSavePasswords, bool());
 
 #if defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc
index 15f8dd60..0232462 100644
--- a/components/password_manager/core/browser/password_store.cc
+++ b/components/password_manager/core/browser/password_store.cc
@@ -358,14 +358,15 @@
       base::BindOnce(&PasswordStore::GetAllLeakedCredentialsImpl, this));
 }
 
-void PasswordStore::RemoveLeakedCredentialsCreatedBetween(
+void PasswordStore::RemoveLeakedCredentialsByUrlAndTime(
+    base::RepeatingCallback<bool(const GURL&)> url_filter,
     base::Time remove_begin,
     base::Time remove_end,
-    const base::Closure& completion) {
+    base::OnceClosure completion) {
   DCHECK(main_task_runner_->RunsTasksInCurrentSequence());
   ScheduleTask(base::BindOnce(
-      &PasswordStore::RemoveLeakedCredentialsCreatedBetweenInternal, this,
-      remove_begin, remove_end, completion));
+      &PasswordStore::RemoveLeakedCredentialsByUrlAndTimeInternal, this,
+      std::move(url_filter), remove_begin, remove_end, std::move(completion)));
 }
 
 void PasswordStore::AddObserver(Observer* observer) {
@@ -860,14 +861,15 @@
     main_task_runner_->PostTask(FROM_HERE, std::move(completion));
 }
 
-void PasswordStore::RemoveLeakedCredentialsCreatedBetweenInternal(
+void PasswordStore::RemoveLeakedCredentialsByUrlAndTimeInternal(
+    const base::RepeatingCallback<bool(const GURL&)>& url_filter,
     base::Time remove_begin,
     base::Time remove_end,
-    const base::Closure& completion) {
+    base::OnceClosure completion) {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
-  RemoveLeakedCredentialsCreatedBetweenImpl(remove_begin, remove_end);
+  RemoveLeakedCredentialsByUrlAndTimeImpl(url_filter, remove_begin, remove_end);
   if (!completion.is_null())
-    main_task_runner_->PostTask(FROM_HERE, completion);
+    main_task_runner_->PostTask(FROM_HERE, std::move(completion));
 }
 
 std::vector<std::unique_ptr<autofill::PasswordForm>>
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h
index 52dc8d9..f610fd7 100644
--- a/components/password_manager/core/browser/password_store.h
+++ b/components/password_manager/core/browser/password_store.h
@@ -253,12 +253,15 @@
   // request will be cancelled if the consumer is destroyed.
   void GetAllLeakedCredentials(PasswordLeakHistoryConsumer* consumer);
 
-  // Removes all leaked credentials in the given date range. If |completion| is
-  // not null, it will be posted to the |main_task_runner_| after deletions have
-  // been completed. Should be called on the UI thread.
-  void RemoveLeakedCredentialsCreatedBetween(base::Time remove_begin,
-                                             base::Time remove_end,
-                                             const base::Closure& completion);
+  // Removes all leaked credentials in the given date range. If |url_filter| is
+  // not null, only leaked credentials for matching urls are removed. If
+  // |completion| is not null, it will be posted to the |main_task_runner_|
+  // after deletions have been completed. Should be called on the UI thread.
+  void RemoveLeakedCredentialsByUrlAndTime(
+      base::RepeatingCallback<bool(const GURL&)> url_filter,
+      base::Time remove_begin,
+      base::Time remove_end,
+      base::OnceClosure completion);
 
   // Adds an observer to be notified when the password store data changes.
   void AddObserver(Observer* observer);
@@ -460,7 +463,8 @@
   virtual void RemoveLeakedCredentialsImpl(const GURL& url,
                                            const base::string16& username) = 0;
   virtual std::vector<LeakedCredentials> GetAllLeakedCredentialsImpl() = 0;
-  virtual void RemoveLeakedCredentialsCreatedBetweenImpl(
+  virtual void RemoveLeakedCredentialsByUrlAndTimeImpl(
+      const base::RepeatingCallback<bool(const GURL&)>& url_filter,
       base::Time remove_begin,
       base::Time remove_end) = 0;
 
@@ -602,10 +606,11 @@
       const base::Closure& completion);
   void UnblacklistInternal(const PasswordStore::FormDigest& form_digest,
                            base::OnceClosure completion);
-  void RemoveLeakedCredentialsCreatedBetweenInternal(
+  void RemoveLeakedCredentialsByUrlAndTimeInternal(
+      const base::RepeatingCallback<bool(const GURL&)>& url_filter,
       base::Time remove_begin,
       base::Time remove_end,
-      const base::Closure& completion);
+      base::OnceClosure completion);
 
   // Finds all PasswordForms with a signon_realm that is equal to, or is a
   // PSL-match to that of |form|, and takes care of notifying the consumer with
diff --git a/components/password_manager/core/browser/password_store_default.cc b/components/password_manager/core/browser/password_store_default.cc
index fdb7cf4..c37b5cf 100644
--- a/components/password_manager/core/browser/password_store_default.cc
+++ b/components/password_manager/core/browser/password_store_default.cc
@@ -244,12 +244,13 @@
                    : std::vector<LeakedCredentials>();
 }
 
-void PasswordStoreDefault::RemoveLeakedCredentialsCreatedBetweenImpl(
+void PasswordStoreDefault::RemoveLeakedCredentialsByUrlAndTimeImpl(
+    const base::RepeatingCallback<bool(const GURL&)>& url_filter,
     base::Time remove_begin,
     base::Time remove_end) {
   if (login_db_) {
-    login_db_->leaked_credentials_table().RemoveRowsCreatedBetween(remove_begin,
-                                                                   remove_end);
+    login_db_->leaked_credentials_table().RemoveRowsByUrlAndTime(
+        url_filter, remove_begin, remove_end);
   }
 }
 
diff --git a/components/password_manager/core/browser/password_store_default.h b/components/password_manager/core/browser/password_store_default.h
index 6b25dbc3..b48f8ee8 100644
--- a/components/password_manager/core/browser/password_store_default.h
+++ b/components/password_manager/core/browser/password_store_default.h
@@ -77,7 +77,8 @@
   void RemoveLeakedCredentialsImpl(const GURL& url,
                                    const base::string16& username) override;
   std::vector<LeakedCredentials> GetAllLeakedCredentialsImpl() override;
-  void RemoveLeakedCredentialsCreatedBetweenImpl(
+  void RemoveLeakedCredentialsByUrlAndTimeImpl(
+      const base::RepeatingCallback<bool(const GURL&)>& url_filter,
       base::Time remove_begin,
       base::Time remove_end) override;
 
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc
index e886c14..1326f1a 100644
--- a/components/password_manager/core/browser/password_store_unittest.cc
+++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -1303,8 +1303,9 @@
   WaitForPasswordStore();
   testing::Mock::VerifyAndClearExpectations(&consumer);
 
-  store->RemoveLeakedCredentialsCreatedBetween(
-      base::Time::FromTimeT(150), base::Time::FromTimeT(250), base::Closure());
+  store->RemoveLeakedCredentialsByUrlAndTime(
+      base::BindRepeating(std::not_equal_to<GURL>(), leaked_credentials3.url),
+      base::Time::FromTimeT(150), base::Time::FromTimeT(350), base::Closure());
 
   EXPECT_CALL(consumer, OnGetLeakedCredentials(UnorderedElementsAre(
                             leaked_credentials1, leaked_credentials3)));
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc
index 45e06f8..872c8a8 100644
--- a/components/password_manager/core/browser/test_password_store.cc
+++ b/components/password_manager/core/browser/test_password_store.cc
@@ -242,7 +242,8 @@
   return std::vector<LeakedCredentials>();
 }
 
-void TestPasswordStore::RemoveLeakedCredentialsCreatedBetweenImpl(
+void TestPasswordStore::RemoveLeakedCredentialsByUrlAndTimeImpl(
+    const base::RepeatingCallback<bool(const GURL&)>& url_filter,
     base::Time remove_begin,
     base::Time remove_end) {
   NOTIMPLEMENTED();
diff --git a/components/password_manager/core/browser/test_password_store.h b/components/password_manager/core/browser/test_password_store.h
index 5d3af311..53cb38e 100644
--- a/components/password_manager/core/browser/test_password_store.h
+++ b/components/password_manager/core/browser/test_password_store.h
@@ -90,7 +90,8 @@
   void RemoveLeakedCredentialsImpl(const GURL& url,
                                    const base::string16& username) override;
   std::vector<LeakedCredentials> GetAllLeakedCredentialsImpl() override;
-  void RemoveLeakedCredentialsCreatedBetweenImpl(
+  void RemoveLeakedCredentialsByUrlAndTimeImpl(
+      const base::RepeatingCallback<bool(const GURL&)>& url_filter,
       base::Time remove_begin,
       base::Time remove_end) override;
 
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto
index b1e29703..6cc3da3 100644
--- a/components/policy/proto/chrome_device_policy.proto
+++ b/components/policy/proto/chrome_device_policy.proto
@@ -1494,14 +1494,6 @@
   optional string device_login_screen_webusb_allow_devices_for_urls = 1;
 }
 
-// Settings that control if the device is enforced to show (or hide) system
-// information.
-message DeviceLoginScreenSystemInfoEnforcedProto {
-  // Determines whether the system information is always shown (or hidden) on
-  // the login screen.
-  optional bool enabled = 1;
-}
-
 message ChromeDeviceSettingsProto {
   reserved 61, 90;
   optional DevicePolicyRefreshRateProto device_policy_refresh_rate = 1;
@@ -1616,6 +1608,5 @@
   optional DevicePowerwashAllowedProto device_powerwash_allowed = 91;
   optional DeviceLoginScreenWebUsbAllowDevicesForUrlsProto
       device_login_screen_webusb_allow_devices_for_urls = 92;
-  optional DeviceLoginScreenSystemInfoEnforcedProto
-      device_login_screen_system_info_enforced = 93;
+  optional BooleanPolicyProto device_login_screen_system_info_enforced = 93;
 }
diff --git a/components/policy/test_support/policy_testserver.py b/components/policy/test_support/policy_testserver.py
index 954022d..bc4268c 100644
--- a/components/policy/test_support/policy_testserver.py
+++ b/components/policy/test_support/policy_testserver.py
@@ -208,6 +208,15 @@
 
 INVALID_ENROLLMENT_TOKEN = 'invalid_enrollment_token'
 
+POLICY_COMMON_DEFINITIONS_TYPES = [
+  'StringList',
+  'PolicyOptions',
+  'BooleanPolicyProto',
+  'IntegerPolicyProto',
+  'StringPolicyProto',
+  'StringListPolicyProto'
+]
+
 class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
   """Decodes and handles device management requests from clients.
 
@@ -988,6 +997,17 @@
       self.SetProtobufMessageField(settings, field_descriptor,
                                    field_value)
 
+  def GetMessageDefinitionSource(self, message_type):
+    """Retrieve either policy_common_defintions, or chrome_device_policy
+    proto file, which contains the definition of the message.
+
+    Args:
+      message_type: name of the message definition type.
+    """
+    if message_type in POLICY_COMMON_DEFINITIONS_TYPES:
+      return 'cd'
+    return 'dp'
+
   def GatherDevicePolicySettings(self, settings, policies):
     """Copies all the policies from a dictionary into a protobuf of type
     CloudDeviceSettingsProto.
@@ -998,7 +1018,8 @@
     """
     for group in settings.DESCRIPTOR.fields:
       # Create protobuf message for group.
-      group_message = eval('dp.' + group.message_type.name + '()')
+      group_message = eval(self.GetMessageDefinitionSource(
+          group.message_type.name) + '.' + group.message_type.name + '()')
       # Indicates if at least one field was set in |group_message|.
       got_fields = False
       # Iterate over fields of the message and feed them from the
diff --git a/components/resources/OWNERS b/components/resources/OWNERS
index 697f205..7b2b1c0 100644
--- a/components/resources/OWNERS
+++ b/components/resources/OWNERS
@@ -24,4 +24,5 @@
 per-file printing_resources.grdp=file://printing/OWNERS
 per-file security_interstitials_resources.grdp=file://components/security_interstitials/OWNERS
 per-file sync_driver_resources.grdp=file://components/sync/OWNERS
+per-file translate_resources.grdp=file://components/translate/OWNERS
 per-file version_ui*=file://ui/webui/PLATFORM_OWNERS
diff --git a/components/resources/translate_resources.grdp b/components/resources/translate_resources.grdp
index 5226e140..0a04033 100644
--- a/components/resources/translate_resources.grdp
+++ b/components/resources/translate_resources.grdp
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <grit-part>
-  <include name="IDR_TRANSLATE_JS" file="../translate/core/browser/resources/translate.js" type="BINDATA" />
+  <include name="IDR_TRANSLATE_JS" file="../translate/core/browser/resources/translate.js" type="BINDATA" compress="gzip" />
 </grit-part>
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json
index b134602..af61d0c5 100644
--- a/components/search_engines/prepopulated_engines.json
+++ b/components/search_engines/prepopulated_engines.json
@@ -635,6 +635,7 @@
       "alternate_urls": [
 	"http://hladaj.atlas.sk/fulltext/?phrase={searchTerms}"
       ],
+      "type": "SEARCH_ENGINE_ATLAS",
       "id": 27
     },
 
@@ -1009,5 +1010,9 @@
       "type": "SEARCH_ENGINE_ZOZNAM",
       "id": 85
     }
+  },
+
+  "generate_array": {
+    "array_name": "kAllEngines"
   }
 }
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc
index 5fd11a9..52dd123a 100644
--- a/components/search_engines/template_url_prepopulate_data.cc
+++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -889,96 +889,6 @@
 };
 // ----------------------------------------------------------------------------
 
-// A list of all the engines that we know about.
-const PrepopulatedEngine* const kAllEngines[] = {
-    // Prepopulated engines:
-    &ask,
-    &baidu,
-    &bing,
-    &coccoc,
-    &daum,
-    &duckduckgo,
-    &google,
-    &mail_ru,
-    &naver,
-    &qwant,
-    &seznam,
-    &sogou,
-    &yahoo,
-    &yahoo_ar,
-    &yahoo_at,
-    &yahoo_au,
-    &yahoo_br,
-    &yahoo_ca,
-    &yahoo_ch,
-    &yahoo_cl,
-    &yahoo_co,
-    &yahoo_de,
-    &yahoo_dk,
-    &yahoo_es,
-    &yahoo_fi,
-    &yahoo_fr,
-    &yahoo_hk,
-    &yahoo_id,
-    &yahoo_in,
-    &yahoo_jp,
-    &yahoo_mx,
-    &yahoo_my,
-    &yahoo_nl,
-    &yahoo_nz,
-    &yahoo_pe,
-    &yahoo_ph,
-    &yahoo_qc,
-    &yahoo_se,
-    &yahoo_sg,
-    &yahoo_th,
-    &yahoo_tr,
-    &yahoo_tw,
-    &yahoo_uk,
-    &yahoo_ve,
-    &yahoo_vn,
-    &yandex_by,
-    &yandex_com,
-    &yandex_kz,
-    &yandex_ru,
-    &yandex_tr,
-    &yandex_ua,
-
-    // UMA-only engines:
-    &atlas_cz,
-    &atlas_sk,
-    &avg,
-    &babylon,
-    &conduit,
-    &delfi_lt,
-    &delfi_lv,
-    &delta,
-    &funmoods,
-    &goo,
-    &imesh,
-    &iminent,
-    &in,
-    &incredibar,
-    &libero,
-    &neti,
-    &nigma,
-    &ok,
-    &rambler,
-    &sapo,
-    &search_results,
-    &searchnu,
-    &snapdo,
-    &softonic,
-    &sweetim,
-    &sweetpacks,
-    &terra_ar,
-    &terra_es,
-    &tut,
-    &walla,
-    &wp,
-    &zoznam,
-};
-
 std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulationSetFromCountryID(
     int country_id) {
   const PrepopulatedEngine* const* engines;
@@ -1404,8 +1314,8 @@
 #endif
 
 std::vector<const PrepopulatedEngine*> GetAllPrepopulatedEngines() {
-  return std::vector<const PrepopulatedEngine*>(std::begin(kAllEngines),
-                                                std::end(kAllEngines));
+  return std::vector<const PrepopulatedEngine*>(
+      &kAllEngines[0], &kAllEngines[0] + kAllEnginesLength);
 }
 
 void ClearPrepopulatedEnginesInPrefs(PrefService* prefs) {
@@ -1442,7 +1352,7 @@
     return google.type;
 
   // Now check the rest of the prepopulate data.
-  for (size_t i = 0; i < base::size(kAllEngines); ++i) {
+  for (size_t i = 0; i < kAllEnginesLength; ++i) {
     // First check the main search URL.
     if (SameDomain(url, GURL(kAllEngines[i]->search_url)))
       return kAllEngines[i]->type;
diff --git a/components/signin/core/browser/account_reconcilor.h b/components/signin/core/browser/account_reconcilor.h
index 4a17c37..b4b9cf2e 100644
--- a/components/signin/core/browser/account_reconcilor.h
+++ b/components/signin/core/browser/account_reconcilor.h
@@ -253,8 +253,6 @@
   void UnregisterWithAllDependencies();
   void RegisterWithIdentityManager();
   void UnregisterWithIdentityManager();
-  void RegisterWithCookieManagerService();
-  void UnregisterWithCookieManagerService();
   void RegisterWithContentSettings();
   void UnregisterWithContentSettings();
 
diff --git a/components/signin/core/browser/signin_internals_util.cc b/components/signin/core/browser/signin_internals_util.cc
index 68884202..68dc2ee 100644
--- a/components/signin/core/browser/signin_internals_util.cc
+++ b/components/signin/core/browser/signin_internals_util.cc
@@ -46,27 +46,4 @@
   return std::string();
 }
 
-std::string TokenPrefPath(const std::string& token_name) {
-  return std::string(kTokenPrefPrefix) + token_name;
-}
-
-// Gets the first few hex characters of the SHA256 hash of the passed in string.
-// These are enough to perform equality checks across a single users tokens,
-// while preventing outsiders from reverse-engineering the actual token from
-// the displayed value.
-// Note that for readability (in about:signin-internals), an empty string
-// is not hashed, but simply returned as an empty string.
-std::string GetTruncatedHash(const std::string& str) {
-  if (str.empty())
-    return str;
-
-  // Since each character in the hash string generates two hex charaters
-  // we only need half as many charaters in |hash_val| as hex characters
-  // returned.
-  const int kTruncateSize = kTruncateTokenStringLength / 2;
-  char hash_val[kTruncateSize];
-  crypto::SHA256HashString(str, &hash_val[0], kTruncateSize);
-  return base::ToLowerASCII(base::HexEncode(&hash_val[0], kTruncateSize));
-}
-
 } //  namespace signin_internals_util
diff --git a/components/signin/core/browser/signin_internals_util.h b/components/signin/core/browser/signin_internals_util.h
index 576710b..dc6a0e240 100644
--- a/components/signin/core/browser/signin_internals_util.h
+++ b/components/signin/core/browser/signin_internals_util.h
@@ -19,9 +19,6 @@
 extern const char kSigninPrefPrefix[];
 extern const char kTokenPrefPrefix[];
 
-// The length of strings returned by GetTruncatedHash() below.
-const size_t kTruncateTokenStringLength = 6;
-
 // Helper enums to access fields from SigninStatus (declared below).
 enum {
   SIGNIN_FIELDS_BEGIN = 0,
@@ -54,23 +51,10 @@
   SIGNIN_FIELDS_COUNT = SIGNIN_FIELDS_END - SIGNIN_FIELDS_BEGIN
 };
 
-// Returns the root preference path for the service. The path should be
-// qualified with one of .value, .status or .time to get the respective
-// full preference path names.
-std::string TokenPrefPath(const std::string& service_name);
-
 // Returns the name of a SigninStatus field.
 std::string SigninStatusFieldToString(UntimedSigninStatusField field);
 std::string SigninStatusFieldToString(TimedSigninStatusField field);
 
-// Gets the first 6 hex characters of the SHA256 hash of the passed in string.
-// These are enough to perform equality checks across a single users tokens,
-// while preventing outsiders from reverse-engineering the actual token from
-// the displayed value.
-// Note that for readability (in about:signin-internals), an empty string
-// is not hashed, but simply returned as an empty string.
-std::string GetTruncatedHash(const std::string& str);
-
 } // namespace signin_internals_util
 
 #endif  // COMPONENTS_SIGNIN_CORE_BROWSER_SIGNIN_INTERNALS_UTIL_H_
diff --git a/components/test/data/autofill_assistant/autofill_assistant_target_website.html b/components/test/data/autofill_assistant/html/autofill_assistant_target_website.html
similarity index 97%
rename from components/test/data/autofill_assistant/autofill_assistant_target_website.html
rename to components/test/data/autofill_assistant/html/autofill_assistant_target_website.html
index 63e90eb..6523ec2 100644
--- a/components/test/data/autofill_assistant/autofill_assistant_target_website.html
+++ b/components/test/data/autofill_assistant/html/autofill_assistant_target_website.html
@@ -236,6 +236,9 @@
     <iframe id="iframe" name="test_iframe" width="100%" height="500" src=
         "autofill_assistant_target_website_iframe_one.html"></iframe>
 
+    <iframe id="iframeExternal" name="test_iframe_external" width="100%" height="500" src=
+        "http://localhost:8081/autofill_assistant_external_iframe.html"></iframe>
+
     <input type="checkbox" id="terms-and-conditions" />
     <label for="terms-and-conditions" >
       <a href="#">I have read and understood <br />the terms and conditions</a>
diff --git a/components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_one.html b/components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_one.html
similarity index 97%
rename from components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_one.html
rename to components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_one.html
index d9f33c5..2e7605506 100644
--- a/components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_one.html
+++ b/components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_one.html
@@ -60,7 +60,7 @@
   <body onload="load()">
     <div>
       <form name="address" id="address_section">
-        <div id='billing'>
+        <div id="billing">
           <h2>Billing Address</h2>
           Name: <input type="text" name="name"><br>
           Address: <input type="text" name="address"><br>
@@ -87,6 +87,10 @@
     </div>
 
     <div>
+      <input id="input" type="text" />
+    </div>
+
+    <div>
       <p id="touch_area" ontouchend="removeTouchArea()">Touchable Area</p>
       <br>
     </div>
@@ -107,4 +111,4 @@
     <iframe id="iframe" width="100%" height="500" src=
         "autofill_assistant_target_website_iframe_two.html"></iframe>
   </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_two.html b/components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_two.html
similarity index 100%
rename from components/test/data/autofill_assistant/autofill_assistant_target_website_iframe_two.html
rename to components/test/data/autofill_assistant/html/autofill_assistant_target_website_iframe_two.html
diff --git a/components/test/data/autofill_assistant/html_iframe/autofill_assistant_external_iframe.html b/components/test/data/autofill_assistant/html_iframe/autofill_assistant_external_iframe.html
new file mode 100644
index 0000000..7304a41
--- /dev/null
+++ b/components/test/data/autofill_assistant/html_iframe/autofill_assistant_external_iframe.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+
+<!--
+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.
+-->
+<html>
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>Autofill Assistant Test</title>
+
+    <script>
+      var removeDiv = function() {
+        var div = document.getElementById("div");
+        div.parentNode.removeChild(div);
+      }
+    </script>
+  </head>
+  <body>
+    <button id="button" type="button" onclick="removeDiv()">Button</button>
+    <div id="div">Text</div>
+
+    <input id="input" type="text" />
+  </body>
+</html>
diff --git a/components/translate/core/browser/translate_script.cc b/components/translate/core/browser/translate_script.cc
index e2b43c5..5724783 100644
--- a/components/translate/core/browser/translate_script.cc
+++ b/components/translate/core/browser/translate_script.cc
@@ -154,10 +154,8 @@
         &data_, "var securityOrigin = '%s';", security_origin.spec().c_str());
 
     // Load embedded translate.js.
-    base::StringPiece str =
-        ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
-            IDR_TRANSLATE_JS);
-    str.AppendToString(&data_);
+    data_.append(ui::ResourceBundle::GetSharedInstance().DecompressDataResource(
+        IDR_TRANSLATE_JS));
 
 #if defined(OS_IOS)
     // Append snippet to install callbacks on translate.js if available.
diff --git a/components/translate/ios/browser/js_translate_manager_unittest.mm b/components/translate/ios/browser/js_translate_manager_unittest.mm
index af64932..550e3f5 100644
--- a/components/translate/ios/browser/js_translate_manager_unittest.mm
+++ b/components/translate/ios/browser/js_translate_manager_unittest.mm
@@ -21,11 +21,10 @@
   JsTranslateManagerTest() {
     receiver_ = [[CRWTestJSInjectionReceiver alloc] init];
     manager_ = [[JsTranslateManager alloc] initWithReceiver:receiver_];
-    base::StringPiece script =
-        ui::ResourceBundle::GetSharedInstance().GetRawDataResource(
+    std::string script =
+        ui::ResourceBundle::GetSharedInstance().DecompressDataResource(
             IDR_TRANSLATE_JS);
-    [manager_ setScript:base::SysUTF8ToNSString(script.as_string() +
-                                                "('DummyKey');")];
+    [manager_ setScript:base::SysUTF8ToNSString(script + "('DummyKey');")];
   }
 
   bool IsDefined(NSString* name) {
diff --git a/components/ukm/ukm_recorder_impl.cc b/components/ukm/ukm_recorder_impl.cc
index 55f9023..cced2e4 100644
--- a/components/ukm/ukm_recorder_impl.cc
+++ b/components/ukm/ukm_recorder_impl.cc
@@ -19,6 +19,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "components/variations/variations_associated_data.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_decode.h"
 #include "services/metrics/public/cpp/ukm_source.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
@@ -270,6 +271,7 @@
   is_webstore_extension_callback_ = callback;
 }
 
+// TODO(rkaplow): This should be refactored.
 void UkmRecorderImpl::StoreRecordingsInReport(Report* report) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -393,6 +395,24 @@
       "UKM.Sources.SerializedCount2.App",
       serialized_source_type_counts[ukm::SourceIdType::APP_ID]);
 
+  // We record a UMA metric specifically for the number of serialized events
+  // with the FCP metric. This is for data quality verification.
+  const uint64_t pageload_hash =
+      base::HashMetricName(ukm::builders::PageLoad::kEntryName);
+  const uint64_t fcp_hash = base::HashMetricName(
+      ukm::builders::PageLoad::
+          kPaintTiming_NavigationToFirstContentfulPaintName);
+  int num_recorded_fcp = 0;
+  for (const auto& entry : recordings_.entries) {
+    if (entry->event_hash == pageload_hash) {
+      if (entry->metrics.find(fcp_hash) != entry->metrics.end()) {
+        num_recorded_fcp++;
+      }
+    }
+  }
+  UMA_HISTOGRAM_COUNTS_100000("UKM.Entries.SerializedCountFCP",
+                              num_recorded_fcp);
+
   // For each matching id in obsolete_source_ids, remove the Source from
   // recordings_.sources. The remaining sources form the deferred sources for
   // the next report.
diff --git a/content/browser/appcache/appcache_group.cc b/content/browser/appcache/appcache_group.cc
index be53ed1..8120f407 100644
--- a/content/browser/appcache/appcache_group.cc
+++ b/content/browser/appcache/appcache_group.cc
@@ -232,7 +232,7 @@
 void AppCacheGroup::ScheduleUpdateRestart(int delay_ms) {
   DCHECK(restart_update_task_.IsCancelled());
   restart_update_task_.Reset(
-      base::Bind(&AppCacheGroup::RunQueuedUpdates, this));
+      base::BindOnce(&AppCacheGroup::RunQueuedUpdates, this));
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, restart_update_task_.callback(),
       base::TimeDelta::FromMilliseconds(delay_ms));
diff --git a/content/browser/appcache/appcache_group.h b/content/browser/appcache/appcache_group.h
index a058f600..63c1bb5 100644
--- a/content/browser/appcache/appcache_group.h
+++ b/content/browser/appcache/appcache_group.h
@@ -191,7 +191,7 @@
   // Updates that have been queued for the next run.
   QueuedUpdates queued_updates_;
   base::ObserverList<UpdateObserver>::Unchecked queued_observers_;
-  base::CancelableClosure restart_update_task_;
+  base::CancelableOnceClosure restart_update_task_;
   std::unique_ptr<HostObserver> host_observer_;
 
   // True if we're in our destructor.
diff --git a/content/browser/browser_thread_unittest.cc b/content/browser/browser_thread_unittest.cc
index 06eb14cf..1bd0d55 100644
--- a/content/browser/browser_thread_unittest.cc
+++ b/content/browser/browser_thread_unittest.cc
@@ -43,23 +43,22 @@
 class SequenceManagerThreadDelegate : public base::Thread::Delegate {
  public:
   SequenceManagerThreadDelegate() {
-    sequence_manager_ =
+    ui_sequence_manager_ =
         base::sequence_manager::internal::SequenceManagerImpl::CreateUnbound(
             base::sequence_manager::SequenceManager::Settings());
     auto browser_ui_thread_scheduler =
         BrowserUIThreadScheduler::CreateForTesting(
-            sequence_manager_.get(), sequence_manager_->GetRealTimeDomain());
+            ui_sequence_manager_.get(),
+            ui_sequence_manager_->GetRealTimeDomain());
 
     default_task_runner_ =
         browser_ui_thread_scheduler->GetHandle()->GetDefaultTaskRunner();
 
-    sequence_manager_->SetDefaultTaskRunner(default_task_runner_);
+    ui_sequence_manager_->SetDefaultTaskRunner(default_task_runner_);
 
     BrowserTaskExecutor::CreateForTesting(
         std::move(browser_ui_thread_scheduler),
-        std::make_unique<BrowserIOThreadDelegate>(
-            BrowserIOThreadDelegate::BrowserTaskExecutorPresent::
-                kNoForTesting));
+        std::make_unique<BrowserIOThreadDelegate>());
     BrowserTaskExecutor::EnableAllQueues();
   }
 
@@ -73,13 +72,14 @@
   }
 
   void BindToCurrentThread(base::TimerSlack timer_slack) override {
-    sequence_manager_->BindToMessagePump(
+    ui_sequence_manager_->BindToMessagePump(
         base::MessagePump::Create(base::MessagePumpType::DEFAULT));
-    sequence_manager_->SetTimerSlack(timer_slack);
+    ui_sequence_manager_->SetTimerSlack(timer_slack);
+    BrowserTaskExecutor::BindToUIThreadForTesting();
   }
 
  private:
-  std::unique_ptr<base::sequence_manager::SequenceManager> sequence_manager_;
+  std::unique_ptr<base::sequence_manager::SequenceManager> ui_sequence_manager_;
   scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(SequenceManagerThreadDelegate);
@@ -314,9 +314,7 @@
               QueueType::kDefault));
       BrowserTaskExecutor::CreateForTesting(
           std::move(browser_ui_thread_scheduler),
-          std::make_unique<BrowserIOThreadDelegate>(
-              BrowserIOThreadDelegate::BrowserTaskExecutorPresent::
-                  kNoForTesting));
+          std::make_unique<BrowserIOThreadDelegate>());
 
       ui_thread_ = BrowserTaskExecutor::CreateIOThread();
       BrowserTaskExecutor::InitializeIOThread();
diff --git a/content/browser/cache_storage/cache_storage_context_impl.cc b/content/browser/cache_storage/cache_storage_context_impl.cc
index 79cec0a..09296f8 100644
--- a/content/browser/cache_storage/cache_storage_context_impl.cc
+++ b/content/browser/cache_storage/cache_storage_context_impl.cc
@@ -28,7 +28,7 @@
 namespace {
 
 const base::Feature kCacheStorageSequenceFeature{
-    "CacheStorageSequence", base::FEATURE_ENABLED_BY_DEFAULT};
+    "CacheStorageSequence", base::FEATURE_DISABLED_BY_DEFAULT};
 
 scoped_refptr<base::SequencedTaskRunner> CreateSchedulerTaskRunner() {
   if (!base::FeatureList::IsEnabled(kCacheStorageSequenceFeature))
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
index 286abc7..23620d9 100644
--- a/content/browser/child_process_security_policy_impl.cc
+++ b/content/browser/child_process_security_policy_impl.cc
@@ -1228,24 +1228,65 @@
 
 CanCommitStatus ChildProcessSecurityPolicyImpl::CanCommitOriginAndUrl(
     int child_id,
+    const IsolationContext& isolation_context,
     const url::Origin& origin,
     const GURL& url) {
-  // TODO(nasko): This check should be updated to apply to all URLs, not just
-  // standard ones.
-  if (url.IsStandard() && !CanAccessDataForOrigin(child_id, url))
+  const url::Origin url_origin = url::Origin::Resolve(url, origin);
+  if (!CanAccessDataForOrigin(child_id, url_origin)) {
+    // Allow opaque origins w/o precursors to commit.
+    // TODO(acolwell): Investigate all cases that trigger this path and fix
+    // them so we have precursor information. Remove this logic once that has
+    // been completed.
+    if (url_origin.opaque() &&
+        url_origin.GetTupleOrPrecursorTupleIfOpaque().IsInvalid()) {
+      return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL;
+    }
+
+    // Check for special cases, like blob:null/ and data: URLs, where the
+    // origin does not contain information to match against the process lock,
+    // but using the whole URL can result in a process lock match.
+    const GURL expected_origin_lock =
+        SiteInstanceImpl::DetermineProcessLockURL(isolation_context, url);
+    const GURL actual_origin_lock = GetOriginLock(child_id);
+    if (actual_origin_lock == expected_origin_lock)
+      return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL;
+
+    // Allow about: pages to commit in a process that does not match the opaque
+    // origin's precursor information.
+    // TODO(acolwell): Remove this once process selection for about: URLs has
+    // been fixed to always match the precursor info.
+    if (url_origin.opaque() && (url.IsAboutBlank() || url.IsAboutSrcdoc()) &&
+        !actual_origin_lock.is_empty()) {
+      return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL;
+    }
     return CanCommitStatus::CANNOT_COMMIT_URL;
+  }
 
-  // It is safe to commit into a opaque origin, regardless of the URL, as it is
-  // restricted from accessing other origins.
-  if (origin.opaque())
-    return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL;
-
-  // Standard URLs must match the reported origin.
-  if (url.IsStandard() && !origin.IsSameOriginWith(url::Origin::Create(url)))
+  if (!CanAccessDataForOrigin(child_id, origin)) {
+    // Allow opaque origins w/o precursors to commit.
+    // TODO(acolwell): Investigate all cases that trigger this path and fix
+    // them so we have precursor information. Remove this logic once that has
+    // been completed.
+    if (origin.opaque() &&
+        origin.GetTupleOrPrecursorTupleIfOpaque().IsInvalid()) {
+      return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL;
+    }
     return CanCommitStatus::CANNOT_COMMIT_ORIGIN;
+  }
 
-  if (!CanAccessDataForOrigin(child_id, origin))
+  // Ensure that the origin derived from |url| is consistent with |origin|.
+  // Note: We can't use origin.IsSameOriginWith() here because opaque origins
+  // with precursors may have different nonce values.
+  const auto url_tuple_or_precursor_tuple =
+      url_origin.GetTupleOrPrecursorTupleIfOpaque();
+  const auto origin_tuple_or_precursor_tuple =
+      origin.GetTupleOrPrecursorTupleIfOpaque();
+
+  if (!url_tuple_or_precursor_tuple.IsInvalid() &&
+      !origin_tuple_or_precursor_tuple.IsInvalid() &&
+      origin_tuple_or_precursor_tuple != url_tuple_or_precursor_tuple) {
     return CanCommitStatus::CANNOT_COMMIT_ORIGIN;
+  }
 
   return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL;
 }
diff --git a/content/browser/child_process_security_policy_impl.h b/content/browser/child_process_security_policy_impl.h
index 7e5e2a7..dedc4f1 100644
--- a/content/browser/child_process_security_policy_impl.h
+++ b/content/browser/child_process_security_policy_impl.h
@@ -123,9 +123,11 @@
   // |url| combination to the process associated with |child_id|.
   // Returns CANNOT_COMMIT_URL if |url| is not safe to commit.
   // Returns CANNOT_COMMIT_ORIGIN if |origin| is not safe to commit.
-  CanCommitStatus CanCommitOriginAndUrl(int child_id,
-                                        const url::Origin& origin,
-                                        const GURL& url);
+  CanCommitStatus CanCommitOriginAndUrl(
+      int child_id,
+      const IsolationContext& isolation_context,
+      const url::Origin& origin,
+      const GURL& url);
 
   // This function will check whether |origin| requires process isolation
   // within |isolation_context|, and if so, it will return true and put the
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index 950dc9d..c480bbbd 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -49,6 +49,7 @@
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/browser/web_package/signed_exchange_envelope.h"
 #include "content/common/view_messages.h"
+#include "content/public/browser/back_forward_cache.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -429,6 +430,13 @@
   }
   for (auto* target : protocol::TargetHandler::ForAgentHost(this))
     target->DidFinishNavigation();
+
+  // RenderFrameDevToolsAgentHost is associated with frame_tree_node, while
+  // documents in the back-forward cache share a node, therefore we can't cache
+  // them. TODO(1001087): add support long-term.
+  content::BackForwardCache::DisableForRenderFrameHost(
+      navigation_handle->GetPreviousRenderFrameHostId(),
+      "RenderFrameDevToolsAgentHost");
 }
 
 void RenderFrameDevToolsAgentHost::UpdateFrameHost(
diff --git a/content/browser/devtools/render_frame_devtools_agent_host_browsertest.cc b/content/browser/devtools/render_frame_devtools_agent_host_browsertest.cc
index 7908a8ed..bd29fac2 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host_browsertest.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host_browsertest.cc
@@ -7,8 +7,10 @@
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/devtools_agent_host_client.h"
+#include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/url_constants.h"
+#include "content/public/test/back_forward_cache_util.h"
 #include "content/public/test/browser_test_base.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test.h"
@@ -170,4 +172,32 @@
   devtools_agent_host->DetachClient(&devtools_agent_host_client);
 }
 
+IN_PROC_BROWSER_TEST_F(RenderFrameDevToolsAgentHostBrowserTest,
+                       DevToolsDisableBackForwardCache) {
+  content::BackForwardCacheDisabledTester tester;
+  EXPECT_TRUE(embedded_test_server()->Start());
+
+  // Navigate to a page.
+  const GURL a_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), a_url));
+  content::RenderFrameHost* main_frame =
+      shell()->web_contents()->GetMainFrame();
+  int process_id = main_frame->GetProcess()->GetID();
+  int frame_routing_id = main_frame->GetRoutingID();
+
+  // Open DevTools.
+  scoped_refptr<DevToolsAgentHost> devtools_agent_host =
+      DevToolsAgentHost::GetOrCreateFor(shell()->web_contents());
+  StubDevToolsAgentHostClient devtools_agent_host_client;
+  devtools_agent_host->AttachClient(&devtools_agent_host_client);
+
+  // Navigate away from the page. This should block bfcache.
+  const GURL b_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), b_url));
+  EXPECT_TRUE(tester.IsDisabledForFrameWithReason(
+      process_id, frame_routing_id, "RenderFrameDevToolsAgentHost"));
+
+  devtools_agent_host->DetachClient(&devtools_agent_host_client);
+}
+
 }  // namespace content
diff --git a/content/browser/frame_host/debug_urls.cc b/content/browser/frame_host/debug_urls.cc
index 52fa902b..cf7ada76 100644
--- a/content/browser/frame_host/debug_urls.cc
+++ b/content/browser/frame_host/debug_urls.cc
@@ -174,7 +174,7 @@
   if (url == kChromeUIGpuCleanURL) {
     GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_SANDBOXED,
                              false /* force_create */,
-                             base::Bind([](GpuProcessHost* host) {
+                             base::BindOnce([](GpuProcessHost* host) {
                                if (host)
                                  host->gpu_service()->DestroyAllChannels();
                              }));
@@ -184,7 +184,7 @@
   if (url == kChromeUIGpuCrashURL) {
     GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_SANDBOXED,
                              false /* force_create */,
-                             base::Bind([](GpuProcessHost* host) {
+                             base::BindOnce([](GpuProcessHost* host) {
                                if (host)
                                  host->gpu_service()->Crash();
                              }));
@@ -195,7 +195,7 @@
   if (url == kChromeUIGpuJavaCrashURL) {
     GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_SANDBOXED,
                              false /* force_create */,
-                             base::Bind([](GpuProcessHost* host) {
+                             base::BindOnce([](GpuProcessHost* host) {
                                if (host)
                                  host->gpu_service()->ThrowJavaException();
                              }));
@@ -206,7 +206,7 @@
   if (url == kChromeUIGpuHangURL) {
     GpuProcessHost::CallOnIO(GPU_PROCESS_KIND_SANDBOXED,
                              false /* force_create */,
-                             base::Bind([](GpuProcessHost* host) {
+                             base::BindOnce([](GpuProcessHost* host) {
                                if (host)
                                  host->gpu_service()->Hang();
                              }));
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index 64f96c9..6cf3ff8 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -521,7 +521,7 @@
       is_initial_navigation_(true),
       in_navigate_to_pending_entry_(false),
       pending_reload_(ReloadType::NONE),
-      get_timestamp_callback_(base::Bind(&base::Time::Now)),
+      get_timestamp_callback_(base::BindRepeating(&base::Time::Now)),
       entry_replaced_by_post_commit_error_(nullptr) {
   DCHECK(browser_context_);
 }
@@ -3497,7 +3497,7 @@
 }
 
 void NavigationControllerImpl::SetGetTimestampCallbackForTest(
-    const base::Callback<base::Time()>& get_timestamp_callback) {
+    const base::RepeatingCallback<base::Time()>& get_timestamp_callback) {
   get_timestamp_callback_ = get_timestamp_callback;
 }
 
diff --git a/content/browser/frame_host/navigation_controller_impl.h b/content/browser/frame_host/navigation_controller_impl.h
index 8886cb2c..651d2390 100644
--- a/content/browser/frame_host/navigation_controller_impl.h
+++ b/content/browser/frame_host/navigation_controller_impl.h
@@ -276,7 +276,7 @@
   static size_t max_entry_count();
 
   void SetGetTimestampCallbackForTest(
-      const base::Callback<base::Time()>& get_timestamp_callback);
+      const base::RepeatingCallback<base::Time()>& get_timestamp_callback);
 
   // Discards only the pending entry. |was_failure| should be set if the pending
   // entry is being discarded because it failed to load.
@@ -619,7 +619,7 @@
   ReloadType pending_reload_;
 
   // Used to get timestamps for newly-created navigation entries.
-  base::Callback<base::Time()> get_timestamp_callback_;
+  base::RepeatingCallback<base::Time()> get_timestamp_callback_;
 
   // Used to smooth out timestamps from |get_timestamp_callback_|.
   // Without this, whenever there is a run of redirects or
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
index da6905a2..a9648cb 100644
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -7290,8 +7290,8 @@
 
     // Suspend the message.
     web_contents_observer_.SetCallback(
-        base::Bind(&RenderFrameHost::OnMessageReceived,
-                   base::Unretained(render_frame_host_), message));
+        base::BindOnce(&RenderFrameHost::OnMessageReceived,
+                       base::Unretained(render_frame_host_), message));
     return true;
   }
 
@@ -7306,7 +7306,7 @@
   // OnMessageReceived function; this is the simplest way to disambiguate.
   class : public WebContentsObserver {
    public:
-    using Callback = base::Callback<bool()>;
+    using Callback = base::OnceCallback<bool()>;
 
     using WebContentsObserver::Observe;
 
@@ -7319,7 +7319,7 @@
         return;
 
       // Resume the message.
-      callback_.Run();
+      std::move(callback_).Run();
     }
 
     Callback callback_;
@@ -7409,7 +7409,7 @@
   void SetUpOnMainThread() override {
     // Accumulate all http requests made to |embedded_test_server| into
     // |accumulated_requests_| container.
-    embedded_test_server()->RegisterRequestMonitor(base::Bind(
+    embedded_test_server()->RegisterRequestMonitor(base::BindRepeating(
         &RequestMonitoringNavigationBrowserTest::MonitorRequestOnIoThread,
         weak_factory_.GetWeakPtr(), base::SequencedTaskRunnerHandle::Get()));
 
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc
index 6c786e3b..51b13de 100644
--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -526,7 +526,7 @@
 
   // Set the clock to always return a timestamp of 1.
   controller.SetGetTimestampCallbackForTest(
-      base::Bind(&GetFixedTime, InMicrosecondsSinceEpoch(1)));
+      base::BindRepeating(&GetFixedTime, InMicrosecondsSinceEpoch(1)));
 
   const GURL url1("http://foo1");
   const GURL url2("http://foo2");
@@ -1442,13 +1442,6 @@
   EXPECT_FALSE(committed_entry->should_clear_history_list());
 }
 
-namespace {
-void SetRedirects(const std::vector<GURL>& redirects,
-                  FrameHostMsg_DidCommitProvisionalLoad_Params* params) {
-  params->redirects = redirects;
-}
-}  // namespace
-
 // Test that Redirects are preserved after a commit.
 TEST_F(NavigationControllerTest, RedirectsAreNotResetByCommit) {
   NavigationControllerImpl& controller = controller_impl();
@@ -1461,7 +1454,6 @@
   // Set up some redirect values.
   std::vector<GURL> redirects;
   redirects.push_back(url2);
-  auto set_redirects_callback = base::Bind(SetRedirects, redirects);
 
   // Set redirects on the pending entry.
   NavigationEntryImpl* pending_entry = controller.GetPendingEntry();
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 252a5c2..667e28d 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -1176,8 +1176,8 @@
   // the NavigationHandle where the callback will be stored.
   // TODO(clamy): pass the method to the NavigationHandle instead of a
   // boolean.
-  WillStartRequest(base::Bind(&NavigationRequest::OnStartChecksComplete,
-                              base::Unretained(this)));
+  WillStartRequest(base::BindOnce(&NavigationRequest::OnStartChecksComplete,
+                                  base::Unretained(this)));
 }
 
 void NavigationRequest::SetWaitingForRendererResponse() {
@@ -1377,8 +1377,8 @@
     // (rather than passing the old URL).
     UpdateStateFollowingRedirect(
         GURL(redirect_info.new_referrer),
-        base::Bind(&NavigationRequest::OnRedirectChecksComplete,
-                   base::Unretained(this)));
+        base::BindOnce(&NavigationRequest::OnRedirectChecksComplete,
+                       base::Unretained(this)));
     frame_tree_node_->ResetNavigationRequest(false, true);
     return;
   }
@@ -1523,9 +1523,10 @@
 
   // It's safe to use base::Unretained because this NavigationRequest owns the
   // NavigationHandle where the callback will be stored.
-  WillRedirectRequest(common_params_->referrer->url, expected_process,
-                      base::Bind(&NavigationRequest::OnRedirectChecksComplete,
-                                 base::Unretained(this)));
+  WillRedirectRequest(
+      common_params_->referrer->url, expected_process,
+      base::BindOnce(&NavigationRequest::OnRedirectChecksComplete,
+                     base::Unretained(this)));
 }
 
 void NavigationRequest::OnResponseStarted(
@@ -1811,8 +1812,8 @@
 
   // Check if the navigation should be allowed to proceed.
   WillProcessResponse(
-      base::Bind(&NavigationRequest::OnWillProcessResponseChecksComplete,
-                 base::Unretained(this)));
+      base::BindOnce(&NavigationRequest::OnWillProcessResponseChecksComplete,
+                     base::Unretained(this)));
 }
 
 void NavigationRequest::OnRequestFailed(
diff --git a/content/browser/frame_host/navigation_request_browsertest.cc b/content/browser/frame_host/navigation_request_browsertest.cc
index 0eb1479f..f57917b 100644
--- a/content/browser/frame_host/navigation_request_browsertest.cc
+++ b/content/browser/frame_host/navigation_request_browsertest.cc
@@ -63,19 +63,19 @@
       NavigationThrottle::ThrottleCheckResult will_redirect_result,
       NavigationThrottle::ThrottleCheckResult will_fail_result,
       NavigationThrottle::ThrottleCheckResult will_process_result,
-      base::Closure did_call_will_start,
-      base::Closure did_call_will_redirect,
-      base::Closure did_call_will_fail,
-      base::Closure did_call_will_process)
+      base::OnceClosure did_call_will_start,
+      base::OnceClosure did_call_will_redirect,
+      base::OnceClosure did_call_will_fail,
+      base::OnceClosure did_call_will_process)
       : NavigationThrottle(handle),
         will_start_result_(will_start_result),
         will_redirect_result_(will_redirect_result),
         will_fail_result_(will_fail_result),
         will_process_result_(will_process_result),
-        did_call_will_start_(did_call_will_start),
-        did_call_will_redirect_(did_call_will_redirect),
-        did_call_will_fail_(did_call_will_fail),
-        did_call_will_process_(did_call_will_process) {}
+        did_call_will_start_(std::move(did_call_will_start)),
+        did_call_will_redirect_(std::move(did_call_will_redirect)),
+        did_call_will_fail_(std::move(did_call_will_fail)),
+        did_call_will_process_(std::move(did_call_will_process)) {}
   ~TestNavigationThrottle() override {}
 
   const char* GetNameForLogging() override { return "TestNavigationThrottle"; }
@@ -100,7 +100,8 @@
              navigation_request->request_context_type());
     request_context_type_ = navigation_request->request_context_type();
 
-    base::PostTask(FROM_HERE, {BrowserThread::UI}, did_call_will_start_);
+    base::PostTask(FROM_HERE, {BrowserThread::UI},
+                   std::move(did_call_will_start_));
     return will_start_result_;
   }
 
@@ -109,7 +110,8 @@
         NavigationRequest::From(navigation_handle());
     CHECK_EQ(request_context_type_, navigation_request->request_context_type());
 
-    base::PostTask(FROM_HERE, {BrowserThread::UI}, did_call_will_redirect_);
+    base::PostTask(FROM_HERE, {BrowserThread::UI},
+                   std::move(did_call_will_redirect_));
     return will_redirect_result_;
   }
 
@@ -118,7 +120,8 @@
         NavigationRequest::From(navigation_handle());
     CHECK_EQ(request_context_type_, navigation_request->request_context_type());
 
-    base::PostTask(FROM_HERE, {BrowserThread::UI}, did_call_will_fail_);
+    base::PostTask(FROM_HERE, {BrowserThread::UI},
+                   std::move(did_call_will_fail_));
     return will_fail_result_;
   }
 
@@ -127,7 +130,8 @@
         NavigationRequest::From(navigation_handle());
     CHECK_EQ(request_context_type_, navigation_request->request_context_type());
 
-    base::PostTask(FROM_HERE, {BrowserThread::UI}, did_call_will_process_);
+    base::PostTask(FROM_HERE, {BrowserThread::UI},
+                   std::move(did_call_will_process_));
     return will_process_result_;
   }
 
@@ -135,10 +139,10 @@
   NavigationThrottle::ThrottleCheckResult will_redirect_result_;
   NavigationThrottle::ThrottleCheckResult will_fail_result_;
   NavigationThrottle::ThrottleCheckResult will_process_result_;
-  base::Closure did_call_will_start_;
-  base::Closure did_call_will_redirect_;
-  base::Closure did_call_will_fail_;
-  base::Closure did_call_will_process_;
+  base::OnceClosure did_call_will_start_;
+  base::OnceClosure did_call_will_redirect_;
+  base::OnceClosure did_call_will_fail_;
+  base::OnceClosure did_call_will_process_;
   blink::mojom::RequestContextType request_context_type_ =
       blink::mojom::RequestContextType::UNSPECIFIED;
 };
@@ -286,14 +290,17 @@
     std::unique_ptr<NavigationThrottle> throttle(new TestNavigationThrottle(
         handle, will_start_result_, will_redirect_result_, will_fail_result_,
         will_process_result_,
-        base::Bind(&TestNavigationThrottleInstaller::DidCallWillStartRequest,
-                   weak_factory_.GetWeakPtr()),
-        base::Bind(&TestNavigationThrottleInstaller::DidCallWillRedirectRequest,
-                   weak_factory_.GetWeakPtr()),
-        base::Bind(&TestNavigationThrottleInstaller::DidCallWillFailRequest,
-                   weak_factory_.GetWeakPtr()),
-        base::Bind(&TestNavigationThrottleInstaller::DidCallWillProcessResponse,
-                   weak_factory_.GetWeakPtr())));
+        base::BindOnce(
+            &TestNavigationThrottleInstaller::DidCallWillStartRequest,
+            weak_factory_.GetWeakPtr()),
+        base::BindOnce(
+            &TestNavigationThrottleInstaller::DidCallWillRedirectRequest,
+            weak_factory_.GetWeakPtr()),
+        base::BindOnce(&TestNavigationThrottleInstaller::DidCallWillFailRequest,
+                       weak_factory_.GetWeakPtr()),
+        base::BindOnce(
+            &TestNavigationThrottleInstaller::DidCallWillProcessResponse,
+            weak_factory_.GetWeakPtr())));
     navigation_throttle_ = static_cast<TestNavigationThrottle*>(throttle.get());
     handle->RegisterThrottleForTesting(std::move(throttle));
     ++install_count_;
diff --git a/content/browser/frame_host/navigation_request_unittest.cc b/content/browser/frame_host/navigation_request_unittest.cc
index c0cb26b0..40769e3 100644
--- a/content/browser/frame_host/navigation_request_unittest.cc
+++ b/content/browser/frame_host/navigation_request_unittest.cc
@@ -92,8 +92,8 @@
     // It's safe to use base::Unretained since the NavigationHandle is owned by
     // the NavigationRequestTest.
     request_->WillStartRequest(
-        base::Bind(&NavigationRequestTest::UpdateThrottleCheckResult,
-                   base::Unretained(this)));
+        base::BindOnce(&NavigationRequestTest::UpdateThrottleCheckResult,
+                       base::Unretained(this)));
   }
 
   // Helper function to call WillRedirectRequest on |handle|. If this function
@@ -109,8 +109,8 @@
     // the NavigationRequestTest.
     request_->WillRedirectRequest(
         GURL(), nullptr,
-        base::Bind(&NavigationRequestTest::UpdateThrottleCheckResult,
-                   base::Unretained(this)));
+        base::BindOnce(&NavigationRequestTest::UpdateThrottleCheckResult,
+                       base::Unretained(this)));
   }
 
   // Helper function to call WillFailRequest on |handle|. If this function
@@ -126,8 +126,8 @@
     // It's safe to use base::Unretained since the NavigationHandle is owned by
     // the NavigationRequestTest.
     request_->WillFailRequest(
-        base::Bind(&NavigationRequestTest::UpdateThrottleCheckResult,
-                   base::Unretained(this)));
+        base::BindOnce(&NavigationRequestTest::UpdateThrottleCheckResult,
+                       base::Unretained(this)));
   }
 
   // Helper function to call WillProcessResponse on |handle|. If this function
@@ -144,8 +144,8 @@
     // to WillRedirectRequest to verify that it's correctly plumbed in both
     // cases.
     request_->WillProcessResponse(
-        base::Bind(&NavigationRequestTest::UpdateThrottleCheckResult,
-                   base::Unretained(this)));
+        base::BindOnce(&NavigationRequestTest::UpdateThrottleCheckResult,
+                       base::Unretained(this)));
   }
 
   // Whether the callback was called.
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index b24bebb0..1e8c682 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -285,6 +285,26 @@
   }
 }
 
+// Returns true if |url| & |base_url| represents a WebView loadDataWithBaseUrl
+// navigation.
+bool IsLoadDataWithBaseURL(const GURL& url, const GURL& base_url) {
+  return url.SchemeIs(url::kDataScheme) && !base_url.is_empty();
+}
+
+// Returns true if |common_params| represents a WebView loadDataWithBaseUrl
+// navigation.
+bool IsLoadDataWithBaseURL(const mojom::CommonNavigationParams& common_params) {
+  return IsLoadDataWithBaseURL(common_params.url,
+                               common_params.base_url_for_data_url);
+}
+
+// Returns true if |validated_params| represents a WebView loadDataWithBaseUrl
+// navigation.
+bool IsLoadDataWithBaseURL(
+    const FrameHostMsg_DidCommitProvisionalLoad_Params& validated_params) {
+  return IsLoadDataWithBaseURL(validated_params.url, validated_params.base_url);
+}
+
 // Ensure that we reset nav_entry_id_ in DidCommitProvisionalLoad if any of
 // the validations fail and lead to an early return.  Call disable() once we
 // know the commit will be successful.  Resetting nav_entry_id_ avoids acting on
@@ -411,8 +431,7 @@
 
   // Check if this is loadDataWithBaseUrl (which needs special treatment).
   auto& common_params = navigation_request->common_params();
-  if (common_params.url.SchemeIs(url::kDataScheme) &&
-      !common_params.base_url_for_data_url.is_empty()) {
+  if (IsLoadDataWithBaseURL(common_params)) {
     // A (potentially attacker-controlled) renderer process should not be able
     // to use loadDataWithBaseUrl code path to initiate fetches on behalf of a
     // victim origin (fetches controlled by attacker-provided
@@ -4607,27 +4626,31 @@
     return CanCommitStatus::CANNOT_COMMIT_URL;
 
   auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
-  const CanCommitStatus can_commit_status =
-      policy->CanCommitOriginAndUrl(GetProcess()->GetID(), origin, url);
+  const CanCommitStatus can_commit_status = policy->CanCommitOriginAndUrl(
+      GetProcess()->GetID(), GetSiteInstance()->GetIsolationContext(), origin,
+      url);
   if (can_commit_status != CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL)
     return can_commit_status;
 
-  if (!origin.opaque()) {
-    // A non-opaque origin must be a valid URL, which allows us to safely do a
-    // conversion to GURL.
-    GURL origin_url = origin.GetURL();
-
-    // Verify that the origin is allowed to commit in this process.
+  const auto origin_tuple_or_precursor_tuple =
+      origin.GetTupleOrPrecursorTupleIfOpaque();
+  if (!origin_tuple_or_precursor_tuple.IsInvalid()) {
+    // Verify that the origin/precursor is allowed to commit in this process.
     // Note: This also handles non-standard cases for |url|, such as
     // about:blank, data, and blob URLs.
 
     // Renderer-debug URLs can never be committed.
-    if (IsRendererDebugURL(origin_url))
+    if (IsRendererDebugURL(origin_tuple_or_precursor_tuple.GetURL()))
       return CanCommitStatus::CANNOT_COMMIT_ORIGIN;
 
-    // Give the client a chance to disallow URLs from committing.
-    if (!GetContentClient()->browser()->CanCommitURL(GetProcess(), origin_url))
+    // Give the client a chance to disallow origin URLs from committing.
+    // TODO(acolwell): Fix this code to work with opaque origins. Currently
+    // some opaque origin precursors, like chrome-extension schemes, can trigger
+    // the commit to fail. These need to be investigated.
+    if (!origin.opaque() && !GetContentClient()->browser()->CanCommitURL(
+                                GetProcess(), origin.GetURL())) {
       return CanCommitStatus::CANNOT_COMMIT_ORIGIN;
+    }
   }
 
   return CanCommitStatus::CAN_COMMIT_ORIGIN_AND_URL;
@@ -5948,8 +5971,7 @@
   if (!GetProcess()->IsForGuestsOnly()) {
     ChildProcessSecurityPolicyImpl::GetInstance()->GrantCommitURL(
         GetProcess()->GetID(), common_params.url);
-    if (common_params.url.SchemeIs(url::kDataScheme) &&
-        !common_params.base_url_for_data_url.is_empty()) {
+    if (IsLoadDataWithBaseURL(common_params)) {
       // When there's a base URL specified for the data URL, we also need to
       // grant access to the base URL. This allows file: and other unexpected
       // schemes to be accepted at commit time and during CORS checks (e.g., for
@@ -6789,7 +6811,23 @@
       bypass_checks_for_file_scheme = true;
   }
 
-  if (!bypass_checks_for_error_page && !bypass_checks_for_file_scheme) {
+  // WebView's loadDataWithBaseURL API is allowed to bypass normal commit
+  // checks because it is allowed to commit anything into its unlocked process
+  // and its data: URL and non-opaque origin would fail the normal commit
+  // checks.
+  bool bypass_checks_for_webview = false;
+  if ((navigation_request &&
+       IsLoadDataWithBaseURL(navigation_request->common_params())) ||
+      (is_same_document_navigation &&
+       IsLoadDataWithBaseURL(*validated_params))) {
+    // Allow bypass if the process isn't locked. Otherwise run normal checks.
+    bypass_checks_for_webview = ChildProcessSecurityPolicyImpl::GetInstance()
+                                    ->GetOriginLock(process->GetID())
+                                    .is_empty();
+  }
+
+  if (!bypass_checks_for_error_page && !bypass_checks_for_file_scheme &&
+      !bypass_checks_for_webview) {
     // Attempts to commit certain off-limits URL should be caught more strictly
     // than our FilterURL checks.  If a renderer violates this policy, it
     // should be killed.
@@ -6799,6 +6837,12 @@
         // The origin and URL are safe to commit.
         break;
       case CanCommitStatus::CANNOT_COMMIT_URL:
+        DLOG(ERROR) << "CANNOT_COMMIT_URL url '" << validated_params->url << "'"
+                    << " origin '" << validated_params->origin << "'"
+                    << " lock '"
+                    << ChildProcessSecurityPolicyImpl::GetInstance()
+                           ->GetOriginLock(process->GetID())
+                    << "'";
         VLOG(1) << "Blocked URL " << validated_params->url.spec();
         LogCannotCommitUrlCrashKeys(validated_params->url,
                                     is_same_document_navigation,
@@ -6809,6 +6853,13 @@
             process, bad_message::RFH_CAN_COMMIT_URL_BLOCKED);
         return false;
       case CanCommitStatus::CANNOT_COMMIT_ORIGIN:
+        DLOG(ERROR) << "CANNOT_COMMIT_ORIGIN url '" << validated_params->url
+                    << "'"
+                    << " origin '" << validated_params->origin << "'"
+                    << " lock '"
+                    << ChildProcessSecurityPolicyImpl::GetInstance()
+                           ->GetOriginLock(process->GetID())
+                    << "'";
         DEBUG_ALIAS_FOR_ORIGIN(origin_debug_alias, validated_params->origin);
         LogCannotCommitOriginCrashKeys(is_same_document_navigation,
                                        navigation_request);
diff --git a/content/browser/manifest/manifest_browsertest.cc b/content/browser/manifest/manifest_browsertest.cc
index 20d2698..969930b 100644
--- a/content/browser/manifest/manifest_browsertest.cc
+++ b/content/browser/manifest/manifest_browsertest.cc
@@ -577,7 +577,7 @@
   std::unique_ptr<net::EmbeddedTestServer> custom_embedded_test_server(
       new net::EmbeddedTestServer());
   custom_embedded_test_server->RegisterRequestHandler(
-      base::Bind(&CustomHandleRequestForCookies));
+      base::BindRepeating(&CustomHandleRequestForCookies));
 
   ASSERT_TRUE(custom_embedded_test_server->Start());
 
@@ -637,7 +637,7 @@
   std::unique_ptr<net::EmbeddedTestServer> custom_embedded_test_server(
       new net::EmbeddedTestServer());
   custom_embedded_test_server->RegisterRequestHandler(
-      base::Bind(&CustomHandleRequestForNoCookies));
+      base::BindRepeating(&CustomHandleRequestForNoCookies));
 
   ASSERT_TRUE(custom_embedded_test_server->Start());
 
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc
index 6f253c59..a4b94b2 100644
--- a/content/browser/media/media_web_contents_observer.cc
+++ b/content/browser/media/media_web_contents_observer.cc
@@ -220,6 +220,9 @@
   if (is_remote)
     return;
 
+  BackForwardCache::DisableForRenderFrameHost(
+      render_frame_host, "MediaWebContentsObserver::OnMediaPlaying");
+
   const MediaPlayerId id(render_frame_host, delegate_id);
   if (has_audio)
     AddMediaPlayerEntry(id, &active_audio_players_);
diff --git a/content/browser/scheduler/browser_io_thread_delegate.cc b/content/browser/scheduler/browser_io_thread_delegate.cc
index 8959a524..f0e5516 100644
--- a/content/browser/scheduler/browser_io_thread_delegate.cc
+++ b/content/browser/scheduler/browser_io_thread_delegate.cc
@@ -9,6 +9,7 @@
 #include "base/task/sequence_manager/sequence_manager.h"
 #include "base/task/sequence_manager/task_queue.h"
 #include "base/task/task_executor.h"
+#include "base/task/task_observer.h"
 #include "content/browser/scheduler/browser_task_executor.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -18,40 +19,82 @@
 using ::base::sequence_manager::SequenceManager;
 using ::base::sequence_manager::TaskQueue;
 
-BrowserIOThreadDelegate::BrowserIOThreadDelegate(
-    BrowserTaskExecutorPresent browser_task_executor_present)
-    : sequence_manager_(CreateUnboundSequenceManager(
+class BrowserIOThreadDelegate::TLSMultiplexer : public base::TaskObserver {
+ public:
+  TLSMultiplexer() = default;
+  ~TLSMultiplexer() override = default;
+
+  void SetIOTaskExecutor(base::TaskExecutor* io_task_executor) {
+    io_task_executor_ = io_task_executor;
+  }
+
+  void WillProcessTask(const base::PendingTask& pending_task) override {
+    base::TaskExecutor* previous_executor =
+        base::GetTaskExecutorForCurrentThread();
+    if (previous_executor) {
+      previous_executors_.push_back(previous_executor);
+      base::SetTaskExecutorForCurrentThread(nullptr);
+    }
+    base::SetTaskExecutorForCurrentThread(io_task_executor_);
+  }
+
+  void DidProcessTask(const base::PendingTask& pending_task) override {
+    base::SetTaskExecutorForCurrentThread(nullptr);
+    if (!previous_executors_.empty()) {
+      base::SetTaskExecutorForCurrentThread(previous_executors_.back());
+      previous_executors_.pop_back();
+    }
+  }
+
+  base::TaskExecutor* io_task_executor_ = nullptr;
+  std::vector<base::TaskExecutor*> previous_executors_;
+};
+
+BrowserIOThreadDelegate::BrowserIOThreadDelegate()
+    : owned_sequence_manager_(CreateUnboundSequenceManager(
           SequenceManager::Settings::Builder()
               .SetMessagePumpType(base::MessagePumpType::IO)
               .Build())),
-      browser_task_executor_present_(browser_task_executor_present) {
-  Init(sequence_manager_.get());
+      sequence_manager_(owned_sequence_manager_.get()) {
+  Init();
 }
 
 BrowserIOThreadDelegate::BrowserIOThreadDelegate(
     SequenceManager* sequence_manager)
-    : sequence_manager_(nullptr),
-      browser_task_executor_present_(BrowserTaskExecutorPresent::kYes) {
-  Init(sequence_manager);
+    : sequence_manager_(sequence_manager),
+      tls_multiplexer_(std::make_unique<TLSMultiplexer>()) {
+  sequence_manager_->AddTaskObserver(tls_multiplexer_.get());
+  Init();
 }
 
-void BrowserIOThreadDelegate::Init(
-    base::sequence_manager::SequenceManager* sequence_manager) {
+void BrowserIOThreadDelegate::Init() {
   task_queues_ = std::make_unique<BrowserTaskQueues>(
-      BrowserThread::IO, sequence_manager,
-      sequence_manager->GetRealTimeDomain());
+      BrowserThread::IO, sequence_manager_,
+      sequence_manager_->GetRealTimeDomain());
   default_task_runner_ = task_queues_->GetHandle()->GetDefaultTaskRunner();
 }
 
+void BrowserIOThreadDelegate::SetTaskExecutor(
+    base::TaskExecutor* task_executor) {
+  if (tls_multiplexer_) {
+    tls_multiplexer_->SetIOTaskExecutor(task_executor);
+  } else {
+    task_executor_ = task_executor;
+  }
+}
+
 scoped_refptr<base::SingleThreadTaskRunner>
 BrowserIOThreadDelegate::GetDefaultTaskRunner() {
   return default_task_runner_;
 }
 
 BrowserIOThreadDelegate::~BrowserIOThreadDelegate() {
-  if (browser_task_executor_present_ == BrowserTaskExecutorPresent::kYes) {
+  if (task_executor_) {
     base::SetTaskExecutorForCurrentThread(nullptr);
   }
+  if (tls_multiplexer_) {
+    sequence_manager_->RemoveTaskObserver(tls_multiplexer_.get());
+  }
 }
 
 void BrowserIOThreadDelegate::BindToCurrentThread(
@@ -62,8 +105,8 @@
   sequence_manager_->SetTimerSlack(timer_slack);
   sequence_manager_->SetDefaultTaskRunner(GetDefaultTaskRunner());
 
-  if (browser_task_executor_present_ == BrowserTaskExecutorPresent::kYes) {
-    base::SetTaskExecutorForCurrentThread(BrowserTaskExecutor::Get());
+  if (task_executor_) {
+    base::SetTaskExecutorForCurrentThread(task_executor_);
   }
 }
 
diff --git a/content/browser/scheduler/browser_io_thread_delegate.h b/content/browser/scheduler/browser_io_thread_delegate.h
index 703e7c5..0954c5e 100644
--- a/content/browser/scheduler/browser_io_thread_delegate.h
+++ b/content/browser/scheduler/browser_io_thread_delegate.h
@@ -14,6 +14,7 @@
 
 namespace base {
 class SingleThreadTaskRunner;
+class TaskExecutor;
 
 namespace sequence_manager {
 class SequenceManager;
@@ -28,21 +29,18 @@
  public:
   using Handle = BrowserTaskQueues::Handle;
 
-  // Normally, creating a BrowserIOThreadDelegate relies on a
-  // BrowserTaskExecutor already existing to register it as the executor for the
-  // current (IO) thread. However, some tests create it in isolation, so we need
-  // to disable registering the executor to pass checks.
-  enum class BrowserTaskExecutorPresent { kYes, kNoForTesting };
+  // Creates a BrowserIOThreadDelegate for use with a real IO thread.
+  BrowserIOThreadDelegate();
+  ~BrowserIOThreadDelegate() override;
 
   static std::unique_ptr<BrowserIOThreadDelegate> CreateForTesting(
       base::sequence_manager::SequenceManager* sequence_manager) {
+    DCHECK(sequence_manager);
     return base::WrapUnique(new BrowserIOThreadDelegate(sequence_manager));
   }
 
-  explicit BrowserIOThreadDelegate(
-      BrowserTaskExecutorPresent browser_task_executor_present =
-          BrowserTaskExecutorPresent::kYes);
-  ~BrowserIOThreadDelegate() override;
+  // If called this must be done prior to calling BindToCurrentThread.
+  void SetTaskExecutor(base::TaskExecutor* task_executor);
 
   scoped_refptr<base::SingleThreadTaskRunner> GetDefaultTaskRunner() override;
   void BindToCurrentThread(base::TimerSlack timer_slack) override;
@@ -55,29 +53,37 @@
   // tests.
   void SetAllowBlockingForTesting() { allow_blocking_for_testing_ = true; }
 
-  bool browser_task_executor_present() const {
-    return browser_task_executor_present_ == BrowserTaskExecutorPresent::kYes;
-  }
-
-  scoped_refptr<Handle> CreateHandle() { return task_queues_->GetHandle(); }
+  scoped_refptr<Handle> GetHandle() { return task_queues_->GetHandle(); }
 
  private:
+  class TLSMultiplexer;
+
+  // Creates a sequence funneled BrowserIOThreadDelegate for use in testing.
+  // Installs TLSMultiplexer which allows ensures the right results for
+  // base::CurrentThread when running an "IO Thread" task.
   explicit BrowserIOThreadDelegate(
       base::sequence_manager::SequenceManager* sequence_manager);
 
   // Performs the actual initialization of all the members that require a
-  // SequenceManager. Just a convenience method to avoid code duplication as in
-  // testing |sequence_manager_| will be null;
-  void Init(base::sequence_manager::SequenceManager* sequence_manager);
+  // SequenceManager.
+  void Init();
 
   bool allow_blocking_for_testing_ = false;
   // Owned SequenceManager, null if instance created via CreateForTesting.
-  std::unique_ptr<base::sequence_manager::SequenceManager> sequence_manager_;
+  const std::unique_ptr<base::sequence_manager::SequenceManager>
+      owned_sequence_manager_;
+
+  base::sequence_manager::SequenceManager* const sequence_manager_;
 
   std::unique_ptr<BrowserTaskQueues> task_queues_;
   scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
 
-  const BrowserTaskExecutorPresent browser_task_executor_present_;
+  // In unit tests the IO "thread" can be sequence funneled onto the main thread
+  // so we need to multiplex the TLS binding to ensure base::CurrentThread
+  // behaves as expected.
+  std::unique_ptr<TLSMultiplexer> tls_multiplexer_;
+
+  base::TaskExecutor* task_executor_ = nullptr;
 };
 
 }  // namespace content
diff --git a/content/browser/scheduler/browser_io_thread_delegate_unittest.cc b/content/browser/scheduler/browser_io_thread_delegate_unittest.cc
index f7378f0..ed39160 100644
--- a/content/browser/scheduler/browser_io_thread_delegate_unittest.cc
+++ b/content/browser/scheduler/browser_io_thread_delegate_unittest.cc
@@ -20,9 +20,8 @@
 TEST(BrowserIOThreadDelegateTest, CanPostTasksToThread) {
   base::Thread thread("my_thread");
 
-  auto delegate = std::make_unique<BrowserIOThreadDelegate>(
-      BrowserIOThreadDelegate::BrowserTaskExecutorPresent::kNoForTesting);
-  auto handle = delegate->CreateHandle();
+  auto delegate = std::make_unique<BrowserIOThreadDelegate>();
+  auto handle = delegate->GetHandle();
   handle->EnableAllQueues();
 
   base::Thread::Options options;
@@ -41,8 +40,7 @@
 TEST(BrowserIOThreadDelegateTest, DefaultTaskRunnerIsAlwaysActive) {
   base::Thread thread("my_thread");
 
-  auto delegate = std::make_unique<BrowserIOThreadDelegate>(
-      BrowserIOThreadDelegate::BrowserTaskExecutorPresent::kNoForTesting);
+  auto delegate = std::make_unique<BrowserIOThreadDelegate>();
   auto task_runner = delegate->GetDefaultTaskRunner();
 
   base::Thread::Options options;
diff --git a/content/browser/scheduler/browser_task_executor.cc b/content/browser/scheduler/browser_task_executor.cc
index 37ba248..4f786a1 100644
--- a/content/browser/scheduler/browser_task_executor.cc
+++ b/content/browser/scheduler/browser_task_executor.cc
@@ -66,23 +66,121 @@
 
 }  // namespace
 
+BaseBrowserTaskExecutor::BaseBrowserTaskExecutor() = default;
+
+BaseBrowserTaskExecutor::~BaseBrowserTaskExecutor() = default;
+
+bool BaseBrowserTaskExecutor::PostDelayedTask(const base::Location& from_here,
+                                              const base::TaskTraits& traits,
+                                              base::OnceClosure task,
+                                              base::TimeDelta delay) {
+  if (traits.extension_id() != BrowserTaskTraitsExtension::kExtensionId ||
+      traits.GetExtension<BrowserTaskTraitsExtension>().nestable()) {
+    return GetTaskRunner(traits)->PostDelayedTask(from_here, std::move(task),
+                                                  delay);
+  } else {
+    return GetTaskRunner(traits)->PostNonNestableDelayedTask(
+        from_here, std::move(task), delay);
+  }
+}
+
+scoped_refptr<base::TaskRunner> BaseBrowserTaskExecutor::CreateTaskRunner(
+    const base::TaskTraits& traits) {
+  return GetTaskRunner(traits);
+}
+
+scoped_refptr<base::SequencedTaskRunner>
+BaseBrowserTaskExecutor::CreateSequencedTaskRunner(
+    const base::TaskTraits& traits) {
+  return GetTaskRunner(traits);
+}
+
+scoped_refptr<base::SingleThreadTaskRunner>
+BaseBrowserTaskExecutor::CreateSingleThreadTaskRunner(
+    const base::TaskTraits& traits,
+    base::SingleThreadTaskRunnerThreadMode thread_mode) {
+  return GetTaskRunner(traits);
+}
+
+#if defined(OS_WIN)
+scoped_refptr<base::SingleThreadTaskRunner>
+BaseBrowserTaskExecutor::CreateCOMSTATaskRunner(
+    const base::TaskTraits& traits,
+    base::SingleThreadTaskRunnerThreadMode thread_mode) {
+  return GetTaskRunner(traits);
+}
+#endif  // defined(OS_WIN)
+
+scoped_refptr<base::SingleThreadTaskRunner>
+BaseBrowserTaskExecutor::GetTaskRunner(const base::TaskTraits& traits) const {
+  auto id_and_queue = GetThreadIdAndQueueType(traits);
+
+  switch (id_and_queue.thread_id) {
+    case BrowserThread::UI: {
+      return browser_ui_thread_handle_->GetBrowserTaskRunner(
+          id_and_queue.queue_type);
+    }
+    case BrowserThread::IO:
+      return browser_io_thread_handle_->GetBrowserTaskRunner(
+          id_and_queue.queue_type);
+    case BrowserThread::ID_COUNT:
+      NOTREACHED();
+  }
+  return nullptr;
+}
+
+BaseBrowserTaskExecutor::ThreadIdAndQueueType
+BaseBrowserTaskExecutor::GetThreadIdAndQueueType(
+    const base::TaskTraits& traits) const {
+  BrowserTaskType task_type;
+  BrowserThread::ID thread_id;
+
+  if (traits.use_current_thread()) {
+    thread_id = GetCurrentThreadID();
+
+    // BrowserTaskTraitsExtension is optional if use_current_thread() is true.
+    if (traits.extension_id() == BrowserTaskTraitsExtension::kExtensionId) {
+      task_type = traits.GetExtension<BrowserTaskTraitsExtension>().task_type();
+    } else {
+      task_type = BrowserTaskType::kDefault;
+    }
+  } else {
+    // Otherwise BrowserTaskTraitsExtension is mandatory.
+    DCHECK_EQ(BrowserTaskTraitsExtension::kExtensionId, traits.extension_id());
+    BrowserTaskTraitsExtension extension =
+        traits.GetExtension<BrowserTaskTraitsExtension>();
+
+    thread_id = extension.browser_thread();
+    DCHECK_GE(thread_id, 0);
+
+    task_type = extension.task_type();
+    DCHECK_LT(task_type, BrowserTaskType::kBrowserTaskType_Last);
+  }
+
+  return {thread_id, GetQueueType(traits, task_type)};
+}
+
 BrowserTaskExecutor::BrowserTaskExecutor(
     std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler,
     std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate)
-    : browser_ui_thread_scheduler_(std::move(browser_ui_thread_scheduler)),
-      browser_ui_thread_handle_(browser_ui_thread_scheduler_->GetHandle()),
-      browser_io_thread_delegate_(std::move(browser_io_thread_delegate)),
-      browser_io_thread_handle_(browser_io_thread_delegate_->CreateHandle()) {}
-
-BrowserTaskExecutor::~BrowserTaskExecutor() {
-  base::SetTaskExecutorForCurrentThread(nullptr);
+    : ui_thread_executor_(std::make_unique<UIThreadExecutor>(
+          std::move(browser_ui_thread_scheduler))),
+      io_thread_executor_(std::make_unique<IOThreadExecutor>(
+          std::move(browser_io_thread_delegate))) {
+  browser_ui_thread_handle_ = ui_thread_executor_->GetUIThreadHandle();
+  browser_io_thread_handle_ = io_thread_executor_->GetIOThreadHandle();
+  ui_thread_executor_->SetIOThreadHandle(browser_io_thread_handle_);
+  io_thread_executor_->SetUIThreadHandle(browser_ui_thread_handle_);
 }
 
+BrowserTaskExecutor::~BrowserTaskExecutor() = default;
+
 // static
 void BrowserTaskExecutor::Create() {
   DCHECK(!base::ThreadTaskRunnerHandle::IsSet());
   CreateInternal(std::make_unique<BrowserUIThreadScheduler>(),
                  std::make_unique<BrowserIOThreadDelegate>());
+  g_browser_task_executor->ui_thread_executor_->BindToCurrentThread();
 }
 
 // static
@@ -94,6 +192,11 @@
 }
 
 // static
+void BrowserTaskExecutor::BindToUIThreadForTesting() {
+  g_browser_task_executor->ui_thread_executor_->BindToCurrentThread();
+}
+
+// static
 void BrowserTaskExecutor::CreateInternal(
     std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler,
     std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate) {
@@ -103,13 +206,10 @@
                               std::move(browser_io_thread_delegate));
   base::RegisterTaskExecutor(BrowserTaskTraitsExtension::kExtensionId,
                              g_browser_task_executor);
+
   g_browser_task_executor->browser_ui_thread_handle_
       ->EnableAllExceptBestEffortQueues();
 
-  // Here we register the BrowserTaskExecutor for the UI thread; registration
-  // for the IO thread happens in BrowserIOThreadDelegate::BindToCurrentThread.
-  base::SetTaskExecutorForCurrentThread(g_browser_task_executor);
-
 #if defined(OS_ANDROID)
   base::PostTaskAndroid::SignalNativeSchedulerReady();
 #endif
@@ -134,14 +234,13 @@
     delete g_browser_task_executor;
     g_browser_task_executor = nullptr;
   }
-  base::SetTaskExecutorForCurrentThread(nullptr);
 }
 
 // static
 void BrowserTaskExecutor::PostFeatureListSetup() {
   DCHECK(g_browser_task_executor);
-  DCHECK(g_browser_task_executor->browser_ui_thread_scheduler_);
-  DCHECK(g_browser_task_executor->browser_io_thread_delegate_);
+  DCHECK(g_browser_task_executor->ui_thread_executor_);
+  DCHECK(g_browser_task_executor->io_thread_executor_);
   g_browser_task_executor->browser_ui_thread_handle_
       ->PostFeatureListInitializationSetup();
   g_browser_task_executor->browser_io_thread_handle_
@@ -153,7 +252,8 @@
   if (!g_browser_task_executor)
     return;
 
-  DCHECK(g_browser_task_executor->browser_ui_thread_scheduler_);
+  DCHECK(g_browser_task_executor->ui_thread_executor_);
+  DCHECK(g_browser_task_executor->io_thread_executor_);
   // We don't delete |g_browser_task_executor| because other threads may
   // PostTask or call BrowserTaskExecutor::GetTaskRunner while we're tearing
   // things down. We don't want to add locks so we just leak instead of dealing
@@ -161,8 +261,8 @@
   // PostTaskAndroid::SignalNativeSchedulerShutdown on Android. In tests however
   // we need to clean up, so BrowserTaskExecutor::ResetForTesting should be
   // called.
-  g_browser_task_executor->browser_ui_thread_scheduler_.reset();
-  g_browser_task_executor->browser_io_thread_delegate_.reset();
+  g_browser_task_executor->ui_thread_executor_.reset();
+  g_browser_task_executor->io_thread_executor_.reset();
 }
 
 // static
@@ -179,9 +279,9 @@
       break;
     case BrowserThread::IO: {
       // In tests there may not be a functional IO thread.
-      if (!g_browser_task_executor->browser_io_thread_delegate_ ||
-          !g_browser_task_executor->browser_io_thread_delegate_
-               ->browser_task_executor_present()) {
+      if (!g_browser_task_executor->io_thread_executor_ ||
+          !g_browser_task_executor->io_thread_executor_
+               ->HasDelegateForTesting()) {
         return;
       }
       g_browser_task_executor->browser_io_thread_handle_
@@ -195,82 +295,6 @@
   run_loop.Run();
 }
 
-bool BrowserTaskExecutor::PostDelayedTask(const base::Location& from_here,
-                                          const base::TaskTraits& traits,
-                                          base::OnceClosure task,
-                                          base::TimeDelta delay) {
-  DCHECK_EQ(BrowserTaskTraitsExtension::kExtensionId, traits.extension_id());
-  const BrowserTaskTraitsExtension& extension =
-      traits.GetExtension<BrowserTaskTraitsExtension>();
-  if (extension.nestable()) {
-    return GetTaskRunner(traits)->PostDelayedTask(from_here, std::move(task),
-                                                  delay);
-  } else {
-    return GetTaskRunner(traits)->PostNonNestableDelayedTask(
-        from_here, std::move(task), delay);
-  }
-}
-
-scoped_refptr<base::TaskRunner> BrowserTaskExecutor::CreateTaskRunner(
-    const base::TaskTraits& traits) {
-  return GetTaskRunner(traits);
-}
-
-scoped_refptr<base::SequencedTaskRunner>
-BrowserTaskExecutor::CreateSequencedTaskRunner(const base::TaskTraits& traits) {
-  return GetTaskRunner(traits);
-}
-
-scoped_refptr<base::SingleThreadTaskRunner>
-BrowserTaskExecutor::CreateSingleThreadTaskRunner(
-    const base::TaskTraits& traits,
-    base::SingleThreadTaskRunnerThreadMode thread_mode) {
-  return GetTaskRunner(traits);
-}
-
-#if defined(OS_WIN)
-scoped_refptr<base::SingleThreadTaskRunner>
-BrowserTaskExecutor::CreateCOMSTATaskRunner(
-    const base::TaskTraits& traits,
-    base::SingleThreadTaskRunnerThreadMode thread_mode) {
-  return GetTaskRunner(traits);
-}
-#endif  // defined(OS_WIN)
-
-scoped_refptr<base::SingleThreadTaskRunner> BrowserTaskExecutor::GetTaskRunner(
-    const base::TaskTraits& traits) const {
-  auto id_and_queue = GetThreadIdAndQueueType(traits);
-
-  switch (id_and_queue.thread_id) {
-    case BrowserThread::UI: {
-      return browser_ui_thread_handle_->GetBrowserTaskRunner(
-          id_and_queue.queue_type);
-    }
-    case BrowserThread::IO:
-      return browser_io_thread_handle_->GetBrowserTaskRunner(
-          id_and_queue.queue_type);
-    case BrowserThread::ID_COUNT:
-      NOTREACHED();
-  }
-  return nullptr;
-}
-
-// static
-BrowserTaskExecutor::ThreadIdAndQueueType
-BrowserTaskExecutor::GetThreadIdAndQueueType(const base::TaskTraits& traits) {
-  DCHECK_EQ(BrowserTaskTraitsExtension::kExtensionId, traits.extension_id());
-  BrowserTaskTraitsExtension extension =
-      traits.GetExtension<BrowserTaskTraitsExtension>();
-
-  BrowserThread::ID thread_id = extension.browser_thread();
-  DCHECK_GE(thread_id, 0);
-
-  BrowserTaskType task_type = extension.task_type();
-  DCHECK_LT(task_type, BrowserTaskType::kBrowserTaskType_Last);
-
-  return {thread_id, GetQueueType(traits, task_type)};
-}
-
 // static
 void BrowserTaskExecutor::EnableAllQueues() {
   DCHECK(g_browser_task_executor);
@@ -287,20 +311,23 @@
 
 std::unique_ptr<BrowserProcessSubThread> BrowserTaskExecutor::CreateIOThread() {
   DCHECK(g_browser_task_executor);
-  DCHECK(g_browser_task_executor->browser_io_thread_delegate_);
+  DCHECK(g_browser_task_executor->io_thread_executor_);
+
+  std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate =
+      g_browser_task_executor->io_thread_executor_->TakeDelegate();
+
+  DCHECK(browser_io_thread_delegate);
   TRACE_EVENT0("startup", "BrowserTaskExecutor::CreateIOThread");
 
   auto io_thread = std::make_unique<BrowserProcessSubThread>(BrowserThread::IO);
 
-  if (g_browser_task_executor->browser_io_thread_delegate_
-          ->allow_blocking_for_testing()) {
+  if (browser_io_thread_delegate->allow_blocking_for_testing()) {
     io_thread->AllowBlockingForTesting();
   }
 
   base::Thread::Options options;
   options.message_pump_type = base::MessagePumpType::IO;
-  options.delegate =
-      g_browser_task_executor->browser_io_thread_delegate_.release();
+  options.delegate = browser_io_thread_delegate.release();
   // Up the priority of the |io_thread_| as some of its IPCs relate to
   // display tasks.
   if (base::FeatureList::IsEnabled(features::kBrowserUseDisplayThreadPriority))
@@ -364,4 +391,68 @@
 
 #endif
 
+BrowserThread::ID BrowserTaskExecutor::GetCurrentThreadID() const {
+  NOTREACHED()
+      << "Should have been routed to UIThreadExecutor or IOThreadExecutor";
+  return BrowserThread::UI;
+}
+
+BrowserTaskExecutor::UIThreadExecutor::UIThreadExecutor(
+    std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler)
+    : browser_ui_thread_scheduler_(std::move(browser_ui_thread_scheduler)) {
+  browser_ui_thread_handle_ = browser_ui_thread_scheduler_->GetHandle();
+}
+
+BrowserTaskExecutor::UIThreadExecutor::~UIThreadExecutor() {
+  if (bound_to_thread_)
+    base::SetTaskExecutorForCurrentThread(nullptr);
+}
+
+void BrowserTaskExecutor::UIThreadExecutor::BindToCurrentThread() {
+  bound_to_thread_ = true;
+  base::SetTaskExecutorForCurrentThread(this);
+}
+
+scoped_refptr<BrowserUIThreadScheduler::Handle>
+BrowserTaskExecutor::UIThreadExecutor::GetUIThreadHandle() {
+  return browser_ui_thread_handle_;
+}
+
+void BrowserTaskExecutor::UIThreadExecutor::SetIOThreadHandle(
+    scoped_refptr<BrowserUIThreadScheduler::Handle> io_thread_handle) {
+  browser_io_thread_handle_ = std::move(io_thread_handle);
+}
+
+BrowserThread::ID BrowserTaskExecutor::UIThreadExecutor::GetCurrentThreadID()
+    const {
+  return BrowserThread::UI;
+}
+
+BrowserTaskExecutor::IOThreadExecutor::IOThreadExecutor(
+    std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate)
+    : browser_io_thread_delegate_(std::move(browser_io_thread_delegate)) {
+  // |browser_io_thread_delegate_| can be null in tests.
+  if (!browser_io_thread_delegate_)
+    return;
+  browser_io_thread_delegate_->SetTaskExecutor(this);
+  browser_io_thread_handle_ = browser_io_thread_delegate_->GetHandle();
+}
+
+BrowserTaskExecutor::IOThreadExecutor::~IOThreadExecutor() = default;
+
+scoped_refptr<BrowserUIThreadScheduler::Handle>
+BrowserTaskExecutor::IOThreadExecutor::GetIOThreadHandle() {
+  return browser_io_thread_handle_;
+}
+
+void BrowserTaskExecutor::IOThreadExecutor::SetUIThreadHandle(
+    scoped_refptr<BrowserUIThreadScheduler::Handle> ui_thread_handle) {
+  browser_ui_thread_handle_ = std::move(ui_thread_handle);
+}
+
+BrowserThread::ID BrowserTaskExecutor::IOThreadExecutor::GetCurrentThreadID()
+    const {
+  return BrowserThread::IO;
+}
+
 }  // namespace content
diff --git a/content/browser/scheduler/browser_task_executor.h b/content/browser/scheduler/browser_task_executor.h
index 720d6d7..8754d97d 100644
--- a/content/browser/scheduler/browser_task_executor.h
+++ b/content/browser/scheduler/browser_task_executor.h
@@ -17,14 +17,66 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 
+// The BrowserTaskExecutor's job is to map base::TaskTraits to actual task
+// queues for the browser process.
+//
+// We actually have three TaskExecutors:
+// * BrowserTaskExecutor registered for BrowserTaskTraitsExtension.
+// * BrowserTaskExecutor::UIThreadExecutor registered with UI thread TLS.
+// * BrowserTaskExecutor::IOThreadExecutor registered with IO thread TLS.
+//
+// This lets us efficiently implement base::CurrentThread on UI and IO threads.
 namespace content {
 
 class BrowserTaskExecutorTest;
 class BrowserProcessSubThread;
 
-// This class's job is to map base::TaskTraits to actual task queues for the
-// browser process.
-class CONTENT_EXPORT BrowserTaskExecutor : public base::TaskExecutor {
+class CONTENT_EXPORT BaseBrowserTaskExecutor : public base::TaskExecutor {
+ public:
+  BaseBrowserTaskExecutor();
+  ~BaseBrowserTaskExecutor() override;
+
+  // base::TaskExecutor implementation.
+  bool PostDelayedTask(const base::Location& from_here,
+                       const base::TaskTraits& traits,
+                       base::OnceClosure task,
+                       base::TimeDelta delay) override;
+
+  scoped_refptr<base::TaskRunner> CreateTaskRunner(
+      const base::TaskTraits& traits) override;
+
+  scoped_refptr<base::SequencedTaskRunner> CreateSequencedTaskRunner(
+      const base::TaskTraits& traits) override;
+
+  scoped_refptr<base::SingleThreadTaskRunner> CreateSingleThreadTaskRunner(
+      const base::TaskTraits& traits,
+      base::SingleThreadTaskRunnerThreadMode thread_mode) override;
+
+#if defined(OS_WIN)
+  scoped_refptr<base::SingleThreadTaskRunner> CreateCOMSTATaskRunner(
+      const base::TaskTraits& traits,
+      base::SingleThreadTaskRunnerThreadMode thread_mode) override;
+#endif  // defined(OS_WIN)
+
+  struct ThreadIdAndQueueType {
+    BrowserThread::ID thread_id;
+    BrowserTaskQueues::QueueType queue_type;
+  };
+
+  ThreadIdAndQueueType GetThreadIdAndQueueType(
+      const base::TaskTraits& traits) const;
+
+ protected:
+  virtual BrowserThread::ID GetCurrentThreadID() const = 0;
+
+  scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(
+      const base::TaskTraits& traits) const;
+
+  scoped_refptr<BrowserUIThreadScheduler::Handle> browser_ui_thread_handle_;
+  scoped_refptr<BrowserIOThreadDelegate::Handle> browser_io_thread_handle_;
+};
+
+class CONTENT_EXPORT BrowserTaskExecutor : public BaseBrowserTaskExecutor {
  public:
   // Creates and registers a BrowserTaskExecutor on the current thread which
   // owns a BrowserUIThreadScheduler. This facilitates posting tasks to a
@@ -74,11 +126,15 @@
   // Can be called multiple times.
   static void EnableAllQueues();
 
-  // As Create but with the user provided objects.
+  // As Create but with the user provided objects. Must call
+  // BindToUIThreadForTesting before tasks can be run on the UI thread.
   static void CreateForTesting(
       std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler,
       std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate);
 
+  // Completes ui-thread set up. Must be called on the UI thread.
+  static void BindToUIThreadForTesting();
+
   // This must be called after the FeatureList has been initialized in order
   // for scheduling experiments to function.
   static void PostFeatureListSetup();
@@ -104,36 +160,6 @@
   static void RunAllPendingTasksOnThreadForTesting(
       BrowserThread::ID identifier);
 
-  struct ThreadIdAndQueueType {
-    BrowserThread::ID thread_id;
-    BrowserTaskQueues::QueueType queue_type;
-  };
-
-  static ThreadIdAndQueueType GetThreadIdAndQueueType(
-      const base::TaskTraits& traits);
-
-  // base::TaskExecutor implementation.
-  bool PostDelayedTask(const base::Location& from_here,
-                       const base::TaskTraits& traits,
-                       base::OnceClosure task,
-                       base::TimeDelta delay) override;
-
-  scoped_refptr<base::TaskRunner> CreateTaskRunner(
-      const base::TaskTraits& traits) override;
-
-  scoped_refptr<base::SequencedTaskRunner> CreateSequencedTaskRunner(
-      const base::TaskTraits& traits) override;
-
-  scoped_refptr<base::SingleThreadTaskRunner> CreateSingleThreadTaskRunner(
-      const base::TaskTraits& traits,
-      base::SingleThreadTaskRunnerThreadMode thread_mode) override;
-
-#if defined(OS_WIN)
-  scoped_refptr<base::SingleThreadTaskRunner> CreateCOMSTATaskRunner(
-      const base::TaskTraits& traits,
-      base::SingleThreadTaskRunnerThreadMode thread_mode) override;
-#endif  // defined(OS_WIN)
-
 #if DCHECK_IS_ON()
   // Adds a Validator for |traits|. It is assumed the lifetime of |validator| is
   // is longer than that of the BrowserTaskExecutor unless RemoveValidator
@@ -151,6 +177,55 @@
   friend class BrowserIOThreadDelegate;
   friend class BrowserTaskExecutorTest;
 
+  // Constructed on UI thread and registered with UI thread TLS. This backs the
+  // implementation of base::CurrentThread for the browser UI thread.
+  class UIThreadExecutor : public BaseBrowserTaskExecutor {
+   public:
+    explicit UIThreadExecutor(
+        std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler);
+
+    ~UIThreadExecutor() override;
+
+    scoped_refptr<BrowserUIThreadScheduler::Handle> GetUIThreadHandle();
+
+    void SetIOThreadHandle(
+        scoped_refptr<BrowserUIThreadScheduler::Handle> io_thread_handle);
+
+    void BindToCurrentThread();
+
+   private:
+    BrowserThread::ID GetCurrentThreadID() const override;
+
+    std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler_;
+    bool bound_to_thread_ = false;
+  };
+
+  // Constructed on UI thread and later registered with IO thread TLS. This
+  // backs the implementation of base::CurrentThread for the browser IO thread.
+  class IOThreadExecutor : public BaseBrowserTaskExecutor {
+   public:
+    explicit IOThreadExecutor(
+        std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate);
+
+    ~IOThreadExecutor() override;
+
+    scoped_refptr<BrowserUIThreadScheduler::Handle> GetIOThreadHandle();
+
+    void SetUIThreadHandle(
+        scoped_refptr<BrowserUIThreadScheduler::Handle> ui_thread_handle);
+
+    std::unique_ptr<BrowserIOThreadDelegate> TakeDelegate() {
+      return std::move(browser_io_thread_delegate_);
+    }
+
+    bool HasDelegateForTesting() const { return !!browser_io_thread_delegate_; }
+
+   private:
+    BrowserThread::ID GetCurrentThreadID() const override;
+
+    std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate_;
+  };
+
   static void CreateInternal(
       std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler,
       std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate);
@@ -166,22 +241,17 @@
   // For Get();
   FRIEND_TEST_ALL_PREFIXES(BrowserTaskExecutorTest,
                            RegisterExecutorForBothThreads);
-
   explicit BrowserTaskExecutor(
       std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler,
       std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate);
   ~BrowserTaskExecutor() override;
 
-  scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(
-      const base::TaskTraits& traits) const;
+  BrowserThread::ID GetCurrentThreadID() const override;
 
   static BrowserTaskExecutor* Get();
 
-  std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler_;
-  scoped_refptr<BrowserUIThreadScheduler::Handle> browser_ui_thread_handle_;
-
-  std::unique_ptr<BrowserIOThreadDelegate> browser_io_thread_delegate_;
-  scoped_refptr<BrowserIOThreadDelegate::Handle> browser_io_thread_handle_;
+  std::unique_ptr<UIThreadExecutor> ui_thread_executor_;
+  std::unique_ptr<IOThreadExecutor> io_thread_executor_;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserTaskExecutor);
 };
diff --git a/content/browser/scheduler/browser_task_executor_unittest.cc b/content/browser/scheduler/browser_task_executor_unittest.cc
index 7d3701b..9ef50ad 100644
--- a/content/browser/scheduler/browser_task_executor_unittest.cc
+++ b/content/browser/scheduler/browser_task_executor_unittest.cc
@@ -33,6 +33,7 @@
 using ::testing::ElementsAre;
 using ::testing::Invoke;
 using ::testing::Mock;
+using ::testing::NotNull;
 using ::testing::SizeIs;
 
 using QueueType = BrowserTaskQueues::QueueType;
@@ -49,13 +50,13 @@
 
 TEST_F(BrowserTaskExecutorTest, RegisterExecutorForBothThreads) {
   base::PostTask(FROM_HERE, {BrowserThread::UI}, base::BindOnce([]() {
-                   EXPECT_EQ(BrowserTaskExecutor::Get(),
-                             base::GetTaskExecutorForCurrentThread());
+                   EXPECT_THAT(base::GetTaskExecutorForCurrentThread(),
+                               NotNull());
                  }));
 
   base::PostTask(FROM_HERE, {BrowserThread::IO}, base::BindOnce([]() {
-                   EXPECT_EQ(BrowserTaskExecutor::Get(),
-                             base::GetTaskExecutorForCurrentThread());
+                   EXPECT_THAT(base::GetTaskExecutorForCurrentThread(),
+                               NotNull());
                  }));
 
   BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::UI);
@@ -123,6 +124,16 @@
 // Helper to perform the same tets for all BrowserThread::ID values.
 class BrowserTaskTraitsMappingTest : public BrowserTaskExecutorTest {
  protected:
+  class TestExecutor : public BaseBrowserTaskExecutor {
+   public:
+    ~TestExecutor() override = default;
+
+    BrowserThread::ID GetCurrentThreadID() const override {
+      NOTREACHED();
+      return BrowserThread::UI;
+    }
+  };
+
   template <BrowserThread::ID ID>
   void CheckExpectations() {
     EXPECT_EQ(GetQueueType({ID, TaskPriority::BEST_EFFORT}),
@@ -146,8 +157,10 @@
 
  private:
   QueueType GetQueueType(const base::TaskTraits& traits) {
-    return BrowserTaskExecutor::GetThreadIdAndQueueType(traits).queue_type;
+    return test_executor_.GetThreadIdAndQueueType(traits).queue_type;
   }
+
+  TestExecutor test_executor_;
 };
 
 TEST_F(BrowserTaskTraitsMappingTest, BrowserTaskTraitsMapToProperPriorities) {
@@ -194,9 +207,8 @@
               QueueType::kDefault));
       BrowserTaskExecutor::CreateForTesting(
           std::move(browser_ui_thread_scheduler),
-          std::make_unique<BrowserIOThreadDelegate>(
-              BrowserIOThreadDelegate::BrowserTaskExecutorPresent::
-                  kNoForTesting));
+          BrowserIOThreadDelegate::CreateForTesting(sequence_manager()));
+      BrowserTaskExecutor::BindToUIThreadForTesting();
     }
   };
 
@@ -256,4 +268,46 @@
   task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(100));
 }
 
+TEST_F(BrowserTaskExecutorTest, CurrentThread) {
+  base::PostTask(
+      FROM_HERE, {BrowserThread::UI}, base::BindOnce([]() {
+        base::PostTask(
+            FROM_HERE, {base::CurrentThread()}, base::BindOnce([]() {
+              EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
+            }));
+      }));
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::UI);
+
+  base::PostTask(
+      FROM_HERE, {BrowserThread::IO}, base::BindOnce([]() {
+        base::PostTask(
+            FROM_HERE, {base::CurrentThread()}, base::BindOnce([]() {
+              EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
+            }));
+      }));
+
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::IO);
+}
+
+TEST_F(BrowserTaskExecutorTest, CurrentThreadAndOtherTraits) {
+  EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  auto ui_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::UI});
+  auto ui_best_effort_runner = base::CreateSingleThreadTaskRunner(
+      {BrowserThread::UI, base::TaskPriority::BEST_EFFORT});
+  auto ui_best_navigation_runner = base::CreateSingleThreadTaskRunner(
+      {BrowserThread::UI, BrowserTaskType::kNavigation});
+
+  EXPECT_EQ(ui_task_runner,
+            base::CreateSingleThreadTaskRunner({base::CurrentThread()}));
+
+  EXPECT_EQ(ui_best_effort_runner,
+            base::CreateSingleThreadTaskRunner(
+                {base::CurrentThread(), base::TaskPriority::BEST_EFFORT}));
+
+  EXPECT_EQ(ui_best_navigation_runner,
+            base::CreateSingleThreadTaskRunner(
+                {base::CurrentThread(), BrowserTaskType::kNavigation}));
+}
+
 }  // namespace content
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java
index 1e9a9f9..076fa93 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/scheduler/UiThreadSchedulerTest.java
@@ -20,6 +20,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.task.PostTask;
+import org.chromium.base.task.SingleThreadTaskRunner;
 import org.chromium.base.task.TaskRunner;
 import org.chromium.base.task.TaskTraits;
 import org.chromium.base.test.BaseJUnit4ClassRunner;
@@ -159,6 +160,103 @@
 
     @Test
     @MediumTest
+    public void testPostTaskCurrentThreadBeforeNativeLoaded() throws Exception {
+        // This should not timeout.
+        final Object lock = new Object();
+        final AtomicBoolean taskExecuted = new AtomicBoolean();
+        PostTask.postTask(UiThreadTaskTraits.DEFAULT, new Runnable() {
+            @Override
+            public void run() {
+                PostTask.postTask(TaskTraits.CURRENT_THREAD, new Runnable() {
+                    @Override
+                    public void run() {
+                        synchronized (lock) {
+                            taskExecuted.set(true);
+                            lock.notify();
+                        }
+                    }
+                });
+            }
+        });
+
+        synchronized (lock) {
+            while (!taskExecuted.get()) {
+                lock.wait();
+            }
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testPostTaskCurrentThreadAfterNativeLoaded() throws Exception {
+        startContentMainOnUiThread();
+
+        // This should not timeout.
+        final Object lock = new Object();
+        final AtomicBoolean taskExecuted = new AtomicBoolean();
+        PostTask.postTask(UiThreadTaskTraits.DEFAULT, new Runnable() {
+            @Override
+            public void run() {
+                PostTask.postTask(TaskTraits.CURRENT_THREAD, new Runnable() {
+                    @Override
+                    public void run() {
+                        synchronized (lock) {
+                            taskExecuted.set(true);
+                            lock.notify();
+                        }
+                    }
+                });
+            }
+        });
+
+        synchronized (lock) {
+            while (!taskExecuted.get()) {
+                lock.wait();
+            }
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testPostTaskCurrentThreadInThreadpoolAfterNativeLoaded() throws Exception {
+        startContentMainOnUiThread();
+        SingleThreadTaskRunner threadpoolTaskRunner =
+                PostTask.createSingleThreadTaskRunner(TaskTraits.THREAD_POOL_USER_BLOCKING);
+        SingleThreadTaskRunner uiThreadTaskRunner =
+                PostTask.createSingleThreadTaskRunner(UiThreadTaskTraits.DEFAULT);
+
+        // This should not timeout.
+        final Object lock = new Object();
+        final AtomicBoolean taskExecuted = new AtomicBoolean();
+        threadpoolTaskRunner.postTask(new Runnable() {
+            @Override
+            public void run() {
+                PostTask.postTask(TaskTraits.CURRENT_THREAD, new Runnable() {
+                    @Override
+                    public void run() {
+                        synchronized (lock) {
+                            Assert.assertTrue(threadpoolTaskRunner.belongsToCurrentThread());
+                            Assert.assertFalse(uiThreadTaskRunner.belongsToCurrentThread());
+                            taskExecuted.set(true);
+                            lock.notify();
+                        }
+                    }
+                });
+            }
+        });
+
+        synchronized (lock) {
+            while (!taskExecuted.get()) {
+                lock.wait();
+            }
+        }
+
+        uiThreadTaskRunner.destroy();
+        threadpoolTaskRunner.destroy();
+    }
+
+    @Test
+    @MediumTest
     public void testTaskNotRunOnUiThreadWithoutUiThreadTaskTraits() {
         TaskRunner uiThreadTaskRunner =
                 PostTask.createSingleThreadTaskRunner(TaskTraits.USER_BLOCKING);
diff --git a/content/public/browser/browser_task_traits.h b/content/public/browser/browser_task_traits.h
index fb283f77..9695496 100644
--- a/content/public/browser/browser_task_traits.h
+++ b/content/public/browser/browser_task_traits.h
@@ -80,11 +80,21 @@
           base::trait_helpers::AreValidTraits<ValidTrait, ArgTypes...>::value>>
   constexpr BrowserTaskTraitsExtension(ArgTypes... args)
       : browser_thread_(
-            base::trait_helpers::GetEnum<BrowserThread::ID>(args...)),
+            base::trait_helpers::GetEnum<BrowserThread::ID, BrowserThread::UI>(
+                args...)),
         task_type_(
             base::trait_helpers::GetEnum<BrowserTaskType,
                                          BrowserTaskType::kDefault>(args...)),
-        nestable_(!base::trait_helpers::HasTrait<NonNestable, ArgTypes...>()) {}
+        nestable_(!base::trait_helpers::HasTrait<NonNestable, ArgTypes...>()) {
+    constexpr bool has_current_thread =
+        base::trait_helpers::HasTrait<base::CurrentThread, ArgTypes...>();
+    constexpr bool has_browser_thread =
+        base::trait_helpers::HasTrait<BrowserThread::ID, ArgTypes...>();
+    static_assert(
+        has_current_thread != has_browser_thread,
+        "Either content::BrowserThread::ID or base::CurrentThread must be set, "
+        "but not both");
+  }
 
   // Keep in sync with UiThreadTaskTraits.java
   constexpr base::TaskTraitsExtensionStorage Serialize() const {
@@ -105,7 +115,9 @@
         static_cast<bool>(extension.data[2]));
   }
 
+  // This must be ignored if base::CurrentThread is specified.
   constexpr BrowserThread::ID browser_thread() const { return browser_thread_; }
+
   constexpr BrowserTaskType task_type() const { return task_type_; }
 
   // Returns true if tasks with these traits may run in a nested RunLoop.
diff --git a/content/public/browser/browser_task_traits_unittest.nc b/content/public/browser/browser_task_traits_unittest.nc
index 8738feb..7f2aa05 100644
--- a/content/public/browser/browser_task_traits_unittest.nc
+++ b/content/public/browser/browser_task_traits_unittest.nc
@@ -7,14 +7,17 @@
 
 #include "base/task/task_traits.h"
 #include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
 
 namespace content {
 
-#if defined(NCTEST_BROWSER_TASK_TRAITS_NO_THREAD)  // [r"The traits bag is missing a required trait."]
-constexpr base::TaskTraits traits = {NonNestable()};
+#if defined(NCTEST_BROWSER_TASK_TRAITS_NO_THREAD)  // [r"Either content::BrowserThread::ID or base::CurrentThread must be set, but not both"]
+constexpr base::TaskTraits traits = {BrowserTaskType::kNavigation};
 #elif defined(NCTEST_BROWSER_TASK_TRAITS_MULTIPLE_THREADS)  // [r"The traits bag contains multiple traits of the same type."]
 constexpr base::TaskTraits traits = {BrowserThread::UI,
                                      BrowserThread::IO};
+#elif defined(NCTEST_BROWSER_TASK_TRAITS_BROWSER_THREAD_AND_CURRENT_THREAD)  // [r"Either content::BrowserThread::ID or base::CurrentThread must be set, but not both"]
+constexpr base::TaskTraits traits = {BrowserThread::UI, base::CurrentThread()};
 #endif
 
 }  // namespace content
diff --git a/content/public/test/browser_task_environment.cc b/content/public/test/browser_task_environment.cc
index a7aee30a..b877abd 100644
--- a/content/public/test/browser_task_environment.cc
+++ b/content/public/test/browser_task_environment.cc
@@ -99,6 +99,7 @@
 
   BrowserTaskExecutor::CreateForTesting(std::move(browser_ui_thread_scheduler),
                                         std::move(browser_io_thread_delegate));
+  BrowserTaskExecutor::BindToUIThreadForTesting();
   DeferredInitFromSubclass(std::move(default_ui_task_runner));
 
   if (HasIOMainLoop()) {
diff --git a/content/public/test/browser_task_environment_unittest.cc b/content/public/test/browser_task_environment_unittest.cc
index ab7adf3..cca1c2c 100644
--- a/content/public/test/browser_task_environment_unittest.cc
+++ b/content/public/test/browser_task_environment_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/message_loop/message_loop_current.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/post_task.h"
+#include "base/test/bind_test_util.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -176,4 +177,50 @@
   EXPECT_THAT(task_environment.GetMockClock(), testing::NotNull());
 }
 
+TEST(BrowserTaskEnvironmentTest, CurrentThread) {
+  BrowserTaskEnvironment task_environment;
+  base::RunLoop run_loop;
+
+  base::PostTask(FROM_HERE, {base::CurrentThread()},
+                 base::BindLambdaForTesting([&]() {
+                   base::PostTask(FROM_HERE, {base::CurrentThread()},
+                                  run_loop.QuitClosure());
+                 }));
+
+  run_loop.Run();
+}
+
+TEST(BrowserTaskEnvironmentTest, CurrentThreadIO) {
+  BrowserTaskEnvironment task_environment;
+  base::RunLoop run_loop;
+
+  auto io_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::IO});
+
+  base::PostTask(
+      FROM_HERE, {BrowserThread::IO}, base::BindLambdaForTesting([&]() {
+        EXPECT_EQ(io_task_runner,
+                  base::CreateSingleThreadTaskRunner({base::CurrentThread()}));
+        run_loop.Quit();
+      }));
+
+  run_loop.Run();
+}
+
+TEST(BrowserTaskEnvironmentTest, CurrentThreadIOWithRealIOThread) {
+  BrowserTaskEnvironment task_environment(
+      BrowserTaskEnvironment::Options::REAL_IO_THREAD);
+  base::RunLoop run_loop;
+
+  auto io_task_runner = base::CreateSingleThreadTaskRunner({BrowserThread::IO});
+
+  base::PostTask(
+      FROM_HERE, {BrowserThread::IO}, base::BindLambdaForTesting([&]() {
+        EXPECT_EQ(io_task_runner,
+                  base::CreateSingleThreadTaskRunner({base::CurrentThread()}));
+        run_loop.Quit();
+      }));
+
+  run_loop.Run();
+}
+
 }  // namespace content
diff --git a/content/shell/browser/web_test/blink_test_controller.cc b/content/shell/browser/web_test/blink_test_controller.cc
index 9c00f90f..befb67f 100644
--- a/content/shell/browser/web_test/blink_test_controller.cc
+++ b/content/shell/browser/web_test/blink_test_controller.cc
@@ -448,18 +448,18 @@
     // Shell::SizeTo is not implemented on all platforms.
     main_window_->SizeTo(initial_size_);
 #endif
-    main_window_->web_contents()
-        ->GetRenderViewHost()
-        ->GetWidget()
-        ->GetView()
-        ->SetSize(initial_size_);
-    // Try to reset the window size. This can fail, see crbug.com/772811
-    main_window_->web_contents()
-        ->GetRenderViewHost()
-        ->GetWidget()
-        ->SynchronizeVisualProperties();
     RenderViewHost* render_view_host =
         main_window_->web_contents()->GetRenderViewHost();
+    RenderWidgetHost* render_widget_host = render_view_host->GetWidget();
+    // Set a different size first to reset the possibly inconsistent state
+    // caused by the previous test using unfortunate synchronous resize mode.
+    // This forces SetSize() not to early return which would otherwise happen
+    // when we set the size to initial_size_ which is the same as its current
+    // size. See http://crbug.com/1011191 for more details.
+    render_widget_host->GetView()->SetSize(
+        gfx::Size(initial_size_.width() / 2, initial_size_.height()));
+    render_widget_host->GetView()->SetSize(initial_size_);
+    render_widget_host->SynchronizeVisualProperties();
 
     if (is_devtools_protocol_test) {
       devtools_protocol_test_bindings_.reset(
@@ -476,13 +476,10 @@
 
     // Focus the RenderWidgetHost. This will send an IPC message to the
     // renderer to propagate the state change.
-    main_window_->web_contents()->GetRenderViewHost()->GetWidget()->Focus();
+    render_widget_host->Focus();
 
     // Flush various interfaces to ensure a test run begins from a known state.
-    main_window_->web_contents()
-        ->GetRenderViewHost()
-        ->GetWidget()
-        ->FlushForTesting();
+    render_widget_host->FlushForTesting();
     GetWebTestControlRemote(render_view_host->GetMainFrame()).FlushForTesting();
 
     if (is_devtools_js_test) {
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 3bd9cb1..326d8a6 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -157,10 +157,6 @@
 crbug.com/angleproject/1465 [ win ] conformance2/glsl3/tricky-loop-conditions.html [ Failure ]
 crbug.com/951628 [ win no-passthrough ] conformance/rendering/blending.html [ Failure ]
 
-# Win / D3D11 backend
-# This test seems to flakily pass sometimes (at least on AMD and Intel).
-crbug.com/angleproject/3388 [ win d3d11 ] conformance2/uniforms/large-uniform-buffers.html [ Failure ]
-
 # Win / NVidia
 crbug.com/631317 [ d3d11 win nvidia ] deqp/functional/gles3/fbomultisample* [ RetryOnFailure ]
 crbug.com/679639 [ d3d11 win nvidia ] conformance2/rendering/draw-with-integer-texture-base-level.html [ Failure ]
diff --git a/docs/clang.md b/docs/clang.md
index d901dad..259560c1 100644
--- a/docs/clang.md
+++ b/docs/clang.md
@@ -74,6 +74,12 @@
 is_component_build = true
 ```
 
+On Windows, for `clang_base_path` use something like this instead:
+
+```
+clang_base_path = "c:/src/llvm-build"
+```
+
 You can then run `head out/gn/toolchain.ninja` and check that the first to
 lines set `cc` and `cxx` to your clang binary. If things look good, run `ninja
 -C out/gn` to build.
diff --git a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
index d18f3581..9ba6335 100644
--- a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
@@ -13,5 +13,95 @@
     "use_goma=true"
   ],
   "tests": [
+    {
+      "include": "common_tests.json",
+      "device type": "iPhone X",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome",
+      "test args": [
+        "--run-with-custom-webkit"
+      ]
+    },
+    {
+      "include": "screen_size_dependent_tests.json",
+      "device type": "iPhone X",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome",
+      "test args": [
+        "--run-with-custom-webkit"
+      ]
+    },
+    {
+      "include": "eg_tests.json",
+      "device type": "iPhone X",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome",
+      "test args": [
+        "--run-with-custom-webkit"
+      ]
+
+    },
+    {
+      "include": "eg_cq_tests.json",
+      "device type": "iPhone X",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome",
+      "test args": [
+        "--run-with-custom-webkit"
+      ]
+    },
+    {
+      "include": "common_tests.json",
+      "device type": "iPad Air 2",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome",
+      "test args": [
+        "--run-with-custom-webkit"
+      ]
+    },
+    {
+      "include": "screen_size_dependent_tests.json",
+      "device type": "iPad Air 2",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome",
+      "test args": [
+        "--run-with-custom-webkit"
+      ]
+    },
+    {
+      "include": "eg_tests.json",
+      "device type": "iPad Air 2",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome",
+      "test args": [
+        "--run-with-custom-webkit"
+      ]
+
+    },
+    {
+      "include": "eg_cq_tests.json",
+      "device type": "iPad Air 2",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome",
+      "test args": [
+        "--run-with-custom-webkit"
+      ]
+    }
   ]
 }
diff --git a/ios/chrome/browser/autofill/automation/automation_action.mm b/ios/chrome/browser/autofill/automation/automation_action.mm
index 37937e9..f57c6cd 100644
--- a/ios/chrome/browser/autofill/automation/automation_action.mm
+++ b/ios/chrome/browser/autofill/automation/automation_action.mm
@@ -4,25 +4,18 @@
 
 #import "ios/chrome/browser/autofill/automation/automation_action.h"
 
-#import <EarlGrey/EarlGrey.h>
-
-#include "base/guid.h"
 #include "base/mac/foundation_util.h"
-#include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #import "base/test/ios/wait_util.h"
-#include "components/autofill/core/browser/autofill_manager.h"
-#include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/autofill/ios/browser/autofill_driver_ios.h"
+#include "base/values.h"
 #import "ios/chrome/browser/autofill/form_suggestion_constants.h"
 #import "ios/chrome/browser/ui/infobars/infobar_constants.h"
-#import "ios/chrome/test/app/tab_test_util.h"
+#import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
-#import "ios/web/public/js_messaging/web_frames_manager.h"
-#import "ios/web/public/test/earl_grey/web_view_actions.h"
-#import "ios/web/public/test/earl_grey/web_view_matchers.h"
-#include "ios/web/public/test/element_selector.h"
+#import "ios/chrome/test/earl_grey/chrome_matchers.h"
+#import "ios/testing/earl_grey/earl_grey_test.h"
+#import "ios/web/public/test/element_selector.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -198,27 +191,26 @@
 // A shared flow across many actions, this waits for the target element to be
 // visible, scrolls it into view, then taps on it.
 - (void)tapOnTarget:(ElementSelector*)selector {
-  web::WebState* web_state = chrome_test_util::GetCurrentWebState();
 
   // Wait for the element to be visible on the page.
   [ChromeEarlGrey waitForWebStateContainingElement:selector];
 
   // Potentially scroll into view if below the fold.
-  [[EarlGrey selectElementWithMatcher:web::WebViewInWebState(web_state)]
-      performAction:WebViewScrollElementToVisible(web_state, selector)];
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
+      performAction:chrome_test_util::ScrollElementToVisible(selector)];
 
   // Calling WebViewTapElement right after WebViewScrollElement caused flaky
   // issues with the wrong location being provided for the tap target,
   // seemingly caused by the screen not redrawing in-between these two actions.
-  // We force a brief wait here to avoid this issue.
-  [[GREYCondition conditionWithName:@"forced wait to allow for redraw"
-                              block:^BOOL {
-                                return false;
-                              }] waitWithTimeout:0.1];
-
+  // We force a brief wait here to avoid this issue. |waitWithTimeout| requires
+  // its result to be used. Void the result as it's always false.
+  (void)[[GREYCondition conditionWithName:@"forced wait to allow for redraw"
+                                    block:^BOOL {
+                                      return false;
+                                    }] waitWithTimeout:0.1];
   // Tap on the element.
-  [[EarlGrey selectElementWithMatcher:web::WebViewInWebState(web_state)]
-      performAction:web::WebViewTapElement(web_state, selector)];
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
+      performAction:chrome_test_util::TapWebElement(selector)];
 }
 
 // Creates a selector targeting the element specified in the action.
diff --git a/ios/chrome/browser/prerender/preload_controller.mm b/ios/chrome/browser/prerender/preload_controller.mm
index 37f3274..9debfbf5 100644
--- a/ios/chrome/browser/prerender/preload_controller.mm
+++ b/ios/chrome/browser/prerender/preload_controller.mm
@@ -272,6 +272,7 @@
   return !IsPrerenderTabEvictionExperimentalGroup() && self.preferenceEnabled &&
          !ios::device_util::IsSingleCoreDevice() &&
          ios::device_util::RamIsAtLeast512Mb() &&
+         !net::NetworkChangeNotifier::IsOffline() &&
          (!self.wifiOnly || !self.usingWWAN);
 }
 
diff --git a/ios/chrome/browser/prerender/preload_controller_unittest.mm b/ios/chrome/browser/prerender/preload_controller_unittest.mm
index 78b1584..f36bfc7 100644
--- a/ios/chrome/browser/prerender/preload_controller_unittest.mm
+++ b/ios/chrome/browser/prerender/preload_controller_unittest.mm
@@ -90,6 +90,11 @@
         net::NetworkChangeNotifier::CONNECTION_WIFI);
   }
 
+  void SimulateOffline() {
+    network_change_notifier_->SimulateNetworkConnectionChange(
+        net::NetworkChangeNotifier::CONNECTION_NONE);
+  }
+
   void SimulateCellularConnection() {
     network_change_notifier_->SimulateNetworkConnectionChange(
         net::NetworkChangeNotifier::CONNECTION_3G);
@@ -133,13 +138,16 @@
 
 TEST_F(PreloadControllerTest, TestIsPrerenderingEnabled_preloadAlways) {
   // With the "Preload Webpages" setting set to "Always", prerendering is
-  // enabled regardless of network type.
+  // enabled regardless of network type, unless offline.
   PreloadWebpagesAlways();
 
   SimulateWiFiConnection();
   EXPECT_TRUE(controller_.enabled || ios::device_util::IsSingleCoreDevice() ||
               !ios::device_util::RamIsAtLeast512Mb());
 
+  SimulateOffline();
+  EXPECT_FALSE(controller_.enabled);
+
   SimulateCellularConnection();
   EXPECT_TRUE(controller_.enabled || ios::device_util::IsSingleCoreDevice() ||
               !ios::device_util::RamIsAtLeast512Mb());
@@ -154,6 +162,9 @@
   EXPECT_TRUE(controller_.enabled || ios::device_util::IsSingleCoreDevice() ||
               !ios::device_util::RamIsAtLeast512Mb());
 
+  SimulateOffline();
+  EXPECT_FALSE(controller_.enabled);
+
   SimulateCellularConnection();
   EXPECT_FALSE(controller_.enabled);
 }
@@ -166,6 +177,9 @@
   SimulateWiFiConnection();
   EXPECT_FALSE(controller_.enabled);
 
+  SimulateOffline();
+  EXPECT_FALSE(controller_.enabled);
+
   SimulateCellularConnection();
   EXPECT_FALSE(controller_.enabled);
 }
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/all_password_coordinator.mm b/ios/chrome/browser/ui/autofill/manual_fill/all_password_coordinator.mm
index 2b942bf4..9498d9c 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/all_password_coordinator.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/all_password_coordinator.mm
@@ -75,9 +75,8 @@
 }
 
 - (void)stop {
-  [self.passwordViewController.presentingViewController
-      dismissViewControllerAnimated:YES
-                         completion:nil];
+  [self.passwordViewController dismissViewControllerAnimated:YES
+                                                  completion:nil];
   self.passwordViewController = nil;
   self.passwordMediator = nil;
   [super stop];
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
index 1b2ba38..5b737d8 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
@@ -31,7 +31,6 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
 #include "ios/web/public/test/element_selector.h"
-#import "ios/web/public/web_client.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "url/gurl.h"
 
@@ -528,45 +527,6 @@
   }
 }
 
-// Test that after searching in "Use Other Password" and selecting an option,
-// the screen is dismissed.
-- (void)testOtherPasswordsDismissAfterSearch {
-  // This test is failing on a legacy bot. Return early if running there.
-  if (![ChromeEarlGrey isSlimNavigationManagerEnabled]) {
-    EARL_GREY_TEST_SKIPPED(@"Skipped for Slim Navigation off.");
-  }
-
-  // Bring up the keyboard.
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
-      performAction:TapWebElementWithId(kFormElementUsername)];
-
-  // Tap the passwords icon.
-  [[EarlGrey selectElementWithMatcher:PasswordIconMatcher()]
-      performAction:grey_tap()];
-
-  // Tap "Use Other Password...".
-  [[EarlGrey selectElementWithMatcher:OtherPasswordsMatcher()]
-      performAction:grey_tap()];
-
-  // Verify "Use Other Passwords" opened.
-  [[EarlGrey selectElementWithMatcher:OtherPasswordsDismissMatcher()]
-      assertWithMatcher:grey_sufficientlyVisible()];
-
-  // Tap the password search bar.
-  [[EarlGrey selectElementWithMatcher:PasswordSearchBarMatcher()]
-      performAction:grey_typeText(@"user")];
-
-  // Select a username.
-  [[EarlGrey selectElementWithMatcher:UsernameButtonMatcher()]
-      performAction:grey_tap()];
-
-  // Verify the password list disappears.
-  [[EarlGrey selectElementWithMatcher:PasswordSearchBarMatcher()]
-      assertWithMatcher:grey_nil()];
-  [[EarlGrey selectElementWithMatcher:OtherPasswordsMatcher()]
-      assertWithMatcher:grey_nil()];
-}
-
 // Tests that the Password View Controller is dismissed when tapping the
 // keyboard icon.
 - (void)testKeyboardIconDismissPasswordController {
diff --git a/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm b/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm
index 2dc516a..6c925478 100644
--- a/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm
+++ b/ios/chrome/browser/ui/passwords/password_breach_coordinator.mm
@@ -37,6 +37,7 @@
 }
 
 - (void)stop {
+  [self.mediator disconnect];
   self.mediator = nil;
   [self.viewController.presentingViewController
       dismissViewControllerAnimated:YES
diff --git a/ios/chrome/browser/ui/passwords/password_breach_mediator.h b/ios/chrome/browser/ui/passwords/password_breach_mediator.h
index 4d1a69c..a111a4a 100644
--- a/ios/chrome/browser/ui/passwords/password_breach_mediator.h
+++ b/ios/chrome/browser/ui/passwords/password_breach_mediator.h
@@ -36,6 +36,10 @@
 
 - (instancetype)initWithCoder NS_UNAVAILABLE;
 
+// Informs the mediator that its about to be destroyed, so it can perform any
+// logging or clean up needed.
+- (void)disconnect;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_PASSWORDS_PASSWORD_BREACH_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/passwords/password_breach_mediator.mm b/ios/chrome/browser/ui/passwords/password_breach_mediator.mm
index 20ddc19..427fa96 100644
--- a/ios/chrome/browser/ui/passwords/password_breach_mediator.mm
+++ b/ios/chrome/browser/ui/passwords/password_breach_mediator.mm
@@ -6,6 +6,7 @@
 
 #include "base/strings/sys_string_conversions.h"
 #include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
+#include "components/password_manager/core/browser/password_manager_metrics_util.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/ui/passwords/password_breach_consumer.h"
@@ -19,12 +20,22 @@
 using password_manager::GetAcceptButtonLabel;
 using password_manager::GetCancelButtonLabel;
 using password_manager::GetDescription;
+using password_manager::GetLeakDialogType;
 using password_manager::GetTitle;
-using password_manager::ShouldCheckPasswords;
 using password_manager::GetPasswordCheckupURL;
+using password_manager::ShouldCheckPasswords;
+using password_manager::metrics_util::LeakDialogDismissalReason;
+using password_manager::metrics_util::LeakDialogType;
+using password_manager::metrics_util::LogLeakDialogTypeAndDismissalReason;
 
 @interface PasswordBreachMediator ()
 
+// Leak type of the dialog.
+@property(nonatomic, assign) LeakDialogType leakType;
+
+// Dismiss reason, used for metrics.
+@property(nonatomic, assign) LeakDialogDismissalReason dismissReason;
+
 // The presenter of the feature.
 @property(nonatomic, weak) id<PasswordBreachPresenter> presenter;
 
@@ -44,6 +55,9 @@
   if (self) {
     _presenter = presenter;
     _dispatcher = dispatcher;
+    _leakType = GetLeakDialogType(leakType);
+    _dismissReason = LeakDialogDismissalReason::kNoDirectInteraction;
+
     NSString* subtitle = SysUTF16ToNSString(GetDescription(leakType, URL));
     NSString* primaryActionString =
         SysUTF16ToNSString(GetAcceptButtonLabel(leakType));
@@ -55,13 +69,21 @@
   return self;
 }
 
+- (void)disconnect {
+  LogLeakDialogTypeAndDismissalReason(self.leakType, self.dismissReason);
+}
+
 #pragma mark - PasswordBreachConsumerDelegate
 
 - (void)passwordBreachDone {
+  self.dismissReason = LeakDialogDismissalReason::kClickedOk;
   [self.presenter stop];
 }
 
 - (void)passwordBreachPrimaryAction {
+  // Opening a new tab already stops the presentation in the presenter.
+  // No need to send |stop|.
+  self.dismissReason = LeakDialogDismissalReason::kClickedCheckPasswords;
   OpenNewTabCommand* newTabCommand =
       [OpenNewTabCommand commandWithURLFromChrome:GetPasswordCheckupURL()];
   [self.dispatcher openURLInNewTab:newTabCommand];
diff --git a/ios/third_party/webkit/BUILD.gn b/ios/third_party/webkit/BUILD.gn
index 0b3b89c8..1e5e9b9 100644
--- a/ios/third_party/webkit/BUILD.gn
+++ b/ios/third_party/webkit/BUILD.gn
@@ -64,6 +64,14 @@
       "$_framework_out_dir/WebKit.framework/WebKit",
       "$_framework_out_dir/WebKitLegacy.framework",
       "$_framework_out_dir/WebKitLegacy.framework/WebKitLegacy",
+      "$_framework_out_dir/com.apple.WebKit.Networking.xpc",
+      "$_framework_out_dir/com.apple.WebKit.Networking.xpc/com.apple.WebKit.Networking.Development",
+      "$_framework_out_dir/com.apple.WebKit.Plugin.64.xpc",
+      "$_framework_out_dir/com.apple.WebKit.Plugin.64.xpc/com.apple.WebKit.Plugin.64.Development",
+      "$_framework_out_dir/com.apple.WebKit.WebContent.Development.xpc",
+      "$_framework_out_dir/com.apple.WebKit.WebContent.Development.xpc/com.apple.WebKit.WebContent.Development.Development",
+      "$_framework_out_dir/com.apple.WebKit.WebContent.xpc",
+      "$_framework_out_dir/com.apple.WebKit.WebContent.xpc/com.apple.WebKit.WebContent.Development",
     ]
 
     # TODO(crbug.com/934252): "-j 4" restricts xcodebuild to four simultaneous
@@ -91,6 +99,10 @@
       "$_framework_out_dir/WebCore.framework",
       "$_framework_out_dir/WebKit.framework",
       "$_framework_out_dir/WebKitLegacy.framework",
+      "$_framework_out_dir/com.apple.WebKit.Networking.xpc",
+      "$_framework_out_dir/com.apple.WebKit.Plugin.64.xpc",
+      "$_framework_out_dir/com.apple.WebKit.WebContent.Development.xpc",
+      "$_framework_out_dir/com.apple.WebKit.WebContent.xpc",
     ]
     outputs = [
       "{{bundle_contents_dir}}/WebKitFrameworks/{{source_file_part}}",
diff --git a/ios/web/common/features.h b/ios/web/common/features.h
index 533239b..32213d9 100644
--- a/ios/web/common/features.h
+++ b/ios/web/common/features.h
@@ -31,6 +31,11 @@
 // Used to ensure that the render is not suspended.
 extern const base::Feature kKeepsRenderProcessAlive;
 
+// Used to enable the workaround for a WKWebView WKNavigation leak.
+// (crbug.com/1010765).  Clear older pending navigation records when a
+// navigation finishes.
+extern const base::Feature kClearOldNavigationRecordsWorkaround;
+
 // Used to enable committed interstitials for SSL errors.
 extern const base::Feature kSSLCommittedInterstitials;
 
diff --git a/ios/web/common/features.mm b/ios/web/common/features.mm
index 357e0e6..f062aed 100644
--- a/ios/web/common/features.mm
+++ b/ios/web/common/features.mm
@@ -29,6 +29,9 @@
 const base::Feature kKeepsRenderProcessAlive{"KeepsRenderProcessAlive",
                                              base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kClearOldNavigationRecordsWorkaround{
+    "ClearOldNavigationRecordsWorkaround", base::FEATURE_ENABLED_BY_DEFAULT};
+
 const base::Feature kSSLCommittedInterstitials{
     "SSLCommittedInterstitials", base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/ios/web/navigation/crw_web_view_navigation_observer.h b/ios/web/navigation/crw_web_view_navigation_observer.h
index 7ecebee..ebe436e2 100644
--- a/ios/web/navigation/crw_web_view_navigation_observer.h
+++ b/ios/web/navigation/crw_web_view_navigation_observer.h
@@ -18,6 +18,9 @@
 // The webView to observe.
 @property(nonatomic, weak) WKWebView* webView;
 
+// Instructs this handler to close.
+- (void)close;
+
 @end
 
 #endif  // IOS_WEB_NAVIGATION_CRW_WEB_VIEW_NAVIGATION_OBSERVER_H_
diff --git a/ios/web/navigation/crw_web_view_navigation_observer.mm b/ios/web/navigation/crw_web_view_navigation_observer.mm
index 81e35541..5e752c4 100644
--- a/ios/web/navigation/crw_web_view_navigation_observer.mm
+++ b/ios/web/navigation/crw_web_view_navigation_observer.mm
@@ -52,10 +52,19 @@
 // The NavigationManagerImpl associated with the web state.
 @property(nonatomic, readonly) NavigationManagerImpl* navigationManagerImpl;
 
+// Set to YES when [self close] is called.
+@property(nonatomic, assign) BOOL beingDestroyed;
+
 @end
 
 @implementation CRWWebViewNavigationObserver
 
+#pragma mark - Public
+
+- (void)close {
+  self.beingDestroyed = YES;
+}
+
 #pragma mark - Property
 
 - (void)setWebView:(WKWebView*)webView {
@@ -103,6 +112,7 @@
                       ofObject:(id)object
                         change:(NSDictionary*)change
                        context:(void*)context {
+  DCHECK(!self.beingDestroyed);
   NSString* dispatcherSelectorName = self.WKWebViewObservers[keyPath];
   DCHECK(dispatcherSelectorName);
   if (dispatcherSelectorName) {
diff --git a/ios/web/navigation/crw_wk_navigation_states.mm b/ios/web/navigation/crw_wk_navigation_states.mm
index 1bb1ec50..af3f0dc 100644
--- a/ios/web/navigation/crw_wk_navigation_states.mm
+++ b/ios/web/navigation/crw_wk_navigation_states.mm
@@ -4,8 +4,12 @@
 
 #import "ios/web/navigation/crw_wk_navigation_states.h"
 
+#include "base/feature_list.h"
 #include "base/logging.h"
+#include "base/metrics/histogram_macros.h"
+#include "ios/web/common/features.h"
 #import "ios/web/navigation/navigation_context_impl.h"
+#import "ios/web/public/web_client.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -145,6 +149,33 @@
   if (state == web::WKNavigationState::COMMITTED) {
     record.committed = YES;
   }
+
+  // Workaround for a WKWebView bug where WKNavigation's can leak, leaving a
+  // permanent pending URL, thus breaking the omnibox.  While it is possible
+  // for navigations to finish out-of-order, it's an edge case that should be
+  // handled gracefully, as last committed will appear in the omnibox instead
+  // of the pending URL.  See crbug.com/1010765 for details and a reproducible
+  // example.
+  if (state == web::WKNavigationState::FINISHED &&
+      web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
+      base::FeatureList::IsEnabled(
+          web::features::kClearOldNavigationRecordsWorkaround)) {
+    NSUInteger finishedIndex = record.index;
+    NSMutableSet* navigationsToRemove = [NSMutableSet set];
+    for (id navigation in _records) {
+      CRWWKNavigationsStateRecord* record = [_records objectForKey:navigation];
+      if (record.index < finishedIndex) {
+        [navigationsToRemove addObject:navigation];
+      }
+    }
+    for (id navigation in navigationsToRemove) {
+      [_records removeObjectForKey:navigation];
+    }
+
+    UMA_HISTOGRAM_BOOLEAN("IOS.CRWWKNavigationStatesRemoveOldPending",
+                          navigationsToRemove.count > 0);
+  }
+
   [_records setObject:record forKey:key];
 }
 
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 34d2ad9..861828d 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -603,6 +603,7 @@
   self.swipeRecognizerProvider = nil;
   [self.legacyNativeController close];
   [self.requestController close];
+  [self.webViewNavigationObserver close];
 
   // Mark the destruction sequence has started, in case someone else holds a
   // strong reference and tries to continue using the tab.
@@ -1792,6 +1793,7 @@
                       ofObject:(id)object
                         change:(NSDictionary*)change
                        context:(void*)context {
+  DCHECK(!self.beingDestroyed);
   NSString* dispatcherSelectorName = self.WKWebViewObservers[keyPath];
   DCHECK(dispatcherSelectorName);
   if (dispatcherSelectorName) {
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm
index 0f74c4f..7694748f 100644
--- a/ios/web/web_state/ui/crw_web_controller_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -77,6 +77,46 @@
 using base::test::ios::WaitUntilConditionOrTimeout;
 using base::test::ios::kWaitForPageLoadTimeout;
 
+// Subclass of WKWebView to check that the observers are removed when the web
+// state is destroyed.
+@interface CRWFakeWKWebViewObserverCount : WKWebView
+
+// Array storing the different key paths observed.
+@property(nonatomic, strong) NSMutableArray<NSString*>* keyPaths;
+// Whether there was observers when the WebView was stopped.
+@property(nonatomic, assign) BOOL hadObserversWhenStopping;
+
+@end
+
+@implementation CRWFakeWKWebViewObserverCount
+
+- (void)stopLoading {
+  [super stopLoading];
+  self.hadObserversWhenStopping =
+      self.hadObserversWhenStopping || self.keyPaths.count > 0;
+}
+
+- (void)removeObserver:(NSObject*)observer forKeyPath:(NSString*)keyPath {
+  [super removeObserver:observer forKeyPath:keyPath];
+  [self.keyPaths removeObject:keyPath];
+}
+
+- (void)addObserver:(NSObject*)observer
+         forKeyPath:(NSString*)keyPath
+            options:(NSKeyValueObservingOptions)options
+            context:(void*)context {
+  [super addObserver:observer
+          forKeyPath:keyPath
+             options:options
+             context:context];
+  if (!self.keyPaths) {
+    self.keyPaths = [[NSMutableArray alloc] init];
+  }
+  [self.keyPaths addObject:keyPath];
+}
+
+@end
+
 namespace web {
 namespace {
 
@@ -1348,6 +1388,42 @@
 
 INSTANTIATE_TEST_SUITES(CRWWebControllerWebProcessTest);
 
+// Fixture class to test WKWebView crashes.
+class CRWWebControllerWebViewTest
+    : public ProgrammaticWebTestWithWebController {
+ protected:
+  void SetUp() override {
+    ProgrammaticWebTestWithWebController::SetUp();
+    web::TestBrowserState browser_state;
+    web_view_ = [[CRWFakeWKWebViewObserverCount alloc] init];
+    TestWebViewContentView* webViewContentView = [[TestWebViewContentView alloc]
+        initWithMockWebView:web_view_
+                 scrollView:web_view_.scrollView];
+    [web_controller() injectWebViewContentView:webViewContentView];
+  }
+  CRWFakeWKWebViewObserverCount* web_view_;
+};
+
+// Tests that the KVO for the WebView are removed when the WebState is
+// destroyed. See crbug.com/1002786.
+TEST_P(CRWWebControllerWebViewTest, CheckNoKVOWhenWebStateDestroyed) {
+  // Load a first URL.
+  NSURL* URL = [NSURL URLWithString:@"about:blank"];
+  NSURLRequest* request = [NSURLRequest requestWithURL:URL];
+  [web_view_ loadRequest:request];
+  base::test::ios::WaitUntilCondition(^bool() {
+    return !web_view_.loading;
+  });
+
+  // Destroying the WebState should call stop at a point where all observers are
+  // supposed to be removed.
+  DestroyWebState();
+
+  EXPECT_FALSE(web_view_.hadObserversWhenStopping);
+}
+
+INSTANTIATE_TEST_SUITES(CRWWebControllerWebViewTest);
+
 #undef INSTANTIATE_TEST_SUITES
 
 }  // namespace web
diff --git a/ios/web_view/internal/translate/cwv_translation_controller.mm b/ios/web_view/internal/translate/cwv_translation_controller.mm
index 13bee0b..08ef08a1 100644
--- a/ios/web_view/internal/translate/cwv_translation_controller.mm
+++ b/ios/web_view/internal/translate/cwv_translation_controller.mm
@@ -10,6 +10,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/string16.h"
 #include "base/strings/sys_string_conversions.h"
+#include "base/time/time.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #import "ios/web_view/internal/cwv_web_view_configuration_internal.h"
 #import "ios/web_view/internal/translate/cwv_translation_language_internal.h"
@@ -74,6 +75,7 @@
 @implementation CWVTranslationController {
   ios_web_view::WebViewTranslateClient* _translateClient;
   std::unique_ptr<translate::TranslatePrefs> _translatePrefs;
+  base::Time _languagesLastUpdatedTime;
 }
 
 @synthesize delegate = _delegate;
@@ -245,7 +247,10 @@
 #pragma mark - Private Methods
 
 - (NSDictionary<NSString*, CWVTranslationLanguage*>*)supportedLanguagesByCode {
-  if (!_supportedLanguagesByCode) {
+  base::Time languagesLastUpdatedTime =
+      translate::TranslateDownloadManager::GetSupportedLanguagesLastUpdated();
+  if (!_supportedLanguagesByCode ||
+      _languagesLastUpdatedTime < languagesLastUpdatedTime) {
     NSMutableDictionary<NSString*, CWVTranslationLanguage*>*
         supportedLanguagesByCode = [NSMutableDictionary dictionary];
     std::vector<std::string> languageCodes;
@@ -265,7 +270,7 @@
 
       supportedLanguagesByCode[language.languageCode] = language;
     }
-
+    _languagesLastUpdatedTime = languagesLastUpdatedTime;
     _supportedLanguagesByCode = [supportedLanguagesByCode copy];
   }
   return _supportedLanguagesByCode;
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc
index 15c76d59..77b426e 100644
--- a/media/mojo/clients/mojo_video_decoder.cc
+++ b/media/mojo/clients/mojo_video_decoder.cc
@@ -352,15 +352,17 @@
   mojom::MediaLogAssociatedPtrInfo media_log_ptr_info;
   media_log_binding_.Bind(mojo::MakeRequest(&media_log_ptr_info));
 
-  // Create |video_frame_handle_releaser| interface request, and bind
+  // Create |video_frame_handle_releaser| interface receiver, and bind
   // |mojo_video_frame_handle_releaser_| to it.
-  mojom::VideoFrameHandleReleaserRequest video_frame_handle_releaser_request;
-  mojom::VideoFrameHandleReleaserPtrInfo video_frame_handle_releaser_ptr_info;
-  video_frame_handle_releaser_request =
-      mojo::MakeRequest(&video_frame_handle_releaser_ptr_info);
+  mojo::PendingRemote<mojom::VideoFrameHandleReleaser>
+      video_frame_handle_releaser_pending_remote;
+  mojo::PendingReceiver<mojom::VideoFrameHandleReleaser>
+      video_frame_handle_releaser_receiver =
+          video_frame_handle_releaser_pending_remote
+              .InitWithNewPipeAndPassReceiver();
   mojo_video_frame_handle_releaser_ =
       base::MakeRefCounted<MojoVideoFrameHandleReleaser>(
-          std::move(video_frame_handle_releaser_ptr_info), task_runner_);
+          std::move(video_frame_handle_releaser_pending_remote), task_runner_);
 
   mojo::ScopedDataPipeConsumerHandle remote_consumer_handle;
   mojo_decoder_buffer_writer_ = MojoDecoderBufferWriter::Create(
@@ -379,7 +381,7 @@
 
   remote_decoder_->Construct(
       std::move(client_ptr_info), std::move(media_log_ptr_info),
-      std::move(video_frame_handle_releaser_request),
+      std::move(video_frame_handle_releaser_receiver),
       std::move(remote_consumer_handle), std::move(command_buffer_id),
       video_decoder_implementation_, target_color_space_);
 }
diff --git a/media/mojo/mojom/video_decoder.mojom b/media/mojo/mojom/video_decoder.mojom
index 12b0e59..2fdaddd2 100644
--- a/media/mojo/mojom/video_decoder.mojom
+++ b/media/mojo/mojom/video_decoder.mojom
@@ -99,13 +99,14 @@
   //
   // TODO(sandersd): Rename to Initialize() if/when
   // media::VideoDecoder::Initialize() is renamed to Configure().
-  Construct(associated VideoDecoderClient client,
-            associated MediaLog media_log,
-            VideoFrameHandleReleaser& video_frame_handle_releaser,
-            handle<data_pipe_consumer> decoder_buffer_pipe,
-            CommandBufferId? command_buffer_id,
-            VideoDecoderImplementation implementation,
-            gfx.mojom.ColorSpace target_color_space);
+  Construct(
+      pending_associated_remote<VideoDecoderClient> client,
+      pending_associated_remote<MediaLog> media_log,
+      pending_receiver<VideoFrameHandleReleaser> video_frame_handle_releaser,
+      handle<data_pipe_consumer> decoder_buffer_pipe,
+      CommandBufferId? command_buffer_id,
+      VideoDecoderImplementation implementation,
+      gfx.mojom.ColorSpace target_color_space);
 
   // Configure (or reconfigure) the decoder. This must be called before decoding
   // any frames, and must not be called while there are pending Initialize(),
diff --git a/media/mojo/services/mojo_media_log.cc b/media/mojo/services/mojo_media_log.cc
index 732ffa6..1eefbe3 100644
--- a/media/mojo/services/mojo_media_log.cc
+++ b/media/mojo/services/mojo_media_log.cc
@@ -10,8 +10,9 @@
 
 namespace media {
 
-MojoMediaLog::MojoMediaLog(mojom::MediaLogAssociatedPtrInfo remote_media_log,
-                           scoped_refptr<base::SequencedTaskRunner> task_runner)
+MojoMediaLog::MojoMediaLog(
+    mojo::PendingAssociatedRemote<mojom::MediaLog> remote_media_log,
+    scoped_refptr<base::SequencedTaskRunner> task_runner)
     : remote_media_log_(std::move(remote_media_log)),
       task_runner_(std::move(task_runner)) {
   weak_this_ = weak_ptr_factory_.GetWeakPtr();
diff --git a/media/mojo/services/mojo_media_log.h b/media/mojo/services/mojo_media_log.h
index 15835c3..da879c0 100644
--- a/media/mojo/services/mojo_media_log.h
+++ b/media/mojo/services/mojo_media_log.h
@@ -13,6 +13,8 @@
 #include "base/sequenced_task_runner.h"
 #include "media/base/media_log.h"
 #include "media/mojo/mojom/media_log.mojom.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
 
 namespace media {
 
@@ -20,8 +22,9 @@
 class MojoMediaLog final : public MediaLog {
  public:
   // TODO(sandersd): Template on Ptr type to support non-associated.
-  explicit MojoMediaLog(mojom::MediaLogAssociatedPtrInfo remote_media_log,
-                        scoped_refptr<base::SequencedTaskRunner> task_runner);
+  explicit MojoMediaLog(
+      mojo::PendingAssociatedRemote<mojom::MediaLog> remote_media_log,
+      scoped_refptr<base::SequencedTaskRunner> task_runner);
   ~MojoMediaLog() final;
 
  protected:
@@ -30,7 +33,7 @@
   void AddEventLocked(std::unique_ptr<MediaLogEvent> event) override;
 
  private:
-  mojom::MediaLogAssociatedPtr remote_media_log_;
+  mojo::AssociatedRemote<mojom::MediaLog> remote_media_log_;
 
   // The mojo service thread on which we'll access |remote_media_log_|.
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
diff --git a/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc
index 6602500..ffa83a6 100644
--- a/media/mojo/services/mojo_video_decoder_service.cc
+++ b/media/mojo/services/mojo_video_decoder_service.cc
@@ -118,9 +118,10 @@
 }
 
 void MojoVideoDecoderService::Construct(
-    mojom::VideoDecoderClientAssociatedPtrInfo client,
-    mojom::MediaLogAssociatedPtrInfo media_log,
-    mojom::VideoFrameHandleReleaserRequest video_frame_handle_releaser,
+    mojo::PendingAssociatedRemote<mojom::VideoDecoderClient> client,
+    mojo::PendingAssociatedRemote<mojom::MediaLog> media_log,
+    mojo::PendingReceiver<mojom::VideoFrameHandleReleaser>
+        video_frame_handle_releaser_receiver,
     mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe,
     mojom::CommandBufferIdPtr command_buffer_id,
     VideoDecoderImplementation implementation,
@@ -141,9 +142,9 @@
   media_log_ =
       std::make_unique<MojoMediaLog>(std::move(media_log), task_runner);
 
-  video_frame_handle_releaser_ =
-      mojo::MakeStrongBinding(std::make_unique<VideoFrameHandleReleaserImpl>(),
-                              std::move(video_frame_handle_releaser));
+  video_frame_handle_releaser_ = mojo::MakeSelfOwnedReceiver(
+      std::make_unique<VideoFrameHandleReleaserImpl>(),
+      std::move(video_frame_handle_releaser_receiver));
 
   mojo_decoder_buffer_reader_.reset(
       new MojoDecoderBufferReader(std::move(decoder_buffer_pipe)));
diff --git a/media/mojo/services/mojo_video_decoder_service.h b/media/mojo/services/mojo_video_decoder_service.h
index 1c1f26c..95e1034 100644
--- a/media/mojo/services/mojo_video_decoder_service.h
+++ b/media/mojo/services/mojo_video_decoder_service.h
@@ -18,6 +18,9 @@
 #include "media/mojo/mojom/video_decoder.mojom.h"
 #include "media/mojo/services/media_mojo_export.h"
 #include "media/mojo/services/mojo_media_client.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
+#include "mojo/public/cpp/bindings/pending_associated_remote.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
 namespace media {
@@ -43,9 +46,10 @@
   // mojom::VideoDecoder implementation
   void GetSupportedConfigs(GetSupportedConfigsCallback callback) final;
   void Construct(
-      mojom::VideoDecoderClientAssociatedPtrInfo client,
-      mojom::MediaLogAssociatedPtrInfo media_log,
-      mojom::VideoFrameHandleReleaserRequest video_frame_handle_releaser,
+      mojo::PendingAssociatedRemote<mojom::VideoDecoderClient> client,
+      mojo::PendingAssociatedRemote<mojom::MediaLog> media_log,
+      mojo::PendingReceiver<mojom::VideoFrameHandleReleaser>
+          video_frame_handle_receiver,
       mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe,
       mojom::CommandBufferIdPtr command_buffer_id,
       VideoDecoderImplementation implementation,
@@ -93,14 +97,14 @@
   MojoCdmServiceContext* const mojo_cdm_service_context_ = nullptr;
 
   // Channel for sending async messages to the client.
-  mojom::VideoDecoderClientAssociatedPtr client_;
+  mojo::AssociatedRemote<mojom::VideoDecoderClient> client_;
 
   // Proxy object for providing media log services.
   std::unique_ptr<MojoMediaLog> media_log_;
 
   // Holds VideoFrame references on behalf of the client, until the client
   // releases them or is disconnected.
-  mojo::StrongBindingPtr<mojom::VideoFrameHandleReleaser>
+  mojo::SelfOwnedReceiverRef<mojom::VideoFrameHandleReleaser>
       video_frame_handle_releaser_;
 
   // Helper for reading DecoderBuffer data from the DataPipe.
diff --git a/mojo/public/js/BUILD.gn b/mojo/public/js/BUILD.gn
index 3f94385..b79ba2c 100644
--- a/mojo/public/js/BUILD.gn
+++ b/mojo/public/js/BUILD.gn
@@ -38,7 +38,7 @@
 
   # TODO(yzshen): Eventually we would like to use Closure Compiler to minify the
   # bindings instead of simply concatenating the files.
-  script = "//v8/tools/concatenate-files.py"
+  script = "//mojo/public/tools/bindings/concatenate-files.py"
 
   sources = bindings_js_files
   outputs = [
diff --git a/mojo/public/tools/bindings/concatenate-files.py b/mojo/public/tools/bindings/concatenate-files.py
new file mode 100755
index 0000000..48bc66f
--- /dev/null
+++ b/mojo/public/tools/bindings/concatenate-files.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# This utility concatenates several files into one. On Unix-like systems
+# it is equivalent to:
+#   cat file1 file2 file3 ...files... > target
+#
+# The reason for writing a separate utility is that 'cat' is not available
+# on all supported build platforms, but Python is, and hence this provides
+# us with an easy and uniform way of doing this on all platforms.
+
+# for py2/py3 compatibility
+from __future__ import print_function
+
+import optparse
+
+
+def Concatenate(filenames):
+  """Concatenate files.
+
+  Args:
+    files: Array of file names.
+           The last name is the target; all earlier ones are sources.
+
+  Returns:
+    True, if the operation was successful.
+  """
+  if len(filenames) < 2:
+    print("An error occurred generating %s:\nNothing to do." % filenames[-1])
+    return False
+
+  try:
+    with open(filenames[-1], "wb") as target:
+      for filename in filenames[:-1]:
+        with open(filename, "rb") as current:
+          target.write(current.read())
+    return True
+  except IOError as e:
+    print("An error occurred when writing %s:\n%s" % (filenames[-1], e))
+    return False
+
+
+def main():
+  parser = optparse.OptionParser()
+  parser.set_usage("""Concatenate several files into one.
+      Equivalent to: cat file1 ... > target.""")
+  (_options, args) = parser.parse_args()
+  exit(0 if Concatenate(args) else 1)
+
+
+if __name__ == "__main__":
+  main()
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 8c6bd3c9..66f481c 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -554,6 +554,8 @@
       "cert/cert_verify_proc_nss.h",
       "cert/cert_verify_proc_win.cc",
       "cert/cert_verify_proc_win.h",
+      "cert/coalescing_cert_verifier.cc",
+      "cert/coalescing_cert_verifier.h",
       "cert/ct_log_response_parser.cc",
       "cert/ct_log_response_parser.h",
       "cert/ct_log_verifier.cc",
@@ -5113,6 +5115,7 @@
     "cert/cert_verify_proc_ios_unittest.cc",
     "cert/cert_verify_proc_mac_unittest.cc",
     "cert/cert_verify_proc_unittest.cc",
+    "cert/coalescing_cert_verifier_unittest.cc",
     "cert/crl_set_unittest.cc",
     "cert/ct_log_response_parser_unittest.cc",
     "cert/ct_log_verifier_unittest.cc",
diff --git a/net/cert/cert_verifier.cc b/net/cert/cert_verifier.cc
index fbf17c71..ec0ee94d 100644
--- a/net/cert/cert_verifier.cc
+++ b/net/cert/cert_verifier.cc
@@ -18,6 +18,7 @@
 #include "base/logging.h"
 #else
 #include "net/cert/caching_cert_verifier.h"
+#include "net/cert/coalescing_cert_verifier.h"
 #include "net/cert/multi_threaded_cert_verifier.h"
 #endif
 
@@ -101,7 +102,8 @@
 #endif
 
   return std::make_unique<CachingCertVerifier>(
-      std::make_unique<MultiThreadedCertVerifier>(std::move(verify_proc)));
+      std::make_unique<CoalescingCertVerifier>(
+          std::make_unique<MultiThreadedCertVerifier>(std::move(verify_proc))));
 #endif
 }
 
diff --git a/net/cert/coalescing_cert_verifier.cc b/net/cert/coalescing_cert_verifier.cc
new file mode 100644
index 0000000..06099903
--- /dev/null
+++ b/net/cert/coalescing_cert_verifier.cc
@@ -0,0 +1,463 @@
+// 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 "net/cert/coalescing_cert_verifier.h"
+
+#include <algorithm>
+
+#include "base/bind.h"
+#include "base/containers/linked_list.h"
+#include "base/containers/unique_ptr_adapters.h"
+#include "base/memory/weak_ptr.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/time/time.h"
+#include "net/base/net_errors.h"
+#include "net/cert/cert_verify_result.h"
+#include "net/cert/x509_certificate_net_log_param.h"
+#include "net/log/net_log_event_type.h"
+#include "net/log/net_log_source.h"
+#include "net/log/net_log_source_type.h"
+#include "net/log/net_log_with_source.h"
+
+namespace net {
+
+// DESIGN OVERVIEW:
+//
+// The CoalescingCertVerifier implements an algorithm to group multiple calls
+// to Verify() into a single Job. This avoids overloading the underlying
+// CertVerifier, particularly those that are expensive to talk to (e.g.
+// talking to the system verifier or across processes), batching multiple
+// requests to CoaleacingCertVerifier::Verify() into a single underlying call.
+//
+// However, this makes lifetime management a bit more complex.
+//   - The Job object represents all of the state for a single verification to
+//     the CoalescingCertVerifier's underlying CertVerifier.
+//       * It keeps the CertVerifyResult alive, which is required as long as
+//         there is a pending verification.
+//       * It keeps the CertVerify::Request to the underlying verifier alive,
+//         as long as there is a pending Request attached to the Job.
+//       * It keeps track of every CoalescingCertVerifier::Request that is
+//         interested in receiving notification. However, it does NOT own
+//         these objects, and thus needs to coordinate with the Request (via
+//         AddRequest/AbortRequest) to make sure it never has a stale
+//         pointer.
+//         NB: It would have also been possible for the Job to only
+//         hold WeakPtr<Request>s, rather than Request*, but that seemed less
+//         clear as to the lifetime invariants, even if it was more clear
+//         about how the pointers are used.
+//  - The Job object is always owned by the CoalescingCertVerifier. If the
+//    CoalescingCertVerifier is deleted, all in-flight requests to the
+//    underlying verifier should be cancelled. When the Job goes away, all the
+//    Requests will be orphaned.
+//  - The Request object is always owned by the CALLER. It is a handle to
+//    allow a caller to cancel a request, per the CertVerifier interface. If
+//    the Request goes away, no caller callbacks should be invoked if the Job
+//    it was (previously) attached to completes.
+//  - Per the CertVerifier interface, when the CoalescingCertVerifier is
+//    deleted, then regardless of there being any live Requests, none of those
+//    caller callbacks should be invoked.
+//
+// Finally, to add to the complexity, it's possible that, during the handling
+// of a result from the underlying CertVerifier, a Job may begin dispatching
+// to its Requests. The Request may delete the CoalescingCertVerifier. If that
+// happens, then the Job being processed is also deleted, and none of the
+// other Requests should be notified.
+
+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);
+}
+
+}  // namespace
+
+// Job contains all the state for a single verification using the underlying
+// verifier.
+class CoalescingCertVerifier::Job {
+ public:
+  Job(CoalescingCertVerifier* parent,
+      const CertVerifier::RequestParams& params,
+      NetLog* net_log,
+      bool is_first_job);
+  ~Job();
+
+  const CertVerifier::RequestParams& params() const { return params_; }
+  const CertVerifyResult& verify_result() const { return verify_result_; }
+
+  // Attaches |request|, causing it to be notified once this Job completes.
+  void AddRequest(CoalescingCertVerifier::Request* request);
+
+  // Stops |request| from being notified. If there are no Requests remaining,
+  // the Job will be cancelled.
+  // NOTE: It's only necessary to call this if the Job has not yet completed.
+  // If the Request has been notified of completion, this should not be called.
+  void AbortRequest(CoalescingCertVerifier::Request* request);
+
+  // Starts a verification using |underlying_verifier|. If this completes
+  // synchronously, returns the result code, with the associated result being
+  // available via |verify_result()|. Otherwise, it will complete
+  // asynchronously, notifying any Requests associated via |AttachRequest|.
+  int Start(CertVerifier* underlying_verifier);
+
+ private:
+  void OnVerifyComplete(int result);
+
+  void LogMetrics();
+
+  CoalescingCertVerifier* parent_verifier_;
+  const CertVerifier::RequestParams params_;
+  const NetLogWithSource net_log_;
+  bool is_first_job_ = false;
+  CertVerifyResult verify_result_;
+
+  base::TimeTicks start_time_;
+  std::unique_ptr<CertVerifier::Request> pending_request_;
+
+  base::LinkedList<CoalescingCertVerifier::Request> attached_requests_;
+  base::WeakPtrFactory<Job> weak_ptr_factory_{this};
+};
+
+// Tracks the state associated with a single CoalescingCertVerifier::Verify
+// request.
+//
+// There are two ways for requests to be cancelled:
+//   - The caller of Verify() can delete the Request object, indicating
+//     they are no longer interested in this particular request.
+//   - The caller can delete the CoalescingCertVerifier, which should cause
+//     all in-process Jobs to be aborted and deleted. Any Requests attached to
+//     Jobs should be orphaned, and do nothing when the Request is (eventually)
+//     deleted.
+class CoalescingCertVerifier::Request
+    : public base::LinkNode<CoalescingCertVerifier::Request>,
+      public CertVerifier::Request {
+ public:
+  // Create a request that will be attached to |job|, and will notify
+  // |callback| and fill |verify_result| if the Job completes successfully.
+  // If the Request is deleted, or the Job is deleted, |callback| will not
+  // be notified.
+  Request(CoalescingCertVerifier::Job* job,
+          CertVerifyResult* verify_result,
+          CompletionOnceCallback callback,
+          const NetLogWithSource& net_log);
+
+  ~Request() override;
+
+  const NetLogWithSource& net_log() const { return net_log_; }
+
+  // Called by Job to complete the requests (either successfully or as a sign
+  // that the underlying Job is going away).
+  void Complete(int result);
+
+  // Called when |job_| is being deleted, to ensure that the Request does not
+  // attempt to access the Job further. No callbacks will be invoked,
+  // consistent with the CoalescingCertVerifier's contract.
+  void OnJobAbort();
+
+ private:
+  CoalescingCertVerifier::Job* job_;
+
+  CertVerifyResult* verify_result_;
+  CompletionOnceCallback callback_;
+  const NetLogWithSource net_log_;
+};
+
+CoalescingCertVerifier::Job::Job(CoalescingCertVerifier* parent,
+                                 const CertVerifier::RequestParams& params,
+                                 NetLog* net_log,
+                                 bool is_first_job)
+    : parent_verifier_(parent),
+      params_(params),
+      net_log_(
+          NetLogWithSource::Make(net_log, NetLogSourceType::CERT_VERIFIER_JOB)),
+      is_first_job_(is_first_job) {}
+
+CoalescingCertVerifier::Job::~Job() {
+  // If there was at least one outstanding Request still pending, then this
+  // Job was aborted, rather than being completed normally and cleaned up.
+  if (!attached_requests_.empty() && pending_request_) {
+    net_log_.AddEvent(NetLogEventType::CANCELLED);
+    net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB);
+  }
+
+  while (!attached_requests_.empty()) {
+    auto* link_node = attached_requests_.head();
+    link_node->RemoveFromList();
+    link_node->value()->OnJobAbort();
+  }
+}
+
+void CoalescingCertVerifier::Job::AddRequest(
+    CoalescingCertVerifier::Request* request) {
+  // There must be a pending asynchronous verification in process.
+  DCHECK(pending_request_);
+
+  request->net_log().AddEventReferencingSource(
+      NetLogEventType::CERT_VERIFIER_REQUEST_BOUND_TO_JOB, net_log_.source());
+  attached_requests_.Append(request);
+}
+
+void CoalescingCertVerifier::Job::AbortRequest(
+    CoalescingCertVerifier::Request* request) {
+  // Check to make sure |request| hasn't already been removed.
+  DCHECK(request->previous() || request->next());
+
+  request->RemoveFromList();
+
+  // If there are no more pending requests, abort. This isn't strictly
+  // necessary; the request could be allowed to run to completion (and
+  // potentially to allow later Requests to join in), but in keeping with the
+  // idea of providing more stable guarantees about resources, clean up early.
+  if (attached_requests_.empty()) {
+    // If this was the last Request, then the Job had not yet completed; this
+    // matches the logic in the dtor, which handles when it's the Job that is
+    // deleted first, rather than the last Request.
+    net_log_.AddEvent(NetLogEventType::CANCELLED);
+    net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB);
+
+    // DANGER: This will cause |this_| to be deleted!
+    parent_verifier_->RemoveJob(this);
+    return;
+  }
+}
+
+int CoalescingCertVerifier::Job::Start(CertVerifier* underlying_verifier) {
+  // Requests are only attached for asynchronous completion, so they must
+  // always be attached after Start() has been called.
+  DCHECK(attached_requests_.empty());
+  // There should not be a pending request already started (e.g. Start called
+  // multiple times).
+  DCHECK(!pending_request_);
+
+  net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_JOB, [&] {
+    return NetLogX509CertificateParams(params_.certificate().get());
+  });
+
+  verify_result_.Reset();
+
+  start_time_ = base::TimeTicks::Now();
+  int result = underlying_verifier->Verify(
+      params_, &verify_result_,
+      // Safe, because |verify_request_| is self-owned and guarantees the
+      // callback won't be called if |this| is deleted.
+      base::Bind(&CoalescingCertVerifier::Job::OnVerifyComplete,
+                 base::Unretained(this)),
+      &pending_request_, net_log_);
+  if (result != ERR_IO_PENDING) {
+    LogMetrics();
+    net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB,
+                      [&] { return CertVerifyResultParams(verify_result_); });
+  }
+
+  return result;
+}
+
+void CoalescingCertVerifier::Job::OnVerifyComplete(int result) {
+  LogMetrics();
+
+  pending_request_.reset();  // Reset to signal clean completion.
+  net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB,
+                    [&] { return CertVerifyResultParams(verify_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
+  // that happens, it's important to ensure that processing of the Job is
+  // stopped - i.e. no other callbacks are invoked for other Requests, nor is
+  // |this| accessed.
+  //
+  // To help detect and protect against this, a WeakPtr to |this| is taken. If
+  // |this| is deleted, the destructor will have invalidated the WeakPtr.
+  //
+  // Note that if a Job had already been deleted, this method would not have
+  // been invoked in the first place, as the Job (via |pending_request_|) owns
+  // the underlying CertVerifier::Request that this method was bound to as a
+  // callback. This is why it's OK to grab the WeakPtr from |this| initially.
+  base::WeakPtr<Job> weak_this = weak_ptr_factory_.GetWeakPtr();
+  while (!attached_requests_.empty()) {
+    // Note: It's also possible for additional Requests to be attached to the
+    // current Job while processing a Request.
+    auto* link_node = attached_requests_.head();
+    link_node->RemoveFromList();
+
+    // Note: |this| MAY be deleted here.
+    //   - If the CoalescingCertVerifier is deleted, it will delete the
+    //     Jobs (including |this|)
+    //   - If this is the second-to-last Request, and the completion of this
+    //     event causes the other Request to be deleted, detaching that Request
+    //     from this Job will lead to this Job being deleted (via
+    //     Job::AbortRequest())
+    link_node->value()->Complete(result);
+
+    // Check if |this| has been deleted (which implicitly includes
+    // |parent_verifier_|), and abort if so, since no further cleanup is
+    // needed.
+    if (!weak_this)
+      return;
+  }
+
+  // DANGER: |this| will be invalidated (deleted) after this point.
+  return parent_verifier_->RemoveJob(this);
+}
+
+void CoalescingCertVerifier::Job::LogMetrics() {
+  base::TimeDelta latency = base::TimeTicks::Now() - start_time_;
+  UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency", latency,
+                             base::TimeDelta::FromMilliseconds(1),
+                             base::TimeDelta::FromMinutes(10), 100);
+  if (is_first_job_) {
+    UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_First_Job_Latency", latency,
+                               base::TimeDelta::FromMilliseconds(1),
+                               base::TimeDelta::FromMinutes(10), 100);
+  }
+}
+
+CoalescingCertVerifier::Request::Request(CoalescingCertVerifier::Job* job,
+                                         CertVerifyResult* verify_result,
+                                         CompletionOnceCallback callback,
+                                         const NetLogWithSource& net_log)
+    : job_(job),
+      verify_result_(verify_result),
+      callback_(std::move(callback)),
+      net_log_(net_log) {
+  net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_REQUEST);
+}
+
+CoalescingCertVerifier::Request::~Request() {
+  if (job_) {
+    net_log_.AddEvent(NetLogEventType::CANCELLED);
+    net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST);
+
+    // If the Request is deleted before the Job, then detach from the Job.
+    // Note: This may cause |job_| to be deleted.
+    job_->AbortRequest(this);
+    job_ = nullptr;
+  }
+}
+
+void CoalescingCertVerifier::Request::Complete(int result) {
+  *verify_result_ = job_->verify_result();
+
+  // On successful completion, the Job removes the Request from its set;
+  // similarly, break the association here so that when the Request is
+  // deleted, it does not try to abort the (now-completed) Job.
+  job_ = nullptr;
+
+  net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST);
+
+  // Run |callback_|, which may delete |this|.
+  std::move(callback_).Run(result);
+}
+
+void CoalescingCertVerifier::Request::OnJobAbort() {
+  // If the Job is deleted before the Request, just clean up. The Request will
+  // eventually be deleted by the caller.
+  net_log_.AddEvent(NetLogEventType::CANCELLED);
+  net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST);
+
+  job_ = nullptr;
+}
+
+CoalescingCertVerifier::CoalescingCertVerifier(
+    std::unique_ptr<CertVerifier> verifier)
+    : verifier_(std::move(verifier)),
+      config_id_(0),
+      requests_(0),
+      inflight_joins_(0) {}
+
+CoalescingCertVerifier::~CoalescingCertVerifier() = default;
+
+int CoalescingCertVerifier::Verify(
+    const RequestParams& params,
+    CertVerifyResult* verify_result,
+    CompletionOnceCallback callback,
+    std::unique_ptr<CertVerifier::Request>* out_req,
+    const NetLogWithSource& net_log) {
+  DCHECK(verify_result);
+  DCHECK(!callback.is_null());
+
+  out_req->reset();
+  ++requests_;
+
+  Job* job = FindJob(params);
+  if (job) {
+    // An identical request is in-flight and joinable, so just attach the
+    // callback.
+    ++inflight_joins_;
+  } else {
+    // No existing Jobs can be used. Create and start a new one.
+    std::unique_ptr<Job> new_job =
+        std::make_unique<Job>(this, params, net_log.net_log(), requests_ == 1);
+    int result = new_job->Start(verifier_.get());
+    if (result != ERR_IO_PENDING) {
+      *verify_result = new_job->verify_result();
+      return result;
+    }
+
+    job = new_job.get();
+    joinable_jobs_[params] = std::move(new_job);
+  }
+
+  std::unique_ptr<CoalescingCertVerifier::Request> request =
+      std::make_unique<CoalescingCertVerifier::Request>(
+          job, verify_result, std::move(callback), net_log);
+  job->AddRequest(request.get());
+  *out_req = std::move(request);
+  return ERR_IO_PENDING;
+}
+
+void CoalescingCertVerifier::SetConfig(const CertVerifier::Config& config) {
+  ++config_id_;
+  verifier_->SetConfig(config);
+
+  for (auto& job : joinable_jobs_) {
+    inflight_jobs_.emplace_back(std::move(job.second));
+  }
+  joinable_jobs_.clear();
+}
+
+CoalescingCertVerifier::Job* CoalescingCertVerifier::FindJob(
+    const RequestParams& params) {
+  auto it = joinable_jobs_.find(params);
+  if (it != joinable_jobs_.end())
+    return it->second.get();
+  return nullptr;
+}
+
+void CoalescingCertVerifier::RemoveJob(Job* job) {
+  // See if this was a job from the current configuration generation.
+  // Note: It's also necessary to compare that the underlying pointer is the
+  // same, and not merely a Job with the same parameters.
+  auto joinable_it = joinable_jobs_.find(job->params());
+  if (joinable_it != joinable_jobs_.end() && joinable_it->second.get() == job) {
+    joinable_jobs_.erase(joinable_it);
+    return;
+  }
+
+  // Otherwise, it MUST have been a job from a previous generation.
+  auto inflight_it = std::find_if(inflight_jobs_.begin(), inflight_jobs_.end(),
+                                  base::MatchesUniquePtr(job));
+  DCHECK(inflight_it != inflight_jobs_.end());
+  inflight_jobs_.erase(inflight_it);
+  return;
+}
+
+}  // namespace net
diff --git a/net/cert/coalescing_cert_verifier.h b/net/cert/coalescing_cert_verifier.h
new file mode 100644
index 0000000..60b4682
--- /dev/null
+++ b/net/cert/coalescing_cert_verifier.h
@@ -0,0 +1,80 @@
+// 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 NET_CERT_COALESCING_CERT_VERIFIER_H_
+#define NET_CERT_COALESCING_CERT_VERIFIER_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "base/macros.h"
+#include "net/base/net_export.h"
+#include "net/cert/cert_verifier.h"
+
+namespace net {
+
+// CoalescingCertVerifier is a CertVerifier that keeps track of in-flight
+// CertVerifier Verify() requests. If a new call to Verify() is started that
+// matches the same parameters as an in-progress verification, the new
+// Verify() call will be joined to the existing, in-progress verification,
+// completing when it does. If no in-flight requests match, a new request to
+// the underlying verifier will be started.
+//
+// If the underlying configuration changes, existing requests are allowed to
+// complete, but any new requests will not be seen as matching, even if they
+// share the same parameters. This ensures configuration changes propagate
+// "immediately" for all new requests.
+class NET_EXPORT CoalescingCertVerifier : public CertVerifier {
+ public:
+  // Create a new verifier that will forward calls to |verifier|, coalescing
+  // any in-flight, not-yet-completed calls to Verify().
+  explicit CoalescingCertVerifier(std::unique_ptr<CertVerifier> verifier);
+
+  ~CoalescingCertVerifier() override;
+
+  // CertVerifier implementation:
+  int Verify(const RequestParams& params,
+             CertVerifyResult* verify_result,
+             CompletionOnceCallback callback,
+             std::unique_ptr<CertVerifier::Request>* out_req,
+             const NetLogWithSource& net_log) override;
+  void SetConfig(const CertVerifier::Config& config) override;
+
+  uint64_t requests_for_testing() const { return requests_; }
+  uint64_t inflight_joins_for_testing() const { return inflight_joins_; }
+
+ private:
+  class Job;
+  class Request;
+
+  // If there is a pending request that matches |params|, and which can be
+  // joined (it shares the same config), returns that Job.
+  // Otherwise, returns nullptr, meaning a new Job should be started.
+  Job* FindJob(const RequestParams& params);
+  void RemoveJob(Job* job);
+
+  // Contains the set of Jobs for which an active verification is taking
+  // place and which can be used for new requests (e.g. the config is the
+  // same).
+  std::map<CertVerifier::RequestParams, std::unique_ptr<Job>> joinable_jobs_;
+
+  // Contains all pending Jobs that are in-flight, but cannot be joined, due
+  // to the configuration having changed since they were started.
+  std::vector<std::unique_ptr<Job>> inflight_jobs_;
+
+  std::unique_ptr<CertVerifier> verifier_;
+
+  uint32_t config_id_;
+  uint64_t requests_;
+  uint64_t inflight_joins_;
+
+  DISALLOW_COPY_AND_ASSIGN(CoalescingCertVerifier);
+};
+
+}  // namespace net
+
+#endif  // NET_CERT_COALESCING_CERT_VERIFIER_H_
diff --git a/net/cert/coalescing_cert_verifier_unittest.cc b/net/cert/coalescing_cert_verifier_unittest.cc
new file mode 100644
index 0000000..c90f989
--- /dev/null
+++ b/net/cert/coalescing_cert_verifier_unittest.cc
@@ -0,0 +1,518 @@
+// 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 "net/cert/coalescing_cert_verifier.h"
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "net/base/net_errors.h"
+#include "net/base/test_completion_callback.h"
+#include "net/cert/mock_cert_verifier.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"
+#include "net/test/test_with_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using net::test::IsError;
+using net::test::IsOk;
+
+namespace net {
+
+using CoalescingCertVerifierTest = TestWithTaskEnvironment;
+
+// Tests that synchronous completion does not cause any issues.
+TEST_F(CoalescingCertVerifierTest, SyncCompletion) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(false);  // Force sync completion.
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  CoalescingCertVerifier verifier(std::move(mock_verifier_owner));
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1, result2;
+  TestCompletionCallback callback1, callback2;
+  std::unique_ptr<CertVerifier::Request> request1, request2;
+
+  // Start an (asynchronous) initial request.
+  int error = verifier.Verify(request_params, &result1, callback1.callback(),
+                              &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsOk());
+  ASSERT_FALSE(request1);
+  ASSERT_TRUE(result1.verified_cert);
+}
+
+// Test that requests with identical parameters only result in a single
+// underlying verification; that is, the second Request is joined to the
+// in-progress first Request.
+TEST_F(CoalescingCertVerifierTest, InflightJoin) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  base::HistogramTester histograms;
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(true);  // Always complete via PostTask
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  CoalescingCertVerifier verifier(std::move(mock_verifier_owner));
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1, result2;
+  TestCompletionCallback callback1, callback2;
+  std::unique_ptr<CertVerifier::Request> request1, request2;
+
+  // Start an (asynchronous) initial request.
+  int error = verifier.Verify(request_params, &result1, callback1.callback(),
+                              &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request1);
+
+  // Simulate the underlying verifier returning different results if another
+  // verification is done.
+  mock_verifier->ClearRules();
+  mock_verifier->AddResultForCert(test_cert, fake_result, ERR_CERT_REVOKED);
+
+  // Start a second request; this should join the first request.
+  error = verifier.Verify(request_params, &result2, callback2.callback(),
+                          &request2, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request2);
+
+  // Ensure only one request was ever started.
+  EXPECT_EQ(2u, verifier.requests_for_testing());
+  EXPECT_EQ(1u, verifier.inflight_joins_for_testing());
+
+  // Make sure both results completed.
+  EXPECT_THAT(callback1.WaitForResult(), IsOk());
+  EXPECT_THAT(callback2.WaitForResult(), IsOk());
+
+  // There should only have been one Job started.
+  histograms.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  histograms.ExpectTotalCount("Net.CertVerifier_First_Job_Latency", 1);
+}
+
+// Test that changing configurations between Requests prevents the second
+// Request from being attached to the first Request. There should be two
+// Requests to the underlying CertVerifier, and the correct results should be
+// received by each.
+TEST_F(CoalescingCertVerifierTest, DoesNotJoinAfterConfigChange) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  base::HistogramTester histograms;
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(true);  // Always complete via PostTask
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  CoalescingCertVerifier verifier(std::move(mock_verifier_owner));
+
+  CertVerifier::Config config1;
+  verifier.SetConfig(config1);
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1, result2;
+  TestCompletionCallback callback1, callback2;
+  std::unique_ptr<CertVerifier::Request> request1, request2;
+
+  // Start an (asynchronous) initial request.
+  int error = verifier.Verify(request_params, &result1, callback1.callback(),
+                              &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request1);
+
+  // Change the configuration, and change the result to to simulate the
+  // configuration change affecting behavior.
+  CertVerifier::Config config2;
+  config2.enable_rev_checking = !config1.enable_rev_checking;
+  verifier.SetConfig(config2);
+  mock_verifier->ClearRules();
+  mock_verifier->AddResultForCert(test_cert, fake_result, ERR_CERT_REVOKED);
+
+  // Start a second request; this should not join the first request, as the
+  // config is different.
+  error = verifier.Verify(request_params, &result2, callback2.callback(),
+                          &request2, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request2);
+
+  // Ensure a total of two requests were started, and neither were joined.
+  EXPECT_EQ(2u, verifier.requests_for_testing());
+  EXPECT_EQ(0u, verifier.inflight_joins_for_testing());
+
+  // Make sure both results completed.
+  EXPECT_THAT(callback1.WaitForResult(), IsOk());
+  EXPECT_THAT(callback2.WaitForResult(), IsError(ERR_CERT_REVOKED));
+
+  // There should have been two separate Jobs.
+  histograms.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2);
+  histograms.ExpectTotalCount("Net.CertVerifier_First_Job_Latency", 1);
+}
+
+// Test that when two Requests are attached to the same Job, it's safe to
+// delete the second Request while processing the response to the first. The
+// second Request should not cause the second callback to be called.
+TEST_F(CoalescingCertVerifierTest, DeleteSecondRequestDuringFirstCompletion) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(true);  // Always complete via PostTask
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  CoalescingCertVerifier verifier(std::move(mock_verifier_owner));
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1, result2;
+  TestCompletionCallback callback1, callback2;
+  std::unique_ptr<CertVerifier::Request> request1, request2;
+
+  // Start an (asynchronous) initial request. When this request is completed,
+  // it will delete (reset) |request2|, which should prevent it from being
+  // called.
+  int error = verifier.Verify(
+      request_params, &result1,
+      base::BindLambdaForTesting([&callback1, &request2](int result) {
+        request2.reset();
+        callback1.callback().Run(result);
+      }),
+      &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request1);
+
+  // Start a second request; this should join the first request.
+  error = verifier.Verify(request_params, &result2, callback2.callback(),
+                          &request2, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request2);
+
+  // Ensure only one underlying verification was started.
+  ASSERT_EQ(2u, verifier.requests_for_testing());
+  ASSERT_EQ(1u, verifier.inflight_joins_for_testing());
+
+  // Make sure that only the first callback is invoked; because the second
+  // CertVerifier::Request was deleted during processing the first's callback,
+  // the second callback should not be invoked.
+  EXPECT_THAT(callback1.WaitForResult(), IsOk());
+  ASSERT_FALSE(callback2.have_result());
+  ASSERT_FALSE(request2);
+
+  // While CoalescingCertVerifier doesn't use PostTask, make sure to flush the
+  // tasks as well, in case the implementation changes in the future.
+  RunUntilIdle();
+  ASSERT_FALSE(callback2.have_result());
+  ASSERT_FALSE(request2);
+}
+
+// Test that it's safe to delete the CoalescingCertVerifier during completion,
+// even when there are outstanding Requests to be processed. The additional
+// Requests should not invoke the user callback once the
+// CoalescingCertVerifier is deleted.
+TEST_F(CoalescingCertVerifierTest, DeleteVerifierDuringCompletion) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(true);  // Always complete via PostTask
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  auto verifier =
+      std::make_unique<CoalescingCertVerifier>(std::move(mock_verifier_owner));
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1, result2;
+  TestCompletionCallback callback1, callback2;
+  std::unique_ptr<CertVerifier::Request> request1, request2;
+
+  // Start an (asynchronous) initial request. When this request is completed,
+  // it will delete (reset) |request2|, which should prevent it from being
+  // called.
+  int error = verifier->Verify(
+      request_params, &result1,
+      base::BindLambdaForTesting([&callback1, &verifier](int result) {
+        verifier.reset();
+        callback1.callback().Run(result);
+      }),
+      &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request1);
+
+  // Start a second request; this should join the first request.
+  error = verifier->Verify(request_params, &result2, callback2.callback(),
+                           &request2, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request2);
+
+  // Ensure only one underlying verification was started.
+  ASSERT_EQ(2u, verifier->requests_for_testing());
+  ASSERT_EQ(1u, verifier->inflight_joins_for_testing());
+
+  // Make sure that only the first callback is invoked. This will delete the
+  // underlying CoalescingCertVerifier, which should prevent the second
+  // request's callback from being invoked.
+  EXPECT_THAT(callback1.WaitForResult(), IsOk());
+  ASSERT_FALSE(callback2.have_result());
+  ASSERT_TRUE(request2);
+
+  // While CoalescingCertVerifier doesn't use PostTask, make sure to flush the
+  // tasks as well, in case the implementation changes in the future.
+  RunUntilIdle();
+  ASSERT_FALSE(callback2.have_result());
+  ASSERT_TRUE(request2);
+}
+
+// Test that it's safe to delete a Request before the underlying verifier has
+// completed. This is a guard against memory safety (e.g. when this Request
+// is the last/only Request remaining).
+TEST_F(CoalescingCertVerifierTest, DeleteRequestBeforeCompletion) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(true);  // Always complete via PostTask
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  CoalescingCertVerifier verifier(std::move(mock_verifier_owner));
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1;
+  TestCompletionCallback callback1;
+  std::unique_ptr<CertVerifier::Request> request1;
+
+  // Start an (asynchronous) initial request.
+  int error = verifier.Verify(request_params, &result1, callback1.callback(),
+                              &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request1);
+
+  // Abandon the request before it's completed.
+  request1.reset();
+  EXPECT_FALSE(callback1.have_result());
+
+  // Make sure the request never completes / the callback is never invoked.
+  RunUntilIdle();
+  EXPECT_FALSE(callback1.have_result());
+}
+
+// Test that it's safe to delete a Request before the underlying verifier has
+// completed. This is a correctness test, to ensure that other Requests are
+// still notified.
+TEST_F(CoalescingCertVerifierTest,
+       DeleteFirstRequestBeforeCompletionStillCompletesSecondRequest) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(true);  // Always complete via PostTask
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  CoalescingCertVerifier verifier(std::move(mock_verifier_owner));
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1, result2;
+  TestCompletionCallback callback1, callback2;
+  std::unique_ptr<CertVerifier::Request> request1, request2;
+
+  // Start an (asynchronous) initial request.
+  int error = verifier.Verify(request_params, &result1, callback1.callback(),
+                              &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request1);
+
+  // Start a second request; this should join the first request.
+  error = verifier.Verify(request_params, &result2, callback2.callback(),
+                          &request2, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request2);
+
+  // Ensure only one underlying verification was started.
+  ASSERT_EQ(2u, verifier.requests_for_testing());
+  ASSERT_EQ(1u, verifier.inflight_joins_for_testing());
+
+  // Abandon the first request before it's completed.
+  request1.reset();
+
+  // Make sure the first request never completes / the callback is never
+  // invoked, while the second request completes normally.
+  EXPECT_THAT(callback2.WaitForResult(), IsOk());
+  EXPECT_FALSE(callback1.have_result());
+
+  // Simulate the second request going away during processing.
+  request2.reset();
+
+  // Flush any events, although there should not be any.
+  RunUntilIdle();
+  EXPECT_FALSE(callback1.have_result());
+}
+
+TEST_F(CoalescingCertVerifierTest, DeleteRequestDuringCompletion) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(true);  // Always complete via PostTask
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  CoalescingCertVerifier verifier(std::move(mock_verifier_owner));
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1;
+  TestCompletionCallback callback1;
+  std::unique_ptr<CertVerifier::Request> request1;
+
+  // Start an (asynchronous) initial request.
+  int error = verifier.Verify(
+      request_params, &result1,
+      base::BindLambdaForTesting([&callback1, &request1](int result) {
+        // Delete the Request during the completion callback. This should be
+        // perfectly safe, and not cause any memory trouble, because the
+        // Request was already detached from the Job prior to being invoked.
+        request1.reset();
+        callback1.callback().Run(result);
+      }),
+      &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request1);
+
+  // The result should be available, even though the request is deleted
+  // during the result processing. This should not cause any memory errors.
+  EXPECT_THAT(callback1.WaitForResult(), IsOk());
+}
+
+TEST_F(CoalescingCertVerifierTest, DeleteVerifierBeforeRequest) {
+  scoped_refptr<X509Certificate> test_cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
+  ASSERT_TRUE(test_cert);
+
+  base::HistogramTester histograms;
+
+  CertVerifyResult fake_result;
+  fake_result.verified_cert = test_cert;
+
+  std::unique_ptr<MockCertVerifier> mock_verifier_owner =
+      std::make_unique<MockCertVerifier>();
+  MockCertVerifier* mock_verifier = mock_verifier_owner.get();
+  mock_verifier->set_async(true);  // Always complete via PostTask
+  mock_verifier->AddResultForCert(test_cert, fake_result, OK);
+
+  auto verifier =
+      std::make_unique<CoalescingCertVerifier>(std::move(mock_verifier_owner));
+
+  CertVerifier::RequestParams request_params(test_cert, "www.example.com", 0,
+                                             /*ocsp_response=*/std::string(),
+                                             /*sct_list=*/std::string());
+
+  CertVerifyResult result1;
+  TestCompletionCallback callback1;
+  std::unique_ptr<CertVerifier::Request> request1;
+
+  // Start an (asynchronous) initial request.
+  int error = verifier->Verify(request_params, &result1, callback1.callback(),
+                               &request1, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request1);
+
+  // Delete the CoalescingCertVerifier first. This should orphan all
+  // outstanding Requests and delete all associated Jobs.
+  verifier.reset();
+
+  // Flush any pending tasks; there should not be any, at this point, but use
+  // it in case the implementation changes.
+  RunUntilIdle();
+
+  // Make sure the callback was never called.
+  EXPECT_FALSE(callback1.have_result());
+
+  // Delete the Request. This should be a no-op as the Request was orphaned
+  // when the CoalescingCertVerifier was deleted.
+  request1.reset();
+
+  // There should not have been any histograms logged.
+  histograms.ExpectTotalCount("Net.CertVerifier_Job_Latency", 0);
+  histograms.ExpectTotalCount("Net.CertVerifier_First_Job_Latency", 0);
+}
+
+}  // namespace net
diff --git a/net/cert/mock_cert_verifier.cc b/net/cert/mock_cert_verifier.cc
index e65dadb..1660818 100644
--- a/net/cert/mock_cert_verifier.cc
+++ b/net/cert/mock_cert_verifier.cc
@@ -99,6 +99,10 @@
   rules_.push_back(Rule(std::move(cert), host_pattern, verify_result, rv));
 }
 
+void MockCertVerifier::ClearRules() {
+  rules_.clear();
+}
+
 int MockCertVerifier::VerifyImpl(const RequestParams& params,
                                  CertVerifyResult* verify_result) {
   for (const Rule& rule : rules_) {
diff --git a/net/cert/mock_cert_verifier.h b/net/cert/mock_cert_verifier.h
index 6c34a06..66b82c7 100644
--- a/net/cert/mock_cert_verifier.h
+++ b/net/cert/mock_cert_verifier.h
@@ -58,6 +58,9 @@
                                const CertVerifyResult& verify_result,
                                int rv);
 
+  // Clear all existing rules.
+  void ClearRules();
+
  private:
   struct Rule;
   using RuleList = std::list<Rule>;
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc
index 32222db..7c76599 100644
--- a/net/cert/multi_threaded_cert_verifier.cc
+++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -4,34 +4,18 @@
 
 #include "net/cert/multi_threaded_cert_verifier.h"
 
-#include <algorithm>
-#include <iterator>
-#include <utility>
-
 #include "base/bind.h"
 #include "base/bind_helpers.h"
-#include "base/compiler_specific.h"
-#include "base/containers/linked_list.h"
-#include "base/memory/ptr_util.h"
-#include "base/metrics/histogram_macros.h"
+#include "base/memory/weak_ptr.h"
 #include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
-#include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "base/values.h"
-#include "net/base/hash_value.h"
 #include "net/base/net_errors.h"
 #include "net/base/trace_constants.h"
 #include "net/cert/cert_verify_proc.h"
 #include "net/cert/cert_verify_result.h"
 #include "net/cert/crl_set.h"
 #include "net/cert/x509_certificate.h"
-#include "net/cert/x509_certificate_net_log_param.h"
-#include "net/log/net_log_capture_mode.h"
-#include "net/log/net_log_event_type.h"
-#include "net/log/net_log_source.h"
-#include "net/log/net_log_source_type.h"
-#include "net/log/net_log_with_source.h"
 
 namespace net {
 
@@ -43,67 +27,8 @@
 class MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives
     : public base::ScopedAllowBaseSyncPrimitives {};
 
-////////////////////////////////////////////////////////////////////////////
-//
-// MultiThreadedCertVerifier is a thread-unsafe object which lives, dies, and is
-// operated on a single thread, henceforth referred to as the "origin" thread.
-//
-// When an incoming Verify() request is received, MultiThreadedCertVerifier
-// checks if there is an outstanding "job" (CertVerifierJob) in progress that
-// can service the request. If there is, the request is attached to that job.
-// Otherwise a new job is started.
-//
-// A job (CertVerifierJob) is a way to de-duplicate requests that are
-// fundamentally doing the same verification. CertVerifierJob is similarly
-// thread-unsafe and lives on the origin thread.
-//
-// To do the actual work, CertVerifierJob posts a task to ThreadPool
-// (PostTaskAndReply), and on completion notifies all requests attached to it.
-//
-// Cancellation:
-//
-// There are two ways for a request to be cancelled.
-//
-// (1) When the caller explicitly frees the Request.
-//
-//     If the request was in-flight (attached to a job), then it is detached.
-//     Note that no effort is made to reap jobs which have no attached requests.
-//     (Because the worker task isn't cancelable).
-//
-// (2) When the MultiThreadedCertVerifier is deleted.
-//
-//     This automatically cancels all outstanding requests. This is accomplished
-//     by deleting each of the jobs owned by the MultiThreadedCertVerifier,
-//     whose destructor in turn marks each attached request as canceled.
-//
-// TODO(eroman): If the MultiThreadedCertVerifier is deleted from within a
-// callback, the remaining requests in the completing job will NOT be cancelled.
-
 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);
-}
-
 // Used to pass the result of CertVerifierJob::DoVerifyOnWorkerThread() to
 // CertVerifierJob::OnJobCompleted().
 struct ResultHelper {
@@ -126,65 +51,6 @@
   return flags;
 }
 
-}  // namespace
-
-// Represents the output and result callback of a request. The
-// CertVerifierRequest is owned by the caller that initiated the call to
-// CertVerifier::Verify().
-class CertVerifierRequest : public base::LinkNode<CertVerifierRequest>,
-                            public CertVerifier::Request {
- public:
-  CertVerifierRequest(CertVerifierJob* job,
-                      CompletionOnceCallback callback,
-                      CertVerifyResult* verify_result,
-                      const NetLogWithSource& net_log)
-      : job_(job),
-        callback_(std::move(callback)),
-        verify_result_(verify_result),
-        net_log_(net_log) {
-    net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_REQUEST);
-  }
-
-  // Cancels the request.
-  ~CertVerifierRequest() override {
-    if (job_) {
-      // Cancel the outstanding request.
-      net_log_.AddEvent(NetLogEventType::CANCELLED);
-      net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST);
-
-      // Remove the request from the Job. No attempt is made to cancel the job
-      // even though it may no longer have any requests attached to it. Because
-      // it is running on a worker thread aborting it isn't feasible.
-      RemoveFromList();
-    }
-  }
-
-  // Copies the contents of |verify_result| to the caller's
-  // CertVerifyResult and calls the callback.
-  void Post(const ResultHelper& verify_result) {
-    DCHECK(job_);
-    job_ = nullptr;
-
-    net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_REQUEST);
-    *verify_result_ = verify_result.result;
-
-    std::move(callback_).Run(verify_result.error);
-  }
-
-  void OnJobCancelled() {
-    job_ = nullptr;
-    callback_.Reset();
-  }
-
-  const NetLogWithSource& net_log() const { return net_log_; }
-
- private:
-  CertVerifierJob* job_;  // Not owned.
-  CompletionOnceCallback callback_;
-  CertVerifyResult* verify_result_;
-  const NetLogWithSource net_log_;
-};
-
 // DoVerifyOnWorkerThread runs the verification synchronously on a worker
 // thread.
 std::unique_ptr<ResultHelper> DoVerifyOnWorkerThread(
@@ -210,149 +76,69 @@
   return verify_result;
 }
 
-// CertVerifierJob lives only on the verifier's origin message loop.
-class CertVerifierJob {
+// Helper to allow callers to cancel pending CertVerifier::Verify requests.
+// Note that because the CertVerifyProc is blocking, it's not actually
+// possible to cancel the in-progress request; instead, this simply guarantees
+// that the provided callback will not be invoked if the Request is deleted.
+class InternalRequest : public CertVerifier::Request {
  public:
-  CertVerifierJob(const CertVerifier::RequestParams& key,
-                  NetLog* net_log,
-                  MultiThreadedCertVerifier* cert_verifier)
-      : key_(key),
-        start_time_(base::TimeTicks::Now()),
-        net_log_(NetLogWithSource::Make(net_log,
-                                        NetLogSourceType::CERT_VERIFIER_JOB)),
-        cert_verifier_(cert_verifier),
-        is_first_job_(false) {
-    net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_JOB, [&] {
-      return NetLogX509CertificateParams(key.certificate().get());
-    });
-  }
+  InternalRequest(CompletionOnceCallback callback,
+                  CertVerifyResult* caller_result);
+  ~InternalRequest() override;
 
-  // Indicates whether this was the first job started by the CertVerifier. This
-  // is only used for logging certain UMA stats.
-  void set_is_first_job(bool is_first_job) { is_first_job_ = is_first_job; }
-
-  const CertVerifier::RequestParams& key() const { return key_; }
-
-  // Posts a task to ThreadPool to do the verification. Once the verification
-  // has completed, it will call OnJobCompleted() on the origin thread.
   void Start(const scoped_refptr<CertVerifyProc>& verify_proc,
              const CertVerifier::Config& config,
-             uint32_t config_id) {
-    int flags = GetFlagsForConfig(config);
-    if (key_.flags() & CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES) {
-      flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_ENABLED;
-      flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS;
-    }
-    DCHECK(config.crl_set);
-    base::PostTaskAndReplyWithResult(
-        FROM_HERE,
-        {base::ThreadPool(), base::MayBlock(),
-         base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-        base::BindOnce(&DoVerifyOnWorkerThread, verify_proc, key_.certificate(),
-                       key_.hostname(), key_.ocsp_response(), key_.sct_list(),
-                       flags, config.crl_set, config.additional_trust_anchors),
-        base::BindOnce(&CertVerifierJob::OnJobCompleted,
-                       weak_ptr_factory_.GetWeakPtr(), config_id));
-  }
-
-  ~CertVerifierJob() {
-    // If the job is in progress, cancel it.
-    if (cert_verifier_) {
-      cert_verifier_ = nullptr;
-
-      net_log_.AddEvent(NetLogEventType::CANCELLED);
-      net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB);
-
-      // Notify each request of the cancellation.
-      for (base::LinkNode<CertVerifierRequest>* it = requests_.head();
-           it != requests_.end(); it = it->next()) {
-        it->value()->OnJobCancelled();
-      }
-    }
-  }
-
-  // Creates and attaches a request to the Job.
-  std::unique_ptr<CertVerifierRequest> CreateRequest(
-      CompletionOnceCallback callback,
-      CertVerifyResult* verify_result,
-      const NetLogWithSource& net_log) {
-    std::unique_ptr<CertVerifierRequest> request(new CertVerifierRequest(
-        this, std::move(callback), verify_result, net_log));
-
-    request->net_log().AddEventReferencingSource(
-        NetLogEventType::CERT_VERIFIER_REQUEST_BOUND_TO_JOB, net_log_.source());
-
-    requests_.Append(request.get());
-    return request;
-  }
+             const CertVerifier::RequestParams& params);
 
  private:
-  using RequestList = base::LinkedList<CertVerifierRequest>;
+  void OnJobComplete(std::unique_ptr<ResultHelper> verify_result);
 
-  // Called on completion of the Job to log UMA metrics and NetLog events.
-  void LogMetrics(const ResultHelper& verify_result) {
-    net_log_.EndEvent(NetLogEventType::CERT_VERIFIER_JOB, [&] {
-      return CertVerifyResultParams(verify_result.result);
-    });
-    base::TimeDelta latency = base::TimeTicks::Now() - start_time_;
-    if (cert_verifier_->should_record_histograms_) {
-      UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency", latency,
-                                 base::TimeDelta::FromMilliseconds(1),
-                                 base::TimeDelta::FromMinutes(10), 100);
-      if (is_first_job_) {
-        UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_First_Job_Latency",
-                                   latency,
-                                   base::TimeDelta::FromMilliseconds(1),
-                                   base::TimeDelta::FromMinutes(10), 100);
-      }
-    }
-  }
+  CompletionOnceCallback callback_;
+  CertVerifyResult* caller_result_;
 
-  void OnJobCompleted(uint32_t config_id,
-                      std::unique_ptr<ResultHelper> verify_result) {
-    TRACE_EVENT0(NetTracingCategory(), "CertVerifierJob::OnJobCompleted");
-    std::unique_ptr<CertVerifierJob> keep_alive =
-        cert_verifier_->RemoveJob(this);
-
-    LogMetrics(*verify_result);
-    if (cert_verifier_->verify_complete_callback_ &&
-        config_id == cert_verifier_->config_id_) {
-      cert_verifier_->verify_complete_callback_.Run(
-          key_, net_log_, verify_result->error, verify_result->result,
-          base::TimeTicks::Now() - start_time_, is_first_job_);
-    }
-    cert_verifier_ = nullptr;
-
-    // TODO(eroman): If the cert_verifier_ is deleted from within one of the
-    // callbacks, any remaining requests for that job should be cancelled. Right
-    // now they will be called.
-    while (!requests_.empty()) {
-      base::LinkNode<CertVerifierRequest>* request = requests_.head();
-      request->RemoveFromList();
-      request->value()->Post(*verify_result);
-    }
-  }
-
-  const CertVerifier::RequestParams key_;
-  // The tick count of when the job started. This is used to measure how long
-  // the job actually took to complete.
-  const base::TimeTicks start_time_;
-
-  RequestList requests_;  // Non-owned.
-
-  const NetLogWithSource net_log_;
-  MultiThreadedCertVerifier* cert_verifier_;  // Non-owned.
-
-  bool is_first_job_;
-  base::WeakPtrFactory<CertVerifierJob> weak_ptr_factory_{this};
+  base::WeakPtrFactory<InternalRequest> weak_factory_{this};
 };
 
+InternalRequest::InternalRequest(CompletionOnceCallback callback,
+                                 CertVerifyResult* caller_result)
+    : callback_(std::move(callback)), caller_result_(caller_result) {}
+
+InternalRequest::~InternalRequest() = default;
+
+void InternalRequest::Start(const scoped_refptr<CertVerifyProc>& verify_proc,
+                            const CertVerifier::Config& config,
+                            const CertVerifier::RequestParams& params) {
+  int flags = GetFlagsForConfig(config);
+  if (params.flags() & CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES) {
+    flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_ENABLED;
+    flags &= ~CertVerifyProc::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS;
+  }
+  DCHECK(config.crl_set);
+  base::PostTaskAndReplyWithResult(
+      FROM_HERE,
+      {base::ThreadPool(), base::MayBlock(),
+       base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+      base::BindOnce(&DoVerifyOnWorkerThread, verify_proc, params.certificate(),
+                     params.hostname(), params.ocsp_response(),
+                     params.sct_list(), flags, config.crl_set,
+                     config.additional_trust_anchors),
+      base::BindOnce(&InternalRequest::OnJobComplete,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void InternalRequest::OnJobComplete(
+    std::unique_ptr<ResultHelper> verify_result) {
+  *caller_result_ = verify_result->result;
+  // Note: May delete |this|.
+  std::move(callback_).Run(verify_result->error);
+}
+
+}  // namespace
+
 MultiThreadedCertVerifier::MultiThreadedCertVerifier(
     scoped_refptr<CertVerifyProc> verify_proc)
-    : config_id_(0),
-      requests_(0),
-      inflight_joins_(0),
-      verify_proc_(verify_proc) {
+    : verify_proc_(std::move(verify_proc)) {
+  // Guarantee there is always a CRLSet (this can be overridden via SetConfig).
   config_.crl_set = CRLSet::BuiltinCRLSet();
 }
 
@@ -360,17 +146,6 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 }
 
-// static
-std::unique_ptr<MultiThreadedCertVerifier>
-MultiThreadedCertVerifier::CreateForDualVerificationTrial(
-    scoped_refptr<CertVerifyProc> verify_proc,
-    VerifyCompleteCallback verify_complete_callback,
-    bool should_record_histograms) {
-  return base::WrapUnique(new net::MultiThreadedCertVerifier(
-      std::move(verify_proc), std::move(verify_complete_callback),
-      should_record_histograms));
-}
-
 int MultiThreadedCertVerifier::Verify(const RequestParams& params,
                                       CertVerifyResult* verify_result,
                                       CompletionOnceCallback callback,
@@ -383,100 +158,17 @@
   if (callback.is_null() || !verify_result || params.hostname().empty())
     return ERR_INVALID_ARGUMENT;
 
-  requests_++;
-
-  // See if an identical request is currently in flight.
-  CertVerifierJob* job = FindJob(params);
-  if (job) {
-    // An identical request is in flight already. We'll just attach our
-    // callback.
-    inflight_joins_++;
-  } else {
-    // Need to make a new job.
-    std::unique_ptr<CertVerifierJob> new_job =
-        std::make_unique<CertVerifierJob>(params, net_log.net_log(), this);
-
-    new_job->Start(verify_proc_, config_, config_id_);
-
-    job = new_job.get();
-    joinable_[job] = std::move(new_job);
-
-    if (requests_ == 1)
-      job->set_is_first_job(true);
-  }
-
-  std::unique_ptr<CertVerifierRequest> request =
-      job->CreateRequest(std::move(callback), verify_result, net_log);
+  std::unique_ptr<InternalRequest> request =
+      std::make_unique<InternalRequest>(std::move(callback), verify_result);
+  request->Start(verify_proc_, config_, params);
   *out_req = std::move(request);
   return ERR_IO_PENDING;
 }
 
 void MultiThreadedCertVerifier::SetConfig(const CertVerifier::Config& config) {
-  ++config_id_;
   config_ = config;
   if (!config_.crl_set)
     config_.crl_set = CRLSet::BuiltinCRLSet();
-
-  // In C++17, this would be a .merge() call to combine |joinable_| into
-  // |inflight_|.
-  inflight_.insert(std::make_move_iterator(joinable_.begin()),
-                   std::make_move_iterator(joinable_.end()));
-  joinable_.clear();
-}
-
-bool MultiThreadedCertVerifier::JobComparator::operator()(
-    const CertVerifierJob* job1,
-    const CertVerifierJob* job2) const {
-  return job1->key() < job2->key();
-}
-
-MultiThreadedCertVerifier::MultiThreadedCertVerifier(
-    scoped_refptr<CertVerifyProc> verify_proc,
-    VerifyCompleteCallback verify_complete_callback,
-    bool should_record_histograms)
-    : MultiThreadedCertVerifier(verify_proc) {
-  verify_complete_callback_ = std::move(verify_complete_callback);
-  should_record_histograms_ = should_record_histograms;
-}
-
-std::unique_ptr<CertVerifierJob> MultiThreadedCertVerifier::RemoveJob(
-    CertVerifierJob* job) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  // See if it's a job from the current generation.
-  auto joinable_it = joinable_.find(job);
-  if (joinable_it != joinable_.end()) {
-    std::unique_ptr<CertVerifierJob> job_ptr = std::move(joinable_it->second);
-    joinable_.erase(joinable_it);
-    return job_ptr;
-  }
-
-  // Otherwise, find it and remove it from previous generations.
-  auto it = inflight_.find(job);
-  DCHECK(it != inflight_.end());
-  std::unique_ptr<CertVerifierJob> job_ptr = std::move(it->second);
-  inflight_.erase(it);
-  return job_ptr;
-}
-
-struct MultiThreadedCertVerifier::JobToRequestParamsComparator {
-  bool operator()(const std::pair<CertVerifierJob* const,
-                                  std::unique_ptr<CertVerifierJob>>& item,
-                  const CertVerifier::RequestParams& value) const {
-    return item.first->key() < value;
-  }
-};
-
-CertVerifierJob* MultiThreadedCertVerifier::FindJob(const RequestParams& key) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  // The JobSet is kept in sorted order so items can be found using binary
-  // search.
-  auto it = std::lower_bound(joinable_.begin(), joinable_.end(), key,
-                             JobToRequestParamsComparator());
-  if (it != joinable_.end() && !(key < it->first->key()))
-    return it->first;
-  return nullptr;
 }
 
 }  // namespace net
diff --git a/net/cert/multi_threaded_cert_verifier.h b/net/cert/multi_threaded_cert_verifier.h
index 03804ea..28c7bf7 100644
--- a/net/cert/multi_threaded_cert_verifier.h
+++ b/net/cert/multi_threaded_cert_verifier.h
@@ -10,55 +10,27 @@
 
 #include <map>
 #include <memory>
-#include <string>
-#include <vector>
 
-#include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
-#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/cert/cert_verifier.h"
 
 namespace net {
 
-class CertVerifierJob;
-class CertVerifierRequest;
 class CertVerifyProc;
 
 // MultiThreadedCertVerifier is a CertVerifier implementation that runs
 // synchronous CertVerifier implementations on worker threads.
 class NET_EXPORT_PRIVATE MultiThreadedCertVerifier : public CertVerifier {
  public:
-  using VerifyCompleteCallback =
-      base::RepeatingCallback<void(const RequestParams&,
-                                   const NetLogWithSource&,
-                                   int,
-                                   const CertVerifyResult&,
-                                   base::TimeDelta,
-                                   bool)>;
-
   explicit MultiThreadedCertVerifier(scoped_refptr<CertVerifyProc> verify_proc);
 
   // When the verifier is destroyed, all certificate verifications requests are
   // canceled, and their completion callbacks will not be called.
   ~MultiThreadedCertVerifier() override;
 
-  // Creates a MultiThreadedCertVerifier that will call
-  // |verify_complete_callback| once for each verification that has completed
-  // (if it is non-null). Histograms will have |histogram_suffix| appended, if
-  // it is non-empty.
-  // This factory method is temporary, and should not be used without
-  // consulting with OWNERS.
-  // TODO(mattm): remove this once the dual verification trial is complete.
-  // (See https://crbug.com/649026.)
-  static std::unique_ptr<MultiThreadedCertVerifier>
-  CreateForDualVerificationTrial(
-      scoped_refptr<CertVerifyProc> verify_proc,
-      VerifyCompleteCallback verify_complete_callback,
-      bool should_record_histograms);
-
   // CertVerifier implementation
   int Verify(const RequestParams& params,
              CertVerifyResult* verify_result,
@@ -68,64 +40,9 @@
   void SetConfig(const CertVerifier::Config& config) override;
 
  private:
-  struct JobToRequestParamsComparator;
-  friend class CertVerifierRequest;
-  friend class CertVerifierJob;
-  friend class MultiThreadedCertVerifierTest;
-  FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, InflightJoin);
-  FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, MultipleInflightJoin);
-  FRIEND_TEST_ALL_PREFIXES(MultiThreadedCertVerifierTest, CancelRequest);
-
-  struct JobComparator {
-    bool operator()(const CertVerifierJob* job1,
-                    const CertVerifierJob* job2) const;
-  };
-
-  // TODO(mattm): remove this once the dual verification trial is complete.
-  // (See https://crbug.com/649026.)
-  MultiThreadedCertVerifier(scoped_refptr<CertVerifyProc> verify_proc,
-                            VerifyCompleteCallback verify_complete_callback,
-                            bool should_record_histograms);
-
-  // Returns an inflight job for |key|, if it can be joined. If there is no
-  // such job then returns null.
-  CertVerifierJob* FindJob(const RequestParams& key);
-
-  // Removes |job| from the inflight set, and passes ownership back to the
-  // caller. |job| must already be |inflight_|.
-  std::unique_ptr<CertVerifierJob> RemoveJob(CertVerifierJob* job);
-
-  // For unit testing.
-  uint64_t requests() const { return requests_; }
-  uint64_t inflight_joins() const { return inflight_joins_; }
-
-  // |joinable_| holds the jobs for which an active verification is taking
-  // place and can be joined by new requests (e.g. the config is the same),
-  // mapping the job's raw pointer to an owned pointer.
-  // TODO(rsleevi): Once C++17 is supported, switch this to be a std::set<>,
-  // which supports extracting owned objects from the set.
-  std::map<CertVerifierJob*, std::unique_ptr<CertVerifierJob>, JobComparator>
-      joinable_;
-
-  // |inflight_| contains all jobs that are still undergoing active
-  // verification, but which can no longer be joined - such as due to the
-  // underlying configuration changing.
-  std::map<CertVerifierJob*, std::unique_ptr<CertVerifierJob>, JobComparator>
-      inflight_;
-
-  uint32_t config_id_;
   Config config_;
-
-  uint64_t requests_;
-  uint64_t inflight_joins_;
-
   scoped_refptr<CertVerifyProc> verify_proc_;
 
-  // Members for dual verification trial. TODO(mattm): Remove these.
-  // (See https://crbug.com/649026.)
-  VerifyCompleteCallback verify_complete_callback_;
-  bool should_record_histograms_ = true;
-
   THREAD_CHECKER(thread_checker_);
 
   DISALLOW_COPY_AND_ASSIGN(MultiThreadedCertVerifier);
diff --git a/net/cert/multi_threaded_cert_verifier_unittest.cc b/net/cert/multi_threaded_cert_verifier_unittest.cc
index 789ce742..933f84b 100644
--- a/net/cert/multi_threaded_cert_verifier_unittest.cc
+++ b/net/cert/multi_threaded_cert_verifier_unittest.cc
@@ -90,43 +90,6 @@
   MultiThreadedCertVerifier verifier_;
 };
 
-// Tests an inflight join.
-TEST_F(MultiThreadedCertVerifierTest, InflightJoin) {
-  base::FilePath certs_dir = GetTestCertsDirectory();
-  scoped_refptr<X509Certificate> test_cert(
-      ImportCertFromFile(certs_dir, "ok_cert.pem"));
-  ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
-
-  int error;
-  CertVerifyResult verify_result;
-  TestCompletionCallback callback;
-  std::unique_ptr<CertVerifier::Request> request;
-  CertVerifyResult verify_result2;
-  TestCompletionCallback callback2;
-  std::unique_ptr<CertVerifier::Request> request2;
-
-  error = verifier_.Verify(
-      CertVerifier::RequestParams(test_cert, "www.example.com", 0,
-                                  /*ocsp_response=*/std::string(),
-                                  /*sct_list=*/std::string()),
-      &verify_result, callback.callback(), &request, NetLogWithSource());
-  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request);
-  error = verifier_.Verify(
-      CertVerifier::RequestParams(test_cert, "www.example.com", 0,
-                                  /*ocsp_response=*/std::string(),
-                                  /*sct_list=*/std::string()),
-      &verify_result2, callback2.callback(), &request2, NetLogWithSource());
-  EXPECT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request2);
-  error = callback.WaitForResult();
-  EXPECT_TRUE(IsCertificateError(error));
-  error = callback2.WaitForResult();
-  ASSERT_TRUE(IsCertificateError(error));
-  ASSERT_EQ(2u, verifier_.requests());
-  ASSERT_EQ(1u, verifier_.inflight_joins());
-}
-
 // Tests that the callback of a canceled request is never made.
 TEST_F(MultiThreadedCertVerifierTest, CancelRequest) {
   base::FilePath certs_dir = GetTestCertsDirectory();
@@ -195,89 +158,6 @@
   // Destroy |verifier| by going out of scope.
 }
 
-// Tests de-duplication of requests.
-// Starts up 5 requests, of which 3 are unique.
-TEST_F(MultiThreadedCertVerifierTest, MultipleInflightJoin) {
-  base::FilePath certs_dir = GetTestCertsDirectory();
-  scoped_refptr<X509Certificate> test_cert(
-      ImportCertFromFile(certs_dir, "ok_cert.pem"));
-  ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
-
-  int error;
-  CertVerifyResult verify_result1;
-  TestCompletionCallback callback1;
-  std::unique_ptr<CertVerifier::Request> request1;
-  CertVerifyResult verify_result2;
-  TestCompletionCallback callback2;
-  std::unique_ptr<CertVerifier::Request> request2;
-  CertVerifyResult verify_result3;
-  TestCompletionCallback callback3;
-  std::unique_ptr<CertVerifier::Request> request3;
-  CertVerifyResult verify_result4;
-  TestCompletionCallback callback4;
-  std::unique_ptr<CertVerifier::Request> request4;
-  CertVerifyResult verify_result5;
-  TestCompletionCallback callback5;
-  std::unique_ptr<CertVerifier::Request> request5;
-
-  const char domain1[] = "www.example1.com";
-  const char domain2[] = "www.exampleB.com";
-  const char domain3[] = "www.example3.com";
-
-  // Start 3 unique requests.
-  error = verifier_.Verify(
-      CertVerifier::RequestParams(test_cert, domain2, 0,
-                                  /*ocsp_response=*/std::string(),
-                                  /*sct_list=*/std::string()),
-      &verify_result1, callback1.callback(), &request1, NetLogWithSource());
-  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request1);
-
-  error = verifier_.Verify(
-      CertVerifier::RequestParams(test_cert, domain2, 0,
-                                  /*ocsp_response=*/std::string(),
-                                  /*sct_list=*/std::string()),
-      &verify_result2, callback2.callback(), &request2, NetLogWithSource());
-  EXPECT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request2);
-
-  error = verifier_.Verify(
-      CertVerifier::RequestParams(test_cert, domain3, 0,
-                                  /*ocsp_response=*/std::string(),
-                                  /*sct_list=*/std::string()),
-      &verify_result3, callback3.callback(), &request3, NetLogWithSource());
-  EXPECT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request3);
-
-  // Start duplicate requests (which should join to existing jobs).
-  error = verifier_.Verify(
-      CertVerifier::RequestParams(test_cert, domain1, 0,
-                                  /*ocsp_response=*/std::string(),
-                                  /*sct_list=*/std::string()),
-      &verify_result4, callback4.callback(), &request4, NetLogWithSource());
-  EXPECT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request4);
-
-  error = verifier_.Verify(
-      CertVerifier::RequestParams(test_cert, domain2, 0,
-                                  /*ocsp_response=*/std::string(),
-                                  /*sct_list=*/std::string()),
-      &verify_result5, callback5.callback(), &request5, NetLogWithSource());
-  EXPECT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request5);
-
-  error = callback1.WaitForResult();
-  EXPECT_TRUE(IsCertificateError(error));
-  error = callback2.WaitForResult();
-  ASSERT_TRUE(IsCertificateError(error));
-  error = callback4.WaitForResult();
-  ASSERT_TRUE(IsCertificateError(error));
-
-  // Let the other requests automatically cancel.
-  ASSERT_EQ(5u, verifier_.requests());
-  ASSERT_EQ(2u, verifier_.inflight_joins());
-}
-
 // Tests propagation of configuration options into CertVerifyProc flags
 TEST_F(MultiThreadedCertVerifierTest, ConvertsConfigToFlags) {
   base::FilePath certs_dir = GetTestCertsDirectory();
diff --git a/net/cert/trial_comparison_cert_verifier.cc b/net/cert/trial_comparison_cert_verifier.cc
index f3bd119c..d91f542 100644
--- a/net/cert/trial_comparison_cert_verifier.cc
+++ b/net/cert/trial_comparison_cert_verifier.cc
@@ -31,12 +31,16 @@
 
 namespace {
 
-base::Value TrialVerificationJobResultParams(bool trial_success) {
+base::Value JobResultParams(bool trial_success) {
   base::Value results(base::Value::Type::DICTIONARY);
   results.SetBoolKey("trial_success", trial_success);
   return results;
 }
 
+// Note: This ignores the result of stapled OCSP (which is the same for both
+// verifiers) and informational statuses about the certificate algorithms and
+// the hashes, since they will be the same if the certificate chains are the
+// same.
 bool CertVerifyResultEqual(const CertVerifyResult& a,
                            const CertVerifyResult& b) {
   return std::tie(a.cert_status, a.is_issued_by_known_root) ==
@@ -120,302 +124,525 @@
 
 }  // namespace
 
-class TrialComparisonCertVerifier::TrialVerificationJob {
+// The Job represents the state machine for a trial cert verification.
+// The Job is always owned by the TrialComparisonCertVerifier. However, a
+// reference to the Job is given by the CertVerifier::Request returned by
+// Start(), allowing the caller to indicate they're no longer interested in
+// the Job if it's not yet completed.
+//
+// The Job may be deleted while processing the initial verification completion,
+// by the client callback deleting the associated TrialComparisonCertVerifier.
+class TrialComparisonCertVerifier::Job {
  public:
-  TrialVerificationJob(const CertVerifier::Config& config,
-                       const CertVerifier::RequestParams& params,
-                       const NetLogWithSource& source_net_log,
-                       TrialComparisonCertVerifier* cert_verifier,
-                       int primary_error,
-                       const CertVerifyResult& primary_result)
-      : config_(config),
-        config_changed_(false),
-        params_(params),
-        net_log_(
-            NetLogWithSource::Make(source_net_log.net_log(),
-                                   NetLogSourceType::TRIAL_CERT_VERIFIER_JOB)),
-        cert_verifier_(cert_verifier),
-        primary_error_(primary_error),
-        primary_result_(primary_result) {
-    net_log_.BeginEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB);
-    source_net_log.AddEventReferencingSource(
-        NetLogEventType::TRIAL_CERT_VERIFIER_JOB_COMPARISON_STARTED,
-        net_log_.source());
-  }
+  Job(const CertVerifier::Config& config,
+      const CertVerifier::RequestParams& params,
+      const NetLogWithSource& source_net_log,
+      TrialComparisonCertVerifier* parent);
+  ~Job();
 
-  ~TrialVerificationJob() {
-    if (cert_verifier_) {
-      net_log_.AddEvent(NetLogEventType::CANCELLED);
-      net_log_.EndEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB);
-    }
-  }
+  // Start the Job, attempting first to verify with the parent's primary
+  // verifier. |client_result|, |client_callback|, and |client_request| are
+  // the parameters to the TrialComparisonCertVerifier::Verify(), allowing the
+  // caller to register interest in the primary results. |client_request| will
+  // be filled with a handle that the caller can use to abort the request.
+  int Start(CertVerifyResult* client_result,
+            CompletionOnceCallback client_callback,
+            std::unique_ptr<CertVerifier::Request>* client_request);
+  void OnConfigChanged();
 
-  void Start() {
-    // Unretained is safe because trial_request_ will cancel the callback on
-    // destruction.
-    int rv = cert_verifier_->trial_verifier()->Verify(
-        params_, &trial_result_,
-        base::BindOnce(&TrialVerificationJob::OnJobCompleted,
-                       base::Unretained(this)),
-        &trial_request_, net_log_);
-    if (rv != ERR_IO_PENDING)
-      OnJobCompleted(rv);
-  }
+ private:
+  class Request;
+  friend class Request;
 
-  void OnConfigChanged() { config_changed_ = true; }
+  // If the Job has not yet completed the primary verification, this can be
+  // called to indicate that the Request is no longer interested (e.g. the
+  // Request is being deleted).
+  void DetachRequest();
 
-  void Finish(bool is_success, TrialComparisonResult result_code) {
-    TrialComparisonCertVerifier* cert_verifier = cert_verifier_;
-    cert_verifier_ = nullptr;
+  void Finish(bool is_success, TrialComparisonResult result_code);
+  void FinishSuccess(TrialComparisonResult result_code);
+  void FinishWithError();
 
-    UMA_HISTOGRAM_ENUMERATION("Net.CertVerifier_TrialComparisonResult",
-                              result_code);
+  // Called when the primary verifier is completed.
+  // DANGER: |this| may be deleted when calling this.
+  void OnPrimaryJobCompleted(int result);
 
-    net_log_.EndEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB, [&] {
-      return TrialVerificationJobResultParams(is_success);
-    });
-
-    if (!is_success) {
-      cert_verifier->report_callback_.Run(
-          params_.hostname(), params_.certificate(),
-          config_.enable_rev_checking,
-          config_.require_rev_checking_local_anchors,
-          config_.enable_sha1_local_anchors,
-          config_.disable_symantec_enforcement, primary_result_, trial_result_);
-    }
-
-    // |this| is deleted after RemoveJob returns.
-    cert_verifier->RemoveJob(this);
-  }
-
-  void FinishSuccess(TrialComparisonResult result_code) {
-    Finish(true /* is_success */, result_code);
-  }
-
-  void FinishWithError() {
-    DCHECK(trial_error_ != primary_error_ ||
-           !CertVerifyResultEqual(trial_result_, primary_result_));
-
-    TrialComparisonResult result_code = kInvalid;
-
-    if (primary_error_ == OK && trial_error_ == OK) {
-      result_code = kBothValidDifferentDetails;
-    } else if (primary_error_ == OK) {
-      result_code = kPrimaryValidSecondaryError;
-    } else if (trial_error_ == OK) {
-      result_code = kPrimaryErrorSecondaryValid;
-    } else {
-      result_code = kBothErrorDifferentDetails;
-    }
-    Finish(false /* is_success */, result_code);
-  }
-
-  void OnJobCompleted(int trial_result_error) {
-    DCHECK(primary_result_.verified_cert);
-    DCHECK(trial_result_.verified_cert);
-
-    trial_error_ = trial_result_error;
-
-    bool errors_equal = trial_result_error == primary_error_;
-    bool details_equal = CertVerifyResultEqual(trial_result_, primary_result_);
-    bool trial_success = errors_equal && details_equal;
-
-    if (trial_success) {
-      FinishSuccess(kEqual);
-      return;
-    }
+  // Called when the initial trial comparison is completed.
+  void OnTrialJobCompleted(int result);
 
 #if defined(OS_MACOSX)
-    if (primary_error_ == ERR_CERT_REVOKED && !config_.enable_rev_checking &&
-        !(primary_result_.cert_status & CERT_STATUS_REV_CHECKING_ENABLED) &&
-        !(trial_result_.cert_status &
-          (CERT_STATUS_REVOKED | CERT_STATUS_REV_CHECKING_ENABLED))) {
-      if (config_changed_) {
-        FinishSuccess(kIgnoredConfigurationChanged);
-        return;
-      }
-      // CertVerifyProcMac does some revocation checking even if we didn't want
-      // it. Try verifying with the trial verifier with revocation checking
-      // enabled, see if it then returns REVOKED.
-
-      int rv = cert_verifier_->revocation_trial_verifier()->Verify(
-          params_, &reverification_result_,
-          base::BindOnce(
-              &TrialVerificationJob::OnMacRevcheckingReverificationJobCompleted,
-              base::Unretained(this)),
-          &reverification_request_, net_log_);
-      if (rv != ERR_IO_PENDING)
-        OnMacRevcheckingReverificationJobCompleted(rv);
-      return;
-    }
+  // On some versions of macOS, revocation checking is always force-enabled
+  // for the system. For comparing with the built-in verifier to rule out
+  // "expected" differences, it's necessary to retry verification with
+  // revocation checking enabled, to match the (effective) configuration of
+  // the system verifier.
+  void OnMacRevCheckingReverificationJobCompleted(int result);
 #endif
 
-    const bool chains_equal =
-        primary_result_.verified_cert->EqualsIncludingChain(
-            trial_result_.verified_cert.get());
-
-    if (!chains_equal && (trial_error_ == OK || primary_error_ != OK)) {
-      if (config_changed_) {
-        FinishSuccess(kIgnoredConfigurationChanged);
-        return;
-      }
-      // Chains were different, reverify the trial_result_.verified_cert chain
-      // using the platform verifier and compare results again.
-      RequestParams reverification_params(
-          trial_result_.verified_cert, params_.hostname(), params_.flags(),
-          params_.ocsp_response(), params_.sct_list());
-
-      int rv = cert_verifier_->primary_reverifier()->Verify(
-          reverification_params, &reverification_result_,
-          base::BindOnce(&TrialVerificationJob::
-                             OnPrimaryReverifiyWithSecondaryChainCompleted,
-                         base::Unretained(this)),
-          &reverification_request_, net_log_);
-      if (rv != ERR_IO_PENDING)
-        OnPrimaryReverifiyWithSecondaryChainCompleted(rv);
-      return;
-    }
-
-    TrialComparisonResult ignorable_difference =
-        IsSynchronouslyIgnorableDifference(primary_error_, primary_result_,
-                                           trial_error_, trial_result_);
-    if (ignorable_difference != kInvalid) {
-      FinishSuccess(ignorable_difference);
-      return;
-    }
-
-    FinishWithError();
-  }
+  // The primary (system) and trial (built-in) verifiers may both construct
+  // valid chains, but they use different paths. If that happens, a second
+  // verification with the system verifier is used, using the path that the
+  // built-in verifier constructed, to compare results. This is called when
+  // that re-verification completes.
+  void OnPrimaryReverifyWithSecondaryChainCompleted(int result);
 
   // Check if the differences between the primary and trial verifiers can be
   // ignored. This only handles differences that can be checked synchronously.
   // If the difference is ignorable, returns the relevant TrialComparisonResult,
   // otherwise returns kInvalid.
-  static TrialComparisonResult IsSynchronouslyIgnorableDifference(
+  TrialComparisonResult IsSynchronouslyIgnorableDifference(
       int primary_error,
       const CertVerifyResult& primary_result,
       int trial_error,
-      const CertVerifyResult& trial_result) {
-    DCHECK(primary_result.verified_cert);
-    DCHECK(trial_result.verified_cert);
+      const CertVerifyResult& trial_result);
 
-    if (primary_error == OK &&
-        primary_result.verified_cert->intermediate_buffers().empty()) {
-      // Platform may support trusting a leaf certificate directly. Builtin
-      // verifier does not. See https://crbug.com/814994.
-      return kIgnoredLocallyTrustedLeaf;
-    }
-
-    const bool chains_equal =
-        primary_result.verified_cert->EqualsIncludingChain(
-            trial_result.verified_cert.get());
-
-    if (chains_equal && (trial_result.cert_status & CERT_STATUS_IS_EV) &&
-        !(primary_result.cert_status & CERT_STATUS_IS_EV) &&
-        (primary_error == trial_error)) {
-      // The platform CertVerifyProc impls only check a single potential EV
-      // policy from the leaf.  If the leaf had multiple policies, builtin
-      // verifier may verify it as EV when the platform verifier did not.
-      if (CertHasMultipleEVPoliciesAndOneMatchesRoot(
-              trial_result.verified_cert.get())) {
-        return kIgnoredMultipleEVPoliciesAndOneMatchesRoot;
-      }
-    }
-    return kInvalid;
-  }
-
-#if defined(OS_MACOSX)
-  void OnMacRevcheckingReverificationJobCompleted(int reverification_error) {
-    if (reverification_error == ERR_CERT_REVOKED) {
-      FinishSuccess(kIgnoredMacUndesiredRevocationChecking);
-      return;
-    }
-    FinishWithError();
-  }
-#endif
-
-  void OnPrimaryReverifiyWithSecondaryChainCompleted(int reverification_error) {
-    if (reverification_error == trial_error_ &&
-        CertVerifyResultEqual(reverification_result_, trial_result_)) {
-      // The new result matches the builtin verifier, so this was just
-      // a difference in the platform's path-building ability.
-      // Ignore the difference.
-      FinishSuccess(kIgnoredDifferentPathReVerifiesEquivalent);
-      return;
-    }
-
-    if (IsSynchronouslyIgnorableDifference(reverification_error,
-                                           reverification_result_, trial_error_,
-                                           trial_result_) != kInvalid) {
-      // The new result matches if ignoring differences. Still use the
-      // |kIgnoredDifferentPathReVerifiesEquivalent| code rather than the
-      // result of IsSynchronouslyIgnorableDifference, since it's the higher
-      // level description of what the difference is in this case.
-      FinishSuccess(kIgnoredDifferentPathReVerifiesEquivalent);
-      return;
-    }
-
-    FinishWithError();
-  }
-
- private:
   const CertVerifier::Config config_;
-  bool config_changed_;
+  bool config_changed_ = false;
   const CertVerifier::RequestParams params_;
   const NetLogWithSource net_log_;
-  TrialComparisonCertVerifier* cert_verifier_;  // Non-owned.
+
+  TrialComparisonCertVerifier* parent_ = nullptr;  // Non-owned.
+  Request* request_ = nullptr;                     // Non-owned.
+
+  // Results from the primary verification.
+  base::TimeTicks primary_start_;
+  int primary_error_;
+  CertVerifyResult primary_result_;
+  std::unique_ptr<CertVerifier::Request> primary_request_;
 
   // Results from the trial verification.
+  base::TimeTicks trial_start_;
   int trial_error_;
   CertVerifyResult trial_result_;
   std::unique_ptr<CertVerifier::Request> trial_request_;
 
-  // Saved results of the primary verification.
-  int primary_error_;
-  const CertVerifyResult primary_result_;
-
-  // Results from re-verification attempt.
+  // Results from the re-verification attempt.
   CertVerifyResult reverification_result_;
   std::unique_ptr<CertVerifier::Request> reverification_request_;
 
-  DISALLOW_COPY_AND_ASSIGN(TrialVerificationJob);
+  base::WeakPtrFactory<Job> weak_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(Job);
 };
 
+// The Request is vended to the TrialComparisonCertVerifier::Verify() callers,
+// which they fully own and will ultimately destroy. It's used to coordinate
+// state with the Job.
+//
+// If the Job has not yet completed the primary verification request, deleting
+// this will abort that Job, ultimately leading to the Job being deleted.
+// However, if the primary verification has completed, deleting the Request
+// simply becomes a no-op.
+class TrialComparisonCertVerifier::Job::Request : public CertVerifier::Request {
+ public:
+  Request(TrialComparisonCertVerifier::Job* parent,
+          CertVerifyResult* client_result,
+          CompletionOnceCallback client_callback);
+  ~Request() override;
+
+  // Called when the Job has completed, and used to invoke the client
+  // callback.
+  // Note: |this| may be deleted after calling this.
+  void OnJobComplete(int result, const CertVerifyResult& verify_result);
+
+  // Called when the Job is aborted (e.g. the underlying
+  // TrialComparisonCertVerifier is being deleted).
+  void OnJobAborted();
+
+ private:
+  TrialComparisonCertVerifier::Job* parent_;
+  CertVerifyResult* client_result_;
+  CompletionOnceCallback client_callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(Request);
+};
+
+TrialComparisonCertVerifier::Job::Job(const CertVerifier::Config& config,
+                                      const CertVerifier::RequestParams& params,
+                                      const NetLogWithSource& source_net_log,
+                                      TrialComparisonCertVerifier* parent)
+    : config_(config),
+      params_(params),
+      net_log_(
+          NetLogWithSource::Make(source_net_log.net_log(),
+                                 NetLogSourceType::TRIAL_CERT_VERIFIER_JOB)),
+      parent_(parent) {
+  net_log_.BeginEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB);
+  source_net_log.AddEventReferencingSource(
+      NetLogEventType::TRIAL_CERT_VERIFIER_JOB_COMPARISON_STARTED,
+      net_log_.source());
+}
+
+TrialComparisonCertVerifier::Job::~Job() {
+  if (request_) {
+    request_->OnJobAborted();
+  }
+
+  if (parent_) {
+    net_log_.AddEvent(NetLogEventType::CANCELLED);
+    net_log_.EndEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB);
+  }
+}
+
+int TrialComparisonCertVerifier::Job::Start(
+    CertVerifyResult* client_result,
+    CompletionOnceCallback client_callback,
+    std::unique_ptr<CertVerifier::Request>* client_request) {
+  DCHECK(!request_);
+  DCHECK(parent_);
+
+  primary_start_ = base::TimeTicks::Now();
+
+  // Unretained is safe because |primary_request_| will cancel the
+  // callback on destruction.
+  primary_error_ = parent_->primary_verifier()->Verify(
+      params_, &primary_result_,
+      base::Bind(&Job::OnPrimaryJobCompleted, base::Unretained(this)),
+      &primary_request_, net_log_);
+
+  if (primary_error_ != ERR_IO_PENDING) {
+    *client_result = primary_result_;
+    int result = primary_error_;
+
+    // NOTE: |this| may be deleted here, in the event that every resulting
+    // trial comparison also completes synchronously.
+    OnPrimaryJobCompleted(result);
+    return result;
+  }
+
+  // Create a new Request that will be used to manage the state for the
+  // primary verification and allow cancellation.
+  auto request = std::make_unique<Request>(this, client_result,
+                                           std::move(client_callback));
+  request_ = request.get();
+  *client_request = std::move(request);
+  return ERR_IO_PENDING;
+}
+
+void TrialComparisonCertVerifier::Job::OnConfigChanged() {
+  config_changed_ = true;
+}
+
+void TrialComparisonCertVerifier::Job::DetachRequest() {
+  // This should only be called while waiting for the primary verification.
+  DCHECK(primary_request_);
+  DCHECK(request_);
+
+  request_ = nullptr;
+}
+
+void TrialComparisonCertVerifier::Job::Finish(
+    bool is_success,
+    TrialComparisonResult result_code) {
+  // There should never be a pending initial verification.
+  DCHECK(!request_);
+  DCHECK(!primary_request_);
+
+  UMA_HISTOGRAM_ENUMERATION("Net.CertVerifier_TrialComparisonResult",
+                            result_code);
+
+  net_log_.EndEvent(NetLogEventType::TRIAL_CERT_VERIFIER_JOB,
+                    [&] { return JobResultParams(is_success); });
+
+  // Reset |parent_| to indicate the Job successfully completed (i.e. it was
+  // not deleted by the TrialComparisonCertVerifier while still waiting for
+  // results).
+  TrialComparisonCertVerifier* parent = parent_;
+  parent_ = nullptr;
+
+  // Invoking the report callback may result in the
+  // TrialComparisonCertVerifier being deleted, which will delete this Job.
+  // Guard against this by grabbing a WeakPtr to |this|.
+  base::WeakPtr<Job> weak_this = weak_factory_.GetWeakPtr();
+  if (!is_success) {
+    parent->report_callback_.Run(
+        params_.hostname(), params_.certificate(), config_.enable_rev_checking,
+        config_.require_rev_checking_local_anchors,
+        config_.enable_sha1_local_anchors, config_.disable_symantec_enforcement,
+        primary_result_, trial_result_);
+  }
+
+  if (weak_this) {
+    // If the Job is still alive, delete it now.
+    parent->RemoveJob(this);
+    return;
+  }
+}
+
+void TrialComparisonCertVerifier::Job::FinishSuccess(
+    TrialComparisonResult result_code) {
+  Finish(/*is_success=*/true, result_code);
+}
+
+void TrialComparisonCertVerifier::Job::FinishWithError() {
+  DCHECK(trial_error_ != primary_error_ ||
+         !CertVerifyResultEqual(trial_result_, primary_result_));
+
+  TrialComparisonResult result_code = kInvalid;
+
+  if (primary_error_ == OK && trial_error_ == OK) {
+    result_code = kBothValidDifferentDetails;
+  } else if (primary_error_ == OK) {
+    result_code = kPrimaryValidSecondaryError;
+  } else if (trial_error_ == OK) {
+    result_code = kPrimaryErrorSecondaryValid;
+  } else {
+    result_code = kBothErrorDifferentDetails;
+  }
+  Finish(/*is_success=*/false, result_code);
+}
+
+void TrialComparisonCertVerifier::Job::OnPrimaryJobCompleted(int result) {
+  base::TimeDelta primary_latency = base::TimeTicks::Now() - primary_start_;
+
+  primary_error_ = result;
+  primary_request_.reset();
+
+  // Notify the original requestor that the primary verification has now
+  // completed. This may result in |this| being deleted (if the associated
+  // TrialComparisonCertVerifier is deleted); to detect this situation, grab
+  // a WeakPtr to |this|.
+  base::WeakPtr<Job> weak_this = weak_factory_.GetWeakPtr();
+  if (request_) {
+    Request* request = request_;
+    request_ = nullptr;
+
+    // Note: May delete |this|.
+    request->OnJobComplete(primary_error_, primary_result_);
+  }
+
+  if (!weak_this)
+    return;
+
+  if (config_changed_ || !parent_->trial_allowed()) {
+    // If the trial will not be run, then delete |this|.
+    parent_->RemoveJob(this);
+    return;
+  }
+
+  // Only record the TrialPrimary histograms for the same set of requests
+  // that TrialSecondary histograms will be recorded for, in order to get a
+  // direct comparison.
+  UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency_TrialPrimary",
+                             primary_latency,
+                             base::TimeDelta::FromMilliseconds(1),
+                             base::TimeDelta::FromMinutes(10), 100);
+
+  trial_start_ = base::TimeTicks::Now();
+  int rv = parent_->trial_verifier()->Verify(
+      params_, &trial_result_,
+      base::BindOnce(&Job::OnTrialJobCompleted, base::Unretained(this)),
+      &trial_request_, net_log_);
+  if (rv != ERR_IO_PENDING)
+    OnTrialJobCompleted(rv);  // Note: May delete |this|.
+}
+
+void TrialComparisonCertVerifier::Job::OnTrialJobCompleted(int result) {
+  DCHECK(primary_result_.verified_cert);
+  DCHECK(trial_result_.verified_cert);
+
+  base::TimeDelta latency = base::TimeTicks::Now() - trial_start_;
+  trial_error_ = result;
+
+  UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency_TrialSecondary",
+                             latency, base::TimeDelta::FromMilliseconds(1),
+                             base::TimeDelta::FromMinutes(10), 100);
+
+  bool errors_equal = trial_error_ == primary_error_;
+  bool details_equal = CertVerifyResultEqual(trial_result_, primary_result_);
+  bool trial_success = errors_equal && details_equal;
+
+  if (trial_success) {
+    // Note: Will delete |this|.
+    FinishSuccess(kEqual);
+    return;
+  }
+
+#if defined(OS_MACOSX)
+  if (primary_error_ == ERR_CERT_REVOKED && !config_.enable_rev_checking &&
+      !(primary_result_.cert_status & CERT_STATUS_REV_CHECKING_ENABLED) &&
+      !(trial_result_.cert_status &
+        (CERT_STATUS_REVOKED | CERT_STATUS_REV_CHECKING_ENABLED))) {
+    if (config_changed_) {
+      // Note: Will delete |this|.
+      FinishSuccess(kIgnoredConfigurationChanged);
+      return;
+    }
+
+    // CertVerifyProcMac does some revocation checking even if we didn't want
+    // it. Try verifying with the trial verifier with revocation checking
+    // enabled, see if it then returns REVOKED.
+    int rv = parent_->revocation_trial_verifier()->Verify(
+        params_, &reverification_result_,
+        base::BindOnce(&Job::OnMacRevCheckingReverificationJobCompleted,
+                       base::Unretained(this)),
+        &reverification_request_, net_log_);
+    if (rv != ERR_IO_PENDING) {
+      // Note: May delete |this|.
+      OnMacRevCheckingReverificationJobCompleted(rv);
+    }
+    return;
+  }
+#endif
+
+  const bool chains_equal = primary_result_.verified_cert->EqualsIncludingChain(
+      trial_result_.verified_cert.get());
+
+  if (!chains_equal && (trial_error_ == OK || primary_error_ != OK)) {
+    if (config_changed_) {
+      // Note: Will delete |this|.
+      FinishSuccess(kIgnoredConfigurationChanged);
+      return;
+    }
+
+    // Chains were different, reverify the trial_result_.verified_cert chain
+    // using the platform verifier and compare results again.
+    RequestParams reverification_params(
+        trial_result_.verified_cert, params_.hostname(), params_.flags(),
+        params_.ocsp_response(), params_.sct_list());
+
+    int rv = parent_->primary_reverifier()->Verify(
+        reverification_params, &reverification_result_,
+        base::BindOnce(&Job::OnPrimaryReverifyWithSecondaryChainCompleted,
+                       base::Unretained(this)),
+        &reverification_request_, net_log_);
+    if (rv != ERR_IO_PENDING) {
+      // Note: May delete |this|.
+      OnPrimaryReverifyWithSecondaryChainCompleted(rv);
+    }
+    return;
+  }
+
+  TrialComparisonResult ignorable_difference =
+      IsSynchronouslyIgnorableDifference(primary_error_, primary_result_,
+                                         trial_error_, trial_result_);
+  if (ignorable_difference != kInvalid) {
+    FinishSuccess(ignorable_difference);  // Note: Will delete |this|.
+    return;
+  }
+
+  FinishWithError();  // Note: Will delete |this|.
+}
+
+#if defined(OS_MACOSX)
+void TrialComparisonCertVerifier::Job::
+    OnMacRevCheckingReverificationJobCompleted(int result) {
+  if (result == ERR_CERT_REVOKED) {
+    // Will delete |this|.
+    FinishSuccess(kIgnoredMacUndesiredRevocationChecking);
+    return;
+  }
+  FinishWithError();  // Note: Will delete |this|.
+}
+#endif
+
+void TrialComparisonCertVerifier::Job::
+    OnPrimaryReverifyWithSecondaryChainCompleted(int result) {
+  if (result == trial_error_ &&
+      CertVerifyResultEqual(reverification_result_, trial_result_)) {
+    // The new result matches the builtin verifier, so this was just a
+    // difference in the platform's path-building ability.
+    // Ignore the difference.
+    //
+    // Note: Will delete |this|.
+    FinishSuccess(kIgnoredDifferentPathReVerifiesEquivalent);
+    return;
+  }
+
+  if (IsSynchronouslyIgnorableDifference(result, reverification_result_,
+                                         trial_error_,
+                                         trial_result_) != kInvalid) {
+    // The new result matches if ignoring differences. Still use the
+    // |kIgnoredDifferentPathReVerifiesEquivalent| code rather than the result
+    // of IsSynchronouslyIgnorableDifference, since it's the higher level
+    // description of what the difference is in this case.
+    //
+    // Note: Will delete |this|.
+    FinishSuccess(kIgnoredDifferentPathReVerifiesEquivalent);
+    return;
+  }
+
+  // Note: Will delete |this|.
+  FinishWithError();
+}
+
+TrialComparisonCertVerifier::TrialComparisonResult
+TrialComparisonCertVerifier::Job::IsSynchronouslyIgnorableDifference(
+    int primary_error,
+    const CertVerifyResult& primary_result,
+    int trial_error,
+    const CertVerifyResult& trial_result) {
+  DCHECK(primary_result.verified_cert);
+  DCHECK(trial_result.verified_cert);
+
+  if (primary_error == OK &&
+      primary_result.verified_cert->intermediate_buffers().empty()) {
+    // Platform may support trusting a leaf certificate directly. Builtin
+    // verifier does not. See https://crbug.com/814994.
+    return kIgnoredLocallyTrustedLeaf;
+  }
+
+  const bool chains_equal = primary_result.verified_cert->EqualsIncludingChain(
+      trial_result.verified_cert.get());
+
+  if (chains_equal && (trial_result.cert_status & CERT_STATUS_IS_EV) &&
+      !(primary_result.cert_status & CERT_STATUS_IS_EV) &&
+      (primary_error == trial_error)) {
+    // The platform CertVerifyProc impls only check a single potential EV
+    // policy from the leaf.  If the leaf had multiple policies, builtin
+    // verifier may verify it as EV when the platform verifier did not.
+    if (CertHasMultipleEVPoliciesAndOneMatchesRoot(
+            trial_result.verified_cert.get())) {
+      return kIgnoredMultipleEVPoliciesAndOneMatchesRoot;
+    }
+  }
+  return kInvalid;
+}
+
+TrialComparisonCertVerifier::Job::Request::Request(
+    TrialComparisonCertVerifier::Job* parent,
+    CertVerifyResult* client_result,
+    CompletionOnceCallback client_callback)
+    : parent_(parent),
+      client_result_(client_result),
+      client_callback_(std::move(client_callback)) {}
+
+TrialComparisonCertVerifier::Job::Request::~Request() {
+  if (parent_)
+    parent_->DetachRequest();
+}
+
+void TrialComparisonCertVerifier::Job::Request::OnJobComplete(
+    int result,
+    const CertVerifyResult& verify_result) {
+  DCHECK(parent_);
+  parent_ = nullptr;
+
+  *client_result_ = verify_result;
+
+  // DANGER: |this| may be deleted when this callback is run (as well as
+  // |parent_|, but that's been reset above).
+  std::move(client_callback_).Run(result);
+}
+
+void TrialComparisonCertVerifier::Job::Request::OnJobAborted() {
+  DCHECK(parent_);
+  parent_ = nullptr;
+}
+
 TrialComparisonCertVerifier::TrialComparisonCertVerifier(
-    bool initial_allowed,
     scoped_refptr<CertVerifyProc> primary_verify_proc,
     scoped_refptr<CertVerifyProc> trial_verify_proc,
     ReportCallback report_callback)
-    : allowed_(initial_allowed),
-      report_callback_(report_callback),
+    : report_callback_(std::move(report_callback)),
       primary_verifier_(
-          MultiThreadedCertVerifier::CreateForDualVerificationTrial(
-              primary_verify_proc,
-              // Unretained is safe since the callback won't be called after
-              // |primary_verifier_| is destroyed.
-              base::BindRepeating(
-                  &TrialComparisonCertVerifier::OnPrimaryVerifierComplete,
-                  base::Unretained(this)),
-              true /* should_record_histograms */)),
+          std::make_unique<MultiThreadedCertVerifier>(primary_verify_proc)),
       primary_reverifier_(
           std::make_unique<MultiThreadedCertVerifier>(primary_verify_proc)),
-      trial_verifier_(MultiThreadedCertVerifier::CreateForDualVerificationTrial(
-          trial_verify_proc,
-          // Unretained is safe since the callback won't be called after
-          // |trial_verifier_| is destroyed.
-          base::BindRepeating(
-              &TrialComparisonCertVerifier::OnTrialVerifierComplete,
-              base::Unretained(this)),
-          false /* should_record_histograms */)),
+      trial_verifier_(
+          std::make_unique<MultiThreadedCertVerifier>(trial_verify_proc)),
       revocation_trial_verifier_(
-          MultiThreadedCertVerifier::CreateForDualVerificationTrial(
-              trial_verify_proc,
-              // Unretained is safe since the callback won't be called after
-              // |trial_verifier_| is destroyed.
-              base::BindRepeating(
-                  &TrialComparisonCertVerifier::OnTrialVerifierComplete,
-                  base::Unretained(this)),
-              false /* should_record_histograms */)) {
+          std::make_unique<MultiThreadedCertVerifier>(trial_verify_proc)) {
   CertVerifier::Config config;
   config.enable_rev_checking = true;
   revocation_trial_verifier_->SetConfig(config);
@@ -430,8 +657,17 @@
                                         const NetLogWithSource& net_log) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  return primary_verifier_->Verify(params, verify_result, std::move(callback),
-                                   out_req, net_log);
+  if (!trial_allowed()) {
+    return primary_verifier_->Verify(params, verify_result, std::move(callback),
+                                     out_req, net_log);
+  }
+
+  std::unique_ptr<Job> job =
+      std::make_unique<Job>(config_, params, net_log, this);
+  Job* job_ptr = job.get();
+  jobs_.insert(std::move(job));
+
+  return job_ptr->Start(verify_result, std::move(callback), out_req);
 }
 
 void TrialComparisonCertVerifier::SetConfig(const Config& config) {
@@ -452,62 +688,9 @@
   }
 }
 
-void TrialComparisonCertVerifier::OnPrimaryVerifierComplete(
-    const RequestParams& params,
-    const NetLogWithSource& net_log,
-    int primary_error,
-    const CertVerifyResult& primary_result,
-    base::TimeDelta primary_latency,
-    bool is_first_job) {
+void TrialComparisonCertVerifier::RemoveJob(Job* job_ptr) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  if (!trial_allowed())
-    return;
-
-  // Only record the TrialPrimary histograms for the same set of requests
-  // that TrialSecondary histograms will be recorded for, in order to get a
-  // direct comparison.
-  UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency_TrialPrimary",
-                             primary_latency,
-                             base::TimeDelta::FromMilliseconds(1),
-                             base::TimeDelta::FromMinutes(10), 100);
-  if (is_first_job) {
-    UMA_HISTOGRAM_CUSTOM_TIMES(
-        "Net.CertVerifier_First_Job_Latency_TrialPrimary", primary_latency,
-        base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10),
-        100);
-  }
-
-  std::unique_ptr<TrialVerificationJob> job =
-      std::make_unique<TrialVerificationJob>(config_, params, net_log, this,
-                                             primary_error, primary_result);
-  TrialVerificationJob* job_ptr = job.get();
-  jobs_.insert(std::move(job));
-  job_ptr->Start();
-}
-
-void TrialComparisonCertVerifier::OnTrialVerifierComplete(
-    const RequestParams& params,
-    const NetLogWithSource& net_log,
-    int trial_error,
-    const CertVerifyResult& trial_result,
-    base::TimeDelta latency,
-    bool is_first_job) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-
-  UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency_TrialSecondary",
-                             latency, base::TimeDelta::FromMilliseconds(1),
-                             base::TimeDelta::FromMinutes(10), 100);
-  if (is_first_job) {
-    UMA_HISTOGRAM_CUSTOM_TIMES(
-        "Net.CertVerifier_First_Job_Latency_TrialSecondary", latency,
-        base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10),
-        100);
-  }
-}
-
-void TrialComparisonCertVerifier::RemoveJob(TrialVerificationJob* job_ptr) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   auto it = jobs_.find(job_ptr);
   DCHECK(it != jobs_.end());
   jobs_.erase(it);
diff --git a/net/cert/trial_comparison_cert_verifier.h b/net/cert/trial_comparison_cert_verifier.h
index cb04bcd5..5617f2b 100644
--- a/net/cert/trial_comparison_cert_verifier.h
+++ b/net/cert/trial_comparison_cert_verifier.h
@@ -22,6 +22,10 @@
 namespace net {
 class CertVerifyProc;
 
+// TrialComparisonCertVerifier is a CertVerifier that can be used to compare
+// the results between two different CertVerifyProcs. The results are reported
+// back to the caller via a ReportCallback, allowing the caller to further
+// examine the differences.
 class NET_EXPORT TrialComparisonCertVerifier : public CertVerifier {
  public:
   // These values are persisted to logs. Entries should not be renumbered and
@@ -51,8 +55,33 @@
       const net::CertVerifyResult& primary_result,
       const net::CertVerifyResult& trial_result)>;
 
-  TrialComparisonCertVerifier(bool initial_allowed,
-                              scoped_refptr<CertVerifyProc> primary_verify_proc,
+  // Create a new TrialComparisonCertVerifier. Initially, no trial
+  // verifications will actually be performed; that is, calls to Verify() will
+  // be dispatched to the underlying |primary_verify_proc|. This can be changed
+  // by calling set_trial_allowed().
+  //
+  // When trial verifications are enabled, calls to Verify() will first call
+  // into |primary_verify_proc| to verify. The result of this verification will
+  // be immediately returned to the caller of Verify, allowing them to proceed.
+  // However, the verifier will continue in the background, attempting to
+  // verify the same RequestParams using |trial_verify_proc|. If there are
+  // differences in the results, they will be reported via |report_callback|,
+  // allowing the creator to receive information about differences.
+  //
+  // If the caller abandons the CertVerifier::Request prior to the primary
+  // verification completed, no trial verification will be done. However, once
+  // the primary verifier has returned, the trial verifications will continue,
+  // provided that the underlying configuration has not been changed by
+  // calling SetConfig().
+  //
+  // Note that there may be multiple calls to both |primary_verify_proc| and
+  // |trial_verify_proc|, using different parameters to account for platform
+  // differences.
+  //
+  // TODO(rsleevi): Make the types distinct, to guarantee that
+  // |primary_verify_proc| is a System CertVerifyProc, and |trial_verify_proc|
+  // is the Builtin CertVerifyProc.
+  TrialComparisonCertVerifier(scoped_refptr<CertVerifyProc> primary_verify_proc,
                               scoped_refptr<CertVerifyProc> trial_verify_proc,
                               ReportCallback report_callback);
 
@@ -69,36 +98,21 @@
              const NetLogWithSource& net_log) override;
   void SetConfig(const Config& config) override;
 
-  // Returns a CertVerifier using the primary CertVerifyProc, which will not
-  // cause OnPrimaryVerifierComplete to be called. This can be used to
-  // attempt to re-verify a cert with different chain or flags without
-  // messing up the stats or potentially causing an infinite loop.
+ private:
+  class Job;
+  friend class Job;
+
+  CertVerifier* primary_verifier() const { return primary_verifier_.get(); }
   CertVerifier* primary_reverifier() const { return primary_reverifier_.get(); }
   CertVerifier* trial_verifier() const { return trial_verifier_.get(); }
   CertVerifier* revocation_trial_verifier() const {
     return revocation_trial_verifier_.get();
   }
 
- private:
-  class TrialVerificationJob;
-
-  void OnPrimaryVerifierComplete(const RequestParams& params,
-                                 const NetLogWithSource& net_log,
-                                 int primary_error,
-                                 const CertVerifyResult& primary_result,
-                                 base::TimeDelta primary_latency,
-                                 bool is_first_job);
-  void OnTrialVerifierComplete(const RequestParams& params,
-                               const NetLogWithSource& net_log,
-                               int trial_error,
-                               const CertVerifyResult& trial_result,
-                               base::TimeDelta latency,
-                               bool is_first_job);
-
-  void RemoveJob(TrialVerificationJob* job_ptr);
+  void RemoveJob(Job* job_ptr);
 
   // Whether the trial is allowed.
-  bool allowed_;
+  bool allowed_ = false;
   // Callback that reports are sent to.
   ReportCallback report_callback_;
 
@@ -111,8 +125,7 @@
   // revocation information.
   std::unique_ptr<CertVerifier> revocation_trial_verifier_;
 
-  std::set<std::unique_ptr<TrialVerificationJob>, base::UniquePtrComparator>
-      jobs_;
+  std::set<std::unique_ptr<Job>, base::UniquePtrComparator> jobs_;
 
   THREAD_CHECKER(thread_checker_);
 
diff --git a/net/cert/trial_comparison_cert_verifier_unittest.cc b/net/cert/trial_comparison_cert_verifier_unittest.cc
index 148fffef..6c053b0 100644
--- a/net/cert/trial_comparison_cert_verifier_unittest.cc
+++ b/net/cert/trial_comparison_cert_verifier_unittest.cc
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "build/build_config.h"
@@ -109,6 +110,7 @@
         main_task_runner_(base::SequencedTaskRunnerHandle::Get()) {}
 
   void WaitForVerifyCall() { verify_called_.WaitForResult(); }
+  int num_verifications() const { return num_verifications_; }
 
   // CertVerifyProc implementation:
   bool SupportsAdditionalTrustAnchors() const override { return false; }
@@ -126,8 +128,12 @@
                      const CertificateList& additional_trust_anchors,
                      CertVerifyResult* verify_result) override;
 
+  // Runs on the main thread
+  void VerifyCalled();
+
   const int result_error_;
   const CertVerifyResult result_;
+  int num_verifications_ = 0;
   RepeatedTestClosure verify_called_;
   scoped_refptr<base::TaskRunner> main_task_runner_;
 
@@ -144,10 +150,16 @@
     const CertificateList& additional_trust_anchors,
     CertVerifyResult* verify_result) {
   *verify_result = result_;
-  main_task_runner_->PostTask(FROM_HERE, verify_called_.closure());
+  main_task_runner_->PostTask(
+      FROM_HERE, base::Bind(&FakeCertVerifyProc::VerifyCalled, this));
   return result_error_;
 }
 
+void FakeCertVerifyProc::VerifyCalled() {
+  ++num_verifications_;
+  verify_called_.closure().Run();
+}
+
 // Fake CertVerifyProc that causes a failure if it is called.
 class NotCalledCertVerifyProc : public CertVerifyProc {
  public:
@@ -282,11 +294,10 @@
   CertVerifyResult dummy_result;
   dummy_result.verified_cert = cert_chain_1_;
 
+  auto verify_proc = base::MakeRefCounted<FakeCertVerifyProc>(OK, dummy_result);
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      false /* initial_allowed */,
-      base::MakeRefCounted<FakeCertVerifyProc>(OK, dummy_result),
-      base::MakeRefCounted<NotCalledCertVerifyProc>(),
+      verify_proc, base::MakeRefCounted<NotCalledCertVerifyProc>(),
       base::BindRepeating(&RecordTrialReport, &reports));
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -300,7 +311,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   RunUntilIdle();
 
@@ -308,7 +319,7 @@
   EXPECT_TRUE(reports.empty());
 
   // Primary verifier should have ran, trial verifier should not have.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 0);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                0);
@@ -347,7 +358,7 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      false /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
 
   CertVerifier::RequestParams params(leaf, "t0.test", /*flags=*/0,
@@ -361,7 +372,7 @@
   ASSERT_THAT(error, IsError(ERR_IO_PENDING));
   EXPECT_TRUE(request);
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   // Enable the trial and do another verification.
   verifier.set_trial_allowed(true);
@@ -377,13 +388,14 @@
   EXPECT_TRUE(request2);
 
   error = callback2.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
 
   // Primary verifier should have run twice, trial verifier should run once.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2);
+  EXPECT_EQ(2, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -429,8 +441,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf, "t0.test", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -443,7 +456,7 @@
   ASSERT_THAT(error, IsError(ERR_IO_PENDING));
   EXPECT_TRUE(request);
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   // Disable the trial and do another verification.
   verifier.set_trial_allowed(false);
@@ -459,13 +472,14 @@
   EXPECT_TRUE(request2);
 
   error = callback2.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
 
   // Primary verifier should have run twice, trial verifier should run once.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2);
+  EXPECT_EQ(2, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -488,9 +502,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1,
-      base::MakeRefCounted<NotCalledCertVerifyProc>(),
+      verify_proc1, base::MakeRefCounted<NotCalledCertVerifyProc>(),
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -509,12 +523,12 @@
   verifier.SetConfig(config);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   RunUntilIdle();
 
   // Since the config changed, trial verifier should not run.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 0);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                0);
@@ -540,8 +554,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -555,7 +570,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   // Change the verifier config during the trial verification.
   CertVerifier::Config config;
@@ -566,13 +581,11 @@
 
   // Since the config was the same when both primary and trial verification
   // started, the result should still be reported.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
-  // CertVerifier_Job_Latency_TrialSecondary is not recorded due to
-  // MultiThreadedCertVerifier's config_id_ check before calling the
-  // verify_complete_callback_.
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
-                               0);
+                               1);
   histograms_.ExpectUniqueSample(
       "Net.CertVerifier_TrialComparisonResult",
       TrialComparisonCertVerifier::kPrimaryValidSecondaryError, 1);
@@ -595,8 +608,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -610,7 +624,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -618,7 +632,8 @@
   // Expect no report.
   EXPECT_TRUE(reports.empty());
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -642,8 +657,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -680,7 +696,8 @@
   EXPECT_FALSE(report.enable_sha1_local_anchors);
   EXPECT_FALSE(report.disable_symantec_enforcement);
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -705,8 +722,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -720,7 +738,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -738,7 +756,8 @@
       cert_chain_1_.get()));
   EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get()));
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -766,8 +785,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -799,7 +819,8 @@
       cert_chain_1_.get()));
   EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get()));
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -824,8 +845,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -839,7 +861,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -857,11 +879,10 @@
       cert_chain_2_.get()));
   EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get()));
 
-  // Main CertVerifier_Job_Latency should have 2 counts since the
-  // primary_reverifier was used.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2);
-  // CertVerifier_Job_Latency_TrialPrimary only has 1 count since
-  // primary_reverifier doesn't use the same CertVerifier.
+  // The primary verifier should be used twice (first with the initial chain,
+  // then with the results of the trial verifier).
+  EXPECT_EQ(2, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -871,6 +892,66 @@
 }
 
 TEST_F(TrialComparisonCertVerifierTest,
+       DifferentVerifiedChainsAndConfigHasChanged) {
+  // Primary verifier returns chain1 regardless of arguments.
+  CertVerifyResult primary_result;
+  primary_result.verified_cert = cert_chain_1_;
+  scoped_refptr<FakeCertVerifyProc> verify_proc1 =
+      base::MakeRefCounted<FakeCertVerifyProc>(ERR_CERT_REVOKED,
+                                               primary_result);
+
+  // Trial verifier returns a different verified cert chain.
+  CertVerifyResult secondary_result;
+  secondary_result.verified_cert = cert_chain_2_;
+  scoped_refptr<FakeCertVerifyProc> verify_proc2 =
+      base::MakeRefCounted<FakeCertVerifyProc>(OK, secondary_result);
+
+  std::vector<TrialReportInfo> reports;
+  TrialComparisonCertVerifier verifier(
+      verify_proc1, verify_proc2,
+      base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
+
+  CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
+                                     /*ocsp_response=*/std::string(),
+                                     /*sct_list=*/std::string());
+  CertVerifyResult result;
+  TestCompletionCallback callback;
+  std::unique_ptr<CertVerifier::Request> request;
+  int error = verifier.Verify(params, &result, callback.callback(), &request,
+                              NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request);
+
+  error = callback.WaitForResult();
+  EXPECT_THAT(error, IsError(ERR_CERT_REVOKED));
+
+  // Change the configuration. The trial verification should complete, but
+  // the difference in verified chains should prevent a trial reverification.
+  CertVerifier::Config config;
+  config.enable_sha1_local_anchors = true;
+  verifier.SetConfig(config);
+
+  verify_proc2->WaitForVerifyCall();
+  RunUntilIdle();
+
+  // Expect no report, since the configuration changed and the primary
+  // verifier could not be used to retry.
+  ASSERT_EQ(0U, reports.size());
+
+  // The primary verifier should only be used once, as the configuration
+  // changes after the trial verification is started.
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
+  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
+  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
+                               1);
+  histograms_.ExpectUniqueSample(
+      "Net.CertVerifier_TrialComparisonResult",
+      TrialComparisonCertVerifier::kIgnoredConfigurationChanged, 1);
+}
+
+TEST_F(TrialComparisonCertVerifierTest,
        BothVerifiersOkDifferentVerifiedChainsEqualAfterReverification) {
   CertVerifyResult chain1_result;
   chain1_result.verified_cert = cert_chain_1_;
@@ -882,11 +963,11 @@
   // Primary verifier returns ok status and chain1 if verifying the leaf alone.
   EXPECT_CALL(*verify_proc1,
               VerifyInternal(leaf_cert_1_.get(), _, _, _, _, _, _, _))
-      .WillRepeatedly(DoAll(SetArgPointee<7>(chain1_result), Return(OK)));
+      .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(), _, _, _, _, _, _, _))
-      .WillRepeatedly(DoAll(SetArgPointee<7>(chain2_result), Return(OK)));
+      .WillOnce(DoAll(SetArgPointee<7>(chain2_result), Return(OK)));
 
   // Trial verifier returns ok status and chain2.
   scoped_refptr<FakeCertVerifyProc> verify_proc2 =
@@ -894,8 +975,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -909,7 +991,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -917,11 +999,8 @@
   // Expect no report.
   EXPECT_TRUE(reports.empty());
 
-  // Main CertVerifier_Job_Latency should have 2 counts since the
-  // primary_reverifier was used.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2);
-  // CertVerifier_Job_Latency_TrialPrimary only has 1 count since
-  // primary_reverifier doesn't use the same CertVerifier.
+  testing::Mock::VerifyAndClear(verify_proc1.get());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -984,13 +1063,12 @@
   // Primary verifier returns ok status and different_chain if verifying leaf
   // alone.
   EXPECT_CALL(*verify_proc1, VerifyInternal(leaf.get(), _, _, _, _, _, _, _))
-      .WillRepeatedly(
-          DoAll(SetArgPointee<7>(different_chain_result), Return(OK)));
+      .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(), _, _, _, _, _, _, _))
-      .WillRepeatedly(DoAll(SetArgPointee<7>(nonev_chain_result), Return(OK)));
+      .WillOnce(DoAll(SetArgPointee<7>(nonev_chain_result), Return(OK)));
 
   // Trial verifier returns ok status and ev_chain_result.
   scoped_refptr<FakeCertVerifyProc> verify_proc2 =
@@ -998,8 +1076,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf, "test.example", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1013,7 +1092,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -1021,11 +1100,10 @@
   // Expect no report.
   EXPECT_TRUE(reports.empty());
 
-  // Main CertVerifier_Job_Latency should have 2 counts since the
-  // primary_reverifier was used.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 2);
-  // CertVerifier_Job_Latency_TrialPrimary only has 1 count since
-  // primary_reverifier doesn't use the same CertVerifier.
+  // Primary verifier should be used twice, the second time with the chain
+  // from the trial verifier.
+  testing::Mock::VerifyAndClear(verify_proc1.get());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -1051,8 +1129,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::Config config;
   config.enable_rev_checking = true;
@@ -1071,7 +1150,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -1095,7 +1174,8 @@
       cert_chain_1_.get()));
   EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get()));
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -1104,82 +1184,6 @@
       TrialComparisonCertVerifier::kBothValidDifferentDetails, 1);
 }
 
-TEST_F(TrialComparisonCertVerifierTest, Coalescing) {
-  // Primary verifier returns an error status.
-  CertVerifyResult primary_result;
-  primary_result.verified_cert = cert_chain_1_;
-  primary_result.cert_status = CERT_STATUS_DATE_INVALID;
-  scoped_refptr<FakeCertVerifyProc> verify_proc1 =
-      base::MakeRefCounted<FakeCertVerifyProc>(ERR_CERT_DATE_INVALID,
-                                               primary_result);
-
-  // Trial verifier has ok status.
-  CertVerifyResult secondary_result;
-  secondary_result.verified_cert = cert_chain_1_;
-  scoped_refptr<FakeCertVerifyProc> verify_proc2 =
-      base::MakeRefCounted<FakeCertVerifyProc>(OK, secondary_result);
-
-  std::vector<TrialReportInfo> reports;
-  TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
-      base::BindRepeating(&RecordTrialReport, &reports));
-
-  CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
-                                     /*ocsp_response=*/std::string(),
-                                     /*sct_list=*/std::string());
-
-  // Start first verification request.
-  CertVerifyResult result_1;
-  std::unique_ptr<CertVerifier::Request> request_1;
-  TestCompletionCallback callback_1;
-  int error = verifier.Verify(params, &result_1, callback_1.callback(),
-                              &request_1, NetLogWithSource());
-  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request_1);
-
-  // Start second verification request with same params.
-  CertVerifyResult result_2;
-  std::unique_ptr<CertVerifier::Request> request_2;
-  TestCompletionCallback callback_2;
-  error = verifier.Verify(params, &result_2, callback_2.callback(), &request_2,
-                          NetLogWithSource());
-  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
-  EXPECT_TRUE(request_2);
-
-  // Both callbacks should be called with same error code.
-  error = callback_1.WaitForResult();
-  EXPECT_THAT(error, IsError(ERR_CERT_DATE_INVALID));
-  error = callback_2.WaitForResult();
-  EXPECT_THAT(error, IsError(ERR_CERT_DATE_INVALID));
-
-  // Trial verifier should run.
-  verify_proc2->WaitForVerifyCall();
-  RunUntilIdle();
-
-  // Expect a single report.
-  ASSERT_EQ(1U, reports.size());
-  const TrialReportInfo& report = reports[0];
-
-  EXPECT_EQ(CERT_STATUS_DATE_INVALID, report.primary_result.cert_status);
-  EXPECT_EQ(0U, report.trial_result.cert_status);
-
-  EXPECT_TRUE(report.primary_result.verified_cert->EqualsIncludingChain(
-      cert_chain_1_.get()));
-  EXPECT_TRUE(report.trial_result.verified_cert->EqualsIncludingChain(
-      cert_chain_1_.get()));
-  EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get()));
-
-  // Only one verification should be done by primary verifier.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
-  // Only one verification should be done by secondary verifier.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
-                               1);
-  histograms_.ExpectUniqueSample(
-      "Net.CertVerifier_TrialComparisonResult",
-      TrialComparisonCertVerifier::kPrimaryErrorSecondaryValid, 1);
-}
-
 TEST_F(TrialComparisonCertVerifierTest, CancelledDuringPrimaryVerification) {
   // Primary verifier returns an error status.
   CertVerifyResult primary_result;
@@ -1197,8 +1201,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1234,7 +1239,8 @@
       cert_chain_1_.get()));
   EXPECT_TRUE(report.unverified_cert->EqualsIncludingChain(leaf_cert_1_.get()));
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -1254,9 +1260,9 @@
 
   std::vector<TrialReportInfo> reports;
   auto verifier = std::make_unique<TrialComparisonCertVerifier>(
-      true /* initial_allowed */, verify_proc1,
-      base::MakeRefCounted<NotCalledCertVerifyProc>(),
+      verify_proc1, base::MakeRefCounted<NotCalledCertVerifyProc>(),
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier->set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1282,14 +1288,135 @@
   // Expect no report.
   EXPECT_TRUE(reports.empty());
 
-  // Histograms should not be recorded.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 0);
+  // The trial verifier should never be called, nor histograms recorded.
+  EXPECT_EQ(1, verify_proc1->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 0);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                0);
   histograms_.ExpectTotalCount("Net.CertVerifier_TrialComparisonResult", 0);
 }
 
+TEST_F(TrialComparisonCertVerifierTest, DeletedDuringVerificationResult) {
+  // Primary verifier returns an error status.
+  CertVerifyResult primary_result;
+  primary_result.verified_cert = cert_chain_1_;
+  primary_result.cert_status = CERT_STATUS_DATE_INVALID;
+  scoped_refptr<FakeCertVerifyProc> verify_proc1 =
+      base::MakeRefCounted<FakeCertVerifyProc>(ERR_CERT_DATE_INVALID,
+                                               primary_result);
+
+  std::vector<TrialReportInfo> reports;
+  auto verifier = std::make_unique<TrialComparisonCertVerifier>(
+      verify_proc1, base::MakeRefCounted<NotCalledCertVerifyProc>(),
+      base::BindRepeating(&RecordTrialReport, &reports));
+  verifier->set_trial_allowed(true);
+
+  CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
+                                     /*ocsp_response=*/std::string(),
+                                     /*sct_list=*/std::string());
+  CertVerifyResult result;
+  TestCompletionCallback callback;
+  std::unique_ptr<CertVerifier::Request> request;
+  int error = verifier->Verify(
+      params, &result,
+      base::BindLambdaForTesting([&callback, &verifier](int result) {
+        // Delete the verifier while processing the result. This should not
+        // start a trial verification.
+        verifier.reset();
+        callback.callback().Run(result);
+      }),
+      &request, NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request);
+
+  // Wait for primary verifier to finish.
+  error = callback.WaitForResult();
+  EXPECT_THAT(error, IsError(ERR_CERT_DATE_INVALID));
+
+  // The callback to the trial verifier does not run. No verification task
+  // should start, as the verifier was deleted before the trial verification
+  // was started.
+
+  // Wait for any tasks to finish.
+  RunUntilIdle();
+
+  // Expect no report.
+  EXPECT_TRUE(reports.empty());
+
+  // Histograms for the primary or trial verification should not be recorded,
+  // as the trial verification was cancelled by deleting the verifier.
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 0);
+  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
+                               0);
+  histograms_.ExpectTotalCount("Net.CertVerifier_TrialComparisonResult", 0);
+}
+
+TEST_F(TrialComparisonCertVerifierTest, DeletedDuringTrialReport) {
+  // Primary verifier returns an error status.
+  CertVerifyResult primary_result;
+  primary_result.verified_cert = cert_chain_1_;
+  primary_result.cert_status = CERT_STATUS_DATE_INVALID;
+  scoped_refptr<FakeCertVerifyProc> verify_proc1 =
+      base::MakeRefCounted<FakeCertVerifyProc>(ERR_CERT_DATE_INVALID,
+                                               primary_result);
+
+  // Trial verifier has ok status.
+  CertVerifyResult secondary_result;
+  secondary_result.verified_cert = cert_chain_1_;
+  scoped_refptr<FakeCertVerifyProc> verify_proc2 =
+      base::MakeRefCounted<FakeCertVerifyProc>(OK, secondary_result);
+
+  bool was_report_callback_called = false;
+  std::unique_ptr<TrialComparisonCertVerifier> verifier;
+  verifier = std::make_unique<TrialComparisonCertVerifier>(
+      verify_proc1, verify_proc2,
+      base::BindLambdaForTesting(
+          [&verifier, &was_report_callback_called](
+              const std::string& hostname,
+              const scoped_refptr<X509Certificate>& unverified_cert,
+              bool enable_rev_checking, bool require_rev_checking_local_anchors,
+              bool enable_sha1_local_anchors, bool disable_symantec_enforcement,
+              const net::CertVerifyResult& primary_result,
+              const net::CertVerifyResult& trial_result) {
+            // During processing of a report, delete the underlying verifier.
+            // This should not cause any issues.
+            was_report_callback_called = true;
+            verifier.reset();
+          }));
+  verifier->set_trial_allowed(true);
+
+  CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
+                                     /*ocsp_response=*/std::string(),
+                                     /*sct_list=*/std::string());
+  CertVerifyResult result;
+  TestCompletionCallback callback;
+  std::unique_ptr<CertVerifier::Request> request;
+  int error = verifier->Verify(params, &result, callback.callback(), &request,
+                               NetLogWithSource());
+  ASSERT_THAT(error, IsError(ERR_IO_PENDING));
+  EXPECT_TRUE(request);
+
+  // The callback should be notified of the primary result.
+  ASSERT_THAT(callback.WaitForResult(), IsError(ERR_CERT_DATE_INVALID));
+
+  // Wait for the verification task to complete in the background. This
+  // should ultimately call the ReportCallback that will delete the
+  // verifier.
+  RunUntilIdle();
+
+  EXPECT_TRUE(was_report_callback_called);
+
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
+  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
+  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
+                               1);
+  histograms_.ExpectUniqueSample(
+      "Net.CertVerifier_TrialComparisonResult",
+      TrialComparisonCertVerifier::kPrimaryErrorSecondaryValid, 1);
+}
+
 TEST_F(TrialComparisonCertVerifierTest, DeletedAfterTrialVerificationStarted) {
   // Primary verifier returns an error status.
   CertVerifyResult primary_result;
@@ -1307,8 +1434,9 @@
 
   std::vector<TrialReportInfo> reports;
   auto verifier = std::make_unique<TrialComparisonCertVerifier>(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier->set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1340,7 +1468,8 @@
   // Expect no report.
   EXPECT_TRUE(reports.empty());
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   // Histograms for trial verifier should not be recorded.
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
@@ -1365,19 +1494,24 @@
       base::MakeRefCounted<MockCertVerifyProc>();
   // Secondary verifier returns ok status...
   EXPECT_CALL(*verify_proc2, VerifyInternal(_, _, _, _, _, _, _, _))
-      .WillRepeatedly(DoAll(SetArgPointee<7>(ok_result), Return(OK)));
-  // ...unless it was called with REV_CHECKING_ENABLED.
+      .WillOnce(DoAll(SetArgPointee<7>(ok_result), Return(OK)));
+
+#if defined(OS_MACOSX)
+  // The secondary should have been called twice on Mac due to attempting
+  // the kIgnoredMacUndesiredRevocationCheckingWorkaround.
   EXPECT_CALL(
       *verify_proc2,
       VerifyInternal(_, _, _, _, CertVerifyProc::VERIFY_REV_CHECKING_ENABLED, _,
                      _, _))
-      .WillRepeatedly(
+      .WillOnce(
           DoAll(SetArgPointee<7>(revoked_result), Return(ERR_CERT_REVOKED)));
+#endif
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1395,27 +1529,25 @@
 
   RunUntilIdle();
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  testing::Mock::VerifyAndClear(verify_proc2.get());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
+  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
+                               1);
 #if defined(OS_MACOSX)
   // Expect no report.
   EXPECT_EQ(0U, reports.size());
 
-  // Secondary should have been called twice
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
-                               2);
   histograms_.ExpectUniqueSample(
       "Net.CertVerifier_TrialComparisonResult",
       TrialComparisonCertVerifier::kIgnoredMacUndesiredRevocationChecking, 1);
 #else
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
-                               1);
+  // Expect a report.
+  EXPECT_EQ(1U, reports.size());
+
   histograms_.ExpectUniqueSample(
       "Net.CertVerifier_TrialComparisonResult",
       TrialComparisonCertVerifier::kPrimaryErrorSecondaryValid, 1);
-
-  // Expect a report.
-  EXPECT_EQ(1U, reports.size());
 #endif
 }
 
@@ -1437,12 +1569,20 @@
   scoped_refptr<MockCertVerifyProc> verify_proc2 =
       base::MakeRefCounted<MockCertVerifyProc>();
   EXPECT_CALL(*verify_proc2, VerifyInternal(_, _, _, _, _, _, _, _))
+#if defined(OS_MACOSX)
+      // The secondary should have been called twice on Mac due to attempting
+      // the kIgnoredMacUndesiredRevocationCheckingWorkaround.
+      .Times(2)
+#else
+      .Times(1)
+#endif
       .WillRepeatedly(DoAll(SetArgPointee<7>(ok_result), Return(OK)));
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1460,18 +1600,11 @@
 
   RunUntilIdle();
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  testing::Mock::VerifyAndClear(verify_proc2.get());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
-#if defined(OS_MACOSX)
-  // Secondary should have been called twice on mac due to attempting the
-  // kIgnoredMacUndesiredRevocationChecking workaround.
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
-                               2);
-#else
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
-
-#endif
   histograms_.ExpectUniqueSample(
       "Net.CertVerifier_TrialComparisonResult",
       TrialComparisonCertVerifier::kPrimaryErrorSecondaryValid, 1);
@@ -1518,8 +1651,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1533,7 +1667,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -1541,7 +1675,8 @@
   // Expect no report.
   EXPECT_TRUE(reports.empty());
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -1582,8 +1717,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1597,7 +1733,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -1605,7 +1741,8 @@
   // Expect a report.
   ASSERT_EQ(1U, reports.size());
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -1649,8 +1786,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1664,7 +1802,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -1672,7 +1810,8 @@
   // Expect a report.
   ASSERT_EQ(1U, reports.size());
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
@@ -1698,8 +1837,9 @@
 
   std::vector<TrialReportInfo> reports;
   TrialComparisonCertVerifier verifier(
-      true /* initial_allowed */, verify_proc1, verify_proc2,
+      verify_proc1, verify_proc2,
       base::BindRepeating(&RecordTrialReport, &reports));
+  verifier.set_trial_allowed(true);
 
   CertVerifier::RequestParams params(leaf_cert_1_, "127.0.0.1", /*flags=*/0,
                                      /*ocsp_response=*/std::string(),
@@ -1713,7 +1853,7 @@
   EXPECT_TRUE(request);
 
   error = callback.WaitForResult();
-  EXPECT_THAT(error, IsError(OK));
+  EXPECT_THAT(error, IsOk());
 
   verify_proc2->WaitForVerifyCall();
   RunUntilIdle();
@@ -1721,7 +1861,8 @@
   // Expect no report.
   EXPECT_TRUE(reports.empty());
 
-  histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency", 1);
+  EXPECT_EQ(1, verify_proc1->num_verifications());
+  EXPECT_EQ(1, verify_proc2->num_verifications());
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialPrimary", 1);
   histograms_.ExpectTotalCount("Net.CertVerifier_Job_Latency_TrialSecondary",
                                1);
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index 6c2abf8..81b6395a 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -518,11 +518,6 @@
   return change_dispatcher_;
 }
 
-void CookieMonster::SetCookieAccessDelegate(
-    std::unique_ptr<CookieAccessDelegate> delegate) {
-  cookie_access_delegate_ = std::move(delegate);
-}
-
 void CookieMonster::DumpMemoryStats(
     base::trace_event::ProcessMemoryDump* pmd,
     const std::string& parent_absolute_name) const {
@@ -1676,8 +1671,8 @@
 
 CookieAccessSemantics CookieMonster::GetAccessSemanticsForCookie(
     const CanonicalCookie& cookie) const {
-  if (cookie_access_delegate_)
-    return cookie_access_delegate_->GetAccessSemantics(cookie);
+  if (cookie_access_delegate())
+    return cookie_access_delegate()->GetAccessSemantics(cookie);
   return CookieAccessSemantics::UNKNOWN;
 }
 
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h
index e739587..de36d79 100644
--- a/net/cookies/cookie_monster.h
+++ b/net/cookies/cookie_monster.h
@@ -192,10 +192,6 @@
   static const char* const kDefaultCookieableSchemes[];
   static const int kDefaultCookieableSchemesCount;
 
-  // Take ownership of a CookieAccessDelegate.
-  void SetCookieAccessDelegate(
-      std::unique_ptr<CookieAccessDelegate> delegate) override;
-
   void DumpMemoryStats(base::trace_event::ProcessMemoryDump* pmd,
                        const std::string& parent_absolute_name) const override;
 
@@ -628,10 +624,6 @@
 
   bool persist_session_cookies_;
 
-  // Used to determine whether a particular cookie should be subject to legacy
-  // or non-legacy access semantics.
-  std::unique_ptr<CookieAccessDelegate> cookie_access_delegate_;
-
   base::ThreadChecker thread_checker_;
 
   base::WeakPtrFactory<CookieMonster> weak_ptr_factory_{this};
diff --git a/net/cookies/cookie_store.cc b/net/cookies/cookie_store.cc
index 6c31a75..0556a07 100644
--- a/net/cookies/cookie_store.cc
+++ b/net/cookies/cookie_store.cc
@@ -9,6 +9,8 @@
 
 namespace net {
 
+CookieStore::CookieStore() = default;
+
 CookieStore::~CookieStore() = default;
 
 void CookieStore::DeleteAllAsync(DeleteCallback callback) {
@@ -22,7 +24,7 @@
 
 void CookieStore::SetCookieAccessDelegate(
     std::unique_ptr<CookieAccessDelegate> delegate) {
-  // By default, do nothing.
+  cookie_access_delegate_ = std::move(delegate);
 }
 
 void CookieStore::DumpMemoryStats(
diff --git a/net/cookies/cookie_store.h b/net/cookies/cookie_store.h
index ccc3471..102428f 100644
--- a/net/cookies/cookie_store.h
+++ b/net/cookies/cookie_store.h
@@ -54,6 +54,7 @@
   using DeleteCallback = base::OnceCallback<void(uint32_t num_deleted)>;
   using SetCookieableSchemesCallback = base::OnceCallback<void(bool success)>;
 
+  CookieStore();
   virtual ~CookieStore();
 
   // Set the cookie on the cookie store.  |cookie.IsCanonical()| must
@@ -129,12 +130,23 @@
                                     SetCookieableSchemesCallback callback) = 0;
 
   // Transfer ownership of a CookieAccessDelegate.
-  virtual void SetCookieAccessDelegate(
-      std::unique_ptr<CookieAccessDelegate> delegate);
+  void SetCookieAccessDelegate(std::unique_ptr<CookieAccessDelegate> delegate);
 
   // Reports the estimate of dynamically allocated memory in bytes.
   virtual void DumpMemoryStats(base::trace_event::ProcessMemoryDump* pmd,
                                const std::string& parent_absolute_name) const;
+
+ protected:
+  // This may be null if no delegate has been set yet, or the delegate has been
+  // reset to null.
+  const CookieAccessDelegate* cookie_access_delegate() const {
+    return cookie_access_delegate_.get();
+  }
+
+ private:
+  // Used to determine whether a particular cookie should be subject to legacy
+  // or non-legacy access semantics.
+  std::unique_ptr<CookieAccessDelegate> cookie_access_delegate_;
 };
 
 }  // namespace net
diff --git a/services/metrics/ukm_api.md b/services/metrics/ukm_api.md
index eeb7c2b..af637e61 100644
--- a/services/metrics/ukm_api.md
+++ b/services/metrics/ukm_api.md
@@ -254,7 +254,7 @@
 
 ### Local Testing
 
-Build Chromium and run it with '--force-enable-metrics-reporting'. Trigger your event locally and check chrome://ukm to make sure the data was recorded correctly.
+Build Chromium and run it with '--force-enable-metrics-reporting --metrics-upload-interval=N'. You may want some small N if you are interested in seeing behavior when UKM reports are emitted. Trigger your event locally and check chrome://ukm to make sure the data was recorded correctly.
 
 ## Unit Testing
 
diff --git a/services/network/cert_verifier_with_trust_anchors.cc b/services/network/cert_verifier_with_trust_anchors.cc
index 0441894..f307277d 100644
--- a/services/network/cert_verifier_with_trust_anchors.cc
+++ b/services/network/cert_verifier_with_trust_anchors.cc
@@ -11,6 +11,7 @@
 #include "net/base/net_errors.h"
 #include "net/cert/caching_cert_verifier.h"
 #include "net/cert/cert_verify_proc.h"
+#include "net/cert/coalescing_cert_verifier.h"
 #include "net/cert/multi_threaded_cert_verifier.h"
 
 namespace network {
@@ -65,7 +66,8 @@
         << "Additional trust anchors not supported on the current platform!";
   }
   delegate_ = std::make_unique<net::CachingCertVerifier>(
-      std::make_unique<net::MultiThreadedCertVerifier>(verify_proc.get()));
+      std::make_unique<net::CoalescingCertVerifier>(
+          std::make_unique<net::MultiThreadedCertVerifier>(verify_proc.get())));
   delegate_->SetConfig(ExtendTrustAnchors(orig_config_, trust_anchors_));
 }
 
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 4321c306..7e154991 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -42,6 +42,7 @@
 #include "net/base/network_isolation_key.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "net/cert/cert_verifier.h"
+#include "net/cert/coalescing_cert_verifier.h"
 #include "net/cert/ct_verify_result.h"
 #include "net/cert_net/cert_net_fetcher_impl.h"
 #include "net/cookies/cookie_monster.h"
@@ -1541,14 +1542,18 @@
 #elif BUILDFLAG(TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED)
     if (params_->trial_comparison_cert_verifier_params) {
       cert_verifier = std::make_unique<net::CachingCertVerifier>(
-          std::make_unique<TrialComparisonCertVerifierMojo>(
-              params_->trial_comparison_cert_verifier_params->initial_allowed,
-              std::move(params_->trial_comparison_cert_verifier_params
-                            ->config_client_request),
-              std::move(params_->trial_comparison_cert_verifier_params
-                            ->report_client),
-              net::CertVerifyProc::CreateSystemVerifyProc(cert_net_fetcher_),
-              net::CertVerifyProc::CreateBuiltinVerifyProc(cert_net_fetcher_)));
+          std::make_unique<net::CoalescingCertVerifier>(
+              std::make_unique<TrialComparisonCertVerifierMojo>(
+                  params_->trial_comparison_cert_verifier_params
+                      ->initial_allowed,
+                  std::move(params_->trial_comparison_cert_verifier_params
+                                ->config_client_request),
+                  std::move(params_->trial_comparison_cert_verifier_params
+                                ->report_client),
+                  net::CertVerifyProc::CreateSystemVerifyProc(
+                      cert_net_fetcher_),
+                  net::CertVerifyProc::CreateBuiltinVerifyProc(
+                      cert_net_fetcher_))));
     }
 #endif
     if (!cert_verifier)
diff --git a/services/network/trial_comparison_cert_verifier_mojo.cc b/services/network/trial_comparison_cert_verifier_mojo.cc
index a2a6eba..1729b2e8 100644
--- a/services/network/trial_comparison_cert_verifier_mojo.cc
+++ b/services/network/trial_comparison_cert_verifier_mojo.cc
@@ -29,12 +29,13 @@
       report_client_(std::move(report_client)) {
   trial_comparison_cert_verifier_ =
       std::make_unique<net::TrialComparisonCertVerifier>(
-          initial_allowed, primary_verify_proc, trial_verify_proc,
+          primary_verify_proc, trial_verify_proc,
           base::BindRepeating(
               &TrialComparisonCertVerifierMojo::OnSendTrialReport,
               // Unretained safe because the report_callback will not be called
               // after trial_comparison_cert_verifier_ is destroyed.
               base::Unretained(this)));
+  trial_comparison_cert_verifier_->set_trial_allowed(initial_allowed);
 }
 
 TrialComparisonCertVerifierMojo::~TrialComparisonCertVerifierMojo() = default;
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 0bcad6e..868ad5a 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -145,8 +145,7 @@
               ],
               "name": "shard #${SHARD_INDEX} logcats"
             }
-          ],
-          "shards": 10
+          ]
         },
         "test": "android_browsertests"
       },
@@ -194,7 +193,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 10
+          "shards": 20
         },
         "test": "chrome_public_test_apk"
       },
@@ -242,7 +241,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 10
+          "shards": 20
         },
         "test": "content_browsertests"
       },
@@ -290,7 +289,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 10
+          "shards": 5
         },
         "test": "content_shell_test_apk"
       },
@@ -337,7 +336,8 @@
               ],
               "name": "shard #${SHARD_INDEX} logcats"
             }
-          ]
+          ],
+          "shards": 10
         },
         "test": "content_unittests"
       },
@@ -384,7 +384,8 @@
               ],
               "name": "shard #${SHARD_INDEX} logcats"
             }
-          ]
+          ],
+          "shards": 10
         },
         "test": "unit_tests"
       }
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index dd5cf2a..f96c1b7f 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -10526,7 +10526,7 @@
               "os": "Ubuntu-16.04"
             }
           ],
-          "shards": 10
+          "shards": 20
         },
         "test": "content_browsertests"
       },
@@ -10546,7 +10546,8 @@
             {
               "os": "Ubuntu-16.04"
             }
-          ]
+          ],
+          "shards": 10
         },
         "test": "content_unittests"
       },
@@ -10566,7 +10567,8 @@
             {
               "os": "Ubuntu-16.04"
             }
-          ]
+          ],
+          "shards": 10
         },
         "test": "unit_tests"
       }
diff --git a/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter b/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter
index 1ee44b5..891db3e 100644
--- a/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/bfcache.chrome_public_test_apk.filter
@@ -22,14 +22,13 @@
 -org.chromium.chrome.browser.infobar.InfoBarTest.testInfoBarForGeolocationDisappearsOnBack
 -org.chromium.chrome.browser.keyboard_accessory.PasswordGenerationIntegrationTest.testAutomaticGenerationUsePassword
 -org.chromium.chrome.browser.keyboard_accessory.PasswordGenerationIntegrationTest.testManualGenerationUsePassword
--org.chromium.chrome.browser.media.*
 -org.chromium.chrome.browser.notifications.NotificationPlatformBridgeIntentTest.testLaunchNotificationPreferencesForCategory
 -org.chromium.chrome.browser.notifications.NotificationPlatformBridgeIntentTest.testLaunchNotificationPreferencesForWebsite
 -org.chromium.chrome.browser.offlinepages.*
--org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingAccepted
--org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingDismissedPressedBack
--org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingIsShown
--org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingRejected
 -org.chromium.chrome.browser.profiling_host.ProfilingProcessHostAndroidTest.testModeBrowser
 -org.chromium.chrome.browser.tabmodel.IncognitoTabModelTest.testRecreateInIncognito
 -org.chromium.chrome.browser.toolbar.top.BrandColorTest.testBrandColorInterstitial
+
+# Autofill / password manager.
+# https://crbug.com/1011799
+-org.chromium.chrome.browser.password_manager.OnboardingDialogIntegrationTest.testOnboardingDismissedPressedBack
diff --git a/testing/buildbot/filters/bfcache.content_browsertests.filter b/testing/buildbot/filters/bfcache.content_browsertests.filter
index 2ab98d0b..d56c279 100644
--- a/testing/buildbot/filters/bfcache.content_browsertests.filter
+++ b/testing/buildbot/filters/bfcache.content_browsertests.filter
@@ -95,17 +95,13 @@
 # Failing on android only, need to be triaged, see https://crbug.com/1006267.
 -BackForwardCacheMetricsBrowserTest.Fetch
 -BackForwardCacheMetricsBrowserTest.XHR
+-WebContentsSplitCacheBrowserTestEnabled.SplitCache*
 -WebRtcBrowserTest.CanSetupH264VideoCallOnSupportedDevice
 -WithoutCORBProtectionSniffing/CrossSiteDocumentBlockingTest.*
 -WithCORBProtectionSniffing/CrossSiteDocumentBlockingTest.*
 
 # Flaky on android only, need to be triaged, see https://crbug.com/1006267.
 -IndexedDBBrowserTest*
--MediaCanPlayTypeTest.*
--MediaSessionImplBrowserTest.*
--MediaSessionImplParamBrowserTest.*
--MediaSourceTest.*
--MidiBrowserTest.*
 -MHTMLGenerationTest/MHTMLGenerationTest.*
 -MSE_ClearKey/EncryptedMediaTest.*
 -MSE_ExternalClearKey/EncryptedMediaTest.*
diff --git a/testing/buildbot/filters/bfcache.content_unittests.filter b/testing/buildbot/filters/bfcache.content_unittests.filter
index 3a35d00..7c474576 100644
--- a/testing/buildbot/filters/bfcache.content_unittests.filter
+++ b/testing/buildbot/filters/bfcache.content_unittests.filter
@@ -49,10 +49,5 @@
 -GeolocationServiceTest.*
 -MediaInternalsAudioLogTest/MediaInternalsAudioLogTest.*
 -MediaInternalsVideoCaptureDeviceTest.NotifyVideoCaptureDeviceCapabilitiesEnumerated
--MediaSessionControllerTest.*
--MediaSessionEnabledTestInstances/MediaSessionControllersManagerTest.*
--MediaSessionImplServiceRoutingTest.*
--MediaSessionImplTest.*
--MediaSessionImplUmaTest.*
 -MediaStreamManagerTest.*
 -RenderFrameAudioOutputStreamFactoryTest.*
diff --git a/testing/buildbot/filters/bfcache.unit_tests.filter b/testing/buildbot/filters/bfcache.unit_tests.filter
index 0918c5a..6eaa384 100644
--- a/testing/buildbot/filters/bfcache.unit_tests.filter
+++ b/testing/buildbot/filters/bfcache.unit_tests.filter
@@ -19,6 +19,5 @@
 -CreditCardAccessoryControllerTest.ServerCardUnmask
 
 # Other failures
--MediaDrmOriginIdManagerTest.NetworkChangeFails
 -OfflinePageUtilsTest.*
 -PreviewsUKMObserverTest.TestPageEndReasonUMA
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 9fb4278..bdf12ab 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -210,9 +210,6 @@
           '--enable-features=BackForwardCache',
           '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.android_browsertests.filter'
         ],
-        'swarming': {
-          'shards': 10,
-        },
         'test': 'android_browsertests',
       },
       'bf_cache_content_shell_test_apk': {
@@ -221,7 +218,7 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.content_shell_test_apk.filter'
         ],
         'swarming': {
-          'shards': 10,
+          'shards': 5,
         },
         'test': 'content_shell_test_apk',
       },
@@ -231,7 +228,7 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.chrome_public_test_apk.filter'
         ],
         'swarming': {
-          'shards': 10,
+          'shards': 20,
         },
         'test': 'chrome_public_test_apk',
       },
@@ -243,6 +240,9 @@
           '--enable-features=BackForwardCache',
           '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.content_unittests.filter'
         ],
+        'swarming': {
+          'shards': 10,
+        },
         'test': 'content_unittests',
       },
       'bf_cache_unit_tests': {
@@ -250,6 +250,9 @@
           '--enable-features=BackForwardCache',
           '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.unit_tests.filter'
         ],
+        'swarming': {
+          'shards': 10,
+        },
         'test': 'unit_tests',
       },
       'bf_cache_content_browsertests': {
@@ -258,7 +261,7 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/bfcache.content_browsertests.filter'
         ],
         'swarming': {
-          'shards': 10,
+          'shards': 20,
         },
         'test': 'content_browsertests',
       },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 3fd106d..873d84b7 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1460,6 +1460,25 @@
             ]
         }
     ],
+    "CacheStorageSequence": [
+        {
+            "platforms": [
+                "windows",
+                "mac",
+                "chromeos",
+                "linux",
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled1",
+                    "enable_features": [
+                        "CacheStorageSequence"
+                    ]
+                }
+            ]
+        }
+    ],
     "CertDualVerificationTrial": [
         {
             "platforms": [
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 3d70bf2..7b773af 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -564,21 +564,27 @@
   ]
 }
 
+if (external_devtools_frontend) {
+  devtools_frontend_path = "//third_party/devtools-frontend"
+} else {
+  devtools_frontend_path = "//third_party/blink/renderer/devtools"
+}
+
 group("blink_devtools_frontend_resources") {
   public_deps = [
-    "//third_party/blink/renderer/devtools:devtools_frontend_resources",
+    "$devtools_frontend_path:devtools_frontend_resources",
   ]
 }
 
 group("blink_devtools_frontend_resources_files") {
   data_deps = [
-    "//third_party/blink/renderer/devtools:devtools_all_files",
+    "$devtools_frontend_path:devtools_all_files",
   ]
 }
 
 group("blink_generate_devtools_grd") {
   public_deps = [
-    "//third_party/blink/renderer/devtools:generate_devtools_grd",
+    "$devtools_frontend_path:generate_devtools_grd",
   ]
 }
 
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index fcb0387e..827a217 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2433,6 +2433,7 @@
   kRenderSubtreeAttribute = 3049,
   kARIAAnnotationRoles = 3050,
   kIntersectionObserverV2 = 3051,
+  kHeavyAdIntervention = 3052,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/public_features.gni b/third_party/blink/public/public_features.gni
index f9775696..c4834ef 100644
--- a/third_party/blink/public/public_features.gni
+++ b/third_party/blink/public/public_features.gni
@@ -10,6 +10,10 @@
   # resources.pak. It is still possible to load JS files from disk by passing
   # --debug-devtools cmdline switch.
   debug_devtools = false
+
+  # If external_devtools_frontend is set to true, use DevTools frontend that is
+  # pulled as external dependency.
+  external_devtools_frontend = false
 }
 
 # Unhandled Tap enable means Contextual Search aka Tap to Search.
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
index bf4203e..41870574 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
@@ -173,8 +173,9 @@
                              uint16_t class_id) override;
 
   // v8::EmbedderHeapTracer::TracedGlobalHandleVisitor override.
-  void VisitTracedGlobalHandle(
-      const v8::TracedGlobal<v8::Value>& value) override;
+  void VisitTracedReference(
+      const v8::TracedReference<v8::Value>& value) override;
+  void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>&) override;
 
   // Visitor overrides.
   void VisitRoot(void*, TraceDescriptor, const base::Location&) final;
@@ -508,8 +509,8 @@
   }
 }
 
-void V8EmbedderGraphBuilder::VisitTracedGlobalHandle(
-    const v8::TracedGlobal<v8::Value>& value) {
+void V8EmbedderGraphBuilder::VisitTracedReference(
+    const v8::TracedReference<v8::Value>& value) {
   const uint16_t class_id = value.WrapperClassId();
   if (class_id != WrapperTypeInfo::kNodeClassId &&
       class_id != WrapperTypeInfo::kObjectClassId)
@@ -517,6 +518,11 @@
   VisitPersistentHandleInternal(value.As<v8::Object>().Get(isolate_), class_id);
 }
 
+void V8EmbedderGraphBuilder::VisitTracedGlobalHandle(
+    const v8::TracedGlobal<v8::Value>&) {
+  CHECK(false) << "Blink does not use v8::TracedGlobal.";
+}
+
 void V8EmbedderGraphBuilder::VisitPersistentHandle(
     v8::Persistent<v8::Value>* value,
     uint16_t class_id) {
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
index 2620f658..de32813 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -252,7 +252,11 @@
     VisitHandle(value, class_id);
   }
 
-  void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>& value) final {
+  void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>&) final {
+    CHECK(false) << "Blink does not use v8::TracedGlobal.";
+  }
+
+  void VisitTracedReference(const v8::TracedReference<v8::Value>& value) final {
     VisitHandle(&value, value.WrapperClassId());
   }
 
diff --git a/third_party/blink/renderer/core/DEPS b/third_party/blink/renderer/core/DEPS
index 6d9845f..b72fb9b 100644
--- a/third_party/blink/renderer/core/DEPS
+++ b/third_party/blink/renderer/core/DEPS
@@ -42,7 +42,7 @@
     "+cc/layers/layer_position_constraint.h",
     "+cc/layers/layer_sticky_position_constraint.h",
     "+cc/layers/picture_layer.h",
-    "+cc/layers/scrollbar_layer_interface.h",
+    "+cc/layers/scrollbar_layer_base.h",
     "+cc/layers/surface_layer.h",
     "+cc/metrics/begin_main_frame_metrics.h",
     "+cc/paint/display_item_list.h",
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index 704aee4..29365b5 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -305,7 +305,7 @@
     // See https://drafts.csswg.org/css-display/#unbox-html
     // Some of these elements are handled with other adjustments above.
     if (IsA<HTMLBRElement>(element) || IsHTMLWBRElement(element) ||
-        IsA<HTMLMeterElement>(element) || IsHTMLProgressElement(element) ||
+        IsA<HTMLMeterElement>(element) || IsA<HTMLProgressElement>(element) ||
         IsA<HTMLCanvasElement>(element) || IsHTMLMediaElement(element) ||
         IsHTMLInputElement(element) || IsHTMLTextAreaElement(element) ||
         IsHTMLSelectElement(element)) {
diff --git a/third_party/blink/renderer/core/dom/flat_tree_traversal.cc b/third_party/blink/renderer/core/dom/flat_tree_traversal.cc
index 18d31ac..bb95f1b 100644
--- a/third_party/blink/renderer/core/dom/flat_tree_traversal.cc
+++ b/third_party/blink/renderer/core/dom/flat_tree_traversal.cc
@@ -138,7 +138,7 @@
                            ? insertion_point.FirstDistributedNode()
                            : insertion_point.LastDistributedNode()))
       return found;
-    DCHECK(IsHTMLShadowElement(insertion_point) ||
+    DCHECK(IsA<HTMLShadowElement>(insertion_point) ||
            (IsA<HTMLContentElement>(insertion_point) &&
             !insertion_point.HasChildren()));
   }
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 10f5c24..e5de4bb3 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -2567,9 +2567,9 @@
   if (HasEventTargetData())
     return *GetEventTargetDataMap().at(this);
   DCHECK(!GetEventTargetDataMap().Contains(this));
-  SetHasEventTargetData(true);
   EventTargetData* data = MakeGarbageCollected<EventTargetData>();
   GetEventTargetDataMap().Set(this, data);
+  SetHasEventTargetData(true);
   return *data;
 }
 
diff --git a/third_party/blink/renderer/core/dom/shadow_root_v0.cc b/third_party/blink/renderer/core/dom/shadow_root_v0.cc
index b9f0581..c4cf987 100644
--- a/third_party/blink/renderer/core/dom/shadow_root_v0.cc
+++ b/third_party/blink/renderer/core/dom/shadow_root_v0.cc
@@ -168,7 +168,7 @@
   for (const auto& point : DescendantInsertionPoints()) {
     if (!point->IsActive())
       continue;
-    if (auto* shadow = ToHTMLShadowElementOrNull(*point)) {
+    if (auto* shadow = DynamicTo<HTMLShadowElement>(*point)) {
       DCHECK(!shadow_insertion_point);
       shadow_insertion_point = shadow;
     } else {
diff --git a/third_party/blink/renderer/core/dom/shadow_root_v0.h b/third_party/blink/renderer/core/dom/shadow_root_v0.h
index a8d93d3..974294b2 100644
--- a/third_party/blink/renderer/core/dom/shadow_root_v0.h
+++ b/third_party/blink/renderer/core/dom/shadow_root_v0.h
@@ -103,7 +103,7 @@
 
 inline void ShadowRootV0::DidAddInsertionPoint(V0InsertionPoint* point) {
   DCHECK(point);
-  if (IsHTMLShadowElement(*point))
+  if (IsA<HTMLShadowElement>(*point))
     ++descendant_shadow_element_count_;
   else if (IsA<HTMLContentElement>(*point))
     ++descendant_content_element_count_;
@@ -114,7 +114,7 @@
 
 inline void ShadowRootV0::DidRemoveInsertionPoint(V0InsertionPoint* point) {
   DCHECK(point);
-  if (IsHTMLShadowElement(*point)) {
+  if (IsA<HTMLShadowElement>(*point)) {
     DCHECK_GT(descendant_shadow_element_count_, 0u);
     --descendant_shadow_element_count_;
   } else if (IsA<HTMLContentElement>(*point)) {
diff --git a/third_party/blink/renderer/core/dom/v0_insertion_point.cc b/third_party/blink/renderer/core/dom/v0_insertion_point.cc
index f2694f2..0aff714 100644
--- a/third_party/blink/renderer/core/dom/v0_insertion_point.cc
+++ b/third_party/blink/renderer/core/dom/v0_insertion_point.cc
@@ -193,14 +193,14 @@
     return false;
   ShadowRoot* shadow_root = ContainingShadowRoot();
   DCHECK(shadow_root);
-  if (!IsHTMLShadowElement(*this) ||
+  if (!IsA<HTMLShadowElement>(*this) ||
       shadow_root->V0().DescendantShadowElementCount() <= 1)
     return true;
 
   // Slow path only when there are more than one shadow elements in a shadow
   // tree. That should be a rare case.
   for (const auto& point : shadow_root->V0().DescendantInsertionPoints()) {
-    if (IsHTMLShadowElement(*point))
+    if (IsA<HTMLShadowElement>(*point))
       return point == this;
   }
   return true;
diff --git a/third_party/blink/renderer/core/editing/finder/find_buffer.cc b/third_party/blink/renderer/core/editing/finder/find_buffer.cc
index a96e206..3e78579 100644
--- a/third_party/blink/renderer/core/editing/finder/find_buffer.cc
+++ b/third_party/blink/renderer/core/editing/finder/find_buffer.cc
@@ -104,7 +104,7 @@
   return (!element->ShouldSerializeEndTag() && !IsHTMLInputElement(*element)) ||
          IsA<HTMLIFrameElement>(*element) || IsHTMLImageElement(*element) ||
          IsA<HTMLLegendElement>(*element) || IsA<HTMLMeterElement>(*element) ||
-         IsHTMLObjectElement(*element) || IsHTMLProgressElement(*element) ||
+         IsHTMLObjectElement(*element) || IsA<HTMLProgressElement>(*element) ||
          (IsHTMLSelectElement(*element) &&
           ToHTMLSelectElement(*element).UsesMenuList()) ||
          IsHTMLStyleElement(*element) || IsHTMLScriptElement(*element) ||
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator.cc b/third_party/blink/renderer/core/editing/iterators/text_iterator.cc
index 276df9d7..62879e20 100644
--- a/third_party/blink/renderer/core/editing/iterators/text_iterator.cc
+++ b/third_party/blink/renderer/core/editing/iterators/text_iterator.cc
@@ -379,7 +379,7 @@
                         IsA<HTMLLegendElement>(html_element) ||
                         IsHTMLImageElement(html_element) ||
                         IsA<HTMLMeterElement>(html_element) ||
-                        IsHTMLProgressElement(html_element))))) {
+                        IsA<HTMLProgressElement>(html_element))))) {
             HandleReplacedElement();
           } else {
             HandleNonTextNode();
diff --git a/third_party/blink/renderer/core/events/message_event.cc b/third_party/blink/renderer/core/events/message_event.cc
index b008fd9..782ff96 100644
--- a/third_party/blink/renderer/core/events/message_event.cc
+++ b/third_party/blink/renderer/core/events/message_event.cc
@@ -41,7 +41,7 @@
 static inline bool IsValidSource(EventTarget* source) {
   return !source || source->ToLocalDOMWindow() || source->ToMessagePort() ||
          source->ToServiceWorker() || source->ToPortalHost() ||
-         ToHTMLPortalElementOrNull(source->ToNode());
+         IsA<HTMLPortalElement>(source->ToNode());
 }
 
 MessageEvent::V8GCAwareString::V8GCAwareString(const String& value)
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.cc b/third_party/blink/renderer/core/frame/visual_viewport.cc
index c9ade44..2cedb01 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport.cc
+++ b/third_party/blink/renderer/core/frame/visual_viewport.cc
@@ -34,7 +34,7 @@
 
 #include "cc/input/main_thread_scrolling_reason.h"
 #include "cc/layers/picture_layer.h"
-#include "cc/layers/scrollbar_layer_interface.h"
+#include "cc/layers/scrollbar_layer_base.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_scroll_into_view_params.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -293,7 +293,7 @@
         IntPoint());
   }
 
-  if (overlay_scrollbar_horizontal_) {
+  if (scrollbar_graphics_layer_horizontal_) {
     EffectPaintPropertyNode::State state;
     state.local_transform_space = transform_parent;
     state.direct_compositing_reasons =
@@ -310,13 +310,13 @@
                                     *effect_parent, std::move(state)));
     }
 
-    overlay_scrollbar_horizontal_->SetLayerState(
+    scrollbar_graphics_layer_horizontal_->SetLayerState(
         PropertyTreeState(*transform_parent, *context.current.clip,
                           *horizontal_scrollbar_effect_node_),
         ScrollbarOffset(ScrollbarOrientation::kHorizontalScrollbar));
   }
 
-  if (overlay_scrollbar_vertical_) {
+  if (scrollbar_graphics_layer_vertical_) {
     EffectPaintPropertyNode::State state;
     state.local_transform_space = transform_parent;
     state.direct_compositing_reasons =
@@ -333,7 +333,7 @@
                                     *effect_parent, std::move(state)));
     }
 
-    overlay_scrollbar_vertical_->SetLayerState(
+    scrollbar_graphics_layer_vertical_->SetLayerState(
         PropertyTreeState(*transform_parent, *context.current.clip,
                           *vertical_scrollbar_effect_node_),
         ScrollbarOffset(ScrollbarOrientation::kVerticalScrollbar));
@@ -382,8 +382,8 @@
                        ViewportToTracedValue());
 
   // Need to re-compute sizes for the overlay scrollbars.
-  if (overlay_scrollbar_horizontal_) {
-    DCHECK(overlay_scrollbar_vertical_);
+  if (scrollbar_graphics_layer_horizontal_) {
+    DCHECK(scrollbar_graphics_layer_vertical_);
     SetupScrollbar(kHorizontalScrollbar);
     SetupScrollbar(kVerticalScrollbar);
   }
@@ -582,7 +582,8 @@
   if (scroll_layer_)
     return;
 
-  DCHECK(!overlay_scrollbar_horizontal_ && !overlay_scrollbar_vertical_);
+  DCHECK(!scrollbar_graphics_layer_horizontal_ &&
+         !scrollbar_graphics_layer_vertical_);
 
   needs_paint_property_update_ = true;
 
@@ -632,15 +633,16 @@
 
   if (VisualViewportSuppliesScrollbars() &&
       !GetPage().GetSettings().GetHideScrollbars()) {
-    DCHECK(!overlay_scrollbar_horizontal_);
-    DCHECK(!overlay_scrollbar_vertical_);
-    overlay_scrollbar_horizontal_ = std::make_unique<GraphicsLayer>(*this);
-    overlay_scrollbar_vertical_ = std::make_unique<GraphicsLayer>(*this);
+    DCHECK(!scrollbar_graphics_layer_horizontal_);
+    DCHECK(!scrollbar_graphics_layer_vertical_);
+    scrollbar_graphics_layer_horizontal_ =
+        std::make_unique<GraphicsLayer>(*this);
+    scrollbar_graphics_layer_vertical_ = std::make_unique<GraphicsLayer>(*this);
     SetupScrollbar(kHorizontalScrollbar);
     SetupScrollbar(kVerticalScrollbar);
   } else {
-    overlay_scrollbar_horizontal_ = nullptr;
-    overlay_scrollbar_vertical_ = nullptr;
+    scrollbar_graphics_layer_horizontal_ = nullptr;
+    scrollbar_graphics_layer_vertical_ = nullptr;
   }
 
   // Ensure existing LocalFrameView scrollbars are removed if the visual
@@ -674,15 +676,14 @@
 void VisualViewport::SetupScrollbar(ScrollbarOrientation orientation) {
   bool is_horizontal = orientation == kHorizontalScrollbar;
   GraphicsLayer* scrollbar_graphics_layer =
-      is_horizontal ? overlay_scrollbar_horizontal_.get()
-                    : overlay_scrollbar_vertical_.get();
-  std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup>&
-      scrollbar_layer_group = is_horizontal ? scrollbar_layer_group_horizontal_
-                                            : scrollbar_layer_group_vertical_;
+      is_horizontal ? scrollbar_graphics_layer_horizontal_.get()
+                    : scrollbar_graphics_layer_vertical_.get();
+  scoped_refptr<cc::ScrollbarLayerBase>& scrollbar_layer =
+      is_horizontal ? scrollbar_layer_horizontal_ : scrollbar_layer_vertical_;
   if (!scrollbar_graphics_layer->Parent())
     root_transform_layer_->AddChild(scrollbar_graphics_layer);
 
-  if (!scrollbar_layer_group) {
+  if (!scrollbar_layer) {
     ScrollingCoordinator* coordinator = GetPage().GetScrollingCoordinator();
     DCHECK(coordinator);
 
@@ -693,20 +694,16 @@
     int scrollbar_margin = clampTo<int>(
         std::floor(GetPage().GetChromeClient().WindowToViewportScalar(
             theme.ScrollbarMargin())));
-    scrollbar_layer_group = coordinator->CreateSolidColorScrollbarLayer(
+    scrollbar_layer = coordinator->CreateSolidColorScrollbarLayer(
         orientation, thumb_thickness, scrollbar_margin, false,
         GetScrollbarElementId(orientation));
 
-    // The compositor will control the scrollbar's visibility. Set to invisible
-    // by default so scrollbars don't show up in web tests.
-    scrollbar_layer_group->layer->SetOpacity(0.f);
     scrollbar_graphics_layer->SetContentsToCcLayer(
-        scrollbar_layer_group->layer.get(),
+        scrollbar_layer.get(),
         /*prevent_contents_opaque_changes=*/false);
     scrollbar_graphics_layer->SetDrawsContent(false);
     scrollbar_graphics_layer->SetHitTestable(false);
-    scrollbar_layer_group->scrollbar_layer->SetScrollElementId(
-        scroll_layer_->CcLayer()->element_id());
+    scrollbar_layer->SetScrollElementId(scroll_layer_->CcLayer()->element_id());
   }
 
   // Use the GraphicsLayer to position the scrollbars.
@@ -927,11 +924,11 @@
 }
 
 GraphicsLayer* VisualViewport::LayerForHorizontalScrollbar() const {
-  return overlay_scrollbar_horizontal_.get();
+  return scrollbar_graphics_layer_horizontal_.get();
 }
 
 GraphicsLayer* VisualViewport::LayerForVerticalScrollbar() const {
-  return overlay_scrollbar_vertical_.get();
+  return scrollbar_graphics_layer_vertical_.get();
 }
 
 IntRect VisualViewport::ComputeInterestRect(const GraphicsLayer*,
@@ -1141,9 +1138,9 @@
   String name;
   if (graphics_layer == scroll_layer_.get()) {
     name = "Inner Viewport Scroll Layer";
-  } else if (graphics_layer == overlay_scrollbar_horizontal_.get()) {
+  } else if (graphics_layer == scrollbar_graphics_layer_horizontal_.get()) {
     name = "Overlay Scrollbar Horizontal Layer";
-  } else if (graphics_layer == overlay_scrollbar_vertical_.get()) {
+  } else if (graphics_layer == scrollbar_graphics_layer_vertical_.get()) {
     name = "Overlay Scrollbar Vertical Layer";
   } else if (graphics_layer == root_transform_layer_.get()) {
     name = "Root Transform Layer";
@@ -1176,12 +1173,12 @@
 void VisualViewport::DisposeImpl() {
   root_transform_layer_.reset();
   scroll_layer_.reset();
-  // scrollbar_layer_group_* are referenced from overlay_scrollbar_*, thus
-  // overlay_scrollbar_* must be destroyed before scrollbar_layer_group_*.
-  overlay_scrollbar_horizontal_.reset();
-  overlay_scrollbar_vertical_.reset();
-  scrollbar_layer_group_horizontal_.reset();
-  scrollbar_layer_group_vertical_.reset();
+  // scrollbar_layer_* are referenced from scrollbar_graphics_layer_*, thus
+  // scrollbar_graphics_layer_* must be destroyed before scrollbar_layer_*.
+  scrollbar_graphics_layer_horizontal_.reset();
+  scrollbar_graphics_layer_vertical_.reset();
+  scrollbar_layer_horizontal_.reset();
+  scrollbar_layer_vertical_.reset();
   device_emulation_transform_node_.reset();
   overscroll_elasticity_transform_node_.reset();
   page_scale_node_.reset();
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.h b/third_party/blink/renderer/core/frame/visual_viewport.h
index 6b65eb6c..b675a62 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport.h
+++ b/third_party/blink/renderer/core/frame/visual_viewport.h
@@ -79,8 +79,8 @@
 //  root_transform_layer_
 //  +- scroll_layer_ (transform: scroll_translation_node_)
 //  |  +- LayoutView CompositedLayerMapping layers
-//  +- overlay_scrollbar_horizontal_ (optional, transform: DET_or_parent)
-//  +- overlay_scrollbar_vertical_ (optional, transform: DET_or_parent)
+//  +- scrollbar_graphics_layer_horizontal_ (optional, transform: DET_or_parent)
+//  +- scrollbar_graphics_layer_vertical_ (optional, transform: DET_or_parent)
 //  (DET_or_parent: device_emulation_transform_node_ if exists,
 //   or the parent transform state)
 //
@@ -338,12 +338,10 @@
   // The layers of the ScrollbarLayerGroups are referenced from the
   // GraphicsLayers, so the GraphicsLayers must be destructed first (declared
   // after).
-  std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup>
-      scrollbar_layer_group_horizontal_;
-  std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup>
-      scrollbar_layer_group_vertical_;
-  std::unique_ptr<GraphicsLayer> overlay_scrollbar_horizontal_;
-  std::unique_ptr<GraphicsLayer> overlay_scrollbar_vertical_;
+  scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer_horizontal_;
+  scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer_vertical_;
+  std::unique_ptr<GraphicsLayer> scrollbar_graphics_layer_horizontal_;
+  std::unique_ptr<GraphicsLayer> scrollbar_graphics_layer_vertical_;
 
   scoped_refptr<TransformPaintPropertyNode> device_emulation_transform_node_;
   scoped_refptr<TransformPaintPropertyNode>
diff --git a/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc b/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc
index 82e04cc..d9a2ae3 100644
--- a/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc
+++ b/third_party/blink/renderer/core/html/portal/portal_post_message_helper.cc
@@ -67,8 +67,7 @@
     scoped_refptr<const SecurityOrigin> source_origin,
     scoped_refptr<const SecurityOrigin> target_origin) {
   DCHECK(event_target->ToPortalHost() ||
-         (event_target->ToNode() &&
-          ToHTMLPortalElementOrNull(event_target->ToNode())));
+         IsA<HTMLPortalElement>(event_target->ToNode()));
 
   if (target_origin &&
       !target_origin->IsSameSchemeHostPort(
diff --git a/third_party/blink/renderer/core/html/shadow/progress_shadow_element.cc b/third_party/blink/renderer/core/html/shadow/progress_shadow_element.cc
index f8a92e7..f1cea38 100644
--- a/third_party/blink/renderer/core/html/shadow/progress_shadow_element.cc
+++ b/third_party/blink/renderer/core/html/shadow/progress_shadow_element.cc
@@ -41,7 +41,7 @@
 }
 
 HTMLProgressElement* ProgressShadowElement::ProgressElement() const {
-  return ToHTMLProgressElement(OwnerShadowHost());
+  return To<HTMLProgressElement>(OwnerShadowHost());
 }
 
 scoped_refptr<ComputedStyle>
diff --git a/third_party/blink/renderer/core/html/shadow/progress_shadow_element_test.cc b/third_party/blink/renderer/core/html/shadow/progress_shadow_element_test.cc
index b193f6f..8fd9326 100644
--- a/third_party/blink/renderer/core/html/shadow/progress_shadow_element_test.cc
+++ b/third_party/blink/renderer/core/html/shadow/progress_shadow_element_test.cc
@@ -30,8 +30,8 @@
     <progress id='prog' style='-webkit-appearance:none' />
   )HTML");
 
-  HTMLProgressElement* progress =
-      ToHTMLProgressElement(GetDocument().getElementById("prog"));
+  auto* progress =
+      To<HTMLProgressElement>(GetDocument().getElementById("prog"));
   ASSERT_TRUE(progress);
 
   auto* shadow_element = To<Element>(progress->GetShadowRoot()->firstChild());
diff --git a/third_party/blink/renderer/core/layout/layout_progress.cc b/third_party/blink/renderer/core/layout/layout_progress.cc
index 76f2ef7..e2cdda71 100644
--- a/third_party/blink/renderer/core/layout/layout_progress.cc
+++ b/third_party/blink/renderer/core/layout/layout_progress.cc
@@ -105,7 +105,7 @@
 }
 
 HTMLProgressElement* LayoutProgress::ProgressElement() const {
-  return ToHTMLProgressElement(GetNode());
+  return To<HTMLProgressElement>(GetNode());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 46870d2e..8437734 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -504,6 +504,12 @@
   params->previews_state = previews_state_;
   params->requestor_origin = requestor_origin_;
   params->origin_policy = origin_policy_;
+  // Force the commit origin for the error page to be opaque and
+  // contain precursor information from the document's origin.
+  // This is only used for renderer-side enforcement of CSP and the
+  // document origin used here is the origin of the document that was blocked.
+  params->origin_to_commit =
+      frame_->GetDocument()->GetSecurityOrigin()->DeriveNewOpaqueOrigin();
 }
 
 void DocumentLoader::SetHistoryItemStateForCommit(
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
index 346acfd..eb84f23 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
@@ -34,7 +34,7 @@
 #include "cc/layers/painted_overlay_scrollbar_layer.h"
 #include "cc/layers/painted_scrollbar_layer.h"
 #include "cc/layers/picture_layer.h"
-#include "cc/layers/scrollbar_layer_interface.h"
+#include "cc/layers/scrollbar_layer_base.h"
 #include "cc/layers/solid_color_scrollbar_layer.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
@@ -238,50 +238,42 @@
 
 void ScrollingCoordinator::WillDestroyScrollableArea(
     ScrollableArea* scrollable_area) {
-  RemoveScrollbarLayerGroup(scrollable_area, kHorizontalScrollbar);
-  RemoveScrollbarLayerGroup(scrollable_area, kVerticalScrollbar);
+  RemoveScrollbarLayer(scrollable_area, kHorizontalScrollbar);
+  RemoveScrollbarLayer(scrollable_area, kVerticalScrollbar);
 }
 
-void ScrollingCoordinator::RemoveScrollbarLayerGroup(
+void ScrollingCoordinator::RemoveScrollbarLayer(
     ScrollableArea* scrollable_area,
     ScrollbarOrientation orientation) {
   ScrollbarMap& scrollbars = orientation == kHorizontalScrollbar
                                  ? horizontal_scrollbars_
                                  : vertical_scrollbars_;
-  if (std::unique_ptr<ScrollbarLayerGroup> scrollbar_layer_group =
+  if (scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer =
           scrollbars.Take(scrollable_area)) {
-    GraphicsLayer::UnregisterContentsLayer(scrollbar_layer_group->layer.get());
+    GraphicsLayer::UnregisterContentsLayer(scrollbar_layer.get());
   }
 }
 
-static std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup>
-CreateScrollbarLayer(Scrollbar& scrollbar, float device_scale_factor) {
+static scoped_refptr<cc::ScrollbarLayerBase> CreateScrollbarLayer(
+    Scrollbar& scrollbar,
+    float device_scale_factor) {
   ScrollbarTheme& theme = scrollbar.GetTheme();
   auto scrollbar_delegate =
       std::make_unique<ScrollbarLayerDelegate>(scrollbar, device_scale_factor);
-
-  auto layer_group =
-      std::make_unique<ScrollingCoordinator::ScrollbarLayerGroup>();
+  scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer;
   if (theme.UsesOverlayScrollbars() && theme.UsesNinePatchThumbResource()) {
-    auto scrollbar_layer =
+    scrollbar_layer =
         cc::PaintedOverlayScrollbarLayer::Create(std::move(scrollbar_delegate));
-    scrollbar_layer->SetElementId(scrollbar.GetElementId());
-    layer_group->scrollbar_layer = scrollbar_layer.get();
-    layer_group->layer = std::move(scrollbar_layer);
   } else {
-    auto scrollbar_layer =
+    scrollbar_layer =
         cc::PaintedScrollbarLayer::Create(std::move(scrollbar_delegate));
-    scrollbar_layer->SetElementId(scrollbar.GetElementId());
-    layer_group->scrollbar_layer = scrollbar_layer.get();
-    layer_group->layer = std::move(scrollbar_layer);
   }
-
-  GraphicsLayer::RegisterContentsLayer(layer_group->layer.get());
-
-  return layer_group;
+  scrollbar_layer->SetElementId(scrollbar.GetElementId());
+  GraphicsLayer::RegisterContentsLayer(scrollbar_layer.get());
+  return scrollbar_layer;
 }
 
-std::unique_ptr<ScrollingCoordinator::ScrollbarLayerGroup>
+scoped_refptr<cc::ScrollbarLayerBase>
 ScrollingCoordinator::CreateSolidColorScrollbarLayer(
     ScrollbarOrientation orientation,
     int thumb_thickness,
@@ -294,13 +286,8 @@
       cc_orientation, thumb_thickness, track_start,
       is_left_side_vertical_scrollbar);
   scrollbar_layer->SetElementId(element_id);
-
-  auto layer_group = std::make_unique<ScrollbarLayerGroup>();
-  layer_group->scrollbar_layer = scrollbar_layer.get();
-  layer_group->layer = std::move(scrollbar_layer);
-  GraphicsLayer::RegisterContentsLayer(layer_group->layer.get());
-
-  return layer_group;
+  GraphicsLayer::RegisterContentsLayer(scrollbar_layer.get());
+  return scrollbar_layer;
 }
 
 static void DetachScrollbarLayer(GraphicsLayer* scrollbar_graphics_layer) {
@@ -311,10 +298,9 @@
   scrollbar_graphics_layer->SetHitTestable(true);
 }
 
-static void SetupScrollbarLayer(
-    GraphicsLayer* scrollbar_graphics_layer,
-    const ScrollingCoordinator::ScrollbarLayerGroup* scrollbar_layer_group,
-    cc::Layer* scrolling_layer) {
+static void SetupScrollbarLayer(GraphicsLayer* scrollbar_graphics_layer,
+                                cc::ScrollbarLayerBase* scrollbar_layer,
+                                cc::Layer* scrolling_layer) {
   DCHECK(scrollbar_graphics_layer);
 
   if (!scrolling_layer) {
@@ -322,28 +308,27 @@
     return;
   }
 
-  scrollbar_layer_group->scrollbar_layer->SetScrollElementId(
-      scrolling_layer->element_id());
+  scrollbar_layer->SetScrollElementId(scrolling_layer->element_id());
   scrollbar_graphics_layer->SetContentsToCcLayer(
-      scrollbar_layer_group->layer.get(),
+      scrollbar_layer,
       /*prevent_contents_opaque_changes=*/false);
   scrollbar_graphics_layer->SetDrawsContent(false);
   scrollbar_graphics_layer->SetHitTestable(false);
 }
 
-void ScrollingCoordinator::AddScrollbarLayerGroup(
+void ScrollingCoordinator::AddScrollbarLayer(
     ScrollableArea* scrollable_area,
     ScrollbarOrientation orientation,
-    std::unique_ptr<ScrollbarLayerGroup> scrollbar_layer_group) {
+    scoped_refptr<cc::ScrollbarLayerBase> scrollbar_layer_group) {
   ScrollbarMap& scrollbars = orientation == kHorizontalScrollbar
                                  ? horizontal_scrollbars_
                                  : vertical_scrollbars_;
   scrollbars.insert(scrollable_area, std::move(scrollbar_layer_group));
 }
 
-ScrollingCoordinator::ScrollbarLayerGroup*
-ScrollingCoordinator::GetScrollbarLayerGroup(ScrollableArea* scrollable_area,
-                                             ScrollbarOrientation orientation) {
+cc::ScrollbarLayerBase* ScrollingCoordinator::GetScrollbarLayer(
+    ScrollableArea* scrollable_area,
+    ScrollbarOrientation orientation) {
   ScrollbarMap& scrollbars = orientation == kHorizontalScrollbar
                                  ? horizontal_scrollbars_
                                  : vertical_scrollbars_;
@@ -371,31 +356,32 @@
       return;
     }
 
-    ScrollbarLayerGroup* scrollbar_layer_group =
-        GetScrollbarLayerGroup(scrollable_area, orientation);
-    if (!scrollbar_layer_group) {
+    cc::ScrollbarLayerBase* scrollbar_layer =
+        GetScrollbarLayer(scrollable_area, orientation);
+    if (!scrollbar_layer) {
       Settings* settings = page_->MainFrame()->GetSettings();
 
-      std::unique_ptr<ScrollbarLayerGroup> group;
+      scoped_refptr<cc::ScrollbarLayerBase> new_scrollbar_layer;
       if (settings->GetUseSolidColorScrollbars()) {
         DCHECK(RuntimeEnabledFeatures::OverlayScrollbarsEnabled());
-        group = CreateSolidColorScrollbarLayer(
+        new_scrollbar_layer = CreateSolidColorScrollbarLayer(
             orientation, scrollbar.GetTheme().ThumbThickness(scrollbar),
             scrollbar.GetTheme().TrackPosition(scrollbar),
             scrollable_area->ShouldPlaceVerticalScrollbarOnLeft(),
             scrollable_area->GetScrollbarElementId(orientation));
       } else {
-        group = CreateScrollbarLayer(scrollbar,
-                                     page_->DeviceScaleFactorDeprecated());
+        new_scrollbar_layer = CreateScrollbarLayer(
+            scrollbar, page_->DeviceScaleFactorDeprecated());
       }
 
-      scrollbar_layer_group = group.get();
-      AddScrollbarLayerGroup(scrollable_area, orientation, std::move(group));
+      scrollbar_layer = new_scrollbar_layer.get();
+      AddScrollbarLayer(scrollable_area, orientation,
+                        std::move(new_scrollbar_layer));
     }
 
     cc::Layer* scroll_layer =
         GraphicsLayerToCcLayer(scrollable_area->LayerForScrolling());
-    SetupScrollbarLayer(scrollbar_graphics_layer, scrollbar_layer_group,
+    SetupScrollbarLayer(scrollbar_graphics_layer, scrollbar_layer,
                         scroll_layer);
 
     // Root layer non-overlay scrollbars should be marked opaque to disable
@@ -404,7 +390,7 @@
     scrollbar_graphics_layer->SetContentsOpaque(
         IsForMainFrame(scrollable_area) && is_opaque_scrollbar);
   } else {
-    RemoveScrollbarLayerGroup(scrollable_area, orientation);
+    RemoveScrollbarLayer(scrollable_area, orientation);
   }
 }
 
@@ -469,23 +455,19 @@
     scrollable_area->LayerForScrolling()->SetSize(
         static_cast<gfx::Size>(scroll_contents_size));
   }
-  if (ScrollbarLayerGroup* scrollbar_layer_group =
-          GetScrollbarLayerGroup(scrollable_area, kHorizontalScrollbar)) {
-    GraphicsLayer* horizontal_scrollbar_layer =
-        scrollable_area->LayerForHorizontalScrollbar();
-    if (horizontal_scrollbar_layer) {
-      SetupScrollbarLayer(horizontal_scrollbar_layer, scrollbar_layer_group,
+  if (cc::ScrollbarLayerBase* scrollbar_layer =
+          GetScrollbarLayer(scrollable_area, kHorizontalScrollbar)) {
+    if (GraphicsLayer* horizontal_scrollbar_layer =
+            scrollable_area->LayerForHorizontalScrollbar()) {
+      SetupScrollbarLayer(horizontal_scrollbar_layer, scrollbar_layer,
                           cc_layer);
     }
   }
-  if (ScrollbarLayerGroup* scrollbar_layer_group =
-          GetScrollbarLayerGroup(scrollable_area, kVerticalScrollbar)) {
-    GraphicsLayer* vertical_scrollbar_layer =
-        scrollable_area->LayerForVerticalScrollbar();
-
-    if (vertical_scrollbar_layer) {
-      SetupScrollbarLayer(vertical_scrollbar_layer, scrollbar_layer_group,
-                          cc_layer);
+  if (cc::ScrollbarLayerBase* scrollbar_layer =
+          GetScrollbarLayer(scrollable_area, kVerticalScrollbar)) {
+    if (GraphicsLayer* vertical_scrollbar_layer =
+            scrollable_area->LayerForVerticalScrollbar()) {
+      SetupScrollbarLayer(vertical_scrollbar_layer, scrollbar_layer, cc_layer);
     }
   }
 
@@ -518,9 +500,9 @@
 
 void ScrollingCoordinator::Reset(LocalFrame* frame) {
   for (const auto& scrollbar : horizontal_scrollbars_)
-    GraphicsLayer::UnregisterContentsLayer(scrollbar.value->layer.get());
+    GraphicsLayer::UnregisterContentsLayer(scrollbar.value.get());
   for (const auto& scrollbar : vertical_scrollbars_)
-    GraphicsLayer::UnregisterContentsLayer(scrollbar.value->layer.get());
+    GraphicsLayer::UnregisterContentsLayer(scrollbar.value.get());
 
   horizontal_scrollbars_.clear();
   vertical_scrollbars_.clear();
@@ -595,9 +577,9 @@
 
   page_ = nullptr;
   for (const auto& scrollbar : horizontal_scrollbars_)
-    GraphicsLayer::UnregisterContentsLayer(scrollbar.value->layer.get());
+    GraphicsLayer::UnregisterContentsLayer(scrollbar.value.get());
   for (const auto& scrollbar : vertical_scrollbars_)
-    GraphicsLayer::UnregisterContentsLayer(scrollbar.value->layer.get());
+    GraphicsLayer::UnregisterContentsLayer(scrollbar.value.get());
 }
 
 bool ScrollingCoordinator::CoordinatesScrollingForFrameView(
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
index 99f1851..30f3fd98 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
@@ -38,8 +38,7 @@
 
 namespace cc {
 class AnimationHost;
-class Layer;
-class ScrollbarLayerInterface;
+class ScrollbarLayerBase;
 }  // namespace cc
 
 namespace blink {
@@ -64,15 +63,6 @@
 class CORE_EXPORT ScrollingCoordinator final
     : public GarbageCollected<ScrollingCoordinator> {
  public:
-  struct ScrollbarLayerGroup {
-    // The compositor layer for the scrollbar. It can be one of a few
-    // concrete types, so we store the base type.
-    scoped_refptr<cc::Layer> layer;
-    // An interface shared by all scrollbar layer types since we don't know
-    // the concrete |layer| type.
-    cc::ScrollbarLayerInterface* scrollbar_layer = nullptr;
-  };
-
   explicit ScrollingCoordinator(Page*);
   ~ScrollingCoordinator();
   void Trace(blink::Visitor*);
@@ -109,7 +99,7 @@
   // Should be called whenever the root layer for the given frame view changes.
   void FrameViewRootLayerDidChange(LocalFrameView*);
 
-  std::unique_ptr<ScrollbarLayerGroup> CreateSolidColorScrollbarLayer(
+  scoped_refptr<cc::ScrollbarLayerBase> CreateSolidColorScrollbarLayer(
       ScrollbarOrientation,
       int thumb_thickness,
       int track_start,
@@ -184,12 +174,12 @@
   bool should_scroll_on_main_thread_dirty_;
 
  private:
-  void AddScrollbarLayerGroup(ScrollableArea*,
-                              ScrollbarOrientation,
-                              std::unique_ptr<ScrollbarLayerGroup>);
-  ScrollbarLayerGroup* GetScrollbarLayerGroup(ScrollableArea*,
-                                              ScrollbarOrientation);
-  void RemoveScrollbarLayerGroup(ScrollableArea*, ScrollbarOrientation);
+  void AddScrollbarLayer(ScrollableArea*,
+                         ScrollbarOrientation,
+                         scoped_refptr<cc::ScrollbarLayerBase>);
+  cc::ScrollbarLayerBase* GetScrollbarLayer(ScrollableArea*,
+                                            ScrollbarOrientation);
+  void RemoveScrollbarLayer(ScrollableArea*, ScrollbarOrientation);
 
   bool FrameScrollerIsDirty(LocalFrameView*) const;
 
@@ -197,8 +187,8 @@
   std::unique_ptr<CompositorAnimationTimeline>
       programmatic_scroll_animator_timeline_;
 
-  using ScrollbarMap =
-      HeapHashMap<Member<ScrollableArea>, std::unique_ptr<ScrollbarLayerGroup>>;
+  using ScrollbarMap = HeapHashMap<Member<ScrollableArea>,
+                                   scoped_refptr<cc::ScrollbarLayerBase>>;
   ScrollbarMap horizontal_scrollbars_;
   ScrollbarMap vertical_scrollbars_;
 
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn
index 2003e7a..3874d856 100644
--- a/third_party/blink/renderer/devtools/BUILD.gn
+++ b/third_party/blink/renderer/devtools/BUILD.gn
@@ -6,1813 +6,1840 @@
 import("//third_party/blink/public/public_features.gni")
 import("//third_party/blink/renderer/core/core.gni")
 
-all_devtools_files = [
-  "front_end/accessibility/AccessibilityModel.js",
-  "front_end/accessibility/accessibilityNode.css",
-  "front_end/accessibility/AccessibilityNodeView.js",
-  "front_end/accessibility/accessibilityProperties.css",
-  "front_end/accessibility/AccessibilitySidebarView.js",
-  "front_end/accessibility/AccessibilityStrings.js",
-  "front_end/accessibility/ARIAAttributesView.js",
-  "front_end/accessibility/ARIAMetadata.js",
-  "front_end/accessibility/axBreadcrumbs.css",
-  "front_end/accessibility/AXBreadcrumbsPane.js",
-  "front_end/accessibility/module.json",
-  "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js",
-  "front_end/accessibility_test_runner/module.json",
-  "front_end/animation/AnimationGroupPreviewUI.js",
-  "front_end/animation/AnimationModel.js",
-  "front_end/animation/animationScreenshotPopover.css",
-  "front_end/animation/AnimationScreenshotPopover.js",
-  "front_end/animation/animationTimeline.css",
-  "front_end/animation/AnimationTimeline.js",
-  "front_end/animation/AnimationUI.js",
-  "front_end/animation/module.json",
-  "front_end/application_test_runner/AppcacheTestRunner.js",
-  "front_end/application_test_runner/CacheStorageTestRunner.js",
-  "front_end/application_test_runner/IndexedDBTestRunner.js",
-  "front_end/application_test_runner/module.json",
-  "front_end/application_test_runner/ResourcesTestRunner.js",
-  "front_end/application_test_runner/ResourceTreeTestRunner.js",
-  "front_end/application_test_runner/ServiceWorkersTestRunner.js",
-  "front_end/audits_worker.js",
-  "front_end/audits_worker.json",
-  "front_end/audits_worker/AuditsService.js",
-  "front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js",
-  "front_end/audits_worker/module.json",
-  "front_end/audits/AuditsPanel.js",
-  "front_end/audits/AuditsController.js",
-  "front_end/audits/AuditsReportSelector.js",
-  "front_end/audits/AuditsReportRenderer.js",
-  "front_end/audits/AuditsStartView.js",
-  "front_end/audits/AuditsProtocolService.js",
-  "front_end/audits/AuditsStatusView.js",
-  "front_end/audits/auditsDialog.css",
-  "front_end/audits/auditsStartView.css",
-  "front_end/audits/auditsPanel.css",
-  "front_end/audits/RadioSetting.js",
-  "front_end/audits/lighthouse/report.css",
-  "front_end/audits/lighthouse/report.js",
-  "front_end/audits/lighthouse/report-generator.js",
-  "front_end/audits/lighthouse/template.html",
-  "front_end/audits/lighthouse/templates.html",
-  "front_end/audits/module.json",
-  "front_end/audits_test_runner/AuditsTestRunner.js",
-  "front_end/audits_test_runner/module.json",
-  "front_end/axe_core_test_runner/AxeCoreTestRunner.js",
-  "front_end/axe_core_test_runner/module.json",
-  "front_end/bindings/module.json",
-  "front_end/bindings_test_runner/AutomappingTestRunner.js",
-  "front_end/bindings_test_runner/BindingsTestRunner.js",
-  "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js",
-  "front_end/bindings_test_runner/module.json",
-  "front_end/bindings_test_runner/PersistenceTestRunner.js",
-  "front_end/bindings_test_runner/OverridesTestRunner.js",
-  "front_end/browser_debugger/DOMBreakpointsSidebarPane.js",
-  "front_end/browser_debugger/EventListenerBreakpointsSidebarPane.js",
-  "front_end/browser_debugger/ObjectEventListenersSidebarPane.js",
-  "front_end/browser_debugger/XHRBreakpointsSidebarPane.js",
-  "front_end/browser_debugger/domBreakpointsSidebarPane.css",
-  "front_end/browser_debugger/eventListenerBreakpoints.css",
-  "front_end/browser_debugger/module.json",
-  "front_end/browser_debugger/xhrBreakpointsSidebarPane.css",
-  "front_end/browser_sdk/LogManager.js",
-  "front_end/browser_sdk/module.json",
-  "front_end/css_overview/cssOverview.css",
-  "front_end/css_overview/cssOverviewStartView.css",
-  "front_end/css_overview/cssOverviewProcessingView.css",
-  "front_end/css_overview/cssOverviewCompletedView.css",
-  "front_end/css_overview/CSSOverviewController.js",
-  "front_end/css_overview/CSSOverviewStartView.js",
-  "front_end/css_overview/CSSOverviewProcessingView.js",
-  "front_end/css_overview/CSSOverviewCompletedView.js",
-  "front_end/css_overview/CSSOverviewModel.js",
-  "front_end/css_overview/CSSOverviewSidebarPanel.js",
-  "front_end/css_overview/cssOverviewSidebarPanel.css",
-  "front_end/css_overview/CSSOverviewPanel.js",
-  "front_end/css_overview/module.json",
-  "front_end/changes/ChangesHighlighter.js",
-  "front_end/changes/changesView.css",
-  "front_end/changes/ChangesView.js",
-  "front_end/changes/changesSidebar.css",
-  "front_end/changes/ChangesSidebar.js",
-  "front_end/changes/module.json",
-  "front_end/cm/active-line.js",
-  "front_end/cm/brace-fold.js",
-  "front_end/cm/closebrackets.js",
-  "front_end/cm/codemirror.css",
-  "front_end/cm/codemirror.js",
-  "front_end/cm/comment.js",
-  "front_end/cm/foldcode.js",
-  "front_end/cm/foldgutter.js",
-  "front_end/cm/mark-selection.js",
-  "front_end/cm/matchbrackets.js",
-  "front_end/cm/module.json",
-  "front_end/cm/multiplex.js",
-  "front_end/cm/overlay.js",
-  "front_end/cm_headless/headlesscodemirror.js",
-  "front_end/cm_headless/module.json",
-  "front_end/cm_modes/clike.js",
-  "front_end/cm_modes/clojure.js",
-  "front_end/cm_modes/coffeescript.js",
-  "front_end/cm_modes/DefaultCodeMirrorMimeMode.js",
-  "front_end/cm_modes/jsx.js",
-  "front_end/cm_modes/livescript.js",
-  "front_end/cm_modes/markdown.js",
-  "front_end/cm_modes/module.json",
-  "front_end/cm_modes/php.js",
-  "front_end/cm_modes/python.js",
-  "front_end/cm_modes/shell.js",
-  "front_end/cm_modes/stylus.js",
-  "front_end/cm_web_modes/css.js",
-  "front_end/cm_web_modes/htmlembedded.js",
-  "front_end/cm_web_modes/htmlmixed.js",
-  "front_end/cm_web_modes/javascript.js",
-  "front_end/cm_web_modes/xml.js",
-  "front_end/color_picker/ContrastDetails.js",
-  "front_end/color_picker/ContrastInfo.js",
-  "front_end/color_picker/ContrastOverlay.js",
-  "front_end/color_picker/module.json",
-  "front_end/color_picker/spectrum.css",
-  "front_end/color_picker/Spectrum.js",
-  "front_end/common/module.json",
-  "front_end/components/DockController.js",
-  "front_end/components/ImagePreview.js",
-  "front_end/components/imagePreview.css",
-  "front_end/components/JSPresentationUtils.js",
-  "front_end/components/Linkifier.js",
-  "front_end/components/TargetDetachedDialog.js",
-  "front_end/components/Reload.js",
-  "front_end/components/jsUtils.css",
-  "front_end/components/module.json",
-  "front_end/console/ConsoleContextSelector.js",
-  "front_end/console/ConsoleFilter.js",
-  "front_end/console/ConsoleSidebar.js",
-  "front_end/console/ConsolePanel.js",
-  "front_end/console/ConsolePinPane.js",
-  "front_end/console/ConsolePrompt.js",
-  "front_end/console/consoleView.css",
-  "front_end/console/consoleContextSelector.css",
-  "front_end/console/consolePinPane.css",
-  "front_end/console/consolePrompt.css",
-  "front_end/console/consoleSidebar.css",
-  "front_end/console/ConsoleView.js",
-  "front_end/console/ConsoleViewMessage.js",
-  "front_end/console/ConsoleViewport.js",
-  "front_end/console/module.json",
-  "front_end/console_counters/errorWarningCounter.css",
-  "front_end/console_counters/module.json",
-  "front_end/console_counters/WarningErrorCounter.js",
-  "front_end/console_test_runner/ConsoleTestRunner.js",
-  "front_end/console_test_runner/module.json",
-  "front_end/cookie_table/CookiesTable.js",
-  "front_end/cookie_table/module.json",
-  "front_end/coverage/coverageListView.css",
-  "front_end/coverage/CoverageDecorationManager.js",
-  "front_end/coverage/CoverageListView.js",
-  "front_end/coverage/CoverageModel.js",
-  "front_end/coverage/coverageView.css",
-  "front_end/coverage/CoverageView.js",
-  "front_end/coverage/module.json",
-  "front_end/coverage_test_runner/CoverageTestRunner.js",
-  "front_end/coverage_test_runner/module.json",
-  "front_end/cpu_profiler_test_runner/module.json",
-  "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js",
-  "front_end/dagre_layout/dagre.js",
-  "front_end/dagre_layout/module.json",
-  "front_end/data_grid/dataGrid.css",
-  "front_end/data_grid/DataGrid.js",
-  "front_end/data_grid/module.json",
-  "front_end/data_grid/ShowMoreDataGridNode.js",
-  "front_end/data_grid/SortableDataGrid.js",
-  "front_end/data_grid/ViewportDataGrid.js",
-  "front_end/data_grid_test_runner/DataGridTestRunner.js",
-  "front_end/data_grid_test_runner/module.json",
-  "front_end/device_mode_test_runner/DeviceModeTestRunner.js",
-  "front_end/device_mode_test_runner/module.json",
-  "front_end/devices/DevicesView.js",
-  "front_end/devices/devicesView.css",
-  "front_end/devices/module.json",
-  "front_end/diff/diff_match_patch.js",
-  "front_end/diff/Diff.js",
-  "front_end/diff/module.json",
-  "front_end/dom_extension/module.json",
-  "front_end/elements/breadcrumbs.css",
-  "front_end/elements/classesPaneWidget.css",
-  "front_end/elements/ClassesPaneWidget.js",
-  "front_end/elements/ColorSwatchPopoverIcon.js",
-  "front_end/elements/ComputedStyleModel.js",
-  "front_end/elements/computedStyleSidebarPane.css",
-  "front_end/elements/computedStyleWidgetTree.css",
-  "front_end/elements/ComputedStyleWidget.js",
-  "front_end/elements/DOMLinkifier.js",
-  "front_end/elements/domLinkifier.css",
-  "front_end/elements/DOMPath.js",
-  "front_end/elements/ElementsBreadcrumbs.js",
-  "front_end/elements/elementsPanel.css",
-  "front_end/elements/ElementsPanel.js",
-  "front_end/elements/ElementsSidebarPane.js",
-  "front_end/elements/elementStatePaneWidget.css",
-  "front_end/elements/ElementStatePaneWidget.js",
-  "front_end/elements/ElementsTreeElement.js",
-  "front_end/elements/ElementsTreeElementHighlighter.js",
-  "front_end/elements/elementsTreeOutline.css",
-  "front_end/elements/ElementsTreeOutline.js",
-  "front_end/elements/EventListenersWidget.js",
-  "front_end/elements/InspectElementModeController.js",
-  "front_end/elements/MarkerDecorator.js",
-  "front_end/elements/metricsSidebarPane.css",
-  "front_end/elements/MetricsSidebarPane.js",
-  "front_end/elements/nodeStackTraceWidget.css",
-  "front_end/elements/NodeStackTraceWidget.js",
-  "front_end/elements/module.json",
-  "front_end/elements/platformFontsWidget.css",
-  "front_end/elements/PlatformFontsWidget.js",
-  "front_end/elements/propertiesWidget.css",
-  "front_end/elements/PropertiesWidget.js",
-  "front_end/elements/StylePropertyHighlighter.js",
-  "front_end/elements/stylesSectionTree.css",
-  "front_end/elements/stylesSidebarPane.css",
-  "front_end/elements/StylesSidebarPane.js",
-  "front_end/elements/StylePropertyTreeElement.js",
-  "front_end/elements_test_runner/EditDOMTestRunner.js",
-  "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js",
-  "front_end/elements_test_runner/ElementsTestRunner.js",
-  "front_end/elements_test_runner/module.json",
-  "front_end/elements_test_runner/SetOuterHTMLTestRunner.js",
-  "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js",
-  "front_end/emulated_devices/module.json",
-  "front_end/emulation/AdvancedApp.js",
-  "front_end/emulation/DeviceModeModel.js",
-  "front_end/emulation/deviceModeToolbar.css",
-  "front_end/emulation/DeviceModeToolbar.js",
-  "front_end/emulation/deviceModeView.css",
-  "front_end/emulation/DeviceModeView.js",
-  "front_end/emulation/DeviceModeWrapper.js",
-  "front_end/emulation/devicesSettingsTab.css",
-  "front_end/emulation/DevicesSettingsTab.js",
-  "front_end/emulation/EmulatedDevices.js",
-  "front_end/emulation/geolocationsSettingsTab.css",
-  "front_end/emulation/GeolocationsSettingsTab.js",
-  "front_end/emulation/inspectedPagePlaceholder.css",
-  "front_end/emulation/InspectedPagePlaceholder.js",
-  "front_end/emulation/mediaQueryInspector.css",
-  "front_end/emulation/MediaQueryInspector.js",
-  "front_end/emulation/module.json",
-  "front_end/emulation/sensors.css",
-  "front_end/emulation/SensorsView.js",
-  "front_end/event_listeners/EventListenersUtils.js",
-  "front_end/event_listeners/eventListenersView.css",
-  "front_end/event_listeners/EventListenersView.js",
-  "front_end/event_listeners/module.json",
-  "front_end/extensions/ExtensionAPI.js",
-  "front_end/extensions/ExtensionPanel.js",
-  "front_end/extensions/ExtensionServer.js",
-  "front_end/extensions/ExtensionTraceProvider.js",
-  "front_end/extensions/ExtensionView.js",
-  "front_end/extensions/module.json",
-  "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js",
-  "front_end/extensions_test_runner/ExtensionsTestRunner.js",
-  "front_end/extensions_test_runner/module.json",
-  "front_end/formatter/FormatterWorkerPool.js",
-  "front_end/formatter/module.json",
-  "front_end/formatter/ScriptFormatter.js",
-  "front_end/formatter_worker.js",
-  "front_end/formatter_worker.json",
-  "front_end/formatter_worker/AcornTokenizer.js",
-  "front_end/formatter_worker/CSSFormatter.js",
-  "front_end/formatter_worker/CSSRuleParser.js",
-  "front_end/formatter_worker/ESTreeWalker.js",
-  "front_end/formatter_worker/FormattedContentBuilder.js",
-  "front_end/formatter_worker/FormatterWorker.js",
-  "front_end/formatter_worker/HTMLFormatter.js",
-  "front_end/formatter_worker/IdentityFormatter.js",
-  "front_end/formatter_worker/JavaScriptFormatter.js",
-  "front_end/formatter_worker/JavaScriptOutline.js",
-  "front_end/formatter_worker/RelaxedJSONParser.js",
-  "front_end/formatter_worker/acorn/acorn.js",
-  "front_end/formatter_worker/acorn/acorn_loose.js",
-  "front_end/formatter_worker/module.json",
-  "front_end/har_importer/HARFormat.js",
-  "front_end/har_importer/HARImporter.js",
-  "front_end/har_importer/module.json",
-  "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js",
-  "front_end/heap_profiler_test_runner/module.json",
-  "front_end/heap_snapshot_model/HeapSnapshotModel.js",
-  "front_end/heap_snapshot_model/module.json",
-  "front_end/heap_snapshot_worker.js",
-  "front_end/heap_snapshot_worker.json",
-  "front_end/heap_snapshot_worker/AllocationProfile.js",
-  "front_end/heap_snapshot_worker/HeapSnapshot.js",
-  "front_end/heap_snapshot_worker/HeapSnapshotLoader.js",
-  "front_end/heap_snapshot_worker/HeapSnapshotWorker.js",
-  "front_end/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js",
-  "front_end/heap_snapshot_worker/module.json",
-  "front_end/help/Help.js",
-  "front_end/help/module.json",
-  "front_end/help/releaseNote.css",
-  "front_end/help/ReleaseNoteText.js",
-  "front_end/help/ReleaseNoteView.js",
-  "front_end/host/module.json",
-  "front_end/inline_editor/bezierEditor.css",
-  "front_end/inline_editor/BezierEditor.js",
-  "front_end/inline_editor/bezierSwatch.css",
-  "front_end/inline_editor/BezierUI.js",
-  "front_end/inline_editor/colorSwatch.css",
-  "front_end/inline_editor/ColorSwatch.js",
-  "front_end/inline_editor/cssShadowEditor.css",
-  "front_end/inline_editor/CSSShadowEditor.js",
-  "front_end/inline_editor/CSSShadowModel.js",
-  "front_end/inline_editor/cssShadowSwatch.css",
-  "front_end/inline_editor/module.json",
-  "front_end/inline_editor/swatchPopover.css",
-  "front_end/inline_editor/SwatchPopoverHelper.js",
-  "front_end/inspector.js",
-  "front_end/inspector.json",
-  "front_end/inspector_main/InspectorMain.js",
-  "front_end/inspector_main/module.json",
-  "front_end/inspector_main/nodeIcon.css",
-  "front_end/inspector_main/renderingOptions.css",
-  "front_end/inspector_main/RenderingOptions.js",
-  "front_end/integration_test_runner.js",
-  "front_end/integration_test_runner.json",
-  "front_end/javascript_metadata/module.json",
-  "front_end/javascript_metadata/NativeFunctions.js",
-  "front_end/javascript_metadata/JavaScriptMetadata.js",
-  "front_end/js_main/JsMain.js",
-  "front_end/js_main/module.json",
-  "front_end/js_profiler/module.json",
-  "front_end/layer_viewer/layerDetailsView.css",
-  "front_end/layer_viewer/LayerDetailsView.js",
-  "front_end/layer_viewer/layers3DView.css",
-  "front_end/layer_viewer/Layers3DView.js",
-  "front_end/layer_viewer/LayerTreeOutline.js",
-  "front_end/layer_viewer/LayerViewHost.js",
-  "front_end/layer_viewer/module.json",
-  "front_end/layer_viewer/paintProfiler.css",
-  "front_end/layer_viewer/PaintProfilerView.js",
-  "front_end/layer_viewer/TransformController.js",
-  "front_end/layers/LayerPaintProfilerView.js",
-  "front_end/layers/LayersPanel.js",
-  "front_end/layers/LayerTreeModel.js",
-  "front_end/layers/module.json",
-  "front_end/layers_test_runner/LayersTestRunner.js",
-  "front_end/layers_test_runner/module.json",
-  "front_end/main/ExecutionContextSelector.js",
-  "front_end/main/Main.js",
-  "front_end/main/module.json",
-  "front_end/main/SimpleApp.js",
-  "front_end/protocol_monitor/ProtocolMonitor.js",
-  "front_end/protocol_monitor/protocolMonitor.css",
-  "front_end/protocol_monitor/module.json",
-  "front_end/mobile_throttling/MobileThrottlingSelector.js",
-  "front_end/mobile_throttling/module.json",
-  "front_end/mobile_throttling/NetworkPanelIndicator.js",
-  "front_end/mobile_throttling/NetworkThrottlingSelector.js",
-  "front_end/mobile_throttling/ThrottlingManager.js",
-  "front_end/mobile_throttling/ThrottlingPresets.js",
-  "front_end/mobile_throttling/throttlingSettingsTab.css",
-  "front_end/mobile_throttling/ThrottlingSettingsTab.js",
-  "front_end/media/eventDisplayTable.css",
-  "front_end/media/EventDisplayTable.js",
-  "front_end/media/MainView.js",
-  "front_end/media/MediaTable.js",
-  "front_end/media/PlayerDetailView.js",
-  "front_end/media/playerListView.css",
-  "front_end/media/PlayerListView.js",
-  "front_end/media/module.json",
-  "front_end/media/MediaModel.js",
-  "front_end/media/mediaView.css",
-  "front_end/ndb_app.json",
-  "front_end/network/binaryResourceView.css",
-  "front_end/network/blockedURLsPane.css",
-  "front_end/network/BinaryResourceView.js",
-  "front_end/network/BlockedURLsPane.js",
-  "front_end/network/eventSourceMessagesView.css",
-  "front_end/network/EventSourceMessagesView.js",
-  "front_end/network/HARWriter.js",
-  "front_end/network/module.json",
-  "front_end/network/networkConfigView.css",
-  "front_end/network/NetworkConfigView.js",
-  "front_end/network/NetworkDataGridNode.js",
-  "front_end/network/NetworkItemView.js",
-  "front_end/network/networkLogView.css",
-  "front_end/network/NetworkLogView.js",
-  "front_end/network/NetworkLogViewColumns.js",
-  "front_end/network/NetworkFrameGrouper.js",
-  "front_end/network/networkManageCustomHeadersView.css",
-  "front_end/network/NetworkManageCustomHeadersView.js",
-  "front_end/network/NetworkOverview.js",
-  "front_end/network/networkPanel.css",
-  "front_end/network/NetworkPanel.js",
-  "front_end/network/NetworkSearchScope.js",
-  "front_end/network/NetworkTimeCalculator.js",
-  "front_end/network/networkTimingTable.css",
-  "front_end/network/networkWaterfallColumn.css",
-  "front_end/network/NetworkWaterfallColumn.js",
-  "front_end/network/requestCookiesView.css",
-  "front_end/network/RequestCookiesView.js",
-  "front_end/network/requestHeadersTree.css",
-  "front_end/network/requestHeadersView.css",
-  "front_end/network/RequestHeadersView.js",
-  "front_end/network/requestHTMLView.css",
-  "front_end/network/RequestHTMLView.js",
-  "front_end/network/requestInitiatorView.css",
-  "front_end/network/RequestInitiatorView.js",
-  "front_end/network/RequestPreviewView.js",
-  "front_end/network/RequestResponseView.js",
-  "front_end/network/RequestTimingView.js",
-  "front_end/network/ResourceWebSocketFrameView.js",
-  "front_end/network/signedExchangeInfoTree.css",
-  "front_end/network/signedExchangeInfoView.css",
-  "front_end/network/SignedExchangeInfoView.js",
-  "front_end/network/webSocketFrameView.css",
-  "front_end/network_test_runner/module.json",
-  "front_end/network_test_runner/NetworkTestRunner.js",
-  "front_end/network_test_runner/ProductRegistryTestRunner.js",
-  "front_end/node_debugger/module.json",
-  "front_end/node_main/NodeConnectionsPanel.js",
-  "front_end/node_main/nodeConnectionsPanel.css",
-  "front_end/node_main/NodeMain.js",
-  "front_end/node_main/module.json",
-  "front_end/object_ui/customPreviewComponent.css",
-  "front_end/object_ui/CustomPreviewComponent.js",
-  "front_end/object_ui/JavaScriptAutocomplete.js",
-  "front_end/object_ui/JavaScriptREPL.js",
-  "front_end/object_ui/module.json",
-  "front_end/object_ui/objectPopover.css",
-  "front_end/object_ui/ObjectPopoverHelper.js",
-  "front_end/object_ui/objectPropertiesSection.css",
-  "front_end/object_ui/ObjectPropertiesSection.js",
-  "front_end/object_ui/objectValue.css",
-  "front_end/object_ui/RemoteObjectPreviewFormatter.js",
-  "front_end/perf_ui/ChartViewport.js",
-  "front_end/perf_ui/FilmStripView.js",
-  "front_end/perf_ui/FlameChart.js",
-  "front_end/perf_ui/GCActionDelegate.js",
-  "front_end/perf_ui/LineLevelProfile.js",
-  "front_end/perf_ui/LiveHeapProfile.js",
-  "front_end/perf_ui/NetworkPriorities.js",
-  "front_end/perf_ui/OverviewGrid.js",
-  "front_end/perf_ui/PieChart.js",
-  "front_end/perf_ui/TimelineGrid.js",
-  "front_end/perf_ui/TimelineOverviewPane.js",
-  "front_end/perf_ui/chartViewport.css",
-  "front_end/perf_ui/filmStripView.css",
-  "front_end/perf_ui/flameChart.css",
-  "front_end/perf_ui/module.json",
-  "front_end/perf_ui/overviewGrid.css",
-  "front_end/perf_ui/pieChart.css",
-  "front_end/perf_ui/timelineGrid.css",
-  "front_end/perf_ui/timelineOverviewInfo.css",
-  "front_end/performance_monitor/PerformanceMonitor.js",
-  "front_end/performance_monitor/performanceMonitor.css",
-  "front_end/performance_monitor/module.json",
-  "front_end/performance_test_runner/module.json",
-  "front_end/performance_test_runner/TimelineDataTestRunner.js",
-  "front_end/performance_test_runner/TimelineTestRunner.js",
-  "front_end/persistence/Automapping.js",
-  "front_end/persistence/editFileSystemView.css",
-  "front_end/persistence/EditFileSystemView.js",
-  "front_end/persistence/FileSystemWorkspaceBinding.js",
-  "front_end/persistence/IsolatedFileSystem.js",
-  "front_end/persistence/IsolatedFileSystemManager.js",
-  "front_end/persistence/module.json",
-  "front_end/persistence/NetworkPersistenceManager.js",
-  "front_end/persistence/Persistence.js",
-  "front_end/persistence/PersistenceActions.js",
-  "front_end/persistence/PersistenceUtils.js",
-  "front_end/persistence/PlatformFileSystem.js",
-  "front_end/persistence/workspaceSettingsTab.css",
-  "front_end/persistence/WorkspaceSettingsTab.js",
-  "front_end/platform/module.json",
-  "front_end/product_registry/BadgePool.js",
-  "front_end/product_registry/ProductRegistry.js",
-  "front_end/product_registry/badge.css",
-  "front_end/product_registry/module.json",
-  "front_end/product_registry/popup.css",
-  "front_end/product_registry_impl/module.json",
-  "front_end/product_registry_impl/ProductRegistryImpl.js",
-  "front_end/product_registry_impl/ProductRegistryData.js",
-  "front_end/product_registry_impl/sha1/sha1.js",
-  "front_end/profiler/BottomUpProfileDataGrid.js",
-  "front_end/profiler/CPUProfileFlameChart.js",
-  "front_end/profiler/CPUProfileView.js",
-  "front_end/profiler/heapProfiler.css",
-  "front_end/profiler/HeapProfileView.js",
-  "front_end/profiler/HeapProfilerPanel.js",
-  "front_end/profiler/HeapSnapshotDataGrids.js",
-  "front_end/profiler/HeapSnapshotGridNodes.js",
-  "front_end/profiler/HeapSnapshotProxy.js",
-  "front_end/profiler/HeapSnapshotView.js",
-  "front_end/profiler/HeapTimelineOverview.js",
-  "front_end/profiler/IsolateSelector.js",
-  "front_end/profiler/LiveHeapProfileView.js",
-  "front_end/profiler/liveHeapProfile.css",
-  "front_end/profiler/module.json",
-  "front_end/profiler/ProfileDataGrid.js",
-  "front_end/profiler/ProfileHeader.js",
-  "front_end/profiler/profileLauncherView.css",
-  "front_end/profiler/ProfileLauncherView.js",
-  "front_end/profiler/ProfileType.js",
-  "front_end/profiler/profilesPanel.css",
-  "front_end/profiler/ProfilesPanel.js",
-  "front_end/profiler/profilesSidebarTree.css",
-  "front_end/profiler/ProfileTypeRegistry.js",
-  "front_end/profiler/ProfileView.js",
-  "front_end/profiler/TopDownProfileDataGrid.js",
-  "front_end/protocol/module.json",
-  "front_end/quick_open/CommandMenu.js",
-  "front_end/quick_open/filteredListWidget.css",
-  "front_end/quick_open/FilteredListWidget.js",
-  "front_end/quick_open/HelpQuickOpen.js",
-  "front_end/quick_open/QuickOpen.js",
-  "front_end/quick_open/module.json",
-  "front_end/resources/ApplicationCacheModel.js",
-  "front_end/resources/ApplicationCacheItemsView.js",
-  "front_end/resources/ApplicationPanelSidebar.js",
-  "front_end/resources/appManifestView.css",
-  "front_end/resources/AppManifestView.js",
-  "front_end/resources/BackgroundServiceModel.js",
-  "front_end/resources/backgroundServiceView.css",
-  "front_end/resources/BackgroundServiceView.js",
-  "front_end/resources/clearStorageView.css",
-  "front_end/resources/ClearStorageView.js",
-  "front_end/resources/CookieItemsView.js",
-  "front_end/resources/cookieItemsView.css",
-  "front_end/resources/DatabaseModel.js",
-  "front_end/resources/DatabaseQueryView.js",
-  "front_end/resources/DatabaseTableView.js",
-  "front_end/resources/DOMStorageItemsView.js",
-  "front_end/resources/DOMStorageModel.js",
-  "front_end/resources/IndexedDBModel.js",
-  "front_end/resources/indexedDBViews.css",
-  "front_end/resources/IndexedDBViews.js",
-  "front_end/resources/module.json",
-  "front_end/resources/resourcesPanel.css",
-  "front_end/resources/ResourcesPanel.js",
-  "front_end/resources/ResourcesSection.js",
-  "front_end/resources/resourcesSidebar.css",
-  "front_end/resources/serviceWorkerCacheViews.css",
-  "front_end/resources/ServiceWorkerCacheViews.js",
-  "front_end/resources/serviceWorkersView.css",
-  "front_end/resources/ServiceWorkersView.js",
-  "front_end/resources/StorageItemsView.js",
-  "front_end/shell.json",
-  "front_end/screencast/InputModel.js",
-  "front_end/screencast/module.json",
-  "front_end/screencast/ScreencastApp.js",
-  "front_end/screencast/screencastView.css",
-  "front_end/screencast/ScreencastView.js",
-  "front_end/sdk/module.json",
-  "front_end/sdk_test_runner/module.json",
-  "front_end/sdk_test_runner/PageMockTestRunner.js",
-  "front_end/search/module.json",
-  "front_end/search/SearchConfig.js",
-  "front_end/search/searchResultsPane.css",
-  "front_end/search/SearchResultsPane.js",
-  "front_end/search/searchView.css",
-  "front_end/search/SearchView.js",
-  "front_end/security/lockIcon.css",
-  "front_end/security/mainView.css",
-  "front_end/security/module.json",
-  "front_end/security/originView.css",
-  "front_end/security/SecurityModel.js",
-  "front_end/security/SecurityPanel.js",
-  "front_end/security/sidebar.css",
-  "front_end/security_test_runner/module.json",
-  "front_end/security_test_runner/SecurityTestRunner.js",
-  "front_end/services/module.json",
-  "front_end/settings/frameworkBlackboxSettingsTab.css",
-  "front_end/settings/FrameworkBlackboxSettingsTab.js",
-  "front_end/settings/module.json",
-  "front_end/settings/settingsScreen.css",
-  "front_end/settings/SettingsScreen.js",
-  "front_end/snippets/module.json",
-  "front_end/snippets/ScriptSnippetFileSystem.js",
-  "front_end/snippets/SnippetsQuickOpen.js",
-  "front_end/source_frame/BinaryResourceViewFactory.js",
-  "front_end/source_frame/fontView.css",
-  "front_end/source_frame/FontView.js",
-  "front_end/source_frame/imageView.css",
-  "front_end/source_frame/jsonView.css",
-  "front_end/source_frame/JSONView.js",
-  "front_end/source_frame/ImageView.js",
-  "front_end/source_frame/messagesPopover.css",
-  "front_end/source_frame/module.json",
-  "front_end/source_frame/PreviewFactory.js",
-  "front_end/source_frame/resourceSourceFrame.css",
-  "front_end/source_frame/ResourceSourceFrame.js",
-  "front_end/source_frame/SourceCodeDiff.js",
-  "front_end/source_frame/SourceFrame.js",
-  "front_end/source_frame/SourcesTextEditor.js",
-  "front_end/source_frame/xmlTree.css",
-  "front_end/source_frame/xmlView.css",
-  "front_end/source_frame/XMLView.js",
-  "front_end/sources/AddSourceMapURLDialog.js",
-  "front_end/sources/breakpointEditDialog.css",
-  "front_end/sources/BreakpointEditDialog.js",
-  "front_end/sources/callStackSidebarPane.css",
-  "front_end/sources/CallStackSidebarPane.js",
-  "front_end/sources/CSSPlugin.js",
-  "front_end/sources/DebuggerPlugin.js",
-  "front_end/sources/dialog.css",
-  "front_end/sources/debuggerPausedMessage.css",
-  "front_end/sources/DebuggerPausedMessage.js",
-  "front_end/sources/EditingLocationHistoryManager.js",
-  "front_end/sources/FilePathScoreFunction.js",
-  "front_end/sources/FilteredUISourceCodeListProvider.js",
-  "front_end/sources/GoToLineQuickOpen.js",
-  "front_end/sources/GutterDiffPlugin.js",
-  "front_end/sources/InplaceFormatterEditorAction.js",
-  "front_end/sources/javaScriptBreakpointsSidebarPane.css",
-  "front_end/sources/JavaScriptBreakpointsSidebarPane.js",
-  "front_end/sources/JavaScriptCompilerPlugin.js",
-  "front_end/sources/module.json",
-  "front_end/sources/navigatorTree.css",
-  "front_end/sources/navigatorView.css",
-  "front_end/sources/NavigatorView.js",
-  "front_end/sources/OpenFileQuickOpen.js",
-  "front_end/sources/OutlineQuickOpen.js",
-  "front_end/sources/scopeChainSidebarPane.css",
-  "front_end/sources/ScopeChainSidebarPane.js",
-  "front_end/sources/ScriptFormatterEditorAction.js",
-  "front_end/sources/ScriptOriginPlugin.js",
-  "front_end/sources/SearchSourcesView.js",
-  "front_end/sources/SimpleHistoryManager.js",
-  "front_end/sources/SnippetsPlugin.js",
-  "front_end/sources/SourceFormatter.js",
-  "front_end/sources/SourceMapNamesResolver.js",
-  "front_end/sources/SourcesNavigator.js",
-  "front_end/sources/sourcesPanel.css",
-  "front_end/sources/SourcesPanel.js",
-  "front_end/sources/SourcesSearchScope.js",
-  "front_end/sources/sourcesView.css",
-  "front_end/sources/SourcesView.js",
-  "front_end/sources/UISourceCodeFrame.js",
-  "front_end/sources/TabbedEditorContainer.js",
-  "front_end/sources/threadsSidebarPane.css",
-  "front_end/sources/ThreadsSidebarPane.js",
-  "front_end/sources/watchExpressionsSidebarPane.css",
-  "front_end/sources/WatchExpressionsSidebarPane.js",
-  "front_end/sources_test_runner/AutocompleteTestRunner.js",
-  "front_end/sources_test_runner/DebuggerTestRunner.js",
-  "front_end/sources_test_runner/EditorTestRunner.js",
-  "front_end/sources_test_runner/LiveEditTestRunner.js",
-  "front_end/sources_test_runner/SearchTestRunner.js",
-  "front_end/sources_test_runner/SourcesTestRunner.js",
-  "front_end/sources_test_runner/module.json",
-  "front_end/terminal/module.json",
-  "front_end/terminal/terminal.css",
-  "front_end/terminal/TerminalWidget.js",
-  "front_end/terminal/xterm.js/addons/fit/fit.js",
-  "front_end/terminal/xterm.js/build/xterm.css",
-  "front_end/terminal/xterm.js/build/xterm.js",
-  "front_end/test_runner/module.json",
-  "front_end/test_runner/TestRunner.js",
-  "front_end/text_editor/autocompleteTooltip.css",
-  "front_end/text_editor/cmdevtools.css",
-  "front_end/text_editor/CodeMirrorTextEditor.js",
-  "front_end/text_editor/CodeMirrorUtils.js",
-  "front_end/text_editor/module.json",
-  "front_end/text_editor/TextEditorAutocompleteController.js",
-  "front_end/text_utils/module.json",
-  "front_end/text_utils/Text.js",
-  "front_end/text_utils/TextRange.js",
-  "front_end/text_utils/TextUtils.js",
-  "front_end/timeline_model/module.json",
-  "front_end/timeline_model/TimelineFrameModel.js",
-  "front_end/timeline_model/TimelineIRModel.js",
-  "front_end/timeline_model/TimelineJSProfile.js",
-  "front_end/timeline_model/TimelineModel.js",
-  "front_end/timeline_model/TimelineModelFilter.js",
-  "front_end/timeline_model/TimelineProfileTree.js",
-  "front_end/timeline_model/TracingLayerTree.js",
-  "front_end/timeline/CountersGraph.js",
-  "front_end/timeline/EventsTimelineTreeView.js",
-  "front_end/timeline/ExtensionTracingSession.js",
-  "front_end/timeline/historyToolbarButton.css",
-  "front_end/timeline/invalidationsTree.css",
-  "front_end/timeline/module.json",
-  "front_end/timeline/PerformanceModel.js",
-  "front_end/timeline/TimelineController.js",
-  "front_end/timeline/TimelineDetailsView.js",
-  "front_end/timeline/TimelineEventOverview.js",
-  "front_end/timeline/TimelineFilters.js",
-  "front_end/timeline/TimelineFlameChartDataProvider.js",
-  "front_end/timeline/TimelineFlameChartNetworkDataProvider.js",
-  "front_end/timeline/timelineFlamechartPopover.css",
-  "front_end/timeline/TimelineFlameChartView.js",
-  "front_end/timeline/timelineHistoryManager.css",
-  "front_end/timeline/TimelineHistoryManager.js",
-  "front_end/timeline/TimelineLayersView.js",
-  "front_end/timeline/TimelineLoader.js",
-  "front_end/timeline/timelinePaintProfiler.css",
-  "front_end/timeline/TimelinePaintProfilerView.js",
-  "front_end/timeline/timelinePanel.css",
-  "front_end/timeline/TimelinePanel.js",
-  "front_end/timeline/timelineStatusDialog.css",
-  "front_end/timeline/TimelineTreeView.js",
-  "front_end/timeline/TimelineUIUtils.js",
-  "front_end/timeline/UIDevtoolsController.js",
-  "front_end/timeline/UIDevtoolsUtils.js",
-  "front_end/toolbox_bootstrap/module.json",
-  "front_end/toolbox_bootstrap/Toolbox.js",
-  "front_end/toolbox.js",
-  "front_end/toolbox.json",
-  "front_end/ui/checkboxTextLabel.css",
-  "front_end/ui/closeButton.css",
-  "front_end/ui/confirmDialog.css",
-  "front_end/ui/dialog.css",
-  "front_end/ui/dropTarget.css",
-  "front_end/ui/emptyWidget.css",
-  "front_end/ui/filter.css",
-  "front_end/ui/glassPane.css",
-  "front_end/ui/infobar.css",
-  "front_end/ui/inlineButton.css",
-  "front_end/ui/inspectorCommon.css",
-  "front_end/ui/inspectorStyle.css",
-  "front_end/ui/inspectorSyntaxHighlight.css",
-  "front_end/ui/inspectorSyntaxHighlightDark.css",
-  "front_end/ui/inspectorViewTabbedPane.css",
-  "front_end/ui/listWidget.css",
-  "front_end/ui/module.json",
-  "front_end/ui/popover.css",
-  "front_end/ui/progressIndicator.css",
-  "front_end/ui/radioButton.css",
-  "front_end/ui/reportView.css",
-  "front_end/ui/remoteDebuggingTerminatedScreen.css",
-  "front_end/ui/rootView.css",
-  "front_end/ui/searchableView.css",
-  "front_end/ui/segmentedButton.css",
-  "front_end/ui/slider.css",
-  "front_end/ui/smallBubble.css",
-  "front_end/ui/softContextMenu.css",
-  "front_end/ui/softDropDown.css",
-  "front_end/ui/softDropDownButton.css",
-  "front_end/ui/splitWidget.css",
-  "front_end/ui/suggestBox.css",
-  "front_end/ui/tabbedPane.css",
-  "front_end/ui/targetCrashedScreen.css",
-  "front_end/ui/textButton.css",
-  "front_end/ui/textPrompt.css",
-  "front_end/ui/toolbar.css",
-  "front_end/ui/tooltip.css",
-  "front_end/ui/treeoutline.css",
-  "front_end/ui/viewContainers.css",
-  "front_end/web_audio/AudioContextContentBuilder.js",
-  "front_end/web_audio/audioContextSelector.css",
-  "front_end/web_audio/AudioContextSelector.js",
-  "front_end/web_audio/module.json",
-  "front_end/web_audio/webAudio.css",
-  "front_end/web_audio/WebAudioModel.js",
-  "front_end/web_audio/WebAudioView.js",
-  "front_end/web_audio/graph_visualizer/Types.js",
-  "front_end/web_audio/graph_visualizer/GraphStyle.js",
-  "front_end/web_audio/graph_visualizer/GraphManager.js",
-  "front_end/web_audio/graph_visualizer/NodeRendererUtility.js",
-  "front_end/web_audio/graph_visualizer/NodeView.js",
-  "front_end/web_audio/graph_visualizer/EdgeView.js",
-  "front_end/web_audio/graph_visualizer/GraphView.js",
-  "front_end/worker_main/WorkerMain.js",
-  "front_end/worker_main/module.json",
-  "front_end/worker_service/module.json",
-  "front_end/worker_service/ServiceDispatcher.js",
-  "front_end/workspace/module.json",
-  "front_end/workspace_diff/WorkspaceDiff.js",
-  "front_end/workspace_diff/module.json",
-]
-
-lighthouse_locale_files = [
-  "front_end/audits_worker/lighthouse/locales/ar-XB.json",
-  "front_end/audits_worker/lighthouse/locales/ar.json",
-  "front_end/audits_worker/lighthouse/locales/bg.json",
-  "front_end/audits_worker/lighthouse/locales/ca.json",
-  "front_end/audits_worker/lighthouse/locales/cs.json",
-  "front_end/audits_worker/lighthouse/locales/da.json",
-  "front_end/audits_worker/lighthouse/locales/de.json",
-  "front_end/audits_worker/lighthouse/locales/el.json",
-  "front_end/audits_worker/lighthouse/locales/en-GB.json",
-  "front_end/audits_worker/lighthouse/locales/en-US.json",
-  "front_end/audits_worker/lighthouse/locales/en-XA.json",
-  "front_end/audits_worker/lighthouse/locales/en-XL.json",
-  "front_end/audits_worker/lighthouse/locales/es-419.json",
-  "front_end/audits_worker/lighthouse/locales/es.json",
-  "front_end/audits_worker/lighthouse/locales/fi.json",
-  "front_end/audits_worker/lighthouse/locales/fil.json",
-  "front_end/audits_worker/lighthouse/locales/fr.json",
-  "front_end/audits_worker/lighthouse/locales/he.json",
-  "front_end/audits_worker/lighthouse/locales/hi.json",
-  "front_end/audits_worker/lighthouse/locales/hr.json",
-  "front_end/audits_worker/lighthouse/locales/hu.json",
-  "front_end/audits_worker/lighthouse/locales/id.json",
-  "front_end/audits_worker/lighthouse/locales/it.json",
-  "front_end/audits_worker/lighthouse/locales/ja.json",
-  "front_end/audits_worker/lighthouse/locales/ko.json",
-  "front_end/audits_worker/lighthouse/locales/lt.json",
-  "front_end/audits_worker/lighthouse/locales/lv.json",
-  "front_end/audits_worker/lighthouse/locales/nl.json",
-  "front_end/audits_worker/lighthouse/locales/no.json",
-  "front_end/audits_worker/lighthouse/locales/pl.json",
-  "front_end/audits_worker/lighthouse/locales/pt-PT.json",
-  "front_end/audits_worker/lighthouse/locales/pt.json",
-  "front_end/audits_worker/lighthouse/locales/ro.json",
-  "front_end/audits_worker/lighthouse/locales/ru.json",
-  "front_end/audits_worker/lighthouse/locales/sk.json",
-  "front_end/audits_worker/lighthouse/locales/sl.json",
-  "front_end/audits_worker/lighthouse/locales/sr-Latn.json",
-  "front_end/audits_worker/lighthouse/locales/sr.json",
-  "front_end/audits_worker/lighthouse/locales/sv.json",
-  "front_end/audits_worker/lighthouse/locales/ta.json",
-  "front_end/audits_worker/lighthouse/locales/te.json",
-  "front_end/audits_worker/lighthouse/locales/th.json",
-  "front_end/audits_worker/lighthouse/locales/tr.json",
-  "front_end/audits_worker/lighthouse/locales/uk.json",
-  "front_end/audits_worker/lighthouse/locales/vi.json",
-  "front_end/audits_worker/lighthouse/locales/zh-HK.json",
-  "front_end/audits_worker/lighthouse/locales/zh-TW.json",
-  "front_end/audits_worker/lighthouse/locales/zh.json",
-]
-
-all_devtools_files += lighthouse_locale_files
-
-all_devtools_modules = [
-  "front_end/bindings/bindings.js",
-  "front_end/bindings/TempFile.js",
-  "front_end/bindings/StylesSourceMapping.js",
-  "front_end/bindings/SASSSourceMapping.js",
-  "front_end/bindings/ResourceUtils.js",
-  "front_end/bindings/ResourceScriptMapping.js",
-  "front_end/bindings/ResourceMapping.js",
-  "front_end/bindings/PresentationConsoleMessageHelper.js",
-  "front_end/bindings/NetworkProject.js",
-  "front_end/bindings/LiveLocation.js",
-  "front_end/bindings/FileUtils.js",
-  "front_end/bindings/DefaultScriptMapping.js",
-  "front_end/bindings/DebuggerWorkspaceBinding.js",
-  "front_end/bindings/CSSWorkspaceBinding.js",
-  "front_end/bindings/ContentProviderBasedProject.js",
-  "front_end/bindings/CompilerScriptMapping.js",
-  "front_end/bindings/BreakpointManager.js",
-  "front_end/bindings/BlackboxManager.js",
-  "front_end/workspace/workspace.js",
-  "front_end/workspace/WorkspaceImpl.js",
-  "front_end/workspace/UISourceCode.js",
-  "front_end/workspace/FileManager.js",
-  "front_end/services/services.js",
-  "front_end/services/ServiceManager.js",
-  "front_end/sdk/sdk.js",
-  "front_end/sdk/TracingModel.js",
-  "front_end/sdk/TracingManager.js",
-  "front_end/sdk/TargetManager.js",
-  "front_end/sdk/Target.js",
-  "front_end/sdk/SourceMapManager.js",
-  "front_end/sdk/SourceMap.js",
-  "front_end/sdk/ServiceWorkerManager.js",
-  "front_end/sdk/ServiceWorkerCacheModel.js",
-  "front_end/sdk/ServerTiming.js",
-  "front_end/sdk/SecurityOriginManager.js",
-  "front_end/sdk/SDKModel.js",
-  "front_end/sdk/Script.js",
-  "front_end/sdk/ScreenCaptureModel.js",
-  "front_end/sdk/RuntimeModel.js",
-  "front_end/sdk/ResourceTreeModel.js",
-  "front_end/sdk/Resource.js",
-  "front_end/sdk/RemoteObject.js",
-  "front_end/sdk/ProfileTreeModel.js",
-  "front_end/sdk/PerformanceMetricsModel.js",
-  "front_end/sdk/PaintProfiler.js",
-  "front_end/sdk/OverlayModel.js",
-  "front_end/sdk/NetworkRequest.js",
-  "front_end/sdk/NetworkManager.js",
-  "front_end/sdk/NetworkLog.js",
-  "front_end/sdk/LogModel.js",
-  "front_end/sdk/LayerTreeBase.js",
-  "front_end/sdk/IsolateManager.js",
-  "front_end/sdk/HeapProfilerModel.js",
-  "front_end/sdk/HARLog.js",
-  "front_end/sdk/FilmStripModel.js",
-  "front_end/sdk/EmulationModel.js",
-  "front_end/sdk/DOMModel.js",
-  "front_end/sdk/DOMDebuggerModel.js",
-  "front_end/sdk/DebuggerModel.js",
-  "front_end/sdk/CSSStyleSheetHeader.js",
-  "front_end/sdk/CSSStyleDeclaration.js",
-  "front_end/sdk/CSSRule.js",
-  "front_end/sdk/CSSProperty.js",
-  "front_end/sdk/CSSModel.js",
-  "front_end/sdk/CSSMetadata.js",
-  "front_end/sdk/CSSMedia.js",
-  "front_end/sdk/CSSMatchedStyles.js",
-  "front_end/sdk/CPUProfilerModel.js",
-  "front_end/sdk/CPUProfileDataModel.js",
-  "front_end/sdk/CookieParser.js",
-  "front_end/sdk/CookieModel.js",
-  "front_end/sdk/CompilerSourceMappingContentProvider.js",
-  "front_end/sdk/ConsoleModel.js",
-  "front_end/sdk/Connections.js",
-  "front_end/sdk/ChildTargetManager.js",
-  "front_end/protocol/protocol.js",
-  "front_end/protocol/NodeURL.js",
-  "front_end/protocol/InspectorBackend.js",
-  "front_end/host/host.js",
-  "front_end/host/UserMetrics.js",
-  "front_end/host/ResourceLoader.js",
-  "front_end/host/Platform.js",
-  "front_end/host/InspectorFrontendHost.js",
-  "front_end/host/InspectorFrontendHostAPI.js",
-  "front_end/dom_extension/DOMExtension.js",
-  "front_end/root.js",
-  "front_end/Runtime.js",
-  "front_end/platform/utilities.js",
-  "front_end/ui/ARIAUtils.js",
-  "front_end/ui/ZoomManager.js",
-  "front_end/ui/XWidget.js",
-  "front_end/ui/XLink.js",
-  "front_end/ui/XElement.js",
-  "front_end/ui/Widget.js",
-  "front_end/ui/View.js",
-  "front_end/ui/ViewManager.js",
-  "front_end/ui/UIUtils.js",
-  "front_end/ui/ui.js",
-  "front_end/ui/Treeoutline.js",
-  "front_end/ui/Tooltip.js",
-  "front_end/ui/Toolbar.js",
-  "front_end/ui/ThrottledWidget.js",
-  "front_end/ui/TextPrompt.js",
-  "front_end/ui/TextEditor.js",
-  "front_end/ui/TargetCrashedScreen.js",
-  "front_end/ui/TabbedPane.js",
-  "front_end/ui/SyntaxHighlighter.js",
-  "front_end/ui/SuggestBox.js",
-  "front_end/ui/SplitWidget.js",
-  "front_end/ui/SoftDropDown.js",
-  "front_end/ui/SoftContextMenu.js",
-  "front_end/ui/ShortcutsScreen.js",
-  "front_end/ui/ShortcutRegistry.js",
-  "front_end/ui/SettingsUI.js",
-  "front_end/ui/SegmentedButton.js",
-  "front_end/ui/SearchableView.js",
-  "front_end/ui/RootView.js",
-  "front_end/ui/ResizerWidget.js",
-  "front_end/ui/ReportView.js",
-  "front_end/ui/RemoteDebuggingTerminatedScreen.js",
-  "front_end/ui/ProgressIndicator.js",
-  "front_end/ui/PopoverHelper.js",
-  "front_end/ui/Panel.js",
-  "front_end/ui/ListWidget.js",
-  "front_end/ui/ListModel.js",
-  "front_end/ui/ListControl.js",
-  "front_end/ui/KeyboardShortcut.js",
-  "front_end/ui/InspectorView.js",
-  "front_end/ui/InplaceEditor.js",
-  "front_end/ui/Infobar.js",
-  "front_end/ui/Icon.js",
-  "front_end/ui/HistoryInput.js",
-  "front_end/ui/GlassPane.js",
-  "front_end/ui/Geometry.js",
-  "front_end/ui/Fragment.js",
-  "front_end/ui/ForwardedInputEventHandler.js",
-  "front_end/ui/FilterSuggestionBuilder.js",
-  "front_end/ui/FilterBar.js",
-  "front_end/ui/EmptyWidget.js",
-  "front_end/ui/DropTarget.js",
-  "front_end/ui/Dialog.js",
-  "front_end/ui/ContextMenu.js",
-  "front_end/ui/Context.js",
-  "front_end/ui/ARIAUtils.js",
-  "front_end/ui/ActionRegistry.js",
-  "front_end/ui/Action.js",
-  "front_end/ui/ActionDelegate.js",
-  "front_end/ui/ContextFlavorListener.js",
-  "front_end/root.js",
-  "front_end/common/common.js",
-  "front_end/common/App.js",
-  "front_end/common/AppProvider.js",
-  "front_end/common/CharacterIdMap.js",
-  "front_end/common/Color.js",
-  "front_end/common/ContentProvider.js",
-  "front_end/common/EventTarget.js",
-  "front_end/common/JavaScriptMetaData.js",
-  "front_end/common/Linkifier.js",
-  "front_end/common/Object.js",
-  "front_end/common/Console.js",
-  "front_end/common/ParsedURL.js",
-  "front_end/common/Progress.js",
-  "front_end/common/QueryParamHandler.js",
-  "front_end/common/ResourceType.js",
-  "front_end/common/Revealer.js",
-  "front_end/common/Runnable.js",
-  "front_end/common/SegmentedRange.js",
-  "front_end/common/Settings.js",
-  "front_end/common/StaticContentProvider.js",
-  "front_end/common/StringOutputStream.js",
-  "front_end/common/TextDictionary.js",
-  "front_end/common/Throttler.js",
-  "front_end/common/Trie.js",
-  "front_end/common/UIString.js",
-  "front_end/common/Worker.js",
-]
-
-devtools_test_files = [
-  "//third_party/axe-core/axe.js",
-  "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js",
-  "front_end/accessibility_test_runner/module.json",
-  "front_end/application_test_runner/AppcacheTestRunner.js",
-  "front_end/application_test_runner/CacheStorageTestRunner.js",
-  "front_end/application_test_runner/IndexedDBTestRunner.js",
-  "front_end/application_test_runner/module.json",
-  "front_end/application_test_runner/ResourcesTestRunner.js",
-  "front_end/application_test_runner/ResourceTreeTestRunner.js",
-  "front_end/application_test_runner/ServiceWorkersTestRunner.js",
-  "front_end/audits_test_runner/AuditsTestRunner.js",
-  "front_end/audits_test_runner/module.json",
-  "front_end/axe_core_test_runner/AxeCoreTestRunner.js",
-  "front_end/axe_core_test_runner/module.json",
-  "front_end/bindings_test_runner/AutomappingTestRunner.js",
-  "front_end/bindings_test_runner/BindingsTestRunner.js",
-  "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js",
-  "front_end/bindings_test_runner/module.json",
-  "front_end/bindings_test_runner/OverridesTestRunner.js",
-  "front_end/bindings_test_runner/PersistenceTestRunner.js",
-  "front_end/console_test_runner/ConsoleTestRunner.js",
-  "front_end/console_test_runner/module.json",
-  "front_end/coverage_test_runner/CoverageTestRunner.js",
-  "front_end/coverage_test_runner/module.json",
-  "front_end/cpu_profiler_test_runner/module.json",
-  "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js",
-  "front_end/data_grid_test_runner/DataGridTestRunner.js",
-  "front_end/data_grid_test_runner/module.json",
-  "front_end/device_mode_test_runner/DeviceModeTestRunner.js",
-  "front_end/device_mode_test_runner/module.json",
-  "front_end/elements_test_runner/EditDOMTestRunner.js",
-  "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js",
-  "front_end/elements_test_runner/ElementsTestRunner.js",
-  "front_end/elements_test_runner/module.json",
-  "front_end/elements_test_runner/SetOuterHTMLTestRunner.js",
-  "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js",
-  "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js",
-  "front_end/extensions_test_runner/ExtensionsTestRunner.js",
-  "front_end/extensions_test_runner/module.json",
-  "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js",
-  "front_end/heap_profiler_test_runner/module.json",
-  "front_end/integration_test_runner.html",
-  "front_end/integration_test_runner.js",
-  "front_end/integration_test_runner.json",
-  "front_end/layers_test_runner/LayersTestRunner.js",
-  "front_end/layers_test_runner/module.json",
-  "front_end/network_test_runner/module.json",
-  "front_end/network_test_runner/NetworkTestRunner.js",
-  "front_end/network_test_runner/ProductRegistryTestRunner.js",
-  "front_end/performance_test_runner/module.json",
-  "front_end/performance_test_runner/TimelineDataTestRunner.js",
-  "front_end/performance_test_runner/TimelineTestRunner.js",
-  "front_end/sdk_test_runner/module.json",
-  "front_end/sdk_test_runner/PageMockTestRunner.js",
-  "front_end/security_test_runner/module.json",
-  "front_end/security_test_runner/SecurityTestRunner.js",
-  "front_end/sources_test_runner/AutocompleteTestRunner.js",
-  "front_end/sources_test_runner/DebuggerTestRunner.js",
-  "front_end/sources_test_runner/EditorTestRunner.js",
-  "front_end/sources_test_runner/LiveEditTestRunner.js",
-  "front_end/sources_test_runner/module.json",
-  "front_end/sources_test_runner/SearchTestRunner.js",
-  "front_end/sources_test_runner/SourcesTestRunner.js",
-  "front_end/test_runner/module.json",
-  "front_end/test_runner/TestRunner.js",
-]
-
-devtools_embedder_scripts = [
-  "front_end/devtools_compatibility.js",
-  "front_end/Tests.js",
-]
-
-devtools_emulated_devices_images = [
-  "front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png",
-  "front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png",
-  "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png",
-  "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png",
-  "front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png",
-  "front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png",
-  "front_end/emulated_devices/google-nexus-5-vertical-default-1x.png",
-  "front_end/emulated_devices/google-nexus-5-vertical-default-2x.png",
-  "front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png",
-  "front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png",
-  "front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png",
-  "front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png",
-  "front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png",
-  "front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png",
-  "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png",
-  "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png",
-  "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png",
-  "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png",
-  "front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png",
-  "front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png",
-  "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png",
-  "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png",
-  "front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png",
-  "front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png",
-  "front_end/emulated_devices/iPad-landscape.svg",
-  "front_end/emulated_devices/iPad-portrait.svg",
-  "front_end/emulated_devices/iPhone5-landscape.svg",
-  "front_end/emulated_devices/iPhone5-portrait.svg",
-  "front_end/emulated_devices/iPhone6-landscape.svg",
-  "front_end/emulated_devices/iPhone6-portrait.svg",
-  "front_end/emulated_devices/iPhone6Plus-landscape.svg",
-  "front_end/emulated_devices/iPhone6Plus-portrait.svg",
-  "front_end/emulated_devices/Nexus5X-landscape.svg",
-  "front_end/emulated_devices/Nexus5X-portrait.svg",
-  "front_end/emulated_devices/Nexus6P-landscape.svg",
-  "front_end/emulated_devices/Nexus6P-portrait.svg",
-]
-
-devtools_image_files = [
-  "front_end/Images/accelerometer-back.svg",
-  "front_end/Images/accelerometer-bottom.png",
-  "front_end/Images/accelerometer-front.svg",
-  "front_end/Images/accelerometer-left.png",
-  "front_end/Images/accelerometer-right.png",
-  "front_end/Images/accelerometer-top.png",
-  "front_end/Images/audits_logo.svg",
-  "front_end/Images/breakpoint.svg",
-  "front_end/Images/breakpointConditional.svg",
-  "front_end/Images/checkboxCheckmark.svg",
-  "front_end/Images/checker.png",
-  "front_end/Images/chevrons.svg",
-  "front_end/Images/chromeDisabledSelect.png",
-  "front_end/Images/chromeDisabledSelect_2x.png",
-  "front_end/Images/chromeLeft.png",
-  "front_end/Images/chromeMiddle.png",
-  "front_end/Images/chromeRight.png",
-  "front_end/Images/chromeSelect.png",
-  "front_end/Images/chromeSelect_2x.png",
-  "front_end/Images/errorWave.svg",
-  "front_end/Images/ic_info_black_18dp.svg",
-  "front_end/Images/ic_warning_black_18dp.svg",
-  "front_end/Images/largeIcons.svg",
-  "front_end/Images/mediumIcons.svg",
-  "front_end/Images/navigationControls.png",
-  "front_end/Images/navigationControls_2x.png",
-  "front_end/Images/nodeIcon.png",
-  "front_end/Images/popoverArrows.png",
-  "front_end/Images/profileGroupIcon.png",
-  "front_end/Images/profileIcon.png",
-  "front_end/Images/profileSmallIcon.png",
-  "front_end/Images/radioDot.png",
-  "front_end/Images/resizeDiagonal.png",
-  "front_end/Images/resizeDiagonal_2x.png",
-  "front_end/Images/resizeHorizontal.png",
-  "front_end/Images/resizeHorizontal_2x.png",
-  "front_end/Images/resizeVertical.png",
-  "front_end/Images/resizeVertical_2x.png",
-  "front_end/Images/resourceCSSIcon.png",
-  "front_end/Images/resourceDocumentIcon.png",
-  "front_end/Images/resourceDocumentIconSmall.png",
-  "front_end/Images/resourceJSIcon.png",
-  "front_end/Images/resourcePlainIcon.png",
-  "front_end/Images/resourcePlainIconSmall.png",
-  "front_end/Images/resourcesTimeGraphIcon.png",
-  "front_end/Images/searchNext.png",
-  "front_end/Images/searchPrev.png",
-  "front_end/Images/securityIcons.svg",
-  "front_end/Images/speech.png",
-  "front_end/Images/smallIcons.svg",
-  "front_end/Images/toolbarResizerVertical.png",
-  "front_end/Images/touchCursor.png",
-  "front_end/Images/touchCursor_2x.png",
-  "front_end/Images/treeoutlineTriangles.svg",
-  "front_end/Images/whatsnew.png",
-]
-
-resources_out_dir = "$root_out_dir/resources/inspector"
-
-generated_scripts = [
-  "$resources_out_dir/InspectorBackendCommands.js",
-  "$resources_out_dir/SupportedCSSProperties.js",
-]
-
-generated_aria_properties =
-    [ "$resources_out_dir/accessibility/ARIAProperties.js" ]
-
-application_templates = [
-  "front_end/devtools_app.html",
-  "front_end/inspector.html",
-  "front_end/integration_test_runner.html",
-  "front_end/js_app.html",
-  "front_end/ndb_app.html",
-  "front_end/node_app.html",
-  "front_end/toolbox.html",
-  "front_end/worker_app.html",
-]
-
-copied_devtools_modules = [
-  "$resources_out_dir/bindings/bindings.js",
-  "$resources_out_dir/bindings/TempFile.js",
-  "$resources_out_dir/bindings/StylesSourceMapping.js",
-  "$resources_out_dir/bindings/SASSSourceMapping.js",
-  "$resources_out_dir/bindings/ResourceUtils.js",
-  "$resources_out_dir/bindings/ResourceScriptMapping.js",
-  "$resources_out_dir/bindings/ResourceMapping.js",
-  "$resources_out_dir/bindings/PresentationConsoleMessageHelper.js",
-  "$resources_out_dir/bindings/NetworkProject.js",
-  "$resources_out_dir/bindings/LiveLocation.js",
-  "$resources_out_dir/bindings/FileUtils.js",
-  "$resources_out_dir/bindings/DefaultScriptMapping.js",
-  "$resources_out_dir/bindings/DebuggerWorkspaceBinding.js",
-  "$resources_out_dir/bindings/CSSWorkspaceBinding.js",
-  "$resources_out_dir/bindings/ContentProviderBasedProject.js",
-  "$resources_out_dir/bindings/CompilerScriptMapping.js",
-  "$resources_out_dir/bindings/BreakpointManager.js",
-  "$resources_out_dir/bindings/BlackboxManager.js",
-  "$resources_out_dir/workspace/workspace.js",
-  "$resources_out_dir/workspace/WorkspaceImpl.js",
-  "$resources_out_dir/workspace/UISourceCode.js",
-  "$resources_out_dir/workspace/FileManager.js",
-  "$resources_out_dir/services/services.js",
-  "$resources_out_dir/services/ServiceManager.js",
-  "$resources_out_dir/sdk/sdk.js",
-  "$resources_out_dir/sdk/TracingModel.js",
-  "$resources_out_dir/sdk/TracingManager.js",
-  "$resources_out_dir/sdk/TargetManager.js",
-  "$resources_out_dir/sdk/Target.js",
-  "$resources_out_dir/sdk/SourceMapManager.js",
-  "$resources_out_dir/sdk/SourceMap.js",
-  "$resources_out_dir/sdk/ServiceWorkerManager.js",
-  "$resources_out_dir/sdk/ServiceWorkerCacheModel.js",
-  "$resources_out_dir/sdk/ServerTiming.js",
-  "$resources_out_dir/sdk/SecurityOriginManager.js",
-  "$resources_out_dir/sdk/SDKModel.js",
-  "$resources_out_dir/sdk/Script.js",
-  "$resources_out_dir/sdk/ScreenCaptureModel.js",
-  "$resources_out_dir/sdk/RuntimeModel.js",
-  "$resources_out_dir/sdk/ResourceTreeModel.js",
-  "$resources_out_dir/sdk/Resource.js",
-  "$resources_out_dir/sdk/RemoteObject.js",
-  "$resources_out_dir/sdk/ProfileTreeModel.js",
-  "$resources_out_dir/sdk/PerformanceMetricsModel.js",
-  "$resources_out_dir/sdk/PaintProfiler.js",
-  "$resources_out_dir/sdk/OverlayModel.js",
-  "$resources_out_dir/sdk/NetworkRequest.js",
-  "$resources_out_dir/sdk/NetworkManager.js",
-  "$resources_out_dir/sdk/NetworkLog.js",
-  "$resources_out_dir/sdk/LogModel.js",
-  "$resources_out_dir/sdk/LayerTreeBase.js",
-  "$resources_out_dir/sdk/IsolateManager.js",
-  "$resources_out_dir/sdk/HeapProfilerModel.js",
-  "$resources_out_dir/sdk/HARLog.js",
-  "$resources_out_dir/sdk/FilmStripModel.js",
-  "$resources_out_dir/sdk/EmulationModel.js",
-  "$resources_out_dir/sdk/DOMModel.js",
-  "$resources_out_dir/sdk/DOMDebuggerModel.js",
-  "$resources_out_dir/sdk/DebuggerModel.js",
-  "$resources_out_dir/sdk/CSSStyleSheetHeader.js",
-  "$resources_out_dir/sdk/CSSStyleDeclaration.js",
-  "$resources_out_dir/sdk/CSSRule.js",
-  "$resources_out_dir/sdk/CSSProperty.js",
-  "$resources_out_dir/sdk/CSSModel.js",
-  "$resources_out_dir/sdk/CSSMetadata.js",
-  "$resources_out_dir/sdk/CSSMedia.js",
-  "$resources_out_dir/sdk/CSSMatchedStyles.js",
-  "$resources_out_dir/sdk/CPUProfilerModel.js",
-  "$resources_out_dir/sdk/CPUProfileDataModel.js",
-  "$resources_out_dir/sdk/CookieParser.js",
-  "$resources_out_dir/sdk/CookieModel.js",
-  "$resources_out_dir/sdk/CompilerSourceMappingContentProvider.js",
-  "$resources_out_dir/sdk/ConsoleModel.js",
-  "$resources_out_dir/sdk/Connections.js",
-  "$resources_out_dir/sdk/ChildTargetManager.js",
-  "$resources_out_dir/protocol/protocol.js",
-  "$resources_out_dir/protocol/NodeURL.js",
-  "$resources_out_dir/protocol/InspectorBackend.js",
-  "$resources_out_dir/host/host.js",
-  "$resources_out_dir/host/UserMetrics.js",
-  "$resources_out_dir/host/ResourceLoader.js",
-  "$resources_out_dir/host/Platform.js",
-  "$resources_out_dir/host/InspectorFrontendHost.js",
-  "$resources_out_dir/host/InspectorFrontendHostAPI.js",
-  "$resources_out_dir/dom_extension/DOMExtension.js",
-  "$resources_out_dir/root.js",
-  "$resources_out_dir/Runtime.js",
-  "$resources_out_dir/platform/utilities.js",
-  "$resources_out_dir/ui/ui.js",
-  "$resources_out_dir/common/common.js",
-  "$resources_out_dir/ui/ZoomManager.js",
-  "$resources_out_dir/ui/XWidget.js",
-  "$resources_out_dir/ui/XLink.js",
-  "$resources_out_dir/ui/XElement.js",
-  "$resources_out_dir/ui/Widget.js",
-  "$resources_out_dir/ui/View.js",
-  "$resources_out_dir/ui/ViewManager.js",
-  "$resources_out_dir/ui/UIUtils.js",
-  "$resources_out_dir/ui/Treeoutline.js",
-  "$resources_out_dir/ui/Tooltip.js",
-  "$resources_out_dir/ui/Toolbar.js",
-  "$resources_out_dir/ui/ThrottledWidget.js",
-  "$resources_out_dir/ui/TextPrompt.js",
-  "$resources_out_dir/ui/TextEditor.js",
-  "$resources_out_dir/ui/TargetCrashedScreen.js",
-  "$resources_out_dir/ui/TabbedPane.js",
-  "$resources_out_dir/ui/SyntaxHighlighter.js",
-  "$resources_out_dir/ui/SuggestBox.js",
-  "$resources_out_dir/ui/SplitWidget.js",
-  "$resources_out_dir/ui/SoftDropDown.js",
-  "$resources_out_dir/ui/SoftContextMenu.js",
-  "$resources_out_dir/ui/ShortcutsScreen.js",
-  "$resources_out_dir/ui/ShortcutRegistry.js",
-  "$resources_out_dir/ui/SettingsUI.js",
-  "$resources_out_dir/ui/SegmentedButton.js",
-  "$resources_out_dir/ui/SearchableView.js",
-  "$resources_out_dir/ui/RootView.js",
-  "$resources_out_dir/ui/ResizerWidget.js",
-  "$resources_out_dir/ui/ReportView.js",
-  "$resources_out_dir/ui/RemoteDebuggingTerminatedScreen.js",
-  "$resources_out_dir/ui/ProgressIndicator.js",
-  "$resources_out_dir/ui/PopoverHelper.js",
-  "$resources_out_dir/ui/Panel.js",
-  "$resources_out_dir/ui/ListWidget.js",
-  "$resources_out_dir/ui/ListModel.js",
-  "$resources_out_dir/ui/ListControl.js",
-  "$resources_out_dir/ui/KeyboardShortcut.js",
-  "$resources_out_dir/ui/InspectorView.js",
-  "$resources_out_dir/ui/InplaceEditor.js",
-  "$resources_out_dir/ui/Infobar.js",
-  "$resources_out_dir/ui/Icon.js",
-  "$resources_out_dir/ui/HistoryInput.js",
-  "$resources_out_dir/ui/GlassPane.js",
-  "$resources_out_dir/ui/Geometry.js",
-  "$resources_out_dir/ui/Fragment.js",
-  "$resources_out_dir/ui/ForwardedInputEventHandler.js",
-  "$resources_out_dir/ui/FilterSuggestionBuilder.js",
-  "$resources_out_dir/ui/FilterBar.js",
-  "$resources_out_dir/ui/EmptyWidget.js",
-  "$resources_out_dir/ui/DropTarget.js",
-  "$resources_out_dir/ui/Dialog.js",
-  "$resources_out_dir/ui/ContextMenu.js",
-  "$resources_out_dir/ui/Context.js",
-  "$resources_out_dir/ui/ARIAUtils.js",
-  "$resources_out_dir/ui/ActionRegistry.js",
-  "$resources_out_dir/ui/Action.js",
-  "$resources_out_dir/ui/ActionDelegate.js",
-  "$resources_out_dir/ui/ContextFlavorListener.js",
-  "$resources_out_dir/common/App.js",
-  "$resources_out_dir/common/AppProvider.js",
-  "$resources_out_dir/common/CharacterIdMap.js",
-  "$resources_out_dir/common/Color.js",
-  "$resources_out_dir/common/ContentProvider.js",
-  "$resources_out_dir/common/EventTarget.js",
-  "$resources_out_dir/common/JavaScriptMetaData.js",
-  "$resources_out_dir/common/Linkifier.js",
-  "$resources_out_dir/common/Object.js",
-  "$resources_out_dir/common/Console.js",
-  "$resources_out_dir/common/ParsedURL.js",
-  "$resources_out_dir/common/Progress.js",
-  "$resources_out_dir/common/QueryParamHandler.js",
-  "$resources_out_dir/common/ResourceType.js",
-  "$resources_out_dir/common/Revealer.js",
-  "$resources_out_dir/common/Runnable.js",
-  "$resources_out_dir/common/SegmentedRange.js",
-  "$resources_out_dir/common/Settings.js",
-  "$resources_out_dir/common/StaticContentProvider.js",
-  "$resources_out_dir/common/StringOutputStream.js",
-  "$resources_out_dir/common/TextDictionary.js",
-  "$resources_out_dir/common/Throttler.js",
-  "$resources_out_dir/common/Trie.js",
-  "$resources_out_dir/common/UIString.js",
-  "$resources_out_dir/common/Worker.js",
-]
-
-generated_applications = [
-  "$resources_out_dir/audits_worker.js",
-  "$resources_out_dir/devtools_app.html",
-  "$resources_out_dir/devtools_app.js",
-  "$resources_out_dir/formatter_worker.js",
-  "$resources_out_dir/heap_snapshot_worker.js",
-  "$resources_out_dir/inspector.html",
-  "$resources_out_dir/inspector.js",
-  "$resources_out_dir/js_app.html",
-  "$resources_out_dir/js_app.js",
-  "$resources_out_dir/node_app.html",
-  "$resources_out_dir/node_app.js",
-  "$resources_out_dir/shell.js",
-  "$resources_out_dir/toolbox.html",
-  "$resources_out_dir/toolbox.js",
-  "$resources_out_dir/worker_app.html",
-  "$resources_out_dir/worker_app.js",
-]
-
-generated_non_autostart_non_remote_modules = [
-  "$resources_out_dir/animation/animation_module.js",
-  "$resources_out_dir/audits/audits_module.js",
-  "$resources_out_dir/browser_debugger/browser_debugger_module.js",
-  "$resources_out_dir/changes/changes_module.js",
-  "$resources_out_dir/protocol_monitor/protocol_monitor_module.js",
-  "$resources_out_dir/css_overview/css_overview_module.js",
-  "$resources_out_dir/cm/cm_module.js",
-  "$resources_out_dir/color_picker/color_picker_module.js",
-  "$resources_out_dir/console/console_module.js",
-  "$resources_out_dir/cookie_table/cookie_table_module.js",
-  "$resources_out_dir/coverage/coverage_module.js",
-  "$resources_out_dir/data_grid/data_grid_module.js",
-  "$resources_out_dir/devices/devices_module.js",
-  "$resources_out_dir/diff/diff_module.js",
-  "$resources_out_dir/elements/elements_module.js",
-  "$resources_out_dir/event_listeners/event_listeners_module.js",
-  "$resources_out_dir/formatter/formatter_module.js",
-  "$resources_out_dir/har_importer/har_importer_module.js",
-  "$resources_out_dir/heap_snapshot_model/heap_snapshot_model_module.js",
-  "$resources_out_dir/help/help_module.js",
-  "$resources_out_dir/inline_editor/inline_editor_module.js",
-  "$resources_out_dir/javascript_metadata/javascript_metadata_module.js",
-  "$resources_out_dir/js_profiler/js_profiler_module.js",
-  "$resources_out_dir/layer_viewer/layer_viewer_module.js",
-  "$resources_out_dir/layers/layers_module.js",
-  "$resources_out_dir/media/media_module.js",
-  "$resources_out_dir/network/network_module.js",
-  "$resources_out_dir/node_debugger/node_debugger_module.js",
-  "$resources_out_dir/object_ui/object_ui_module.js",
-  "$resources_out_dir/perf_ui/perf_ui_module.js",
-  "$resources_out_dir/performance_monitor/performance_monitor_module.js",
-  "$resources_out_dir/profiler/profiler_module.js",
-  "$resources_out_dir/quick_open/quick_open_module.js",
-  "$resources_out_dir/resources/resources_module.js",
-  "$resources_out_dir/search/search_module.js",
-  "$resources_out_dir/security/security_module.js",
-  "$resources_out_dir/settings/settings_module.js",
-  "$resources_out_dir/snippets/snippets_module.js",
-  "$resources_out_dir/source_frame/source_frame_module.js",
-  "$resources_out_dir/sources/sources_module.js",
-  "$resources_out_dir/text_editor/text_editor_module.js",
-  "$resources_out_dir/timeline_model/timeline_model_module.js",
-  "$resources_out_dir/timeline/timeline_module.js",
-  "$resources_out_dir/web_audio/web_audio_module.js",
-  "$resources_out_dir/workspace_diff/workspace_diff_module.js",
-]
-
-generated_remote_modules = [
-  "$resources_out_dir/accessibility/accessibility_module.js",
-  "$resources_out_dir/audits_worker/audits_worker_module.js",
-  "$resources_out_dir/cm_modes/cm_modes_module.js",
-  "$resources_out_dir/dagre_layout/dagre_layout_module.js",
-  "$resources_out_dir/emulated_devices/emulated_devices_module.js",
-  "$resources_out_dir/product_registry_impl/product_registry_impl_module.js",
-]
-
-generated_test_modules = [
-  "$resources_out_dir/accessibility_test_runner/accessibility_test_runner_module.js",
-  "$resources_out_dir/application_test_runner/application_test_runner_module.js",
-  "$resources_out_dir/audits_test_runner/audits_test_runner_module.js",
-  "$resources_out_dir/axe_core_test_runner/axe_core_test_runner_module.js",
-  "$resources_out_dir/bindings_test_runner/bindings_test_runner_module.js",
-  "$resources_out_dir/console_test_runner/console_test_runner_module.js",
-  "$resources_out_dir/coverage_test_runner/coverage_test_runner_module.js",
-  "$resources_out_dir/cpu_profiler_test_runner/cpu_profiler_test_runner_module.js",
-  "$resources_out_dir/data_grid_test_runner/data_grid_test_runner_module.js",
-  "$resources_out_dir/device_mode_test_runner/device_mode_test_runner_module.js",
-  "$resources_out_dir/elements_test_runner/elements_test_runner_module.js",
-  "$resources_out_dir/extensions_test_runner/extensions_test_runner_module.js",
-  "$resources_out_dir/heap_profiler_test_runner/heap_profiler_test_runner_module.js",
-  "$resources_out_dir/heap_snapshot_worker/heap_snapshot_worker_module.js",
-  "$resources_out_dir/integration_test_runner.html",
-  "$resources_out_dir/integration_test_runner.js",
-  "$resources_out_dir/layers_test_runner/layers_test_runner_module.js",
-  "$resources_out_dir/network_test_runner/network_test_runner_module.js",
-  "$resources_out_dir/performance_test_runner/performance_test_runner_module.js",
-  "$resources_out_dir/sdk_test_runner/sdk_test_runner_module.js",
-  "$resources_out_dir/security_test_runner/security_test_runner_module.js",
-  "$resources_out_dir/sources_test_runner/sources_test_runner_module.js",
-]
-
-devtools_applications = [
-  "audits_worker",
-  "devtools_app",
-  "formatter_worker",
-  "heap_snapshot_worker",
-  "inspector",
-  "integration_test_runner",
-  "js_app",
-  "ndb_app",
-  "node_app",
-  "shell",
-  "toolbox",
-  "worker_app",
-]
-
-#-------------------------------------------------------------------------------
-
-visibility = [ "//third_party/blink/*" ]
-
-group("devtools_all_files") {
-  data = all_devtools_files + all_devtools_modules
-  deps = [
-    ":devtools_frontend_resources_data",
-  ]
-}
-
-devtools_frontend_resources_deps = [
-  ":aria_properties",
-  ":build_release_devtools",
-  ":copy_embedder_scripts",
-  ":copy_emulated_devices_images",
-  ":copy_htaccess",
-  ":copy_inspector_images",
-  ":copy_lighthouse_locale_files",
-  ":devtools_extension_api",
-  ":frontend_protocol_sources",
-  ":supported_css_properties",
-  ":copy_devtools_modules",
-]
-
-if (debug_devtools) {
-  devtools_frontend_resources_deps += [
-    ":build_debug_devtools",
-    ":copy_aria_properties",
-    ":copy_generated_scripts",
-  ]
-}
-
-group("devtools_frontend_resources") {
-  public_deps = devtools_frontend_resources_deps
-}
-
-# Do not use this unless you need unpacked devtools at runtime.
-group("devtools_frontend_resources_data") {
-  data_deps = devtools_frontend_resources_deps
-}
-
-copy("copy_embedder_scripts") {
-  sources = devtools_embedder_scripts
-  outputs = [
-    "$resources_out_dir/{{source_file_part}}",
-  ]
-}
-
-copy("copy_htaccess") {
-  sources = [
-    "htaccess",
-  ]
-  outputs = [
-    "$resources_out_dir/.htaccess",
-  ]
-}
-
-copy("copy_inspector_images") {
-  sources = devtools_image_files
-  outputs = [
-    "$resources_out_dir/Images/{{source_file_part}}",
-  ]
-}
-
-copy("copy_emulated_devices_images") {
-  sources = devtools_emulated_devices_images
-  outputs = [
-    "$resources_out_dir/emulated_devices/{{source_file_part}}",
-  ]
-}
-
-copy("copy_lighthouse_locale_files") {
-  sources = lighthouse_locale_files
-  outputs = [
-    "$resources_out_dir/audits_worker/lighthouse/locales/{{source_file_part}}",
-  ]
-}
-
-action("generate_devtools_grd") {
-  script = "scripts/build/generate_devtools_grd.py"
-
-  deps = [
-    ":devtools_frontend_resources",
+if (!external_devtools_frontend) {
+  all_devtools_files = [
+    "front_end/accessibility/AccessibilityModel.js",
+    "front_end/accessibility/accessibilityNode.css",
+    "front_end/accessibility/AccessibilityNodeView.js",
+    "front_end/accessibility/accessibilityProperties.css",
+    "front_end/accessibility/AccessibilitySidebarView.js",
+    "front_end/accessibility/AccessibilityStrings.js",
+    "front_end/accessibility/ARIAAttributesView.js",
+    "front_end/accessibility/ARIAMetadata.js",
+    "front_end/accessibility/axBreadcrumbs.css",
+    "front_end/accessibility/AXBreadcrumbsPane.js",
+    "front_end/accessibility/module.json",
+    "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js",
+    "front_end/accessibility_test_runner/module.json",
+    "front_end/animation/AnimationGroupPreviewUI.js",
+    "front_end/animation/AnimationModel.js",
+    "front_end/animation/animationScreenshotPopover.css",
+    "front_end/animation/AnimationScreenshotPopover.js",
+    "front_end/animation/animationTimeline.css",
+    "front_end/animation/AnimationTimeline.js",
+    "front_end/animation/AnimationUI.js",
+    "front_end/animation/module.json",
+    "front_end/application_test_runner/AppcacheTestRunner.js",
+    "front_end/application_test_runner/CacheStorageTestRunner.js",
+    "front_end/application_test_runner/IndexedDBTestRunner.js",
+    "front_end/application_test_runner/module.json",
+    "front_end/application_test_runner/ResourcesTestRunner.js",
+    "front_end/application_test_runner/ResourceTreeTestRunner.js",
+    "front_end/application_test_runner/ServiceWorkersTestRunner.js",
+    "front_end/audits_worker.js",
+    "front_end/audits_worker.json",
+    "front_end/audits_worker/AuditsService.js",
+    "front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js",
+    "front_end/audits_worker/module.json",
+    "front_end/audits/AuditsPanel.js",
+    "front_end/audits/AuditsController.js",
+    "front_end/audits/AuditsReportSelector.js",
+    "front_end/audits/AuditsReportRenderer.js",
+    "front_end/audits/AuditsStartView.js",
+    "front_end/audits/AuditsProtocolService.js",
+    "front_end/audits/AuditsStatusView.js",
+    "front_end/audits/auditsDialog.css",
+    "front_end/audits/auditsStartView.css",
+    "front_end/audits/auditsPanel.css",
+    "front_end/audits/RadioSetting.js",
+    "front_end/audits/lighthouse/report.css",
+    "front_end/audits/lighthouse/report.js",
+    "front_end/audits/lighthouse/report-generator.js",
+    "front_end/audits/lighthouse/template.html",
+    "front_end/audits/lighthouse/templates.html",
+    "front_end/audits/module.json",
+    "front_end/audits_test_runner/AuditsTestRunner.js",
+    "front_end/audits_test_runner/module.json",
+    "front_end/axe_core_test_runner/AxeCoreTestRunner.js",
+    "front_end/axe_core_test_runner/module.json",
+    "front_end/bindings/module.json",
+    "front_end/bindings_test_runner/AutomappingTestRunner.js",
+    "front_end/bindings_test_runner/BindingsTestRunner.js",
+    "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js",
+    "front_end/bindings_test_runner/module.json",
+    "front_end/bindings_test_runner/PersistenceTestRunner.js",
+    "front_end/bindings_test_runner/OverridesTestRunner.js",
+    "front_end/browser_debugger/DOMBreakpointsSidebarPane.js",
+    "front_end/browser_debugger/EventListenerBreakpointsSidebarPane.js",
+    "front_end/browser_debugger/ObjectEventListenersSidebarPane.js",
+    "front_end/browser_debugger/XHRBreakpointsSidebarPane.js",
+    "front_end/browser_debugger/domBreakpointsSidebarPane.css",
+    "front_end/browser_debugger/eventListenerBreakpoints.css",
+    "front_end/browser_debugger/module.json",
+    "front_end/browser_debugger/xhrBreakpointsSidebarPane.css",
+    "front_end/browser_sdk/module.json",
+    "front_end/css_overview/cssOverview.css",
+    "front_end/css_overview/cssOverviewStartView.css",
+    "front_end/css_overview/cssOverviewProcessingView.css",
+    "front_end/css_overview/cssOverviewCompletedView.css",
+    "front_end/css_overview/CSSOverviewController.js",
+    "front_end/css_overview/CSSOverviewStartView.js",
+    "front_end/css_overview/CSSOverviewProcessingView.js",
+    "front_end/css_overview/CSSOverviewCompletedView.js",
+    "front_end/css_overview/CSSOverviewModel.js",
+    "front_end/css_overview/CSSOverviewSidebarPanel.js",
+    "front_end/css_overview/cssOverviewSidebarPanel.css",
+    "front_end/css_overview/CSSOverviewPanel.js",
+    "front_end/css_overview/module.json",
+    "front_end/changes/ChangesHighlighter.js",
+    "front_end/changes/changesView.css",
+    "front_end/changes/ChangesView.js",
+    "front_end/changes/changesSidebar.css",
+    "front_end/changes/ChangesSidebar.js",
+    "front_end/changes/module.json",
+    "front_end/cm/active-line.js",
+    "front_end/cm/brace-fold.js",
+    "front_end/cm/closebrackets.js",
+    "front_end/cm/codemirror.css",
+    "front_end/cm/codemirror.js",
+    "front_end/cm/comment.js",
+    "front_end/cm/foldcode.js",
+    "front_end/cm/foldgutter.js",
+    "front_end/cm/mark-selection.js",
+    "front_end/cm/matchbrackets.js",
+    "front_end/cm/module.json",
+    "front_end/cm/multiplex.js",
+    "front_end/cm/overlay.js",
+    "front_end/cm_headless/headlesscodemirror.js",
+    "front_end/cm_headless/module.json",
+    "front_end/cm_modes/clike.js",
+    "front_end/cm_modes/clojure.js",
+    "front_end/cm_modes/coffeescript.js",
+    "front_end/cm_modes/DefaultCodeMirrorMimeMode.js",
+    "front_end/cm_modes/jsx.js",
+    "front_end/cm_modes/livescript.js",
+    "front_end/cm_modes/markdown.js",
+    "front_end/cm_modes/module.json",
+    "front_end/cm_modes/php.js",
+    "front_end/cm_modes/python.js",
+    "front_end/cm_modes/shell.js",
+    "front_end/cm_modes/stylus.js",
+    "front_end/cm_web_modes/css.js",
+    "front_end/cm_web_modes/htmlembedded.js",
+    "front_end/cm_web_modes/htmlmixed.js",
+    "front_end/cm_web_modes/javascript.js",
+    "front_end/cm_web_modes/xml.js",
+    "front_end/color_picker/ContrastDetails.js",
+    "front_end/color_picker/ContrastInfo.js",
+    "front_end/color_picker/ContrastOverlay.js",
+    "front_end/color_picker/module.json",
+    "front_end/color_picker/spectrum.css",
+    "front_end/color_picker/Spectrum.js",
+    "front_end/common/module.json",
+    "front_end/components/imagePreview.css",
+    "front_end/components/jsUtils.css",
+    "front_end/components/module.json",
+    "front_end/console/ConsoleContextSelector.js",
+    "front_end/console/ConsoleFilter.js",
+    "front_end/console/ConsoleSidebar.js",
+    "front_end/console/ConsolePanel.js",
+    "front_end/console/ConsolePinPane.js",
+    "front_end/console/ConsolePrompt.js",
+    "front_end/console/consoleView.css",
+    "front_end/console/consoleContextSelector.css",
+    "front_end/console/consolePinPane.css",
+    "front_end/console/consolePrompt.css",
+    "front_end/console/consoleSidebar.css",
+    "front_end/console/ConsoleView.js",
+    "front_end/console/ConsoleViewMessage.js",
+    "front_end/console/ConsoleViewport.js",
+    "front_end/console/module.json",
+    "front_end/console_counters/errorWarningCounter.css",
+    "front_end/console_counters/module.json",
+    "front_end/console_counters/WarningErrorCounter.js",
+    "front_end/console_test_runner/ConsoleTestRunner.js",
+    "front_end/console_test_runner/module.json",
+    "front_end/cookie_table/CookiesTable.js",
+    "front_end/cookie_table/module.json",
+    "front_end/coverage/coverageListView.css",
+    "front_end/coverage/CoverageDecorationManager.js",
+    "front_end/coverage/CoverageListView.js",
+    "front_end/coverage/CoverageModel.js",
+    "front_end/coverage/coverageView.css",
+    "front_end/coverage/CoverageView.js",
+    "front_end/coverage/module.json",
+    "front_end/coverage_test_runner/CoverageTestRunner.js",
+    "front_end/coverage_test_runner/module.json",
+    "front_end/cpu_profiler_test_runner/module.json",
+    "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js",
+    "front_end/dagre_layout/dagre.js",
+    "front_end/dagre_layout/module.json",
+    "front_end/data_grid/dataGrid.css",
+    "front_end/data_grid/DataGrid.js",
+    "front_end/data_grid/module.json",
+    "front_end/data_grid/ShowMoreDataGridNode.js",
+    "front_end/data_grid/SortableDataGrid.js",
+    "front_end/data_grid/ViewportDataGrid.js",
+    "front_end/data_grid_test_runner/DataGridTestRunner.js",
+    "front_end/data_grid_test_runner/module.json",
+    "front_end/device_mode_test_runner/DeviceModeTestRunner.js",
+    "front_end/device_mode_test_runner/module.json",
+    "front_end/devices/DevicesView.js",
+    "front_end/devices/devicesView.css",
+    "front_end/devices/module.json",
+    "front_end/diff/diff_match_patch.js",
+    "front_end/diff/Diff.js",
+    "front_end/diff/module.json",
+    "front_end/dom_extension/module.json",
+    "front_end/elements/breadcrumbs.css",
+    "front_end/elements/classesPaneWidget.css",
+    "front_end/elements/ClassesPaneWidget.js",
+    "front_end/elements/ColorSwatchPopoverIcon.js",
+    "front_end/elements/ComputedStyleModel.js",
+    "front_end/elements/computedStyleSidebarPane.css",
+    "front_end/elements/computedStyleWidgetTree.css",
+    "front_end/elements/ComputedStyleWidget.js",
+    "front_end/elements/DOMLinkifier.js",
+    "front_end/elements/domLinkifier.css",
+    "front_end/elements/DOMPath.js",
+    "front_end/elements/ElementsBreadcrumbs.js",
+    "front_end/elements/elementsPanel.css",
+    "front_end/elements/ElementsPanel.js",
+    "front_end/elements/ElementsSidebarPane.js",
+    "front_end/elements/elementStatePaneWidget.css",
+    "front_end/elements/ElementStatePaneWidget.js",
+    "front_end/elements/ElementsTreeElement.js",
+    "front_end/elements/ElementsTreeElementHighlighter.js",
+    "front_end/elements/elementsTreeOutline.css",
+    "front_end/elements/ElementsTreeOutline.js",
+    "front_end/elements/EventListenersWidget.js",
+    "front_end/elements/InspectElementModeController.js",
+    "front_end/elements/MarkerDecorator.js",
+    "front_end/elements/metricsSidebarPane.css",
+    "front_end/elements/MetricsSidebarPane.js",
+    "front_end/elements/nodeStackTraceWidget.css",
+    "front_end/elements/NodeStackTraceWidget.js",
+    "front_end/elements/module.json",
+    "front_end/elements/platformFontsWidget.css",
+    "front_end/elements/PlatformFontsWidget.js",
+    "front_end/elements/propertiesWidget.css",
+    "front_end/elements/PropertiesWidget.js",
+    "front_end/elements/StylePropertyHighlighter.js",
+    "front_end/elements/stylesSectionTree.css",
+    "front_end/elements/stylesSidebarPane.css",
+    "front_end/elements/StylesSidebarPane.js",
+    "front_end/elements/StylePropertyTreeElement.js",
+    "front_end/elements_test_runner/EditDOMTestRunner.js",
+    "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js",
+    "front_end/elements_test_runner/ElementsTestRunner.js",
+    "front_end/elements_test_runner/module.json",
+    "front_end/elements_test_runner/SetOuterHTMLTestRunner.js",
+    "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js",
+    "front_end/emulated_devices/module.json",
+    "front_end/emulation/AdvancedApp.js",
+    "front_end/emulation/DeviceModeModel.js",
+    "front_end/emulation/deviceModeToolbar.css",
+    "front_end/emulation/DeviceModeToolbar.js",
+    "front_end/emulation/deviceModeView.css",
+    "front_end/emulation/DeviceModeView.js",
+    "front_end/emulation/DeviceModeWrapper.js",
+    "front_end/emulation/devicesSettingsTab.css",
+    "front_end/emulation/DevicesSettingsTab.js",
+    "front_end/emulation/EmulatedDevices.js",
+    "front_end/emulation/geolocationsSettingsTab.css",
+    "front_end/emulation/GeolocationsSettingsTab.js",
+    "front_end/emulation/inspectedPagePlaceholder.css",
+    "front_end/emulation/InspectedPagePlaceholder.js",
+    "front_end/emulation/mediaQueryInspector.css",
+    "front_end/emulation/MediaQueryInspector.js",
+    "front_end/emulation/module.json",
+    "front_end/emulation/sensors.css",
+    "front_end/emulation/SensorsView.js",
+    "front_end/event_listeners/EventListenersUtils.js",
+    "front_end/event_listeners/eventListenersView.css",
+    "front_end/event_listeners/EventListenersView.js",
+    "front_end/event_listeners/module.json",
+    "front_end/extensions/ExtensionAPI.js",
+    "front_end/extensions/ExtensionPanel.js",
+    "front_end/extensions/ExtensionServer.js",
+    "front_end/extensions/ExtensionTraceProvider.js",
+    "front_end/extensions/ExtensionView.js",
+    "front_end/extensions/module.json",
+    "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js",
+    "front_end/extensions_test_runner/ExtensionsTestRunner.js",
+    "front_end/extensions_test_runner/module.json",
+    "front_end/formatter/FormatterWorkerPool.js",
+    "front_end/formatter/module.json",
+    "front_end/formatter/ScriptFormatter.js",
+    "front_end/formatter_worker.js",
+    "front_end/formatter_worker.json",
+    "front_end/formatter_worker/AcornTokenizer.js",
+    "front_end/formatter_worker/CSSFormatter.js",
+    "front_end/formatter_worker/CSSRuleParser.js",
+    "front_end/formatter_worker/ESTreeWalker.js",
+    "front_end/formatter_worker/FormattedContentBuilder.js",
+    "front_end/formatter_worker/FormatterWorker.js",
+    "front_end/formatter_worker/HTMLFormatter.js",
+    "front_end/formatter_worker/IdentityFormatter.js",
+    "front_end/formatter_worker/JavaScriptFormatter.js",
+    "front_end/formatter_worker/JavaScriptOutline.js",
+    "front_end/formatter_worker/RelaxedJSONParser.js",
+    "front_end/formatter_worker/acorn/acorn.js",
+    "front_end/formatter_worker/acorn/acorn_loose.js",
+    "front_end/formatter_worker/module.json",
+    "front_end/har_importer/HARFormat.js",
+    "front_end/har_importer/HARImporter.js",
+    "front_end/har_importer/module.json",
+    "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js",
+    "front_end/heap_profiler_test_runner/module.json",
+    "front_end/heap_snapshot_model/HeapSnapshotModel.js",
+    "front_end/heap_snapshot_model/module.json",
+    "front_end/heap_snapshot_worker.js",
+    "front_end/heap_snapshot_worker.json",
+    "front_end/heap_snapshot_worker/AllocationProfile.js",
+    "front_end/heap_snapshot_worker/HeapSnapshot.js",
+    "front_end/heap_snapshot_worker/HeapSnapshotLoader.js",
+    "front_end/heap_snapshot_worker/HeapSnapshotWorker.js",
+    "front_end/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js",
+    "front_end/heap_snapshot_worker/module.json",
+    "front_end/help/Help.js",
+    "front_end/help/module.json",
+    "front_end/help/releaseNote.css",
+    "front_end/help/ReleaseNoteText.js",
+    "front_end/help/ReleaseNoteView.js",
+    "front_end/host/module.json",
+    "front_end/inline_editor/bezierEditor.css",
+    "front_end/inline_editor/BezierEditor.js",
+    "front_end/inline_editor/bezierSwatch.css",
+    "front_end/inline_editor/BezierUI.js",
+    "front_end/inline_editor/colorSwatch.css",
+    "front_end/inline_editor/ColorSwatch.js",
+    "front_end/inline_editor/cssShadowEditor.css",
+    "front_end/inline_editor/CSSShadowEditor.js",
+    "front_end/inline_editor/CSSShadowModel.js",
+    "front_end/inline_editor/cssShadowSwatch.css",
+    "front_end/inline_editor/module.json",
+    "front_end/inline_editor/swatchPopover.css",
+    "front_end/inline_editor/SwatchPopoverHelper.js",
+    "front_end/inspector.js",
+    "front_end/inspector.json",
+    "front_end/inspector_main/InspectorMain.js",
+    "front_end/inspector_main/module.json",
+    "front_end/inspector_main/nodeIcon.css",
+    "front_end/inspector_main/renderingOptions.css",
+    "front_end/inspector_main/RenderingOptions.js",
+    "front_end/integration_test_runner.js",
+    "front_end/integration_test_runner.json",
+    "front_end/javascript_metadata/module.json",
+    "front_end/javascript_metadata/NativeFunctions.js",
+    "front_end/javascript_metadata/JavaScriptMetadata.js",
+    "front_end/js_main/JsMain.js",
+    "front_end/js_main/module.json",
+    "front_end/js_profiler/module.json",
+    "front_end/layer_viewer/layerDetailsView.css",
+    "front_end/layer_viewer/LayerDetailsView.js",
+    "front_end/layer_viewer/layers3DView.css",
+    "front_end/layer_viewer/Layers3DView.js",
+    "front_end/layer_viewer/LayerTreeOutline.js",
+    "front_end/layer_viewer/LayerViewHost.js",
+    "front_end/layer_viewer/module.json",
+    "front_end/layer_viewer/paintProfiler.css",
+    "front_end/layer_viewer/PaintProfilerView.js",
+    "front_end/layer_viewer/TransformController.js",
+    "front_end/layers/LayerPaintProfilerView.js",
+    "front_end/layers/LayersPanel.js",
+    "front_end/layers/LayerTreeModel.js",
+    "front_end/layers/module.json",
+    "front_end/layers_test_runner/LayersTestRunner.js",
+    "front_end/layers_test_runner/module.json",
+    "front_end/main/ExecutionContextSelector.js",
+    "front_end/main/Main.js",
+    "front_end/main/module.json",
+    "front_end/main/SimpleApp.js",
+    "front_end/protocol_monitor/ProtocolMonitor.js",
+    "front_end/protocol_monitor/protocolMonitor.css",
+    "front_end/protocol_monitor/module.json",
+    "front_end/mobile_throttling/MobileThrottlingSelector.js",
+    "front_end/mobile_throttling/module.json",
+    "front_end/mobile_throttling/NetworkPanelIndicator.js",
+    "front_end/mobile_throttling/NetworkThrottlingSelector.js",
+    "front_end/mobile_throttling/ThrottlingManager.js",
+    "front_end/mobile_throttling/ThrottlingPresets.js",
+    "front_end/mobile_throttling/throttlingSettingsTab.css",
+    "front_end/mobile_throttling/ThrottlingSettingsTab.js",
+    "front_end/media/eventDisplayTable.css",
+    "front_end/media/EventDisplayTable.js",
+    "front_end/media/MainView.js",
+    "front_end/media/MediaTable.js",
+    "front_end/media/PlayerDetailView.js",
+    "front_end/media/playerListView.css",
+    "front_end/media/PlayerListView.js",
+    "front_end/media/module.json",
+    "front_end/media/MediaModel.js",
+    "front_end/media/mediaView.css",
+    "front_end/ndb_app.json",
+    "front_end/network/binaryResourceView.css",
+    "front_end/network/blockedURLsPane.css",
+    "front_end/network/BinaryResourceView.js",
+    "front_end/network/BlockedURLsPane.js",
+    "front_end/network/eventSourceMessagesView.css",
+    "front_end/network/EventSourceMessagesView.js",
+    "front_end/network/HARWriter.js",
+    "front_end/network/module.json",
+    "front_end/network/networkConfigView.css",
+    "front_end/network/NetworkConfigView.js",
+    "front_end/network/NetworkDataGridNode.js",
+    "front_end/network/NetworkItemView.js",
+    "front_end/network/networkLogView.css",
+    "front_end/network/NetworkLogView.js",
+    "front_end/network/NetworkLogViewColumns.js",
+    "front_end/network/NetworkFrameGrouper.js",
+    "front_end/network/networkManageCustomHeadersView.css",
+    "front_end/network/NetworkManageCustomHeadersView.js",
+    "front_end/network/NetworkOverview.js",
+    "front_end/network/networkPanel.css",
+    "front_end/network/NetworkPanel.js",
+    "front_end/network/NetworkSearchScope.js",
+    "front_end/network/NetworkTimeCalculator.js",
+    "front_end/network/networkTimingTable.css",
+    "front_end/network/networkWaterfallColumn.css",
+    "front_end/network/NetworkWaterfallColumn.js",
+    "front_end/network/requestCookiesView.css",
+    "front_end/network/RequestCookiesView.js",
+    "front_end/network/requestHeadersTree.css",
+    "front_end/network/requestHeadersView.css",
+    "front_end/network/RequestHeadersView.js",
+    "front_end/network/requestHTMLView.css",
+    "front_end/network/RequestHTMLView.js",
+    "front_end/network/requestInitiatorView.css",
+    "front_end/network/RequestInitiatorView.js",
+    "front_end/network/RequestPreviewView.js",
+    "front_end/network/RequestResponseView.js",
+    "front_end/network/RequestTimingView.js",
+    "front_end/network/ResourceWebSocketFrameView.js",
+    "front_end/network/signedExchangeInfoTree.css",
+    "front_end/network/signedExchangeInfoView.css",
+    "front_end/network/SignedExchangeInfoView.js",
+    "front_end/network/webSocketFrameView.css",
+    "front_end/network_test_runner/module.json",
+    "front_end/network_test_runner/NetworkTestRunner.js",
+    "front_end/network_test_runner/ProductRegistryTestRunner.js",
+    "front_end/node_debugger/module.json",
+    "front_end/node_main/NodeConnectionsPanel.js",
+    "front_end/node_main/nodeConnectionsPanel.css",
+    "front_end/node_main/NodeMain.js",
+    "front_end/node_main/module.json",
+    "front_end/object_ui/customPreviewComponent.css",
+    "front_end/object_ui/CustomPreviewComponent.js",
+    "front_end/object_ui/JavaScriptAutocomplete.js",
+    "front_end/object_ui/JavaScriptREPL.js",
+    "front_end/object_ui/module.json",
+    "front_end/object_ui/objectPopover.css",
+    "front_end/object_ui/ObjectPopoverHelper.js",
+    "front_end/object_ui/objectPropertiesSection.css",
+    "front_end/object_ui/ObjectPropertiesSection.js",
+    "front_end/object_ui/objectValue.css",
+    "front_end/object_ui/RemoteObjectPreviewFormatter.js",
+    "front_end/perf_ui/ChartViewport.js",
+    "front_end/perf_ui/FilmStripView.js",
+    "front_end/perf_ui/FlameChart.js",
+    "front_end/perf_ui/GCActionDelegate.js",
+    "front_end/perf_ui/LineLevelProfile.js",
+    "front_end/perf_ui/LiveHeapProfile.js",
+    "front_end/perf_ui/NetworkPriorities.js",
+    "front_end/perf_ui/OverviewGrid.js",
+    "front_end/perf_ui/PieChart.js",
+    "front_end/perf_ui/TimelineGrid.js",
+    "front_end/perf_ui/TimelineOverviewPane.js",
+    "front_end/perf_ui/chartViewport.css",
+    "front_end/perf_ui/filmStripView.css",
+    "front_end/perf_ui/flameChart.css",
+    "front_end/perf_ui/module.json",
+    "front_end/perf_ui/overviewGrid.css",
+    "front_end/perf_ui/pieChart.css",
+    "front_end/perf_ui/timelineGrid.css",
+    "front_end/perf_ui/timelineOverviewInfo.css",
+    "front_end/performance_monitor/PerformanceMonitor.js",
+    "front_end/performance_monitor/performanceMonitor.css",
+    "front_end/performance_monitor/module.json",
+    "front_end/performance_test_runner/module.json",
+    "front_end/performance_test_runner/TimelineDataTestRunner.js",
+    "front_end/performance_test_runner/TimelineTestRunner.js",
+    "front_end/persistence/editFileSystemView.css",
+    "front_end/persistence/module.json",
+    "front_end/persistence/workspaceSettingsTab.css",
+    "front_end/platform/module.json",
+    "front_end/product_registry/BadgePool.js",
+    "front_end/product_registry/ProductRegistry.js",
+    "front_end/product_registry/badge.css",
+    "front_end/product_registry/module.json",
+    "front_end/product_registry/popup.css",
+    "front_end/product_registry_impl/module.json",
+    "front_end/product_registry_impl/ProductRegistryImpl.js",
+    "front_end/product_registry_impl/ProductRegistryData.js",
+    "front_end/product_registry_impl/sha1/sha1.js",
+    "front_end/profiler/BottomUpProfileDataGrid.js",
+    "front_end/profiler/CPUProfileFlameChart.js",
+    "front_end/profiler/CPUProfileView.js",
+    "front_end/profiler/heapProfiler.css",
+    "front_end/profiler/HeapProfileView.js",
+    "front_end/profiler/HeapProfilerPanel.js",
+    "front_end/profiler/HeapSnapshotDataGrids.js",
+    "front_end/profiler/HeapSnapshotGridNodes.js",
+    "front_end/profiler/HeapSnapshotProxy.js",
+    "front_end/profiler/HeapSnapshotView.js",
+    "front_end/profiler/HeapTimelineOverview.js",
+    "front_end/profiler/IsolateSelector.js",
+    "front_end/profiler/LiveHeapProfileView.js",
+    "front_end/profiler/liveHeapProfile.css",
+    "front_end/profiler/module.json",
+    "front_end/profiler/ProfileDataGrid.js",
+    "front_end/profiler/ProfileHeader.js",
+    "front_end/profiler/profileLauncherView.css",
+    "front_end/profiler/ProfileLauncherView.js",
+    "front_end/profiler/ProfileType.js",
+    "front_end/profiler/profilesPanel.css",
+    "front_end/profiler/ProfilesPanel.js",
+    "front_end/profiler/profilesSidebarTree.css",
+    "front_end/profiler/ProfileTypeRegistry.js",
+    "front_end/profiler/ProfileView.js",
+    "front_end/profiler/TopDownProfileDataGrid.js",
+    "front_end/protocol/module.json",
+    "front_end/quick_open/CommandMenu.js",
+    "front_end/quick_open/filteredListWidget.css",
+    "front_end/quick_open/FilteredListWidget.js",
+    "front_end/quick_open/HelpQuickOpen.js",
+    "front_end/quick_open/QuickOpen.js",
+    "front_end/quick_open/module.json",
+    "front_end/resources/ApplicationCacheModel.js",
+    "front_end/resources/ApplicationCacheItemsView.js",
+    "front_end/resources/ApplicationPanelSidebar.js",
+    "front_end/resources/appManifestView.css",
+    "front_end/resources/AppManifestView.js",
+    "front_end/resources/BackgroundServiceModel.js",
+    "front_end/resources/backgroundServiceView.css",
+    "front_end/resources/BackgroundServiceView.js",
+    "front_end/resources/clearStorageView.css",
+    "front_end/resources/ClearStorageView.js",
+    "front_end/resources/CookieItemsView.js",
+    "front_end/resources/cookieItemsView.css",
+    "front_end/resources/DatabaseModel.js",
+    "front_end/resources/DatabaseQueryView.js",
+    "front_end/resources/DatabaseTableView.js",
+    "front_end/resources/DOMStorageItemsView.js",
+    "front_end/resources/DOMStorageModel.js",
+    "front_end/resources/IndexedDBModel.js",
+    "front_end/resources/indexedDBViews.css",
+    "front_end/resources/IndexedDBViews.js",
+    "front_end/resources/module.json",
+    "front_end/resources/resourcesPanel.css",
+    "front_end/resources/ResourcesPanel.js",
+    "front_end/resources/ResourcesSection.js",
+    "front_end/resources/resourcesSidebar.css",
+    "front_end/resources/serviceWorkerCacheViews.css",
+    "front_end/resources/ServiceWorkerCacheViews.js",
+    "front_end/resources/serviceWorkersView.css",
+    "front_end/resources/ServiceWorkersView.js",
+    "front_end/resources/StorageItemsView.js",
+    "front_end/shell.json",
+    "front_end/screencast/InputModel.js",
+    "front_end/screencast/module.json",
+    "front_end/screencast/ScreencastApp.js",
+    "front_end/screencast/screencastView.css",
+    "front_end/screencast/ScreencastView.js",
+    "front_end/sdk/module.json",
+    "front_end/sdk_test_runner/module.json",
+    "front_end/sdk_test_runner/PageMockTestRunner.js",
+    "front_end/search/module.json",
+    "front_end/search/SearchConfig.js",
+    "front_end/search/searchResultsPane.css",
+    "front_end/search/SearchResultsPane.js",
+    "front_end/search/searchView.css",
+    "front_end/search/SearchView.js",
+    "front_end/security/lockIcon.css",
+    "front_end/security/mainView.css",
+    "front_end/security/module.json",
+    "front_end/security/originView.css",
+    "front_end/security/SecurityModel.js",
+    "front_end/security/SecurityPanel.js",
+    "front_end/security/sidebar.css",
+    "front_end/security_test_runner/module.json",
+    "front_end/security_test_runner/SecurityTestRunner.js",
+    "front_end/services/module.json",
+    "front_end/settings/frameworkBlackboxSettingsTab.css",
+    "front_end/settings/FrameworkBlackboxSettingsTab.js",
+    "front_end/settings/module.json",
+    "front_end/settings/settingsScreen.css",
+    "front_end/settings/SettingsScreen.js",
+    "front_end/snippets/module.json",
+    "front_end/snippets/ScriptSnippetFileSystem.js",
+    "front_end/snippets/SnippetsQuickOpen.js",
+    "front_end/source_frame/BinaryResourceViewFactory.js",
+    "front_end/source_frame/fontView.css",
+    "front_end/source_frame/FontView.js",
+    "front_end/source_frame/imageView.css",
+    "front_end/source_frame/jsonView.css",
+    "front_end/source_frame/JSONView.js",
+    "front_end/source_frame/ImageView.js",
+    "front_end/source_frame/messagesPopover.css",
+    "front_end/source_frame/module.json",
+    "front_end/source_frame/PreviewFactory.js",
+    "front_end/source_frame/resourceSourceFrame.css",
+    "front_end/source_frame/ResourceSourceFrame.js",
+    "front_end/source_frame/SourceCodeDiff.js",
+    "front_end/source_frame/SourceFrame.js",
+    "front_end/source_frame/SourcesTextEditor.js",
+    "front_end/source_frame/xmlTree.css",
+    "front_end/source_frame/xmlView.css",
+    "front_end/source_frame/XMLView.js",
+    "front_end/sources/AddSourceMapURLDialog.js",
+    "front_end/sources/breakpointEditDialog.css",
+    "front_end/sources/BreakpointEditDialog.js",
+    "front_end/sources/callStackSidebarPane.css",
+    "front_end/sources/CallStackSidebarPane.js",
+    "front_end/sources/CSSPlugin.js",
+    "front_end/sources/DebuggerPlugin.js",
+    "front_end/sources/dialog.css",
+    "front_end/sources/debuggerPausedMessage.css",
+    "front_end/sources/DebuggerPausedMessage.js",
+    "front_end/sources/EditingLocationHistoryManager.js",
+    "front_end/sources/FilePathScoreFunction.js",
+    "front_end/sources/FilteredUISourceCodeListProvider.js",
+    "front_end/sources/GoToLineQuickOpen.js",
+    "front_end/sources/GutterDiffPlugin.js",
+    "front_end/sources/InplaceFormatterEditorAction.js",
+    "front_end/sources/javaScriptBreakpointsSidebarPane.css",
+    "front_end/sources/JavaScriptBreakpointsSidebarPane.js",
+    "front_end/sources/JavaScriptCompilerPlugin.js",
+    "front_end/sources/module.json",
+    "front_end/sources/navigatorTree.css",
+    "front_end/sources/navigatorView.css",
+    "front_end/sources/NavigatorView.js",
+    "front_end/sources/OpenFileQuickOpen.js",
+    "front_end/sources/OutlineQuickOpen.js",
+    "front_end/sources/scopeChainSidebarPane.css",
+    "front_end/sources/ScopeChainSidebarPane.js",
+    "front_end/sources/ScriptFormatterEditorAction.js",
+    "front_end/sources/ScriptOriginPlugin.js",
+    "front_end/sources/SearchSourcesView.js",
+    "front_end/sources/SimpleHistoryManager.js",
+    "front_end/sources/SnippetsPlugin.js",
+    "front_end/sources/SourceFormatter.js",
+    "front_end/sources/SourceMapNamesResolver.js",
+    "front_end/sources/SourcesNavigator.js",
+    "front_end/sources/sourcesPanel.css",
+    "front_end/sources/SourcesPanel.js",
+    "front_end/sources/SourcesSearchScope.js",
+    "front_end/sources/sourcesView.css",
+    "front_end/sources/SourcesView.js",
+    "front_end/sources/UISourceCodeFrame.js",
+    "front_end/sources/TabbedEditorContainer.js",
+    "front_end/sources/threadsSidebarPane.css",
+    "front_end/sources/ThreadsSidebarPane.js",
+    "front_end/sources/watchExpressionsSidebarPane.css",
+    "front_end/sources/WatchExpressionsSidebarPane.js",
+    "front_end/sources_test_runner/AutocompleteTestRunner.js",
+    "front_end/sources_test_runner/DebuggerTestRunner.js",
+    "front_end/sources_test_runner/EditorTestRunner.js",
+    "front_end/sources_test_runner/LiveEditTestRunner.js",
+    "front_end/sources_test_runner/SearchTestRunner.js",
+    "front_end/sources_test_runner/SourcesTestRunner.js",
+    "front_end/sources_test_runner/module.json",
+    "front_end/terminal/module.json",
+    "front_end/terminal/terminal.css",
+    "front_end/terminal/TerminalWidget.js",
+    "front_end/terminal/xterm.js/addons/fit/fit.js",
+    "front_end/terminal/xterm.js/build/xterm.css",
+    "front_end/terminal/xterm.js/build/xterm.js",
+    "front_end/test_runner/module.json",
+    "front_end/test_runner/TestRunner.js",
+    "front_end/text_editor/autocompleteTooltip.css",
+    "front_end/text_editor/cmdevtools.css",
+    "front_end/text_editor/CodeMirrorTextEditor.js",
+    "front_end/text_editor/CodeMirrorUtils.js",
+    "front_end/text_editor/module.json",
+    "front_end/text_editor/TextEditorAutocompleteController.js",
+    "front_end/text_utils/module.json",
+    "front_end/text_utils/Text.js",
+    "front_end/text_utils/TextRange.js",
+    "front_end/text_utils/TextUtils.js",
+    "front_end/timeline_model/module.json",
+    "front_end/timeline_model/TimelineFrameModel.js",
+    "front_end/timeline_model/TimelineIRModel.js",
+    "front_end/timeline_model/TimelineJSProfile.js",
+    "front_end/timeline_model/TimelineModel.js",
+    "front_end/timeline_model/TimelineModelFilter.js",
+    "front_end/timeline_model/TimelineProfileTree.js",
+    "front_end/timeline_model/TracingLayerTree.js",
+    "front_end/timeline/CountersGraph.js",
+    "front_end/timeline/EventsTimelineTreeView.js",
+    "front_end/timeline/ExtensionTracingSession.js",
+    "front_end/timeline/historyToolbarButton.css",
+    "front_end/timeline/invalidationsTree.css",
+    "front_end/timeline/module.json",
+    "front_end/timeline/PerformanceModel.js",
+    "front_end/timeline/TimelineController.js",
+    "front_end/timeline/TimelineDetailsView.js",
+    "front_end/timeline/TimelineEventOverview.js",
+    "front_end/timeline/TimelineFilters.js",
+    "front_end/timeline/TimelineFlameChartDataProvider.js",
+    "front_end/timeline/TimelineFlameChartNetworkDataProvider.js",
+    "front_end/timeline/timelineFlamechartPopover.css",
+    "front_end/timeline/TimelineFlameChartView.js",
+    "front_end/timeline/timelineHistoryManager.css",
+    "front_end/timeline/TimelineHistoryManager.js",
+    "front_end/timeline/TimelineLayersView.js",
+    "front_end/timeline/TimelineLoader.js",
+    "front_end/timeline/timelinePaintProfiler.css",
+    "front_end/timeline/TimelinePaintProfilerView.js",
+    "front_end/timeline/timelinePanel.css",
+    "front_end/timeline/TimelinePanel.js",
+    "front_end/timeline/timelineStatusDialog.css",
+    "front_end/timeline/TimelineTreeView.js",
+    "front_end/timeline/TimelineUIUtils.js",
+    "front_end/timeline/UIDevtoolsController.js",
+    "front_end/timeline/UIDevtoolsUtils.js",
+    "front_end/toolbox_bootstrap/module.json",
+    "front_end/toolbox_bootstrap/Toolbox.js",
+    "front_end/toolbox.js",
+    "front_end/toolbox.json",
+    "front_end/ui/checkboxTextLabel.css",
+    "front_end/ui/closeButton.css",
+    "front_end/ui/confirmDialog.css",
+    "front_end/ui/dialog.css",
+    "front_end/ui/dropTarget.css",
+    "front_end/ui/emptyWidget.css",
+    "front_end/ui/filter.css",
+    "front_end/ui/glassPane.css",
+    "front_end/ui/infobar.css",
+    "front_end/ui/inlineButton.css",
+    "front_end/ui/inspectorCommon.css",
+    "front_end/ui/inspectorStyle.css",
+    "front_end/ui/inspectorSyntaxHighlight.css",
+    "front_end/ui/inspectorSyntaxHighlightDark.css",
+    "front_end/ui/inspectorViewTabbedPane.css",
+    "front_end/ui/listWidget.css",
+    "front_end/ui/module.json",
+    "front_end/ui/popover.css",
+    "front_end/ui/progressIndicator.css",
+    "front_end/ui/radioButton.css",
+    "front_end/ui/reportView.css",
+    "front_end/ui/remoteDebuggingTerminatedScreen.css",
+    "front_end/ui/rootView.css",
+    "front_end/ui/searchableView.css",
+    "front_end/ui/segmentedButton.css",
+    "front_end/ui/slider.css",
+    "front_end/ui/smallBubble.css",
+    "front_end/ui/softContextMenu.css",
+    "front_end/ui/softDropDown.css",
+    "front_end/ui/softDropDownButton.css",
+    "front_end/ui/splitWidget.css",
+    "front_end/ui/suggestBox.css",
+    "front_end/ui/tabbedPane.css",
+    "front_end/ui/targetCrashedScreen.css",
+    "front_end/ui/textButton.css",
+    "front_end/ui/textPrompt.css",
+    "front_end/ui/toolbar.css",
+    "front_end/ui/tooltip.css",
+    "front_end/ui/treeoutline.css",
+    "front_end/ui/viewContainers.css",
+    "front_end/web_audio/AudioContextContentBuilder.js",
+    "front_end/web_audio/audioContextSelector.css",
+    "front_end/web_audio/AudioContextSelector.js",
+    "front_end/web_audio/module.json",
+    "front_end/web_audio/webAudio.css",
+    "front_end/web_audio/WebAudioModel.js",
+    "front_end/web_audio/WebAudioView.js",
+    "front_end/web_audio/graph_visualizer/Types.js",
+    "front_end/web_audio/graph_visualizer/GraphStyle.js",
+    "front_end/web_audio/graph_visualizer/GraphManager.js",
+    "front_end/web_audio/graph_visualizer/NodeRendererUtility.js",
+    "front_end/web_audio/graph_visualizer/NodeView.js",
+    "front_end/web_audio/graph_visualizer/EdgeView.js",
+    "front_end/web_audio/graph_visualizer/GraphView.js",
+    "front_end/worker_main/WorkerMain.js",
+    "front_end/worker_main/module.json",
+    "front_end/worker_service/module.json",
+    "front_end/worker_service/ServiceDispatcher.js",
+    "front_end/workspace/module.json",
+    "front_end/workspace_diff/WorkspaceDiff.js",
+    "front_end/workspace_diff/module.json",
   ]
 
-  grd_files =
-      copied_devtools_modules + generated_applications +
-      generated_non_autostart_non_remote_modules + devtools_embedder_scripts +
-      [
-        "$resources_out_dir/devtools_extension_api.js",
-        "$resources_out_dir/SupportedCSSProperties.js",
-        "$resources_out_dir/InspectorBackendCommands.js",
-      ]
-
-  # Bundle remote modules in ChromeOS.
-  if (is_chromeos) {
-    grd_files += generated_remote_modules + devtools_emulated_devices_images +
-                 lighthouse_locale_files
-  }
-
-  inputs = grd_files + devtools_image_files
-  outfile = "$root_gen_dir/devtools/devtools_resources.grd"
-  outputs = [
-    outfile,
+  lighthouse_locale_files = [
+    "front_end/audits_worker/lighthouse/locales/ar-XB.json",
+    "front_end/audits_worker/lighthouse/locales/ar.json",
+    "front_end/audits_worker/lighthouse/locales/bg.json",
+    "front_end/audits_worker/lighthouse/locales/ca.json",
+    "front_end/audits_worker/lighthouse/locales/cs.json",
+    "front_end/audits_worker/lighthouse/locales/da.json",
+    "front_end/audits_worker/lighthouse/locales/de.json",
+    "front_end/audits_worker/lighthouse/locales/el.json",
+    "front_end/audits_worker/lighthouse/locales/en-GB.json",
+    "front_end/audits_worker/lighthouse/locales/en-US.json",
+    "front_end/audits_worker/lighthouse/locales/en-XA.json",
+    "front_end/audits_worker/lighthouse/locales/en-XL.json",
+    "front_end/audits_worker/lighthouse/locales/es-419.json",
+    "front_end/audits_worker/lighthouse/locales/es.json",
+    "front_end/audits_worker/lighthouse/locales/fi.json",
+    "front_end/audits_worker/lighthouse/locales/fil.json",
+    "front_end/audits_worker/lighthouse/locales/fr.json",
+    "front_end/audits_worker/lighthouse/locales/he.json",
+    "front_end/audits_worker/lighthouse/locales/hi.json",
+    "front_end/audits_worker/lighthouse/locales/hr.json",
+    "front_end/audits_worker/lighthouse/locales/hu.json",
+    "front_end/audits_worker/lighthouse/locales/id.json",
+    "front_end/audits_worker/lighthouse/locales/it.json",
+    "front_end/audits_worker/lighthouse/locales/ja.json",
+    "front_end/audits_worker/lighthouse/locales/ko.json",
+    "front_end/audits_worker/lighthouse/locales/lt.json",
+    "front_end/audits_worker/lighthouse/locales/lv.json",
+    "front_end/audits_worker/lighthouse/locales/nl.json",
+    "front_end/audits_worker/lighthouse/locales/no.json",
+    "front_end/audits_worker/lighthouse/locales/pl.json",
+    "front_end/audits_worker/lighthouse/locales/pt-PT.json",
+    "front_end/audits_worker/lighthouse/locales/pt.json",
+    "front_end/audits_worker/lighthouse/locales/ro.json",
+    "front_end/audits_worker/lighthouse/locales/ru.json",
+    "front_end/audits_worker/lighthouse/locales/sk.json",
+    "front_end/audits_worker/lighthouse/locales/sl.json",
+    "front_end/audits_worker/lighthouse/locales/sr-Latn.json",
+    "front_end/audits_worker/lighthouse/locales/sr.json",
+    "front_end/audits_worker/lighthouse/locales/sv.json",
+    "front_end/audits_worker/lighthouse/locales/ta.json",
+    "front_end/audits_worker/lighthouse/locales/te.json",
+    "front_end/audits_worker/lighthouse/locales/th.json",
+    "front_end/audits_worker/lighthouse/locales/tr.json",
+    "front_end/audits_worker/lighthouse/locales/uk.json",
+    "front_end/audits_worker/lighthouse/locales/vi.json",
+    "front_end/audits_worker/lighthouse/locales/zh-HK.json",
+    "front_end/audits_worker/lighthouse/locales/zh-TW.json",
+    "front_end/audits_worker/lighthouse/locales/zh.json",
   ]
 
-  relative_path_dirs = [
-    resources_out_dir,
-    "front_end",
+  all_devtools_files += lighthouse_locale_files
+
+  all_devtools_modules = [
+    "front_end/browser_sdk/browser_sdk.js",
+    "front_end/browser_sdk/LogManager.js",
+    "front_end/persistence/persistence.js",
+    "front_end/persistence/WorkspaceSettingsTab.js",
+    "front_end/persistence/PlatformFileSystem.js",
+    "front_end/persistence/PersistenceUtils.js",
+    "front_end/persistence/PersistenceImpl.js",
+    "front_end/persistence/PersistenceActions.js",
+    "front_end/persistence/NetworkPersistenceManager.js",
+    "front_end/persistence/IsolatedFileSystemManager.js",
+    "front_end/persistence/IsolatedFileSystem.js",
+    "front_end/persistence/FileSystemWorkspaceBinding.js",
+    "front_end/persistence/EditFileSystemView.js",
+    "front_end/persistence/Automapping.js",
+    "front_end/components/components.js",
+    "front_end/components/TargetDetachedDialog.js",
+    "front_end/components/Reload.js",
+    "front_end/components/Linkifier.js",
+    "front_end/components/JSPresentationUtils.js",
+    "front_end/components/ImagePreview.js",
+    "front_end/components/DockController.js",
+    "front_end/bindings/bindings.js",
+    "front_end/bindings/TempFile.js",
+    "front_end/bindings/StylesSourceMapping.js",
+    "front_end/bindings/SASSSourceMapping.js",
+    "front_end/bindings/ResourceUtils.js",
+    "front_end/bindings/ResourceScriptMapping.js",
+    "front_end/bindings/ResourceMapping.js",
+    "front_end/bindings/PresentationConsoleMessageHelper.js",
+    "front_end/bindings/NetworkProject.js",
+    "front_end/bindings/LiveLocation.js",
+    "front_end/bindings/FileUtils.js",
+    "front_end/bindings/DefaultScriptMapping.js",
+    "front_end/bindings/DebuggerWorkspaceBinding.js",
+    "front_end/bindings/CSSWorkspaceBinding.js",
+    "front_end/bindings/ContentProviderBasedProject.js",
+    "front_end/bindings/CompilerScriptMapping.js",
+    "front_end/bindings/BreakpointManager.js",
+    "front_end/bindings/BlackboxManager.js",
+    "front_end/workspace/workspace.js",
+    "front_end/workspace/WorkspaceImpl.js",
+    "front_end/workspace/UISourceCode.js",
+    "front_end/workspace/FileManager.js",
+    "front_end/services/services.js",
+    "front_end/services/ServiceManager.js",
+    "front_end/sdk/sdk.js",
+    "front_end/sdk/TracingModel.js",
+    "front_end/sdk/TracingManager.js",
+    "front_end/sdk/TargetManager.js",
+    "front_end/sdk/Target.js",
+    "front_end/sdk/SourceMapManager.js",
+    "front_end/sdk/SourceMap.js",
+    "front_end/sdk/ServiceWorkerManager.js",
+    "front_end/sdk/ServiceWorkerCacheModel.js",
+    "front_end/sdk/ServerTiming.js",
+    "front_end/sdk/SecurityOriginManager.js",
+    "front_end/sdk/SDKModel.js",
+    "front_end/sdk/Script.js",
+    "front_end/sdk/ScreenCaptureModel.js",
+    "front_end/sdk/RuntimeModel.js",
+    "front_end/sdk/ResourceTreeModel.js",
+    "front_end/sdk/Resource.js",
+    "front_end/sdk/RemoteObject.js",
+    "front_end/sdk/ProfileTreeModel.js",
+    "front_end/sdk/PerformanceMetricsModel.js",
+    "front_end/sdk/PaintProfiler.js",
+    "front_end/sdk/OverlayModel.js",
+    "front_end/sdk/NetworkRequest.js",
+    "front_end/sdk/NetworkManager.js",
+    "front_end/sdk/NetworkLog.js",
+    "front_end/sdk/LogModel.js",
+    "front_end/sdk/LayerTreeBase.js",
+    "front_end/sdk/IsolateManager.js",
+    "front_end/sdk/HeapProfilerModel.js",
+    "front_end/sdk/HARLog.js",
+    "front_end/sdk/FilmStripModel.js",
+    "front_end/sdk/EmulationModel.js",
+    "front_end/sdk/DOMModel.js",
+    "front_end/sdk/DOMDebuggerModel.js",
+    "front_end/sdk/DebuggerModel.js",
+    "front_end/sdk/CSSStyleSheetHeader.js",
+    "front_end/sdk/CSSStyleDeclaration.js",
+    "front_end/sdk/CSSRule.js",
+    "front_end/sdk/CSSProperty.js",
+    "front_end/sdk/CSSModel.js",
+    "front_end/sdk/CSSMetadata.js",
+    "front_end/sdk/CSSMedia.js",
+    "front_end/sdk/CSSMatchedStyles.js",
+    "front_end/sdk/CPUProfilerModel.js",
+    "front_end/sdk/CPUProfileDataModel.js",
+    "front_end/sdk/CookieParser.js",
+    "front_end/sdk/CookieModel.js",
+    "front_end/sdk/CompilerSourceMappingContentProvider.js",
+    "front_end/sdk/ConsoleModel.js",
+    "front_end/sdk/Connections.js",
+    "front_end/sdk/ChildTargetManager.js",
+    "front_end/protocol/protocol.js",
+    "front_end/protocol/NodeURL.js",
+    "front_end/protocol/InspectorBackend.js",
+    "front_end/host/host.js",
+    "front_end/host/UserMetrics.js",
+    "front_end/host/ResourceLoader.js",
+    "front_end/host/Platform.js",
+    "front_end/host/InspectorFrontendHost.js",
+    "front_end/host/InspectorFrontendHostAPI.js",
+    "front_end/dom_extension/DOMExtension.js",
+    "front_end/root.js",
+    "front_end/Runtime.js",
+    "front_end/platform/utilities.js",
+    "front_end/ui/ARIAUtils.js",
+    "front_end/ui/ZoomManager.js",
+    "front_end/ui/XWidget.js",
+    "front_end/ui/XLink.js",
+    "front_end/ui/XElement.js",
+    "front_end/ui/Widget.js",
+    "front_end/ui/View.js",
+    "front_end/ui/ViewManager.js",
+    "front_end/ui/UIUtils.js",
+    "front_end/ui/ui.js",
+    "front_end/ui/Treeoutline.js",
+    "front_end/ui/Tooltip.js",
+    "front_end/ui/Toolbar.js",
+    "front_end/ui/ThrottledWidget.js",
+    "front_end/ui/TextPrompt.js",
+    "front_end/ui/TextEditor.js",
+    "front_end/ui/TargetCrashedScreen.js",
+    "front_end/ui/TabbedPane.js",
+    "front_end/ui/SyntaxHighlighter.js",
+    "front_end/ui/SuggestBox.js",
+    "front_end/ui/SplitWidget.js",
+    "front_end/ui/SoftDropDown.js",
+    "front_end/ui/SoftContextMenu.js",
+    "front_end/ui/ShortcutsScreen.js",
+    "front_end/ui/ShortcutRegistry.js",
+    "front_end/ui/SettingsUI.js",
+    "front_end/ui/SegmentedButton.js",
+    "front_end/ui/SearchableView.js",
+    "front_end/ui/RootView.js",
+    "front_end/ui/ResizerWidget.js",
+    "front_end/ui/ReportView.js",
+    "front_end/ui/RemoteDebuggingTerminatedScreen.js",
+    "front_end/ui/ProgressIndicator.js",
+    "front_end/ui/PopoverHelper.js",
+    "front_end/ui/Panel.js",
+    "front_end/ui/ListWidget.js",
+    "front_end/ui/ListModel.js",
+    "front_end/ui/ListControl.js",
+    "front_end/ui/KeyboardShortcut.js",
+    "front_end/ui/InspectorView.js",
+    "front_end/ui/InplaceEditor.js",
+    "front_end/ui/Infobar.js",
+    "front_end/ui/Icon.js",
+    "front_end/ui/HistoryInput.js",
+    "front_end/ui/GlassPane.js",
+    "front_end/ui/Geometry.js",
+    "front_end/ui/Fragment.js",
+    "front_end/ui/ForwardedInputEventHandler.js",
+    "front_end/ui/FilterSuggestionBuilder.js",
+    "front_end/ui/FilterBar.js",
+    "front_end/ui/EmptyWidget.js",
+    "front_end/ui/DropTarget.js",
+    "front_end/ui/Dialog.js",
+    "front_end/ui/ContextMenu.js",
+    "front_end/ui/Context.js",
+    "front_end/ui/ARIAUtils.js",
+    "front_end/ui/ActionRegistry.js",
+    "front_end/ui/Action.js",
+    "front_end/ui/ActionDelegate.js",
+    "front_end/ui/ContextFlavorListener.js",
+    "front_end/root.js",
+    "front_end/common/common.js",
+    "front_end/common/App.js",
+    "front_end/common/AppProvider.js",
+    "front_end/common/CharacterIdMap.js",
+    "front_end/common/Color.js",
+    "front_end/common/ContentProvider.js",
+    "front_end/common/EventTarget.js",
+    "front_end/common/JavaScriptMetaData.js",
+    "front_end/common/Linkifier.js",
+    "front_end/common/Object.js",
+    "front_end/common/Console.js",
+    "front_end/common/ParsedURL.js",
+    "front_end/common/Progress.js",
+    "front_end/common/QueryParamHandler.js",
+    "front_end/common/ResourceType.js",
+    "front_end/common/Revealer.js",
+    "front_end/common/Runnable.js",
+    "front_end/common/SegmentedRange.js",
+    "front_end/common/Settings.js",
+    "front_end/common/StaticContentProvider.js",
+    "front_end/common/StringOutputStream.js",
+    "front_end/common/TextDictionary.js",
+    "front_end/common/Throttler.js",
+    "front_end/common/Trie.js",
+    "front_end/common/UIString.js",
+    "front_end/common/Worker.js",
   ]
 
-  args = rebase_path(grd_files, root_build_dir) + [ "--relative_path_dirs" ] +
-         rebase_path(relative_path_dirs, root_build_dir) +
-         [
-           "--images",
-           rebase_path("front_end/Images", root_build_dir),
-           "--output",
-           rebase_path(outfile, root_build_dir),
-         ]
-}
-
-action("devtools_extension_api") {
-  script = "scripts/build/generate_devtools_extension_api.py"
-
-  devtools_extension_api_files = [ "front_end/extensions/ExtensionAPI.js" ]
-  inputs = devtools_extension_api_files
-  outputs = [
-    "$resources_out_dir/devtools_extension_api.js",
+  devtools_test_files = [
+    "//third_party/axe-core/axe.js",
+    "front_end/accessibility_test_runner/AccessibilityPaneTestRunner.js",
+    "front_end/accessibility_test_runner/module.json",
+    "front_end/application_test_runner/AppcacheTestRunner.js",
+    "front_end/application_test_runner/CacheStorageTestRunner.js",
+    "front_end/application_test_runner/IndexedDBTestRunner.js",
+    "front_end/application_test_runner/module.json",
+    "front_end/application_test_runner/ResourcesTestRunner.js",
+    "front_end/application_test_runner/ResourceTreeTestRunner.js",
+    "front_end/application_test_runner/ServiceWorkersTestRunner.js",
+    "front_end/audits_test_runner/AuditsTestRunner.js",
+    "front_end/audits_test_runner/module.json",
+    "front_end/axe_core_test_runner/AxeCoreTestRunner.js",
+    "front_end/axe_core_test_runner/module.json",
+    "front_end/bindings_test_runner/AutomappingTestRunner.js",
+    "front_end/bindings_test_runner/BindingsTestRunner.js",
+    "front_end/bindings_test_runner/IsolatedFilesystemTestRunner.js",
+    "front_end/bindings_test_runner/module.json",
+    "front_end/bindings_test_runner/OverridesTestRunner.js",
+    "front_end/bindings_test_runner/PersistenceTestRunner.js",
+    "front_end/console_test_runner/ConsoleTestRunner.js",
+    "front_end/console_test_runner/module.json",
+    "front_end/coverage_test_runner/CoverageTestRunner.js",
+    "front_end/coverage_test_runner/module.json",
+    "front_end/cpu_profiler_test_runner/module.json",
+    "front_end/cpu_profiler_test_runner/ProfilerTestRunner.js",
+    "front_end/data_grid_test_runner/DataGridTestRunner.js",
+    "front_end/data_grid_test_runner/module.json",
+    "front_end/device_mode_test_runner/DeviceModeTestRunner.js",
+    "front_end/device_mode_test_runner/module.json",
+    "front_end/elements_test_runner/EditDOMTestRunner.js",
+    "front_end/elements_test_runner/ElementsPanelShadowSelectionOnRefreshTestRunner.js",
+    "front_end/elements_test_runner/ElementsTestRunner.js",
+    "front_end/elements_test_runner/module.json",
+    "front_end/elements_test_runner/SetOuterHTMLTestRunner.js",
+    "front_end/elements_test_runner/StylesUpdateLinksTestRunner.js",
+    "front_end/extensions_test_runner/ExtensionsNetworkTestRunner.js",
+    "front_end/extensions_test_runner/ExtensionsTestRunner.js",
+    "front_end/extensions_test_runner/module.json",
+    "front_end/heap_profiler_test_runner/HeapProfilerTestRunner.js",
+    "front_end/heap_profiler_test_runner/module.json",
+    "front_end/integration_test_runner.html",
+    "front_end/integration_test_runner.js",
+    "front_end/integration_test_runner.json",
+    "front_end/layers_test_runner/LayersTestRunner.js",
+    "front_end/layers_test_runner/module.json",
+    "front_end/network_test_runner/module.json",
+    "front_end/network_test_runner/NetworkTestRunner.js",
+    "front_end/network_test_runner/ProductRegistryTestRunner.js",
+    "front_end/performance_test_runner/module.json",
+    "front_end/performance_test_runner/TimelineDataTestRunner.js",
+    "front_end/performance_test_runner/TimelineTestRunner.js",
+    "front_end/sdk_test_runner/module.json",
+    "front_end/sdk_test_runner/PageMockTestRunner.js",
+    "front_end/security_test_runner/module.json",
+    "front_end/security_test_runner/SecurityTestRunner.js",
+    "front_end/sources_test_runner/AutocompleteTestRunner.js",
+    "front_end/sources_test_runner/DebuggerTestRunner.js",
+    "front_end/sources_test_runner/EditorTestRunner.js",
+    "front_end/sources_test_runner/LiveEditTestRunner.js",
+    "front_end/sources_test_runner/module.json",
+    "front_end/sources_test_runner/SearchTestRunner.js",
+    "front_end/sources_test_runner/SourcesTestRunner.js",
+    "front_end/test_runner/module.json",
+    "front_end/test_runner/TestRunner.js",
   ]
 
-  args = rebase_path(outputs, root_build_dir) +
-         rebase_path(devtools_extension_api_files, root_build_dir)
-}
-
-action("supported_css_properties") {
-  script = "scripts/build/generate_supported_css.py"
-
-  inputs = [
-    "../core/css/css_properties.json5",
+  devtools_embedder_scripts = [
+    "front_end/devtools_compatibility.js",
+    "front_end/Tests.js",
   ]
 
-  outputs = [
+  devtools_emulated_devices_images = [
+    "front_end/emulated_devices/google-nexus-5-horizontal-default-1x.png",
+    "front_end/emulated_devices/google-nexus-5-horizontal-default-2x.png",
+    "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-1x.png",
+    "front_end/emulated_devices/google-nexus-5-horizontal-keyboard-2x.png",
+    "front_end/emulated_devices/google-nexus-5-horizontal-navigation-1x.png",
+    "front_end/emulated_devices/google-nexus-5-horizontal-navigation-2x.png",
+    "front_end/emulated_devices/google-nexus-5-vertical-default-1x.png",
+    "front_end/emulated_devices/google-nexus-5-vertical-default-2x.png",
+    "front_end/emulated_devices/google-nexus-5-vertical-keyboard-1x.png",
+    "front_end/emulated_devices/google-nexus-5-vertical-keyboard-2x.png",
+    "front_end/emulated_devices/google-nexus-5-vertical-navigation-1x.png",
+    "front_end/emulated_devices/google-nexus-5-vertical-navigation-2x.png",
+    "front_end/emulated_devices/google-nexus-5x-horizontal-default-1x.png",
+    "front_end/emulated_devices/google-nexus-5x-horizontal-default-2x.png",
+    "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-1x.png",
+    "front_end/emulated_devices/google-nexus-5x-horizontal-keyboard-2x.png",
+    "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-1x.png",
+    "front_end/emulated_devices/google-nexus-5x-horizontal-navigation-2x.png",
+    "front_end/emulated_devices/google-nexus-5x-vertical-default-1x.png",
+    "front_end/emulated_devices/google-nexus-5x-vertical-default-2x.png",
+    "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-1x.png",
+    "front_end/emulated_devices/google-nexus-5x-vertical-keyboard-2x.png",
+    "front_end/emulated_devices/google-nexus-5x-vertical-navigation-1x.png",
+    "front_end/emulated_devices/google-nexus-5x-vertical-navigation-2x.png",
+    "front_end/emulated_devices/iPad-landscape.svg",
+    "front_end/emulated_devices/iPad-portrait.svg",
+    "front_end/emulated_devices/iPhone5-landscape.svg",
+    "front_end/emulated_devices/iPhone5-portrait.svg",
+    "front_end/emulated_devices/iPhone6-landscape.svg",
+    "front_end/emulated_devices/iPhone6-portrait.svg",
+    "front_end/emulated_devices/iPhone6Plus-landscape.svg",
+    "front_end/emulated_devices/iPhone6Plus-portrait.svg",
+    "front_end/emulated_devices/Nexus5X-landscape.svg",
+    "front_end/emulated_devices/Nexus5X-portrait.svg",
+    "front_end/emulated_devices/Nexus6P-landscape.svg",
+    "front_end/emulated_devices/Nexus6P-portrait.svg",
+  ]
+
+  devtools_image_files = [
+    "front_end/Images/accelerometer-back.svg",
+    "front_end/Images/accelerometer-bottom.png",
+    "front_end/Images/accelerometer-front.svg",
+    "front_end/Images/accelerometer-left.png",
+    "front_end/Images/accelerometer-right.png",
+    "front_end/Images/accelerometer-top.png",
+    "front_end/Images/audits_logo.svg",
+    "front_end/Images/breakpoint.svg",
+    "front_end/Images/breakpointConditional.svg",
+    "front_end/Images/checkboxCheckmark.svg",
+    "front_end/Images/checker.png",
+    "front_end/Images/chevrons.svg",
+    "front_end/Images/chromeDisabledSelect.png",
+    "front_end/Images/chromeDisabledSelect_2x.png",
+    "front_end/Images/chromeLeft.png",
+    "front_end/Images/chromeMiddle.png",
+    "front_end/Images/chromeRight.png",
+    "front_end/Images/chromeSelect.png",
+    "front_end/Images/chromeSelect_2x.png",
+    "front_end/Images/errorWave.svg",
+    "front_end/Images/ic_info_black_18dp.svg",
+    "front_end/Images/ic_warning_black_18dp.svg",
+    "front_end/Images/largeIcons.svg",
+    "front_end/Images/mediumIcons.svg",
+    "front_end/Images/navigationControls.png",
+    "front_end/Images/navigationControls_2x.png",
+    "front_end/Images/nodeIcon.png",
+    "front_end/Images/popoverArrows.png",
+    "front_end/Images/profileGroupIcon.png",
+    "front_end/Images/profileIcon.png",
+    "front_end/Images/profileSmallIcon.png",
+    "front_end/Images/radioDot.png",
+    "front_end/Images/resizeDiagonal.png",
+    "front_end/Images/resizeDiagonal_2x.png",
+    "front_end/Images/resizeHorizontal.png",
+    "front_end/Images/resizeHorizontal_2x.png",
+    "front_end/Images/resizeVertical.png",
+    "front_end/Images/resizeVertical_2x.png",
+    "front_end/Images/resourceCSSIcon.png",
+    "front_end/Images/resourceDocumentIcon.png",
+    "front_end/Images/resourceDocumentIconSmall.png",
+    "front_end/Images/resourceJSIcon.png",
+    "front_end/Images/resourcePlainIcon.png",
+    "front_end/Images/resourcePlainIconSmall.png",
+    "front_end/Images/resourcesTimeGraphIcon.png",
+    "front_end/Images/searchNext.png",
+    "front_end/Images/searchPrev.png",
+    "front_end/Images/securityIcons.svg",
+    "front_end/Images/speech.png",
+    "front_end/Images/smallIcons.svg",
+    "front_end/Images/toolbarResizerVertical.png",
+    "front_end/Images/touchCursor.png",
+    "front_end/Images/touchCursor_2x.png",
+    "front_end/Images/treeoutlineTriangles.svg",
+    "front_end/Images/whatsnew.png",
+  ]
+
+  resources_out_dir = "$root_out_dir/resources/inspector"
+
+  generated_scripts = [
+    "$resources_out_dir/InspectorBackendCommands.js",
     "$resources_out_dir/SupportedCSSProperties.js",
   ]
 
-  args =
-      rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
-}
+  generated_aria_properties =
+      [ "$resources_out_dir/accessibility/ARIAProperties.js" ]
 
-action("aria_properties") {
-  script = "scripts/build/generate_aria.py"
-
-  inputs = [
-    "../core/html/aria_properties.json5",
+  application_templates = [
+    "front_end/devtools_app.html",
+    "front_end/inspector.html",
+    "front_end/integration_test_runner.html",
+    "front_end/js_app.html",
+    "front_end/ndb_app.html",
+    "front_end/node_app.html",
+    "front_end/toolbox.html",
+    "front_end/worker_app.html",
   ]
 
-  outputs = [
-    "$resources_out_dir/accessibility/ARIAProperties.js",
+  copied_devtools_modules = [
+    "$resources_out_dir/browser_sdk/browser_sdk.js",
+    "$resources_out_dir/browser_sdk/LogManager.js",
+    "$resources_out_dir/persistence/persistence.js",
+    "$resources_out_dir/persistence/WorkspaceSettingsTab.js",
+    "$resources_out_dir/persistence/PlatformFileSystem.js",
+    "$resources_out_dir/persistence/PersistenceUtils.js",
+    "$resources_out_dir/persistence/PersistenceImpl.js",
+    "$resources_out_dir/persistence/PersistenceActions.js",
+    "$resources_out_dir/persistence/NetworkPersistenceManager.js",
+    "$resources_out_dir/persistence/IsolatedFileSystemManager.js",
+    "$resources_out_dir/persistence/IsolatedFileSystem.js",
+    "$resources_out_dir/persistence/FileSystemWorkspaceBinding.js",
+    "$resources_out_dir/persistence/EditFileSystemView.js",
+    "$resources_out_dir/persistence/Automapping.js",
+    "$resources_out_dir/components/components.js",
+    "$resources_out_dir/components/TargetDetachedDialog.js",
+    "$resources_out_dir/components/Reload.js",
+    "$resources_out_dir/components/Linkifier.js",
+    "$resources_out_dir/components/JSPresentationUtils.js",
+    "$resources_out_dir/components/ImagePreview.js",
+    "$resources_out_dir/components/DockController.js",
+    "$resources_out_dir/bindings/bindings.js",
+    "$resources_out_dir/bindings/TempFile.js",
+    "$resources_out_dir/bindings/StylesSourceMapping.js",
+    "$resources_out_dir/bindings/SASSSourceMapping.js",
+    "$resources_out_dir/bindings/ResourceUtils.js",
+    "$resources_out_dir/bindings/ResourceScriptMapping.js",
+    "$resources_out_dir/bindings/ResourceMapping.js",
+    "$resources_out_dir/bindings/PresentationConsoleMessageHelper.js",
+    "$resources_out_dir/bindings/NetworkProject.js",
+    "$resources_out_dir/bindings/LiveLocation.js",
+    "$resources_out_dir/bindings/FileUtils.js",
+    "$resources_out_dir/bindings/DefaultScriptMapping.js",
+    "$resources_out_dir/bindings/DebuggerWorkspaceBinding.js",
+    "$resources_out_dir/bindings/CSSWorkspaceBinding.js",
+    "$resources_out_dir/bindings/ContentProviderBasedProject.js",
+    "$resources_out_dir/bindings/CompilerScriptMapping.js",
+    "$resources_out_dir/bindings/BreakpointManager.js",
+    "$resources_out_dir/bindings/BlackboxManager.js",
+    "$resources_out_dir/workspace/workspace.js",
+    "$resources_out_dir/workspace/WorkspaceImpl.js",
+    "$resources_out_dir/workspace/UISourceCode.js",
+    "$resources_out_dir/workspace/FileManager.js",
+    "$resources_out_dir/services/services.js",
+    "$resources_out_dir/services/ServiceManager.js",
+    "$resources_out_dir/sdk/sdk.js",
+    "$resources_out_dir/sdk/TracingModel.js",
+    "$resources_out_dir/sdk/TracingManager.js",
+    "$resources_out_dir/sdk/TargetManager.js",
+    "$resources_out_dir/sdk/Target.js",
+    "$resources_out_dir/sdk/SourceMapManager.js",
+    "$resources_out_dir/sdk/SourceMap.js",
+    "$resources_out_dir/sdk/ServiceWorkerManager.js",
+    "$resources_out_dir/sdk/ServiceWorkerCacheModel.js",
+    "$resources_out_dir/sdk/ServerTiming.js",
+    "$resources_out_dir/sdk/SecurityOriginManager.js",
+    "$resources_out_dir/sdk/SDKModel.js",
+    "$resources_out_dir/sdk/Script.js",
+    "$resources_out_dir/sdk/ScreenCaptureModel.js",
+    "$resources_out_dir/sdk/RuntimeModel.js",
+    "$resources_out_dir/sdk/ResourceTreeModel.js",
+    "$resources_out_dir/sdk/Resource.js",
+    "$resources_out_dir/sdk/RemoteObject.js",
+    "$resources_out_dir/sdk/ProfileTreeModel.js",
+    "$resources_out_dir/sdk/PerformanceMetricsModel.js",
+    "$resources_out_dir/sdk/PaintProfiler.js",
+    "$resources_out_dir/sdk/OverlayModel.js",
+    "$resources_out_dir/sdk/NetworkRequest.js",
+    "$resources_out_dir/sdk/NetworkManager.js",
+    "$resources_out_dir/sdk/NetworkLog.js",
+    "$resources_out_dir/sdk/LogModel.js",
+    "$resources_out_dir/sdk/LayerTreeBase.js",
+    "$resources_out_dir/sdk/IsolateManager.js",
+    "$resources_out_dir/sdk/HeapProfilerModel.js",
+    "$resources_out_dir/sdk/HARLog.js",
+    "$resources_out_dir/sdk/FilmStripModel.js",
+    "$resources_out_dir/sdk/EmulationModel.js",
+    "$resources_out_dir/sdk/DOMModel.js",
+    "$resources_out_dir/sdk/DOMDebuggerModel.js",
+    "$resources_out_dir/sdk/DebuggerModel.js",
+    "$resources_out_dir/sdk/CSSStyleSheetHeader.js",
+    "$resources_out_dir/sdk/CSSStyleDeclaration.js",
+    "$resources_out_dir/sdk/CSSRule.js",
+    "$resources_out_dir/sdk/CSSProperty.js",
+    "$resources_out_dir/sdk/CSSModel.js",
+    "$resources_out_dir/sdk/CSSMetadata.js",
+    "$resources_out_dir/sdk/CSSMedia.js",
+    "$resources_out_dir/sdk/CSSMatchedStyles.js",
+    "$resources_out_dir/sdk/CPUProfilerModel.js",
+    "$resources_out_dir/sdk/CPUProfileDataModel.js",
+    "$resources_out_dir/sdk/CookieParser.js",
+    "$resources_out_dir/sdk/CookieModel.js",
+    "$resources_out_dir/sdk/CompilerSourceMappingContentProvider.js",
+    "$resources_out_dir/sdk/ConsoleModel.js",
+    "$resources_out_dir/sdk/Connections.js",
+    "$resources_out_dir/sdk/ChildTargetManager.js",
+    "$resources_out_dir/protocol/protocol.js",
+    "$resources_out_dir/protocol/NodeURL.js",
+    "$resources_out_dir/protocol/InspectorBackend.js",
+    "$resources_out_dir/host/host.js",
+    "$resources_out_dir/host/UserMetrics.js",
+    "$resources_out_dir/host/ResourceLoader.js",
+    "$resources_out_dir/host/Platform.js",
+    "$resources_out_dir/host/InspectorFrontendHost.js",
+    "$resources_out_dir/host/InspectorFrontendHostAPI.js",
+    "$resources_out_dir/dom_extension/DOMExtension.js",
+    "$resources_out_dir/root.js",
+    "$resources_out_dir/Runtime.js",
+    "$resources_out_dir/platform/utilities.js",
+    "$resources_out_dir/ui/ui.js",
+    "$resources_out_dir/common/common.js",
+    "$resources_out_dir/ui/ZoomManager.js",
+    "$resources_out_dir/ui/XWidget.js",
+    "$resources_out_dir/ui/XLink.js",
+    "$resources_out_dir/ui/XElement.js",
+    "$resources_out_dir/ui/Widget.js",
+    "$resources_out_dir/ui/View.js",
+    "$resources_out_dir/ui/ViewManager.js",
+    "$resources_out_dir/ui/UIUtils.js",
+    "$resources_out_dir/ui/Treeoutline.js",
+    "$resources_out_dir/ui/Tooltip.js",
+    "$resources_out_dir/ui/Toolbar.js",
+    "$resources_out_dir/ui/ThrottledWidget.js",
+    "$resources_out_dir/ui/TextPrompt.js",
+    "$resources_out_dir/ui/TextEditor.js",
+    "$resources_out_dir/ui/TargetCrashedScreen.js",
+    "$resources_out_dir/ui/TabbedPane.js",
+    "$resources_out_dir/ui/SyntaxHighlighter.js",
+    "$resources_out_dir/ui/SuggestBox.js",
+    "$resources_out_dir/ui/SplitWidget.js",
+    "$resources_out_dir/ui/SoftDropDown.js",
+    "$resources_out_dir/ui/SoftContextMenu.js",
+    "$resources_out_dir/ui/ShortcutsScreen.js",
+    "$resources_out_dir/ui/ShortcutRegistry.js",
+    "$resources_out_dir/ui/SettingsUI.js",
+    "$resources_out_dir/ui/SegmentedButton.js",
+    "$resources_out_dir/ui/SearchableView.js",
+    "$resources_out_dir/ui/RootView.js",
+    "$resources_out_dir/ui/ResizerWidget.js",
+    "$resources_out_dir/ui/ReportView.js",
+    "$resources_out_dir/ui/RemoteDebuggingTerminatedScreen.js",
+    "$resources_out_dir/ui/ProgressIndicator.js",
+    "$resources_out_dir/ui/PopoverHelper.js",
+    "$resources_out_dir/ui/Panel.js",
+    "$resources_out_dir/ui/ListWidget.js",
+    "$resources_out_dir/ui/ListModel.js",
+    "$resources_out_dir/ui/ListControl.js",
+    "$resources_out_dir/ui/KeyboardShortcut.js",
+    "$resources_out_dir/ui/InspectorView.js",
+    "$resources_out_dir/ui/InplaceEditor.js",
+    "$resources_out_dir/ui/Infobar.js",
+    "$resources_out_dir/ui/Icon.js",
+    "$resources_out_dir/ui/HistoryInput.js",
+    "$resources_out_dir/ui/GlassPane.js",
+    "$resources_out_dir/ui/Geometry.js",
+    "$resources_out_dir/ui/Fragment.js",
+    "$resources_out_dir/ui/ForwardedInputEventHandler.js",
+    "$resources_out_dir/ui/FilterSuggestionBuilder.js",
+    "$resources_out_dir/ui/FilterBar.js",
+    "$resources_out_dir/ui/EmptyWidget.js",
+    "$resources_out_dir/ui/DropTarget.js",
+    "$resources_out_dir/ui/Dialog.js",
+    "$resources_out_dir/ui/ContextMenu.js",
+    "$resources_out_dir/ui/Context.js",
+    "$resources_out_dir/ui/ARIAUtils.js",
+    "$resources_out_dir/ui/ActionRegistry.js",
+    "$resources_out_dir/ui/Action.js",
+    "$resources_out_dir/ui/ActionDelegate.js",
+    "$resources_out_dir/ui/ContextFlavorListener.js",
+    "$resources_out_dir/common/App.js",
+    "$resources_out_dir/common/AppProvider.js",
+    "$resources_out_dir/common/CharacterIdMap.js",
+    "$resources_out_dir/common/Color.js",
+    "$resources_out_dir/common/ContentProvider.js",
+    "$resources_out_dir/common/EventTarget.js",
+    "$resources_out_dir/common/JavaScriptMetaData.js",
+    "$resources_out_dir/common/Linkifier.js",
+    "$resources_out_dir/common/Object.js",
+    "$resources_out_dir/common/Console.js",
+    "$resources_out_dir/common/ParsedURL.js",
+    "$resources_out_dir/common/Progress.js",
+    "$resources_out_dir/common/QueryParamHandler.js",
+    "$resources_out_dir/common/ResourceType.js",
+    "$resources_out_dir/common/Revealer.js",
+    "$resources_out_dir/common/Runnable.js",
+    "$resources_out_dir/common/SegmentedRange.js",
+    "$resources_out_dir/common/Settings.js",
+    "$resources_out_dir/common/StaticContentProvider.js",
+    "$resources_out_dir/common/StringOutputStream.js",
+    "$resources_out_dir/common/TextDictionary.js",
+    "$resources_out_dir/common/Throttler.js",
+    "$resources_out_dir/common/Trie.js",
+    "$resources_out_dir/common/UIString.js",
+    "$resources_out_dir/common/Worker.js",
   ]
 
-  args =
-      rebase_path(inputs, root_build_dir) + rebase_path(outputs, root_build_dir)
-}
-
-action("frontend_protocol_sources") {
-  script = "scripts/build/code_generator_frontend.py"
-  deps = [
-    "../core/inspector:protocol_version",
-  ]
-  inputs = [
-    "$blink_core_output_dir/inspector/protocol.json",
-  ]
-  outputs = [
-    "$resources_out_dir/InspectorBackendCommands.js",
+  generated_applications = [
+    "$resources_out_dir/audits_worker.js",
+    "$resources_out_dir/devtools_app.html",
+    "$resources_out_dir/devtools_app.js",
+    "$resources_out_dir/formatter_worker.js",
+    "$resources_out_dir/heap_snapshot_worker.js",
+    "$resources_out_dir/inspector.html",
+    "$resources_out_dir/inspector.js",
+    "$resources_out_dir/js_app.html",
+    "$resources_out_dir/js_app.js",
+    "$resources_out_dir/node_app.html",
+    "$resources_out_dir/node_app.js",
+    "$resources_out_dir/shell.js",
+    "$resources_out_dir/toolbox.html",
+    "$resources_out_dir/toolbox.js",
+    "$resources_out_dir/worker_app.html",
+    "$resources_out_dir/worker_app.js",
   ]
 
-  args = rebase_path(inputs, root_build_dir) + [
-           "--output_js_dir",
-           rebase_path(resources_out_dir, root_build_dir),
-         ]
-}
-
-action("build_release_devtools") {
-  script = "scripts/build/build_release_applications.py"
-
-  deps = [
-    ":aria_properties",
-    ":frontend_protocol_sources",
-    ":supported_css_properties",
+  generated_non_autostart_non_remote_modules = [
+    "$resources_out_dir/animation/animation_module.js",
+    "$resources_out_dir/audits/audits_module.js",
+    "$resources_out_dir/browser_debugger/browser_debugger_module.js",
+    "$resources_out_dir/changes/changes_module.js",
+    "$resources_out_dir/protocol_monitor/protocol_monitor_module.js",
+    "$resources_out_dir/css_overview/css_overview_module.js",
+    "$resources_out_dir/cm/cm_module.js",
+    "$resources_out_dir/color_picker/color_picker_module.js",
+    "$resources_out_dir/console/console_module.js",
+    "$resources_out_dir/cookie_table/cookie_table_module.js",
+    "$resources_out_dir/coverage/coverage_module.js",
+    "$resources_out_dir/data_grid/data_grid_module.js",
+    "$resources_out_dir/devices/devices_module.js",
+    "$resources_out_dir/diff/diff_module.js",
+    "$resources_out_dir/elements/elements_module.js",
+    "$resources_out_dir/event_listeners/event_listeners_module.js",
+    "$resources_out_dir/formatter/formatter_module.js",
+    "$resources_out_dir/har_importer/har_importer_module.js",
+    "$resources_out_dir/heap_snapshot_model/heap_snapshot_model_module.js",
+    "$resources_out_dir/help/help_module.js",
+    "$resources_out_dir/inline_editor/inline_editor_module.js",
+    "$resources_out_dir/javascript_metadata/javascript_metadata_module.js",
+    "$resources_out_dir/js_profiler/js_profiler_module.js",
+    "$resources_out_dir/layer_viewer/layer_viewer_module.js",
+    "$resources_out_dir/layers/layers_module.js",
+    "$resources_out_dir/media/media_module.js",
+    "$resources_out_dir/network/network_module.js",
+    "$resources_out_dir/node_debugger/node_debugger_module.js",
+    "$resources_out_dir/object_ui/object_ui_module.js",
+    "$resources_out_dir/perf_ui/perf_ui_module.js",
+    "$resources_out_dir/performance_monitor/performance_monitor_module.js",
+    "$resources_out_dir/profiler/profiler_module.js",
+    "$resources_out_dir/quick_open/quick_open_module.js",
+    "$resources_out_dir/resources/resources_module.js",
+    "$resources_out_dir/search/search_module.js",
+    "$resources_out_dir/security/security_module.js",
+    "$resources_out_dir/settings/settings_module.js",
+    "$resources_out_dir/snippets/snippets_module.js",
+    "$resources_out_dir/source_frame/source_frame_module.js",
+    "$resources_out_dir/sources/sources_module.js",
+    "$resources_out_dir/text_editor/text_editor_module.js",
+    "$resources_out_dir/timeline_model/timeline_model_module.js",
+    "$resources_out_dir/timeline/timeline_module.js",
+    "$resources_out_dir/web_audio/web_audio_module.js",
+    "$resources_out_dir/workspace_diff/workspace_diff_module.js",
   ]
 
-  helper_scripts = [
-    "scripts/build/modular_build.py",
-    "scripts/build/rjsmin.py",
+  generated_remote_modules = [
+    "$resources_out_dir/accessibility/accessibility_module.js",
+    "$resources_out_dir/audits_worker/audits_worker_module.js",
+    "$resources_out_dir/cm_modes/cm_modes_module.js",
+    "$resources_out_dir/dagre_layout/dagre_layout_module.js",
+    "$resources_out_dir/emulated_devices/emulated_devices_module.js",
+    "$resources_out_dir/product_registry_impl/product_registry_impl_module.js",
   ]
 
-  inputs = helper_scripts + all_devtools_files + devtools_test_files +
-           generated_scripts + generated_aria_properties + application_templates
-  outputs =
-      generated_applications + generated_non_autostart_non_remote_modules +
-      generated_remote_modules + generated_test_modules
-
-  args = devtools_applications + [
-           "--input_path",
-           rebase_path("front_end", root_build_dir),
-           "--output_path",
-           rebase_path(resources_out_dir, root_build_dir),
-         ]
-}
-
-action("copy_devtools_modules") {
-  script = "scripts/build/copy_devtools_modules.py"
-
-  deps = [
-    ":build_release_devtools",
+  generated_test_modules = [
+    "$resources_out_dir/accessibility_test_runner/accessibility_test_runner_module.js",
+    "$resources_out_dir/application_test_runner/application_test_runner_module.js",
+    "$resources_out_dir/audits_test_runner/audits_test_runner_module.js",
+    "$resources_out_dir/axe_core_test_runner/axe_core_test_runner_module.js",
+    "$resources_out_dir/bindings_test_runner/bindings_test_runner_module.js",
+    "$resources_out_dir/console_test_runner/console_test_runner_module.js",
+    "$resources_out_dir/coverage_test_runner/coverage_test_runner_module.js",
+    "$resources_out_dir/cpu_profiler_test_runner/cpu_profiler_test_runner_module.js",
+    "$resources_out_dir/data_grid_test_runner/data_grid_test_runner_module.js",
+    "$resources_out_dir/device_mode_test_runner/device_mode_test_runner_module.js",
+    "$resources_out_dir/elements_test_runner/elements_test_runner_module.js",
+    "$resources_out_dir/extensions_test_runner/extensions_test_runner_module.js",
+    "$resources_out_dir/heap_profiler_test_runner/heap_profiler_test_runner_module.js",
+    "$resources_out_dir/heap_snapshot_worker/heap_snapshot_worker_module.js",
+    "$resources_out_dir/integration_test_runner.html",
+    "$resources_out_dir/integration_test_runner.js",
+    "$resources_out_dir/layers_test_runner/layers_test_runner_module.js",
+    "$resources_out_dir/network_test_runner/network_test_runner_module.js",
+    "$resources_out_dir/performance_test_runner/performance_test_runner_module.js",
+    "$resources_out_dir/sdk_test_runner/sdk_test_runner_module.js",
+    "$resources_out_dir/security_test_runner/security_test_runner_module.js",
+    "$resources_out_dir/sources_test_runner/sources_test_runner_module.js",
   ]
 
-  inputs = all_devtools_modules
-  outputs = copied_devtools_modules
+  devtools_applications = [
+    "audits_worker",
+    "devtools_app",
+    "formatter_worker",
+    "heap_snapshot_worker",
+    "inspector",
+    "integration_test_runner",
+    "js_app",
+    "ndb_app",
+    "node_app",
+    "shell",
+    "toolbox",
+    "worker_app",
+  ]
 
-  args = all_devtools_modules + [
-           "--input_path",
-           rebase_path(".", root_build_dir),
-           "--output_path",
-           rebase_path(resources_out_dir, root_build_dir),
-         ]
-}
+  #-------------------------------------------------------------------------------
 
-if (debug_devtools) {
-  resources_out_debug_dir = "$root_out_dir/resources/inspector/debug"
+  visibility = [ "//third_party/blink/*" ]
 
-  action("build_debug_devtools") {
-    script = "scripts/build/build_debug_applications.py"
-
-    inputs = all_devtools_files + application_templates
-    outputs = [
-      "$resources_out_debug_dir/devtools_app.html",
-      "$resources_out_debug_dir/inspector.html",
-      "$resources_out_debug_dir/integration_test_runner.html",
-      "$resources_out_debug_dir/js_app.html",
-      "$resources_out_debug_dir/ndb_app.html",
-      "$resources_out_debug_dir/node_app.html",
-      "$resources_out_debug_dir/toolbox.html",
-      "$resources_out_debug_dir/worker_app.html",
-    ]
-
-    args = [
-      "--input_path",
-      rebase_path("front_end", root_build_dir),
-      "--output_path",
-      rebase_path(resources_out_debug_dir, root_build_dir),
+  group("devtools_all_files") {
+    data = all_devtools_files + all_devtools_modules
+    deps = [
+      ":devtools_frontend_resources_data",
     ]
   }
 
-  copy("copy_generated_scripts") {
-    deps = [
+  devtools_frontend_resources_deps = [
+    ":aria_properties",
+    ":build_release_devtools",
+    ":copy_embedder_scripts",
+    ":copy_emulated_devices_images",
+    ":copy_htaccess",
+    ":copy_inspector_images",
+    ":copy_lighthouse_locale_files",
+    ":devtools_extension_api",
+    ":frontend_protocol_sources",
+    ":supported_css_properties",
+    ":copy_devtools_modules",
+  ]
+
+  if (debug_devtools) {
+    devtools_frontend_resources_deps += [
       ":build_debug_devtools",
+      ":copy_aria_properties",
+      ":copy_generated_scripts",
+    ]
+  }
+
+  group("devtools_frontend_resources") {
+    public_deps = devtools_frontend_resources_deps
+  }
+
+  # Do not use this unless you need unpacked devtools at runtime.
+  group("devtools_frontend_resources_data") {
+    data_deps = devtools_frontend_resources_deps
+  }
+
+  copy("copy_embedder_scripts") {
+    sources = devtools_embedder_scripts
+    outputs = [
+      "$resources_out_dir/{{source_file_part}}",
+    ]
+  }
+
+  copy("copy_htaccess") {
+    sources = [
+      "htaccess",
+    ]
+    outputs = [
+      "$resources_out_dir/.htaccess",
+    ]
+  }
+
+  copy("copy_inspector_images") {
+    sources = devtools_image_files
+    outputs = [
+      "$resources_out_dir/Images/{{source_file_part}}",
+    ]
+  }
+
+  copy("copy_emulated_devices_images") {
+    sources = devtools_emulated_devices_images
+    outputs = [
+      "$resources_out_dir/emulated_devices/{{source_file_part}}",
+    ]
+  }
+
+  copy("copy_lighthouse_locale_files") {
+    sources = lighthouse_locale_files
+    outputs = [
+      "$resources_out_dir/audits_worker/lighthouse/locales/{{source_file_part}}",
+    ]
+  }
+
+  action("generate_devtools_grd") {
+    script = "scripts/build/generate_devtools_grd.py"
+
+    deps = [
+      ":devtools_frontend_resources",
+    ]
+
+    grd_files =
+        copied_devtools_modules + generated_applications +
+        generated_non_autostart_non_remote_modules + devtools_embedder_scripts +
+        [
+          "$resources_out_dir/devtools_extension_api.js",
+          "$resources_out_dir/SupportedCSSProperties.js",
+          "$resources_out_dir/InspectorBackendCommands.js",
+        ]
+
+    # Bundle remote modules in ChromeOS.
+    if (is_chromeos) {
+      grd_files += generated_remote_modules + devtools_emulated_devices_images +
+                   lighthouse_locale_files
+    }
+
+    inputs = grd_files + devtools_image_files
+    outfile = "$root_gen_dir/devtools/devtools_resources.grd"
+    outputs = [
+      outfile,
+    ]
+
+    relative_path_dirs = [
+      resources_out_dir,
+      "front_end",
+    ]
+
+    args = rebase_path(grd_files, root_build_dir) + [ "--relative_path_dirs" ] +
+           rebase_path(relative_path_dirs, root_build_dir) +
+           [
+             "--images",
+             rebase_path("front_end/Images", root_build_dir),
+             "--output",
+             rebase_path(outfile, root_build_dir),
+           ]
+  }
+
+  action("devtools_extension_api") {
+    script = "scripts/build/generate_devtools_extension_api.py"
+
+    devtools_extension_api_files = [ "front_end/extensions/ExtensionAPI.js" ]
+    inputs = devtools_extension_api_files
+    outputs = [
+      "$resources_out_dir/devtools_extension_api.js",
+    ]
+
+    args = rebase_path(outputs, root_build_dir) +
+           rebase_path(devtools_extension_api_files, root_build_dir)
+  }
+
+  action("supported_css_properties") {
+    script = "scripts/build/generate_supported_css.py"
+
+    inputs = [
+      "//third_party/blink/renderer/core/css/css_properties.json5",
+    ]
+
+    outputs = [
+      "$resources_out_dir/SupportedCSSProperties.js",
+    ]
+
+    args = rebase_path(inputs, root_build_dir) +
+           rebase_path(outputs, root_build_dir)
+  }
+
+  action("aria_properties") {
+    script = "scripts/build/generate_aria.py"
+
+    inputs = [
+      "//third_party/blink/renderer/core/html/aria_properties.json5",
+    ]
+
+    outputs = [
+      "$resources_out_dir/accessibility/ARIAProperties.js",
+    ]
+
+    args = rebase_path(inputs, root_build_dir) +
+           rebase_path(outputs, root_build_dir)
+  }
+
+  action("frontend_protocol_sources") {
+    script = "scripts/build/code_generator_frontend.py"
+    deps = [
+      "//third_party/blink/renderer/core/inspector:protocol_version",
+    ]
+    inputs = [
+      "$blink_core_output_dir/inspector/protocol.json",
+    ]
+    outputs = [
+      "$resources_out_dir/InspectorBackendCommands.js",
+    ]
+
+    args = rebase_path(inputs, root_build_dir) + [
+             "--output_js_dir",
+             rebase_path(resources_out_dir, root_build_dir),
+           ]
+  }
+
+  action("build_release_devtools") {
+    script = "scripts/build/build_release_applications.py"
+
+    deps = [
+      ":aria_properties",
       ":frontend_protocol_sources",
       ":supported_css_properties",
     ]
-    sources = generated_scripts
-    outputs = [
-      "$resources_out_debug_dir/{{source_file_part}}",
+
+    helper_scripts = [
+      "scripts/build/modular_build.py",
+      "scripts/build/rjsmin.py",
     ]
+
+    inputs =
+        helper_scripts + all_devtools_files + devtools_test_files +
+        generated_scripts + generated_aria_properties + application_templates
+    outputs =
+        generated_applications + generated_non_autostart_non_remote_modules +
+        generated_remote_modules + generated_test_modules
+
+    args = devtools_applications + [
+             "--input_path",
+             rebase_path("front_end", root_build_dir),
+             "--output_path",
+             rebase_path(resources_out_dir, root_build_dir),
+           ]
   }
 
-  copy("copy_aria_properties") {
+  action("copy_devtools_modules") {
+    script = "scripts/build/copy_devtools_modules.py"
+
     deps = [
-      ":aria_properties",
-      ":build_debug_devtools",
+      ":build_release_devtools",
     ]
 
-    sources = generated_aria_properties
+    inputs = all_devtools_modules
+    outputs = copied_devtools_modules
 
-    outputs = [
-      "$resources_out_debug_dir/accessibility/{{source_file_part}}",
-    ]
+    args = all_devtools_modules + [
+             "--input_path",
+             rebase_path(".", root_build_dir),
+             "--output_path",
+             rebase_path(resources_out_dir, root_build_dir),
+           ]
   }
-}
 
-group("devtools_closure_compile") {
-  data = [
-    # Needed for isolate script to execute.
-    "front_end/",
-    "scripts/build/",
-    "scripts/closure/",
-    "scripts/compile_frontend.py",
-    "scripts/dependency_preprocessor.py",
-    "scripts/jsdoc_validator/",
-    "scripts/special_case_namespaces.json",
-    "scripts/utils.py",
-    "//testing/scripts/common.py",
-    "//testing/scripts/run_devtools_check.py",
-    "//testing/xvfb.py",
-    "//third_party/blink/renderer/core/inspector/browser_protocol.pdl",
-    "//third_party/inspector_protocol/pdl.py",
-    "//v8/include/js_protocol.pdl",
-  ]
-}
+  if (debug_devtools) {
+    resources_out_debug_dir = "$root_out_dir/resources/inspector/debug"
 
-if (is_linux && !is_chromeos) {
-  group("devtools_eslint") {
+    action("build_debug_devtools") {
+      script = "scripts/build/build_debug_applications.py"
+
+      inputs = all_devtools_files + application_templates
+      outputs = [
+        "$resources_out_debug_dir/devtools_app.html",
+        "$resources_out_debug_dir/inspector.html",
+        "$resources_out_debug_dir/integration_test_runner.html",
+        "$resources_out_debug_dir/js_app.html",
+        "$resources_out_debug_dir/ndb_app.html",
+        "$resources_out_debug_dir/node_app.html",
+        "$resources_out_debug_dir/toolbox.html",
+        "$resources_out_debug_dir/worker_app.html",
+      ]
+
+      args = [
+        "--input_path",
+        rebase_path("front_end", root_build_dir),
+        "--output_path",
+        rebase_path(resources_out_debug_dir, root_build_dir),
+      ]
+    }
+
+    copy("copy_generated_scripts") {
+      deps = [
+        ":build_debug_devtools",
+        ":frontend_protocol_sources",
+        ":supported_css_properties",
+      ]
+      sources = generated_scripts
+      outputs = [
+        "$resources_out_debug_dir/{{source_file_part}}",
+      ]
+    }
+
+    copy("copy_aria_properties") {
+      deps = [
+        ":aria_properties",
+        ":build_debug_devtools",
+      ]
+
+      sources = generated_aria_properties
+
+      outputs = [
+        "$resources_out_debug_dir/accessibility/{{source_file_part}}",
+      ]
+    }
+  }
+
+  group("devtools_closure_compile") {
     data = [
       # Needed for isolate script to execute.
-      ".eslintignore",
-      ".eslintrc.js",
       "front_end/",
-      "scripts/lint_javascript.py",
-      "scripts/devtools_paths.py",
+      "scripts/build/",
+      "scripts/closure/",
+      "scripts/compile_frontend.py",
+      "scripts/dependency_preprocessor.py",
+      "scripts/jsdoc_validator/",
+      "scripts/special_case_namespaces.json",
+      "scripts/utils.py",
       "//testing/scripts/common.py",
       "//testing/scripts/run_devtools_check.py",
       "//testing/xvfb.py",
-      "//third_party/devtools-node-modules/",
-      "//third_party/node/node.py",
-      "//third_party/node/linux/node-linux-x64/",
+      "//third_party/blink/renderer/core/inspector/browser_protocol.pdl",
+      "//third_party/inspector_protocol/pdl.py",
+      "//v8/include/js_protocol.pdl",
     ]
   }
+
+  if (is_linux && !is_chromeos) {
+    group("devtools_eslint") {
+      data = [
+        # Needed for isolate script to execute.
+        ".eslintignore",
+        ".eslintrc.js",
+        "front_end/",
+        "scripts/lint_javascript.py",
+        "scripts/devtools_paths.py",
+        "//testing/scripts/common.py",
+        "//testing/scripts/run_devtools_check.py",
+        "//testing/xvfb.py",
+        "//third_party/devtools-node-modules/",
+        "//third_party/node/node.py",
+        "//third_party/node/linux/node-linux-x64/",
+      ]
+    }
+  }
 }
diff --git a/third_party/blink/renderer/devtools/front_end/browser_sdk/LogManager.js b/third_party/blink/renderer/devtools/front_end/browser_sdk/LogManager.js
index 592799f..4c99661 100644
--- a/third_party/blink/renderer/devtools/front_end/browser_sdk/LogManager.js
+++ b/third_party/blink/renderer/devtools/front_end/browser_sdk/LogManager.js
@@ -5,7 +5,7 @@
 /**
  * @implements {SDK.SDKModelObserver<!SDK.LogModel>}
  */
-BrowserSDK.LogManager = class {
+export default class LogManager {
   constructor() {
     SDK.targetManager.observeModels(SDK.LogModel, this);
   }
@@ -17,7 +17,7 @@
   modelAdded(logModel) {
     const eventListeners = [];
     eventListeners.push(logModel.addEventListener(SDK.LogModel.Events.EntryAdded, this._logEntryAdded, this));
-    logModel[BrowserSDK.LogManager._eventSymbol] = eventListeners;
+    logModel[_eventSymbol] = eventListeners;
   }
 
   /**
@@ -25,7 +25,7 @@
    * @param {!SDK.LogModel} logModel
    */
   modelRemoved(logModel) {
-    Common.EventTarget.removeEventListeners(logModel[BrowserSDK.LogManager._eventSymbol]);
+    Common.EventTarget.removeEventListeners(logModel[_eventSymbol]);
   }
 
   /**
@@ -62,8 +62,20 @@
       SDK.consoleModel.addMessage(consoleMessage);
     }
   }
-};
+}
 
-BrowserSDK.LogManager._eventSymbol = Symbol('_events');
+export const _eventSymbol = Symbol('_events');
 
-new BrowserSDK.LogManager();
+/* Legacy exported object */
+self.BrowserSDK = self.BrowserSDK || {};
+
+/* Legacy exported object */
+BrowserSDK = BrowserSDK || {};
+
+/** @constructor */
+BrowserSDK.LogManager = LogManager;
+
+BrowserSDK.LogManager._eventSymbol = _eventSymbol;
+
+// TODO(crbug.com/1006759): Move out of this module
+new LogManager();
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk.js b/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk.js
new file mode 100644
index 0000000..9d9f583
--- /dev/null
+++ b/third_party/blink/renderer/devtools/front_end/browser_sdk/browser_sdk.js
@@ -0,0 +1,9 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import * as LogManager from './LogManager.js';
+
+export {
+  LogManager,
+};
diff --git a/third_party/blink/renderer/devtools/front_end/browser_sdk/module.json b/third_party/blink/renderer/devtools/front_end/browser_sdk/module.json
index 7cca023c..6a4b3ab 100644
--- a/third_party/blink/renderer/devtools/front_end/browser_sdk/module.json
+++ b/third_party/blink/renderer/devtools/front_end/browser_sdk/module.json
@@ -20,7 +20,9 @@
             ]
         }
     ],
-    "scripts": [
+    "scripts": [],
+    "modules": [
+        "browser_sdk.js",
         "LogManager.js"
     ],
     "dependencies": [
diff --git a/third_party/blink/renderer/devtools/front_end/components/DockController.js b/third_party/blink/renderer/devtools/front_end/components/DockController.js
index a87605e..fbf5412 100644
--- a/third_party/blink/renderer/devtools/front_end/components/DockController.js
+++ b/third_party/blink/renderer/devtools/front_end/components/DockController.js
@@ -31,7 +31,7 @@
 /**
  * @unrestricted
  */
-Components.DockController = class extends Common.Object {
+export default class DockController extends Common.Object {
   /**
    * @param {boolean} canDock
    */
@@ -44,15 +44,12 @@
         UI.ToolbarButton.Events.Click, Host.InspectorFrontendHost.closeWindow.bind(Host.InspectorFrontendHost));
 
     if (!canDock) {
-      this._dockSide = Components.DockController.State.Undocked;
+      this._dockSide = State.Undocked;
       this._closeButton.setVisible(false);
       return;
     }
 
-    this._states = [
-      Components.DockController.State.DockedToRight, Components.DockController.State.DockedToBottom,
-      Components.DockController.State.DockedToLeft, Components.DockController.State.Undocked
-    ];
+    this._states = [State.DockedToRight, State.DockedToBottom, State.DockedToLeft, State.Undocked];
     this._currentDockStateSetting = Common.settings.moduleSetting('currentDockState');
     this._currentDockStateSetting.addChangeListener(this._dockSideChanged, this);
     this._lastDockStateSetting = Common.settings.createSetting('lastDockState', 'bottom');
@@ -98,8 +95,7 @@
    * @return {boolean}
    */
   isVertical() {
-    return this._dockSide === Components.DockController.State.DockedToRight ||
-        this._dockSide === Components.DockController.State.DockedToLeft;
+    return this._dockSide === State.DockedToRight || this._dockSide === State.DockedToLeft;
   }
 
   /**
@@ -121,21 +117,21 @@
 
     this._savedFocus = document.deepActiveElement();
     const eventData = {from: this._dockSide, to: dockSide};
-    this.dispatchEventToListeners(Components.DockController.Events.BeforeDockSideChanged, eventData);
+    this.dispatchEventToListeners(Events.BeforeDockSideChanged, eventData);
     console.timeStamp('DockController.setIsDocked');
     this._dockSide = dockSide;
     this._currentDockStateSetting.set(dockSide);
     Host.InspectorFrontendHost.setIsDocked(
-        dockSide !== Components.DockController.State.Undocked, this._setIsDockedResponse.bind(this, eventData));
-    this._closeButton.setVisible(this._dockSide !== Components.DockController.State.Undocked);
-    this.dispatchEventToListeners(Components.DockController.Events.DockSideChanged, eventData);
+        dockSide !== State.Undocked, this._setIsDockedResponse.bind(this, eventData));
+    this._closeButton.setVisible(this._dockSide !== State.Undocked);
+    this.dispatchEventToListeners(Events.DockSideChanged, eventData);
   }
 
   /**
    * @param {{from: string, to: string}} eventData
    */
   _setIsDockedResponse(eventData) {
-    this.dispatchEventToListeners(Components.DockController.Events.AfterDockSideChanged, eventData);
+    this.dispatchEventToListeners(Events.AfterDockSideChanged, eventData);
     if (this._savedFocus) {
       this._savedFocus.focus();
       this._savedFocus = null;
@@ -149,9 +145,9 @@
     }
     this.setDockSide(this._lastDockStateSetting.get());
   }
-};
+}
 
-Components.DockController.State = {
+export const State = {
   DockedToBottom: 'bottom',
   DockedToRight: 'right',
   DockedToLeft: 'left',
@@ -163,7 +159,7 @@
 // after frontend is docked/undocked in the browser.
 
 /** @enum {symbol} */
-Components.DockController.Events = {
+export const Events = {
   BeforeDockSideChanged: Symbol('BeforeDockSideChanged'),
   DockSideChanged: Symbol('DockSideChanged'),
   AfterDockSideChanged: Symbol('AfterDockSideChanged')
@@ -173,7 +169,7 @@
  * @implements {UI.ActionDelegate}
  * @unrestricted
  */
-Components.DockController.ToggleDockActionDelegate = class {
+export class ToggleDockActionDelegate {
   /**
    * @override
    * @param {!UI.Context} context
@@ -184,13 +180,13 @@
     Components.dockController._toggleDockSide();
     return true;
   }
-};
+}
 
 /**
  * @implements {UI.ToolbarItem.Provider}
  * @unrestricted
  */
-Components.DockController.CloseButtonProvider = class {
+export class CloseButtonProvider {
   /**
    * @override
    * @return {?UI.ToolbarItem}
@@ -198,9 +194,29 @@
   item() {
     return Components.dockController._closeButton;
   }
-};
+}
+
+/* Legacy exported object */
+self.Components = self.Components || {};
+
+/* Legacy exported object */
+Components = Components || {};
+
+/** @constructor */
+Components.DockController = DockController;
+
+Components.DockController.State = State;
+
+/** @enum {symbol} */
+Components.DockController.Events = Events;
+
+/** @constructor */
+Components.DockController.ToggleDockActionDelegate = ToggleDockActionDelegate;
+
+/** @constructor */
+Components.DockController.CloseButtonProvider = CloseButtonProvider;
 
 /**
  * @type {!Components.DockController}
  */
-Components.dockController;
+Components.dockController;
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/components/ImagePreview.js b/third_party/blink/renderer/devtools/front_end/components/ImagePreview.js
index a388f49..4d4cb787 100644
--- a/third_party/blink/renderer/devtools/front_end/components/ImagePreview.js
+++ b/third_party/blink/renderer/devtools/front_end/components/ImagePreview.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Components.ImagePreview = class {
+export default class ImagePreview {
   /**
    * @param {!SDK.Target} target
    * @param {string} originalImageURL
@@ -113,4 +113,13 @@
     const imageSourceText = parsedImageURL.isValid ? parsedImageURL.displayName : ls`unknown source`;
     return ls`Image from ${imageSourceText}`;
   }
-};
+}
+
+/* Legacy exported object */
+self.Components = self.Components || {};
+
+/* Legacy exported object */
+Components = Components || {};
+
+/** @constructor */
+Components.ImagePreview = ImagePreview;
diff --git a/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js b/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js
index b07d478..4a147ae5a 100644
--- a/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js
+++ b/third_party/blink/renderer/devtools/front_end/components/JSPresentationUtils.js
@@ -28,7 +28,6 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-Components.JSPresentationUtils = {};
 
 /**
  * @param {?SDK.Target} target
@@ -37,8 +36,7 @@
  * @param {function()=} contentUpdated
  * @return {{element: !Element, links: !Array<!Element>}}
  */
-Components.JSPresentationUtils.buildStackTracePreviewContents = function(
-    target, linkifier, stackTrace, contentUpdated) {
+export function buildStackTracePreviewContents(target, linkifier, stackTrace, contentUpdated) {
   const element = createElementWithClass('span', 'monospace');
   element.style.display = 'inline-block';
   const shadowRoot = UI.createShadowRootWithCoreStyles(element, 'components/jsUtils.css');
@@ -146,4 +144,14 @@
   }
 
   return {element, links};
-};
+}
+
+/* Legacy exported object */
+self.Components = self.Components || {};
+
+/* Legacy exported object */
+Components = Components || {};
+
+Components.JSPresentationUtils = {};
+
+Components.JSPresentationUtils.buildStackTracePreviewContents = buildStackTracePreviewContents;
diff --git a/third_party/blink/renderer/devtools/front_end/components/Linkifier.js b/third_party/blink/renderer/devtools/front_end/components/Linkifier.js
index 55b79ce..2c46bbc 100644
--- a/third_party/blink/renderer/devtools/front_end/components/Linkifier.js
+++ b/third_party/blink/renderer/devtools/front_end/components/Linkifier.js
@@ -32,7 +32,7 @@
  * @implements {SDK.TargetManager.Observer}
  * @unrestricted
  */
-Components.Linkifier = class {
+export default class Linkifier {
   /**
    * @param {number=} maxLengthForDisplayedURLs
    * @param {boolean=} useLinkDecorator
@@ -44,18 +44,18 @@
     /** @type {!Map<!SDK.Target, !Bindings.LiveLocationPool>} */
     this._locationPoolByTarget = new Map();
     this._useLinkDecorator = !!useLinkDecorator;
-    Components.Linkifier._instances.add(this);
+    _instances.add(this);
     SDK.targetManager.observeTargets(this);
   }
 
   /**
-   * @param {!Components.LinkDecorator} decorator
+   * @param {!LinkDecorator} decorator
    */
   static setLinkDecorator(decorator) {
-    console.assert(!Components.Linkifier._decorator, 'Cannot re-register link decorator.');
-    Components.Linkifier._decorator = decorator;
-    decorator.addEventListener(Components.LinkDecorator.Events.LinkIconChanged, onLinkIconChanged);
-    for (const linkifier of Components.Linkifier._instances) {
+    console.assert(!_decorator, 'Cannot re-register link decorator.');
+    _decorator = decorator;
+    decorator.addEventListener(LinkDecorator.Events.LinkIconChanged, onLinkIconChanged);
+    for (const linkifier of _instances) {
       linkifier._updateAllAnchorDecorations();
     }
 
@@ -64,9 +64,9 @@
      */
     function onLinkIconChanged(event) {
       const uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data);
-      const links = uiSourceCode[Components.Linkifier._sourceCodeAnchors] || [];
+      const links = uiSourceCode[_sourceCodeAnchors] || [];
       for (const link of links) {
-        Components.Linkifier._updateLinkDecorations(link);
+        Linkifier._updateLinkDecorations(link);
       }
     }
   }
@@ -74,7 +74,7 @@
   _updateAllAnchorDecorations() {
     for (const anchors of this._anchorsByTarget.values()) {
       for (const anchor of anchors) {
-        Components.Linkifier._updateLinkDecorations(anchor);
+        Linkifier._updateLinkDecorations(anchor);
       }
     }
   }
@@ -84,15 +84,15 @@
    * @param {!Workspace.UILocation} uiLocation
    */
   static _bindUILocation(anchor, uiLocation) {
-    Components.Linkifier._linkInfo(anchor).uiLocation = uiLocation;
+    Linkifier._linkInfo(anchor).uiLocation = uiLocation;
     if (!uiLocation) {
       return;
     }
     const uiSourceCode = uiLocation.uiSourceCode;
-    let sourceCodeAnchors = uiSourceCode[Components.Linkifier._sourceCodeAnchors];
+    let sourceCodeAnchors = uiSourceCode[_sourceCodeAnchors];
     if (!sourceCodeAnchors) {
       sourceCodeAnchors = new Set();
-      uiSourceCode[Components.Linkifier._sourceCodeAnchors] = sourceCodeAnchors;
+      uiSourceCode[_sourceCodeAnchors] = sourceCodeAnchors;
     }
     sourceCodeAnchors.add(anchor);
   }
@@ -101,14 +101,14 @@
    * @param {!Element} anchor
    */
   static _unbindUILocation(anchor) {
-    const info = Components.Linkifier._linkInfo(anchor);
+    const info = Linkifier._linkInfo(anchor);
     if (!info.uiLocation) {
       return;
     }
 
     const uiSourceCode = info.uiLocation.uiSourceCode;
     info.uiLocation = null;
-    const sourceCodeAnchors = uiSourceCode[Components.Linkifier._sourceCodeAnchors];
+    const sourceCodeAnchors = uiSourceCode[_sourceCodeAnchors];
     if (sourceCodeAnchors) {
       sourceCodeAnchors.delete(anchor);
     }
@@ -132,15 +132,15 @@
     locationPool.disposeAll();
     const anchors = this._anchorsByTarget.remove(target);
     for (const anchor of anchors) {
-      const info = Components.Linkifier._linkInfo(anchor);
+      const info = Linkifier._linkInfo(anchor);
       info.liveLocation = null;
-      Components.Linkifier._unbindUILocation(anchor);
+      Linkifier._unbindUILocation(anchor);
       if (info.fallback) {
         anchor.href = info.fallback.href;
         anchor.title = info.fallback.title;
         anchor.className = info.fallback.className;
         anchor.textContent = info.fallback.textContent;
-        anchor[Components.Linkifier._infoSymbol] = info.fallback[Components.Linkifier._infoSymbol];
+        anchor[_infoSymbol] = info.fallback[_infoSymbol];
       }
     }
   }
@@ -157,7 +157,7 @@
   maybeLinkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes) {
     let fallbackAnchor = null;
     if (sourceURL) {
-      fallbackAnchor = Components.Linkifier.linkifyURL(
+      fallbackAnchor = Linkifier.linkifyURL(
           sourceURL,
           {className: classes, lineNumber: lineNumber, columnNumber: columnNumber, maxLength: this._maxLength});
     }
@@ -176,8 +176,8 @@
       return fallbackAnchor;
     }
 
-    const anchor = Components.Linkifier._createLink('', classes || '');
-    const info = Components.Linkifier._linkInfo(anchor);
+    const anchor = Linkifier._createLink('', classes || '');
+    const info = Linkifier._linkInfo(anchor);
     info.enableDecorator = this._useLinkDecorator;
     info.fallback = fallbackAnchor;
     info.liveLocation = Bindings.debuggerWorkspaceBinding.createLiveLocation(
@@ -201,7 +201,7 @@
   linkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes) {
     const scriptLink = this.maybeLinkifyScriptLocation(target, scriptId, sourceURL, lineNumber, columnNumber, classes);
     return scriptLink ||
-        Components.Linkifier.linkifyURL(
+        Linkifier.linkifyURL(
             sourceURL,
             {className: classes, lineNumber: lineNumber, columnNumber: columnNumber, maxLength: this._maxLength});
   }
@@ -239,7 +239,7 @@
     console.assert(stackTrace.callFrames && stackTrace.callFrames.length);
 
     const topFrame = stackTrace.callFrames[0];
-    const fallbackAnchor = Components.Linkifier.linkifyURL(topFrame.url, {
+    const fallbackAnchor = Linkifier.linkifyURL(topFrame.url, {
       className: classes,
       lineNumber: topFrame.lineNumber,
       columnNumber: topFrame.columnNumber,
@@ -255,8 +255,8 @@
       return fallbackAnchor;
     }
 
-    const anchor = Components.Linkifier._createLink('', classes || '');
-    const info = Components.Linkifier._linkInfo(anchor);
+    const anchor = Linkifier._createLink('', classes || '');
+    const info = Linkifier._linkInfo(anchor);
     info.enableDecorator = this._useLinkDecorator;
     info.fallback = fallbackAnchor;
     info.liveLocation = Bindings.debuggerWorkspaceBinding.createStackTraceTopFrameLiveLocation(
@@ -274,8 +274,8 @@
    * @return {!Element}
    */
   linkifyCSSLocation(rawLocation, classes) {
-    const anchor = Components.Linkifier._createLink('', classes || '');
-    const info = Components.Linkifier._linkInfo(anchor);
+    const anchor = Linkifier._createLink('', classes || '');
+    const info = Linkifier._linkInfo(anchor);
     info.enableDecorator = this._useLinkDecorator;
     info.liveLocation = Bindings.cssWorkspaceBinding.createLiveLocation(
         rawLocation, this._updateAnchor.bind(this, anchor),
@@ -298,7 +298,7 @@
       this.targetRemoved(target);
     }
     SDK.targetManager.unobserveTargets(this);
-    Components.Linkifier._instances.delete(this);
+    _instances.delete(this);
   }
 
   /**
@@ -306,15 +306,15 @@
    * @param {!Bindings.LiveLocation} liveLocation
    */
   _updateAnchor(anchor, liveLocation) {
-    Components.Linkifier._unbindUILocation(anchor);
+    Linkifier._unbindUILocation(anchor);
     const uiLocation = liveLocation.uiLocation();
     if (!uiLocation) {
       return;
     }
 
-    Components.Linkifier._bindUILocation(anchor, uiLocation);
+    Linkifier._bindUILocation(anchor, uiLocation);
     const text = uiLocation.linkText(true /* skipTrim */);
-    Components.Linkifier._setTrimmedText(anchor, text, this._maxLength);
+    Linkifier._setTrimmedText(anchor, text, this._maxLength);
 
     let titleText = uiLocation.uiSourceCode.url();
     if (typeof uiLocation.lineNumber === 'number') {
@@ -322,24 +322,24 @@
     }
     anchor.title = titleText;
     anchor.classList.toggle('webkit-html-blackbox-link', liveLocation.isBlackboxed());
-    Components.Linkifier._updateLinkDecorations(anchor);
+    Linkifier._updateLinkDecorations(anchor);
   }
 
   /**
    * @param {!Element} anchor
    */
   static _updateLinkDecorations(anchor) {
-    const info = Components.Linkifier._linkInfo(anchor);
+    const info = Linkifier._linkInfo(anchor);
     if (!info || !info.enableDecorator) {
       return;
     }
-    if (!Components.Linkifier._decorator || !info.uiLocation) {
+    if (!_decorator || !info.uiLocation) {
       return;
     }
     if (info.icon && info.icon.parentElement) {
       anchor.removeChild(info.icon);
     }
-    const icon = Components.Linkifier._decorator.linkIcon(info.uiLocation.uiSourceCode);
+    const icon = _decorator.linkIcon(info.uiLocation.uiSourceCode);
     if (icon) {
       icon.style.setProperty('margin-right', '2px');
       anchor.insertBefore(icon, anchor.firstChild);
@@ -371,8 +371,8 @@
       linkText += ':' + (lineNumber + 1);
     }
     const title = linkText !== url ? url : '';
-    const link = Components.Linkifier._createLink(linkText, className, maxLength, title, url, preventClick);
-    const info = Components.Linkifier._linkInfo(link);
+    const link = Linkifier._createLink(linkText, className, maxLength, title, url, preventClick);
+    const info = Linkifier._linkInfo(link);
     if (typeof lineNumber === 'number') {
       info.lineNumber = lineNumber;
     }
@@ -389,8 +389,8 @@
    * @return {!Element}
    */
   static linkifyRevealable(revealable, text, fallbackHref) {
-    const link = Components.Linkifier._createLink(text, '', UI.MaxLengthForDisplayedURLs, undefined, fallbackHref);
-    Components.Linkifier._linkInfo(link).revealable = revealable;
+    const link = Linkifier._createLink(text, '', UI.MaxLengthForDisplayedURLs, undefined, fallbackHref);
+    Linkifier._linkInfo(link).revealable = revealable;
     return link;
   }
 
@@ -412,8 +412,8 @@
     if (href) {
       link.href = href;
     }
-    Components.Linkifier._setTrimmedText(link, text, maxLength);
-    link[Components.Linkifier._infoSymbol] = {
+    Linkifier._setTrimmedText(link, text, maxLength);
+    link[_infoSymbol] = {
       icon: null,
       enableDecorator: false,
       uiLocation: null,
@@ -426,12 +426,12 @@
     };
     if (!preventClick) {
       link.addEventListener('click', event => {
-        if (Components.Linkifier._handleClick(event)) {
+        if (Linkifier._handleClick(event)) {
           event.consume(true);
         }
       }, false);
       link.addEventListener('keydown', event => {
-        if (isEnterKey(event) && Components.Linkifier._handleClick(event)) {
+        if (isEnterKey(event) && Linkifier._handleClick(event)) {
           event.consume(true);
         }
       }, false);
@@ -463,7 +463,7 @@
      */
     function appendHiddenText(string) {
       const ellipsisNode = link.createChild('span', 'devtools-link-ellipsis').createTextChild('\u2026');
-      ellipsisNode[Components.Linkifier._untruncatedNodeTextSymbol] = string;
+      ellipsisNode[_untruncatedNodeTextSymbol] = string;
     }
 
     /**
@@ -507,7 +507,7 @@
    * @return {string}
    */
   static untruncatedNodeText(node) {
-    return node[Components.Linkifier._untruncatedNodeTextSymbol] || node.textContent;
+    return node[_untruncatedNodeTextSymbol] || node.textContent;
   }
 
   /**
@@ -515,7 +515,7 @@
    * @return {?Components._LinkInfo}
    */
   static _linkInfo(link) {
-    return /** @type {?Components._LinkInfo} */ (link ? link[Components.Linkifier._infoSymbol] || null : null);
+    return /** @type {?Components._LinkInfo} */ (link ? link[_infoSymbol] || null : null);
   }
 
   /**
@@ -527,7 +527,7 @@
     if (UI.isBeingEdited(/** @type {!Node} */ (event.target)) || link.hasSelection()) {
       return false;
     }
-    const actions = Components.Linkifier._linkActions(link);
+    const actions = Linkifier._linkActions(link);
     if (actions.length) {
       actions[0].handler.call(null);
       return true;
@@ -539,28 +539,27 @@
    * @return {!Common.Setting}
    */
   static _linkHandlerSetting() {
-    if (!Components.Linkifier._linkHandlerSettingInstance) {
-      Components.Linkifier._linkHandlerSettingInstance =
-          Common.settings.createSetting('openLinkHandler', Common.UIString('auto'));
+    if (!Linkifier._linkHandlerSettingInstance) {
+      Linkifier._linkHandlerSettingInstance = Common.settings.createSetting('openLinkHandler', ls`auto`);
     }
-    return Components.Linkifier._linkHandlerSettingInstance;
+    return Linkifier._linkHandlerSettingInstance;
   }
 
   /**
    * @param {string} title
-   * @param {!Components.Linkifier.LinkHandler} handler
+   * @param {!Linkifier.LinkHandler} handler
    */
   static registerLinkHandler(title, handler) {
-    Components.Linkifier._linkHandlers.set(title, handler);
-    self.runtime.sharedInstance(Components.Linkifier.LinkHandlerSettingUI)._update();
+    _linkHandlers.set(title, handler);
+    self.runtime.sharedInstance(LinkHandlerSettingUI)._update();
   }
 
   /**
    * @param {string} title
    */
   static unregisterLinkHandler(title) {
-    Components.Linkifier._linkHandlers.delete(title);
-    self.runtime.sharedInstance(Components.Linkifier.LinkHandlerSettingUI)._update();
+    _linkHandlers.delete(title);
+    self.runtime.sharedInstance(LinkHandlerSettingUI)._update();
   }
 
   /**
@@ -568,7 +567,7 @@
    * @return {?Workspace.UILocation}
    */
   static uiLocation(link) {
-    const info = Components.Linkifier._linkInfo(link);
+    const info = Linkifier._linkInfo(link);
     return info ? info.uiLocation : null;
   }
 
@@ -577,7 +576,7 @@
    * @return {!Array<{title: string, handler: function()}>}
    */
   static _linkActions(link) {
-    const info = Components.Linkifier._linkInfo(link);
+    const info = Linkifier._linkInfo(link);
     const result = [];
     if (!info) {
       return result;
@@ -608,14 +607,14 @@
     }
     if (contentProvider) {
       const lineNumber = uiLocation ? uiLocation.lineNumber : info.lineNumber || 0;
-      for (const title of Components.Linkifier._linkHandlers.keys()) {
-        const handler = Components.Linkifier._linkHandlers.get(title);
+      for (const title of _linkHandlers.keys()) {
+        const handler = _linkHandlers.get(title);
         const action = {
           section: 'reveal',
           title: Common.UIString('Open using %s', title),
           handler: handler.bind(null, contentProvider, lineNumber)
         };
-        if (title === Components.Linkifier._linkHandlerSetting().get()) {
+        if (title === Linkifier._linkHandlerSetting().get()) {
           result.unshift(action);
         } else {
           result.push(action);
@@ -636,74 +635,41 @@
     }
     return result;
   }
-};
+}
 
 /** @type {!Set<!Components.Linkifier>} */
-Components.Linkifier._instances = new Set();
-/** @type {?Components.LinkDecorator} */
-Components.Linkifier._decorator = null;
+export const _instances = new Set();
 
-Components.Linkifier._sourceCodeAnchors = Symbol('Linkifier.anchors');
-Components.Linkifier._infoSymbol = Symbol('Linkifier.info');
-Components.Linkifier._untruncatedNodeTextSymbol = Symbol('Linkifier.untruncatedNodeText');
+/** @type {?LinkDecorator} */
+export let _decorator = null;
 
-/**
- * @typedef {{
- *     icon: ?UI.Icon,
- *     enableDecorator: boolean,
- *     uiLocation: ?Workspace.UILocation,
- *     liveLocation: ?Bindings.LiveLocation,
- *     url: ?string,
- *     lineNumber: ?number,
- *     columnNumber: ?number,
- *     revealable: ?Object,
- *     fallback: ?Element
- * }}
- */
-Components._LinkInfo;
-
-/**
- * @typedef {{
- *     text: (string|undefined),
- *     className: (string|undefined),
- *     lineNumber: (number|undefined),
- *     columnNumber: (number|undefined),
- *     preventClick: (boolean|undefined),
- *     maxLength: (number|undefined)
- * }}
- */
-Components.LinkifyURLOptions;
+export const _sourceCodeAnchors = Symbol('Linkifier.anchors');
+export const _infoSymbol = Symbol('Linkifier.info');
+export const _untruncatedNodeTextSymbol = Symbol('Linkifier.untruncatedNodeText');
 
 /**
  * The maximum length before strings are considered too long for finding URLs.
  * @const
  * @type {number}
  */
-Components.Linkifier.MaxLengthToIgnoreLinkifier = 10000;
+export const MaxLengthToIgnoreLinkifier = 10000;
 
-/**
- * @typedef {function(!Common.ContentProvider, number)}
- */
-Components.Linkifier.LinkHandler;
-
-/** @type {!Map<string, !Components.Linkifier.LinkHandler>} */
-Components.Linkifier._linkHandlers = new Map();
+/** @type {!Map<string, !Linkifier.LinkHandler>} */
+export const _linkHandlers = new Map();
 
 /**
  * @extends {Common.EventTarget}
  * @interface
  */
-Components.LinkDecorator = function() {};
-
-Components.LinkDecorator.prototype = {
+export class LinkDecorator {
   /**
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @return {?UI.Icon}
    */
   linkIcon(uiSourceCode) {}
-};
+}
 
-Components.LinkDecorator.Events = {
+LinkDecorator.Events = {
   LinkIconChanged: Symbol('LinkIconChanged')
 };
 
@@ -711,7 +677,7 @@
  * @implements {UI.ContextMenu.Provider}
  * @unrestricted
  */
-Components.Linkifier.LinkContextMenuProvider = class {
+export class LinkContextMenuProvider {
   /**
    * @override
    * @param {!Event} event
@@ -720,22 +686,22 @@
    */
   appendApplicableItems(event, contextMenu, target) {
     let targetNode = /** @type {!Node} */ (target);
-    while (targetNode && !targetNode[Components.Linkifier._infoSymbol]) {
+    while (targetNode && !targetNode[_infoSymbol]) {
       targetNode = targetNode.parentNodeOrShadowHost();
     }
     const link = /** @type {?Element} */ (targetNode);
-    const actions = Components.Linkifier._linkActions(link);
+    const actions = Linkifier._linkActions(link);
     for (const action of actions) {
       contextMenu.section(action.section).appendItem(action.title, action.handler);
     }
   }
-};
+}
 
 /**
  * @implements {UI.SettingUI}
  * @unrestricted
  */
-Components.Linkifier.LinkHandlerSettingUI = class {
+export class LinkHandlerSettingUI {
   constructor() {
     this._element = createElementWithClass('select', 'chrome-select');
     this._element.addEventListener('change', this._onChange.bind(this), false);
@@ -744,12 +710,12 @@
 
   _update() {
     this._element.removeChildren();
-    const names = Components.Linkifier._linkHandlers.keysArray();
+    const names = _linkHandlers.keysArray();
     names.unshift(Common.UIString('auto'));
     for (const name of names) {
       const option = createElement('option');
       option.textContent = name;
-      option.selected = name === Components.Linkifier._linkHandlerSetting().get();
+      option.selected = name === Linkifier._linkHandlerSetting().get();
       this._element.appendChild(option);
     }
     this._element.disabled = names.length <= 1;
@@ -760,7 +726,7 @@
    */
   _onChange(event) {
     const value = event.target.value;
-    Components.Linkifier._linkHandlerSetting().set(value);
+    Linkifier._linkHandlerSetting().set(value);
   }
 
   /**
@@ -770,13 +736,13 @@
   settingElement() {
     return UI.SettingsUI.createCustomSetting(Common.UIString('Link handling:'), this._element);
   }
-};
+}
 
 /**
  * @implements {UI.ContextMenu.Provider}
  * @unrestricted
  */
-Components.Linkifier.ContentProviderContextMenuProvider = class {
+export class ContentProviderContextMenuProvider {
   /**
    * @override
    * @param {!Event} event
@@ -791,8 +757,8 @@
 
     contextMenu.revealSection().appendItem(
         UI.openLinkExternallyLabel(), () => Host.InspectorFrontendHost.openInNewTab(contentProvider.contentURL()));
-    for (const title of Components.Linkifier._linkHandlers.keys()) {
-      const handler = Components.Linkifier._linkHandlers.get(title);
+    for (const title of _linkHandlers.keys()) {
+      const handler = _linkHandlers.get(title);
       contextMenu.revealSection().appendItem(
           Common.UIString('Open using %s', title), handler.bind(null, contentProvider, 0));
     }
@@ -803,4 +769,65 @@
     contextMenu.clipboardSection().appendItem(
         UI.copyLinkAddressLabel(), () => Host.InspectorFrontendHost.copyText(contentProvider.contentURL()));
   }
-};
+}
+
+/* Legacy exported object */
+self.Components = self.Components || {};
+
+/* Legacy exported object */
+Components = Components || {};
+
+/** @constructor */
+Components.Linkifier = Linkifier;
+
+Components.Linkifier._instances = _instances;
+Components.Linkifier._decorator = _decorator;
+Components.Linkifier._sourceCodeAnchors = _sourceCodeAnchors;
+Components.Linkifier._infoSymbol = _infoSymbol;
+Components.Linkifier._untruncatedNodeTextSymbol = _untruncatedNodeTextSymbol;
+Components.Linkifier.MaxLengthToIgnoreLinkifier = MaxLengthToIgnoreLinkifier;
+Components.Linkifier._linkHandlers = _linkHandlers;
+
+/** @constructor */
+Components.Linkifier.LinkContextMenuProvider = LinkContextMenuProvider;
+
+/** @constructor */
+Components.Linkifier.LinkHandlerSettingUI = LinkHandlerSettingUI;
+
+/** @constructor */
+Components.Linkifier.ContentProviderContextMenuProvider = ContentProviderContextMenuProvider;
+
+/** @interface */
+Components.LinkDecorator = LinkDecorator;
+
+/**
+ * @typedef {{
+  *     icon: ?UI.Icon,
+  *     enableDecorator: boolean,
+  *     uiLocation: ?Workspace.UILocation,
+  *     liveLocation: ?Bindings.LiveLocation,
+  *     url: ?string,
+  *     lineNumber: ?number,
+  *     columnNumber: ?number,
+  *     revealable: ?Object,
+  *     fallback: ?Element
+  * }}
+  */
+Components._LinkInfo;
+
+/**
+  * @typedef {{
+  *     text: (string|undefined),
+  *     className: (string|undefined),
+  *     lineNumber: (number|undefined),
+  *     columnNumber: (number|undefined),
+  *     preventClick: (boolean|undefined),
+  *     maxLength: (number|undefined)
+  * }}
+  */
+Components.LinkifyURLOptions;
+
+/**
+ * @typedef {function(!Common.ContentProvider, number)}
+ */
+Components.Linkifier.LinkHandler;
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/components/Reload.js b/third_party/blink/renderer/devtools/front_end/components/Reload.js
index 2fb94e06e..e3e1f84 100644
--- a/third_party/blink/renderer/devtools/front_end/components/Reload.js
+++ b/third_party/blink/renderer/devtools/front_end/components/Reload.js
@@ -1,10 +1,19 @@
 // Copyright 2015 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-Components.reload = function() {
+
+export function reload() {
   if (Components.dockController.canDock() &&
       Components.dockController.dockSide() === Components.DockController.State.Undocked) {
     Host.InspectorFrontendHost.setIsDocked(true, function() {});
   }
   window.location.reload();
-};
+}
+
+/* Legacy exported object */
+self.Components = self.Components || {};
+
+/* Legacy exported object */
+Components = Components || {};
+
+Components.reload = reload;
diff --git a/third_party/blink/renderer/devtools/front_end/components/TargetDetachedDialog.js b/third_party/blink/renderer/devtools/front_end/components/TargetDetachedDialog.js
index 5a7f851..cca1fcaf 100644
--- a/third_party/blink/renderer/devtools/front_end/components/TargetDetachedDialog.js
+++ b/third_party/blink/renderer/devtools/front_end/components/TargetDetachedDialog.js
@@ -5,7 +5,7 @@
 /**
  * @implements {Protocol.InspectorDispatcher}
  */
-Components.TargetDetachedDialog = class extends SDK.SDKModel {
+export default class TargetDetachedDialog extends SDK.SDKModel {
   /**
    * @param {!SDK.Target} target
    */
@@ -17,7 +17,7 @@
     target.registerInspectorDispatcher(this);
     target.inspectorAgent().enable();
     this._hideCrashedDialog = null;
-    Components.TargetDetachedDialog._disconnectedScreenWithReasonWasShown = false;
+    TargetDetachedDialog._disconnectedScreenWithReasonWasShown = false;
   }
 
   /**
@@ -25,7 +25,7 @@
    * @param {string} reason
    */
   detached(reason) {
-    Components.TargetDetachedDialog._disconnectedScreenWithReasonWasShown = true;
+    TargetDetachedDialog._disconnectedScreenWithReasonWasShown = true;
     UI.RemoteDebuggingTerminatedScreen.show(reason);
   }
 
@@ -56,6 +56,15 @@
       this._hideCrashedDialog = null;
     }
   }
-};
+}
 
-SDK.SDKModel.register(Components.TargetDetachedDialog, SDK.Target.Capability.Inspector, true);
+/* Legacy exported object */
+self.Components = self.Components || {};
+
+/* Legacy exported object */
+Components = Components || {};
+
+/** @constructor */
+Components.TargetDetachedDialog = TargetDetachedDialog;
+
+SDK.SDKModel.register(TargetDetachedDialog, SDK.Target.Capability.Inspector, true);
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/components/components.js b/third_party/blink/renderer/devtools/front_end/components/components.js
new file mode 100644
index 0000000..1519804
--- /dev/null
+++ b/third_party/blink/renderer/devtools/front_end/components/components.js
@@ -0,0 +1,19 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import * as DockController from './DockController.js';
+import * as ImagePreview from './ImagePreview.js';
+import * as JSPresentationUtils from './JSPresentationUtils.js';
+import * as Linkifier from './Linkifier.js';
+import * as Reload from './Reload.js';
+import * as TargetDetachedDialog from './TargetDetachedDialog.js';
+
+export {
+  DockController,
+  ImagePreview,
+  JSPresentationUtils,
+  Linkifier,
+  Reload,
+  TargetDetachedDialog,
+};
diff --git a/third_party/blink/renderer/devtools/front_end/components/module.json b/third_party/blink/renderer/devtools/front_end/components/module.json
index b7b5ca92..77489e0 100644
--- a/third_party/blink/renderer/devtools/front_end/components/module.json
+++ b/third_party/blink/renderer/devtools/front_end/components/module.json
@@ -4,7 +4,9 @@
         "platform",
         "ui"
     ],
-    "scripts": [
+    "scripts": [],
+    "modules": [
+        "components.js",
         "JSPresentationUtils.js",
         "DockController.js",
         "ImagePreview.js",
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewCompletedView.js b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewCompletedView.js
index d568ff5e..3053364 100644
--- a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewCompletedView.js
+++ b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewCompletedView.js
@@ -6,7 +6,7 @@
  * @unrestricted
  */
 CssOverview.CSSOverviewCompletedView = class extends UI.PanelWithSidebar {
-  constructor(controller) {
+  constructor(controller, target) {
     super('css_overview_completed_view');
     this.registerRequiredCSS('css_overview/cssOverviewCompletedView.css');
 
@@ -18,8 +18,23 @@
     this.splitWidget().setSidebarWidget(this._sideBar);
     this.splitWidget().setMainWidget(this._mainContainer);
 
+    this._cssModel = target.model(SDK.CSSModel);
+    this._linkifier = new Components.Linkifier(/* maxLinkLength */ 20, /* useLinkDecorator */ true);
+
+    this._columns = [
+      {id: 'text', title: ls`Text`, visible: true, sortable: true, weight: 60},
+      {id: 'sourceURL', title: ls`Source`, visible: true, sortable: true, weight: 40}
+    ];
+
+    this._mediaQueryGrid = new DataGrid.SortableDataGrid(this._columns);
+    this._mediaQueryGrid.element.classList.add('media-query-grid');
+    this._mediaQueryGrid.setStriped(true);
+    this._mediaQueryGrid.addEventListener(
+        DataGrid.DataGrid.Events.SortingChanged, this._sortMediaQueryDataGrid.bind(this));
+
     this._sideBar.addItem(ls`Overview summary`, 'summary');
     this._sideBar.addItem(ls`Colors`, 'colors');
+    this._sideBar.addItem(ls`Media queries`, 'media-queries');
     this._sideBar.select('summary');
 
     this._sideBar.addEventListener(CssOverview.SidebarEvents.ItemSelected, this._sideBarItemSelected, this);
@@ -28,6 +43,16 @@
     this._render({});
   }
 
+  _sortMediaQueryDataGrid() {
+    const sortColumnId = this._mediaQueryGrid.sortColumnId();
+    if (!sortColumnId) {
+      return;
+    }
+
+    const comparator = DataGrid.SortableDataGrid.StringComparator.bind(null, sortColumnId);
+    this._mediaQueryGrid.sortNodes(comparator, !this._mediaQueryGrid.isSortOrderAscending());
+  }
+
   _sideBarItemSelected(event) {
     const section = this._fragment.$(event.data);
     if (!section) {
@@ -43,6 +68,7 @@
 
   _reset() {
     this._mainContainer.element.removeChildren();
+    this._mediaQueryGrid.rootNode().removeChildren();
   }
 
   _render(data) {
@@ -50,7 +76,7 @@
       return;
     }
 
-    const {elementStyleStats, elementCount, backgroundColors, textColors, globalStyleStats} = data;
+    const {elementStyleStats, elementCount, backgroundColors, textColors, globalStyleStats, mediaQueries} = data;
 
     // Convert rgb values from the computed styles to either undefined or HEX(A) strings.
     const nonTransparentBackgroundColors = this._getNonTransparentColorStrings(backgroundColors);
@@ -79,8 +105,8 @@
             <div class="value">${this._formatter.format(globalStyleStats.styleRules)}</div>
           </li>
           <li>
-            <div class="label">${ls`Media rules`}</div>
-            <div class="value">${this._formatter.format(globalStyleStats.mediaRules)}</div>
+            <div class="label">${ls`Media queries`}</div>
+            <div class="value">${this._formatter.format(mediaQueries.length)}</div>
           </li>
           <li>
             <div class="label">${ls`Type selectors`}</div>
@@ -121,9 +147,24 @@
           ${nonTransparentTextColors.map(this._colorsToFragment)}
         </ul>
       </div>
+
+      <div $="media-queries" class="results-section media-queries">
+        <h1>${ls`Media queries`}</h1>
+        ${this._mediaQueryGrid.element}
+      </div>
     </div>`;
 
+    // Media Queries.
+    for (const mediaQuery of mediaQueries) {
+      const mediaQueryNode = new CssOverview.CSSOverviewCompletedView.MediaQueryNode(
+          this._mediaQueryGrid, mediaQuery, this._cssModel, this._linkifier);
+      mediaQueryNode.selectable = false;
+      this._mediaQueryGrid.insertChild(mediaQueryNode);
+    }
+
     this._mainContainer.element.appendChild(this._fragment.element());
+    this._mediaQueryGrid.renderInline();
+    this._mediaQueryGrid.wasShown();
   }
 
   _colorsToFragment(color) {
@@ -168,3 +209,49 @@
     this._render(data);
   }
 };
+
+CssOverview.CSSOverviewCompletedView.MediaQueryNode = class extends DataGrid.SortableDataGridNode {
+  /**
+   * @param {!DataGrid.SortableDataGrid} dataGrid
+   * @param {!Object<string,*>} mediaQueryData
+   * @param {!SDK.CSSModel} cssModel
+   * @param {!Components.Linkifier} linkifier
+   */
+  constructor(dataGrid, mediaQueryData, cssModel, linkifier) {
+    super(dataGrid, mediaQueryData.hasChildren);
+
+    this.data = mediaQueryData;
+    this._cssModel = cssModel;
+    this._linkifier = linkifier;
+  }
+
+  /**
+   * @override
+   * @param {string} columnId
+   * @return {!Element}
+   */
+  createCell(columnId) {
+    if (this.data.range && columnId === 'sourceURL') {
+      const cell = this.createTD(columnId);
+      const link = this._linkifyRuleLocation(
+          this._cssModel, this._linkifier, this.data.styleSheetId, TextUtils.TextRange.fromObject(this.data.range));
+
+      if (link.textContent !== '') {
+        cell.appendChild(link);
+      } else {
+        cell.textContent = `${this.data.sourceURL} (not available)`;
+      }
+      return cell;
+    }
+
+    return super.createCell(columnId);
+  }
+
+  _linkifyRuleLocation(cssModel, linkifier, styleSheetId, ruleLocation) {
+    const styleSheetHeader = cssModel.styleSheetHeaderForId(styleSheetId);
+    const lineNumber = styleSheetHeader.lineNumberInSource(ruleLocation.startLine);
+    const columnNumber = styleSheetHeader.columnNumberInSource(ruleLocation.startLine, ruleLocation.startColumn);
+    const matchingSelectorLocation = new SDK.CSSLocation(styleSheetHeader, lineNumber, columnNumber);
+    return linkifier.linkifyCSSLocation(matchingSelectorLocation);
+  }
+};
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewModel.js b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewModel.js
index 484f56db..7881c0b 100644
--- a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewModel.js
+++ b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewModel.js
@@ -25,12 +25,17 @@
     return this._cssAgent.getComputedStyleForNode(nodeId);
   }
 
+  async getMediaQueries() {
+    // Ignore media queries applied to stylesheets; instead only use declared media rules.
+    const queries = await this._cssAgent.getMediaQueries();
+    return queries.filter(query => query.source !== 'linkedSheet');
+  }
+
   async getGlobalStylesheetStats() {
     // There are no ways to pull CSSOM values directly today, due to its unserializable format,
     // so instead we execute some JS within the page that extracts the relevant data and send that instead.
     const expression = `(function() {
       let styleRules = 0;
-      let mediaRules = 0;
       let inlineStyles = 0;
       let externalSheets = 0;
       for (const { rules, href } of document.styleSheets) {
@@ -43,15 +48,12 @@
         for (const rule of rules) {
           if ('selectorText' in rule) {
             styleRules++;
-          } else if ('conditionText' in rule) {
-            mediaRules++;
           }
         }
       }
 
       return {
         styleRules,
-        mediaRules,
         inlineStyles,
         externalSheets
       }
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewPanel.js b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewPanel.js
index d163d05a..e69d43b 100644
--- a/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewPanel.js
+++ b/third_party/blink/renderer/devtools/front_end/css_overview/CSSOverviewPanel.js
@@ -11,13 +11,14 @@
     this.registerRequiredCSS('css_overview/cssOverview.css');
     this.element.classList.add('css-overview-panel');
 
+    const [model] = SDK.targetManager.models(CssOverview.CSSOverviewModel);
+    this._model = model;
+
     this._controller = new CssOverview.OverviewController();
     this._startView = new CssOverview.CSSOverviewStartView(this._controller);
     this._processingView = new CssOverview.CSSOverviewProcessingView(this._controller);
-    this._completedView = new CssOverview.CSSOverviewCompletedView(this._controller);
+    this._completedView = new CssOverview.CSSOverviewCompletedView(this._controller, model.target());
 
-    const [model] = SDK.targetManager.models(CssOverview.CSSOverviewModel);
-    this._model = model;
     this._controller.addEventListener(CssOverview.Events.RequestOverviewStart, this._startOverview, this);
     this._controller.addEventListener(CssOverview.Events.RequestOverviewCancel, this._cancelOverview, this);
     this._controller.addEventListener(CssOverview.Events.OverviewCompleted, this._overviewCompleted, this);
@@ -30,6 +31,7 @@
     this._backgroundColors = new Set();
     this._textColors = new Set();
     this._fontSizes = new Map();
+    this._mediaQueries = [];
     this._elementCount = 0;
     this._elementStyleStats = {
       // Simple.
@@ -43,7 +45,7 @@
       nonSimple: new Set()
     };
     this._cancelled = false;
-    this._globalStyleStats = {styleRules: 0, mediaRules: 0, inlineStyles: 0, externalSheets: 0};
+    this._globalStyleStats = {styleRules: 0, inlineStyles: 0, externalSheets: 0};
     this._renderInitialView();
   }
 
@@ -73,7 +75,8 @@
       globalStyleStats: this._globalStyleStats,
       elementStyleStats: this._elementStyleStats,
       fontSizes: this._fontSizes,
-      elementCount: this._elementCount
+      elementCount: this._elementCount,
+      mediaQueries: this._mediaQueries
     });
   }
 
@@ -92,6 +95,11 @@
       this._globalStyleStats = globalStyleStats;
     }
 
+    const mediaQueries = await this._model.getMediaQueries();
+    if (mediaQueries) {
+      this._mediaQueries = mediaQueries;
+    }
+
     // 2. Get the total element count.
     this._elementCount = document.length;
 
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/cssOverviewCompletedView.css b/third_party/blink/renderer/devtools/front_end/css_overview/cssOverviewCompletedView.css
index fa6f0d4..5967edf 100644
--- a/third_party/blink/renderer/devtools/front_end/css_overview/cssOverviewCompletedView.css
+++ b/third_party/blink/renderer/devtools/front_end/css_overview/cssOverviewCompletedView.css
@@ -46,6 +46,17 @@
   font-weight: bold;
 }
 
+.media-query-grid .header-container,
+.media-query-grid .data-container,
+.media-query-grid table.data {
+  position: relative;
+}
+
+.media-query-grid .data-container {
+  top: 0;
+  max-height: 400px;
+}
+
 .block {
   width: 65px;
   height: 25px;
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/css_overview_strings.grdp b/third_party/blink/renderer/devtools/front_end/css_overview/css_overview_strings.grdp
index 87042a3..aa7d406 100644
--- a/third_party/blink/renderer/devtools/front_end/css_overview/css_overview_strings.grdp
+++ b/third_party/blink/renderer/devtools/front_end/css_overview/css_overview_strings.grdp
@@ -27,9 +27,6 @@
   <message name="IDS_DEVTOOLS_5d50889672f6f860d14f502de3de1957" desc="Title of colors subsection in the CSS Overview Panel">
     Colors
   </message>
-  <message name="IDS_DEVTOOLS_62d79b9db9edfb64bd8c538cb9ed0190" desc="Label for the number of media rules in the CSS Overview report">
-    Media rules
-  </message>
   <message name="IDS_DEVTOOLS_6ad170a0581c9c116ca254758bd0c5b9" desc="Label for the number of ID selectors in the CSS Overview report">
     ID selectors
   </message>
@@ -57,6 +54,9 @@
   <message name="IDS_DEVTOOLS_d4a993a4b0d13c2cc4ce9387af1604ce" desc="Label for the 'Clear overview' button in the CSS Overview report">
     Clear overview
   </message>
+  <message name="IDS_DEVTOOLS_daee0f0fc555c02342c4e00a1dbf642a" desc="Label for the number of media rules in the CSS Overview report">
+    Media queries
+  </message>
   <message name="IDS_DEVTOOLS_e9c6934e961dad71d311f68c679dfd3b" desc="Label for the capture button in the CSS Overview Panel">
     Capture overview
   </message>
diff --git a/third_party/blink/renderer/devtools/front_end/css_overview/module.json b/third_party/blink/renderer/devtools/front_end/css_overview/module.json
index 4e447cd..7245192 100644
--- a/third_party/blink/renderer/devtools/front_end/css_overview/module.json
+++ b/third_party/blink/renderer/devtools/front_end/css_overview/module.json
@@ -13,7 +13,8 @@
   "dependencies": [
       "elements",
       "ui",
-      "sdk"
+      "sdk",
+      "data_grid"
   ],
   "scripts": [
       "CSSOverviewController.js",
diff --git a/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js b/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js
index 10a21c3..0b186951 100644
--- a/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js
+++ b/third_party/blink/renderer/devtools/front_end/network/NetworkDataGridNode.js
@@ -1075,10 +1075,11 @@
    * @param {boolean=} supressSelectedEvent
    */
   select(supressSelectedEvent) {
-    if (this.expanded) {
-      this.collapse();
-      return;
+    super.select(supressSelectedEvent);
+    const firstChildNode = this.traverseNextNode(false, true);
+    if (firstChildNode && firstChildNode.request()) {
+      this.parentView().dispatchEventToListeners(
+          Network.NetworkLogView.Events.RequestSelected, firstChildNode.request());
     }
-    this.expand();
   }
 };
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/Automapping.js b/third_party/blink/renderer/devtools/front_end/persistence/Automapping.js
index 6fef8c2..805e1aa 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/Automapping.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/Automapping.js
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Persistence.Automapping = class {
+export default class Automapping {
   /**
    * @param {!Workspace.Workspace} workspace
-   * @param {function(!Persistence.AutomappingStatus)} onStatusAdded
-   * @param {function(!Persistence.AutomappingStatus)} onStatusRemoved
+   * @param {function(!AutomappingStatus)} onStatusAdded
+   * @param {function(!AutomappingStatus)} onStatusRemoved
    */
   constructor(workspace, onStatusAdded, onStatusRemoved) {
     this._workspace = workspace;
 
     this._onStatusAdded = onStatusAdded;
     this._onStatusRemoved = onStatusRemoved;
-    /** @type {!Set<!Persistence.AutomappingStatus>} */
+    /** @type {!Set<!AutomappingStatus>} */
     this._statuses = new Set();
     this._statusSymbol = Symbol('Automapping.Status');
     this._processingPromiseSymbol = Symbol('Automapping.ProcessingPromise');
@@ -25,9 +25,9 @@
     this._sweepThrottler = new Common.Throttler(100);
 
     const pathEncoder = new Persistence.PathEncoder();
-    this._filesIndex = new Persistence.Automapping.FilePathIndex(pathEncoder);
-    this._projectFoldersIndex = new Persistence.Automapping.FolderIndex(pathEncoder);
-    this._activeFoldersIndex = new Persistence.Automapping.FolderIndex(pathEncoder);
+    this._filesIndex = new FilePathIndex(pathEncoder);
+    this._projectFoldersIndex = new FolderIndex(pathEncoder);
+    this._activeFoldersIndex = new FolderIndex(pathEncoder);
 
     /** @type {!Array<function(!Workspace.UISourceCode):boolean>} */
     this._interceptors = [];
@@ -73,7 +73,7 @@
     this._sweepThrottler.schedule(sweepUnmapped.bind(this));
 
     /**
-     * @this {Persistence.Automapping}
+     * @this {Automapping}
      * @return {!Promise}
      */
     function sweepUnmapped() {
@@ -198,9 +198,9 @@
     networkSourceCode[this._processingPromiseSymbol] = createBindingPromise;
 
     /**
-     * @param {?Persistence.AutomappingStatus} status
-     * @return {!Promise<?Persistence.AutomappingStatus>}
-     * @this {Persistence.Automapping}
+     * @param {?AutomappingStatus} status
+     * @return {!Promise<?AutomappingStatus>}
+     * @this {Automapping}
      */
     async function validateStatus(status) {
       if (!status) {
@@ -266,8 +266,8 @@
     }
 
     /**
-     * @param {?Persistence.AutomappingStatus} status
-     * @this {Persistence.Automapping}
+     * @param {?AutomappingStatus} status
+     * @this {Automapping}
      */
     function onStatus(status) {
       if (networkSourceCode[this._processingPromiseSymbol] !== createBindingPromise) {
@@ -298,7 +298,7 @@
   }
 
   /**
-   * @param {!Persistence.AutomappingStatus} binding
+   * @param {!AutomappingStatus} binding
    */
   _prevalidationFailedForTest(binding) {
   }
@@ -333,20 +333,19 @@
 
   /**
    * @param {!Workspace.UISourceCode} networkSourceCode
-   * @return {!Promise<?Persistence.AutomappingStatus>}
+   * @return {!Promise<?AutomappingStatus>}
    */
   _createBinding(networkSourceCode) {
     if (networkSourceCode.url().startsWith('file://') || networkSourceCode.url().startsWith('snippet://')) {
       const decodedUrl = decodeURI(networkSourceCode.url());
       const fileSourceCode = this._fileSystemUISourceCodes.get(decodedUrl);
-      const status =
-          fileSourceCode ? new Persistence.AutomappingStatus(networkSourceCode, fileSourceCode, false) : null;
+      const status = fileSourceCode ? new AutomappingStatus(networkSourceCode, fileSourceCode, false) : null;
       return Promise.resolve(status);
     }
 
     let networkPath = Common.ParsedURL.extractPath(networkSourceCode.url());
     if (networkPath === null) {
-      return Promise.resolve(/** @type {?Persistence.AutomappingStatus} */ (null));
+      return Promise.resolve(/** @type {?AutomappingStatus} */ (null));
     }
 
     if (networkPath.endsWith('/')) {
@@ -356,13 +355,13 @@
     const similarFiles =
         this._filesIndex.similarFiles(urlDecodedNetworkPath).map(path => this._fileSystemUISourceCodes.get(path));
     if (!similarFiles.length) {
-      return Promise.resolve(/** @type {?Persistence.AutomappingStatus} */ (null));
+      return Promise.resolve(/** @type {?AutomappingStatus} */ (null));
     }
 
     return this._pullMetadatas(similarFiles.concat(networkSourceCode)).then(onMetadatas.bind(this));
 
     /**
-     * @this {Persistence.Automapping}
+     * @this {Automapping}
      */
     function onMetadatas() {
       const activeFiles = similarFiles.filter(file => !!this._activeFoldersIndex.closestParentFolder(file.url()));
@@ -372,7 +371,7 @@
         if (activeFiles.length !== 1) {
           return null;
         }
-        return new Persistence.AutomappingStatus(networkSourceCode, activeFiles[0], false);
+        return new AutomappingStatus(networkSourceCode, activeFiles[0], false);
       }
 
       // Try to find exact matches, prioritizing active folders.
@@ -383,7 +382,7 @@
       if (exactMatches.length !== 1) {
         return null;
       }
-      return new Persistence.AutomappingStatus(networkSourceCode, exactMatches[0], true);
+      return new AutomappingStatus(networkSourceCode, exactMatches[0], true);
     }
   }
 
@@ -415,12 +414,12 @@
       return timeMatches && contentMatches;
     });
   }
-};
+}
 
 /**
  * @unrestricted
  */
-Persistence.Automapping.FilePathIndex = class {
+export class FilePathIndex {
   /**
    * @param {!Persistence.PathEncoder} encoder
    */
@@ -458,12 +457,12 @@
     return this._reversedIndex.words(longestCommonPrefix)
         .map(encodedPath => this._encoder.decode(encodedPath.reverse()));
   }
-};
+}
 
 /**
  * @unrestricted
  */
-Persistence.Automapping.FolderIndex = class {
+export class FolderIndex {
   /**
    * @param {!Persistence.PathEncoder} encoder
    */
@@ -520,12 +519,12 @@
     const commonPrefix = this._index.longestPrefix(encodedPath, true);
     return this._encoder.decode(commonPrefix);
   }
-};
+}
 
 /**
  * @unrestricted
  */
-Persistence.AutomappingStatus = class {
+export class AutomappingStatus {
   /**
    * @param {!Workspace.UISourceCode} network
    * @param {!Workspace.UISourceCode} fileSystem
@@ -536,4 +535,22 @@
     this.fileSystem = fileSystem;
     this.exactMatch = exactMatch;
   }
-};
+}
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.Automapping = Automapping;
+
+/** @constructor */
+Persistence.Automapping.FilePathIndex = FilePathIndex;
+
+/** @constructor */
+Persistence.Automapping.FolderIndex = FolderIndex;
+
+/** @constructor */
+Persistence.AutomappingStatus = AutomappingStatus;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/EditFileSystemView.js b/third_party/blink/renderer/devtools/front_end/persistence/EditFileSystemView.js
index 329f21a4..8d453f2a 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/EditFileSystemView.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/EditFileSystemView.js
@@ -31,7 +31,7 @@
  * @implements {UI.ListWidget.Delegate}
  * @unrestricted
  */
-Persistence.EditFileSystemView = class extends UI.VBox {
+export default class EditFileSystemView extends UI.VBox {
   /**
    * @param {string} fileSystemPath
    */
@@ -166,7 +166,7 @@
      * @param {number} index
      * @param {!HTMLInputElement|!HTMLSelectElement} input
      * @return {!UI.ListWidget.ValidatorResult}
-     * @this {Persistence.EditFileSystemView}
+     * @this {EditFileSystemView}
      */
     function pathPrefixValidator(item, index, input) {
       const prefix = this._normalizePrefix(input.value.trim());
@@ -196,4 +196,13 @@
     }
     return prefix + (prefix[prefix.length - 1] === '/' ? '' : '/');
   }
-};
+}
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.EditFileSystemView = EditFileSystemView;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/FileSystemWorkspaceBinding.js b/third_party/blink/renderer/devtools/front_end/persistence/FileSystemWorkspaceBinding.js
index fdcb551..54c0a86 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/FileSystemWorkspaceBinding.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/FileSystemWorkspaceBinding.js
@@ -31,7 +31,7 @@
 /**
  * @unrestricted
  */
-Persistence.FileSystemWorkspaceBinding = class {
+export default class FileSystemWorkspaceBinding {
   /**
    * @param {!Persistence.IsolatedFileSystemManager} isolatedFileSystemManager
    * @param {!Workspace.Workspace} workspace
@@ -47,7 +47,7 @@
       this._isolatedFileSystemManager.addEventListener(
           Persistence.IsolatedFileSystemManager.Events.FileSystemFilesChanged, this._fileSystemFilesChanged, this)
     ];
-    /** @type {!Map.<string, !Persistence.FileSystemWorkspaceBinding.FileSystem>} */
+    /** @type {!Map.<string, !FileSystem>} */
     this._boundFileSystems = new Map();
     this._isolatedFileSystemManager.waitForFileSystems().then(this._onFileSystemsLoaded.bind(this));
   }
@@ -66,7 +66,7 @@
    */
   static relativePath(uiSourceCode) {
     const baseURL =
-        /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (uiSourceCode.project())._fileSystemBaseURL;
+        /** @type {!FileSystem}*/ (uiSourceCode.project())._fileSystemBaseURL;
     return uiSourceCode.url().substring(baseURL.length).split('/');
   }
 
@@ -76,7 +76,7 @@
    */
   static tooltipForUISourceCode(uiSourceCode) {
     const fileSystem =
-        /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (uiSourceCode.project())._fileSystem;
+        /** @type {!FileSystem}*/ (uiSourceCode.project())._fileSystem;
     return fileSystem.tooltipForURL(uiSourceCode.url());
   }
 
@@ -86,7 +86,7 @@
    */
   static fileSystemType(project) {
     const fileSystem =
-        /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (project)._fileSystem;
+        /** @type {!FileSystem}*/ (project)._fileSystem;
     return fileSystem.type();
   }
 
@@ -96,7 +96,7 @@
    */
   static fileSystemSupportsAutomapping(project) {
     const fileSystem =
-        /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (project)._fileSystem;
+        /** @type {!FileSystem}*/ (project)._fileSystem;
     return fileSystem.supportsAutomapping();
   }
 
@@ -106,7 +106,7 @@
    * @return {string}
    */
   static completeURL(project, relativePath) {
-    const fsProject = /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (project);
+    const fsProject = /** @type {!FileSystem}*/ (project);
     return fsProject._fileSystemBaseURL + relativePath;
   }
 
@@ -146,7 +146,7 @@
    * @param {!Persistence.PlatformFileSystem} fileSystem
    */
   _addFileSystem(fileSystem) {
-    const boundFileSystem = new Persistence.FileSystemWorkspaceBinding.FileSystem(this, fileSystem, this._workspace);
+    const boundFileSystem = new FileSystem(this, fileSystem, this._workspace);
     this._boundFileSystems.set(fileSystem.path(), boundFileSystem);
   }
 
@@ -197,21 +197,21 @@
       this._boundFileSystems.remove(fileSystem._fileSystem.path());
     }
   }
-};
+}
 
 /**
  * @implements {Workspace.Project}
  * @unrestricted
  */
-Persistence.FileSystemWorkspaceBinding.FileSystem = class extends Workspace.ProjectStore {
+export class FileSystem extends Workspace.ProjectStore {
   /**
-   * @param {!Persistence.FileSystemWorkspaceBinding} fileSystemWorkspaceBinding
+   * @param {!FileSystemWorkspaceBinding} fileSystemWorkspaceBinding
    * @param {!Persistence.PlatformFileSystem} isolatedFileSystem
    * @param {!Workspace.Workspace} workspace
    */
   constructor(fileSystemWorkspaceBinding, isolatedFileSystem, workspace) {
     const fileSystemPath = isolatedFileSystem.path();
-    const id = Persistence.FileSystemWorkspaceBinding.projectId(fileSystemPath);
+    const id = FileSystemWorkspaceBinding.projectId(fileSystemPath);
     console.assert(!workspace.project(id));
     const displayName = fileSystemPath.substr(fileSystemPath.lastIndexOf('/') + 1);
 
@@ -274,12 +274,12 @@
    * @return {!Promise<?Workspace.UISourceCodeMetadata>}
    */
   requestMetadata(uiSourceCode) {
-    if (uiSourceCode[Persistence.FileSystemWorkspaceBinding._metadata]) {
-      return uiSourceCode[Persistence.FileSystemWorkspaceBinding._metadata];
+    if (uiSourceCode[_metadata]) {
+      return uiSourceCode[_metadata];
     }
     const relativePath = this._filePathForUISourceCode(uiSourceCode);
     const promise = this._fileSystem.getMetadata(relativePath).then(onMetadata);
-    uiSourceCode[Persistence.FileSystemWorkspaceBinding._metadata] = promise;
+    uiSourceCode[_metadata] = promise;
     return promise;
 
     /**
@@ -339,7 +339,7 @@
    */
   fullDisplayName(uiSourceCode) {
     const baseURL =
-        /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem}*/ (uiSourceCode.project())._fileSystemParentURL;
+        /** @type {!FileSystem}*/ (uiSourceCode.project())._fileSystemParentURL;
     return uiSourceCode.url().substring(baseURL.length);
   }
 
@@ -369,7 +369,7 @@
     /**
      * @param {boolean} success
      * @param {string=} newName
-     * @this {Persistence.FileSystemWorkspaceBinding.FileSystem}
+     * @this {FileSystem}
      */
     function innerCallback(success, newName) {
       if (!success || !newName) {
@@ -450,7 +450,7 @@
 
     /**
      * @param {number} from
-     * @this {Persistence.FileSystemWorkspaceBinding.FileSystem}
+     * @this {FileSystem}
      */
     function reportFileChunk(from) {
       const to = Math.min(from + chunkSize, filePaths.length);
@@ -569,7 +569,7 @@
       this.addUISourceCode(this.createUISourceCode(path, contentType));
       return;
     }
-    uiSourceCode[Persistence.FileSystemWorkspaceBinding._metadata] = null;
+    uiSourceCode[_metadata] = null;
     uiSourceCode.checkContentUpdated();
   }
 
@@ -584,6 +584,20 @@
   dispose() {
     this.removeProject();
   }
-};
+}
 
-Persistence.FileSystemWorkspaceBinding._metadata = Symbol('FileSystemWorkspaceBinding.Metadata');
+export const _metadata = Symbol('FileSystemWorkspaceBinding.Metadata');
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.FileSystemWorkspaceBinding = FileSystemWorkspaceBinding;
+
+/** @constructor */
+Persistence.FileSystemWorkspaceBinding.FileSystem = FileSystem;
+
+Persistence.FileSystemWorkspaceBinding._metadata = _metadata;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystem.js b/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystem.js
index 206fdc2cf..faf021d 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystem.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystem.js
@@ -30,7 +30,7 @@
 /**
  * @unrestricted
  */
-Persistence.IsolatedFileSystem = class extends Persistence.PlatformFileSystem {
+export default class IsolatedFileSystem extends Persistence.PlatformFileSystem {
   /**
    * @param {!Persistence.IsolatedFileSystemManager} manager
    * @param {string} path
@@ -64,18 +64,18 @@
    * @param {string} type
    * @param {string} name
    * @param {string} rootURL
-   * @return {!Promise<?Persistence.IsolatedFileSystem>}
+   * @return {!Promise<?IsolatedFileSystem>}
    */
   static create(manager, path, embedderPath, type, name, rootURL) {
     const domFileSystem = Host.InspectorFrontendHost.isolatedFileSystem(name, rootURL);
     if (!domFileSystem) {
-      return Promise.resolve(/** @type {?Persistence.IsolatedFileSystem} */ (null));
+      return Promise.resolve(/** @type {?IsolatedFileSystem} */ (null));
     }
 
-    const fileSystem = new Persistence.IsolatedFileSystem(manager, path, embedderPath, domFileSystem, type);
+    const fileSystem = new IsolatedFileSystem(manager, path, embedderPath, domFileSystem, type);
     return fileSystem._initializeFilePaths()
         .then(() => fileSystem)
-        .catchException(/** @type {?Persistence.IsolatedFileSystem} */ (null));
+        .catchException(/** @type {?IsolatedFileSystem} */ (null));
   }
 
   /**
@@ -120,7 +120,7 @@
      * @param {!FileError} error
      */
     function errorHandler(error) {
-      const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+      const errorMessage = IsolatedFileSystem.errorMessage(error);
       console.error(errorMessage + ' when getting file metadata \'' + path);
       fulfill(null);
     }
@@ -163,7 +163,7 @@
 
     /**
      * @param {!Array.<!FileEntry>} entries
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function innerCallback(entries) {
       for (let i = 0; i < entries.length; ++i) {
@@ -224,7 +224,7 @@
   _innerCreateFolderIfNeeded(path) {
     return new Promise(resolve => {
       this._domFileSystem.root.getDirectory(path, {create: true}, dirEntry => resolve(dirEntry), error => {
-        const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+        const errorMessage = IsolatedFileSystem.errorMessage(error);
         console.error(errorMessage + ' trying to create directory \'' + path + '\'');
         resolve(null);
       });
@@ -252,7 +252,7 @@
      * @param {string} name
      * @param {number=} newFileIndex
      * @return {!Promise<?FileEntry>}
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function createFileCandidate(name, newFileIndex) {
       return new Promise(resolve => {
@@ -262,7 +262,7 @@
             resolve(createFileCandidate.call(this, name, (newFileIndex ? newFileIndex + 1 : 1)));
             return;
           }
-          const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+          const errorMessage = IsolatedFileSystem.errorMessage(error);
           console.error(
               errorMessage + ' when testing if file exists \'' + (this.path() + '/' + path + '/' + nameCandidate) +
               '\'');
@@ -285,7 +285,7 @@
 
     /**
      * @param {!FileEntry} fileEntry
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function fileEntryLoaded(fileEntry) {
       fileEntry.remove(fileEntryRemoved, errorHandler.bind(this));
@@ -297,12 +297,12 @@
 
     /**
      * @param {!FileError} error
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      * @suppress {checkTypes}
      * TODO(jsbell): Update externs replacing FileError with DOMException. https://crbug.com/496901
      */
     function errorHandler(error) {
-      const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+      const errorMessage = IsolatedFileSystem.errorMessage(error);
       console.error(errorMessage + ' when deleting file \'' + (this.path() + '/' + path) + '\'');
       resolveCallback(false);
     }
@@ -320,7 +320,7 @@
       }, errorHandler.bind(this));
 
       /**
-       * @this {Persistence.IsolatedFileSystem}
+       * @this {IsolatedFileSystem}
        */
       function errorHandler(error) {
         if (error.name === 'NotFoundError') {
@@ -328,7 +328,7 @@
           return;
         }
 
-        const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+        const errorMessage = IsolatedFileSystem.errorMessage(error);
         console.error(errorMessage + ' when getting content for file \'' + (this.path() + '/' + path) + '\'');
         resolve(null);
       }
@@ -350,7 +350,7 @@
 
       const reader = new FileReader();
       const extension = Common.ParsedURL.extractExtension(path);
-      const encoded = Persistence.IsolatedFileSystem.BinaryExtensions.has(extension);
+      const encoded = BinaryExtensions.has(extension);
       const readPromise = new Promise(x => reader.onloadend = x);
       if (encoded) {
         reader.readAsBinaryString(blob);
@@ -399,7 +399,7 @@
 
     /**
      * @param {!FileEntry} entry
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function fileEntryLoaded(entry) {
       entry.createWriter(fileWriterCreated.bind(this), errorHandler.bind(this));
@@ -407,7 +407,7 @@
 
     /**
      * @param {!FileWriter} fileWriter
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     async function fileWriterCreated(fileWriter) {
       fileWriter.onerror = errorHandler.bind(this);
@@ -427,10 +427,10 @@
     }
 
     /**
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function errorHandler(error) {
-      const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+      const errorMessage = IsolatedFileSystem.errorMessage(error);
       console.error(errorMessage + ' when setting content for file \'' + (this.path() + '/' + path) + '\'');
       callback();
     }
@@ -455,7 +455,7 @@
 
     /**
      * @param {!FileEntry} entry
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function fileEntryLoaded(entry) {
       if (entry.name === newName) {
@@ -469,7 +469,7 @@
 
     /**
      * @param {!Entry} entry
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function dirEntryLoaded(entry) {
       dirEntry = entry;
@@ -484,7 +484,7 @@
     }
 
     /**
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function newFileEntryLoadErrorHandler(error) {
       if (error.name !== 'NotFoundError') {
@@ -502,10 +502,10 @@
     }
 
     /**
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function errorHandler(error) {
-      const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+      const errorMessage = IsolatedFileSystem.errorMessage(error);
       console.error(errorMessage + ' when renaming file \'' + (this.path() + '/' + path) + '\' to \'' + newName + '\'');
       callback(false);
     }
@@ -535,7 +535,7 @@
     dirReader.readEntries(innerCallback, errorHandler);
 
     function errorHandler(error) {
-      const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+      const errorMessage = IsolatedFileSystem.errorMessage(error);
       console.error(errorMessage + ' when reading directory \'' + dirEntry.fullPath + '\'');
       callback([]);
     }
@@ -550,14 +550,14 @@
 
     /**
      * @param {!DirectoryEntry} dirEntry
-     * @this {Persistence.IsolatedFileSystem}
+     * @this {IsolatedFileSystem}
      */
     function innerCallback(dirEntry) {
       this._readDirectory(dirEntry, callback);
     }
 
     function errorHandler(error) {
-      const errorMessage = Persistence.IsolatedFileSystem.errorMessage(error);
+      const errorMessage = IsolatedFileSystem.errorMessage(error);
       console.error(errorMessage + ' when requesting entry \'' + path + '\'');
       callback([]);
     }
@@ -675,20 +675,19 @@
    */
   contentType(path) {
     const extension = Common.ParsedURL.extractExtension(path);
-    if (Persistence.IsolatedFileSystem._styleSheetExtensions.has(extension)) {
+    if (_styleSheetExtensions.has(extension)) {
       return Common.resourceTypes.Stylesheet;
     }
-    if (Persistence.IsolatedFileSystem._documentExtensions.has(extension)) {
+    if (_documentExtensions.has(extension)) {
       return Common.resourceTypes.Document;
     }
-    if (Persistence.IsolatedFileSystem.ImageExtensions.has(extension)) {
+    if (ImageExtensions.has(extension)) {
       return Common.resourceTypes.Image;
     }
-    if (Persistence.IsolatedFileSystem._scriptExtensions.has(extension)) {
+    if (_scriptExtensions.has(extension)) {
       return Common.resourceTypes.Script;
     }
-    return Persistence.IsolatedFileSystem.BinaryExtensions.has(extension) ? Common.resourceTypes.Other :
-                                                                            Common.resourceTypes.Document;
+    return BinaryExtensions.has(extension) ? Common.resourceTypes.Other : Common.resourceTypes.Document;
   }
 
   /**
@@ -708,19 +707,19 @@
   supportsAutomapping() {
     return this.type() !== 'overrides';
   }
-};
+}
 
-Persistence.IsolatedFileSystem._styleSheetExtensions = new Set(['css', 'scss', 'sass', 'less']);
-Persistence.IsolatedFileSystem._documentExtensions = new Set(['htm', 'html', 'asp', 'aspx', 'phtml', 'jsp']);
-Persistence.IsolatedFileSystem._scriptExtensions = new Set([
+export const _styleSheetExtensions = new Set(['css', 'scss', 'sass', 'less']);
+export const _documentExtensions = new Set(['htm', 'html', 'asp', 'aspx', 'phtml', 'jsp']);
+
+export const _scriptExtensions = new Set([
   'asp', 'aspx', 'c', 'cc', 'cljs', 'coffee', 'cpp', 'cs', 'dart', 'java', 'js',
   'jsp', 'jsx',  'h', 'm',  'mjs',  'mm',     'py',  'sh', 'ts',   'tsx',  'ls'
 ]);
 
-Persistence.IsolatedFileSystem.ImageExtensions =
-    new Set(['jpeg', 'jpg', 'svg', 'gif', 'webp', 'png', 'ico', 'tiff', 'tif', 'bmp']);
+export const ImageExtensions = new Set(['jpeg', 'jpg', 'svg', 'gif', 'webp', 'png', 'ico', 'tiff', 'tif', 'bmp']);
 
-Persistence.IsolatedFileSystem.BinaryExtensions = new Set([
+export const BinaryExtensions = new Set([
   // Executable extensions, roughly taken from https://en.wikipedia.org/wiki/Comparison_of_executable_file_formats
   'cmd', 'com', 'exe',
   // Archive extensions, roughly taken from https://en.wikipedia.org/wiki/List_of_archive_formats
@@ -732,3 +731,18 @@
   // Image file extensions
   'jpeg', 'jpg', 'gif', 'webp', 'png', 'ico', 'tiff', 'tif', 'bmp'
 ]);
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.IsolatedFileSystem = IsolatedFileSystem;
+
+Persistence.IsolatedFileSystem._styleSheetExtensions = _styleSheetExtensions;
+Persistence.IsolatedFileSystem._documentExtensions = _documentExtensions;
+Persistence.IsolatedFileSystem._scriptExtensions = _scriptExtensions;
+Persistence.IsolatedFileSystem.ImageExtensions = ImageExtensions;
+Persistence.IsolatedFileSystem.BinaryExtensions = BinaryExtensions;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystemManager.js b/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystemManager.js
index b2039e0..bb73592 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystemManager.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/IsolatedFileSystemManager.js
@@ -31,7 +31,7 @@
 /**
  * @unrestricted
  */
-Persistence.IsolatedFileSystemManager = class extends Common.Object {
+export default class IsolatedFileSystemManager extends Common.Object {
   constructor() {
     super();
 
@@ -77,7 +77,7 @@
 
     /**
      * @param {!Common.Event} event
-     * @this {Persistence.IsolatedFileSystemManager}
+     * @this {IsolatedFileSystemManager}
      */
     function onFileSystemsLoaded(event) {
       const fileSystems = /** @type {!Array.<!Persistence.IsolatedFileSystemManager.FileSystem>} */ (event.data);
@@ -135,7 +135,7 @@
 
     /**
      * @param {?Persistence.PlatformFileSystem} fileSystem
-     * @this {Persistence.IsolatedFileSystemManager}
+     * @this {IsolatedFileSystemManager}
      */
     function storeFileSystem(fileSystem) {
       if (!fileSystem) {
@@ -143,7 +143,7 @@
       }
       this._fileSystems.set(fileSystemURL, fileSystem);
       if (dispatchEvent) {
-        this.dispatchEventToListeners(Persistence.IsolatedFileSystemManager.Events.FileSystemAdded, fileSystem);
+        this.dispatchEventToListeners(Events.FileSystemAdded, fileSystem);
       }
       return fileSystem;
     }
@@ -155,7 +155,7 @@
    */
   addPlatformFileSystem(fileSystemURL, fileSystem) {
     this._fileSystems.set(fileSystemURL, fileSystem);
-    this.dispatchEventToListeners(Persistence.IsolatedFileSystemManager.Events.FileSystemAdded, fileSystem);
+    this.dispatchEventToListeners(Events.FileSystemAdded, fileSystem);
   }
 
   /**
@@ -192,7 +192,7 @@
     }
     this._fileSystems.delete(fileSystemPath);
     isolatedFileSystem.fileSystemRemoved();
-    this.dispatchEventToListeners(Persistence.IsolatedFileSystemManager.Events.FileSystemRemoved, isolatedFileSystem);
+    this.dispatchEventToListeners(Events.FileSystemRemoved, isolatedFileSystem);
   }
 
   /**
@@ -205,12 +205,12 @@
       removed: groupFilePathsIntoFileSystemPaths.call(this, event.data.removed)
     };
 
-    this.dispatchEventToListeners(Persistence.IsolatedFileSystemManager.Events.FileSystemFilesChanged, urlPaths);
+    this.dispatchEventToListeners(Events.FileSystemFilesChanged, urlPaths);
 
     /**
      * @param {!Array<string>} embedderPaths
      * @return {!Platform.Multimap<string, string>}
-     * @this {Persistence.IsolatedFileSystemManager}
+     * @this {IsolatedFileSystemManager}
      */
     function groupFilePathsIntoFileSystemPaths(embedderPaths) {
       const paths = new Platform.Multimap();
@@ -282,7 +282,7 @@
    * @return {number}
    */
   registerCallback(callback) {
-    const requestId = ++Persistence.IsolatedFileSystemManager._lastRequestId;
+    const requestId = ++_lastRequestId;
     this._callbacks.set(requestId, callback);
     return requestId;
   }
@@ -292,7 +292,7 @@
    * @return {number}
    */
   registerProgress(progress) {
-    const requestId = ++Persistence.IsolatedFileSystemManager._lastRequestId;
+    const requestId = ++_lastRequestId;
     this._progresses.set(requestId, progress);
     return requestId;
   }
@@ -357,16 +357,10 @@
     callback.call(null, files);
     this._callbacks.delete(requestId);
   }
-};
-
-/** @typedef {!{type: string, fileSystemName: string, rootURL: string, fileSystemPath: string}} */
-Persistence.IsolatedFileSystemManager.FileSystem;
-
-/** @typedef {!{changed:!Platform.Multimap<string, string>, added:!Platform.Multimap<string, string>, removed:!Platform.Multimap<string, string>}} */
-Persistence.IsolatedFileSystemManager.FilesChangedData;
+}
 
 /** @enum {symbol} */
-Persistence.IsolatedFileSystemManager.Events = {
+export const Events = {
   FileSystemAdded: Symbol('FileSystemAdded'),
   FileSystemRemoved: Symbol('FileSystemRemoved'),
   FileSystemFilesChanged: Symbol('FileSystemFilesChanged'),
@@ -374,9 +368,28 @@
   ExcludedFolderRemoved: Symbol('ExcludedFolderRemoved')
 };
 
-Persistence.IsolatedFileSystemManager._lastRequestId = 0;
+export let _lastRequestId = 0;
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.IsolatedFileSystemManager = IsolatedFileSystemManager;
+
+/** @enum {symbol} */
+Persistence.IsolatedFileSystemManager.Events = Events;
+Persistence.IsolatedFileSystemManager._lastRequestId = _lastRequestId;
+
+/** @typedef {!{type: string, fileSystemName: string, rootURL: string, fileSystemPath: string}} */
+Persistence.IsolatedFileSystemManager.FileSystem;
+
+/** @typedef {!{changed:!Platform.Multimap<string, string>, added:!Platform.Multimap<string, string>, removed:!Platform.Multimap<string, string>}} */
+Persistence.IsolatedFileSystemManager.FilesChangedData;
 
 /**
- * @type {!Persistence.IsolatedFileSystemManager}
+ * @type {!IsolatedFileSystemManager}
  */
 Persistence.isolatedFileSystemManager;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/NetworkPersistenceManager.js b/third_party/blink/renderer/devtools/front_end/persistence/NetworkPersistenceManager.js
index b8b5088a..b7f730cf 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/NetworkPersistenceManager.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/NetworkPersistenceManager.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Persistence.NetworkPersistenceManager = class extends Common.Object {
+export default class NetworkPersistenceManager extends Common.Object {
   /**
    * @param {!Workspace.Workspace} workspace
    */
@@ -162,7 +162,7 @@
         // encodeURI() escapes all the unsafe filename characters except /:?*
         let encodedName = encodeURI(pathPart).replace(/[\/:\?\*]/g, match => '%' + match[0].charCodeAt(0).toString(16));
         // Windows does not allow a small set of filenames.
-        if (Persistence.NetworkPersistenceManager._reservedFileNames.has(encodedName.toLowerCase())) {
+        if (_reservedFileNames.has(encodedName.toLowerCase())) {
           encodedName = encodedName.split('').map(char => '%' + char.charCodeAt(0).toString(16)).join('');
         }
         // Windows does not allow the file to end in a space or dot (space should already be encoded).
@@ -353,7 +353,7 @@
     this._updateInterceptionThrottler.schedule(innerUpdateInterceptionPatterns.bind(this));
 
     /**
-     * @this {Persistence.NetworkPersistenceManager}
+     * @this {NetworkPersistenceManager}
      * @return {!Promise}
      */
     function innerUpdateInterceptionPatterns() {
@@ -425,7 +425,7 @@
     }
 
     this._updateActiveProject();
-    this.dispatchEventToListeners(Persistence.NetworkPersistenceManager.Events.ProjectChanged, this._project);
+    this.dispatchEventToListeners(Events.ProjectChanged, this._project);
   }
 
   /**
@@ -500,16 +500,28 @@
     const blob = await project.requestFileBlob(fileSystemUISourceCode);
     interceptedRequest.continueRequestWithContent(new Blob([blob], {type: mimeType}));
   }
-};
+}
 
-Persistence.NetworkPersistenceManager._reservedFileNames = new Set([
+export const _reservedFileNames = new Set([
   'con',  'prn',  'aux',  'nul',  'com1', 'com2', 'com3', 'com4', 'com5', 'com6', 'com7',
   'com8', 'com9', 'lpt1', 'lpt2', 'lpt3', 'lpt4', 'lpt5', 'lpt6', 'lpt7', 'lpt8', 'lpt9'
 ]);
 
-Persistence.NetworkPersistenceManager.Events = {
+export const Events = {
   ProjectChanged: Symbol('ProjectChanged')
 };
 
-/** @type {!Persistence.NetworkPersistenceManager} */
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.NetworkPersistenceManager = NetworkPersistenceManager;
+
+Persistence.NetworkPersistenceManager._reservedFileNames = _reservedFileNames;
+Persistence.NetworkPersistenceManager.Events = Events;
+
+/** @type {!NetworkPersistenceManager} */
 Persistence.networkPersistenceManager;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/PersistenceActions.js b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceActions.js
index a14c690..656f8e23 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/PersistenceActions.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceActions.js
@@ -2,13 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Persistence.PersistenceActions = {};
-
 /**
  * @implements {UI.ContextMenu.Provider}
  * @unrestricted
  */
-Persistence.PersistenceActions.ContextMenuProvider = class {
+export class ContextMenuProvider {
   /**
    * @override
    * @param {!Event} event
@@ -53,4 +51,15 @@
           Common.UIString('Open in containing folder'), () => Host.InspectorFrontendHost.showItemInFolder(path));
     }
   }
-};
+}
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+Persistence.PersistenceActions = {};
+
+/** @constructor */
+Persistence.PersistenceActions.ContextMenuProvider = ContextMenuProvider;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/Persistence.js b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceImpl.js
similarity index 73%
rename from third_party/blink/renderer/devtools/front_end/persistence/Persistence.js
rename to third_party/blink/renderer/devtools/front_end/persistence/PersistenceImpl.js
index 8a26cc9..8145ee3 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/Persistence.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceImpl.js
@@ -5,7 +5,7 @@
 /**
  * @unrestricted
  */
-Persistence.Persistence = class extends Common.Object {
+export default class PersistenceImpl extends Common.Object {
   /**
    * @param {!Workspace.Workspace} workspace
    * @param {!Bindings.BreakpointManager} breakpointManager
@@ -39,39 +39,39 @@
   }
 
   /**
-   * @param {!Persistence.PersistenceBinding} binding
+   * @param {!PersistenceBinding} binding
    */
   addBinding(binding) {
     this._innerAddBinding(binding);
   }
 
   /**
-   * @param {!Persistence.PersistenceBinding} binding
+   * @param {!PersistenceBinding} binding
    */
   addBindingForTest(binding) {
     this._innerAddBinding(binding);
   }
 
   /**
-   * @param {!Persistence.PersistenceBinding} binding
+   * @param {!PersistenceBinding} binding
    */
   removeBinding(binding) {
     this._innerRemoveBinding(binding);
   }
 
   /**
-   * @param {!Persistence.PersistenceBinding} binding
+   * @param {!PersistenceBinding} binding
    */
   removeBindingForTest(binding) {
     this._innerRemoveBinding(binding);
   }
 
   /**
-   * @param {!Persistence.PersistenceBinding} binding
+   * @param {!PersistenceBinding} binding
    */
   _innerAddBinding(binding) {
-    binding.network[Persistence.Persistence._binding] = binding;
-    binding.fileSystem[Persistence.Persistence._binding] = binding;
+    binding.network[_binding] = binding;
+    binding.fileSystem[_binding] = binding;
 
     binding.fileSystem.forceLoadOnCheckContent();
 
@@ -100,22 +100,22 @@
 
     this._notifyBindingEvent(binding.network);
     this._notifyBindingEvent(binding.fileSystem);
-    this.dispatchEventToListeners(Persistence.Persistence.Events.BindingCreated, binding);
+    this.dispatchEventToListeners(Events.BindingCreated, binding);
   }
 
   /**
-   * @param {!Persistence.PersistenceBinding} binding
+   * @param {!PersistenceBinding} binding
    */
   _innerRemoveBinding(binding) {
-    if (binding.network[Persistence.Persistence._binding] !== binding) {
+    if (binding.network[_binding] !== binding) {
       return;
     }
     console.assert(
-        binding.network[Persistence.Persistence._binding] === binding.fileSystem[Persistence.Persistence._binding],
+        binding.network[_binding] === binding.fileSystem[_binding],
         'ERROR: inconsistent binding for networkURL ' + binding.network.url());
 
-    binding.network[Persistence.Persistence._binding] = null;
-    binding.fileSystem[Persistence.Persistence._binding] = null;
+    binding.network[_binding] = null;
+    binding.fileSystem[_binding] = null;
 
     binding.network.removeEventListener(
         Workspace.UISourceCode.Events.WorkingCopyCommitted, this._onWorkingCopyCommitted, this);
@@ -131,15 +131,15 @@
 
     this._notifyBindingEvent(binding.network);
     this._notifyBindingEvent(binding.fileSystem);
-    this.dispatchEventToListeners(Persistence.Persistence.Events.BindingRemoved, binding);
+    this.dispatchEventToListeners(Events.BindingRemoved, binding);
   }
 
   /**
    * @param {!Persistence.AutomappingStatus} status
    */
   _onStatusAdded(status) {
-    const binding = new Persistence.PersistenceBinding(status.network, status.fileSystem);
-    status[Persistence.Persistence._binding] = binding;
+    const binding = new PersistenceBinding(status.network, status.fileSystem);
+    status[_binding] = binding;
     this._innerAddBinding(binding);
   }
 
@@ -147,7 +147,7 @@
    * @param {!Persistence.AutomappingStatus} status
    */
   _onStatusRemoved(status) {
-    const binding = /** @type {!Persistence.PersistenceBinding} */ (status[Persistence.Persistence._binding]);
+    const binding = /** @type {!PersistenceBinding} */ (status[_binding]);
     this._innerRemoveBinding(binding);
   }
 
@@ -163,15 +163,15 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    */
   _syncWorkingCopy(uiSourceCode) {
-    const binding = uiSourceCode[Persistence.Persistence._binding];
-    if (!binding || binding[Persistence.Persistence._muteWorkingCopy]) {
+    const binding = uiSourceCode[_binding];
+    if (!binding || binding[_muteWorkingCopy]) {
       return;
     }
     const other = binding.network === uiSourceCode ? binding.fileSystem : binding.network;
     if (!uiSourceCode.isDirty()) {
-      binding[Persistence.Persistence._muteWorkingCopy] = true;
+      binding[_muteWorkingCopy] = true;
       other.resetWorkingCopy();
-      binding[Persistence.Persistence._muteWorkingCopy] = false;
+      binding[_muteWorkingCopy] = false;
       this._contentSyncedForTest();
       return;
     }
@@ -180,7 +180,7 @@
     if (target.type() === SDK.Target.Type.Node) {
       const newContent = uiSourceCode.workingCopy();
       other.requestContent().then(() => {
-        const nodeJSContent = Persistence.Persistence.rewrapNodeJSContent(other, other.workingCopy(), newContent);
+        const nodeJSContent = PersistenceImpl.rewrapNodeJSContent(other, other.workingCopy(), newContent);
         setWorkingCopy.call(this, () => nodeJSContent);
       });
       return;
@@ -190,12 +190,12 @@
 
     /**
      * @param {function():string} workingCopyGetter
-     * @this {Persistence.Persistence}
+     * @this {PersistenceImpl}
      */
     function setWorkingCopy(workingCopyGetter) {
-      binding[Persistence.Persistence._muteWorkingCopy] = true;
+      binding[_muteWorkingCopy] = true;
       other.setWorkingCopyGetter(workingCopyGetter);
-      binding[Persistence.Persistence._muteWorkingCopy] = false;
+      binding[_muteWorkingCopy] = false;
       this._contentSyncedForTest();
     }
   }
@@ -215,15 +215,15 @@
    * @param {boolean} encoded
    */
   syncContent(uiSourceCode, newContent, encoded) {
-    const binding = uiSourceCode[Persistence.Persistence._binding];
-    if (!binding || binding[Persistence.Persistence._muteCommit]) {
+    const binding = uiSourceCode[_binding];
+    if (!binding || binding[_muteCommit]) {
       return;
     }
     const other = binding.network === uiSourceCode ? binding.fileSystem : binding.network;
     const target = Bindings.NetworkProject.targetForUISourceCode(binding.network);
     if (target.type() === SDK.Target.Type.Node) {
       other.requestContent().then(currentContent => {
-        const nodeJSContent = Persistence.Persistence.rewrapNodeJSContent(other, currentContent, newContent);
+        const nodeJSContent = PersistenceImpl.rewrapNodeJSContent(other, currentContent, newContent);
         setContent.call(this, nodeJSContent);
       });
       return;
@@ -232,12 +232,12 @@
 
     /**
      * @param {string} newContent
-     * @this {Persistence.Persistence}
+     * @this {PersistenceImpl}
      */
     function setContent(newContent) {
-      binding[Persistence.Persistence._muteCommit] = true;
+      binding[_muteCommit] = true;
       other.setContent(newContent, encoded);
-      binding[Persistence.Persistence._muteCommit] = false;
+      binding[_muteCommit] = false;
       this._contentSyncedForTest();
     }
   }
@@ -250,21 +250,18 @@
    */
   static rewrapNodeJSContent(uiSourceCode, currentContent, newContent) {
     if (uiSourceCode.project().type() === Workspace.projectTypes.FileSystem) {
-      if (newContent.startsWith(Persistence.Persistence._NodePrefix) &&
-          newContent.endsWith(Persistence.Persistence._NodeSuffix)) {
-        newContent = newContent.substring(
-            Persistence.Persistence._NodePrefix.length, newContent.length - Persistence.Persistence._NodeSuffix.length);
+      if (newContent.startsWith(_NodePrefix) && newContent.endsWith(_NodeSuffix)) {
+        newContent = newContent.substring(_NodePrefix.length, newContent.length - _NodeSuffix.length);
       }
-      if (currentContent.startsWith(Persistence.Persistence._NodeShebang)) {
-        newContent = Persistence.Persistence._NodeShebang + newContent;
+      if (currentContent.startsWith(_NodeShebang)) {
+        newContent = _NodeShebang + newContent;
       }
     } else {
-      if (newContent.startsWith(Persistence.Persistence._NodeShebang)) {
-        newContent = newContent.substring(Persistence.Persistence._NodeShebang.length);
+      if (newContent.startsWith(_NodeShebang)) {
+        newContent = newContent.substring(_NodeShebang.length);
       }
-      if (currentContent.startsWith(Persistence.Persistence._NodePrefix) &&
-          currentContent.endsWith(Persistence.Persistence._NodeSuffix)) {
-        newContent = Persistence.Persistence._NodePrefix + newContent + Persistence.Persistence._NodeSuffix;
+      if (currentContent.startsWith(_NodePrefix) && currentContent.endsWith(_NodeSuffix)) {
+        newContent = _NodePrefix + newContent + _NodeSuffix;
       }
     }
     return newContent;
@@ -298,7 +295,7 @@
     if (uiSourceCode.project().canSetFileContent()) {
       return false;
     }
-    if (uiSourceCode[Persistence.Persistence._binding]) {
+    if (uiSourceCode[_binding]) {
       return false;
     }
     return !!uiSourceCode.hasCommits();
@@ -306,10 +303,10 @@
 
   /**
    * @param {!Workspace.UISourceCode} uiSourceCode
-   * @return {?Persistence.PersistenceBinding}
+   * @return {?PersistenceBinding}
    */
   binding(uiSourceCode) {
-    return uiSourceCode[Persistence.Persistence._binding] || null;
+    return uiSourceCode[_binding] || null;
   }
 
   /**
@@ -397,17 +394,16 @@
     }
     return this._filePathPrefixesToBindingCount.has(filePath);
   }
-};
+}
 
-Persistence.Persistence._binding = Symbol('Persistence.Binding');
-Persistence.Persistence._muteCommit = Symbol('Persistence.MuteCommit');
-Persistence.Persistence._muteWorkingCopy = Symbol('Persistence.MuteWorkingCopy');
+export const _binding = Symbol('Persistence.Binding');
+export const _muteCommit = Symbol('Persistence.MuteCommit');
+export const _muteWorkingCopy = Symbol('Persistence.MuteWorkingCopy');
+export const _NodePrefix = '(function (exports, require, module, __filename, __dirname) { ';
+export const _NodeSuffix = '\n});';
+export const _NodeShebang = '#!/usr/bin/env node';
 
-Persistence.Persistence._NodePrefix = '(function (exports, require, module, __filename, __dirname) { ';
-Persistence.Persistence._NodeSuffix = '\n});';
-Persistence.Persistence._NodeShebang = '#!/usr/bin/env node';
-
-Persistence.Persistence.Events = {
+export const Events = {
   BindingCreated: Symbol('BindingCreated'),
   BindingRemoved: Symbol('BindingRemoved')
 };
@@ -415,7 +411,7 @@
 /**
  * @unrestricted
  */
-Persistence.PathEncoder = class {
+export class PathEncoder {
   constructor() {
     /** @type {!Common.CharacterIdMap<string>} */
     this._encoder = new Common.CharacterIdMap();
@@ -436,12 +432,12 @@
   decode(path) {
     return path.split('').map(token => this._encoder.fromChar(token)).join('/');
   }
-};
+}
 
 /**
  * @unrestricted
  */
-Persistence.PersistenceBinding = class {
+export class PersistenceBinding {
   /**
    * @param {!Workspace.UISourceCode} network
    * @param {!Workspace.UISourceCode} fileSystem
@@ -450,7 +446,30 @@
     this.network = network;
     this.fileSystem = fileSystem;
   }
-};
+}
 
-/** @type {!Persistence.Persistence} */
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.Persistence = PersistenceImpl;
+
+Persistence.Persistence._binding = _binding;
+Persistence.Persistence._muteCommit = _muteCommit;
+Persistence.Persistence._muteWorkingCopy = _muteWorkingCopy;
+Persistence.Persistence._NodePrefix = _NodePrefix;
+Persistence.Persistence._NodeSuffix = _NodeSuffix;
+Persistence.Persistence._NodeShebang = _NodeShebang;
+Persistence.Persistence.Events = Events;
+
+/** @constructor */
+Persistence.PathEncoder = PathEncoder;
+
+/** @constructor */
+Persistence.PersistenceBinding = PersistenceBinding;
+
+/** @type {!PersistenceImpl} */
 Persistence.persistence;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/PersistenceUtils.js b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceUtils.js
index d99ae30..58b16c7 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/PersistenceUtils.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/PersistenceUtils.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Persistence.PersistenceUtils = class {
+export default class PersistenceUtils {
   /**
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @return {string}
@@ -32,7 +32,7 @@
         return null;
       }
       const icon = UI.Icon.create('mediumicon-file-sync');
-      icon.title = Persistence.PersistenceUtils.tooltipForUISourceCode(binding.network);
+      icon.title = PersistenceUtils.tooltipForUISourceCode(binding.network);
       // TODO(allada) This will not work properly with dark theme.
       if (Persistence.networkPersistenceManager.project() === binding.fileSystem.project()) {
         icon.style.filter = 'hue-rotate(160deg)';
@@ -45,16 +45,16 @@
     }
 
     const icon = UI.Icon.create('mediumicon-file');
-    icon.title = Persistence.PersistenceUtils.tooltipForUISourceCode(uiSourceCode);
+    icon.title = PersistenceUtils.tooltipForUISourceCode(uiSourceCode);
     return icon;
   }
-};
+}
 
 /**
  * @extends {Common.Object}
  * @implements {Components.LinkDecorator}
  */
-Persistence.PersistenceUtils.LinkDecorator = class extends Common.Object {
+export class LinkDecorator extends Common.Object {
   /**
    * @param {!Persistence.Persistence} persistence
    */
@@ -78,6 +78,18 @@
    * @return {?UI.Icon}
    */
   linkIcon(uiSourceCode) {
-    return Persistence.PersistenceUtils.iconForUISourceCode(uiSourceCode);
+    return PersistenceUtils.iconForUISourceCode(uiSourceCode);
   }
-};
\ No newline at end of file
+}
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.PersistenceUtils = PersistenceUtils;
+
+/** @constructor */
+Persistence.PersistenceUtils.LinkDecorator = LinkDecorator;
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/PlatformFileSystem.js b/third_party/blink/renderer/devtools/front_end/persistence/PlatformFileSystem.js
index e37a4e5..a034bb4 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/PlatformFileSystem.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/PlatformFileSystem.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Persistence.PlatformFileSystem = class {
+export default class PlatformFileSystem {
   /**
    * @param {string} path
    * @param {string} type
@@ -191,4 +191,13 @@
   supportsAutomapping() {
     throw new Error('Not implemented');
   }
-};
+}
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.PlatformFileSystem = PlatformFileSystem;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/WorkspaceSettingsTab.js b/third_party/blink/renderer/devtools/front_end/persistence/WorkspaceSettingsTab.js
index 748b76a..ea4faf1 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/WorkspaceSettingsTab.js
+++ b/third_party/blink/renderer/devtools/front_end/persistence/WorkspaceSettingsTab.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Persistence.WorkspaceSettingsTab = class extends UI.VBox {
+export default class WorkspaceSettingsTab extends UI.VBox {
   constructor() {
     super();
     this.registerRequiredCSS('persistence/workspaceSettingsTab.css');
@@ -166,4 +166,13 @@
       element.remove();
     }
   }
-};
+}
+
+/* Legacy exported object */
+self.Persistence = self.Persistence || {};
+
+/* Legacy exported object */
+Persistence = Persistence || {};
+
+/** @constructor */
+Persistence.WorkspaceSettingsTab = WorkspaceSettingsTab;
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/module.json b/third_party/blink/renderer/devtools/front_end/persistence/module.json
index 9b3b1c94..7e529578 100644
--- a/third_party/blink/renderer/devtools/front_end/persistence/module.json
+++ b/third_party/blink/renderer/devtools/front_end/persistence/module.json
@@ -43,14 +43,16 @@
             "className": "Persistence.PersistenceActions.ContextMenuProvider"
         }
     ],
-    "scripts": [
+    "scripts": [],
+    "modules": [
+        "persistence.js",
         "PlatformFileSystem.js",
         "IsolatedFileSystem.js",
         "IsolatedFileSystemManager.js",
         "FileSystemWorkspaceBinding.js",
         "Automapping.js",
         "NetworkPersistenceManager.js",
-        "Persistence.js",
+        "PersistenceImpl.js",
         "PersistenceActions.js",
         "PersistenceUtils.js",
         "EditFileSystemView.js",
diff --git a/third_party/blink/renderer/devtools/front_end/persistence/persistence.js b/third_party/blink/renderer/devtools/front_end/persistence/persistence.js
new file mode 100644
index 0000000..56bbe27
--- /dev/null
+++ b/third_party/blink/renderer/devtools/front_end/persistence/persistence.js
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './PlatformFileSystem.js';
+
+import * as Automapping from './Automapping.js';
+import * as EditFileSystemView from './EditFileSystemView.js';
+import * as FileSystemWorkspaceBinding from './FileSystemWorkspaceBinding.js';
+import * as IsolatedFileSystem from './IsolatedFileSystem.js';
+import * as IsolatedFileSystemManager from './IsolatedFileSystemManager.js';
+import * as NetworkPersistenceManager from './NetworkPersistenceManager.js';
+import * as PersistenceActions from './PersistenceActions.js';
+import * as Persistence from './PersistenceImpl.js';
+import * as PersistenceUtils from './PersistenceUtils.js';
+import * as PlatformFileSystem from './PlatformFileSystem.js';
+import * as WorkspaceSettingsTab from './WorkspaceSettingsTab.js';
+
+export {
+  Automapping,
+  EditFileSystemView,
+  FileSystemWorkspaceBinding,
+  IsolatedFileSystem,
+  IsolatedFileSystemManager,
+  NetworkPersistenceManager,
+  Persistence,
+  PersistenceActions,
+  PersistenceUtils,
+  PlatformFileSystem,
+  WorkspaceSettingsTab,
+};
diff --git a/third_party/blink/renderer/devtools/front_end/root.js b/third_party/blink/renderer/devtools/front_end/root.js
index 047d265..2459c51 100644
--- a/third_party/blink/renderer/devtools/front_end/root.js
+++ b/third_party/blink/renderer/devtools/front_end/root.js
@@ -14,3 +14,6 @@
 import './services/services.js';
 import './workspace/workspace.js';
 import './bindings/bindings.js';
+import './components/components.js';
+import './persistence/persistence.js';
+import './browser_sdk/browser_sdk.js';
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/front_end/ui/Action.js b/third_party/blink/renderer/devtools/front_end/ui/Action.js
index 0e9cb9bbc..60d8394 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/Action.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/Action.js
@@ -118,11 +118,11 @@
     if (options) {
       for (const pair of options) {
         if (pair['value'] !== this._toggled) {
-          title = pair['title'];
+          title = ls(pair['title']);
         }
       }
     }
-    return ls(title);
+    return title;
   }
 
   /**
diff --git a/third_party/blink/renderer/devtools/tests/front_end/common/TextDictionary.ts b/third_party/blink/renderer/devtools/tests/front_end/common/TextDictionary.ts
new file mode 100644
index 0000000..23320ac
--- /dev/null
+++ b/third_party/blink/renderer/devtools/tests/front_end/common/TextDictionary.ts
@@ -0,0 +1,85 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const {assert} = chai;
+
+import {default as TextDictionary} from '../../../front_end/common/TextDictionary.js';
+import {default as Trie} from '../../../front_end/common/Trie.js';
+
+describe('Text Dictionary', () => {
+  it('can be created with its basic attributes', () => {
+    const textDic = new TextDictionary();
+    assert.instanceOf(textDic._words, Map, 'did not create a Map named _words');
+    assert.instanceOf(textDic._index, Trie, 'did not create a Trie named _index');
+  });
+
+  it('can add a word successfully', () => {
+    const textDic = new TextDictionary();
+    textDic.addWord('test');
+    assert.isTrue(textDic.hasWord('test'), 'word was not added successfully');
+  });
+
+  it('can remove a word successfully', () => {
+    const textDic = new TextDictionary();
+    textDic.addWord('test');
+    assert.isTrue(textDic.hasWord('test'), 'word was not added successfully');
+    textDic.removeWord('test');
+    assert.isFalse(textDic.hasWord('test'), 'word was not removed successfully');
+  });
+
+  it('returns nothing when trying to remove a word that does not exist', () => {
+    const textDic = new TextDictionary();
+    assert.isUndefined(
+        textDic.removeWord('test'), 'removeWord function did not return Undefined for a word not in the dictionaty');
+  });
+
+  it('removes a word that was added twice', () => {
+    const textDic = new TextDictionary();
+    textDic.addWord('test');
+    textDic.addWord('test');
+    assert.isTrue(textDic.hasWord('test'), 'words were not added successfully');
+    textDic.removeWord('test');
+    assert.isTrue(textDic.hasWord('test'), 'both words were removed');
+    textDic.removeWord('test');
+    assert.isFalse(textDic.hasWord('test'), 'the second word was not removed successfully');
+  });
+
+  it('retrieve words with a certain prefix', () => {
+    const textDic = new TextDictionary();
+    textDic.addWord('test');
+    textDic.addWord('ten');
+    textDic.addWord('nine');
+    const foundWords = textDic.wordsWithPrefix('te');
+    assert.equal(foundWords[0], 'test', 'first word was not retrieved');
+    assert.equal(foundWords[1], 'ten', 'second word was not retrieved');
+  });
+
+  it('retrieve the word count for a certain word', () => {
+    const textDic = new TextDictionary();
+    textDic.addWord('test');
+    textDic.addWord('test');
+    textDic.addWord('ten');
+    assert.equal(textDic.wordCount('test'), 2, 'word count is incorrect');
+  });
+
+  it('retrieve the word count for a certain word that is not in the dictionary', () => {
+    const textDic = new TextDictionary();
+    textDic.addWord('test');
+    textDic.addWord('test');
+    textDic.addWord('ten');
+    assert.equal(textDic.wordCount('testing'), 0, 'word count is incorrect');
+  });
+
+  it('reset the dictionary after adding words to it', () => {
+    const textDic = new TextDictionary();
+    textDic.addWord('test');
+    textDic.addWord('test');
+    textDic.addWord('ten');
+    textDic.reset();
+    assert.isFalse(textDic.hasWord('test'), 'first word still in the dictionary');
+    assert.isFalse(textDic.hasWord('ten'), 'second word still in the dictionary');
+    assert.equal(textDic.wordCount('test'), 0, 'first word still has a count');
+    assert.equal(textDic.wordCount('ten'), 0, 'second word still has a count');
+  });
+});
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index d32537c..adcd0d2 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -602,7 +602,7 @@
   if (IsA<HTMLMeterElement>(*GetNode()))
     return ax::mojom::Role::kMeter;
 
-  if (IsHTMLProgressElement(*GetNode()))
+  if (IsA<HTMLProgressElement>(*GetNode()))
     return ax::mojom::Role::kProgressIndicator;
 
   if (IsA<HTMLOutputElement>(*GetNode()))
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
index 5110563a..fbbd98d 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -1602,6 +1602,10 @@
   FinalizeFrame();
   scoped_refptr<StaticBitmapImage> snapshot = GetImage(kPreferNoAcceleration);
 
+  // GetImagedata is faster in Unaccelerated canvases
+  if (IsAccelerated())
+    DisableAcceleration();
+
   if (!StaticBitmapImage::ConvertToArrayBufferContents(
           snapshot, contents, image_data_rect, color_params, IsAccelerated())) {
     exception_state.ThrowRangeError("Out of memory at ImageData creation");
diff --git a/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc b/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc
index b42bbf0..ea97329 100644
--- a/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc
+++ b/third_party/blink/renderer/modules/installedapp/installed_app_controller.cc
@@ -8,6 +8,8 @@
 
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
+#include "third_party/blink/public/mojom/installedapp/related_application.mojom-blink.h"
+#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
diff --git a/third_party/blink/renderer/modules/installedapp/installed_app_controller.h b/third_party/blink/renderer/modules/installedapp/installed_app_controller.h
index 76b4ede..5d1ff41 100644
--- a/third_party/blink/renderer/modules/installedapp/installed_app_controller.h
+++ b/third_party/blink/renderer/modules/installedapp/installed_app_controller.h
@@ -11,8 +11,8 @@
 #include "base/memory/scoped_refptr.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/mojom/installedapp/installed_app_provider.mojom-blink.h"
-#include "third_party/blink/public/mojom/installedapp/related_application.mojom-blink.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h"
+#include "third_party/blink/public/mojom/installedapp/related_application.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
diff --git a/third_party/blink/renderer/modules/locks/lock_manager.h b/third_party/blink/renderer/modules/locks/lock_manager.h
index cbb606f1..b3bfa941 100644
--- a/third_party/blink/renderer/modules/locks/lock_manager.h
+++ b/third_party/blink/renderer/modules/locks/lock_manager.h
@@ -7,7 +7,7 @@
 
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "third_party/blink/public/mojom/locks/lock_manager.mojom-blink.h"
+#include "third_party/blink/public/mojom/locks/lock_manager.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/string_or_string_sequence.h"
 #include "third_party/blink/renderer/modules/locks/lock.h"
 #include "third_party/blink/renderer/modules/locks/lock_options.h"
diff --git a/third_party/blink/renderer/modules/manifest/image_resource_type_converters.cc b/third_party/blink/renderer/modules/manifest/image_resource_type_converters.cc
index ab10edb..9dcb4d6 100644
--- a/third_party/blink/renderer/modules/manifest/image_resource_type_converters.cc
+++ b/third_party/blink/renderer/modules/manifest/image_resource_type_converters.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/modules/manifest/image_resource_type_converters.h"
 
 #include "third_party/blink/public/common/mime_util/mime_util.h"
+#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h"
 #include "third_party/blink/public/platform/web_icon_sizes_parser.h"
 #include "third_party/blink/public/platform/web_size.h"
 #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/renderer/modules/manifest/image_resource_type_converters.h b/third_party/blink/renderer/modules/manifest/image_resource_type_converters.h
index 100eee1..20c7b45c 100644
--- a/third_party/blink/renderer/modules/manifest/image_resource_type_converters.h
+++ b/third_party/blink/renderer/modules/manifest/image_resource_type_converters.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_MANIFEST_IMAGE_RESOURCE_TYPE_CONVERTERS_H_
 
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h"
+#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/manifest/manifest_manager.h b/third_party/blink/renderer/modules/manifest/manifest_manager.h
index a12a50b..0b35b078 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_manager.h
+++ b/third_party/blink/renderer/modules/manifest/manifest_manager.h
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h"
+#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/manifest/manifest_manager.mojom-blink.h"
 #include "third_party/blink/public/web/web_manifest_manager.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
diff --git a/third_party/blink/renderer/modules/manifest/manifest_type_converters.cc b/third_party/blink/renderer/modules/manifest/manifest_type_converters.cc
index a07f4771..38cc135 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_type_converters.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_type_converters.cc
@@ -8,7 +8,7 @@
 
 #include "third_party/blink/public/common/manifest/manifest.h"
 #include "third_party/blink/public/common/manifest/manifest_mojom_traits.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/modules/manifest/manifest_type_converters.h b/third_party/blink/renderer/modules/manifest/manifest_type_converters.h
index 5acd0f6..3642dc58 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_type_converters.h
+++ b/third_party/blink/renderer/modules/manifest/manifest_type_converters.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_MANIFEST_MANIFEST_TYPE_CONVERTERS_H_
 
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h"
+#include "third_party/blink/public/mojom/manifest/manifest.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.cc b/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.cc
index 44637c4..999d75d 100644
--- a/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.cc
+++ b/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h"
 
+#include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink.h"
 #include "third_party/blink/public/platform/web_icon_sizes_parser.h"
 #include "third_party/blink/public/platform/web_size.h"
 #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h b/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h
index 28c0d45..ac3300b9 100644
--- a/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h
+++ b/third_party/blink/renderer/modules/mediasession/media_metadata_sanitizer.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASESSION_MEDIA_METADATA_SANITIZER_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASESSION_MEDIA_METADATA_SANITIZER_H_
 
-#include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink.h"
+#include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink-forward.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.cc b/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.cc
index 7076907..e4b9a61 100644
--- a/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.cc
+++ b/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.cc
@@ -8,6 +8,7 @@
 
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
+#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_source.h"
 #include "third_party/blink/public/platform/web_media_stream_source.h"
 #include "third_party/blink/public/platform/web_media_stream_track.h"
diff --git a/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.h b/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.h
index 76bc8fa..49c9dd4 100644
--- a/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.h
+++ b/third_party/blink/renderer/modules/mediastream/apply_constraints_processor.h
@@ -11,7 +11,7 @@
 #include "base/threading/thread_checker.h"
 #include "media/capture/video_capture_types.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h"
+#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink-forward.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_constraints_util.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
 #include "third_party/blink/renderer/modules/mediastream/apply_constraints_request.h"
diff --git a/third_party/blink/renderer/modules/mediastream/input_device_info.cc b/third_party/blink/renderer/modules/mediastream/input_device_info.cc
index cf2b6e5..77403396 100644
--- a/third_party/blink/renderer/modules/mediastream/input_device_info.cc
+++ b/third_party/blink/renderer/modules/mediastream/input_device_info.cc
@@ -8,6 +8,7 @@
 
 #include "build/build_config.h"
 #include "media/base/sample_format.h"
+#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_processor_options.h"
 #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_source.h"
 #include "third_party/blink/public/platform/web_media_stream_track.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_device_info.cc b/third_party/blink/renderer/modules/mediastream/media_device_info.cc
index bddcf8c..fa1f3dd4 100644
--- a/third_party/blink/renderer/modules/mediastream/media_device_info.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_device_info.cc
@@ -25,6 +25,7 @@
 
 #include "third_party/blink/renderer/modules/mediastream/media_device_info.h"
 
+#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_device_info.h b/third_party/blink/renderer/modules/mediastream/media_device_info.h
index a2f807e..4b47acf6 100644
--- a/third_party/blink/renderer/modules/mediastream/media_device_info.h
+++ b/third_party/blink/renderer/modules/mediastream/media_device_info.h
@@ -26,7 +26,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_DEVICE_INFO_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_DEVICE_INFO_H_
 
-#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink.h"
+#include "third_party/blink/public/mojom/mediastream/media_devices.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index 9be4862..158e3c8 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1468,6 +1468,7 @@
   deps = [
     ":platform_export",
     "//base/allocator:buildflags",
+    "//components/paint_preview/common",
     "//components/viz/client",
     "//components/viz/common",
     "//crypto",
diff --git a/third_party/blink/renderer/platform/bindings/dom_data_store.h b/third_party/blink/renderer/platform/bindings/dom_data_store.h
index 0660dd18..166841fc 100644
--- a/third_party/blink/renderer/platform/bindings/dom_data_store.h
+++ b/third_party/blink/renderer/platform/bindings/dom_data_store.h
@@ -229,6 +229,11 @@
     DOMWorldWrapperReference(v8::Isolate* isolate, v8::Local<v8::Object> handle)
         : TraceWrapperV8Reference(isolate, handle) {}
 
+    ~DOMWorldWrapperReference() {
+      // Destruction of a reference should clear it immediately.
+      Clear();
+    }
+
     // Move support without write barrier.
     DOMWorldWrapperReference(DOMWorldWrapperReference&& other)
         : TraceWrapperV8Reference() {
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable.h b/third_party/blink/renderer/platform/bindings/script_wrappable.h
index 4ab3e0c7..75c6845 100644
--- a/third_party/blink/renderer/platform/bindings/script_wrappable.h
+++ b/third_party/blink/renderer/platform/bindings/script_wrappable.h
@@ -161,6 +161,11 @@
     return main_world_wrapper_.NewLocal(isolate);
   }
 
+  static_assert(
+      std::is_trivially_destructible<
+          TraceWrapperV8Reference<v8::Object>>::value,
+      "TraceWrapperV8Reference<v8::Object> should be trivially destructible.");
+
   TraceWrapperV8Reference<v8::Object> main_world_wrapper_;
 
   DISALLOW_COPY_AND_ASSIGN(ScriptWrappable);
diff --git a/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h b/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h
index 53cfd74..d11fd0c3 100644
--- a/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h
+++ b/third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h
@@ -11,15 +11,6 @@
 #include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h"
 #include "v8/include/v8.h"
 
-namespace v8 {
-
-template <typename T>
-struct TracedGlobalTrait<v8::TracedGlobal<T>> {
-  static constexpr bool kRequiresExplicitDestruction = false;
-};
-
-}  // namespace v8
-
 namespace blink {
 
 /**
@@ -50,8 +41,8 @@
 
   bool IsEmpty() const { return handle_.IsEmpty(); }
   void Clear() { handle_.Reset(); }
-  ALWAYS_INLINE const v8::TracedGlobal<T>& Get() const { return handle_; }
-  ALWAYS_INLINE v8::TracedGlobal<T>& Get() { return handle_; }
+  ALWAYS_INLINE const v8::TracedReference<T>& Get() const { return handle_; }
+  ALWAYS_INLINE v8::TracedReference<T>& Get() { return handle_; }
 
   template <typename S>
   const TraceWrapperV8Reference<S>& Cast() const {
@@ -124,7 +115,7 @@
     UnifiedHeapMarkingVisitor::WriteBarrier(UnsafeCast<v8::Value>());
   }
 
-  v8::TracedGlobal<T> handle_;
+  v8::TracedReference<T> handle_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/wrapper_type_info.h b/third_party/blink/renderer/platform/bindings/wrapper_type_info.h
index 4b873d3..4782a9e4 100644
--- a/third_party/blink/renderer/platform/bindings/wrapper_type_info.h
+++ b/third_party/blink/renderer/platform/bindings/wrapper_type_info.h
@@ -122,7 +122,7 @@
     wrapper->SetWrapperClassId(wrapper_class_id);
   }
 
-  void ConfigureWrapper(v8::TracedGlobal<v8::Object>* wrapper) const {
+  void ConfigureWrapper(v8::TracedReference<v8::Object>* wrapper) const {
     wrapper->SetWrapperClassId(wrapper_class_id);
   }
 
@@ -177,7 +177,7 @@
 }
 
 template <typename T, int offset>
-inline T* GetInternalField(const v8::TracedGlobal<v8::Object>& global) {
+inline T* GetInternalField(const v8::TracedReference<v8::Object>& global) {
   DCHECK_LT(offset, v8::Object::InternalFieldCount(global));
   return reinterpret_cast<T*>(
       v8::Object::GetAlignedPointerFromInternalField(global, offset));
@@ -198,7 +198,7 @@
 }
 
 inline ScriptWrappable* ToScriptWrappable(
-    const v8::TracedGlobal<v8::Object>& wrapper) {
+    const v8::TracedReference<v8::Object>& wrapper) {
   return GetInternalField<ScriptWrappable, kV8DOMWrapperObjectIndex>(wrapper);
 }
 
@@ -219,7 +219,8 @@
   return GetInternalField<void, kV8DOMWrapperObjectIndex>(wrapper);
 }
 
-inline void* ToUntypedWrappable(const v8::TracedGlobal<v8::Object>& wrapper) {
+inline void* ToUntypedWrappable(
+    const v8::TracedReference<v8::Object>& wrapper) {
   return GetInternalField<void, kV8DOMWrapperObjectIndex>(wrapper);
 }
 
@@ -233,7 +234,7 @@
 }
 
 inline const WrapperTypeInfo* ToWrapperTypeInfo(
-    const v8::TracedGlobal<v8::Object>& wrapper) {
+    const v8::TracedReference<v8::Object>& wrapper) {
   return GetInternalField<WrapperTypeInfo, kV8DOMWrapperTypeIndex>(wrapper);
 }
 
diff --git a/third_party/blink/renderer/platform/graphics/DEPS b/third_party/blink/renderer/platform/graphics/DEPS
index 5647769..37eff60 100644
--- a/third_party/blink/renderer/platform/graphics/DEPS
+++ b/third_party/blink/renderer/platform/graphics/DEPS
@@ -11,6 +11,7 @@
     "+base/barrier_closure.h",
     "+base/callback_helpers.h",
     "+cc",
+    "+components/paint_preview/common",
     "+components/viz/client",
     "+components/viz/common",
     "+gpu/config",
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.cc b/third_party/blink/renderer/platform/graphics/graphics_context.cc
index a822cd3..ee1ce96 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_context.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_context.cc
@@ -30,6 +30,7 @@
 
 #include "base/optional.h"
 #include "build/build_config.h"
+#include "components/paint_preview/common/paint_preview_tracker.h"
 #include "skia/ext/platform_canvas.h"
 #include "third_party/blink/renderer/platform/fonts/text_run_paint_info.h"
 #include "third_party/blink/renderer/platform/geometry/float_rect.h"
@@ -89,12 +90,14 @@
 
 GraphicsContext::GraphicsContext(PaintController& paint_controller,
                                  DisabledMode disable_context_or_painting,
-                                 printing::MetafileSkia* metafile)
+                                 printing::MetafileSkia* metafile,
+                                 paint_preview::PaintPreviewTracker* tracker)
     : canvas_(nullptr),
       paint_controller_(paint_controller),
       paint_state_stack_(),
       paint_state_index_(0),
       metafile_(metafile),
+      tracker_(tracker),
 #if DCHECK_IS_ON()
       layer_count_(0),
       disable_destruction_checks_(false),
@@ -102,6 +105,7 @@
       disabled_state_(disable_context_or_painting),
       device_scale_factor_(1.0f),
       printing_(false),
+      is_painting_preview_(false),
       in_drawing_recorder_(false) {
   // FIXME: Do some tests to determine how many states are typically used, and
   // allocate several here.
@@ -1368,6 +1372,12 @@
     return;
   DCHECK(canvas_);
 
+  // Intercept URL rects when painting previews.
+  if (IsPaintingPreview() && tracker_) {
+    tracker_->AnnotateLink(link.GetString().Utf8(), dest_rect);
+    return;
+  }
+
   sk_sp<SkData> url(SkData::MakeWithCString(link.GetString().Utf8().c_str()));
   canvas_->Annotate(cc::PaintCanvas::AnnotationType::URL, dest_rect,
                     std::move(url));
@@ -1379,6 +1389,12 @@
     return;
   DCHECK(canvas_);
 
+  // Intercept URL rects when painting previews.
+  if (IsPaintingPreview() && tracker_) {
+    tracker_->AnnotateLink(dest_name.Utf8(), rect);
+    return;
+  }
+
   sk_sp<SkData> sk_dest_name(SkData::MakeWithCString(dest_name.Utf8().c_str()));
   canvas_->Annotate(cc::PaintCanvas::AnnotationType::LINK_TO_DESTINATION, rect,
                     std::move(sk_dest_name));
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.h b/third_party/blink/renderer/platform/graphics/graphics_context.h
index 950e1f4..5a42e810 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_context.h
+++ b/third_party/blink/renderer/platform/graphics/graphics_context.h
@@ -53,6 +53,10 @@
 class SkRRect;
 struct SkRect;
 
+namespace paint_preview {
+class PaintPreviewTracker;
+}  // namespace paint_preview
+
 namespace blink {
 
 class FloatRect;
@@ -74,7 +78,8 @@
 
   explicit GraphicsContext(PaintController&,
                            DisabledMode = kNothingDisabled,
-                           printing::MetafileSkia* = nullptr);
+                           printing::MetafileSkia* = nullptr,
+                           paint_preview::PaintPreviewTracker* = nullptr);
 
   ~GraphicsContext();
 
@@ -161,6 +166,19 @@
   bool Printing() const { return printing_; }
   void SetPrinting(bool printing) { printing_ = printing; }
 
+  // Returns if the context is saving a paint preview instead of displaying.
+  // In such cases, clipping should not occur.
+  bool IsPaintingPreview() const { return is_painting_preview_; }
+  void SetIsPaintingPreview(bool is_painting_preview) {
+    is_painting_preview_ = is_painting_preview;
+  }
+
+  // Returns if the context is printing or painting a preview. Many of the
+  // behaviors required for printing and paint previews are shared.
+  bool IsPrintingOrPaintingPreview() const {
+    return Printing() || IsPaintingPreview();
+  }
+
   SkColorFilter* GetColorFilter() const;
   void SetColorFilter(ColorFilter);
   // ---------- End state management methods -----------------
@@ -498,6 +516,7 @@
   PaintRecorder paint_recorder_;
 
   printing::MetafileSkia* metafile_;
+  paint_preview::PaintPreviewTracker* tracker_;
 
 #if DCHECK_IS_ON()
   int layer_count_;
@@ -512,6 +531,7 @@
   DarkModeFilter dark_mode_filter_;
 
   unsigned printing_ : 1;
+  unsigned is_painting_preview_ : 1;
   unsigned in_drawing_recorder_ : 1;
 
   DISALLOW_COPY_AND_ASSIGN(GraphicsContext);
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc b/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc
index 6b690463..b7b3241 100644
--- a/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.cc
@@ -10,9 +10,11 @@
 
 namespace blink {
 
-PaintRecordBuilder::PaintRecordBuilder(printing::MetafileSkia* metafile,
-                                       GraphicsContext* containing_context,
-                                       PaintController* paint_controller)
+PaintRecordBuilder::PaintRecordBuilder(
+    printing::MetafileSkia* metafile,
+    GraphicsContext* containing_context,
+    PaintController* paint_controller,
+    paint_preview::PaintPreviewTracker* tracker)
     : paint_controller_(nullptr) {
   GraphicsContext::DisabledMode disabled_mode =
       GraphicsContext::kNothingDisabled;
@@ -30,12 +32,13 @@
   paint_controller_->UpdateCurrentPaintChunkProperties(
       base::nullopt, PropertyTreeState::Root());
 
-  context_ = std::make_unique<GraphicsContext>(*paint_controller_,
-                                               disabled_mode, metafile);
+  context_ = std::make_unique<GraphicsContext>(
+      *paint_controller_, disabled_mode, metafile, tracker);
   if (containing_context) {
     context_->SetDarkMode(containing_context->dark_mode_settings());
     context_->SetDeviceScaleFactor(containing_context->DeviceScaleFactor());
     context_->SetPrinting(containing_context->Printing());
+    context_->SetIsPaintingPreview(containing_context->IsPaintingPreview());
   }
 }
 
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h b/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h
index 521dd79c..42631cf 100644
--- a/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h
+++ b/third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h
@@ -19,12 +19,15 @@
 class PaintCanvas;
 }
 
+namespace paint_preview {
+class PaintPreviewTracker;
+}
+
 namespace blink {
 class GraphicsContext;
 class PaintController;
 
 class PLATFORM_EXPORT PaintRecordBuilder final : public DisplayItemClient {
-
  public:
   // Constructs a new builder for the resulting paint record. If |metadata|
   // is specified, that metadata is propagated to the builder's internal canvas.
@@ -39,7 +42,8 @@
   // CompositeAfterPaint.
   PaintRecordBuilder(printing::MetafileSkia* metafile = nullptr,
                      GraphicsContext* containing_context = nullptr,
-                     PaintController* = nullptr);
+                     PaintController* = nullptr,
+                     paint_preview::PaintPreviewTracker* tracker = nullptr);
   ~PaintRecordBuilder() override;
 
   GraphicsContext& Context() { return *context_; }
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index 6ba306a5..9e803dcc 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -1288,11 +1288,15 @@
       value->Reset();
   }
 
-  void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>& value) final {
+  void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>&) final {
+    CHECK(false) << "Blink does not use v8::TracedGlobal.";
+  }
+
+  void VisitTracedReference(const v8::TracedReference<v8::Value>& value) final {
     // TODO(mlippautz): Avoid const_cast after changing the API to allow
-    // modificaton of the TracedGlobal handle.
-    if (InDeadObject(&const_cast<v8::TracedGlobal<v8::Value>&>(value)))
-      const_cast<v8::TracedGlobal<v8::Value>&>(value).Reset();
+    // modificaton of the handle.
+    if (InDeadObject(&const_cast<v8::TracedReference<v8::Value>&>(value)))
+      const_cast<v8::TracedReference<v8::Value>&>(value).Reset();
   }
 
  private:
@@ -1404,11 +1408,15 @@
     VisitSlot(value, sizeof(v8::Persistent<v8::Value>));
   }
 
-  void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>& value) final {
+  void VisitTracedGlobalHandle(const v8::TracedGlobal<v8::Value>&) final {
+    CHECK(false) << "Blink does not use v8::TracedGlobal.";
+  }
+
+  void VisitTracedReference(const v8::TracedReference<v8::Value>& value) final {
     // TODO(mlippautz): Avoid const_cast after changing the API to allow
-    // modificaton of the TracedGlobal handle.
-    VisitSlot(&const_cast<v8::TracedGlobal<v8::Value>&>(value),
-              sizeof(v8::TracedGlobal<v8::Value>));
+    // modificaton of the handle.
+    VisitSlot(&const_cast<v8::TracedReference<v8::Value>&>(value),
+              sizeof(v8::TracedReference<v8::Value>));
   }
 
  private:
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_controller.cc b/third_party/blink/renderer/platform/heap/unified_heap_controller.cc
index c76a311..c4b5172 100644
--- a/third_party/blink/renderer/platform/heap/unified_heap_controller.cc
+++ b/third_party/blink/renderer/platform/heap/unified_heap_controller.cc
@@ -143,16 +143,19 @@
   return is_tracing_done_;
 }
 
-bool UnifiedHeapController::IsRootForNonTracingGCInternal(
-    const v8::TracedGlobal<v8::Value>& handle) {
+namespace {
+
+bool IsRootForNonTracingGCInternal(
+    const v8::TracedReference<v8::Value>& handle) {
   const uint16_t class_id = handle.WrapperClassId();
-  // Stand-alone TracedGlobal reference or kCustomWrappableId. Keep as root as
+  // Stand-alone reference or kCustomWrappableId. Keep as root as
   // we don't know better.
   if (class_id != WrapperTypeInfo::kNodeClassId &&
       class_id != WrapperTypeInfo::kObjectClassId)
     return true;
 
-  const v8::TracedGlobal<v8::Object>& traced = handle.As<v8::Object>();
+  const v8::TracedReference<v8::Object>& traced =
+      handle.template As<v8::Object>();
   if (ToWrapperTypeInfo(traced)->IsActiveScriptWrappable() &&
       ToScriptWrappable(traced)->HasPendingActivity()) {
     return true;
@@ -165,8 +168,10 @@
   return false;
 }
 
+}  // namespace
+
 void UnifiedHeapController::ResetHandleInNonTracingGC(
-    const v8::TracedGlobal<v8::Value>& handle) {
+    const v8::TracedReference<v8::Value>& handle) {
   const uint16_t class_id = handle.WrapperClassId();
   // Only consider handles that have not been treated as roots, see
   // IsRootForNonTracingGCInternal.
@@ -174,15 +179,21 @@
       class_id != WrapperTypeInfo::kObjectClassId)
     return;
 
-  const v8::TracedGlobal<v8::Object>& traced = handle.As<v8::Object>();
+  const v8::TracedReference<v8::Object>& traced = handle.As<v8::Object>();
   ToScriptWrappable(traced)->UnsetWrapperIfAny();
 }
 
 bool UnifiedHeapController::IsRootForNonTracingGC(
-    const v8::TracedGlobal<v8::Value>& handle) {
+    const v8::TracedReference<v8::Value>& handle) {
   return IsRootForNonTracingGCInternal(handle);
 }
 
+bool UnifiedHeapController::IsRootForNonTracingGC(
+    const v8::TracedGlobal<v8::Value>& handle) {
+  CHECK(false) << "Blink does not use v8::TracedGlobal.";
+  return false;
+}
+
 void UnifiedHeapController::ReportBufferedAllocatedSizeIfPossible() {
   // Avoid reporting to V8 in the following conditions as that may trigger GC
   // finalizations where not allowed.
diff --git a/third_party/blink/renderer/platform/heap/unified_heap_controller.h b/third_party/blink/renderer/platform/heap/unified_heap_controller.h
index f8ca95c..5ec55f9 100644
--- a/third_party/blink/renderer/platform/heap/unified_heap_controller.h
+++ b/third_party/blink/renderer/platform/heap/unified_heap_controller.h
@@ -45,8 +45,9 @@
   void RegisterV8References(const std::vector<std::pair<void*, void*>>&) final;
   bool AdvanceTracing(double) final;
   bool IsTracingDone() final;
+  bool IsRootForNonTracingGC(const v8::TracedReference<v8::Value>&) final;
   bool IsRootForNonTracingGC(const v8::TracedGlobal<v8::Value>&) final;
-  void ResetHandleInNonTracingGC(const v8::TracedGlobal<v8::Value>&) final;
+  void ResetHandleInNonTracingGC(const v8::TracedReference<v8::Value>&) final;
 
   ThreadState* thread_state() const { return thread_state_; }
 
@@ -59,9 +60,6 @@
   void DecreaseAllocatedSpace(size_t) final {}
 
  private:
-  static bool IsRootForNonTracingGCInternal(
-      const v8::TracedGlobal<v8::Value>& handle);
-
   void ReportBufferedAllocatedSizeIfPossible();
 
   ThreadState* const thread_state_;
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
index b4d6e5d2..55ec5e8 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
@@ -265,10 +265,11 @@
   }
 
   std::vector<uint32_t> spatial_layer_frame_size;
-  for (int i = 0;; i++) {
+  size_t max_sl_index = input_image.SpatialIndex().value_or(0);
+  for (size_t i = 0; i <= max_sl_index; i++) {
     auto frame_size = input_image.SpatialLayerFrameSize(i);
     if (!frame_size)
-      break;
+      continue;
     spatial_layer_frame_size.push_back(*frame_size);
   }
 
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
index 237a11b7..ae46068 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/task/post_task.h"
 #include "base/task/sequence_manager/test/fake_task.h"
 #include "base/task/sequence_manager/test/sequence_manager_for_test.h"
 #include "base/task/task_executor.h"
@@ -2124,6 +2125,16 @@
   run_loop.Run();
 }
 
+TEST_P(MainThreadSchedulerImplTest, CurrentThread) {
+  EXPECT_EQ(scheduler_->DeprecatedDefaultTaskRunner(),
+            base::CreateSingleThreadTaskRunner({base::CurrentThread()}));
+
+  // base::TaskPriority is currently ignored in blink.
+  EXPECT_EQ(scheduler_->DeprecatedDefaultTaskRunner(),
+            base::CreateSingleThreadTaskRunner(
+                {base::CurrentThread(), base::TaskPriority::BEST_EFFORT}));
+}
+
 class MainThreadSchedulerImplWithMessageLoopTest
     : public MainThreadSchedulerImplTest {
  public:
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index 7f7551bd..3b3a77f 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -256,7 +256,7 @@
             'cc::LayerPositionConstraint',
             'cc::OverscrollBehavior',
             'cc::Scrollbar',
-            'cc::ScrollbarLayerInterface',
+            'cc::ScrollbarLayerBase',
             'cc::ScrollbarOrientation',
             'cc::ScrollbarPart',
             'cc::StickyPositionConstraint',
diff --git a/third_party/blink/web_tests/MSANExpectations b/third_party/blink/web_tests/MSANExpectations
index 5ff0fd8..afed031 100644
--- a/third_party/blink/web_tests/MSANExpectations
+++ b/third_party/blink/web_tests/MSANExpectations
@@ -158,6 +158,7 @@
 crbug.com/856601 [ Linux ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/idlharness.https.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ]
 crbug.com/856601 [ Linux ] virtual/service-worker-servicification/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ]
+crbug.com/856601 [ Linux ] virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Pass Failure Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/fetch/api/idl.any.sharedworker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/fetch/cors-rfc1918/idlharness.tentative.https.any.serviceworker.html [ Pass Timeout ]
@@ -275,6 +276,8 @@
 crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/api/idl.any.serviceworker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/api/idl.any.worker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] virtual/scalefactor200/external/wpt/css/filter-effects/interfaces.any.worker.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/webrtc-identity/idlharness.https.window.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/api/idlharness.any.worker.html [ Pass Timeout ]
 
 # Sheriff 2019-06-28
 crbug.com/856601 [ Linux ] external/wpt/battery-status/battery-interface-idlharness.https.window.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 3dacf150..94fd890 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -1920,6 +1920,9 @@
 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/fetch-event-is-reload-navigation-manual.https.html [ WontFix ]
 virtual/omt-worker-fetch/external/wpt/xhr/send-authentication-existing-session-manual.htm [ WontFix ]
 virtual/omt-worker-fetch/external/wpt/xhr/send-authentication-prompt-2-manual.htm [ WontFix ]
+virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-event-is-history-backward-navigation-manual.https.html [ WontFix ]
+virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-event-is-history-forward-navigation-manual.https.html [ WontFix ]
+virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-event-is-reload-navigation-manual.https.html [ WontFix ]
 virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-abort-manual.https.html [ WontFix ]
 virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-onerror-manual.https.html [ WontFix ]
 virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechRecognition-onresult-manual.https.html [ WontFix ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index bc538b4288..b7651de 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -199,6 +199,10 @@
 crbug.com/974652 [ Debug ] virtual/gpu/fast/canvas/OffscreenCanvas-copyImage.html [ Pass Failure ]
 crbug.com/974652 [ Debug ] fast/canvas/OffscreenCanvas-copyImage.html [ Pass Failure ]
 
+crbug.com/1011060 virtual/gpu/fast/canvas/canvas-getImageData-smooth.html [ Pass Failure ]
+crbug.com/1011060 virtual/gpu/fast/canvas/bug382588.html [ Pass Failure ]
+crbug.com/1011060 virtual/gpu/fast/canvas/canvas-lost-gpu-context.html [ Pass Failure ]
+
 crbug.com/974666 [ Mac10.13 ] http/tests/misc/object-embedding-svg-delayed-size-negotiation-2.htm [ Pass Failure ]
 crbug.com/974720 [ Mac10.13 ] fast/text/firstline/capitalize-transform-2.html [ Pass Crash ]
 crbug.com/974720 [ Mac10.13 ] fast/text/firstline/capitalize-transform.html [ Pass Crash ]
@@ -834,181 +838,14 @@
 # crbug.com/591099 [ Mac10.11 ] media/track/track-cue-rendering-position-auto-rtl.html [ Failure ]
 crbug.com/591099 [ Mac10.11 ] virtual/audio-service/media/track/track-cue-rendering-position-auto-rtl.html [ Failure ]
 crbug.com/591099 [ Mac10.11 ] virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/basic/inheritance.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/acid_test.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_bottom.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_bottom_width_inline.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_inline.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_left_width_inline.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_style_inline.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_top_width.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/clear_float.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/float.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/float_margin.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/margin_inline.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/margin_left.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/margin_top_inline.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/padding_left.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/padding_right.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/box_properties/padding_top_inline.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/classification/list_style.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/classification/list_style_image.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/classification/list_style_type.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/color_and_background/background.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/formatting_model/floating_elements.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/formatting_model/horizontal_formatting.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css1/units/percentage_units.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/20110323/table-height-algorithm-024.htm [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t040302-c61-phys-len-00-b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t051103-dom-hover-01-c-io.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0602-c13-inh-underlin-00-e.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5521-brdr-l-00-a.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5521-ibrdr-l-00-a.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5522-brdr-02-e.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5522-ibrdr-00-a.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0905-c414-flt-04-c.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0905-c414-flt-wrap-01-d-g.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0905-c5525-fltcont-00-d-g.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t0905-c5525-fltwrap-00-b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1004-c5524-width-00-b-g.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1202-counter-08-b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1202-counter-15-b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1202-counters-13-b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1205-c561-list-displ-00-b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1205-c565-list-pos-00-b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1205-c566-list-stl-01-c-g.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1508-c527-font-06-b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css2.1/t1508-c527-font-10-c.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/css3-modsel-35.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/font-feature-settings-rendering.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-168a.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-20.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-35.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-39.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-42.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-42a.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-5.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-7.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-78b.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-80.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-166.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-168a.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-20.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-3.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-39.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-42.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xhtml/css3-modsel-7.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-153.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-166a.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-168.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-20.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-22.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-3.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-42a.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-66.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-78b.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] css3/selectors3/xml/css3-modsel-79.xml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] editing/selection/4402375.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] editing/selection/5232159.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] editing/selection/line-wrap-1.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] editing/selection/select-text-overflow-ellipsis-mixed-in-rtl.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] editing/selection/select-text-overflow-ellipsis.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] external/wpt/css/css-position/position-absolute-replaced-minmax.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] external/wpt/css/css-rhythm/line-height-step-dynamic-001.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/backgrounds/animated-gif-as-background-rounded.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/backgrounds/repeat/negative-offset-repeat-transformed.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/backgrounds/repeat/negative-offset-repeat.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/backgrounds/selection-background-color-of-image-list-style.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/basic/015.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/basic/adding-near-anonymous-block.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/float/002.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/float/028.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/float/independent-align-positioning.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/float/nopaint-after-layer-destruction2.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/006.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/015.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/017.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/019.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/020.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/059.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/103.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/block-inside-inline/005.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/margin-collapse/block-inside-inline/016.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/001.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/058.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/absolute-in-inline-rtl-3.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/absolute-in-inline-rtl.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/auto/004.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/auto/006.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/auto/vertical-rl/004.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/auto/vertical-rl/006.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/block/positioning/vertical-lr/001.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/borders/border-image-scaled.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/borders/inline-mask-overlay-image-outset.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/borders/inline-mask-overlay-image.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/borders/outline-alpha-block.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/borders/rtl-border-01.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/borders/rtl-border-05.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/canvas/image-object-in-canvas.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/clip/007.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/clip/009.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/clip/010.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/compact/003.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/007.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/009.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/after-duplicated-after-split.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/before-with-first-letter.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css-generated-content/table-cell-before-after-child-add.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/005.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/ZeroOpacityLayers.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/absolute-poition-in-rtl-parent.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/clip-zooming.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/color-correction-on-text-shadow.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/color-correction.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/compare-content-style.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/content/content-quotes-01.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/content/content-quotes-05.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/create_element_align.xhtml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/find-next-layer.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/first-letter-capitalized.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/first-letter-float-after-float.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/focus-ring-outline-color.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/image-orientation/image-orientation-default.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/last-of-type-pseudo-class.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/only-child-pseudo-class.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/only-of-type-pseudo-class.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/pendingStylesheetFontSize.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/resize-corner-tracking-transformed-iframe.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/resize-corner-tracking-transformed.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/resize-corner-tracking.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/shadow-multiple.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/simple-selector-chain-parsing.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/text-overflow-ellipsis-text-align-center.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/text-overflow-ellipsis-text-align-justify.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/text-overflow-ellipsis-text-align-right.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/text-overflow-ellipsis.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/universal-hover-quirk.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/vertical-text-overflow-ellipsis-text-align-justify.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/vertical-text-overflow-ellipsis-text-align-left.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css/visibility-hit-test.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css3-text/css3-text-justify/text-justify-8bits.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/css3-text/css3-text-justify/text-justify-distribute.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/deprecated-flexbox/009-horizontal.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/deprecated-flexbox/010.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/deprecated-flexbox/018.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/deprecated-flexbox/023.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/dom/Range/collapsed-range-bounding-client-rect.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/dom/children-nodes.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/dom/nodesFromRect/nodesFromRect-basic.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/dynamic/007.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/dynamic/012.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/dynamic/insert-before-table-part-in-continuation.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] fast/dynamic/noninlinebadness.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] fast/dynamic/outerHTML-doc.html [ Failure ]
 #crbug.com/591099 [ Mac ] fast/events/before-unload-return-value-from-listener.html [ Crash Timeout ]
+crbug.com/591099 [ Mac10.13 ] css3/selectors3/html/css3-modsel-80.html [ Failure ]
+crbug.com/591099 [ Mac10.13 ] editing/selection/5232159.html [ Failure ]
+crbug.com/591099 [ Mac10.13 ] css2.1/t040302-c61-phys-len-00-b.html [ Failure ]
+crbug.com/591099 [ Mac10.13 ] css2.1/t1205-c561-list-displ-00-b.html [ Failure ]
+crbug.com/591099 [ Mac10.13 ] css2.1/t1202-counter-08-b.html [ Failure ]
+crbug.com/591099 [ Mac10.13 ] css2.1/t0805-c5522-brdr-02-e.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] fast/forms/basic-inputs.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] fast/forms/button/button-inner-block-reuse.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] fast/forms/formmove2.html [ Failure ]
@@ -2951,6 +2788,7 @@
 # Failure messages are unstable so we cannot create baselines.
 crbug.com/832071 external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ]
 crbug.com/832071 virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ]
+crbug.com/832071 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ]
 crbug.com/832071 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/worker-client-id.https.html [ Failure ]
 
 # failures in external/wpt/css/css-animations/ and web-animations/ from Mozilla tests
@@ -3283,6 +3121,7 @@
 crbug.com/626703 external/wpt/service-workers/service-worker/ready.https.html [ Timeout ]
 crbug.com/626703 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/ready.https.html [ Timeout ]
 crbug.com/626703 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/ready.https.html [ Timeout ]
+crbug.com/626703 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/ready.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/css/css-fonts/math-script-level-and-math-style/math-script-level-auto-and-math-style-002.tentative.html [ Failure ]
@@ -4435,11 +4274,13 @@
 crbug.com/691944 external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ]
 crbug.com/691944 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ]
 crbug.com/691944 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ]
+crbug.com/691944 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Skip ]
 
 # These tests (erroneously) see a platform-specific User-Agent header
 crbug.com/595993 external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ]
 crbug.com/595993 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ]
 crbug.com/595993 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ]
+crbug.com/595993 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-header-visibility.https.html [ Failure ]
 
 crbug.com/619427 [ Mac ] fast/overflow/overflow-height-float-not-removed-crash3.html [ Pass Failure ]
 
@@ -4697,6 +4538,7 @@
 
 # Service worker updates need to handle redirect appropriately.
 crbug.com/889798 external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ]
+crbug.com/889798 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ]
 crbug.com/889798 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ]
 crbug.com/889798 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/import-scripts-redirect.https.html [ Skip ]
 
@@ -5264,6 +5106,8 @@
 
 crbug.com/873873 external/wpt/service-workers/service-worker/fetch-canvas-tainting-video.https.html [ Timeout Pass ]
 crbug.com/873873 external/wpt/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html [ Timeout Pass ]
+crbug.com/873873 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-canvas-tainting-video.https.html [ Timeout Pass ]
+crbug.com/873873 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html [ Timeout Pass ]
 
 crbug.com/875884 [ Linux ] lifecycle/background-change-lifecycle-count.html [ Pass Failure ]
 crbug.com/875884 [ Win ] lifecycle/background-change-lifecycle-count.html [ Pass Failure ]
@@ -5582,6 +5426,7 @@
 crbug.com/933880 external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
 crbug.com/933880 virtual/omt-service-worker-startup/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
 crbug.com/933880 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
+crbug.com/933880 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
 crbug.com/933880 http/tests/inspector-protocol/network/interception-take-stream.js [ Failure ]
 crbug.com/933880 http/tests/inspector-protocol/network/xhr-interception-auth-fail.js [ Failure ]
 # This passes in content_shell but not in chrome with network service disabled,
@@ -6180,11 +6025,3 @@
 crbug.com/1010655 virtual/disable-deferred-rendering/fast/canvas/canvas-lost-gpu-context.html [ Failure ]
 crbug.com/1010657 [ Mac ] virtual/disable-deferred-rendering/fast/canvas/image-object-in-canvas.html [ Failure ]
 crbug.com/1011723 virtual/disable-deferred-rendering/fast/canvas/OffscreenCanvas-copyImage.html [ Failure ]
-
-# Sheriff 2019-10-04
-crbug.com/1011191 [ Mac ] paint/invalidation/svg/use-clipped-hit.svg  [ Pass Failure ]
-crbug.com/1011188 [ Mac ] paint/invalidation/svg/svg-background-partial-redraw.html [ Pass Failure ]
-
-# Sheriff 2019-10-09
-crbug.com/1012638 [ Mac ] paint/invalidation/push-block-with-first-line.html [ Pass Failure ]
-
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index eaa7f39..ef89c18 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1090,6 +1090,11 @@
     "args": ["--enable-blink-features=CSSVariables2AtProperty"]
   },
   {
+    "prefix": "cache-storage-sequence",
+    "base": "external/wpt/service-workers",
+    "args": ["--disable-features=CacheStorageSequence"]
+  },
+  {
     "prefix": "conditional-appcache-delay",
     "base": "http/tests/loading/appcache-delay",
     "args": ["--enable-features=VerifyHTMLFetchedFromAppCacheBeforeDelay"]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 11a5480..e9d33fde 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -124933,9 +124933,6 @@
    "common/canvas-tests.js.headers": [
     []
    ],
-   "common/css-red.txt": [
-    []
-   ],
    "common/domain-setter.sub.html": [
     []
    ],
@@ -125182,15 +125179,6 @@
    "compat/webkit-text-fill-color-property-006-ref.html": [
     []
    ],
-   "compression/pako/LICENSE": [
-    []
-   ],
-   "compression/pako/README": [
-    []
-   ],
-   "compression/pako/pako_inflate.min.js": [
-    []
-   ],
    "console/META.yml": [
     []
    ],
@@ -151615,6 +151603,12 @@
    "encoding/OWNERS": [
     []
    ],
+   "encoding/encodeInto.any-expected.txt": [
+    []
+   ],
+   "encoding/encodeInto.any.worker-expected.txt": [
+    []
+   ],
    "encoding/eof-shift_jis-ref.html": [
     []
    ],
@@ -152164,12 +152158,36 @@
    "encoding/resources/utf-32-little-endian-nobom.xml": [
     []
    ],
+   "encoding/streams/decode-utf8.any-expected.txt": [
+    []
+   ],
+   "encoding/streams/decode-utf8.any.serviceworker-expected.txt": [
+    []
+   ],
+   "encoding/streams/decode-utf8.any.sharedworker-expected.txt": [
+    []
+   ],
+   "encoding/streams/decode-utf8.any.worker-expected.txt": [
+    []
+   ],
    "encoding/streams/resources/readable-stream-from-array.js": [
     []
    ],
    "encoding/streams/resources/readable-stream-to-array.js": [
     []
    ],
+   "encoding/textdecoder-copy.any-expected.txt": [
+    []
+   ],
+   "encoding/textdecoder-copy.any.worker-expected.txt": [
+    []
+   ],
+   "encoding/textdecoder-streaming.any-expected.txt": [
+    []
+   ],
+   "encoding/textdecoder-streaming.any.worker-expected.txt": [
+    []
+   ],
    "encrypted-media/META.yml": [
     []
    ],
@@ -159217,6 +159235,9 @@
    "html/semantics/document-metadata/the-style-element/html_style_in_comment-ref.html": [
     []
    ],
+   "html/semantics/document-metadata/the-style-element/support/css-red.txt": [
+    []
+   ],
    "html/semantics/embedded-content/META.yml": [
     []
    ],
@@ -198339,68 +198360,6 @@
      {}
     ]
    ],
-   "compression/compression-stream.any.js": [
-    [
-     "compression/compression-stream.any.html",
-     {
-      "script_metadata": [
-       [
-        "global",
-        "worker"
-       ],
-       [
-        "script",
-        "pako/pako_inflate.min.js"
-       ]
-      ]
-     }
-    ],
-    [
-     "compression/compression-stream.any.serviceworker.html",
-     {
-      "script_metadata": [
-       [
-        "global",
-        "worker"
-       ],
-       [
-        "script",
-        "pako/pako_inflate.min.js"
-       ]
-      ]
-     }
-    ],
-    [
-     "compression/compression-stream.any.sharedworker.html",
-     {
-      "script_metadata": [
-       [
-        "global",
-        "worker"
-       ],
-       [
-        "script",
-        "pako/pako_inflate.min.js"
-       ]
-      ]
-     }
-    ],
-    [
-     "compression/compression-stream.any.worker.html",
-     {
-      "script_metadata": [
-       [
-        "global",
-        "worker"
-       ],
-       [
-        "script",
-        "pako/pako_inflate.min.js"
-       ]
-      ]
-     }
-    ]
-   ],
    "compression/decompression-bad-chunks.any.js": [
     [
      "compression/decompression-bad-chunks.any.html",
@@ -338521,7 +338480,7 @@
    "support"
   ],
   "common/README.md": [
-   "bbb651d4aff5689628a713e1ae904ee56c03a6e2",
+   "43bec9eb0af2d648969c9f32983963f09548f73d",
    "support"
   ],
   "common/arrays.js": [
@@ -338572,10 +338531,6 @@
    "6805c323df5a975231648b830e33ce183c3cbbd3",
    "support"
   ],
-  "common/css-red.txt": [
-   "9ef04cbd12daf19dd8810cae8844bd22f3264926",
-   "support"
-  ],
   "common/domain-setter.sub.html": [
    "ad3b9f8b80847ff811aa8f3083dc9c5fcf221f05",
    "support"
@@ -338992,10 +338947,6 @@
    "1d3965fca6769c70bc02308a4c70b4e58c8990e5",
    "reftest"
   ],
-  "compression/compression-stream.any.js": [
-   "d143241e7606b240908ef366b82b0b9c56b2d59d",
-   "testharness"
-  ],
   "compression/decompression-bad-chunks.any.js": [
    "b8954905cbfce79893152e32200cc16e6c3f815b",
    "testharness"
@@ -339024,18 +338975,6 @@
    "06c421a82071651429e831daaa20e945e8011efb",
    "testharness"
   ],
-  "compression/pako/LICENSE": [
-   "a934ef8db478453e38b2f29af67610916fa9fc99",
-   "support"
-  ],
-  "compression/pako/README": [
-   "96028388ebb9d556db918bbe234e8b971734824a",
-   "support"
-  ],
-  "compression/pako/pako_inflate.min.js": [
-   "a191a78a8956cddf28adaf7542631123014a04bf",
-   "support"
-  ],
   "console/META.yml": [
    "60c95d0d579c57eee3c2c0b47004b371c24d2e56",
    "support"
@@ -419429,7 +419368,7 @@
    "testharness"
   ],
   "css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html": [
-   "062edaf8f2dbe99012483f5a10bbf9c2e98fccac",
+   "e308c7c004f8415a5bf1ee886b681fb84780717c",
    "testharness"
   ],
   "css/cssom-view/scrollLeftTop-expected.txt": [
@@ -432852,10 +432791,18 @@
    "7260b6b155b13de3961d170c3e2868042e229305",
    "testharness"
   ],
+  "encoding/encodeInto.any-expected.txt": [
+   "adb30e4f0c26afb144d946e6cd655ca9e368bb1e",
+   "support"
+  ],
   "encoding/encodeInto.any.js": [
-   "8b3e743f71b9ce6869810385403e0a7e9c3067c6",
+   "7ea0b80eeb458d48d0e00e0122ded86a0d26bb81",
    "testharness"
   ],
+  "encoding/encodeInto.any.worker-expected.txt": [
+   "adb30e4f0c26afb144d946e6cd655ca9e368bb1e",
+   "support"
+  ],
   "encoding/eof-shift_jis-ref.html": [
    "b90f8032a31db260902c2c04b671b30ee9c62c8e",
    "support"
@@ -434049,7 +433996,7 @@
    "testharness"
   ],
   "encoding/streams/decode-bad-chunks.any.js": [
-   "de2ba74c1016a1d44074179ad976987a6220d2ba",
+   "9f00df2e1495dc9271aa642e47660c7376ca07f3",
    "testharness"
   ],
   "encoding/streams/decode-ignore-bom.any.js": [
@@ -434068,10 +434015,26 @@
    "6c022697da65ea10ee72da38609e8edbf695edab",
    "testharness"
   ],
+  "encoding/streams/decode-utf8.any-expected.txt": [
+   "67af6ac18498b075fa633d64684d023d46408125",
+   "support"
+  ],
   "encoding/streams/decode-utf8.any.js": [
-   "266899c6c965f764b62f4ef149bb4026ccccb339",
+   "421b98c2eea537eaebb31d1865e9eef499ce98f8",
    "testharness"
   ],
+  "encoding/streams/decode-utf8.any.serviceworker-expected.txt": [
+   "67af6ac18498b075fa633d64684d023d46408125",
+   "support"
+  ],
+  "encoding/streams/decode-utf8.any.sharedworker-expected.txt": [
+   "67af6ac18498b075fa633d64684d023d46408125",
+   "support"
+  ],
+  "encoding/streams/decode-utf8.any.worker-expected.txt": [
+   "67af6ac18498b075fa633d64684d023d46408125",
+   "support"
+  ],
   "encoding/streams/encode-bad-chunks.any.js": [
    "868e34b7342969b20145af44fd1d606499ec9ad1",
    "testharness"
@@ -434100,10 +434063,18 @@
    "9ef0d73141a0e0ceaafba61cc101986afa32477d",
    "testharness"
   ],
+  "encoding/textdecoder-copy.any-expected.txt": [
+   "54db5fca004b95505db390ac1d6d11e8f6d0a348",
+   "support"
+  ],
   "encoding/textdecoder-copy.any.js": [
-   "ef8e4fdb3b03eb9e3ca51c97b681e2ffe0ec5cee",
+   "6ae65119db687c438c0f60595e3614c09434c4b9",
    "testharness"
   ],
+  "encoding/textdecoder-copy.any.worker-expected.txt": [
+   "54db5fca004b95505db390ac1d6d11e8f6d0a348",
+   "support"
+  ],
   "encoding/textdecoder-fatal-single-byte.any.js": [
    "d3e9ae9c9a7774ee9ab11f3c6275f2c6a0275c8a",
    "testharness"
@@ -434124,10 +434095,18 @@
    "ed407a3254792398d5109d0d1ee5fbee5e9ef093",
    "testharness"
   ],
+  "encoding/textdecoder-streaming.any-expected.txt": [
+   "cf065370af6b02fa26542c4f7c2b59908d4a1a3a",
+   "support"
+  ],
   "encoding/textdecoder-streaming.any.js": [
-   "0863385b9af42db2a43edccfe43e313aa45035ef",
+   "e0c59472598fbd828305816e4e8a0b161244862f",
    "testharness"
   ],
+  "encoding/textdecoder-streaming.any.worker-expected.txt": [
+   "cf065370af6b02fa26542c4f7c2b59908d4a1a3a",
+   "support"
+  ],
   "encoding/textdecoder-utf16-surrogates.any.js": [
    "3b8418703da77d2052ebaa5104d8bfd22f131c81",
    "testharness"
@@ -450336,6 +450315,10 @@
    "a19b3c86d7542f3b65e81836a94914a8ae7cffa8",
    "testharness"
   ],
+  "html/semantics/document-metadata/the-style-element/support/css-red.txt": [
+   "9ef04cbd12daf19dd8810cae8844bd22f3264926",
+   "support"
+  ],
   "html/semantics/document-metadata/the-title-element/title.text-01.html": [
    "7f25400ea89ca7835b72fdb1eb21fcb220f2cd01",
    "testharness"
@@ -499909,7 +499892,7 @@
    "support"
   ],
   "tools/ci/manifest_build.py": [
-   "3159dc8f16dd647303f5bcc4172e09ed59209865",
+   "ade17d6be40d80751de12b0d462a8f531bbe9059",
    "support"
   ],
   "tools/ci/run_tc.py": [
@@ -504401,11 +504384,11 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/firefox.py": [
-   "1763ff44b4e55c14c8f5d753defb3ba39e017262",
+   "781d7e31c43c01c0a33328e1dc921f4f536d5296",
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/firefox_android.py": [
-   "30e53a593cff7ec3fa026c2a4f2495402650c1dc",
+   "30d0825a8ca373d4cd902bbe54966b32be66f22f",
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/ie.py": [
@@ -504737,7 +504720,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/wpttest.py": [
-   "2ce15a0d9c7f85339caadecc017f178ee0245d27",
+   "80db17a3c7284cd82145a3d20c3532a0e79c82a4",
    "support"
   ],
   "tools/wptserve/LICENSE": [
diff --git a/third_party/blink/web_tests/external/wpt/common/README.md b/third_party/blink/web_tests/external/wpt/common/README.md
index bbb651d..43bec9e 100644
--- a/third_party/blink/web_tests/external/wpt/common/README.md
+++ b/third_party/blink/web_tests/external/wpt/common/README.md
@@ -1,7 +1,6 @@
 The files in this directory are non-infrastructure support files that can be used by tests.
 
 * `blank.html` - An empty HTML document.
-* `css-red.txt` - A text/plain "CSS" document.
 * `domain-setter.sub.html` - An HTML document that sets `document.domain`.
 * `dummy.xhtml` - An XHTML document.
 * `dummy.xml` - An XML document.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
index 1b32cf43..3a100a48 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
@@ -1,12 +1,5 @@
 This is a testharness.js-based test.
-FAIL .grid 1 assert_equals: 
-<div class="grid">
-  <div data-offset-x="5" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="180" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="0" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn RTL">X XX X</div>
-  <div data-offset-x="105" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 180 but got 210
+PASS .grid 1
 FAIL .grid 2 assert_equals: 
 <div class="grid RTL">
   <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
@@ -14,7 +7,7 @@
   <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
   <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
-offsetLeft expected 80 but got 110
+offsetLeft expected 35 but got 5
 PASS .grid 3
 FAIL .grid 4 assert_equals: 
 <div class="grid verticalRL">
@@ -23,6 +16,6 @@
   <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
   <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
-offsetLeft expected 105 but got 75
+offsetTop expected 115 but got 110
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
index 1b32cf43..3a100a48 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
@@ -1,12 +1,5 @@
 This is a testharness.js-based test.
-FAIL .grid 1 assert_equals: 
-<div class="grid">
-  <div data-offset-x="5" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="180" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="0" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn RTL">X XX X</div>
-  <div data-offset-x="105" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 180 but got 210
+PASS .grid 1
 FAIL .grid 2 assert_equals: 
 <div class="grid RTL">
   <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
@@ -14,7 +7,7 @@
   <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
   <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
-offsetLeft expected 80 but got 110
+offsetLeft expected 35 but got 5
 PASS .grid 3
 FAIL .grid 4 assert_equals: 
 <div class="grid verticalRL">
@@ -23,6 +16,6 @@
   <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
   <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
-offsetLeft expected 105 but got 75
+offsetTop expected 115 but got 110
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/win/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
rename to third_party/blink/web_tests/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html
index 062edaf..e308c7c0 100644
--- a/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html
+++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<title>The maximum value of scrollLeft shouldn't be affected by scrollbar when it's wider than scroller</title>
+<title>The maximum value of scrollLeft shouldn't be affected by scrollbar even if it's wider than scroller</title>
 <meta charset="utf-8">
 <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollleft">
 
@@ -12,5 +12,5 @@
     test(function() {
         scroller.scrollLeft = 1000;
         assert_equals(scroller.scrollLeft, 100);
-    }, "Test the maxium value of scrollLeft");
+    }, "Test the maxmium value of scrollLeft");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/morphology-mirrored.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/morphology-mirrored.html
new file mode 100644
index 0000000..f0338e1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/morphology-mirrored.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>feMorphology filter on mirrored content</title>
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#feMorphologyElement">
+<link rel="match" href="reference/green-100x100.html">
+<svg>
+  <filter id="dilate" filterUnits="userSpaceOnUse"
+          color-interpolation-filters="sRGB">
+    <feMorphology operator="dilate" radius="10"/>
+  </filter>
+  <rect width="100" height="100" fill="red"/>
+  <rect x="10" y="10" width="80" height="30" fill="green" filter="url(#dilate)"
+        transform="translate(0, 50) scale(1, -1)"/>
+  <rect x="10" y="60" width="80" height="30" fill="green" filter="url(#dilate)"
+        transform="translate(100, 0) scale(-1, 1)"/>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any-expected.txt
new file mode 100644
index 0000000..adb30e4f0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any-expected.txt
@@ -0,0 +1,109 @@
+This is a testharness.js-based test.
+Found 105 tests; 63 PASS, 42 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS Invalid encodeInto() destination: DataView, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: DataView, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Int8Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Int8Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Int16Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Int16Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Int32Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Int32Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Uint16Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Uint16Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Uint32Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Uint32Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Uint8ClampedArray, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Uint8ClampedArray, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Float32Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Float32Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Float64Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Float64Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: ArrayBuffer
+PASS Invalid encodeInto() destination: SharedArrayBuffer
+PASS encodeInto() and a detached output buffer
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.js b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.js
index 8b3e743..7ea0b80 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.js
+++ b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.js
@@ -74,44 +74,46 @@
       "filler": "random"
     }
   ].forEach(destinationData => {
-    test(() => {
-      // Setup
-      const bufferLength = testData.destinationLength + destinationData.bufferIncrease,
-            destinationOffset = destinationData.destinationOffset,
-            destinationLength = testData.destinationLength,
-            destinationFiller = destinationData.filler,
-            encoder = new TextEncoder(),
-            buffer = new ArrayBuffer(bufferLength),
-            view = new Uint8Array(buffer, destinationOffset, destinationLength),
-            fullView = new Uint8Array(buffer),
-            control = new Array(bufferLength);
-      let byte = destinationFiller;
-      for (let i = 0; i < bufferLength; i++) {
-        if (destinationFiller === "random") {
-          byte = Math.floor(Math.random() * 256);
+    ["ArrayBuffer", "SharedArrayBuffer"].forEach(arrayBufferOrSharedArrayBuffer => {
+      test(() => {
+        // Setup
+        const bufferLength = testData.destinationLength + destinationData.bufferIncrease,
+              destinationOffset = destinationData.destinationOffset,
+              destinationLength = testData.destinationLength,
+              destinationFiller = destinationData.filler,
+              encoder = new TextEncoder(),
+              buffer = new self[arrayBufferOrSharedArrayBuffer](bufferLength),
+              view = new Uint8Array(buffer, destinationOffset, destinationLength),
+              fullView = new Uint8Array(buffer),
+              control = new Array(bufferLength);
+        let byte = destinationFiller;
+        for (let i = 0; i < bufferLength; i++) {
+          if (destinationFiller === "random") {
+            byte = Math.floor(Math.random() * 256);
+          }
+          control[i] = byte;
+          fullView[i] = byte;
         }
-        control[i] = byte;
-        fullView[i] = byte;
-      }
 
-      // It's happening
-      const result = encoder.encodeInto(testData.input, view);
+        // It's happening
+        const result = encoder.encodeInto(testData.input, view);
 
-      // Basics
-      assert_equals(view.byteLength, destinationLength);
-      assert_equals(view.length, destinationLength);
+        // Basics
+        assert_equals(view.byteLength, destinationLength);
+        assert_equals(view.length, destinationLength);
 
-      // Remainder
-      assert_equals(result.read, testData.read);
-      assert_equals(result.written, testData.written.length);
-      for (let i = 0; i < bufferLength; i++) {
-        if (i < destinationOffset || i >= (destinationOffset + testData.written.length)) {
-          assert_equals(fullView[i], control[i]);
-        } else {
-          assert_equals(fullView[i], testData.written[i - destinationOffset]);
+        // Remainder
+        assert_equals(result.read, testData.read);
+        assert_equals(result.written, testData.written.length);
+        for (let i = 0; i < bufferLength; i++) {
+          if (i < destinationOffset || i >= (destinationOffset + testData.written.length)) {
+            assert_equals(fullView[i], control[i]);
+          } else {
+            assert_equals(fullView[i], testData.written[i - destinationOffset]);
+          }
         }
-      }
-    }, "encodeInto() with " + testData.input + " and destination length " + testData.destinationLength + ", offset " + destinationData.destinationOffset + ", filler " + destinationData.filler);
+      }, "encodeInto() into "  + arrayBufferOrSharedArrayBuffer + " with " + testData.input + " and destination length " + testData.destinationLength + ", offset " + destinationData.destinationOffset + ", filler " + destinationData.filler);
+    })
   });
 });
 
@@ -124,14 +126,20 @@
  Uint8ClampedArray,
  Float32Array,
  Float64Array].forEach(view => {
-  test(() => {
-    assert_throws(new TypeError(), () => new TextEncoder().encodeInto("", new view(new ArrayBuffer(0))));
-  }, "Invalid encodeInto() destination: " + view.name);
- });
+  ["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
+    test(() => {
+      assert_throws(new TypeError(), () => new TextEncoder().encodeInto("", new view(new self[arrayBufferOrSharedArrayBuffer](0))));
+    }, "Invalid encodeInto() destination: " + view.name + ", backed by: " + arrayBufferOrSharedArrayBuffer);
+  });
+});
 
-test(() => {
-  assert_throws(new TypeError(), () => new TextEncoder().encodeInto("", new ArrayBuffer(10)));
-}, "Invalid encodeInto() destination: ArrayBuffer");
+["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
+  test(() => {
+    assert_throws(new TypeError(), () => new TextEncoder().encodeInto("", new self[arrayBufferOrSharedArrayBuffer](10)));
+  }, "Invalid encodeInto() destination: " + arrayBufferOrSharedArrayBuffer);
+});
+
+
 
 test(() => {
   const buffer = new ArrayBuffer(10),
diff --git a/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.worker-expected.txt
new file mode 100644
index 0000000..adb30e4f0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/encodeInto.any.worker-expected.txt
@@ -0,0 +1,109 @@
+This is a testharness.js-based test.
+Found 105 tests; 63 PASS, 42 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with Hi and destination length 0, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with Hi and destination length 0, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with A and destination length 10, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with A and destination length 10, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆 and destination length 4, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with 𝌆 and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with 𝌆A and destination length 3, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with 𝌆A and destination length 3, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with U+d834AU+df06A¥Hi and destination length 10, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with AU+df06 and destination length 4, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with AU+df06 and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler 0
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler 0
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler 0 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler 128
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler 128
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler 128 Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 0, filler random
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 0, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS encodeInto() into ArrayBuffer with ¥¥ and destination length 4, offset 4, filler random
+FAIL encodeInto() into SharedArrayBuffer with ¥¥ and destination length 4, offset 4, filler random Failed to execute 'encodeInto' on 'TextEncoder': The provided ArrayBufferView value must not be shared.
+PASS Invalid encodeInto() destination: DataView, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: DataView, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Int8Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Int8Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Int16Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Int16Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Int32Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Int32Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Uint16Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Uint16Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Uint32Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Uint32Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Uint8ClampedArray, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Uint8ClampedArray, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Float32Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Float32Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: Float64Array, backed by: ArrayBuffer
+PASS Invalid encodeInto() destination: Float64Array, backed by: SharedArrayBuffer
+PASS Invalid encodeInto() destination: ArrayBuffer
+PASS Invalid encodeInto() destination: SharedArrayBuffer
+PASS encodeInto() and a detached output buffer
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-bad-chunks.any.js b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-bad-chunks.any.js
index de2ba74..9f00df2e 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-bad-chunks.any.js
+++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-bad-chunks.any.js
@@ -22,20 +22,6 @@
   {
     name: 'array',
     value: [65]
-  },
-  {
-    name: 'SharedArrayBuffer',
-    // Use a getter to postpone construction so that all tests don't fail where
-    // SharedArrayBuffer is not yet implemented.
-    get value() {
-      return new SharedArrayBuffer();
-    }
-  },
-  {
-    name: 'shared Uint8Array',
-    get value() {
-      new Uint8Array(new SharedArrayBuffer())
-    }
   }
 ];
 
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any-expected.txt
new file mode 100644
index 0000000..67af6ac
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS decoding one UTF-8 chunk should give one output string - ArrayBuffer
+PASS decoding an empty chunk should give no output chunks - ArrayBuffer
+PASS an initial empty chunk should be ignored - ArrayBuffer
+PASS a trailing empty chunk should be ignored- ArrayBuffer
+FAIL decoding one UTF-8 chunk should give one output string - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL decoding an empty chunk should give no output chunks - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL an initial empty chunk should be ignored - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL a trailing empty chunk should be ignored- SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+PASS decoding a transferred Uint8Array chunk should give no output
+PASS decoding a transferred ArrayBuffer chunk should give no output
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.js b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.js
index 266899c..421b98c2 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.js
+++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.js
@@ -4,41 +4,48 @@
 
 'use strict';
 
-const emptyChunk = new Uint8Array([]);
-const inputChunk = new Uint8Array([73, 32, 240, 159, 146, 153, 32, 115, 116,
-                                   114, 101, 97, 109, 115]);
-const expectedOutputString = 'I \u{1F499} streams';
+["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
+  const inputChunkData = [73, 32, 240, 159, 146, 153, 32, 115, 116,
+                          114, 101, 97, 109, 115]
 
-promise_test(async () => {
-  const input = readableStreamFromArray([inputChunk]);
-  const output = input.pipeThrough(new TextDecoderStream());
-  const array = await readableStreamToArray(output);
-  assert_array_equals(array, [expectedOutputString],
-                      'the output should be in one chunk');
-}, 'decoding one UTF-8 chunk should give one output string');
+  const emptyChunk = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](0));
+  const inputChunk = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](inputChunkData.length));
 
-promise_test(async () => {
-  const input = readableStreamFromArray([emptyChunk]);
-  const output = input.pipeThrough(new TextDecoderStream());
-  const array = await readableStreamToArray(output);
-  assert_array_equals(array, [], 'no chunks should be output');
-}, 'decoding an empty chunk should give no output chunks');
+  inputChunk.set(inputChunkData);
 
-promise_test(async () => {
-  const input = readableStreamFromArray([emptyChunk, inputChunk]);
-  const output = input.pipeThrough(new TextDecoderStream());
-  const array = await readableStreamToArray(output);
-  assert_array_equals(array, [expectedOutputString],
-                      'the output should be in one chunk');
-}, 'an initial empty chunk should be ignored');
+  const expectedOutputString = 'I \u{1F499} streams';
 
-promise_test(async () => {
-  const input = readableStreamFromArray([inputChunk, emptyChunk]);
-  const output = input.pipeThrough(new TextDecoderStream());
-  const array = await readableStreamToArray(output);
-  assert_array_equals(array, [expectedOutputString],
-                      'the output should be in one chunk');
-}, 'a trailing empty chunk should be ignored');
+  promise_test(async () => {
+    const input = readableStreamFromArray([inputChunk]);
+    const output = input.pipeThrough(new TextDecoderStream());
+    const array = await readableStreamToArray(output);
+    assert_array_equals(array, [expectedOutputString],
+                        'the output should be in one chunk');
+  }, 'decoding one UTF-8 chunk should give one output string - ' + arrayBufferOrSharedArrayBuffer);
+
+  promise_test(async () => {
+    const input = readableStreamFromArray([emptyChunk]);
+    const output = input.pipeThrough(new TextDecoderStream());
+    const array = await readableStreamToArray(output);
+    assert_array_equals(array, [], 'no chunks should be output');
+  }, 'decoding an empty chunk should give no output chunks - ' + arrayBufferOrSharedArrayBuffer);
+
+  promise_test(async () => {
+    const input = readableStreamFromArray([emptyChunk, inputChunk]);
+    const output = input.pipeThrough(new TextDecoderStream());
+    const array = await readableStreamToArray(output);
+    assert_array_equals(array, [expectedOutputString],
+                        'the output should be in one chunk');
+  }, 'an initial empty chunk should be ignored - ' + arrayBufferOrSharedArrayBuffer);
+
+  promise_test(async () => {
+    const input = readableStreamFromArray([inputChunk, emptyChunk]);
+    const output = input.pipeThrough(new TextDecoderStream());
+    const array = await readableStreamToArray(output);
+    assert_array_equals(array, [expectedOutputString],
+                        'the output should be in one chunk');
+  }, 'a trailing empty chunk should be ignored- ' + arrayBufferOrSharedArrayBuffer);
+});
 
 promise_test(async () => {
   const buffer = new ArrayBuffer(3);
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt
new file mode 100644
index 0000000..67af6ac
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.serviceworker-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS decoding one UTF-8 chunk should give one output string - ArrayBuffer
+PASS decoding an empty chunk should give no output chunks - ArrayBuffer
+PASS an initial empty chunk should be ignored - ArrayBuffer
+PASS a trailing empty chunk should be ignored- ArrayBuffer
+FAIL decoding one UTF-8 chunk should give one output string - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL decoding an empty chunk should give no output chunks - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL an initial empty chunk should be ignored - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL a trailing empty chunk should be ignored- SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+PASS decoding a transferred Uint8Array chunk should give no output
+PASS decoding a transferred ArrayBuffer chunk should give no output
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt
new file mode 100644
index 0000000..67af6ac
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.sharedworker-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS decoding one UTF-8 chunk should give one output string - ArrayBuffer
+PASS decoding an empty chunk should give no output chunks - ArrayBuffer
+PASS an initial empty chunk should be ignored - ArrayBuffer
+PASS a trailing empty chunk should be ignored- ArrayBuffer
+FAIL decoding one UTF-8 chunk should give one output string - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL decoding an empty chunk should give no output chunks - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL an initial empty chunk should be ignored - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL a trailing empty chunk should be ignored- SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+PASS decoding a transferred Uint8Array chunk should give no output
+PASS decoding a transferred ArrayBuffer chunk should give no output
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt
new file mode 100644
index 0000000..67af6ac
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/streams/decode-utf8.any.worker-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+PASS decoding one UTF-8 chunk should give one output string - ArrayBuffer
+PASS decoding an empty chunk should give no output chunks - ArrayBuffer
+PASS an initial empty chunk should be ignored - ArrayBuffer
+PASS a trailing empty chunk should be ignored- ArrayBuffer
+FAIL decoding one UTF-8 chunk should give one output string - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL decoding an empty chunk should give no output chunks - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL an initial empty chunk should be ignored - SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+FAIL a trailing empty chunk should be ignored- SharedArrayBuffer promise_test: Unhandled rejection with value: object "TypeError: The provided ArrayBufferView value must not be shared."
+PASS decoding a transferred Uint8Array chunk should give no output
+PASS decoding a transferred ArrayBuffer chunk should give no output
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any-expected.txt
new file mode 100644
index 0000000..54db5fca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+PASS Modify buffer after passing it in (ArrayBuffer)
+FAIL Modify buffer after passing it in (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.js b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.js
index ef8e4fd..6ae6511 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.js
+++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.js
@@ -1,15 +1,17 @@
-test(() => {
-  const buf = new ArrayBuffer(2),
-        view = new Uint8Array(buf),
-        buf2 = new ArrayBuffer(2),
-        view2 = new Uint8Array(buf2),
-        decoder = new TextDecoder("utf-8")
-  view[0] = 0xEF
-  view[1] = 0xBB
-  view2[0] = 0xBF
-  view2[1] = 0x40
-  assert_equals(decoder.decode(buf, {stream:true}), "")
-  view[0] = 0x01
-  view[1] = 0x02
-  assert_equals(decoder.decode(buf2), "@")
-}, "Modify buffer after passing it in")
+["ArrayBuffer", "SharedArrayBuffer"].forEach(arrayBufferOrSharedArrayBuffer => {
+  test(() => {
+    const buf = new self[arrayBufferOrSharedArrayBuffer](2),
+          view = new Uint8Array(buf),
+          buf2 = new self[arrayBufferOrSharedArrayBuffer](2),
+          view2 = new Uint8Array(buf2),
+          decoder = new TextDecoder("utf-8");
+    view[0] = 0xEF;
+    view[1] = 0xBB;
+    view2[0] = 0xBF;
+    view2[1] = 0x40;
+    assert_equals(decoder.decode(buf, {stream:true}), "");
+    view[0] = 0x01;
+    view[1] = 0x02;
+    assert_equals(decoder.decode(buf2), "@");
+  }, "Modify buffer after passing it in (" + arrayBufferOrSharedArrayBuffer  + ")");
+});
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.worker-expected.txt
new file mode 100644
index 0000000..54db5fca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-copy.any.worker-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+PASS Modify buffer after passing it in (ArrayBuffer)
+FAIL Modify buffer after passing it in (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any-expected.txt
new file mode 100644
index 0000000..cf06537
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any-expected.txt
@@ -0,0 +1,33 @@
+This is a testharness.js-based test.
+PASS Streaming decode: utf-8, 1 byte window (ArrayBuffer)
+PASS Streaming decode: utf-8, 2 byte window (ArrayBuffer)
+PASS Streaming decode: utf-8, 3 byte window (ArrayBuffer)
+PASS Streaming decode: utf-8, 4 byte window (ArrayBuffer)
+PASS Streaming decode: utf-8, 5 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 1 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 2 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 3 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 4 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 5 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 1 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 2 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 3 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 4 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 5 byte window (ArrayBuffer)
+FAIL Streaming decode: utf-8, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-8, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-8, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-8, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-8, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.js b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.js
index 0863385b..e0c5947 100644
--- a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.js
+++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.js
@@ -16,21 +16,25 @@
                  0xDF,0xFF]
 };
 
-Object.keys(octets).forEach(function(encoding) {
-    for (var len = 1; len <= 5; ++len) {
-        test(function() {
-            var encoded = octets[encoding];
+["ArrayBuffer", "SharedArrayBuffer"].forEach((arrayBufferOrSharedArrayBuffer) => {
+    Object.keys(octets).forEach(function(encoding) {
+        for (var len = 1; len <= 5; ++len) {
+            test(function() {
+                var encoded = octets[encoding];
 
-            var out = '';
-            var decoder = new TextDecoder(encoding);
-            for (var i = 0; i < encoded.length; i += len) {
-                var sub = [];
-                for (var j = i; j < encoded.length && j < i + len; ++j)
-                    sub.push(encoded[j]);
-                out += decoder.decode(new Uint8Array(sub), {stream: true});
-            }
-            out += decoder.decode();
-            assert_equals(out, string);
-        }, 'Streaming decode: ' + encoding + ', ' + len + ' byte window');
-    }
-});
+                var out = '';
+                var decoder = new TextDecoder(encoding);
+                for (var i = 0; i < encoded.length; i += len) {
+                    var sub = [];
+                    for (var j = i; j < encoded.length && j < i + len; ++j)
+                        sub.push(encoded[j]);
+                        var uintArray = new Uint8Array(new self[arrayBufferOrSharedArrayBuffer](sub.length));
+                        uintArray.set(sub);
+                    out += decoder.decode(uintArray, {stream: true});
+                }
+                out += decoder.decode();
+                assert_equals(out, string);
+            }, 'Streaming decode: ' + encoding + ', ' + len + ' byte window (' + arrayBufferOrSharedArrayBuffer + ')');
+        }
+    });
+})
diff --git a/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.worker-expected.txt
new file mode 100644
index 0000000..cf06537
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/encoding/textdecoder-streaming.any.worker-expected.txt
@@ -0,0 +1,33 @@
+This is a testharness.js-based test.
+PASS Streaming decode: utf-8, 1 byte window (ArrayBuffer)
+PASS Streaming decode: utf-8, 2 byte window (ArrayBuffer)
+PASS Streaming decode: utf-8, 3 byte window (ArrayBuffer)
+PASS Streaming decode: utf-8, 4 byte window (ArrayBuffer)
+PASS Streaming decode: utf-8, 5 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 1 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 2 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 3 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 4 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16le, 5 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 1 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 2 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 3 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 4 byte window (ArrayBuffer)
+PASS Streaming decode: utf-16be, 5 byte window (ArrayBuffer)
+FAIL Streaming decode: utf-8, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-8, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-8, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-8, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-8, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16le, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 1 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 2 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 3 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 4 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+FAIL Streaming decode: utf-16be, 5 byte window (SharedArrayBuffer) Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/common/css-red.txt b/third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-style-element/support/css-red.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/common/css-red.txt
rename to third_party/blink/web_tests/external/wpt/html/semantics/document-metadata/the-style-element/support/css-red.txt
diff --git a/third_party/blink/web_tests/external/wpt/tools/ci/manifest_build.py b/third_party/blink/web_tests/external/wpt/tools/ci/manifest_build.py
index 3159dc8..ade17d6 100644
--- a/third_party/blink/web_tests/external/wpt/tools/ci/manifest_build.py
+++ b/third_party/blink/web_tests/external/wpt/tools/ci/manifest_build.py
@@ -39,7 +39,7 @@
 def compress_manifest(path):
     for args in [["gzip", "-k", "-f", "--best"],
                  ["bzip2", "-k", "-f", "--best"],
-                 ["zstd", "-k", "-f", "--ultra", "-22"]]:
+                 ["zstd", "-k", "-f", "--ultra", "-22", "-q"]]:
         run(args + [path])
 
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
index 1763ff44..781d7e31 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -153,18 +153,35 @@
 
 def run_info_extras(**kwargs):
 
-    def get_bool_pref(pref):
+    def get_bool_pref_if_exists(pref):
         for key, value in kwargs.get('extra_prefs', []):
             if pref == key:
                 return value.lower() in ('true', '1')
-        return False
+        return None
+
+    def get_bool_pref(pref):
+        pref_value = get_bool_pref_if_exists(pref)
+        return pref_value if pref_value is not None else False
 
     rv = {"e10s": kwargs["gecko_e10s"],
           "wasm": kwargs.get("wasm", True),
           "verify": kwargs["verify"],
           "headless": kwargs.get("headless", False) or "MOZ_HEADLESS" in os.environ,
-          "fission": get_bool_pref("fission.autostart"),
-          "sw-e10s": get_bool_pref("dom.serviceWorkers.parent_intercept")}
+          "fission": get_bool_pref("fission.autostart")}
+
+    # The value of `sw-e10s` defaults to whether the "parent_intercept"
+    # implementation is enabled for the current build. This value, however,
+    # can be overridden by explicitly setting the pref with the `--setpref` CLI
+    # flag, which is checked here. If not supplied, the default value of
+    # `sw-e10s` will be filled in in `RunInfo`'s constructor.
+    #
+    # We can't capture the default value right now because (currently), it
+    # defaults to the value of `nightly_build`, which isn't known until
+    # `RunInfo`'s constructor.
+    sw_e10s_override = get_bool_pref_if_exists("dom.serviceWorkers.parent_intercept")
+    if sw_e10s_override is not None:
+        rv["sw-e10s"] = sw_e10s_override
+
     rv.update(run_info_browser_version(kwargs["binary"]))
     return rv
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
index 30e53a59..30d0825 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -67,8 +67,7 @@
 def run_info_extras(**kwargs):
     package = kwargs["package_name"]
     rv = {"e10s": True if package is not None and "geckoview" in package else False,
-          "headless": False,
-          "sw-e10s": False}
+          "headless": False}
     rv.update(run_info_browser_version(kwargs["binary"]))
     return rv
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py
index 2ce15a0..80db17a3 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py
@@ -112,6 +112,18 @@
         if extras is not None:
             self.update(extras)
 
+        # Until the test harness can understand default pref values,
+        # (https://bugzilla.mozilla.org/show_bug.cgi?id=1577912) this value
+        # should by synchronized with the default pref value indicated in
+        # StaticPrefList.yaml.
+        #
+        # Currently for automation, the pref (and `sw-e10s`) defaults to true in
+        # nightly builds and false otherwise but can be overridden with
+        # `--setpref`. If overridden, the value would be initialized in
+        # `run_info_extras` and be supplied in the `extras` parameter.
+        if "sw-e10s" not in self:
+            self["sw-e10s"] = self.get("nightly_build", False)
+
         self["headless"] = extras.get("headless", False)
         self["webrender"] = enable_webrender
 
diff --git a/third_party/blink/web_tests/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/fast/css/content/content-quotes-01-expected.txt
index e065ce5..7eb8ae2 100644
--- a/third_party/blink/web_tests/fast/css/content/content-quotes-01-expected.txt
+++ b/third_party/blink/web_tests/fast/css/content/content-quotes-01-expected.txt
@@ -10,4 +10,4 @@
 
 ========Marker3========
 
-FAILED: testWidth=197px; expected 196px
+PASSED
diff --git a/third_party/blink/web_tests/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/fast/css/content/content-quotes-05-expected.txt
index 5ca09ce..e9c2297 100644
--- a/third_party/blink/web_tests/fast/css/content/content-quotes-05-expected.txt
+++ b/third_party/blink/web_tests/fast/css/content/content-quotes-05-expected.txt
@@ -8,4 +8,4 @@
 
 ========Marker3========
 
-FAILED: testWidth=234px; expected 233px
+PASSED
diff --git a/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
index 77334292..f3c84c5 100644
--- a/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
@@ -40,9 +40,9 @@
 PASS All correct nodes found for rect
 PASS All correct nodes found for rect
 PASS All correct nodes found for rect
-FAIL Unexpected node #0 for rect [39,202], [2,41] - DIV#d2
-FAIL Unexpected node #1 for rect [39,202], [6,41] - DIV#d2
-FAIL Unexpected node #2 for rect [39,202], [16,41] - DIV#d2
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
+PASS All correct nodes found for rect
 PASS All correct nodes found for rect
 PASS All correct nodes found for rect
 PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/paint/invalidation/push-block-with-first-line-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/mac/paint/invalidation/push-block-with-first-line-expected.txt
rename to third_party/blink/web_tests/paint/invalidation/push-block-with-first-line-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/canvas/image-object-in-canvas-expected.png
deleted file mode 100644
index 1b4260b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.10/fast/canvas/image-object-in-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/push-block-with-first-line-expected.txt
deleted file mode 100644
index 57b6675..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/push-block-with-first-line-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [500, 400],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "paintInvalidations": [
-        {
-          "object": "NGPhysicalLineBoxFragment",
-          "rect": [8, 68, 484, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalLineBoxFragment",
-          "rect": [8, 8, 484, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalTextFragment 'JOCULAR'",
-          "rect": [8, 68, 140, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalTextFragment 'JOCULAR'",
-          "rect": [8, 8, 140, 20],
-          "reason": "geometry"
-        }
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/canvas/image-object-in-canvas-expected.png
deleted file mode 100644
index 1b4260b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.11/fast/canvas/image-object-in-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.11/paint/invalidation/push-block-with-first-line-expected.txt
deleted file mode 100644
index 57b6675..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.11/paint/invalidation/push-block-with-first-line-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [500, 400],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "paintInvalidations": [
-        {
-          "object": "NGPhysicalLineBoxFragment",
-          "rect": [8, 68, 484, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalLineBoxFragment",
-          "rect": [8, 8, 484, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalTextFragment 'JOCULAR'",
-          "rect": [8, 68, 140, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalTextFragment 'JOCULAR'",
-          "rect": [8, 8, 140, 20],
-          "reason": "geometry"
-        }
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/basic/inheritance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/basic/inheritance-expected.png
deleted file mode 100644
index b918d43..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/basic/inheritance-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/acid_test-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/acid_test-expected.png
deleted file mode 100644
index f7700d8..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/acid_test-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom-expected.png
deleted file mode 100644
index dafeeee..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom_width_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom_width_inline-expected.png
deleted file mode 100644
index d88d7fd..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_bottom_width_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_inline-expected.png
deleted file mode 100644
index 768c43c1..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_left_width_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_left_width_inline-expected.png
deleted file mode 100644
index a218d87..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_left_width_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_style_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_style_inline-expected.png
deleted file mode 100644
index 29c038f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_style_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_top_width-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_top_width-expected.png
deleted file mode 100644
index 8fbc5f7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/border_top_width-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/clear_float-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/clear_float-expected.png
deleted file mode 100644
index 642b678..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/clear_float-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float-expected.png
deleted file mode 100644
index dcd8ec78..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float_margin-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float_margin-expected.png
deleted file mode 100644
index 239c9fa..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/float_margin-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_inline-expected.png
deleted file mode 100644
index f4a263d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_left-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_left-expected.png
deleted file mode 100644
index c79d8bd3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_left-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_top_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_top_inline-expected.png
deleted file mode 100644
index 237ba1d9..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/margin_top_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_left-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_left-expected.png
deleted file mode 100644
index c3aa8bd..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_left-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_right-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_right-expected.png
deleted file mode 100644
index 6e620d40..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_right-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_top_inline-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_top_inline-expected.png
deleted file mode 100644
index 5cf66bd..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/box_properties/padding_top_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style-expected.png
deleted file mode 100644
index 061f760d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_image-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_image-expected.png
deleted file mode 100644
index ec18f7f3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_type-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_type-expected.png
deleted file mode 100644
index 24897d9..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/classification/list_style_type-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/color_and_background/background-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/color_and_background/background-expected.png
deleted file mode 100644
index 9cdb6ec0..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/color_and_background/background-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/floating_elements-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/floating_elements-expected.png
deleted file mode 100644
index 7756c4b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/floating_elements-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/horizontal_formatting-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/horizontal_formatting-expected.png
deleted file mode 100644
index 98d09f408..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/formatting_model/horizontal_formatting-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css1/units/percentage_units-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css1/units/percentage_units-expected.png
deleted file mode 100644
index c81015b0..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css1/units/percentage_units-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/20110323/table-height-algorithm-024-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/20110323/table-height-algorithm-024-expected.png
deleted file mode 100644
index d3b3248..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/20110323/table-height-algorithm-024-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t051103-dom-hover-01-c-io-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t051103-dom-hover-01-c-io-expected.png
deleted file mode 100644
index 25644a6..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t051103-dom-hover-01-c-io-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0602-c13-inh-underlin-00-e-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0602-c13-inh-underlin-00-e-expected.png
deleted file mode 100644
index 010621b6..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0602-c13-inh-underlin-00-e-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-brdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-brdr-l-00-a-expected.png
deleted file mode 100644
index 87890d7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-brdr-l-00-a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
deleted file mode 100644
index 1ebbc4f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5522-ibrdr-00-a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5522-ibrdr-00-a-expected.png
deleted file mode 100644
index f75ed6f6..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0805-c5522-ibrdr-00-a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-04-c-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-04-c-expected.png
deleted file mode 100644
index bc4211a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-04-c-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
deleted file mode 100644
index 09ecdb1d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
deleted file mode 100644
index 5c0b47e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltwrap-00-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltwrap-00-b-expected.png
deleted file mode 100644
index 145b6e0..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t0905-c5525-fltwrap-00-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1004-c5524-width-00-b-g-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1004-c5524-width-00-b-g-expected.png
deleted file mode 100644
index 823dfbf..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1004-c5524-width-00-b-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counter-15-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counter-15-b-expected.png
deleted file mode 100644
index 17461edc..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counter-15-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counters-13-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counters-13-b-expected.png
deleted file mode 100644
index 860bc7f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1202-counters-13-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c565-list-pos-00-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c565-list-pos-00-b-expected.png
deleted file mode 100644
index 73d69fd..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c565-list-pos-00-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c566-list-stl-01-c-g-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c566-list-stl-01-c-g-expected.png
deleted file mode 100644
index 1390c4cb..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1205-c566-list-stl-01-c-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-06-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-06-b-expected.png
deleted file mode 100644
index 11096a6..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-06-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-10-c-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-10-c-expected.png
deleted file mode 100644
index a7f09cd..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css2.1/t1508-c527-font-10-c-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/css3-modsel-35-expected.png
deleted file mode 100644
index c4f07d8b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/css3-modsel-35-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/font-feature-settings-rendering-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/font-feature-settings-rendering-expected.png
deleted file mode 100644
index 45127ce..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/font-feature-settings-rendering-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-168a-expected.png
deleted file mode 100644
index dd901c96..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-168a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-20-expected.png
deleted file mode 100644
index 2b8682d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-20-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-35-expected.png
deleted file mode 100644
index c4f07d8b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-35-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-39-expected.png
deleted file mode 100644
index 04dc941f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-39-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42-expected.png
deleted file mode 100644
index fb9a8aa..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42a-expected.png
deleted file mode 100644
index fb9a8aa..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-42a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-5-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-5-expected.png
deleted file mode 100644
index 7087c35..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-5-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-7-expected.png
deleted file mode 100644
index a4410c7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-7-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-78b-expected.png
deleted file mode 100644
index 309c0a7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/html/css3-modsel-78b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-166-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-166-expected.png
deleted file mode 100644
index 266114d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-166-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-168a-expected.png
deleted file mode 100644
index dd901c96..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-168a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-20-expected.png
deleted file mode 100644
index 2b8682d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-20-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-3-expected.png
deleted file mode 100644
index 89289b3e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-39-expected.png
deleted file mode 100644
index 04dc941f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-39-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-42-expected.png
deleted file mode 100644
index fb9a8aa..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-42-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-7-expected.png
deleted file mode 100644
index a4410c7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xhtml/css3-modsel-7-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-153-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-153-expected.png
deleted file mode 100644
index d9fbc47..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-153-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-166a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-166a-expected.png
deleted file mode 100644
index dd01181..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-166a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-168-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-168-expected.png
deleted file mode 100644
index 804fdfa6..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-168-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-20-expected.png
deleted file mode 100644
index bf18631..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-20-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-22-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-22-expected.png
deleted file mode 100644
index 31b3fb0..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-22-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-3-expected.png
deleted file mode 100644
index 45a0932..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-42a-expected.png
deleted file mode 100644
index 6536745..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-42a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-66-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-66-expected.png
deleted file mode 100644
index 2684dabe..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-66-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-78b-expected.png
deleted file mode 100644
index 71060ce..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-78b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-79-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-79-expected.png
deleted file mode 100644
index dcc504a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/css3/selectors3/xml/css3-modsel-79-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.png
deleted file mode 100644
index 38d5c6d3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.txt
deleted file mode 100644
index 464465f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/4402375-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
-    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
-      LayoutNGBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 135x18
-          text run at (0,0) width 135: "This is a testcase for "
-        LayoutInline {A} at (134,0) size 154x18 [color=#0000EE]
-          LayoutText {#text} at (134,0) size 154x18
-            text run at (134,0) width 154: "rdar://problem/4402375"
-        LayoutText {#text} at (0,0) size 774x36
-          text run at (287,0) width 487: " \"REGRESSION (417.8-TOT): finding text sometimes also selects previous"
-          text run at (0,18) width 139: "image (5127) (6451)\""
-      LayoutNGBlockFlow {P} at (0,70) size 784x36
-        LayoutText {#text} at (0,0) size 759x36
-          text run at (0,0) width 759: "This test uses a right aligned image next to some left aligned text. The image should not be selected, and should not be"
-          text run at (0,18) width 612: "included in the selection rect (you won't see the selection rect when you run this test manually)."
-      LayoutNGBlockFlow {DIV} at (0,122) size 784x18
-        LayoutImage (floating) {IMG} at (708,0) size 76x103
-        LayoutText {#text} at (0,0) size 182x18
-          text run at (0,0) width 182: "This text should be selected."
-layer at (8,60) size 784x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)]
-selection start: position 0 of child 1 {#text} of child 6 {DIV} of body
-selection end:   position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
deleted file mode 100644
index bde97c2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-expected.png
deleted file mode 100644
index 9b6b38bd..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
deleted file mode 100644
index f415ab9..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
deleted file mode 100644
index 3a100a48..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This is a testharness.js-based test.
-PASS .grid 1
-FAIL .grid 2 assert_equals: 
-<div class="grid RTL">
-  <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
-  <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 35 but got 5
-PASS .grid 3
-FAIL .grid 4 assert_equals: 
-<div class="grid verticalRL">
-  <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div>
-  <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
-  <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetTop expected 115 but got 110
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
deleted file mode 100644
index 3a100a48..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This is a testharness.js-based test.
-PASS .grid 1
-FAIL .grid 2 assert_equals: 
-<div class="grid RTL">
-  <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
-  <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 35 but got 5
-PASS .grid 3
-FAIL .grid 4 assert_equals: 
-<div class="grid verticalRL">
-  <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div>
-  <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
-  <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetTop expected 115 but got 110
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
deleted file mode 100644
index bac9d81..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-FAIL Height must change when line-height-step changes assert_not_equals: got disallowed value 28
-PASS Height must not change after relayout
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/animated-gif-as-background-rounded-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/animated-gif-as-background-rounded-expected.png
deleted file mode 100644
index 1c340ad..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/animated-gif-as-background-rounded-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-expected.png
deleted file mode 100644
index 92e5e871..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
deleted file mode 100644
index 8dfcc77..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/015-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/015-expected.png
deleted file mode 100644
index 7a2dbaa..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/015-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/adding-near-anonymous-block-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/adding-near-anonymous-block-expected.png
deleted file mode 100644
index 604e6d8..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/basic/adding-near-anonymous-block-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/028-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/028-expected.png
deleted file mode 100644
index dcf831b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/028-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/independent-align-positioning-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/independent-align-positioning-expected.png
deleted file mode 100644
index 323a8a4..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/independent-align-positioning-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/nopaint-after-layer-destruction2-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/nopaint-after-layer-destruction2-expected.png
deleted file mode 100644
index a936b73..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/float/nopaint-after-layer-destruction2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/006-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/006-expected.png
deleted file mode 100644
index fb01fd6..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/006-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/015-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/015-expected.png
deleted file mode 100644
index 2b3e410..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/015-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/017-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/017-expected.png
deleted file mode 100644
index cd5bba7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/017-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/019-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/019-expected.png
deleted file mode 100644
index 3f83783a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/019-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/020-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/020-expected.png
deleted file mode 100644
index 7d9acf0..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/020-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/059-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/059-expected.png
deleted file mode 100644
index 4901154..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/059-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/103-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/103-expected.png
deleted file mode 100644
index 04fe0565..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/103-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/005-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/005-expected.png
deleted file mode 100644
index cc417cf..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/005-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/016-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/016-expected.png
deleted file mode 100644
index 5704a8a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/margin-collapse/block-inside-inline/016-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/001-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/001-expected.png
deleted file mode 100644
index 2c852a66..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-3-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
deleted file mode 100644
index f445a6f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-expected.png
deleted file mode 100644
index efed2f8..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/absolute-in-inline-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/004-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/004-expected.png
deleted file mode 100644
index 63d88ab5..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/004-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/006-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/006-expected.png
deleted file mode 100644
index 2b558bf1..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/006-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/004-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/004-expected.png
deleted file mode 100644
index 37a94b4f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/004-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/006-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/006-expected.png
deleted file mode 100644
index fb97174..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/auto/vertical-rl/006-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/vertical-lr/001-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/vertical-lr/001-expected.png
deleted file mode 100644
index eb93237..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/block/positioning/vertical-lr/001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/border-image-scaled-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/border-image-scaled-expected.png
deleted file mode 100644
index 9cd7b44..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/border-image-scaled-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/inline-mask-overlay-image-expected.png
deleted file mode 100644
index 2aee97f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/inline-mask-overlay-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/outline-alpha-block-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/outline-alpha-block-expected.png
deleted file mode 100644
index 936cab3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/outline-alpha-block-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/rtl-border-01-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/rtl-border-01-expected.png
deleted file mode 100644
index 16cb4c1..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/borders/rtl-border-01-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/canvas/image-object-in-canvas-expected.png
deleted file mode 100644
index 1b4260b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/canvas/image-object-in-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/007-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/007-expected.png
deleted file mode 100644
index aae91c2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/007-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/009-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/009-expected.png
deleted file mode 100644
index bcb0210d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/009-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/010-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/010-expected.png
deleted file mode 100644
index bcb0210d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/clip/010-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/compact/003-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/compact/003-expected.png
deleted file mode 100644
index 7ceb418..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/compact/003-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/007-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/007-expected.png
deleted file mode 100644
index 3a1d3e7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/007-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/009-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/009-expected.png
deleted file mode 100644
index b8c97fc..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/009-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/after-duplicated-after-split-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/after-duplicated-after-split-expected.png
deleted file mode 100644
index ab80556..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/after-duplicated-after-split-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/table-cell-before-after-child-add-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/table-cell-before-after-child-add-expected.png
deleted file mode 100644
index e4d2542..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css-generated-content/table-cell-before-after-child-add-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/005-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/005-expected.png
deleted file mode 100644
index 607e913..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/005-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/ZeroOpacityLayers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/ZeroOpacityLayers-expected.png
deleted file mode 100644
index acc49674..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/ZeroOpacityLayers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/absolute-poition-in-rtl-parent-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/absolute-poition-in-rtl-parent-expected.png
deleted file mode 100644
index 77c54c89..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/absolute-poition-in-rtl-parent-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-expected.png
deleted file mode 100644
index 9b3a27e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-on-text-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-on-text-shadow-expected.png
deleted file mode 100644
index 51acf63..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/color-correction-on-text-shadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/compare-content-style-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/compare-content-style-expected.png
deleted file mode 100644
index eba8919..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/compare-content-style-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-01-expected.txt
deleted file mode 100644
index 7eb8ae2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-01-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-The texts between the markers should be identical.
-
-========Marker1========
-
-ab	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker2========
-
-WWaWWbWWWWWWWW	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker3========
-
-PASSED
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-05-expected.txt
deleted file mode 100644
index e9c2297..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/content/content-quotes-05-expected.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-========Marker1========
-
-abc	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker2========
-
-WWaWWWbWWWWWcWWWW	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker3========
-
-PASSED
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/create_element_align-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/create_element_align-expected.png
deleted file mode 100644
index e927104..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/create_element_align-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/find-next-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/find-next-layer-expected.png
deleted file mode 100644
index 25a2dff..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/find-next-layer-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-capitalized-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-capitalized-expected.png
deleted file mode 100644
index ecf952e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-capitalized-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-float-after-float-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-float-after-float-expected.png
deleted file mode 100644
index 688a9650..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/first-letter-float-after-float-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/focus-ring-outline-color-expected.png
deleted file mode 100644
index cca9786..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/focus-ring-outline-color-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/image-orientation/image-orientation-default-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/image-orientation/image-orientation-default-expected.png
deleted file mode 100644
index 24bb01a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/image-orientation/image-orientation-default-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/last-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/last-of-type-pseudo-class-expected.png
deleted file mode 100644
index 426a716..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/last-of-type-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-child-pseudo-class-expected.png
deleted file mode 100644
index fa540f09..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-child-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-of-type-pseudo-class-expected.png
deleted file mode 100644
index 8eea776c..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/only-of-type-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/pendingStylesheetFontSize-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/pendingStylesheetFontSize-expected.png
deleted file mode 100644
index 4d98fab..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/pendingStylesheetFontSize-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-expected.png
deleted file mode 100644
index 20258cf..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-expected.png
deleted file mode 100644
index 71084936..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-iframe-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-iframe-expected.png
deleted file mode 100644
index 3aa9666f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/resize-corner-tracking-transformed-iframe-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/shadow-multiple-expected.png
deleted file mode 100644
index 2d1ad8a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/shadow-multiple-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/simple-selector-chain-parsing-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/simple-selector-chain-parsing-expected.png
deleted file mode 100644
index ba4a5e8..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/simple-selector-chain-parsing-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-expected.png
deleted file mode 100644
index 138fb6a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-center-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-center-expected.png
deleted file mode 100644
index 4bab32d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-center-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
deleted file mode 100644
index 78582770..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-right-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-right-expected.png
deleted file mode 100644
index ca9eb320..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/text-overflow-ellipsis-text-align-right-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/universal-hover-quirk-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/universal-hover-quirk-expected.png
deleted file mode 100644
index 2b7e48a..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/universal-hover-quirk-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png
deleted file mode 100644
index 7e8cec2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png
deleted file mode 100644
index 7e8cec2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/visibility-hit-test-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/visibility-hit-test-expected.png
deleted file mode 100644
index e0ea2af..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css/visibility-hit-test-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png
deleted file mode 100644
index a74bb49..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
deleted file mode 100644
index 5c1eeaa3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/009-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/009-horizontal-expected.png
deleted file mode 100644
index a9f5e58..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/009-horizontal-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/010-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/010-expected.png
deleted file mode 100644
index 865c628..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/010-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/018-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/018-expected.png
deleted file mode 100644
index 233bbde84..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/deprecated-flexbox/018-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt
deleted file mode 100644
index b64f482..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-PASS Check position for non-collapsed range.
-FAIL Check position for collapsed range. assert_equals: Position of collapsed rect should match right edge of non-collapsed range. expected "16, 273.515625" but got "16, 273.5"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/children-nodes-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/children-nodes-expected.png
deleted file mode 100644
index 814e969e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/children-nodes-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
deleted file mode 100644
index f3c84c5..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/007-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/007-expected.png
deleted file mode 100644
index c89d721f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/007-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/insert-before-table-part-in-continuation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/insert-before-table-part-in-continuation-expected.png
deleted file mode 100644
index 5947723..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/insert-before-table-part-in-continuation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/noninlinebadness-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/noninlinebadness-expected.png
deleted file mode 100644
index c0f4fe9..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/dynamic/noninlinebadness-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/basic/inheritance-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/basic/inheritance-expected.png
deleted file mode 100644
index b918d43..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/basic/inheritance-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/acid_test-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/acid_test-expected.png
deleted file mode 100644
index f7700d8..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/acid_test-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom-expected.png
deleted file mode 100644
index dafeeee..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom_width_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom_width_inline-expected.png
deleted file mode 100644
index d88d7fd..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_bottom_width_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_inline-expected.png
deleted file mode 100644
index 768c43c1..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_left_width_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_left_width_inline-expected.png
deleted file mode 100644
index a218d87..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_left_width_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_style_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_style_inline-expected.png
deleted file mode 100644
index 29c038f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_style_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_top_width-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_top_width-expected.png
deleted file mode 100644
index 8fbc5f7..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/border_top_width-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/clear_float-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/clear_float-expected.png
deleted file mode 100644
index 642b678..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/clear_float-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float-expected.png
deleted file mode 100644
index dcd8ec78..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float_margin-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float_margin-expected.png
deleted file mode 100644
index 239c9fa..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/float_margin-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_inline-expected.png
deleted file mode 100644
index f4a263d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_left-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_left-expected.png
deleted file mode 100644
index c79d8bd3..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_left-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_top_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_top_inline-expected.png
deleted file mode 100644
index 237ba1d9..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/margin_top_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_left-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_left-expected.png
deleted file mode 100644
index c3aa8bd..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_left-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_right-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_right-expected.png
deleted file mode 100644
index 6e620d40..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_right-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_top_inline-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_top_inline-expected.png
deleted file mode 100644
index 5cf66bd..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/box_properties/padding_top_inline-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style-expected.png
deleted file mode 100644
index 061f760d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_image-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_image-expected.png
deleted file mode 100644
index ec18f7f3..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_type-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_type-expected.png
deleted file mode 100644
index 24897d9..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/classification/list_style_type-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/color_and_background/background-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/color_and_background/background-expected.png
deleted file mode 100644
index 9cdb6ec0..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/color_and_background/background-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/floating_elements-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/floating_elements-expected.png
deleted file mode 100644
index 7756c4b..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/floating_elements-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/horizontal_formatting-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/horizontal_formatting-expected.png
deleted file mode 100644
index 98d09f408..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/formatting_model/horizontal_formatting-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css1/units/percentage_units-expected.png b/third_party/blink/web_tests/platform/mac-retina/css1/units/percentage_units-expected.png
deleted file mode 100644
index c81015b0..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css1/units/percentage_units-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/20110323/table-height-algorithm-024-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/20110323/table-height-algorithm-024-expected.png
deleted file mode 100644
index d3b3248..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/20110323/table-height-algorithm-024-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t051103-dom-hover-01-c-io-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t051103-dom-hover-01-c-io-expected.png
deleted file mode 100644
index 25644a6..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t051103-dom-hover-01-c-io-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0602-c13-inh-underlin-00-e-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0602-c13-inh-underlin-00-e-expected.png
deleted file mode 100644
index 010621b6..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0602-c13-inh-underlin-00-e-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-brdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-brdr-l-00-a-expected.png
deleted file mode 100644
index 87890d7..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-brdr-l-00-a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
deleted file mode 100644
index 1ebbc4f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5522-ibrdr-00-a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5522-ibrdr-00-a-expected.png
deleted file mode 100644
index f75ed6f6..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0805-c5522-ibrdr-00-a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-04-c-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-04-c-expected.png
deleted file mode 100644
index bc4211a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-04-c-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
deleted file mode 100644
index 09ecdb1d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
deleted file mode 100644
index 5c0b47e..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltwrap-00-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltwrap-00-b-expected.png
deleted file mode 100644
index 145b6e0..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t0905-c5525-fltwrap-00-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1004-c5524-width-00-b-g-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1004-c5524-width-00-b-g-expected.png
deleted file mode 100644
index 823dfbf..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1004-c5524-width-00-b-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counter-15-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counter-15-b-expected.png
deleted file mode 100644
index 17461edc..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counter-15-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counters-13-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counters-13-b-expected.png
deleted file mode 100644
index 860bc7f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1202-counters-13-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c565-list-pos-00-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c565-list-pos-00-b-expected.png
deleted file mode 100644
index 73d69fd..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c565-list-pos-00-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c566-list-stl-01-c-g-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c566-list-stl-01-c-g-expected.png
deleted file mode 100644
index 1390c4cb..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1205-c566-list-stl-01-c-g-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-06-b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-06-b-expected.png
deleted file mode 100644
index 11096a6..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-06-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-10-c-expected.png b/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-10-c-expected.png
deleted file mode 100644
index a7f09cd..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css2.1/t1508-c527-font-10-c-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/css3-modsel-35-expected.png
deleted file mode 100644
index c4f07d8b..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/css3-modsel-35-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/font-feature-settings-rendering-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/font-feature-settings-rendering-expected.png
deleted file mode 100644
index 45127ce..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/font-feature-settings-rendering-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-168a-expected.png
deleted file mode 100644
index dd901c96..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-168a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-20-expected.png
deleted file mode 100644
index 2b8682d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-20-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-35-expected.png
deleted file mode 100644
index c4f07d8b..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-35-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-39-expected.png
deleted file mode 100644
index 04dc941f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-39-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42-expected.png
deleted file mode 100644
index fb9a8aa..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42a-expected.png
deleted file mode 100644
index fb9a8aa..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-42a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-5-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-5-expected.png
deleted file mode 100644
index 7087c35..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-5-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-7-expected.png
deleted file mode 100644
index a4410c7..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-7-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-78b-expected.png
deleted file mode 100644
index 309c0a7..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/html/css3-modsel-78b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-166-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-166-expected.png
deleted file mode 100644
index 266114d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-166-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-168a-expected.png
deleted file mode 100644
index dd901c96..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-168a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-20-expected.png
deleted file mode 100644
index 2b8682d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-20-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-3-expected.png
deleted file mode 100644
index 89289b3e..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-39-expected.png
deleted file mode 100644
index 04dc941f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-39-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-42-expected.png
deleted file mode 100644
index fb9a8aa..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-42-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-7-expected.png
deleted file mode 100644
index a4410c7..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xhtml/css3-modsel-7-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-153-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-153-expected.png
deleted file mode 100644
index d9fbc47..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-153-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-166a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-166a-expected.png
deleted file mode 100644
index dd01181..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-166a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-168-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-168-expected.png
deleted file mode 100644
index 804fdfa6..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-168-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-20-expected.png
deleted file mode 100644
index bf18631..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-20-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-22-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-22-expected.png
deleted file mode 100644
index 31b3fb0..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-22-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-3-expected.png
deleted file mode 100644
index 45a0932..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-42a-expected.png
deleted file mode 100644
index 6536745..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-42a-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-66-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-66-expected.png
deleted file mode 100644
index 2684dabe..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-66-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-78b-expected.png
deleted file mode 100644
index 71060ce..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-78b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-79-expected.png b/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-79-expected.png
deleted file mode 100644
index dcc504a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/css3/selectors3/xml/css3-modsel-79-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.png
deleted file mode 100644
index 38d5c6d3..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.txt
deleted file mode 100644
index 464465f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/4402375-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
-    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
-      LayoutNGBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 135x18
-          text run at (0,0) width 135: "This is a testcase for "
-        LayoutInline {A} at (134,0) size 154x18 [color=#0000EE]
-          LayoutText {#text} at (134,0) size 154x18
-            text run at (134,0) width 154: "rdar://problem/4402375"
-        LayoutText {#text} at (0,0) size 774x36
-          text run at (287,0) width 487: " \"REGRESSION (417.8-TOT): finding text sometimes also selects previous"
-          text run at (0,18) width 139: "image (5127) (6451)\""
-      LayoutNGBlockFlow {P} at (0,70) size 784x36
-        LayoutText {#text} at (0,0) size 759x36
-          text run at (0,0) width 759: "This test uses a right aligned image next to some left aligned text. The image should not be selected, and should not be"
-          text run at (0,18) width 612: "included in the selection rect (you won't see the selection rect when you run this test manually)."
-      LayoutNGBlockFlow {DIV} at (0,122) size 784x18
-        LayoutImage (floating) {IMG} at (708,0) size 76x103
-        LayoutText {#text} at (0,0) size 182x18
-          text run at (0,0) width 182: "This text should be selected."
-layer at (8,60) size 784x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)]
-selection start: position 0 of child 1 {#text} of child 6 {DIV} of body
-selection end:   position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/platform/mac-retina/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
deleted file mode 100644
index bde97c2..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-expected.png
deleted file mode 100644
index 9b6b38bd..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
deleted file mode 100644
index f415ab9..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
deleted file mode 100644
index 3a100a48..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This is a testharness.js-based test.
-PASS .grid 1
-FAIL .grid 2 assert_equals: 
-<div class="grid RTL">
-  <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
-  <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 35 but got 5
-PASS .grid 3
-FAIL .grid 4 assert_equals: 
-<div class="grid verticalRL">
-  <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div>
-  <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
-  <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetTop expected 115 but got 110
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
deleted file mode 100644
index 3a100a48..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This is a testharness.js-based test.
-PASS .grid 1
-FAIL .grid 2 assert_equals: 
-<div class="grid RTL">
-  <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
-  <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 35 but got 5
-PASS .grid 3
-FAIL .grid 4 assert_equals: 
-<div class="grid verticalRL">
-  <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div>
-  <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
-  <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetTop expected 115 but got 110
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
deleted file mode 100644
index bac9d81..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/external/wpt/css/css-rhythm/line-height-step-dynamic-001-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-FAIL Height must change when line-height-step changes assert_not_equals: got disallowed value 28
-PASS Height must not change after relayout
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/animated-gif-as-background-rounded-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/animated-gif-as-background-rounded-expected.png
deleted file mode 100644
index 1c340ad..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/animated-gif-as-background-rounded-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-expected.png
deleted file mode 100644
index 92e5e871..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
deleted file mode 100644
index 8dfcc77..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/015-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/015-expected.png
deleted file mode 100644
index 7a2dbaa..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/015-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/adding-near-anonymous-block-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/adding-near-anonymous-block-expected.png
deleted file mode 100644
index 604e6d8..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/basic/adding-near-anonymous-block-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/028-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/float/028-expected.png
deleted file mode 100644
index dcf831b..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/028-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/independent-align-positioning-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/float/independent-align-positioning-expected.png
deleted file mode 100644
index 323a8a4..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/independent-align-positioning-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/nopaint-after-layer-destruction2-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/float/nopaint-after-layer-destruction2-expected.png
deleted file mode 100644
index a936b73..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/float/nopaint-after-layer-destruction2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/006-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/006-expected.png
deleted file mode 100644
index fb01fd6..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/006-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/015-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/015-expected.png
deleted file mode 100644
index 2b3e410..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/015-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/017-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/017-expected.png
deleted file mode 100644
index cd5bba7..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/017-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/019-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/019-expected.png
deleted file mode 100644
index 3f83783a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/019-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/020-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/020-expected.png
deleted file mode 100644
index 7d9acf0..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/020-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/059-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/059-expected.png
deleted file mode 100644
index 4901154..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/059-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/103-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/103-expected.png
deleted file mode 100644
index 04fe0565..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/103-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/005-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/005-expected.png
deleted file mode 100644
index cc417cf..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/005-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/016-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/016-expected.png
deleted file mode 100644
index 5704a8a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/margin-collapse/block-inside-inline/016-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/001-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/001-expected.png
deleted file mode 100644
index 2c852a66..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-3-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
deleted file mode 100644
index f445a6f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-expected.png
deleted file mode 100644
index efed2f8..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/absolute-in-inline-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/004-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/004-expected.png
deleted file mode 100644
index 63d88ab5..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/004-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/006-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/006-expected.png
deleted file mode 100644
index 2b558bf1..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/006-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/004-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/004-expected.png
deleted file mode 100644
index 37a94b4f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/004-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/006-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/006-expected.png
deleted file mode 100644
index fb97174..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/auto/vertical-rl/006-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/vertical-lr/001-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/vertical-lr/001-expected.png
deleted file mode 100644
index eb93237..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/block/positioning/vertical-lr/001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/border-image-scaled-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/border-image-scaled-expected.png
deleted file mode 100644
index 9cd7b44..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/border-image-scaled-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-expected.png
deleted file mode 100644
index 2aee97f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-outset-expected.png
deleted file mode 100644
index 10a6893d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/inline-mask-overlay-image-outset-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/outline-alpha-block-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/outline-alpha-block-expected.png
deleted file mode 100644
index 936cab3..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/outline-alpha-block-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/borders/rtl-border-01-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/borders/rtl-border-01-expected.png
deleted file mode 100644
index 16cb4c1..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/borders/rtl-border-01-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/canvas/image-object-in-canvas-expected.png
deleted file mode 100644
index 1b4260b..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/canvas/image-object-in-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/clip/007-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/clip/007-expected.png
deleted file mode 100644
index aae91c2..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/clip/007-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/clip/009-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/clip/009-expected.png
deleted file mode 100644
index bcb0210d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/clip/009-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/clip/010-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/clip/010-expected.png
deleted file mode 100644
index bcb0210d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/clip/010-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/compact/003-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/compact/003-expected.png
deleted file mode 100644
index 7ceb418..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/compact/003-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/007-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/007-expected.png
deleted file mode 100644
index 3a1d3e7..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/007-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/009-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/009-expected.png
deleted file mode 100644
index b8c97fc..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/009-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/after-duplicated-after-split-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/after-duplicated-after-split-expected.png
deleted file mode 100644
index ab80556..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/after-duplicated-after-split-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/before-with-first-letter-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/before-with-first-letter-expected.png
deleted file mode 100644
index 0ba21a1..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/before-with-first-letter-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/table-cell-before-after-child-add-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/table-cell-before-after-child-add-expected.png
deleted file mode 100644
index e4d2542..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css-generated-content/table-cell-before-after-child-add-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/005-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/005-expected.png
deleted file mode 100644
index 607e913..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/005-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/ZeroOpacityLayers-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/ZeroOpacityLayers-expected.png
deleted file mode 100644
index acc49674..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/ZeroOpacityLayers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/absolute-poition-in-rtl-parent-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/absolute-poition-in-rtl-parent-expected.png
deleted file mode 100644
index 77c54c89..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/absolute-poition-in-rtl-parent-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/clip-zooming-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/clip-zooming-expected.png
deleted file mode 100644
index 2d51d6a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/clip-zooming-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-expected.png
deleted file mode 100644
index 9b3a27e..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-on-text-shadow-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-on-text-shadow-expected.png
deleted file mode 100644
index 51acf63..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/color-correction-on-text-shadow-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/compare-content-style-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/compare-content-style-expected.png
deleted file mode 100644
index eba8919..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/compare-content-style-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-01-expected.txt
deleted file mode 100644
index 7eb8ae2..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-01-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-The texts between the markers should be identical.
-
-========Marker1========
-
-ab	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker2========
-
-WWaWWbWWWWWWWW	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker3========
-
-PASSED
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-05-expected.txt
deleted file mode 100644
index e9c2297..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/content/content-quotes-05-expected.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-========Marker1========
-
-abc	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker2========
-
-WWaWWWbWWWWWcWWWW	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker3========
-
-PASSED
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/create_element_align-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/create_element_align-expected.png
deleted file mode 100644
index e927104..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/create_element_align-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/find-next-layer-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/find-next-layer-expected.png
deleted file mode 100644
index 25a2dff..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/find-next-layer-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-capitalized-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-capitalized-expected.png
deleted file mode 100644
index ecf952e..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-capitalized-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-float-after-float-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-float-after-float-expected.png
deleted file mode 100644
index 688a9650..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/first-letter-float-after-float-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/focus-ring-outline-color-expected.png
deleted file mode 100644
index cca9786..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/focus-ring-outline-color-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/image-orientation/image-orientation-default-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/image-orientation/image-orientation-default-expected.png
deleted file mode 100644
index 24bb01a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/image-orientation/image-orientation-default-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/last-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/last-of-type-pseudo-class-expected.png
deleted file mode 100644
index 426a716..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/last-of-type-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/only-child-pseudo-class-expected.png
deleted file mode 100644
index fa540f09..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/only-child-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/only-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/only-of-type-pseudo-class-expected.png
deleted file mode 100644
index 8eea776c..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/only-of-type-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/pendingStylesheetFontSize-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/pendingStylesheetFontSize-expected.png
deleted file mode 100644
index 4d98fab..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/pendingStylesheetFontSize-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-expected.png
deleted file mode 100644
index 20258cf..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-expected.png
deleted file mode 100644
index 71084936..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-iframe-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-iframe-expected.png
deleted file mode 100644
index 3aa9666f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/resize-corner-tracking-transformed-iframe-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/shadow-multiple-expected.png
deleted file mode 100644
index 2d1ad8a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/shadow-multiple-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/simple-selector-chain-parsing-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/simple-selector-chain-parsing-expected.png
deleted file mode 100644
index ba4a5e8..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/simple-selector-chain-parsing-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-expected.png
deleted file mode 100644
index 138fb6a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-center-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-center-expected.png
deleted file mode 100644
index 4bab32d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-center-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
deleted file mode 100644
index 78582770..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-right-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-right-expected.png
deleted file mode 100644
index ca9eb320..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/text-overflow-ellipsis-text-align-right-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/universal-hover-quirk-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/universal-hover-quirk-expected.png
deleted file mode 100644
index 2b7e48a..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/universal-hover-quirk-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png
deleted file mode 100644
index 7e8cec2..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png
deleted file mode 100644
index 7e8cec2..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css/visibility-hit-test-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css/visibility-hit-test-expected.png
deleted file mode 100644
index e0ea2af..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css/visibility-hit-test-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png
deleted file mode 100644
index a74bb49..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
deleted file mode 100644
index 5c1eeaa3..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/009-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/009-horizontal-expected.png
deleted file mode 100644
index a9f5e58..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/009-horizontal-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/010-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/010-expected.png
deleted file mode 100644
index 865c628..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/010-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/018-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/018-expected.png
deleted file mode 100644
index 233bbde84..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/deprecated-flexbox/018-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dom/children-nodes-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dom/children-nodes-expected.png
deleted file mode 100644
index 814e969e..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/dom/children-nodes-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/platform/mac-retina/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
deleted file mode 100644
index f3c84c5..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/007-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/007-expected.png
deleted file mode 100644
index c89d721f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/007-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/012-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/012-expected.png
deleted file mode 100644
index 01fb950f..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/012-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/insert-before-table-part-in-continuation-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/insert-before-table-part-in-continuation-expected.png
deleted file mode 100644
index 5947723..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/insert-before-table-part-in-continuation-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/noninlinebadness-expected.png b/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/noninlinebadness-expected.png
deleted file mode 100644
index c0f4fe9..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/fast/dynamic/noninlinebadness-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/push-block-with-first-line-expected.txt
deleted file mode 100644
index ef3da81..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/push-block-with-first-line-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [800, 600],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "paintInvalidations": [
-        {
-          "object": "NGPhysicalLineBoxFragment",
-          "rect": [8, 68, 784, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalLineBoxFragment",
-          "rect": [8, 8, 784, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalTextFragment 'JOCULAR'",
-          "rect": [8, 68, 140, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalTextFragment 'JOCULAR'",
-          "rect": [8, 8, 140, 20],
-          "reason": "geometry"
-        }
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/platform/mac/css1/basic/inheritance-expected.png b/third_party/blink/web_tests/platform/mac/css1/basic/inheritance-expected.png
index 2367fdbb..b918d43 100644
--- a/third_party/blink/web_tests/platform/mac/css1/basic/inheritance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/basic/inheritance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/acid_test-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/acid_test-expected.png
index e5ca7bd..f7700d8 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/acid_test-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/acid_test-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom-expected.png
index 84f9191..dafeeee 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom_width_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom_width_inline-expected.png
index 45748e41..d88d7fd 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom_width_inline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_bottom_width_inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_inline-expected.png
index 9c30b54..768c43c1 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_inline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_left_width_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_left_width_inline-expected.png
index 3dfcb8c6..a218d87 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_left_width_inline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_left_width_inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_style_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_style_inline-expected.png
index 8d6d04b0..29c038f 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_style_inline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_style_inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_top_width-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_top_width-expected.png
index 73d7c6e..8fbc5f7 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/border_top_width-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/border_top_width-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/clear_float-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/clear_float-expected.png
index c457405b..642b678 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/clear_float-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/clear_float-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/float-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/float-expected.png
index 25038d5..dcd8ec78 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/float-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/float-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/float_margin-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/float_margin-expected.png
index d4855ce..239c9fa 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/float_margin-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/float_margin-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_inline-expected.png
index 0c162df..f4a263d 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_inline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_left-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_left-expected.png
index d957d69..c79d8bd3 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_left-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_top_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_top_inline-expected.png
index 43932a1..237ba1d9 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_top_inline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/margin_top_inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_left-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_left-expected.png
index 5f8603c..c3aa8bd 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_left-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_right-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_right-expected.png
index d3dd1ba..6e620d40 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_right-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_top_inline-expected.png b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_top_inline-expected.png
index aab74a1..5cf66bd 100644
--- a/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_top_inline-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/box_properties/padding_top_inline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/classification/list_style-expected.png b/third_party/blink/web_tests/platform/mac/css1/classification/list_style-expected.png
index 49fc1be..061f760d 100644
--- a/third_party/blink/web_tests/platform/mac/css1/classification/list_style-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/classification/list_style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/classification/list_style_image-expected.png b/third_party/blink/web_tests/platform/mac/css1/classification/list_style_image-expected.png
index eeccd98..ec18f7f3 100644
--- a/third_party/blink/web_tests/platform/mac/css1/classification/list_style_image-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/classification/list_style_image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/classification/list_style_type-expected.png b/third_party/blink/web_tests/platform/mac/css1/classification/list_style_type-expected.png
index 2c26b31..24897d9 100644
--- a/third_party/blink/web_tests/platform/mac/css1/classification/list_style_type-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/classification/list_style_type-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/color_and_background/background-expected.png b/third_party/blink/web_tests/platform/mac/css1/color_and_background/background-expected.png
index dd92bbeb..9cdb6ec0 100644
--- a/third_party/blink/web_tests/platform/mac/css1/color_and_background/background-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/color_and_background/background-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/formatting_model/floating_elements-expected.png b/third_party/blink/web_tests/platform/mac/css1/formatting_model/floating_elements-expected.png
index a3b97f7c..7756c4b 100644
--- a/third_party/blink/web_tests/platform/mac/css1/formatting_model/floating_elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/formatting_model/floating_elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/formatting_model/horizontal_formatting-expected.png b/third_party/blink/web_tests/platform/mac/css1/formatting_model/horizontal_formatting-expected.png
index d188969..98d09f408 100644
--- a/third_party/blink/web_tests/platform/mac/css1/formatting_model/horizontal_formatting-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/formatting_model/horizontal_formatting-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css1/units/percentage_units-expected.png b/third_party/blink/web_tests/platform/mac/css1/units/percentage_units-expected.png
index 26afa66..c81015b0 100644
--- a/third_party/blink/web_tests/platform/mac/css1/units/percentage_units-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css1/units/percentage_units-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/20110323/table-height-algorithm-024-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/20110323/table-height-algorithm-024-expected.png
index 771e8b7..d3b3248 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/20110323/table-height-algorithm-024-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/20110323/table-height-algorithm-024-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t040302-c61-phys-len-00-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t040302-c61-phys-len-00-b-expected.png
index e032fcf..58cb015 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t040302-c61-phys-len-00-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t040302-c61-phys-len-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t051103-dom-hover-01-c-io-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t051103-dom-hover-01-c-io-expected.png
index 0d905ab..25644a6 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t051103-dom-hover-01-c-io-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t051103-dom-hover-01-c-io-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0602-c13-inh-underlin-00-e-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0602-c13-inh-underlin-00-e-expected.png
index e647816..010621b6 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0602-c13-inh-underlin-00-e-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0602-c13-inh-underlin-00-e-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-brdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-brdr-l-00-a-expected.png
index 3370143..87890d7 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-brdr-l-00-a-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-brdr-l-00-a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
index 57ae833..1ebbc4f 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5521-ibrdr-l-00-a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-brdr-02-e-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-brdr-02-e-expected.png
index 648afb1..33909e8 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-brdr-02-e-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-brdr-02-e-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-ibrdr-00-a-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-ibrdr-00-a-expected.png
index ace06377..f75ed6f6 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-ibrdr-00-a-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0805-c5522-ibrdr-00-a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-04-c-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-04-c-expected.png
index 11323076..bc4211a 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-04-c-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-04-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
index 9ec84510..09ecdb1d 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c414-flt-wrap-01-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltcont-00-d-g-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
index be2399a..5c0b47e 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltcont-00-d-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltwrap-00-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltwrap-00-b-expected.png
index 8ff7d240..145b6e0 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltwrap-00-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t0905-c5525-fltwrap-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1004-c5524-width-00-b-g-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1004-c5524-width-00-b-g-expected.png
index e92b2a3..823dfbf 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1004-c5524-width-00-b-g-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1004-c5524-width-00-b-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-08-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-08-b-expected.png
index 81c1f51..719ecc1 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-08-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-08-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-15-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-15-b-expected.png
index c143f6d..17461edc 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-15-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counter-15-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counters-13-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counters-13-b-expected.png
index f5b8952..860bc7f 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1202-counters-13-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1202-counters-13-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c561-list-displ-00-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c561-list-displ-00-b-expected.png
index 58a2021..1f81c01 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c561-list-displ-00-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c561-list-displ-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c565-list-pos-00-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c565-list-pos-00-b-expected.png
index 47a6ef1c..73d69fd 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c565-list-pos-00-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c565-list-pos-00-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c566-list-stl-01-c-g-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c566-list-stl-01-c-g-expected.png
index 53163a79..1390c4cb 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1205-c566-list-stl-01-c-g-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1205-c566-list-stl-01-c-g-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-06-b-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-06-b-expected.png
index 45128a5..11096a6 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-06-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-06-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-10-c-expected.png b/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-10-c-expected.png
index 682a0985..a7f09cd 100644
--- a/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-10-c-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css2.1/t1508-c527-font-10-c-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac/css3/css3-modsel-35-expected.png
index b223761..c4f07d8b 100644
--- a/third_party/blink/web_tests/platform/mac/css3/css3-modsel-35-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/css3-modsel-35-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/font-feature-settings-rendering-expected.png b/third_party/blink/web_tests/platform/mac/css3/font-feature-settings-rendering-expected.png
index a732e2c..45127ce 100644
--- a/third_party/blink/web_tests/platform/mac/css3/font-feature-settings-rendering-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/font-feature-settings-rendering-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-168a-expected.png
index 88d1000e..dd901c96 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-168a-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-168a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-20-expected.png
index 13a1db3..2b8682d 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-20-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-20-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-35-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-35-expected.png
index b223761..c4f07d8b 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-35-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-35-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-39-expected.png
index 031e3e14..04dc941f 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-39-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-39-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42-expected.png
index 38a23fdf..fb9a8aa 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42a-expected.png
index 38a23fdf..fb9a8aa 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42a-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-42a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-5-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-5-expected.png
index 14bc45f..7087c35 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-5-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-5-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-7-expected.png
index 35bbdb2f..a4410c7 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-7-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-7-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-78b-expected.png
index 371a7500..309c0a7 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-78b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-78b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-80-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-80-expected.png
index c255d1d..f35e115 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-80-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/html/css3-modsel-80-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-166-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-166-expected.png
index 4c5fbf35..266114d 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-166-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-166-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-168a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-168a-expected.png
index 88d1000e..dd901c96 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-168a-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-168a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-20-expected.png
index 13a1db3..2b8682d 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-20-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-20-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-3-expected.png
index 647f25c..89289b3e 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-3-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-39-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-39-expected.png
index 031e3e14..04dc941f 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-39-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-39-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-42-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-42-expected.png
index 38a23fdf..fb9a8aa 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-42-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-42-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-7-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-7-expected.png
index 35bbdb2f..a4410c7 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-7-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xhtml/css3-modsel-7-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-153-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-153-expected.png
index ece2cad..d9fbc47 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-153-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-153-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-166a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-166a-expected.png
index d4a1698..dd01181 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-166a-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-166a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-168-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-168-expected.png
index c7f47d8..804fdfa6 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-168-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-168-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-20-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-20-expected.png
index 2a2e0bd..bf18631 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-20-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-20-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-22-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-22-expected.png
index 82c43347..31b3fb0 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-22-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-22-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-3-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-3-expected.png
index a2a04a6..45a0932 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-3-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-42a-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-42a-expected.png
index 5d765c3..6536745 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-42a-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-42a-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-66-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-66-expected.png
index c0aa0b9..2684dabe 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-66-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-66-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-78b-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-78b-expected.png
index bf63709f5..71060ce 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-78b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-78b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-79-expected.png b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-79-expected.png
index e9e3855..dcc504a 100644
--- a/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-79-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/selectors3/xml/css3-modsel-79-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.png
index 51d6f1b..38d5c6d3 100644
--- a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.png
+++ b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt
index 68ec3afe..464465f 100644
--- a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt
@@ -2,9 +2,9 @@
 layer at (0,0) size 800x600
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x600
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x584
+      LayoutNGBlockFlow {P} at (0,0) size 784x36
         LayoutText {#text} at (0,0) size 135x18
           text run at (0,0) width 135: "This is a testcase for "
         LayoutInline {A} at (134,0) size 154x18 [color=#0000EE]
@@ -13,16 +13,15 @@
         LayoutText {#text} at (0,0) size 774x36
           text run at (287,0) width 487: " \"REGRESSION (417.8-TOT): finding text sometimes also selects previous"
           text run at (0,18) width 139: "image (5127) (6451)\""
-      LayoutBlockFlow {P} at (0,70) size 784x36
+      LayoutNGBlockFlow {P} at (0,70) size 784x36
         LayoutText {#text} at (0,0) size 759x36
-          text run at (0,0) width 424: "This test uses a right aligned image next to some left aligned text. "
-          text run at (423,0) width 336: "The image should not be selected, and should not be"
+          text run at (0,0) width 759: "This test uses a right aligned image next to some left aligned text. The image should not be selected, and should not be"
           text run at (0,18) width 612: "included in the selection rect (you won't see the selection rect when you run this test manually)."
-      LayoutBlockFlow {DIV} at (0,122) size 784x18
+      LayoutNGBlockFlow {DIV} at (0,122) size 784x18
         LayoutImage (floating) {IMG} at (708,0) size 76x103
         LayoutText {#text} at (0,0) size 182x18
           text run at (0,0) width 182: "This text should be selected."
 layer at (8,60) size 784x2 clip at (0,0) size 0x0
-  LayoutBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)]
+  LayoutNGBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)]
 selection start: position 0 of child 1 {#text} of child 6 {DIV} of body
 selection end:   position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/5232159-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/5232159-expected.png
index 1b28bf8..846701e 100644
--- a/third_party/blink/web_tests/platform/mac/editing/selection/5232159-expected.png
+++ b/third_party/blink/web_tests/platform/mac/editing/selection/5232159-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
index 726790b..bde97c2 100644
--- a/third_party/blink/web_tests/platform/mac/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
+++ b/third_party/blink/web_tests/platform/mac/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png
index 2956ec0..9b6b38bd 100644
--- a/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png
+++ b/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png b/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
index afe036e9..f415ab9 100644
--- a/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/backgrounds/animated-gif-as-background-rounded-expected.png b/third_party/blink/web_tests/platform/mac/fast/backgrounds/animated-gif-as-background-rounded-expected.png
index 07e77598..1c340ad 100644
--- a/third_party/blink/web_tests/platform/mac/fast/backgrounds/animated-gif-as-background-rounded-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/backgrounds/animated-gif-as-background-rounded-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-expected.png b/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-expected.png
index a483a39..92e5e871 100644
--- a/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png b/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
index 7d12fc42..8dfcc77 100644
--- a/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/backgrounds/repeat/negative-offset-repeat-transformed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/basic/015-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/basic/015-expected.png
index b150938..7a2dbaa 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/basic/015-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/basic/015-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/basic/adding-near-anonymous-block-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/basic/adding-near-anonymous-block-expected.png
index 1067cc7..604e6d8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/basic/adding-near-anonymous-block-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/basic/adding-near-anonymous-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/float/028-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/float/028-expected.png
index 99717474..dcf831b 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/float/028-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/float/028-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/float/independent-align-positioning-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/float/independent-align-positioning-expected.png
index 130ca8e..323a8a4 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/float/independent-align-positioning-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/float/independent-align-positioning-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/float/nopaint-after-layer-destruction2-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/float/nopaint-after-layer-destruction2-expected.png
index 5ae00310..a936b73 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/float/nopaint-after-layer-destruction2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/float/nopaint-after-layer-destruction2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/006-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/006-expected.png
index 75d9dea3..fb01fd6 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/006-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/015-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/015-expected.png
index 38e6436..2b3e410 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/015-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/015-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/017-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/017-expected.png
index 7d735a2..cd5bba7 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/017-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/017-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/019-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/019-expected.png
index 92091a3..3f83783a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/019-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/019-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/020-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/020-expected.png
index 102bc3e..7d9acf0 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/020-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/020-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/059-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/059-expected.png
index 83595830..4901154 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/059-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/059-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/103-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/103-expected.png
index b9951c0..04fe0565 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/103-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/103-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/005-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/005-expected.png
index 7437719..cc417cf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/005-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/016-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/016-expected.png
index 15c657a..5704a8a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/016-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/margin-collapse/block-inside-inline/016-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/001-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/001-expected.png
index 6f94823..2c852a66 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/001-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-3-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
index e2f1457..f445a6f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-expected.png
index 4a32ae27..efed2f8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/absolute-in-inline-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/004-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/004-expected.png
index 0a0d632..63d88ab5 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/004-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/006-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/006-expected.png
index 746297a..2b558bf1 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/006-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/004-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/004-expected.png
index c326d6bf..37a94b4f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/004-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/006-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/006-expected.png
index 6ad14722..fb97174 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/006-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/auto/vertical-rl/006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/block/positioning/vertical-lr/001-expected.png b/third_party/blink/web_tests/platform/mac/fast/block/positioning/vertical-lr/001-expected.png
index 85b64e8..eb93237 100644
--- a/third_party/blink/web_tests/platform/mac/fast/block/positioning/vertical-lr/001-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/block/positioning/vertical-lr/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/border-image-scaled-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/border-image-scaled-expected.png
index 602e89a..9cd7b44 100644
--- a/third_party/blink/web_tests/platform/mac/fast/borders/border-image-scaled-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/borders/border-image-scaled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png
index 55de7565..2aee97f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png
index d638408..10a6893d 100644
--- a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/outline-alpha-block-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/outline-alpha-block-expected.png
index 343efb75..936cab3 100644
--- a/third_party/blink/web_tests/platform/mac/fast/borders/outline-alpha-block-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/borders/outline-alpha-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/rtl-border-01-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/rtl-border-01-expected.png
index 95dc0a9..16cb4c1 100644
--- a/third_party/blink/web_tests/platform/mac/fast/borders/rtl-border-01-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/borders/rtl-border-01-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/image-object-in-canvas-expected.png
index 11c3318a..1b4260b 100644
--- a/third_party/blink/web_tests/platform/mac/fast/canvas/image-object-in-canvas-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/canvas/image-object-in-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/clip/007-expected.png b/third_party/blink/web_tests/platform/mac/fast/clip/007-expected.png
index 3403fa4..aae91c2 100644
--- a/third_party/blink/web_tests/platform/mac/fast/clip/007-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/clip/007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/clip/009-expected.png b/third_party/blink/web_tests/platform/mac/fast/clip/009-expected.png
index c0b12536..bcb0210d 100644
--- a/third_party/blink/web_tests/platform/mac/fast/clip/009-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/clip/009-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/clip/010-expected.png b/third_party/blink/web_tests/platform/mac/fast/clip/010-expected.png
index c0b12536..bcb0210d 100644
--- a/third_party/blink/web_tests/platform/mac/fast/clip/010-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/clip/010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/compact/003-expected.png b/third_party/blink/web_tests/platform/mac/fast/compact/003-expected.png
index b47c98a..7ceb418 100644
--- a/third_party/blink/web_tests/platform/mac/fast/compact/003-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/compact/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/007-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/007-expected.png
index 57130a5..3a1d3e7 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/007-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/009-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/009-expected.png
index 2dbf108ef..b8c97fc 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/009-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/009-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/after-duplicated-after-split-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/after-duplicated-after-split-expected.png
index d689b32..ab80556 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/after-duplicated-after-split-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/after-duplicated-after-split-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/before-with-first-letter-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/before-with-first-letter-expected.png
index 4e401e38..0ba21a1 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/before-with-first-letter-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/before-with-first-letter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/table-cell-before-after-child-add-expected.png b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/table-cell-before-after-child-add-expected.png
index 1a9ede1..e4d2542 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css-generated-content/table-cell-before-after-child-add-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css-generated-content/table-cell-before-after-child-add-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/005-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/005-expected.png
index befda43..607e913 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/005-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/ZeroOpacityLayers-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/ZeroOpacityLayers-expected.png
index 3b0398c3..acc49674 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/ZeroOpacityLayers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/ZeroOpacityLayers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/absolute-poition-in-rtl-parent-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/absolute-poition-in-rtl-parent-expected.png
index bb5ef68..77c54c89 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/absolute-poition-in-rtl-parent-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/absolute-poition-in-rtl-parent-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/clip-zooming-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/clip-zooming-expected.png
index a6e2ead2..2d51d6a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/clip-zooming-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/clip-zooming-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/color-correction-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/color-correction-expected.png
index d8e81c86..9b3a27e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/color-correction-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/color-correction-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/color-correction-on-text-shadow-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/color-correction-on-text-shadow-expected.png
index 8cc2730..51acf63 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/color-correction-on-text-shadow-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/color-correction-on-text-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/compare-content-style-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/compare-content-style-expected.png
index f900e76..eba8919 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/compare-content-style-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/compare-content-style-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/create_element_align-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/create_element_align-expected.png
index aa9e69d..e927104 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/create_element_align-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/create_element_align-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/find-next-layer-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/find-next-layer-expected.png
index cf495e1f..25a2dff 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/find-next-layer-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/find-next-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/first-letter-capitalized-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/first-letter-capitalized-expected.png
index b9ab41c..ecf952e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/first-letter-capitalized-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/first-letter-capitalized-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/first-letter-float-after-float-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/first-letter-float-after-float-expected.png
index 68a46fb4..688a9650 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/first-letter-float-after-float-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/first-letter-float-after-float-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/focus-ring-outline-color-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/focus-ring-outline-color-expected.png
index db787573..cca9786 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/focus-ring-outline-color-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/focus-ring-outline-color-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/image-orientation/image-orientation-default-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/image-orientation/image-orientation-default-expected.png
index b92fd75c..24bb01a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/image-orientation/image-orientation-default-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/image-orientation/image-orientation-default-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/last-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/last-of-type-pseudo-class-expected.png
index 1799735..426a716 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/last-of-type-pseudo-class-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/last-of-type-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png
index f981659..fa540f09 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/only-of-type-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/only-of-type-pseudo-class-expected.png
index 3d1e3ed..8eea776c 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/only-of-type-pseudo-class-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/only-of-type-pseudo-class-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/pendingStylesheetFontSize-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/pendingStylesheetFontSize-expected.png
index 1c3da69..4d98fab 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/pendingStylesheetFontSize-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/pendingStylesheetFontSize-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-expected.png
index da504dc..20258cf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png
index c2c2964..71084936 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-iframe-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-iframe-expected.png
index 2eff463..3aa9666f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-iframe-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/resize-corner-tracking-transformed-iframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/shadow-multiple-expected.png
index c985202..2d1ad8a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/shadow-multiple-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/shadow-multiple-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/simple-selector-chain-parsing-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/simple-selector-chain-parsing-expected.png
index 511deb1..ba4a5e8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/simple-selector-chain-parsing-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/simple-selector-chain-parsing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-expected.png
index 92d1173..138fb6a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-center-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-center-expected.png
index b288aa67a3..4bab32d 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-center-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-center-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
index cf53afa..78582770 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-right-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-right-expected.png
index ccfd493..ca9eb320 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-right-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/text-overflow-ellipsis-text-align-right-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/universal-hover-quirk-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/universal-hover-quirk-expected.png
index 5399409..2b7e48a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/universal-hover-quirk-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/universal-hover-quirk-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png
index 4dc2283f..7e8cec2 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png
index 4dc2283f..7e8cec2 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/visibility-hit-test-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/visibility-hit-test-expected.png
index b6b9df6..e0ea2af 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css/visibility-hit-test-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css/visibility-hit-test-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png
index b46d190..a74bb49 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-8bits-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
index 9b10d25..5c1eeaa3 100644
--- a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-justify/text-justify-distribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/009-horizontal-expected.png b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/009-horizontal-expected.png
index 0eb57da..a9f5e58 100644
--- a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/009-horizontal-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/009-horizontal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/010-expected.png b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/010-expected.png
index 86ec6eb5..865c628 100644
--- a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/010-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/018-expected.png b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/018-expected.png
index e824d36..233bbde84 100644
--- a/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/018-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/deprecated-flexbox/018-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt b/third_party/blink/web_tests/platform/mac/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/mac-retina/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt
rename to third_party/blink/web_tests/platform/mac/fast/dom/Range/collapsed-range-bounding-client-rect-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac/fast/dom/children-nodes-expected.png b/third_party/blink/web_tests/platform/mac/fast/dom/children-nodes-expected.png
index 6419db2..814e969e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/dom/children-nodes-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/dom/children-nodes-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/007-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/007-expected.png
index 50efa95b..c89d721f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/dynamic/007-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/012-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/012-expected.png
index 5508d248..01fb950f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/dynamic/012-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/012-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png
index 5660757..5947723 100644
--- a/third_party/blink/web_tests/platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/insert-before-table-part-in-continuation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/dynamic/noninlinebadness-expected.png b/third_party/blink/web_tests/platform/mac/fast/dynamic/noninlinebadness-expected.png
index 1d1b253..c0f4fe9 100644
--- a/third_party/blink/web_tests/platform/mac/fast/dynamic/noninlinebadness-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/dynamic/noninlinebadness-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
deleted file mode 100644
index 3a100a48..0000000
--- a/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-009-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This is a testharness.js-based test.
-PASS .grid 1
-FAIL .grid 2 assert_equals: 
-<div class="grid RTL">
-  <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
-  <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 35 but got 5
-PASS .grid 3
-FAIL .grid 4 assert_equals: 
-<div class="grid verticalRL">
-  <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div>
-  <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
-  <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetTop expected 115 but got 110
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
deleted file mode 100644
index 3a100a48..0000000
--- a/third_party/blink/web_tests/platform/win/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-010-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-This is a testharness.js-based test.
-PASS .grid 1
-FAIL .grid 2 assert_equals: 
-<div class="grid RTL">
-  <div data-offset-x="155" data-offset-y="0" data-expected-width="40" data-expected-height="80" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="80" data-offset-y="60" data-expected-width="60" data-expected-height="90" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="160" data-offset-y="160" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn LTR">X XX X</div>
-  <div data-offset-x="35" data-offset-y="160" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 35 but got 5
-PASS .grid 3
-FAIL .grid 4 assert_equals: 
-<div class="grid verticalRL">
-  <div data-offset-x="105" data-offset-y="70" data-expected-width="90" data-expected-height="30" class="firstRowFirstColumn horizontal">X XX X</div>
-  <div data-offset-x="140" data-offset-y="150" data-expected-width="100" data-expected-height="50" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="5" data-offset-y="10" data-expected-width="90" data-expected-height="30" class="secondRowFirstColumn horizontal RTL">X XX X</div>
-  <div data-offset-x="5" data-offset-y="115" data-expected-width="70" data-expected-height="80" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetTop expected 115 but got 110
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-01-expected.txt b/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-01-expected.txt
deleted file mode 100644
index 7eb8ae2..0000000
--- a/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-01-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-The texts between the markers should be identical.
-
-========Marker1========
-
-ab	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker2========
-
-WWaWWbWWWWWWWW	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker3========
-
-PASSED
diff --git a/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-05-expected.txt b/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-05-expected.txt
deleted file mode 100644
index e9c2297..0000000
--- a/third_party/blink/web_tests/platform/win/fast/css/content/content-quotes-05-expected.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-========Marker1========
-
-abc	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker2========
-
-WWaWWWbWWWWWcWWWW	1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
-
-========Marker3========
-
-PASSED
diff --git a/third_party/blink/web_tests/platform/win/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt b/third_party/blink/web_tests/platform/win/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
deleted file mode 100644
index f3c84c5..0000000
--- a/third_party/blink/web_tests/platform/win/fast/dom/nodesFromRect/nodesFromRect-basic-expected.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
-PASS All correct nodes found for rect
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/push-block-with-first-line-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/push-block-with-first-line-expected.txt
deleted file mode 100644
index ef3da81..0000000
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/push-block-with-first-line-expected.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [800, 600],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "paintInvalidations": [
-        {
-          "object": "NGPhysicalLineBoxFragment",
-          "rect": [8, 68, 784, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalLineBoxFragment",
-          "rect": [8, 8, 784, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalTextFragment 'JOCULAR'",
-          "rect": [8, 68, 140, 20],
-          "reason": "geometry"
-        },
-        {
-          "object": "NGPhysicalTextFragment 'JOCULAR'",
-          "rect": [8, 8, 140, 20],
-          "reason": "geometry"
-        }
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/virtual/cache-storage-sequence/external/wpt/service-workers/README.txt b/third_party/blink/web_tests/virtual/cache-storage-sequence/external/wpt/service-workers/README.txt
new file mode 100644
index 0000000..a63f3fc
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/cache-storage-sequence/external/wpt/service-workers/README.txt
@@ -0,0 +1,3 @@
+This suite runs the ServiceWorker and CacheStorage tests with the
+CacheStorageSequence feature disabled.  This makes CacheStorage operate on
+the IO thread in the browser process.
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 354693c..a88e5d1 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-10-1-66-g5a1a79c0e
-Revision: 5a1a79c0e8de8e886cc347ad22801982e8298a06
+Version: VER-2-10-1-67-g1e9229f0f
+Revision: 1e9229f0fcb46fd4cd8e0fdc48fb4a44ddb7a8a1
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
 License File: src/docs/FTL.TXT
diff --git a/tools/android/avd/proto/generic_android23.textpb b/tools/android/avd/proto/generic_android23.textpb
index 1a47060..00aec6d 100644
--- a/tools/android/avd/proto/generic_android23.textpb
+++ b/tools/android/avd/proto/generic_android23.textpb
@@ -19,7 +19,7 @@
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-23/google_apis/x86"
-  version: "6s0XsB3oZnvVldbnVr6tprNLoox0q5qrY3IMfiwE4qoC"
+  version: "E4QZINcjPpJ-j6SUPCJKGwVBD_jQY--F4sGiIWUPkeoC"
   dest_path: ".android"
 }
 avd_name: "android_23_google_apis_x86"
diff --git a/tools/android/avd/proto/generic_android28.textpb b/tools/android/avd/proto/generic_android28.textpb
index 07c1f6e..fe20974 100644
--- a/tools/android/avd/proto/generic_android28.textpb
+++ b/tools/android/avd/proto/generic_android28.textpb
@@ -19,7 +19,7 @@
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86"
-  version: "ejdvcz2sHZHdwemUpJrA3ydkYlYt1ECevi-7UD6tHcMC"
+  version: "LZ3LVXWiSLrfF6pHjuQ_LYHdQDoMGnqU1TuCmjp7UTAC"
   dest_path: ".android"
 }
 avd_name: "android_28_google_apis_x86"
diff --git a/tools/grit/grit/format/html_inline.py b/tools/grit/grit/format/html_inline.py
index 45c2eebd..9e7aff0 100755
--- a/tools/grit/grit/format/html_inline.py
+++ b/tools/grit/grit/format/html_inline.py
@@ -55,13 +55,14 @@
 _SRC_RE = lazy_re.compile(
     r'<(?!script)(?:[^>]+?\s)src="(?!\[\[|{{)(?P<filename>[^"\']*)"',
     re.MULTILINE)
-# This re matches '<img srcset="..."'
+# This re matches '<img srcset="..."' or '<source srcset="..."'
 _SRCSET_RE = lazy_re.compile(
-    r'<img\b(?:[^>]*?\s)srcset="(?!\[\[|{{|\$i18n{)(?P<srcset>[^"\']*)"',
+    r'<(img|source)\b(?:[^>]*?\s)srcset="(?!\[\[|{{|\$i18n{)'
+    r'(?P<srcset>[^"\']*)"',
     re.MULTILINE)
 # This re is for splitting srcset value string into "image candidate strings".
 # Notes:
-# - HTML 5.2 states that URL cannot start with comma.
+# - HTML 5.2 states that URL cannot start or end with comma.
 # - the "descriptor" is either "width descriptor" or "pixel density descriptor".
 #   The first one consists of "valid non-negative integer + letter 'x'",
 #   the second one is formed of "positive valid floating-point number +
@@ -69,7 +70,9 @@
 #   that form both of them.
 # Matches for example "img2.png 2x" or "img9.png 11E-2w".
 _SRCSET_ENTRY_RE = lazy_re.compile(
-    r'\s*(?P<url>[^,]\S+)\s+(?P<descriptor>[\deE.-]+[wx])\s*',
+    r'\s*(?P<url>[^,\s]\S+[^,\s])'
+    r'(?:\s+(?P<descriptor>[\deE.-]+[wx]))?\s*'
+    r'(?P<separator>,|$)',
     re.MULTILINE)
 _ICON_RE = lazy_re.compile(
     r'<link rel="icon"\s(?:[^>]+?\s)?'
@@ -194,6 +197,7 @@
   # Each of them consists of URL and descriptor.
   # _SRCSET_ENTRY_RE splits srcset into a list of URLs, descriptors and
   # commas.
+  # The descriptor part will be None if that optional regex didn't match
   parts = _SRCSET_ENTRY_RE.split(srcset)
 
   if not parts:
@@ -206,37 +210,35 @@
   # candidate string: [url, descriptor]
   candidate = [];
 
-  for part in parts:
-    if not part:
-      continue
+  # Each entry should consist of some text before the entry, the url,
+  # the descriptor or None if the entry has no descriptor, a comma separator or
+  # the end of the line, and finally some text after the entry (which is the
+  # same as the text before the next entry).
+  for i in range(0, len(parts) - 1, 4):
+    before, url, descriptor, separator, after = parts[i:i+5]
 
-    if part == ',':
-      # There must be no URL without a descriptor.
-      assert not candidate, "Bad srcset format in '%s'" % srcset_match.group(0)
-      continue
-
-    if candidate:
-      # descriptor found
-      if candidate[0]:
-        # This is not "names_only" mode.
-        candidate.append(part)
-        new_candidates.append(" ".join(candidate))
-
-      candidate = []
-      continue
+    # There must be a comma-separated next entry or this must be the last entry.
+    assert separator == "," or (separator == "" and i == len(parts) - 5), (
+           "Bad srcset format in {}".format(srcset_match.group(0)))
+    # Both before and after the entry must be empty
+    assert before == after == "", (
+           "Bad srcset format in {}".format(srcset_match.group(0)))
 
     if filename_expansion_function:
-      filename = filename_expansion_function(part)
+      filename = filename_expansion_function(url)
     else:
-      filename = part
+      filename = url
 
     data_url = ConvertFileToDataURL(filename, base_path, distribution,
                                     inlined_files, names_only)
 
-    candidate.append(data_url)
+    # This is not "names_only" mode
+    if data_url:
+      candidate = [data_url]
+      if descriptor:
+        candidate.append(descriptor)
 
-  # There must be no URL without a descriptor
-  assert not candidate, "Bad srcset ending in '%s' " % srcset_match.group(0)
+      new_candidates.append(" ".join(candidate))
 
   prefix = srcset_match.string[srcset_match.start():
       srcset_match.start('srcset')]
diff --git a/tools/grit/grit/format/html_inline_unittest.py b/tools/grit/grit/format/html_inline_unittest.py
index e71d87c..89158623 100755
--- a/tools/grit/grit/format/html_inline_unittest.py
+++ b/tools/grit/grit/format/html_inline_unittest.py
@@ -597,7 +597,8 @@
   def testImgSrcset(self):
     '''Tests that img srcset="" attributes are converted.'''
 
-    # Note that there is no space before "img10.png"
+    # Note that there is no space before "img10.png" and that
+    # "img11.png" has no descriptor.
     files = {
       'index.html': '''
       <html>
@@ -606,6 +607,9 @@
       <img src="chrome://theme/img11.png" srcset="img7.png 1x, '''\
           '''chrome://theme/img13.png 2x">
       <img srcset="img8.png 300w, img9.png 11E-2w,img10.png -1e2w">
+      <img srcset="img11.png">
+      <img srcset="img11.png, img2.png 1x">
+      <img srcset="img2.png 1x, img11.png">
       </html>
       ''',
       'img1.png': '''a1''',
@@ -618,6 +622,7 @@
       'img8.png': '''a8''',
       'img9.png': '''a9''',
       'img10.png': '''a10''',
+      'img11.png': '''a11''',
     }
 
     expected_inlined = '''
@@ -630,6 +635,9 @@
           '''YTc= 1x,chrome://theme/img13.png 2x">
       <img srcset="data:image/png;base64,YTg= 300w,data:image/png;base64,'''\
           '''YTk= 11E-2w,data:image/png;base64,YTEw -1e2w">
+      <img srcset="data:image/png;base64,YTEx">
+      <img srcset="data:image/png;base64,YTEx,data:image/png;base64,YTI= 1x">
+      <img srcset="data:image/png;base64,YTI= 1x,data:image/png;base64,YTEx">
       </html>
       '''
 
@@ -681,6 +689,63 @@
                          util.FixLineEnd(result.inlined_data, '\n'))
     tmp_dir.CleanUp()
 
+  def testSourceSrcset(self):
+    '''Tests that source srcset="" attributes are converted.'''
+
+    # Note that there is no space before "img10.png" and that
+    # "img11.png" has no descriptor.
+    files = {
+      'index.html': '''
+      <html>
+      <source src="img1.png" srcset="img2.png 1x, img3.png 2x">
+      <source src="img4.png" srcset=" img5.png   1x , img6.png 2x ">
+      <source src="chrome://theme/img11.png" srcset="img7.png 1x, '''\
+          '''chrome://theme/img13.png 2x">
+      <source srcset="img8.png 300w, img9.png 11E-2w,img10.png -1e2w">
+      <source srcset="img11.png">
+      </html>
+      ''',
+      'img1.png': '''a1''',
+      'img2.png': '''a2''',
+      'img3.png': '''a3''',
+      'img4.png': '''a4''',
+      'img5.png': '''a5''',
+      'img6.png': '''a6''',
+      'img7.png': '''a7''',
+      'img8.png': '''a8''',
+      'img9.png': '''a9''',
+      'img10.png': '''a10''',
+      'img11.png': '''a11''',
+    }
+
+    expected_inlined = '''
+      <html>
+      <source src="data:image/png;base64,YTE=" srcset="data:image/png;'''\
+          '''base64,YTI= 1x,data:image/png;base64,YTM= 2x">
+      <source src="data:image/png;base64,YTQ=" srcset="data:image/png;'''\
+          '''base64,YTU= 1x,data:image/png;base64,YTY= 2x">
+      <source src="chrome://theme/img11.png" srcset="data:image/png;'''\
+          '''base64,YTc= 1x,chrome://theme/img13.png 2x">
+      <source srcset="data:image/png;base64,YTg= 300w,data:image/png;'''\
+          '''base64,YTk= 11E-2w,data:image/png;base64,YTEw -1e2w">
+      <source srcset="data:image/png;base64,YTEx">
+      </html>
+      '''
+
+    source_resources = set()
+    tmp_dir = util.TempDir(files)
+    for filename in files:
+      source_resources.add(tmp_dir.GetPath(filename))
+
+    # Test normal inlining.
+    result = html_inline.DoInline(tmp_dir.GetPath('index.html'), None)
+    resources = result.inlined_files
+    resources.add(tmp_dir.GetPath('index.html'))
+    self.failUnlessEqual(resources, source_resources)
+    self.failUnlessEqual(expected_inlined,
+                         util.FixLineEnd(result.inlined_data, '\n'))
+    tmp_dir.CleanUp()
+
   def testConditionalInclude(self):
     '''Tests that output and dependency generation includes only files not'''\
         ''' blocked by  <if> macros.'''
diff --git a/tools/json_to_struct/json_to_struct.py b/tools/json_to_struct/json_to_struct.py
index 46cfd4a..f3668d0 100755
--- a/tools/json_to_struct/json_to_struct.py
+++ b/tools/json_to_struct/json_to_struct.py
@@ -136,6 +136,13 @@
     for element_name, element in description['elements'].items():
       f.write('extern const %s %s;\n' % (schema['type_name'], element_name))
 
+    if 'generate_array' in description:
+      f.write('\n')
+      f.write('extern const %s* const %s[];\n' % (schema['type_name'],
+          description['generate_array']['array_name']))
+      f.write('extern const size_t %s;\n' %
+          (description['generate_array']['array_name'] + 'Length'))
+
     if namespace:
       f.write('\n')
       f.write('}  // namespace %s\n' % namespace)
@@ -171,6 +178,17 @@
     f.write(element_generator.GenerateElements(schema['type_name'],
         schema['schema'], description))
 
+    if 'generate_array' in description:
+      f.write('\n')
+      f.write('const %s* const %s[] = {\n' % (schema['type_name'],
+          description['generate_array']['array_name']))
+      for element_name, _ in description['elements'].items():
+        f.write('\t&%s,\n' % element_name)
+      f.write('};\n')
+      f.write('const size_t %s = %d;\n' %
+          (description['generate_array']['array_name'] + 'Length',
+           len(description['elements'])))
+
     if namespace:
       f.write('\n')
       f.write('}  // namespace %s\n' % namespace)
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 9136d78..50e0153a 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -24881,6 +24881,7 @@
   <int value="3049" label="RenderSubtreeAttribute"/>
   <int value="3050" label="ARIAAnnotationRoles"/>
   <int value="3051" label="IntersectionObserverV2"/>
+  <int value="3052" label="HeavyAdIntervention"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
diff --git a/tools/metrics/histograms/extract_histograms.py b/tools/metrics/histograms/extract_histograms.py
index f45619565..003314f9 100644
--- a/tools/metrics/histograms/extract_histograms.py
+++ b/tools/metrics/histograms/extract_histograms.py
@@ -57,7 +57,13 @@
 
 import copy
 import datetime
-import HTMLParser
+
+try:
+  import HTMLParser
+  html = HTMLParser.HTMLParser()
+except ImportError:  # For Py3 compatibility
+  import html
+
 import logging
 import re
 import xml.dom.minidom
@@ -142,7 +148,7 @@
 
   # Unescape using default ASCII encoding. Unescapes any HTML escaped character
   # like &quot; etc.
-  return HTMLParser.HTMLParser().unescape(line)
+  return html.unescape(line)
 
 
 def _NormalizeAllAttributeValues(node):
diff --git a/tools/metrics/histograms/extract_histograms_test.py b/tools/metrics/histograms/extract_histograms_test.py
index 7a69dbf..e015c56 100644
--- a/tools/metrics/histograms/extract_histograms_test.py
+++ b/tools/metrics/histograms/extract_histograms_test.py
@@ -478,8 +478,8 @@
     self.assertFalse(have_errors)
     self.assertIn('Test.Histogram', hists)
     self.assertIn('summary', hists['Test.Histogram'])
-    self.assertEquals('This is a summary with & and " and \'',
-                      hists['Test.Histogram']['summary'])
+    self.assertEqual('This is a summary with & and " and \'',
+                     hists['Test.Histogram']['summary'])
 
   def testNewSuffixWithoutLabel(self):
     suffix_without_label = xml.dom.minidom.parseString("""
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index c900f8e..e84b597 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -715,7 +715,7 @@
 </histogram>
 
 <histogram name="AccountManager.InitializationTime" units="microseconds"
-    expires_after="2020-01-31">
+    expires_after="2020-04-05">
   <owner>sinhak@chromium.org</owner>
   <owner>anastasiian@chromium.org</owner>
   <summary>
@@ -766,7 +766,7 @@
 </histogram>
 
 <histogram name="AccountManager.TokenLoadStatus"
-    enum="AccountManagerTokenLoadStatus" expires_after="2020-01-31">
+    enum="AccountManagerTokenLoadStatus" expires_after="2020-04-05">
   <owner>sinhak@chromium.org</owner>
   <owner>anastasiian@chromium.org</owner>
   <summary>
@@ -1183,7 +1183,7 @@
 </histogram>
 
 <histogram name="AnchorElementMetrics.Clicked.AreaRank" units="rank"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>chelu@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
@@ -1588,7 +1588,7 @@
 </histogram>
 
 <histogram name="Android.AppNotificationStatus" enum="NotificationAppStatus"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>peter@chromium.org</owner>
   <summary>
     Records whether notifications are enabled for Chrome, as the Android app,
@@ -1713,7 +1713,7 @@
 </histogram>
 
 <histogram name="Android.BackgroundTaskScheduler.TaskCreated.WithExpiration"
-    enum="BackgroundTaskId" expires_after="2020-01-31">
+    enum="BackgroundTaskId" expires_after="2020-04-05">
   <owner>ioanastefan@chromium.org</owner>
   <owner>nator@chromium.org</owner>
   <owner>knollr@chromium.org</owner>
@@ -1724,7 +1724,7 @@
 </histogram>
 
 <histogram name="Android.BackgroundTaskScheduler.TaskCreated.WithoutExpiration"
-    enum="BackgroundTaskId" expires_after="2020-01-31">
+    enum="BackgroundTaskId" expires_after="2020-04-05">
   <owner>ioanastefan@chromium.org</owner>
   <owner>nator@chromium.org</owner>
   <owner>knollr@chromium.org</owner>
@@ -2635,7 +2635,7 @@
 </histogram>
 
 <histogram base="true" name="Android.FeatureModules.CachedAwakeInstallDuration"
-    units="ms" expires_after="2020-01-01">
+    units="ms" expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes
        name="AndroidFeatureModuleName" -->
 
@@ -3013,7 +3013,7 @@
 </histogram>
 
 <histogram base="true" name="Android.MemoryPressureNotification"
-    enum="Android.MemoryPressureNotification" expires_after="2020-02-02">
+    enum="Android.MemoryPressureNotification" expires_after="2020-04-05">
   <owner>ssid@chromium.org</owner>
   <summary>
     Memory pressure notifications sent by Android through ComponentCallbacks2.
@@ -4301,7 +4301,7 @@
 </histogram>
 
 <histogram name="AndroidSms.FcmMessageDispatchFailure"
-    enum="AndroidSmsFcmMessageType" expires_after="2020-02-02">
+    enum="AndroidSmsFcmMessageType" expires_after="2020-04-05">
   <owner>azeemarshad@chromium.org</owner>
   <summary>
     Records message types for which all retry attempts failed when dispatching
@@ -4842,7 +4842,7 @@
   </summary>
 </histogram>
 
-<histogram name="Apps.AppLaunch" enum="AppLaunch" expires_after="2020-02-02">
+<histogram name="Apps.AppLaunch" enum="AppLaunch" expires_after="2020-04-05">
   <owner>tapted@chromium.org</owner>
   <owner>benwells@chromium.org</owner>
   <summary>
@@ -4932,7 +4932,8 @@
   </summary>
 </histogram>
 
-<histogram name="Apps.AppList.DriveQuickAccessProvider.Latency" units="ms">
+<histogram name="Apps.AppList.DriveQuickAccessProvider.Latency" units="ms"
+    expires_after="2020-04-05">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
@@ -4999,7 +5000,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.ZeroStateResults.LaunchedItemType"
-    enum="ZeroStateResultType">
+    enum="ZeroStateResultType" expires_after="2020-04-05">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
@@ -5045,7 +5046,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.ZeroStateResultsList.Clicked"
-    enum="BooleanClicked">
+    enum="BooleanClicked" expires_after="2020-04-05">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
@@ -5255,7 +5256,7 @@
 </histogram>
 
 <histogram name="Apps.AppListHide.InputLatency" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>wutao@chromium.org</owner>
   <summary>
     Elapsed time from the input event to hide the launcher UI. This is logged
@@ -5550,7 +5551,7 @@
 </histogram>
 
 <histogram name="Apps.AppListShow.InputLatency" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>wutao@chromium.org</owner>
   <summary>
     Elapsed time from the input event to show the launcher UI. This is logged
@@ -6397,7 +6398,7 @@
 </histogram>
 
 <histogram name="Arc.EngagementTime.Background" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>maajid@google.com</owner>
   <owner>shaochuan@google.com</owner>
   <owner>shihuis@google.com</owner>
@@ -6530,7 +6531,7 @@
 </histogram>
 
 <histogram name="Arc.IntentHelper.OpenType" enum="ArcIntentHelperOpenType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>hashimoto@google.com</owner>
   <owner>shihuis@google.com</owner>
   <summary>
@@ -6626,7 +6627,7 @@
 </histogram>
 
 <histogram name="Arc.OptInSilentAuthCode" enum="ArcOptInSilentAuthCode"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>elijahtaylor@google.com</owner>
   <summary>
     Arc Silent Auth Code status. This status is set during the ARC OptIn flow.
@@ -6718,7 +6719,7 @@
 </histogram>
 
 <histogram base="true" name="Arc.Provisioning.Result"
-    enum="ArcProvisioningResult" expires_after="2020-02-02">
+    enum="ArcProvisioningResult" expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="ArcUserTypes" -->
 
   <owner>alexchau@google.com</owner>
@@ -7870,7 +7871,7 @@
 </histogram>
 
 <histogram base="true" name="Ash.SplitViewResize.PresentationTime.MaxLatency"
-    units="ms" expires_after="2020-02-02">
+    units="ms" expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="SplitViewResizeModes" -->
 
   <owner>omrilio@chromium.org</owner>
@@ -8134,7 +8135,7 @@
 </histogram>
 
 <histogram name="Ash.TouchView.TouchViewInactiveTotal" units="minutes"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>girard@chromium.org</owner>
   <summary>
     The total time that TouchView is not active during a session.
@@ -8752,7 +8753,7 @@
 </histogram>
 
 <histogram name="Assistant.QueryCountPerEntryPoint" enum="AssistantEntryPoint"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>xiaohuic@chromium.org</owner>
   <owner>meilinw@chromium.org</owner>
   <summary>Number of queries fired for each entry point.</summary>
@@ -9698,7 +9699,7 @@
 </histogram>
 
 <histogram name="Aura.CreatedGpuBrowserCompositor" enum="CompositorType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>jbauman@chromium.org</owner>
   <summary>
     Whether the browser compositor uses GPU or the software renderer.
@@ -9706,7 +9707,7 @@
 </histogram>
 
 <histogram name="AuthPolicy.ErrorTypeOfAuthenticateUser"
-    enum="AuthPolicyErrorType" expires_after="2020-01-20">
+    enum="AuthPolicyErrorType" expires_after="2020-04-05">
   <owner>fsandrade@chromium.org</owner>
   <owner>ljusten@chromium.org</owner>
   <owner>tomdobro@chromium.org</owner>
@@ -9734,7 +9735,7 @@
 </histogram>
 
 <histogram name="AuthPolicy.ErrorTypeOfGetUserKerberosFiles"
-    enum="AuthPolicyErrorType">
+    enum="AuthPolicyErrorType" expires_after="2020-04-05">
   <owner>fsandrade@chromium.org</owner>
   <owner>ljusten@chromium.org</owner>
   <owner>tomdobro@chromium.org</owner>
@@ -9755,7 +9756,8 @@
   </summary>
 </histogram>
 
-<histogram name="AuthPolicy.ErrorTypeOfJoinADDomain" enum="AuthPolicyErrorType">
+<histogram name="AuthPolicy.ErrorTypeOfJoinADDomain" enum="AuthPolicyErrorType"
+    expires_after="2020-04-05">
   <owner>fsandrade@chromium.org</owner>
   <owner>ljusten@chromium.org</owner>
   <owner>tomdobro@chromium.org</owner>
@@ -9824,7 +9826,7 @@
 </histogram>
 
 <histogram name="AuthPolicy.TimeToAuthenticateUser" units="ms"
-    expires_after="2020-01-20">
+    expires_after="2020-04-05">
   <owner>fsandrade@chromium.org</owner>
   <owner>ljusten@chromium.org</owner>
   <owner>tomdobro@chromium.org</owner>
@@ -9834,7 +9836,8 @@
   </summary>
 </histogram>
 
-<histogram name="AuthPolicy.TimeToGetUserKerberosFiles" units="ms">
+<histogram name="AuthPolicy.TimeToGetUserKerberosFiles" units="ms"
+    expires_after="2020-04-05">
   <owner>fsandrade@chromium.org</owner>
   <owner>ljusten@chromium.org</owner>
   <owner>tomdobro@chromium.org</owner>
@@ -9856,7 +9859,8 @@
   </summary>
 </histogram>
 
-<histogram name="AuthPolicy.TimeToJoinADDomain" units="ms">
+<histogram name="AuthPolicy.TimeToJoinADDomain" units="ms"
+    expires_after="2020-04-05">
   <owner>fsandrade@chromium.org</owner>
   <owner>ljusten@chromium.org</owner>
   <owner>tomdobro@chromium.org</owner>
@@ -9868,7 +9872,7 @@
 </histogram>
 
 <histogram name="AuthPolicy.TimeToRefreshDevicePolicy" units="ms"
-    expires_after="2020-01-20">
+    expires_after="2020-04-05">
   <owner>fsandrade@chromium.org</owner>
   <owner>ljusten@chromium.org</owner>
   <owner>tomdobro@chromium.org</owner>
@@ -9880,7 +9884,7 @@
 </histogram>
 
 <histogram name="AuthPolicy.TimeToRefreshUserPolicy" units="ms"
-    expires_after="2020-01-20">
+    expires_after="2020-04-05">
   <owner>fsandrade@chromium.org</owner>
   <owner>ljusten@chromium.org</owner>
   <owner>tomdobro@chromium.org</owner>
@@ -13292,7 +13296,7 @@
 </histogram>
 
 <histogram name="BackgroundMode.BackgroundApplicationsCount" units="units"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>atwilson@chromium.org</owner>
   <owner>mvanouwerkerk@chromium.org</owner>
   <summary>
@@ -14766,7 +14770,7 @@
 </histogram>
 
 <histogram name="Blink.DecodedImage.WebPFileFormat" enum="WebPFileFormat"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>mcasas@chromium.org</owner>
   <owner>andrescj@chromium.org</owner>
   <summary>
@@ -15168,7 +15172,7 @@
 
 <histogram
     name="Blink.LazyLoad.CrossOriginFrames.LoadStartedAfterBeingDeferred"
-    enum="NQEEffectiveConnectionType" expires_after="2020-02-02">
+    enum="NQEEffectiveConnectionType" expires_after="2020-04-05">
   <owner>sclittle@chromium.org</owner>
   <summary>
     Records the effective connection type whenever a lazily-loaded iframe that
@@ -15182,7 +15186,7 @@
 </histogram>
 
 <histogram name="Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred"
-    enum="NQEEffectiveConnectionType" expires_after="2020-02-02">
+    enum="NQEEffectiveConnectionType" expires_after="2020-04-05">
   <owner>sclittle@chromium.org</owner>
   <summary>
     Records the effective connection type whenever a lazily-loaded iframe that
@@ -15430,7 +15434,7 @@
 </histogram>
 
 <histogram name="Blink.OffscreenCanvas.ContextType" enum="CanvasContextType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>aaronhk@chromium.org</owner>
   <owner>fserb@chromium.org</owner>
   <summary>
@@ -15440,7 +15444,7 @@
 </histogram>
 
 <histogram name="Blink.OffscreenCanvas.NewOffscreenCanvas" enum="Boolean"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>aaronhk@chromium.org</owner>
   <owner>fserb@chromium.org</owner>
   <summary>
@@ -15608,7 +15612,7 @@
 </histogram>
 
 <histogram name="Blink.ResourceFetcher.StaleWhileRevalidateDuration" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dtapuska@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <summary>Duration of completed stale revalidation attempts.</summary>
@@ -16450,7 +16454,7 @@
 </histogram>
 
 <histogram name="Blink.VisibleBeforeLoaded.LazyLoadEligibleFrames.BelowTheFold"
-    enum="NQEEffectiveConnectionType" expires_after="2020-02-02">
+    enum="NQEEffectiveConnectionType" expires_after="2020-04-05">
   <owner>sclittle@chromium.org</owner>
   <summary>
     Records the effective connection type whenever a lazyload-eligible (i.e.
@@ -16460,7 +16464,7 @@
 </histogram>
 
 <histogram name="Blink.VisibleBeforeLoaded.LazyLoadImages.AboveTheFold"
-    enum="NQEEffectiveConnectionType" expires_after="2020-02-02">
+    enum="NQEEffectiveConnectionType" expires_after="2020-04-05">
   <owner>sclittle@chromium.org</owner>
   <owner>rajendrant@chromium.org</owner>
   <summary>
@@ -16470,7 +16474,7 @@
 </histogram>
 
 <histogram name="Blink.VisibleBeforeLoaded.LazyLoadImages.BelowTheFold"
-    enum="NQEEffectiveConnectionType" expires_after="2020-02-02">
+    enum="NQEEffectiveConnectionType" expires_after="2020-04-05">
   <owner>sclittle@chromium.org</owner>
   <owner>rajendrant@chromium.org</owner>
   <summary>
@@ -16480,7 +16484,7 @@
 </histogram>
 
 <histogram name="Blink.VisibleLoadTime.LazyLoadEligibleFrames.AboveTheFold"
-    units="ms" expires_after="2020-02-02">
+    units="ms" expires_after="2020-04-05">
   <owner>sclittle@chromium.org</owner>
   <summary>
     Milliseconds spent waiting for an above the fold iframe to load. Only fires
@@ -16490,7 +16494,7 @@
 </histogram>
 
 <histogram name="Blink.VisibleLoadTime.LazyLoadEligibleFrames.BelowTheFold"
-    units="ms" expires_after="2020-02-02">
+    units="ms" expires_after="2020-04-05">
   <owner>sclittle@chromium.org</owner>
   <summary>
     Milliseconds spent waiting for a below the fold iframe to load. Only fires
@@ -16500,7 +16504,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.VisibleLoadTime.LazyLoadImages.AboveTheFold"
-    units="ms" expires_after="2020-02-02">
+    units="ms" expires_after="2020-04-05">
   <owner>rajendrant@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <summary>
@@ -16512,7 +16516,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.VisibleLoadTime.LazyLoadImages.BelowTheFold"
-    units="ms" expires_after="2020-02-02">
+    units="ms" expires_after="2020-04-05">
   <owner>rajendrant@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <summary>
@@ -18058,7 +18062,7 @@
 </histogram>
 
 <histogram name="Bookmarks.EntryPoint" enum="BookmarksEntryPoint"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>ianwen@chromium.org</owner>
   <summary>How users add a new bookmark.</summary>
 </histogram>
@@ -19076,7 +19080,7 @@
 </histogram>
 
 <histogram name="CaptivePortal.Notification.Status"
-    enum="CaptivePortalNotificationStatus" expires_after="2020-02-01">
+    enum="CaptivePortalNotificationStatus" expires_after="2020-04-05">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -19086,7 +19090,7 @@
 </histogram>
 
 <histogram name="CaptivePortal.Notification.UserAction"
-    enum="CaptivePortalNotificationUserAction" expires_after="2020-02-01">
+    enum="CaptivePortalNotificationUserAction" expires_after="2020-04-05">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -19095,7 +19099,7 @@
 </histogram>
 
 <histogram name="CaptivePortal.OOBE.DetectionDuration" units="ms"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -19128,7 +19132,7 @@
 </histogram>
 
 <histogram name="CaptivePortal.OOBE.PortalToOnlineTransition" units="ms"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -19138,7 +19142,7 @@
 </histogram>
 
 <histogram name="CaptivePortal.RedirectTime" units="ms"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -19148,7 +19152,7 @@
 </histogram>
 
 <histogram name="CaptivePortal.Session.DetectionDuration" units="ms"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -25071,7 +25075,7 @@
 </histogram>
 
 <histogram name="Cookie.TimeDatabaseMigrationToV10" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>pwnall@chromium.org</owner>
   <summary>
     The amount of time (ms) to migrate a v9 cookie database to v10.
@@ -25828,7 +25832,7 @@
 </histogram>
 
 <histogram name="Cras.StreamTimeoutMilliSeconds" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>hychao@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
@@ -26057,7 +26061,7 @@
 </histogram>
 
 <histogram name="CrosDisks.FilesystemType" enum="CrosDisksFilesystemType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>benchan@chromium.org</owner>
   <summary>
     The type of file system that Chrome OS cros-disks daemon is requested to
@@ -26093,7 +26097,7 @@
 </histogram>
 
 <histogram name="CrosDisksClient.MountErrorMountType"
-    enum="CrosDisksMountTypeError" expires_after="2020-02-02">
+    enum="CrosDisksMountTypeError" expires_after="2020-04-05">
   <owner>amistry@chromium.org</owner>
   <summary>
     The {mount type}x{mount error code} received from the Chrome OS cros-disks
@@ -27209,7 +27213,7 @@
 </histogram>
 
 <histogram name="Cryptohome.TimeToTakeTpmOwnership" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>apronin@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -34405,7 +34409,7 @@
 </histogram>
 
 <histogram name="Download.ParallelDownloadAddStreamSuccess"
-    enum="BooleanSuccess" expires_after="2020-01-30">
+    enum="BooleanSuccess" expires_after="2020-04-05">
   <owner>xingliu@chromium.org</owner>
   <summary>
     Records if the byte stream reader of a subsequent request is successfully
@@ -34414,7 +34418,7 @@
 </histogram>
 
 <histogram name="Download.ParallelDownloadRequestCount" units="requests"
-    expires_after="2020-01-30">
+    expires_after="2020-04-05">
   <owner>xingliu@chromium.org</owner>
   <summary>
     The total number of requests sent for a parallel download, including the
@@ -34524,7 +34528,7 @@
 </histogram>
 
 <histogram name="Download.ResumptionComplete.HasStrongValidators"
-    enum="BooleanHasStrongValidators" expires_after="2020-01-30">
+    enum="BooleanHasStrongValidators" expires_after="2020-04-05">
   <owner>qinmin@chromium.org</owner>
   <owner>xingliu@chromium.org</owner>
   <summary>
@@ -34553,7 +34557,7 @@
 </histogram>
 
 <histogram name="Download.ResumptionStart.HasStrongValidators"
-    enum="BooleanHasStrongValidators" expires_after="2020-01-30">
+    enum="BooleanHasStrongValidators" expires_after="2020-04-05">
   <owner>qinmin@chromium.org</owner>
   <owner>xingliu@chromium.org</owner>
   <summary>
@@ -37564,7 +37568,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.IsManaged" enum="BooleanEnabled"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>rogerta@chromium.org</owner>
   <summary>
     Whether the machine is managed via MDM. This check is performed once at
@@ -38226,7 +38230,7 @@
 </histogram>
 
 <histogram name="Event.Latency.BlockingTime.TouchMoveDefaultAllowed" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tdresser@chromium.org</owner>
   <summary>
     Time between the renderer main thread receiving a touchmove event and acking
@@ -38259,7 +38263,7 @@
 </histogram>
 
 <histogram name="Event.Latency.BlockingTime.TouchStartDefaultPrevented"
-    units="ms" expires_after="2020-02-02">
+    units="ms" expires_after="2020-04-05">
   <owner>tdresser@chromium.org</owner>
   <summary>
     Time between the renderer main thread receiving a touchstart event and
@@ -38872,7 +38876,7 @@
 </histogram>
 
 <histogram name="Event.Latency.EndToEnd.TouchpadPinch" units="microseconds"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>input-dev@chromium.org</owner>
   <summary>
     Time between the OS receiving a touchpad pinch event and the resulting GPU
@@ -39343,7 +39347,7 @@
 </histogram>
 
 <histogram name="Event.Latency.ScrollBegin.Touch.GpuSwap2" units="microseconds"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tdresser@chromium.org</owner>
   <summary>
     Time between gpu starts to swap the first ScrollUpdate gesture event in a
@@ -39544,7 +39548,7 @@
 
 <histogram
     name="Event.Latency.ScrollBegin.Wheel.RendererSwapToBrowserNotified2"
-    units="microseconds" expires_after="2020-02-02">
+    units="microseconds" expires_after="2020-04-05">
   <owner>tdresser@chromium.org</owner>
   <summary>
     Time between the renderer starts to swap a frame induced by the first
@@ -40033,7 +40037,7 @@
 </histogram>
 
 <histogram name="Event.Latency.ScrollUpdate.Touch.GpuSwap2"
-    units="microseconds" expires_after="2020-02-02">
+    units="microseconds" expires_after="2020-04-05">
   <owner>tdresser@chromium.org</owner>
   <summary>
     Time between gpu starts to swap a ScrollUpdate gesture event with touch
@@ -41417,7 +41421,7 @@
 </histogram>
 
 <histogram name="ExploreSites.ClickedNTPCategoryIndex"
-    enum="MostVisitedTileIndex" expires_after="2020-02-02">
+    enum="MostVisitedTileIndex" expires_after="2020-04-05">
   <owner>dimich@chromium.org</owner>
   <summary>
     0-based index of a category tile on NTP which was clicked by the user.
@@ -47262,7 +47266,7 @@
 </histogram>
 
 <histogram name="Feedback.RequestSource" enum="FeedbackSource"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>afakhry@chromium.org</owner>
   <summary>Records the source that requested showing the feedback app.</summary>
 </histogram>
@@ -49204,7 +49208,7 @@
 </histogram>
 
 <histogram name="GCM.SendWebPushMessagePayloadSize" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>alexchau@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -49214,7 +49218,7 @@
 </histogram>
 
 <histogram name="GCM.SendWebPushMessageResult" enum="SendWebPushMessageResult"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>alexchau@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -56708,6 +56712,20 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.CRWWKNavigationStatesRemoveOldPending" enum="Boolean"
+    expires_after="2020-04-05">
+  <owner>justincohen@chromium.org</owner>
+  <owner>gambard@chromium.org</owner>
+  <summary>
+    Workaround for a WKWebView bug where WKNavigations can leak, leaving a
+    permanent pending URL, thus breaking the omnibox. While it is possible for
+    navigations to finish out-of-order, it's an edge case that should be handled
+    gracefully, as last committed will appear in the omnibox instead of the
+    pending URL. This metric records whether there are old navigations to clean
+    up each time a navigation finishes. See crbug.com/1010765 for details.
+  </summary>
+</histogram>
+
 <histogram name="IOS.Dialogs.JavaScriptDialogClosed"
     enum="IOSJavaScriptDialogDismissalCause" expires_after="M80">
   <owner>kkhorimoto@chromium.org</owner>
@@ -58303,7 +58321,7 @@
 </histogram>
 
 <histogram name="LibraryLoader.PrefetchDetailedStatus"
-    enum="LibraryLoaderPrefetchDetailedStatus" expires_after="M79">
+    enum="LibraryLoaderPrefetchDetailedStatus" expires_after="2020-04-05">
   <owner>lizeb@chromium.org</owner>
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -58410,7 +58428,7 @@
 </histogram>
 
 <histogram name="LoadingPredictor.PreconnectLearningRecall" units="%"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>alexilin@chromium.org</owner>
   <summary>
     When the loading predictor has origins in the local database for a given
@@ -58876,7 +58894,7 @@
 </histogram>
 
 <histogram name="Login.PromptToCompleteLoginTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>achuith@chromium.org</owner>
   <summary>
     Time from first display of the login prompt until the user completes signing
@@ -58884,7 +58902,7 @@
   </summary>
 </histogram>
 
-<histogram name="Login.PromptToLoginTime" units="ms" expires_after="2020-02-02">
+<histogram name="Login.PromptToLoginTime" units="ms" expires_after="2020-04-05">
   <owner>elijahtaylor@google.com</owner>
   <owner>yusukes@chromium.org</owner>
   <summary>
@@ -58902,7 +58920,7 @@
 </histogram>
 
 <histogram name="Login.SessionExitType" enum="LoginSessionExitType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>iby@chromium.org</owner>
   <summary>
     Tracks whether a ChromeOS user was logged out because Chrome repeatedly
@@ -59002,7 +59020,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.CpuUsageMilliPercent"
-    units="1/1000ths of %" expires_after="2020-02-01">
+    units="1/1000ths of %" expires_after="2020-04-05">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>
@@ -59014,7 +59032,7 @@
 <histogram base="true"
     name="MachineLearningService.CreateGraphExecutorResult.Event"
     enum="MachineLearningServiceCreateGraphExecutorResultEvent"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
@@ -59033,7 +59051,7 @@
 </histogram>
 
 <histogram base="true" name="MachineLearningService.ExecuteResult.Event"
-    enum="MachineLearningServiceExecuteResultEvent" expires_after="2020-02-01">
+    enum="MachineLearningServiceExecuteResultEvent" expires_after="2020-04-05">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
@@ -59043,7 +59061,7 @@
 
 <histogram name="MachineLearningService.LoadModelResult"
     enum="MachineLearningServiceLoadModelResultEvent"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
@@ -59055,7 +59073,7 @@
 
 <histogram base="true" name="MachineLearningService.LoadModelResult.Event"
     enum="MachineLearningServiceLoadModelResultEvent"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>amoylan@chromium.org</owner>
   <owner>alanlxl@chromium.org</owner>
   <summary>
@@ -59064,7 +59082,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.MojoConnectionEvent"
-    enum="MachineLearningServiceMojoConnectionEvent" expires_after="2020-02-01">
+    enum="MachineLearningServiceMojoConnectionEvent" expires_after="2020-04-05">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <summary>
@@ -59089,7 +59107,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.PeakTotalMemoryKb" units="KB"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <owner>honglinyu@chromium.org</owner>
@@ -59142,7 +59160,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.TotalMemoryKb" units="KB"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>alanlxl@chromium.org</owner>
   <owner>amoylan@chromium.org</owner>
   <owner>honglinyu@chromium.org</owner>
@@ -59274,14 +59292,15 @@
 </histogram>
 
 <histogram name="Manifest.FetchResult" enum="ManifestFetchResultType"
-    expires_after="M79">
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <summary>
     Tracks whether the Manifest fetch succeed and why it failed if it failed.
   </summary>
 </histogram>
 
-<histogram name="Manifest.HasProperty" enum="Boolean">
+<histogram name="Manifest.HasProperty" enum="Boolean"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <summary>
     Tracks which properties of a Manifest were present when it was parsed. If a
@@ -59291,12 +59310,13 @@
   </summary>
 </histogram>
 
-<histogram name="Manifest.IsEmpty" enum="Boolean" expires_after="M79">
+<histogram name="Manifest.IsEmpty" enum="Boolean" expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <summary>Tracks whether the parsed Manifest is the empty Manifest.</summary>
 </histogram>
 
-<histogram name="Manifest.ParseSuccess" enum="Boolean" expires_after="M79">
+<histogram name="Manifest.ParseSuccess" enum="Boolean"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <summary>
     Tracks the Manifest parsing result. A failure will be recorded if the
@@ -59306,7 +59326,7 @@
 </histogram>
 
 <histogram name="ManualFallback.PresentedOptions.AllPasswords"
-    units="Credentials" expires_after="2019-12-31">
+    units="Credentials" expires_after="2020-04-05">
   <owner>javierrobles@chromium.org</owner>
   <summary>
     Tracks the number of credentials presented to the user in the &quot;Use
@@ -59316,7 +59336,7 @@
 </histogram>
 
 <histogram name="ManualFallback.PresentedOptions.CreditCards" units="Cards"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>javierrobles@chromium.org</owner>
   <summary>
     Tracks the number of cards presented to the user in Manual Fallback. This is
@@ -59325,7 +59345,7 @@
 </histogram>
 
 <histogram name="ManualFallback.PresentedOptions.Passwords" units="Credentials"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>javierrobles@chromium.org</owner>
   <summary>
     Tracks the number of credentials presented to the user in the Passwords
@@ -59334,7 +59354,7 @@
 </histogram>
 
 <histogram name="ManualFallback.PresentedOptions.Profiles" units="Profiles"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>javierrobles@chromium.org</owner>
   <summary>
     Tracks the number of profiles presented to the user in Manual Fallback. This
@@ -59386,7 +59406,8 @@
   <summary>Error codes to handle AImage and AImageReader api calls.</summary>
 </histogram>
 
-<histogram name="Media.Android.BackgroundVideoTime" units="ms">
+<histogram name="Media.Android.BackgroundVideoTime" units="ms"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -59422,7 +59443,7 @@
 </histogram>
 
 <histogram name="Media.Android.MediaPlayerSuccess" enum="MediaPlayerExitStatus"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tguilbert@chromium.org</owner>
   <summary>Android: Whether MediaPlayer exited without errors.</summary>
 </histogram>
@@ -59485,7 +59506,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.Audible.ConcurrentTabsTime" units="ms">
+<histogram name="Media.Audible.ConcurrentTabsTime" units="ms"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <summary>
     Records how long more than one tab is audible at the same time. The
@@ -59549,7 +59571,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.Audio.Autoplay" enum="AutoplaySource">
+<histogram name="Media.Audio.Autoplay" enum="AutoplaySource"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>Records the autoplay source of audios.</summary>
@@ -59608,7 +59631,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.DetectedMissingCallbacks"
-    enum="BooleanMissingCallbacks" expires_after="2020-02-02">
+    enum="BooleanMissingCallbacks" expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     Whether missing callbacks where detected during audio capture. Logged when
@@ -59631,7 +59654,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.FramesProvided" units="frames"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     The number of captured audio frames that is provided by the operating system
@@ -59649,7 +59672,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.Glitches" units="glitches"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     The number of glitches that were detected at the OS level while an audio
@@ -59659,7 +59682,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.HighLatencyCallbackError"
-    enum="BooleanError" expires_after="2020-02-02">
+    enum="BooleanError" expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     A boolean that reflects whether or not an error was reported during audio
@@ -59677,7 +59700,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.LargestGlitchMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     The length in milliseconds of the largest audio glitch that was detected at
@@ -59687,7 +59710,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.LostFramesInMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     The combined length in milliseconds of audio glitches that was detected at
@@ -59698,7 +59721,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.LowLatencyCallbackError"
-    enum="BooleanError" expires_after="2020-02-02">
+    enum="BooleanError" expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     A boolean that reflects whether or not an error was reported during audio
@@ -59901,7 +59924,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.Audio.Capture.Win.Open" enum="AudioStreamOpenResult">
+<histogram name="Media.Audio.Capture.Win.Open" enum="AudioStreamOpenResult"
+    expires_after="2020-04-05">
   <owner>tommi@chromium.org</owner>
   <summary>
     Success/error cases for opening an audio input stream on Windows.
@@ -59932,7 +59956,7 @@
 </histogram>
 
 <histogram name="Media.Audio.CoreAudioDispatchOverrideLookupEvent"
-    enum="CoreAudioDispatchOverrideLookupEvent" expires_after="2020-02-01">
+    enum="CoreAudioDispatchOverrideLookupEvent" expires_after="2020-04-05">
   <owner>ossu@chromium.org</owner>
   <owner>grunell@chromium.org</owner>
   <summary>
@@ -59959,7 +59983,7 @@
 </histogram>
 
 <histogram name="Media.Audio.InputBufferSizeWasChangedMac"
-    enum="BooleanSuccess" expires_after="2020-02-02">
+    enum="BooleanSuccess" expires_after="2020-04-05">
   <owner>henrika@chromium.org</owner>
   <summary>
     Indicates if the size of the audio unit's IO buffer was changed when
@@ -60104,7 +60128,7 @@
 </histogram>
 
 <histogram name="Media.Audio.OutputDeviceAuthorizationTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <summary>
     Time delta between the moment output device authorization request is
@@ -60114,7 +60138,7 @@
 </histogram>
 
 <histogram name="Media.Audio.OutputStreamsCanceledByBrowser" units="streams"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     When a mojo audio stream factory is destructed, the streams it created are
@@ -60224,7 +60248,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.AudioInputsPerMixer.LatencyPlayback"
-    units="inputs" expires_after="2020-02-02">
+    units="inputs" expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <summary>
     Number of simultaneous inputs coming to the AudioRendererMixer which renders
@@ -60248,7 +60272,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.AudioMixing.LatencyMap" units="subsets"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <summary>
     Subset of audio output latencies encountered by the renderer so far. Logged
@@ -60283,7 +60307,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.FramesRequested" units="frames"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tommi@chromium.org</owner>
   <summary>
     The number of frames audio is actually rendered at if the number is
@@ -60297,7 +60321,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.GetSourceDataTime.WebRTC"
-    units="microseconds" expires_after="2020-02-02">
+    units="microseconds" expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     The time spent to get audio data from the source. For WebRTC, it's the time
@@ -60313,7 +60337,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.GetSourceDataTimeMax.WebRTC"
-    units="microseconds" expires_after="2020-02-02">
+    units="microseconds" expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     The maximum time spent to get audio data from the source during a session.
@@ -60329,7 +60353,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.Glitches" units="glitches"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tommi@chromium.org</owner>
   <summary>
     The number of glitches that were detected at the OS level while an audio
@@ -60339,7 +60363,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.InputDeviceStartTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>jonasolsson@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -60350,7 +60374,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.InputDeviceStreamCreationTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>jonasolsson@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -60362,7 +60386,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.LargestGlitchMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tommi@chromium.org</owner>
   <summary>
     The length in milliseconds of the largest glitch that was detected at the OS
@@ -60372,7 +60396,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.LostFramesInMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tommi@chromium.org</owner>
   <summary>
     The combined length in milliseconds of audio glitches. This is useful to
@@ -60383,7 +60407,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceAuthorizationTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     Similar to Media.Audio.OutputDeviceAuthorizationTime, this histogram
@@ -60397,7 +60421,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceAuthorizationTimedOut"
-    enum="BooleanTimedOut" expires_after="2020-02-02">
+    enum="BooleanTimedOut" expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <summary>
     Whether audio output device timed out waiting for authorization reply from
@@ -60406,7 +60430,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceStartTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>jonasolsson@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -60417,7 +60441,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceStatus"
-    enum="OutputDeviceStatus" expires_after="2020-02-02">
+    enum="OutputDeviceStatus" expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <owner>dalecurtis@chromium.org</owner>
   <summary>
@@ -60426,7 +60450,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputDeviceStreamCreationTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>jonasolsson@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -60438,7 +60462,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.OutputStreamDuration" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     This histogram measures the duration of every output stream, as seen from
@@ -60449,7 +60473,7 @@
 
 <histogram
     name="Media.Audio.Render.SinkCache.GetOutputDeviceInfoCacheUtilization"
-    enum="GetOutputDeviceInfoCacheHit" expires_after="2020-02-02">
+    enum="GetOutputDeviceInfoCacheHit" expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <summary>
     Whether a cached sink was used to get audio output device information, or a
@@ -60469,7 +60493,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.SinkCache.UsedForSinkCreation"
-    enum="BooleanUsage" expires_after="2020-02-02">
+    enum="BooleanUsage" expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <summary>
     Whether a sink was created through the sink cache or directly.
@@ -60492,7 +60516,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.StreamBrokerDisconnectReason2"
-    enum="AudioOutputStreamDisconnectReason2" expires_after="2020-02-02">
+    enum="AudioOutputStreamDisconnectReason2" expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <summary>
@@ -60502,7 +60526,7 @@
 
 <histogram
     name="Media.Audio.Render.StreamBrokerDocumentDestroyedAwaitingCreatedTime"
-    units="ms" expires_after="2020-02-02">
+    units="ms" expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
@@ -60514,7 +60538,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.StreamBrokerStreamCreationTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
@@ -60537,7 +60561,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Render.StreamCallbackError2"
-    enum="AudioRenderDeviceError" expires_after="2020-02-01">
+    enum="AudioRenderDeviceError" expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     When AudioOutputDevice is stopped, this stat is recorded with whether an
@@ -60659,7 +60683,7 @@
 </histogram>
 
 <histogram name="Media.AudioCapturerAudioGlitches" enum="AudioGlitchResult"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     Whether there is input audio glitches due to dropped input audio data or
@@ -60668,7 +60692,7 @@
 </histogram>
 
 <histogram name="Media.AudioCapturerDroppedData" units="%"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>grunell@chromium.org</owner>
   <summary>
     The percentage of input audio data that was dropped at the browser/renderer
@@ -60725,7 +60749,7 @@
 </histogram>
 
 <histogram name="Media.AudioInputController" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <summary>Measures the time taken for AudioInputController::</summary>
 </histogram>
@@ -60770,7 +60794,7 @@
 </histogram>
 
 <histogram name="Media.AudioOutputController.CallbackError" enum="BooleanError"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     A boolean that reflects whether or not an error was reported during audio
@@ -60790,7 +60814,7 @@
 </histogram>
 
 <histogram name="Media.AudioOutputController.ProxyStreamCreationResult"
-    enum="AudioOutputStreamCreationResult" expires_after="2020-02-02">
+    enum="AudioOutputStreamCreationResult" expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     Whether an AudioOutputController succeeded in creating and opening an output
@@ -60803,7 +60827,7 @@
 
 <histogram
     name="Media.AudioOutputController.ProxyStreamCreationResultForDeviceChange"
-    enum="AudioOutputStreamCreationResult" expires_after="2020-02-02">
+    enum="AudioOutputStreamCreationResult" expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     Whether an AudioOutputController succeeded in creating and opening an output
@@ -60812,7 +60836,7 @@
 </histogram>
 
 <histogram name="Media.AudioOutputControllerDataNotReady" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     Time spent waiting in AudioOutputController::WaitTillDataReady() if the data
@@ -60821,7 +60845,7 @@
 </histogram>
 
 <histogram name="Media.AudioOutputControllerPlaybackStartupSuccess"
-    enum="BooleanSuccess" expires_after="2020-02-02">
+    enum="BooleanSuccess" expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     Whether playback started successfully after stream startup was requested.
@@ -60830,7 +60854,7 @@
 
 <histogram name="Media.AudioOutputResampler.OpenLowLatencyStream"
     enum="AudioOutputResamplerLowLatencyOpenStreamResult"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <summary>
     Whether a low latency stream to be rendered through the resampler was opened
@@ -60843,7 +60867,7 @@
 
 <histogram
     name="Media.AudioOutputStreamProxy.GetPreferredOutputStreamParametersWin.CreateClientResult"
-    enum="Hresult">
+    enum="Hresult" expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <summary>
     This histogram is the 3nd potential failure step in
@@ -60892,7 +60916,7 @@
 
 <histogram
     name="Media.AudioOutputStreamProxy.GetPreferredOutputStreamParametersWin.GetMixFormatResult"
-    enum="Hresult">
+    enum="Hresult" expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <summary>
     This histogram is the 4nd potential failure step in
@@ -60921,7 +60945,7 @@
 </histogram>
 
 <histogram name="Media.AudioRendererAudioGlitches" enum="AudioGlitchResult"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>henrika@chromium.org</owner>
   <summary>
     Captures if render-side audio glitches are detected or not. Sampled when a
@@ -60939,7 +60963,7 @@
 </histogram>
 
 <histogram name="Media.AudioRendererImpl.SinkStatus" enum="OutputDeviceStatus"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>olka@chromium.org</owner>
   <owner>dalecurtis@chromium.org</owner>
   <summary>
@@ -61015,7 +61039,7 @@
 </histogram>
 
 <histogram name="Media.AudioService.AudioManagerStartupTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -61065,7 +61089,7 @@
 </histogram>
 
 <histogram name="Media.AudioService.ObservedDowntime2" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -61076,7 +61100,7 @@
 </histogram>
 
 <histogram name="Media.AudioService.ObservedInitialDowntime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -61104,7 +61128,7 @@
 </histogram>
 
 <histogram name="Media.AudioService.ObservedStartStatus"
-    enum="AudioServiceStartStatus" expires_after="2020-02-02">
+    enum="AudioServiceStartStatus" expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -61114,7 +61138,7 @@
 </histogram>
 
 <histogram name="Media.AudioService.ObservedStartupTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -61127,7 +61151,7 @@
 </histogram>
 
 <histogram name="Media.AudioService.ObservedUptime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -61142,7 +61166,7 @@
 </histogram>
 
 <histogram name="Media.AudioService.SystemInfoClient" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="AudioSystemInfoRequest" -->
 
   <owner>marinaciocea@chromium.org</owner>
@@ -61156,7 +61180,7 @@
 </histogram>
 
 <histogram name="Media.AudioService.Uptime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>marinaciocea@chromium.org</owner>
   <owner>maxmorin@chromium.org</owner>
   <owner>olka@chromium.org</owner>
@@ -61167,7 +61191,7 @@
 </histogram>
 
 <histogram name="Media.AudioThreadStatus" enum="AudioThreadStatus"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     State of the audio thread. A value of &quot;started&quot; is emitted once
@@ -61202,7 +61226,7 @@
 </histogram>
 
 <histogram name="Media.AVDA.FrameInformation" enum="AVDAFrameInformation"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>liberato@chromium.org</owner>
   <summary>
     Record a count for each frame sent to the client by AVDA, separated by what
@@ -61290,7 +61314,8 @@
   <summary>Kb read by media demuxer from MultiBuffer cache.</summary>
 </histogram>
 
-<histogram name="Media.BytesReadFromNetwork" units="KB">
+<histogram name="Media.BytesReadFromNetwork" units="KB"
+    expires_after="2020-04-05">
   <owner>hubbe@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>Kb read by from network into MultiBuffer cache.</summary>
@@ -61433,7 +61458,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.Controls.CTR" enum="MediaControlsCTREvent">
+<histogram name="Media.Controls.CTR" enum="MediaControlsCTREvent"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -61509,7 +61535,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.Controls.Show.Audio" enum="MediaControlsShowReason">
+<histogram name="Media.Controls.Show.Audio" enum="MediaControlsShowReason"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <summary>
     Record whether the default media controls of an audio element were shown and
@@ -61519,7 +61546,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.Controls.Show.Video" enum="MediaControlsShowReason">
+<histogram name="Media.Controls.Show.Video" enum="MediaControlsShowReason"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <summary>
     Record whether the default media controls of a video element were shown and
@@ -61538,7 +61566,7 @@
 </histogram>
 
 <histogram name="Media.D3D11.DecoderLifetimeProgression"
-    enum="D3D11LifetimeProgression" expires_after="2019-12-31">
+    enum="D3D11LifetimeProgression" expires_after="2020-04-05">
   <owner>liberato@chromium.org</owner>
   <owner>tmathmeyer@chromium.org</owner>
   <summary>
@@ -61549,7 +61577,7 @@
 </histogram>
 
 <histogram name="Media.D3D11.WasVideoSupported"
-    enum="D3D11VideoNotSupportedReason" expires_after="2019-12-31">
+    enum="D3D11VideoNotSupportedReason" expires_after="2020-04-05">
   <owner>liberato@chromium.org</owner>
   <owner>sandersd@chromium.org</owner>
   <owner>tmathmeyer@chromium.org</owner>
@@ -61761,7 +61789,7 @@
 </histogram>
 
 <histogram name="Media.DXVAVDA.PictureBufferMechanism"
-    enum="PictureBufferMechanism">
+    enum="PictureBufferMechanism" expires_after="2020-04-05">
   <owner>liberato@chromium.org</owner>
   <owner>sandersd@chromium.org</owner>
   <summary>
@@ -61875,12 +61903,12 @@
 </histogram>
 
 <histogram name="Media.EME.CdmLoadResult" enum="CdmLoadResult"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>media-dev@chromium.org</owner>
   <summary>The result from an attempt to load a library CDM.</summary>
 </histogram>
 
-<histogram name="Media.EME.CdmLoadTime" units="ms" expires_after="2020-02-02">
+<histogram name="Media.EME.CdmLoadTime" units="ms" expires_after="2020-04-05">
   <owner>media-dev@chromium.org</owner>
   <summary>The time spent to load a library CDM.</summary>
 </histogram>
@@ -62085,7 +62113,7 @@
 </histogram>
 
 <histogram name="Media.EME.RequestMediaKeySystemAccess"
-    enum="RequestMediaKeySystemAccessStatus" expires_after="2020-02-02">
+    enum="RequestMediaKeySystemAccessStatus" expires_after="2020-04-05">
   <owner>sandersd@chromium.org</owner>
   <summary>
     Key system support query status and result, as reported by
@@ -62115,7 +62143,7 @@
 </histogram>
 
 <histogram name="Media.EME.Widevine.VideoCapability.HasEmptyRobustness"
-    enum="BooleanEmpty" expires_after="2020-02-02">
+    enum="BooleanEmpty" expires_after="2020-04-05">
   <owner>xhwang@chromium.org</owner>
   <summary>
     Whether the robustness level of any video capability in the supported
@@ -62485,12 +62513,14 @@
   </summary>
 </histogram>
 
-<histogram name="Media.GpuVideoDecoderError" enum="VideoDecodeAcceleratorError">
+<histogram name="Media.GpuVideoDecoderError" enum="VideoDecodeAcceleratorError"
+    expires_after="2020-04-05">
   <owner>sandersd@chromium.org</owner>
   <summary>Counts of video decode errors reported to GpuVideoDecoder.</summary>
 </histogram>
 
-<histogram name="Media.GpuVideoDecoderInitializeStatus" enum="PipelineStatus">
+<histogram name="Media.GpuVideoDecoderInitializeStatus" enum="PipelineStatus"
+    expires_after="2020-04-05">
   <owner>posciak@chromium.org</owner>
   <summary>Results of attempts to GpuVideoDecoder::Initialize().</summary>
 </histogram>
@@ -62549,7 +62579,7 @@
 </histogram>
 
 <histogram name="Media.HardwareKeyPressed" enum="MediaHardwareKeyAction"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>steimel@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -62558,7 +62588,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.HasEverPlayed" enum="BooleanHasPlayed">
+<histogram name="Media.HasEverPlayed" enum="BooleanHasPlayed"
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     Whether a given WebMediaPlayer instance, after preload, started playback;
@@ -62567,7 +62598,7 @@
 </histogram>
 
 <histogram name="Media.HighLatencyAudioCaptureStartupSuccess"
-    enum="AudioCaptureStartupResult" expires_after="2020-02-02">
+    enum="AudioCaptureStartupResult" expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     Whether capture started successfully after a high-latency input stream
@@ -62626,7 +62657,7 @@
 </histogram>
 
 <histogram name="Media.InputStreamDurationWithoutCallback" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     Duration in milliseconds of low-latency audio input streams which never got
@@ -62754,7 +62785,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.LinuxAudioIO" enum="LinuxAudioIO">
+<histogram name="Media.LinuxAudioIO" enum="LinuxAudioIO"
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     Audio IO layer used by the Linux OS, sampled once at startup of the browser.
@@ -62809,7 +62841,7 @@
 </histogram>
 
 <histogram name="Media.LowLatencyAudioCaptureStartupSuccess"
-    enum="AudioCaptureStartupResult" expires_after="2020-02-02">
+    enum="AudioCaptureStartupResult" expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     Whether capture started successfully after a low-latency input stream
@@ -62818,7 +62850,7 @@
 </histogram>
 
 <histogram name="Media.MCVD.ForwardVideoFrameTiming" units="ms"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>liberato@chromium.org</owner>
   <owner>sandersd@chromium.org</owner>
   <owner>tguilbert@chromium.org</owner>
@@ -62829,7 +62861,7 @@
 </histogram>
 
 <histogram name="Media.MeanTimeBetweenRebuffers" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     The total watch time (see Media.WatchTime) of a given playback divided by
@@ -62977,7 +63009,7 @@
 </histogram>
 
 <histogram name="Media.MojoVideoDecoder.ActiveInstances" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>sandersd@chromium.org</owner>
   <summary>
     Records the number of active MojoVideoDecoderService instances that are
@@ -63049,7 +63081,7 @@
 </histogram>
 
 <histogram name="Media.MSE.DetectedShakaPackagerInMp4" enum="BooleanDetected"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -63360,7 +63392,7 @@
 </histogram>
 
 <histogram name="Media.Notification.ArtworkPresent" enum="Boolean"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>beccahughes@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -63369,7 +63401,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.Notification.Click" enum="MediaNotificationClickSource">
+<histogram name="Media.Notification.Click" enum="MediaNotificationClickSource"
+    expires_after="2020-04-05">
   <owner>mlamouri@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -63378,7 +63411,7 @@
 </histogram>
 
 <histogram name="Media.Notification.Count" units="count"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>beccahughes@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -63388,7 +63421,7 @@
 </histogram>
 
 <histogram name="Media.Notification.MetadataPresent"
-    enum="MediaNotificationMetadata" expires_after="2019-12-31">
+    enum="MediaNotificationMetadata" expires_after="2020-04-05">
   <owner>beccahughes@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -63398,7 +63431,7 @@
 </histogram>
 
 <histogram name="Media.Notification.Source" enum="MediaNotificationSource"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>beccahughes@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -63408,7 +63441,7 @@
 </histogram>
 
 <histogram name="Media.Notification.UserAction" enum="MediaSessionAction"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>beccahughes@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -63417,7 +63450,7 @@
 </histogram>
 
 <histogram name="Media.OutputStreamDuration" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>maxmorin@chromium.org</owner>
   <summary>
     Duration of an audio output stream. Measured in AudioOutputController from
@@ -63476,7 +63509,7 @@
 </histogram>
 
 <histogram name="Media.PipelineStatus" enum="PipelineStatus"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>prabhur@chromium.org</owner>
   <owner>dalecurtis@chromium.org</owner>
   <summary>
@@ -63486,7 +63519,7 @@
 </histogram>
 
 <histogram name="Media.PipelineStatus.Start" enum="PipelineStatus"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>xhwang@chromium.org</owner>
   <summary>
     Status of the media pipeline starting process (including demuxer and
@@ -63757,7 +63790,8 @@
   </summary>
 </histogram>
 
-<histogram name="Media.RTCVideoEncoderProfile" enum="VideoCodecProfile">
+<histogram name="Media.RTCVideoEncoderProfile" enum="VideoCodecProfile"
+    expires_after="2020-04-05">
   <owner>posciak@chromium.org</owner>
   <summary>Video codec profile used in RTC video encoder.</summary>
 </histogram>
@@ -64030,7 +64064,7 @@
 </histogram>
 
 <histogram base="true" name="Media.TimeToFirstFrame" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -64075,7 +64109,7 @@
 </histogram>
 
 <histogram base="true" name="Media.TimeToPlayReady" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -65177,7 +65211,7 @@
   </summary>
 </histogram>
 
-<histogram name="Media.WatchTime" units="ms" expires_after="2020-02-02">
+<histogram name="Media.WatchTime" units="ms" expires_after="2020-04-05">
   <owner>dalecurtis@chromium.org</owner>
   <summary>
     Watch time is defined as the amount of elapsed media time for audio+video
@@ -65212,7 +65246,7 @@
 </histogram>
 
 <histogram name="Media.WebMediaPlayerImpl.HLS.HasAccessControl" enum="Boolean"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>sandersd@chromium.org</owner>
   <owner>tguilbert@chromium.org</owner>
   <summary>
@@ -65224,7 +65258,7 @@
 </histogram>
 
 <histogram name="Media.WebMediaPlayerImpl.HLS.IsCorsCrossOrigin" enum="Boolean"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>sandersd@chromium.org</owner>
   <owner>tguilbert@chromium.org</owner>
   <summary>
@@ -65236,7 +65270,7 @@
 </histogram>
 
 <histogram name="Media.WebMediaPlayerImpl.HLS.IsMixedContent" enum="Boolean"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>sandersd@chromium.org</owner>
   <owner>tguilbert@chromium.org</owner>
   <summary>
@@ -65267,7 +65301,7 @@
 </histogram>
 
 <histogram base="true" name="Media.WebMediaPlayerImpl.Memory" units="KB"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>wolenetz@chromium.org</owner>
   <summary>
     Amount of memory used by the WebMediaPlayerImpl and its components.
@@ -65403,7 +65437,7 @@
 </histogram>
 
 <histogram name="MediaLauncherActivity.MediaType"
-    enum="MediaLauncherActivityMediaType">
+    enum="MediaLauncherActivityMediaType" expires_after="2020-04-05">
   <owner>steimel@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -66143,7 +66177,7 @@
 </histogram>
 
 <histogram name="Memory.Browser.PrivateSwapFootprint" units="MB"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>erikchen@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -66165,7 +66199,8 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.Browser.SharedMemoryFootprint" units="MB">
+<histogram name="Memory.Browser.SharedMemoryFootprint" units="MB"
+    expires_after="2020-04-05">
   <owner>erikchen@chromium.org</owner>
   <summary>
     A rough estimate of the shared memory footprint of the browser process.
@@ -66312,7 +66347,8 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.DiscardableAllocationSize" units="KB">
+<histogram name="Memory.DiscardableAllocationSize" units="KB"
+    expires_after="2020-04-05">
   <owner>reveman@chromium.org</owner>
   <summary>
     The discardable memory allocation size in KB. Recorded each time a new
@@ -66354,7 +66390,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Browser2" units="MB"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -66366,7 +66402,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Browser2.Small" units="KB"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -66495,7 +66531,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Gpu2" units="MB"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -66961,7 +66997,8 @@
   <summary>V8 memory usage right before intervention.</summary>
 </histogram>
 
-<histogram base="true" name="Memory.Experimental.Renderer" units="MB">
+<histogram base="true" name="Memory.Experimental.Renderer" units="MB"
+    expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="RendererMemoryAllocator" -->
 
   <owner>keishi@chromium.org</owner>
@@ -67001,7 +67038,7 @@
 </histogram>
 
 <histogram name="Memory.Experimental.Renderer.Uptime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>keishi@chromium.org</owner>
   <summary>
     The uptime of a render process in time ticks (excludes extensions). Emitted
@@ -67010,7 +67047,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Renderer2" units="MB"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -67022,7 +67059,7 @@
 </histogram>
 
 <histogram base="true" name="Memory.Experimental.Renderer2.Small" units="KB"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
 
   <owner>erikchen@chromium.org</owner>
@@ -67073,7 +67110,8 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.Experimental.Total2.PrivateMemoryFootprint" units="MB">
+<histogram name="Memory.Experimental.Total2.PrivateMemoryFootprint" units="MB"
+    expires_after="2020-04-05">
   <owner>erikchen@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -67368,7 +67406,7 @@
 </histogram>
 
 <histogram name="Memory.Gpu.SharedMemoryFootprint" units="MB"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>erikchen@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -67489,7 +67527,7 @@
 </histogram>
 
 <histogram name="Memory.NativeLibrary.MappedAndResidentMemoryFootprint2"
-    units="KB" expires_after="2020-02-02">
+    units="KB" expires_after="2020-04-05">
   <owner>msalama@google.com</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -67501,7 +67539,7 @@
 </histogram>
 
 <histogram name="Memory.NativeLibrary.NotResidentOrderedCodeMemoryFootprint"
-    units="KB" expires_after="2019-12-01">
+    units="KB" expires_after="2020-04-05">
   <owner>lizeb@chromium.org</owner>
   <summary>
     The size of the native library code which was ordered, yet is not resident
@@ -67587,7 +67625,8 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.OOMKill.Contents.MemGraphicsMB" units="MB">
+<histogram name="Memory.OOMKill.Contents.MemGraphicsMB" units="MB"
+    expires_after="2020-04-05">
   <owner>oshima@chromium.org</owner>
   <summary>
     Graphics driver (GEM object) memory right after a renderer was killed by
@@ -67779,7 +67818,7 @@
 </histogram>
 
 <histogram name="Memory.ParkableString.SavingsKb.5min" units="KB"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <obsolete>
     Deprecated 07/2019. No longer recorded.
   </obsolete>
@@ -67813,7 +67852,7 @@
 </histogram>
 
 <histogram name="Memory.PartitionAlloc.MainThreadTime.5min" units="ms"
-    expires_after="2019-12-31">
+    expires_after="2020-04-05">
   <owner>lizeb@chromium.org</owner>
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -67916,7 +67955,7 @@
 </histogram>
 
 <histogram name="Memory.PressureLevel" enum="MemoryPressureLevel"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>chrisha@chromium.org</owner>
   <summary>
     The memory pressure level, which is recorded periodically. This shows the
@@ -67934,7 +67973,7 @@
 </histogram>
 
 <histogram name="Memory.ProcessCount" units="processes"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>creis@chromium.org</owner>
   <owner>nasko@chromium.org</owner>
   <summary>
@@ -68032,7 +68071,8 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.Renderer.SharedMemoryFootprint" units="MB">
+<histogram name="Memory.Renderer.SharedMemoryFootprint" units="MB"
+    expires_after="2020-04-05">
   <owner>erikchen@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -68096,7 +68136,7 @@
 </histogram>
 
 <histogram name="Memory.RendererProcessCount" units="processes"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>creis@chromium.org</owner>
   <owner>nasko@chromium.org</owner>
   <summary>
@@ -68133,7 +68173,7 @@
 </histogram>
 
 <histogram name="Memory.RenderProcessHost.Count.All" units="processes"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>alexmos@chromium.org</owner>
   <owner>creis@chromium.org</owner>
   <owner>lukasza@chromium.org</owner>
@@ -68151,7 +68191,7 @@
 </histogram>
 
 <histogram name="Memory.RenderProcessHost.Count.InitializedAndNotDead"
-    units="processes" expires_after="2020-02-02">
+    units="processes" expires_after="2020-04-05">
   <owner>alexmos@chromium.org</owner>
   <owner>creis@chromium.org</owner>
   <owner>lukasza@chromium.org</owner>
@@ -68670,7 +68710,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.Total" units="MB" expires_after="2016-09-29">
+<histogram name="Memory.Total" units="MB" expires_after="2020-04-05">
   <obsolete>
     Deprecated 09/2016. Replaced by Memory.Total2.
   </obsolete>
@@ -68701,7 +68741,7 @@
 </histogram>
 
 <histogram name="Memory.Total.RendererPrivateMemoryFootprint" units="MB"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tommckee@chromium.org</owner>
   <summary>
     A rough estimate of the private memory footprint of all renderer processes.
@@ -68728,7 +68768,7 @@
 </histogram>
 
 <histogram name="Memory.Total.SharedMemoryFootprint" units="MB"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>erikchen@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -68841,7 +68881,8 @@
   </summary>
 </histogram>
 
-<histogram name="MemoryAndroid.DeviceMemoryClass" units="units">
+<histogram name="MemoryAndroid.DeviceMemoryClass" units="units"
+    expires_after="2020-04-05">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
@@ -69119,7 +69160,8 @@
   </summary>
 </histogram>
 
-<histogram base="true" name="Mobile.DefaultBrowser.BrowserCount" units="units">
+<histogram base="true" name="Mobile.DefaultBrowser.BrowserCount" units="units"
+    expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="Mobile.DefaultBrowser.Type" -->
 
   <owner>dtrainor@chromium.org</owner>
@@ -69136,7 +69178,7 @@
 </histogram>
 
 <histogram base="true" name="Mobile.DefaultBrowser.SystemBrowserCount"
-    units="units">
+    units="units" expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes
     name="Mobile.DefaultBrowser.SystemDefaultBrowser.Type" -->
 
@@ -69154,7 +69196,7 @@
 </histogram>
 
 <histogram base="true" name="Mobile.Messages.Banner.Dismiss"
-    enum="MobileMessagesBannerDismissType" expires_after="2020-02-01">
+    enum="MobileMessagesBannerDismissType" expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" -->
 
   <owner>sczs@chromium.org</owner>
@@ -69163,7 +69205,7 @@
 </histogram>
 
 <histogram base="true" name="Mobile.Messages.Banner.Event"
-    enum="MobileMessagesBannerEvent" expires_after="2020-02-01">
+    enum="MobileMessagesBannerEvent" expires_after="2020-04-05">
 <!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" -->
 
   <owner>sczs@chromium.org</owner>
@@ -69172,7 +69214,7 @@
 </histogram>
 
 <histogram name="Mobile.Messages.Banner.OnScreenTime" units="ms"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>sczs@chromium.org</owner>
   <owner>thegreenfrog@google.com</owner>
   <summary>
@@ -69250,7 +69292,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Action.Click"
-    enum="SystemNotificationActionType" expires_after="2020-01-22">
+    enum="SystemNotificationActionType" expires_after="2020-04-05">
   <owner>dtrainor@chromium.org</owner>
   <owner>xingliu@chromium.org</owner>
   <summary>
@@ -69275,7 +69317,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Blocked"
-    enum="SystemNotificationType" expires_after="2020-02-02">
+    enum="SystemNotificationType" expires_after="2020-04-05">
   <owner>dtrainor@chromium.org</owner>
   <summary>
     Android: Represents the number of system notifications that were blocked and
@@ -69284,7 +69326,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.BlockedAfterShown"
-    enum="SystemNotificationType" expires_after="2020-02-02">
+    enum="SystemNotificationType" expires_after="2020-04-05">
   <owner>dtrainor@chromium.org</owner>
   <summary>
     Android: Represents the type of notification that was last shown before the
@@ -69294,7 +69336,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.ChannelBlocked"
-    enum="SystemNotificationType" expires_after="2020-02-02">
+    enum="SystemNotificationType" expires_after="2020-04-05">
   <owner>peter@chromium.org</owner>
   <summary>
     Android: Represents the number of system notifications by type that we
@@ -69341,7 +69383,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Dismiss"
-    enum="SystemNotificationType" expires_after="2020-02-02">
+    enum="SystemNotificationType" expires_after="2020-04-05">
   <owner>xingliu@chromium.org</owner>
   <summary>
     Records the type of notification when the user dismisses the Android
@@ -69363,7 +69405,7 @@
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Shown" enum="SystemNotificationType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dtrainor@chromium.org</owner>
   <summary>
     Android: Represents the number of system notifications that will be
@@ -69372,7 +69414,7 @@
 </histogram>
 
 <histogram name="MobileDownload.Background"
-    enum="MobileDownloadBackgroundDownloadEvent" expires_after="2019-12-05">
+    enum="MobileDownloadBackgroundDownloadEvent" expires_after="2020-04-05">
   <owner>hnakashima@chromium.org</owner>
   <owner>hanxi@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
@@ -69402,7 +69444,7 @@
 </histogram>
 
 <histogram base="true" name="MobileDownload.BytesWasted.ChromeNetworkStack"
-    units="KB">
+    units="KB" expires_after="2020-04-05">
   <owner>qinmin@chromium.org</owner>
   <summary>
     Android: Records the total data wasted during download due to resumptions.
@@ -69442,14 +69484,15 @@
 </histogram>
 
 <histogram name="MobileDownload.DownloadResumption"
-    enum="MobileDownloadResumption" expires_after="2020-02-02">
+    enum="MobileDownloadResumption" expires_after="2020-04-05">
   <owner>qinmin@chromium.org</owner>
   <summary>
     Android: Records user interaction on the download resumption button.
   </summary>
 </histogram>
 
-<histogram name="MobileDownload.DownloadTime" units="ms">
+<histogram name="MobileDownload.DownloadTime" units="ms"
+    expires_after="2020-04-05">
   <owner>qinmin@chromium.org</owner>
   <summary>
     Android: Records the total time for a download by completion status.
@@ -69492,7 +69535,7 @@
 </histogram>
 
 <histogram name="MobileDownload.FirstBackground.StartedReason"
-    enum="InterruptReason" expires_after="2019-12-05">
+    enum="InterruptReason" expires_after="2020-04-05">
   <owner>hnakashima@chromium.org</owner>
   <owner>hanxi@chromium.org</owner>
   <owner>qinmin@chromium.org</owner>
@@ -69530,7 +69573,8 @@
   </summary>
 </histogram>
 
-<histogram name="MobileDownload.InterruptionsCount" units="units">
+<histogram name="MobileDownload.InterruptionsCount" units="units"
+    expires_after="2020-04-05">
   <owner>qinmin@chromium.org</owner>
   <summary>
     Android: Records the total interruptions for a download by completion
@@ -69612,7 +69656,7 @@
 </histogram>
 
 <histogram base="true" name="MobileDownload.ResumptionsCount" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>qinmin@chromium.org</owner>
   <summary>
     Android: Records the number of resumptions for a download by resumption
@@ -69641,7 +69685,8 @@
   </summary>
 </histogram>
 
-<histogram name="MobileFre.Progress" enum="MobileFreProgress">
+<histogram name="MobileFre.Progress" enum="MobileFreProgress"
+    expires_after="2020-04-05">
   <owner>gogerald@chromium.org</owner>
   <summary>
     Android: Records which states of the &quot;first run experience&quot; have
@@ -69730,7 +69775,7 @@
 </histogram>
 
 <histogram name="MobileIntent.PageLoadDueToExternalApp" enum="ClientAppId"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tedchoc@chromium.org</owner>
   <summary>
     Android: Count of page loads started by intents from external apps.
@@ -69761,7 +69806,7 @@
 </histogram>
 
 <histogram name="MobileOmnibox.PressedClipboardSuggestionAge" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <summary>
@@ -69835,7 +69880,7 @@
 </histogram>
 
 <histogram name="MobileStartup.ColdStartupIntent" enum="MobileStartupIntent"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tedchoc@chromium.org</owner>
   <summary>
     For cold starts of Chrome (native not initialized at the time of intent),
@@ -69860,7 +69905,7 @@
 </histogram>
 
 <histogram name="MobileStartup.LaunchType" enum="LaunchType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tedchoc@chromium.org</owner>
   <summary>
     The type of launching Chrome mobile app, e.g launch by hitting icon.
@@ -69969,7 +70014,7 @@
 </histogram>
 
 <histogram base="true" name="MobileStartup.ToolbarFirstDrawTime2" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>yusufo@chromium.org</owner>
   <summary>
     Android: The time it takes from launch to the completion of first draw for
@@ -70440,7 +70485,7 @@
 </histogram>
 
 <histogram name="MPArch.ChildProcessLaunchFirst" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>ppi@chromium.org</owner>
   <summary>
     The time it takes to spawn the first child subprocess (including sandbox
@@ -70611,7 +70656,7 @@
 </histogram>
 
 <histogram name="MultiDevice.DeviceSyncService.FindEligibleDevices.Result"
-    enum="BooleanSuccess" expires_after="2020-02-02">
+    enum="BooleanSuccess" expires_after="2020-04-05">
   <owner>hansberry@chromium.org</owner>
   <owner>khorimoto@chromium.org</owner>
   <summary>Result of trying to find eligible devices.</summary>
@@ -70708,7 +70753,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.GattConnectionToAuthentication.EffectiveSuccessRateWithRetries"
-    enum="BooleanSuccess" expires_after="2020-02-02">
+    enum="BooleanSuccess" expires_after="2020-04-05">
   <owner>hansberry@chromium.org</owner>
   <owner>khorimoto@chromium.org</owner>
   <summary>
@@ -70972,7 +71017,7 @@
 </histogram>
 
 <histogram name="MultiProfile.UsersPerSessionIncremental" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>skuhne@chromium.org</owner>
   <summary>
     The number of users simultaneously signed into a multiprofile session on
@@ -73426,7 +73471,7 @@
 </histogram>
 
 <histogram name="NCN.NetworkOperatorMCCMNC" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tbansal@chromium.org</owner>
   <owner>bengr@google.com</owner>
   <summary>
@@ -91488,7 +91533,7 @@
 </histogram>
 
 <histogram name="NQE.WifiSignalStrength.AtECTComputation"
-    units="Signal Strength Level" expires_after="2020-02-02">
+    units="Signal Strength Level" expires_after="2020-04-05">
   <owner>tbansal@chromium.org</owner>
   <summary>
     Wifi signal strength level reported by the device at the time of ECT
@@ -103973,7 +104018,7 @@
   <summary>The size of PDF documents opened in the PDF viewer.</summary>
 </histogram>
 
-<histogram name="PDF.FormType" enum="PDFFormTypes" expires_after="2020-02-02">
+<histogram name="PDF.FormType" enum="PDFFormTypes" expires_after="2020-04-05">
   <owner>rharrison@chromium.org</owner>
   <summary>
     Tracks what types of forms are present in PDF document, logged when the
@@ -109153,7 +109198,7 @@
 </histogram>
 
 <histogram name="Power.BatteryRemainingAtEndOfSessionOnBattery" units="%"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tbroch@chromium.org</owner>
   <summary>
     Chrome OS remaining battery charge as percent of the maximum battery charge,
@@ -109171,7 +109216,7 @@
 </histogram>
 
 <histogram name="Power.BatteryRemainingAtStartOfSessionOnBattery" units="%"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>tbroch@chromium.org</owner>
   <summary>
     Chrome OS remaining battery charge as percent of the maximum battery charge,
@@ -109923,7 +109968,8 @@
   </summary>
 </histogram>
 
-<histogram name="PowerML.DimImminent.Action" enum="PowerMLDimImminentAction">
+<histogram name="PowerML.DimImminent.Action" enum="PowerMLDimImminentAction"
+    expires_after="2020-04-05">
   <owner>jiameng@chromium.org</owner>
   <summary>
     What happens when UserActivityManager receives a screen dim imminent
@@ -109932,7 +109978,7 @@
 </histogram>
 
 <histogram name="PowerML.ModelDim.Result" enum="PowerMLFinalResult"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>jiameng@chromium.org</owner>
   <summary>
     What happens after screen is dimmed following model instruction. Only
@@ -109940,7 +109986,8 @@
   </summary>
 </histogram>
 
-<histogram name="PowerML.ModelNoDim.Result" enum="PowerMLFinalResult">
+<histogram name="PowerML.ModelNoDim.Result" enum="PowerMLFinalResult"
+    expires_after="2020-04-05">
   <owner>jiameng@chromium.org</owner>
   <summary>
     What happens after screen dim is deferred following model instruction. Only
@@ -109948,7 +109995,8 @@
   </summary>
 </histogram>
 
-<histogram name="PowerML.NonModelDim.Result" enum="PowerMLFinalResult">
+<histogram name="PowerML.NonModelDim.Result" enum="PowerMLFinalResult"
+    expires_after="2020-04-05">
   <owner>jiameng@chromium.org</owner>
   <summary>
     What happens after screen is dimmed by powerd by ignoring the model
@@ -109957,7 +110005,7 @@
 </histogram>
 
 <histogram name="PowerML.PreviousEventLogging.Result"
-    enum="PowerMLPreviousEventLoggingResult" expires_after="2020-02-02">
+    enum="PowerMLPreviousEventLoggingResult" expires_after="2020-04-05">
   <owner>jiameng@chromium.org</owner>
   <summary>
     Status of logging previous idle event after a screen dim imminent signal is
@@ -109966,7 +110014,7 @@
 </histogram>
 
 <histogram name="PowerML.SmartDimModel.RequestCanceledDuration" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>amoylan@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
   <owner>napper@chromium.org</owner>
@@ -109978,7 +110026,7 @@
 </histogram>
 
 <histogram name="PowerML.SmartDimModel.RequestCompleteDuration" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>amoylan@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
   <owner>napper@chromium.org</owner>
@@ -110002,7 +110050,7 @@
 </histogram>
 
 <histogram name="PowerML.SmartDimParameter.Result"
-    enum="PowerMLSmartDimParameterResult">
+    enum="PowerMLSmartDimParameterResult" expires_after="2020-04-05">
   <owner>jiameng@chromium.org</owner>
   <summary>
     The result of parsing the dim threshold parameter value. Only applicable to
@@ -112798,7 +112846,7 @@
 </histogram>
 
 <histogram name="PrintPreview.InitialDisplayTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>thestig@chromium.org</owner>
   <summary>
     Time from when print preview is intiated until the intial preview is sent to
@@ -112991,7 +113039,7 @@
 </histogram>
 
 <histogram name="PrintPreview.PrintDocumentSize.HTML" units="KB"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>thestig@chromium.org</owner>
   <summary>
     The average size of a page in the printed document when the source is HTML.
@@ -112999,7 +113047,7 @@
 </histogram>
 
 <histogram name="PrintPreview.PrintDocumentSize.PDF" units="KB"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>thestig@chromium.org</owner>
   <summary>
     The average size of a page in the printed document when the source is PDF.
@@ -113078,7 +113126,8 @@
   </summary>
 </histogram>
 
-<histogram name="PrintPreview.RendererError" enum="PrintPreviewFailureType">
+<histogram name="PrintPreview.RendererError" enum="PrintPreviewFailureType"
+    expires_after="2020-04-05">
   <owner>thestig@chromium.org</owner>
   <summary>
     Count how frequently a set of pre-defined print preview errors occur.
@@ -113086,7 +113135,7 @@
 </histogram>
 
 <histogram name="PrintPreview.RenderPDFPageTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>thestig@chromium.org</owner>
   <summary>Time taken to render each PDF page for print preview.</summary>
 </histogram>
@@ -113606,7 +113655,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfAccountsPerProfile" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -113704,7 +113753,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfSignedInProfiles" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>rogerta@chromium.org</owner>
   <summary>
     Counts the number of signed-in profiles on a user's machine at least every
@@ -114092,7 +114141,7 @@
 </histogram>
 
 <histogram name="ProfileChooser.HasProfilesShown" enum="BooleanShown"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>vasilii@chromium.org</owner>
   <owner>ewald@chromium.org</owner>
   <summary>
@@ -114221,7 +114270,7 @@
 </histogram>
 
 <histogram name="ProtoDB.LoadKeysSuccess" enum="BooleanSuccess"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>Whether a ProtoDB LoadKeys call was successful or not.</summary>
@@ -114846,7 +114895,7 @@
 </histogram>
 
 <histogram name="Quota.DaysBetweenRepeatedOriginEvictions" units="units"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>jarrydg@chromium.org</owner>
   <summary>
     The number of days since an origin was last chosen to be evicted from the
@@ -122573,7 +122622,7 @@
   </summary>
 </histogram>
 
-<histogram name="SB2.RemoteCall.Elapsed" units="ms" expires_after="2020-02-02">
+<histogram name="SB2.RemoteCall.Elapsed" units="ms" expires_after="2020-04-05">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -138468,7 +138517,7 @@
 </histogram>
 
 <histogram name="Stability.BadMessageTerminated.Chrome"
-    enum="BadMessageReasonChrome" expires_after="2020-01-26">
+    enum="BadMessageReasonChrome" expires_after="2020-04-05">
   <owner>creis@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
@@ -139189,7 +139238,7 @@
 </histogram>
 
 <histogram name="Startup.BrowserMainRunnerImplInitializeLongTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>robliao@chromium.org</owner>
   <summary>
     The amount of time that elapsed during BrowserMainRunnerImpl::Initialize.
@@ -141991,7 +142040,7 @@
 </histogram>
 
 <histogram name="Sync.BackendInitializeFirstTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>zea@chromium.org</owner>
   <summary>
     Tracks sync backend initialization time during initial sync setup.
@@ -142449,7 +142498,7 @@
 </histogram>
 
 <histogram name="Sync.CryptographerPendingKeys"
-    enum="SyncCryptographerPendingKeysState" expires_after="2020-02-02">
+    enum="SyncCryptographerPendingKeysState" expires_after="2020-04-05">
   <owner>zea@chromium.org</owner>
   <summary>
     Breakdown of sync users whose cryptographer has pending keys.
@@ -143233,7 +143282,7 @@
 </histogram>
 
 <histogram name="Sync.KeystoreDecryptionFailed"
-    enum="SyncKeystoreDecryptionFailure" expires_after="2020-02-02">
+    enum="SyncKeystoreDecryptionFailure" expires_after="2020-04-05">
   <owner>zea@chromium.org</owner>
   <summary>
     The reason for a failure decrypting the keystore decryptor token.
@@ -143487,7 +143536,7 @@
 </histogram>
 
 <histogram base="true" name="Sync.ModelTypeMemoryKB" units="KB"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>mastiz@chromium.org</owner>
   <owner>jkrcal@chromium.org</owner>
   <summary>
@@ -143548,7 +143597,7 @@
 </histogram>
 
 <histogram name="Sync.NigoriMigrationReason" enum="SyncNigoriMigrationReason"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
@@ -143821,7 +143870,7 @@
 </histogram>
 
 <histogram name="Sync.PassphraseType" enum="SyncPassphraseType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>treib@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>The active sync passphrase type at sync startup.</summary>
@@ -143938,7 +143987,7 @@
 </histogram>
 
 <histogram name="Sync.PostedGetUpdatesOrigin" enum="SyncGetUpdatesOrigin"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>mastiz@chromium.org</owner>
   <owner>jkrcal@chromium.org</owner>
   <summary>
@@ -144333,7 +144382,7 @@
 </histogram>
 
 <histogram name="Sync.ShouldTriggerMigrationAfterMigration" enum="Boolean"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
@@ -144724,7 +144773,7 @@
 </histogram>
 
 <histogram base="true" name="Sync.USSMigrationEntityCount" units="entries"
-    expires_after="2020-02-01">
+    expires_after="2020-04-05">
   <owner>mastiz@chromium.org</owner>
   <summary>
     Counts the number of sync entities per model type successfully migrated from
@@ -148881,7 +148930,7 @@
 </histogram>
 
 <histogram name="Tracing.Background.FinalizationDisallowedReason"
-    enum="TracingFinalizationDisallowedReason" expires_after="2020-01-30">
+    enum="TracingFinalizationDisallowedReason" expires_after="2020-04-05">
   <owner>ssid@chromium.org</owner>
   <summary>
     Reason why background tracing finalization was not allowed. Also see
@@ -149263,7 +149312,7 @@
 </histogram>
 
 <histogram name="Translate.InitiationStatus.v2"
-    enum="TranslateInitiationStatus" expires_after="2020-02-02">
+    enum="TranslateInitiationStatus" expires_after="2020-04-05">
   <owner>kenjibaheux@google.com</owner>
   <summary>
     The reason why Chrome decided to perform the next action (e.g., to show
@@ -149855,6 +149904,17 @@
   <summary>Number of serialized UKM entries when storing a UKM log.</summary>
 </histogram>
 
+<histogram name="UKM.Entries.SerializedCountFCP" units="entries"
+    expires_after="2020-07-01">
+  <owner>rkaplow@chromium.org</owner>
+  <owner>ukm-team@google.com</owner>
+  <summary>
+    Number of serialized UKM entries that are of type PageLoad that have the
+    metric PaintTiming.NavigationToFirstContentfulPaint. This is recorded every
+    time a UKM log is stored.
+  </summary>
+</histogram>
+
 <histogram name="UKM.InitSequence" enum="UmaInitSequence"
     expires_after="2020-07-01">
   <owner>rkaplow@chromium.org</owner>
@@ -150829,7 +150889,7 @@
 </histogram>
 
 <histogram name="UMA.NegativeSamples.Histogram" enum="HistogramNameHash"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asvitkine@chromium.org</owner>
   <owner>bcwhite@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -150905,7 +150965,7 @@
 </histogram>
 
 <histogram name="UMA.PersistentHistograms.InitResult"
-    enum="PersistentHistogramsInitResult" expires_after="2020-02-02">
+    enum="PersistentHistogramsInitResult" expires_after="2020-04-05">
   <owner>bcwhite@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -151034,7 +151094,7 @@
 </histogram>
 
 <histogram name="UMA.SubprocessMetricsProvider.SubprocessCount"
-    units="subprocesses" expires_after="2020-02-02">
+    units="subprocesses" expires_after="2020-04-05">
   <owner>asvitkine@chromium.org</owner>
   <owner>bcwhite@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
@@ -151082,7 +151142,7 @@
 </histogram>
 
 <histogram name="UMA.TruncatedEvents.UserAction" units="events"
-    expires_after="2020-03-29">
+    expires_after="2020-04-05">
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -153038,7 +153098,7 @@
 </histogram>
 
 <histogram name="V8.GCFinalizeMCReduceMemory" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>ulan@chromium.org</owner>
   <owner>hpayer@chromium.org</owner>
   <summary>
@@ -157143,7 +157203,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.BackingStore.OpenStatus"
-    enum="IDBLevelDBBackingStoreOpenResult" expires_after="2020-02-02">
+    enum="IDBLevelDBBackingStoreOpenResult" expires_after="2020-04-05">
   <owner>dgrogan@chromium.org</owner>
   <summary>
     Count of the different success and failure modes when opening an IndexedDB
@@ -157205,7 +157265,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.DestroyCorruptBackingStoreStatus"
-    enum="LevelDBStatus" expires_after="2020-02-02">
+    enum="LevelDBStatus" expires_after="2020-04-05">
   <owner>cmumford@chromium.org</owner>
   <summary>
     Count of the results when attempting to destroy a corrupt Indexed DB backing
@@ -157213,6 +157273,18 @@
   </summary>
 </histogram>
 
+<histogram name="WebCore.IndexedDB.ErrorDuringForceCloseAborts"
+    enum="LevelDBStatus" expires_after="2020-10-08">
+  <owner>dmurph@chromium.org</owner>
+  <summary>
+    Recorded when there is an error during the force close of IndexedDB for an
+    origin. A force close can be triggered either from DevTools, or when there
+    is a disk error. Errors during force close are ignored, as the system is
+    already being torn down. This metric is the only record of these errors
+    happening.
+  </summary>
+</histogram>
+
 <histogram name="WebCore.IndexedDB.FrontEndAPICalls"
     enum="IndexedDatabaseMethods" expires_after="2018-07-23">
   <obsolete>
@@ -158373,7 +158445,7 @@
 </histogram>
 
 <histogram name="WebFont.BlankTextShownTime" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>kenjibaheux@chromium.org</owner>
   <owner>ksakamoto@chromium.org</owner>
   <summary>
@@ -158699,7 +158771,7 @@
 </histogram>
 
 <histogram name="WebFont.LocalFontUsed" enum="BooleanUsage"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@chromium.org</owner>
   <owner>kouhei@chromium.org</owner>
@@ -159110,7 +159182,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.ApmCaptureOutputLevelPeakRms"
-    units="dBFS (negated)" expires_after="2020-02-02">
+    units="dBFS (negated)" expires_after="2020-04-05">
   <owner>peah@chromium.org</owner>
   <summary>
     This histogram reports the peak RMS of the signal in the output of WebRTC's
@@ -159471,7 +159543,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.EchoCanceller.RenderUnderruns"
-    enum="WebRTCEventFrequency" expires_after="2020-02-02">
+    enum="WebRTCEventFrequency" expires_after="2020-04-05">
   <owner>peah@chromium.org</owner>
   <summary>
     This histogram logs the frequency of underruns in the render buffer of the
@@ -159621,7 +159693,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.SpeechExpandRatePercent" units="%"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>hlundin@chromium.org</owner>
   <summary>
     Measures the audible expand rate for an incoming WebRTC audio stream. The
@@ -159897,7 +159969,7 @@
 </histogram>
 
 <histogram name="WebRTC.BWE.Types" enum="WebRtcBweType"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>holmer@chromium.org</owner>
   <summary>
     The bandwidth estimation used in WebRTC calls. Records whether the BWE is
@@ -159917,7 +159989,7 @@
 </histogram>
 
 <histogram name="WebRTC.Call.BitrateReceivedInKbps" units="kbps"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>holmer@chromium.org</owner>
   <summary>
     Average total bitrate received during a call (audio + video + RTCP), counted
@@ -159937,7 +160009,7 @@
 </histogram>
 
 <histogram name="WebRTC.Call.LifetimeInSeconds" units="seconds"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The lifetime of a call. Recorded when a Call instance is destroyed.
@@ -160004,7 +160076,7 @@
 </histogram>
 
 <histogram name="WebRTC.Call.VideoBitrateReceivedInKbps" units="kbps"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>holmer@chromium.org</owner>
   <summary>
     Average video bitrate received during a call, counted from first packet
@@ -160164,7 +160236,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.CandidatePairType"
-    enum="IceCandidatePairTypes" expires_after="2020-02-02">
+    enum="IceCandidatePairTypes" expires_after="2020-04-05">
   <owner>qingsi@google.com</owner>
   <owner>jeroendb@google.com</owner>
   <summary>
@@ -160532,7 +160604,7 @@
 </histogram>
 
 <histogram name="WebRTC.ReceivedAudioTrackDuration" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>perkj@chromium.org</owner>
   <summary>
     Durations of audio tracks received over a PeerConnection. The stopwatch
@@ -160700,7 +160772,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.AdaptChangesPerMinute" units="changes/minute"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The average number of adaptation changes per minute for a sent video stream.
@@ -160709,7 +160781,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.AverageRoundTripTimeInMilliseconds" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>holmer@chromium.org</owner>
   <summary>
     The average round-trip time of a WebRTC call in milliseconds. Recorded when
@@ -160718,7 +160790,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.AVSyncOffsetInMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The absolute value of the sync offset between a rendered video frame and the
@@ -160751,7 +160823,7 @@
   </summary>
 </histogram>
 
-<histogram name="WebRTC.Video.BadCall.Qp" units="%" expires_after="2020-02-02">
+<histogram name="WebRTC.Video.BadCall.Qp" units="%" expires_after="2020-04-05">
   <owner>sprang@chromium.org</owner>
   <summary>
     Fraction of time the call was classified as bad because of high qp.
@@ -160816,7 +160888,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.CurrentDelayInMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     Average current delay for a received video stream. This is the actual delay
@@ -160825,7 +160897,8 @@
   </summary>
 </histogram>
 
-<histogram name="WebRTC.Video.Decoded.Vp8.Qp" units="qp value">
+<histogram name="WebRTC.Video.Decoded.Vp8.Qp" units="qp value"
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The average QP (quantizer value) per frame for a received VP8 video stream.
@@ -160834,7 +160907,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.DecodedFramesPerSecond" units="fps"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The number of decoded frames per second for a received video stream.
@@ -160844,7 +160917,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.DecodeTimeInMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The average decode time per frame for a received video stream. Recorded when
@@ -160932,7 +161005,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.Encoded.Qp" units="qp value"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The average QP (quantizer value) per frame for a sent video stream. Recorded
@@ -160941,7 +161014,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.Encoder.CodecType" enum="WebRtcVideoCodecs"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     Configured video codec for a sent video stream. Recorded when a
@@ -160951,7 +161024,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.EncodeTimeInMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The average encode time per frame for a sent video stream. Recorded when a
@@ -161044,7 +161117,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.InputFramesPerSecond" units="fps"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The number of incoming frames per second for a sent video stream. Recorded
@@ -161209,7 +161282,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.OnewayDelayInMs" units="ms"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     Average delay (network delay (rtt/2) + jitter delay + decode time + render
@@ -161938,7 +162011,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.SentFramesPerSecond" units="fps"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The number of sent frames per second for a sent video stream. Recorded when
@@ -161976,7 +162049,7 @@
 </histogram>
 
 <histogram name="WebRTC.Video.SentWidthInPixels" units="pixels"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>asapersson@chromium.org</owner>
   <summary>
     The average sent width per frame for a sent video stream. Recorded when a
@@ -162196,7 +162269,7 @@
 </histogram>
 
 <histogram name="WebsiteSettings.AllSitesAction"
-    enum="WebSiteSettingsAllSitesAction" expires_after="2019-11-27">
+    enum="WebSiteSettingsAllSitesAction" expires_after="2020-04-05">
   <owner>mxcai@chromium.org</owner>
   <owner>dominickn@chromium.org</owner>
   <summary>
@@ -162417,7 +162490,7 @@
 </histogram>
 
 <histogram name="WebUI.CreatedForUrl" enum="WebUIUrlHashes"
-    expires_after="2020-02-02">
+    expires_after="2020-04-05">
   <owner>dbeam@chromium.org</owner>
   <summary>URLs for which Chrome creates WebUIControllers.</summary>
 </histogram>
diff --git a/ui/gfx/font_fallback_linux.cc b/ui/gfx/font_fallback_linux.cc
index e57866aa..c5031e0 100644
--- a/ui/gfx/font_fallback_linux.cc
+++ b/ui/gfx/font_fallback_linux.cc
@@ -18,7 +18,7 @@
 #include "base/trace_event/trace_event.h"
 #include "third_party/icu/source/common/unicode/uchar.h"
 #include "third_party/icu/source/common/unicode/utf16.h"
-#include "third_party/skia/include/core/SkTypeface.h"
+#include "third_party/skia/include/core/SkFontMgr.h"
 #include "ui/gfx/font.h"
 #include "ui/gfx/font_fallback.h"
 #include "ui/gfx/linux/fontconfig_util.h"
@@ -90,9 +90,10 @@
   if (entry != cache->end())
     return sk_sp<SkTypeface>(entry->second);
 
+  sk_sp<SkFontMgr> font_mgr = SkFontMgr::RefDefault();
   std::string filename = font_path.AsUTF8Unsafe();
   sk_sp<SkTypeface> typeface =
-      SkTypeface::MakeFromFile(filename.c_str(), ttc_index);
+      font_mgr->makeFromFile(filename.c_str(), ttc_index);
   (*cache)[key] = typeface;
 
   return sk_sp<SkTypeface>(typeface);
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js
index 9f0942b..d83fa0d 100644
--- a/ui/login/display_manager.js
+++ b/ui/login/display_manager.js
@@ -200,7 +200,16 @@
      * Whether the virtual keyboard is displayed.
      * @type {boolean}
      */
-    virtualKeyboardShown: false,
+    virtualKeyboardShown_: false,
+
+    get virtualKeyboardShown() {
+      return this.virtualKeyboardShown_;
+    },
+
+    set virtualKeyboardShown(shown) {
+      this.virtualKeyboardShown_ = shown;
+      document.documentElement.setAttribute('virtual-keyboard', shown);
+    },
 
     /**
      * Type of UI.
diff --git a/ui/login/oobe.css b/ui/login/oobe.css
index 7e028d9..0ee6e2f 100644
--- a/ui/login/oobe.css
+++ b/ui/login/oobe.css
@@ -21,6 +21,7 @@
   --shelf-area-height: var(--shelf-area-height-base);
 }
 
+html[virtual-keyboard=true],
 html[screen=gaia-signin] {
   --shelf-area-height: 0;
 }
diff --git a/ui/ozone/platform/drm/common/drm_overlay_manager.cc b/ui/ozone/platform/drm/common/drm_overlay_manager.cc
index 4d0670f..fbb3245 100644
--- a/ui/ozone/platform/drm/common/drm_overlay_manager.cc
+++ b/ui/ozone/platform/drm/common/drm_overlay_manager.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/trace_event/trace_event.h"
+#include "build/build_config.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/ozone/platform/drm/common/drm_overlay_candidates.h"
 #include "ui/ozone/public/overlay_surface_candidate.h"
@@ -125,6 +126,21 @@
     return false;
   }
 
+#if defined(ARCH_CPU_X86_FAMILY)
+  // TODO(dcastagna|oshima): Re-enable NV12 format as HW overlay once
+  // b/113362843 is addressed.
+  if (candidate.format == gfx::BufferFormat::YUV_420_BIPLANAR) {
+    // Reject buffer whose cropped horizontal coordinates doesn't fall on
+    // even pixel boundary.
+    int nearest_x = gfx::ToFlooredInt(candidate.buffer_size.width() *
+                                      candidate.crop_rect.x());
+    int nearest_width = gfx::ToFlooredInt(candidate.buffer_size.width() *
+                                          candidate.crop_rect.width());
+    if (nearest_x % 2 != 0 || nearest_width % 2 != 0)
+      return false;
+  }
+#endif
+
   return true;
 }
 
diff --git a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
index 78c43b6..18994c6 100644
--- a/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
+++ b/ui/webui/resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html
@@ -20,14 +20,15 @@
         box-sizing: border-box;
         color: var(--google-grey-700);
         font-size: 13px;
-        height: 640px;
+        height: var(--multidevice-setup-height, 640px);
         line-height: 16px;
         margin: auto;
         padding: 60px 32px 32px 32px;
-        width: 768px;
+        width: var(--multidevice-setup-width, 768px);
       }
 
       iron-pages {
+        overflow: auto;
         padding: 0 32px;
       }
     </style>