diff --git a/.gn b/.gn
index 6f277297..b5d079bd 100644
--- a/.gn
+++ b/.gn
@@ -317,7 +317,6 @@
   "//third_party/Python-Markdown/*",
 
   # "//third_party/SPIRV-Tools/*",  # 30ish errors
-  "//third_party/WebKit/*",
   "//third_party/abseil-cpp/*",
   "//third_party/accessibility-audit/*",
   "//third_party/accessibility_test_framework/*",
diff --git a/DEPS b/DEPS
index fc40ccca..765a51e 100644
--- a/DEPS
+++ b/DEPS
@@ -120,11 +120,11 @@
   # 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.
-  'swarming_revision': '157bec8a25cc4ebd6a16052510d08b05b6102aad',
+  'swarming_revision': '0e3e1c4dc4e79f25a5b58fcbc135dc93183c0c54',
   # 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': 'b51eb09fb5bb1d668f292735d1f9e5f4c692e443',
+  'angle_revision': '317a9ebdb019b02fda925072a5572265826676e9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -136,7 +136,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '75a486e0a03af0753743f5637abf929ea0bd3bbd',
+  'pdfium_revision': 'dae4dfd2c5df71729aac4ff54586fd3eb2d4bda7',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -172,7 +172,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': '63d69d7792c1ef8f18d8b620ff025de767849514',
+  'catapult_revision': '1b98245e3cb73fd67d1e2e50a016f4d2af76dd30',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -236,7 +236,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'df72914a60d570678b60ccc2e23b2ff13396f218',
+  'dawn_revision': '58017e91adbfadd36d183fe13bb9ba7d71b24b2c',
 }
 
 # Only these hosts are allowed for dependencies in this DEPS file.
@@ -651,7 +651,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '0de9e8166ee4a9fbf483b9d7993b5d3ee8fbcd1f',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'ae7e8f53c6ebd9a360627192142d68d71cfb2c84',
       'condition': 'checkout_linux',
   },
 
@@ -676,7 +676,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'dd530811aba99d0ae85136dbd01bcf81ce3e3b5f',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '016601cc21469a272315d694a9add19e0b68328c',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1008,7 +1008,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '7b49412a6e09da8fe1d37dca67db94c12a509ffc',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '207cb0177f05e04db2440ba30890e941dd1d77f5',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1202,7 +1202,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f7089e1b9227657e433a545c65e2ba4d19eb7260',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f2f731d6ce852565bf12f6fe6f9ae571bf73fd18',
     'condition': 'checkout_src_internal',
   },
 
@@ -1978,7 +1978,6 @@
         'src/third_party/blink/tools',  # See http://crbug.com/625877.
         'src/third_party/catapult',
         'src/third_party/closure_compiler/build',
-        'src/third_party/WebKit/Tools/Scripts',  # See http://crbug.com/625877.
         'src/tools',
     ],
   },
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index c3db0984..fb849b1 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -15,7 +15,7 @@
     r"^native_client_sdk[\\/]src[\\/]tools[\\/].*.mk",
     r"^net[\\/]tools[\\/]spdyshark[\\/].*",
     r"^skia[\\/].*",
-    r"^third_party[\\/](WebKit|blink)[\\/].*",
+    r"^third_party[\\/]blink[\\/].*",
     r"^third_party[\\/]breakpad[\\/].*",
     r"^v8[\\/].*",
     r".*MakeFile$",
@@ -661,7 +661,6 @@
     'build/android/gyp/copy_ex.pydeps',
     'build/android/gyp/create_app_bundle.pydeps',
     'build/android/gyp/create_apk_operations_script.pydeps',
-    'build/android/gyp/create_dist_jar.pydeps',
     'build/android/gyp/create_java_binary_script.pydeps',
     'build/android/gyp/create_stack_script.pydeps',
     'build/android/gyp/create_test_runner_script.pydeps',
@@ -686,6 +685,7 @@
     'build/android/gyp/proguard.pydeps',
     'build/android/gyp/write_build_config.pydeps',
     'build/android/gyp/write_ordered_libraries.pydeps',
+    'build/android/gyp/zip.pydeps',
     'build/android/incremental_install/generate_android_manifest.pydeps',
     'build/android/incremental_install/write_installer_json.pydeps',
     'build/android/resource_sizes.pydeps',
@@ -1551,7 +1551,7 @@
   virtual_depended_on_files = set()
 
   file_filter = lambda f: not input_api.re.match(
-      r"^third_party[\\/](WebKit|blink)[\\/].*", f.LocalPath())
+      r"^third_party[\\/]blink[\\/].*", f.LocalPath())
   for f in input_api.AffectedFiles(include_deletes=False,
                                    file_filter=file_filter):
     filename = input_api.os_path.basename(f.LocalPath())
@@ -2178,9 +2178,7 @@
   for f in input_api.AffectedFiles(include_deletes=False):
     if (f.LocalPath().startswith('third_party') and
         not f.LocalPath().startswith('third_party/blink') and
-        not f.LocalPath().startswith('third_party\\blink') and
-        not f.LocalPath().startswith('third_party/WebKit') and
-        not f.LocalPath().startswith('third_party\\WebKit')):
+        not f.LocalPath().startswith('third_party\\blink')):
       continue
 
     if not f.LocalPath().endswith('.h'):
@@ -2734,8 +2732,8 @@
   bad_files = {}
   for f in input_api.AffectedFiles(include_deletes=False):
     if (f.LocalPath().startswith('third_party') and
-      not f.LocalPath().startswith('third_party/WebKit') and
-      not f.LocalPath().startswith('third_party\\WebKit')):
+      not f.LocalPath().startswith('third_party/blink') and
+      not f.LocalPath().startswith('third_party\\blink')):
       continue
 
     if not CppChecker.IsCppFile(f.LocalPath()):
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py
index a04f742..1ac9a8e 100755
--- a/PRESUBMIT_test.py
+++ b/PRESUBMIT_test.py
@@ -1377,11 +1377,11 @@
   def testBlinkHeaders(self):
     mock_input_api = MockInputApi()
     mock_input_api.files = [
-      MockAffectedFile('third_party/WebKit/header.h', [
+      MockAffectedFile('third_party/blink/header.h', [
         'class DummyClass;',
         'struct DummyStruct;',
       ]),
-      MockAffectedFile('third_party\\WebKit\\header.h', [
+      MockAffectedFile('third_party\\blink\\header.h', [
         'class DummyClass;',
         'struct DummyStruct;',
       ])
@@ -1445,7 +1445,7 @@
   def testRelativeIncludeWebKitProducesError(self):
     mock_input_api = MockInputApi()
     mock_input_api.files = [
-      MockAffectedFile('third_party/WebKit/test.cpp',
+      MockAffectedFile('third_party/blink/test.cpp',
                        ['#include "../header.h']),
     ]
 
diff --git a/WATCHLISTS b/WATCHLISTS
index c491d19b..049bcbe 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1081,9 +1081,6 @@
     'linux_seccomp_bpf': {
       'filepath': 'content/common/sandbox.*linux.cc',
     },
-    'login': {
-      'filepath': 'chrome/browser/ui/login'
-    },
     'mac': {
       'filepath': '(_|/)(cocoa|mac)(_|\.)|/(cocoa|mac)/|^((?!ios\/).)*\.mm?$',
     },
@@ -1846,8 +1843,7 @@
                  'mathp+autofillwatch@chromium.org',
                  'rogerm+autofillwatch@chromium.org',
                  'sebsg+autofillwatch@chromium.org',
-                 'tmartino+autofillwatch@chromium.org',
-                 'vabr+watchlistautofill@chromium.org'],
+                 'tmartino+autofillwatch@chromium.org'],
     'autofill_assistant': ['autofill_assistant+watch@google.com'],
     'autofill_credit_cards': ['jsaul+autofillwatch@google.com'],
     'background_fetch': ['peter@chromium.org',
@@ -2253,7 +2249,6 @@
     'linux_fonts': ['derat+watch@chromium.org'],
     'linux_sandboxing': ['jln+watch@chromium.org'],
     'linux_seccomp_bpf': ['jln+watch@chromium.org'],
-    'login': ['vabr+watchlistlogin@chromium.org'],
     'mac' : ['mac-reviews@chromium.org'],
     'manifest': ['mlamouri+watch-manifest@chromium.org'],
     'mash_buildbot_filters': ['dxie+watch@chromium.org',
@@ -2348,7 +2343,6 @@
                'jennb@chromium.org',
                'jianli@chromium.org'],
     'password_manager': ['gcasto+watchlist@chromium.org',
-                         'vabr+watchlistpasswordmanager@chromium.org',
                          'vasilii+watchlistpasswordmanager@chromium.org'],
     'payments': ['rouslan+payments@chromium.org',
                  'gogerald+paymentswatch@chromium.org',
diff --git a/android_webview/browser/aw_render_thread_context_provider.cc b/android_webview/browser/aw_render_thread_context_provider.cc
index f971a6c..95e06d5 100644
--- a/android_webview/browser/aw_render_thread_context_provider.cc
+++ b/android_webview/browser/aw_render_thread_context_provider.cc
@@ -28,13 +28,13 @@
 scoped_refptr<AwRenderThreadContextProvider>
 AwRenderThreadContextProvider::Create(
     scoped_refptr<gl::GLSurface> surface,
-    gpu::CommandBufferTaskExecutor* task_executor) {
-  return new AwRenderThreadContextProvider(surface, task_executor);
+    scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor) {
+  return new AwRenderThreadContextProvider(surface, std::move(task_executor));
 }
 
 AwRenderThreadContextProvider::AwRenderThreadContextProvider(
     scoped_refptr<gl::GLSurface> surface,
-    gpu::CommandBufferTaskExecutor* task_executor) {
+    scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor) {
   DCHECK(main_thread_checker_.CalledOnValidThread());
 
   // This is an onscreen context, wrapping the GLSurface given to us from
@@ -66,9 +66,9 @@
   limits.min_transfer_buffer_size = 64 * 1024;
 
   context_ = std::make_unique<gpu::GLInProcessContext>();
-  context_->Initialize(task_executor, surface, surface->IsOffscreen(),
-                       gpu::kNullSurfaceHandle, attributes, limits, nullptr,
-                       nullptr, nullptr);
+  context_->Initialize(std::move(task_executor), surface,
+                       surface->IsOffscreen(), gpu::kNullSurfaceHandle,
+                       attributes, limits, nullptr, nullptr, nullptr);
 
   context_->GetImplementation()->SetLostContextCallback(base::BindOnce(
       &AwRenderThreadContextProvider::OnLostContext, base::Unretained(this)));
diff --git a/android_webview/browser/aw_render_thread_context_provider.h b/android_webview/browser/aw_render_thread_context_provider.h
index 4be7a0f3..3767baff 100644
--- a/android_webview/browser/aw_render_thread_context_provider.h
+++ b/android_webview/browser/aw_render_thread_context_provider.h
@@ -36,7 +36,7 @@
  public:
   static scoped_refptr<AwRenderThreadContextProvider> Create(
       scoped_refptr<gl::GLSurface> surface,
-      gpu::CommandBufferTaskExecutor* task_executor);
+      scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor);
 
   // Gives the GL internal format that should be used for calling CopyTexImage2D
   // on the default framebuffer.
@@ -60,8 +60,9 @@
  protected:
   friend class base::RefCountedThreadSafe<AwRenderThreadContextProvider>;
 
-  AwRenderThreadContextProvider(scoped_refptr<gl::GLSurface> surface,
-                                gpu::CommandBufferTaskExecutor* task_executor);
+  AwRenderThreadContextProvider(
+      scoped_refptr<gl::GLSurface> surface,
+      scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor);
   ~AwRenderThreadContextProvider() override;
 
  private:
diff --git a/android_webview/browser/deferred_gpu_command_service.cc b/android_webview/browser/deferred_gpu_command_service.cc
index 046ae3e..ca7382dd 100644
--- a/android_webview/browser/deferred_gpu_command_service.cc
+++ b/android_webview/browser/deferred_gpu_command_service.cc
@@ -8,6 +8,7 @@
 #include "android_webview/browser/render_thread_manager.h"
 #include "base/command_line.h"
 #include "base/lazy_instance.h"
+#include "base/no_destructor.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/trace_event/trace_event.h"
@@ -145,8 +146,9 @@
 
 // static
 DeferredGpuCommandService* DeferredGpuCommandService::GetInstance() {
-  static DeferredGpuCommandService* service = CreateDeferredGpuCommandService();
-  return service;
+  static base::NoDestructor<scoped_refptr<DeferredGpuCommandService>> service(
+      CreateDeferredGpuCommandService());
+  return service->get();
 }
 
 DeferredGpuCommandService::DeferredGpuCommandService(
diff --git a/android_webview/browser/deferred_gpu_command_service.h b/android_webview/browser/deferred_gpu_command_service.h
index a504c76..27d9cae 100644
--- a/android_webview/browser/deferred_gpu_command_service.h
+++ b/android_webview/browser/deferred_gpu_command_service.h
@@ -46,8 +46,6 @@
  public:
   static DeferredGpuCommandService* GetInstance();
 
-  ~DeferredGpuCommandService() override;
-
   // gpu::CommandBufferTaskExecutor implementation.
   bool ForceVirtualizedGLContexts() const override;
   bool ShouldCreateMemoryTracker() const override;
@@ -69,6 +67,9 @@
   // idle tasks during the idle run.
   void PerformAllIdleWork();
 
+ protected:
+  ~DeferredGpuCommandService() override;
+
  private:
   friend class ScopedAllowGL;
   friend class TaskForwardingSequence;
diff --git a/ash/components/shortcut_viewer/shortcut_viewer_application.cc b/ash/components/shortcut_viewer/shortcut_viewer_application.cc
index 922940978..98a389a 100644
--- a/ash/components/shortcut_viewer/shortcut_viewer_application.cc
+++ b/ash/components/shortcut_viewer/shortcut_viewer_application.cc
@@ -10,14 +10,14 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "services/service_manager/public/cpp/connector.h"
-#include "services/service_manager/public/cpp/service_context.h"
 #include "ui/events/devices/input_device_manager.h"
 #include "ui/views/mus/aura_init.h"
 
 namespace keyboard_shortcut_viewer {
 
-ShortcutViewerApplication::ShortcutViewerApplication()
-    : shortcut_viewer_binding_(this) {
+ShortcutViewerApplication::ShortcutViewerApplication(
+    service_manager::mojom::ServiceRequest request)
+    : service_binding_(this, std::move(request)) {
   registry_.AddInterface<shortcut_viewer::mojom::ShortcutViewer>(
       base::BindRepeating(&ShortcutViewerApplication::AddBinding,
                           base::Unretained(this)));
@@ -32,13 +32,13 @@
 
 void ShortcutViewerApplication::OnStart() {
   views::AuraInit::InitParams params;
-  params.connector = context()->connector();
-  params.identity = context()->identity();
+  params.connector = service_binding_.GetConnector();
+  params.identity = service_binding_.identity();
   params.register_path_provider = false;
   params.use_accessibility_host = true;
   aura_init_ = views::AuraInit::Create(params);
   if (!aura_init_) {
-    context()->QuitNow();
+    Terminate();
     return;
   }
 
@@ -46,8 +46,9 @@
   ash::ash_client::Init();
 
   // Quit the application when the window is closed.
-  last_window_closed_observer_ = std::make_unique<LastWindowClosedObserver>(
-      context()->CreateQuitClosure());
+  last_window_closed_observer_ =
+      std::make_unique<LastWindowClosedObserver>(base::BindRepeating(
+          &ShortcutViewerApplication::Terminate, base::Unretained(this)));
 }
 
 void ShortcutViewerApplication::OnBindInterface(
diff --git a/ash/components/shortcut_viewer/shortcut_viewer_application.h b/ash/components/shortcut_viewer/shortcut_viewer_application.h
index 03e3c5e..32c6404 100644
--- a/ash/components/shortcut_viewer/shortcut_viewer_application.h
+++ b/ash/components/shortcut_viewer/shortcut_viewer_application.h
@@ -13,6 +13,8 @@
 #include "mojo/public/cpp/bindings/binding.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "ui/events/devices/input_device_event_observer.h"
 
 namespace views {
@@ -29,7 +31,8 @@
       public ui::InputDeviceEventObserver,
       public shortcut_viewer::mojom::ShortcutViewer {
  public:
-  ShortcutViewerApplication();
+  explicit ShortcutViewerApplication(
+      service_manager::mojom::ServiceRequest request);
   ~ShortcutViewerApplication() override;
 
   // Records a single trace event for shortcut viewer. chrome://tracing doesn't
@@ -52,13 +55,15 @@
 
   void AddBinding(shortcut_viewer::mojom::ShortcutViewerRequest request);
 
+  service_manager::ServiceBinding service_binding_;
+
   std::unique_ptr<views::AuraInit> aura_init_;
   std::unique_ptr<LastWindowClosedObserver> last_window_closed_observer_;
 
   service_manager::BinderRegistry registry_;
 
   mojo::Binding<shortcut_viewer::mojom::ShortcutViewer>
-      shortcut_viewer_binding_;
+      shortcut_viewer_binding_{this};
 
   // Timestamp of the user gesture (e.g. Ctrl-Shift-/ keystroke) that triggered
   // showing the window. Used for metrics.
diff --git a/ash/components/tap_visualizer/tap_visualizer_app.cc b/ash/components/tap_visualizer/tap_visualizer_app.cc
index c214aed..9b18560 100644
--- a/ash/components/tap_visualizer/tap_visualizer_app.cc
+++ b/ash/components/tap_visualizer/tap_visualizer_app.cc
@@ -10,7 +10,6 @@
 #include "ash/public/cpp/shell_window_ids.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
-#include "services/service_manager/public/cpp/service_context.h"
 #include "services/ws/public/cpp/property_type_converters.h"
 #include "services/ws/public/mojom/window_manager.mojom.h"
 #include "services/ws/public/mojom/window_tree_constants.mojom.h"
@@ -24,7 +23,9 @@
 
 namespace tap_visualizer {
 
-TapVisualizerApp::TapVisualizerApp() = default;
+TapVisualizerApp::TapVisualizerApp(
+    service_manager::mojom::ServiceRequest request)
+    : service_binding_(this, std::move(request)) {}
 
 TapVisualizerApp::~TapVisualizerApp() {
   display::Screen::GetScreen()->RemoveObserver(this);
@@ -46,12 +47,12 @@
 
 void TapVisualizerApp::OnStart() {
   views::AuraInit::InitParams params;
-  params.connector = context()->connector();
-  params.identity = context()->identity();
+  params.connector = service_binding_.GetConnector();
+  params.identity = service_binding_.identity();
   params.register_path_provider = false;
   aura_init_ = views::AuraInit::Create(params);
   if (!aura_init_) {
-    context()->QuitNow();
+    Terminate();
     return;
   }
   Start();
diff --git a/ash/components/tap_visualizer/tap_visualizer_app.h b/ash/components/tap_visualizer/tap_visualizer_app.h
index edba6fe9..5c11c56 100644
--- a/ash/components/tap_visualizer/tap_visualizer_app.h
+++ b/ash/components/tap_visualizer/tap_visualizer_app.h
@@ -12,6 +12,8 @@
 
 #include "base/macros.h"
 #include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "ui/display/display_observer.h"
 #include "ui/events/event_observer.h"
 
@@ -29,7 +31,8 @@
                          public ui::EventObserver,
                          public display::DisplayObserver {
  public:
-  TapVisualizerApp();
+  explicit TapVisualizerApp(service_manager::mojom::ServiceRequest request);
+
   ~TapVisualizerApp() override;
 
  private:
@@ -51,6 +54,8 @@
   // Creates the touch HUD widget for a display.
   void CreateWidgetForDisplay(int64_t display_id);
 
+  service_manager::ServiceBinding service_binding_;
+
   // Maps display::Display::id() to the renderer for that display.
   std::map<int64_t, std::unique_ptr<TapRenderer>> display_id_to_renderer_;
 
diff --git a/ash/components/tap_visualizer/tap_visualizer_app_unittest.cc b/ash/components/tap_visualizer/tap_visualizer_app_unittest.cc
index 2ff7794..f8b43eb9 100644
--- a/ash/components/tap_visualizer/tap_visualizer_app_unittest.cc
+++ b/ash/components/tap_visualizer/tap_visualizer_app_unittest.cc
@@ -81,7 +81,7 @@
 
 TEST_F(TapVisualizerAppTest, Basics) {
   // Simulate the service starting.
-  TapVisualizerApp app;
+  TapVisualizerApp app(nullptr);
   TapVisualizerAppTestApi test_api(&app);
   test_api.Start();
 
@@ -111,7 +111,7 @@
       display::DisplayList::Type::NOT_PRIMARY);
 
   // Simulate the service starting.
-  TapVisualizerApp app;
+  TapVisualizerApp app(nullptr);
   TapVisualizerAppTestApi test_api(&app);
   test_api.Start();
 
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index ff75529..59bfeda 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -166,8 +166,7 @@
 // ShelfLayoutManager ----------------------------------------------------------
 
 ShelfLayoutManager::ShelfLayoutManager(ShelfWidget* shelf_widget, Shelf* shelf)
-    : updating_bounds_(false),
-      shelf_widget_(shelf_widget),
+    : shelf_widget_(shelf_widget),
       shelf_(shelf),
       is_background_blur_enabled_(
           app_list_features::IsBackgroundBlurEnabled()) {
@@ -342,9 +341,10 @@
   if (visibility_state() != SHELF_AUTO_HIDE || in_shutdown_)
     return;
 
-  if (event->type() == ui::ET_MOUSE_MOVED ||
-      event->type() == ui::ET_MOUSE_ENTERED ||
-      event->type() == ui::ET_MOUSE_EXITED) {
+  if (event->type() == ui::ET_MOUSE_PRESSED ||
+      (event->type() == ui::ET_MOUSE_MOVED &&
+       GetVisibleShelfBounds().Contains(
+           display::Screen::GetScreen()->GetCursorScreenPoint()))) {
     UpdateAutoHideState();
   }
 }
diff --git a/ash/shelf/shelf_layout_manager.h b/ash/shelf/shelf_layout_manager.h
index bd4aae2..f631568 100644
--- a/ash/shelf/shelf_layout_manager.h
+++ b/ash/shelf/shelf_layout_manager.h
@@ -370,7 +370,7 @@
 
   // True when inside UpdateBoundsAndOpacity() method. Used to prevent calling
   // UpdateBoundsAndOpacity() again from SetChildBounds().
-  bool updating_bounds_;
+  bool updating_bounds_ = false;
 
   bool in_shutdown_ = false;
 
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index 43aa2c2..2f2ea86 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -424,6 +424,17 @@
         ->layer();
   }
 
+  // If |layout_manager->auto_hide_timer_| is running, stops it, runs its task,
+  // and returns true. Otherwise, returns false.
+  bool TriggerAutoHideTimeout() const {
+    ShelfLayoutManager* layout_manager = GetShelfLayoutManager();
+    if (!layout_manager->auto_hide_timer_.IsRunning())
+      return false;
+
+    layout_manager->auto_hide_timer_.FireNow();
+    return true;
+  }
+
  private:
   base::TimeTicks timestamp_;
   gfx::Point current_point_;
@@ -2471,6 +2482,62 @@
   EXPECT_TRUE(GetPrimaryUnifiedSystemTray()->IsBubbleShown());
 }
 
+// Tests the auto-hide shelf status with mouse events.
+TEST_F(ShelfLayoutManagerTest, AutoHideShelfOnMouseEvents) {
+  views::Widget* widget = CreateTestWidget();
+  widget->Maximize();
+  Shelf* shelf = GetPrimaryShelf();
+  ui::test::EventGenerator* generator = GetEventGenerator();
+  generator->MoveMouseTo(0, 0);
+
+  shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
+  ShelfLayoutManager* layout_manager = GetShelfLayoutManager();
+  layout_manager->LayoutShelf();
+  EXPECT_EQ(SHELF_AUTO_HIDE, shelf->GetVisibilityState());
+  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->GetAutoHideState());
+
+  gfx::Rect display_bounds =
+      display::Screen::GetScreen()->GetPrimaryDisplay().bounds();
+  const gfx::Point start(display_bounds.bottom_center());
+  const gfx::Point end(start + gfx::Vector2d(0, -80));
+  const base::TimeDelta kTimeDelta = base::TimeDelta::FromMilliseconds(100);
+  const int kNumScrollSteps = 4;
+  // Swipe up to show the auto-hide shelf.
+  generator->GestureScrollSequence(start, end, kTimeDelta, kNumScrollSteps);
+  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState());
+
+  // Move the mouse should not hide the AUTO_HIDE_SHOWN shelf.
+  generator->MoveMouseTo(5, 5);
+  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState());
+
+  // Mouse press outside the shelf should hide the AUTO_HIDE_SHOWN shelf.
+  generator->PressLeftButton();
+  generator->ReleaseLeftButton();
+  EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->GetAutoHideState());
+
+  // Move the mouse to the position which is contained by the bounds of the
+  // shelf when it is visible should show the auto-hide shelf.
+  display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay();
+  const int display_bottom = display.bounds().bottom();
+  generator->MoveMouseTo(1, display_bottom - 1);
+  ASSERT_TRUE(TriggerAutoHideTimeout());
+  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState());
+
+  // Mouse press inside the shelf should not hide the AUTO_HIDE_SHOWN shelf.
+  generator->MoveMouseTo(
+      GetShelfWidget()->GetWindowBoundsInScreen().CenterPoint());
+  generator->PressLeftButton();
+  generator->ReleaseLeftButton();
+  EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState());
+
+  // Mouse press the system tray should open the system tray bubble.
+  generator->MoveMouseTo(
+      GetPrimaryUnifiedSystemTray()->GetBoundsInScreen().CenterPoint());
+  generator->PressLeftButton();
+  generator->ReleaseLeftButton();
+  EXPECT_TRUE(GetPrimaryUnifiedSystemTray()->IsBubbleShown());
+}
+
 class ShelfLayoutManagerKeyboardTest : public AshTestBase {
  public:
   ShelfLayoutManagerKeyboardTest() = default;
diff --git a/ash/shell/content/client/shell_main_delegate.cc b/ash/shell/content/client/shell_main_delegate.cc
index fb897039..15b2b93 100644
--- a/ash/shell/content/client/shell_main_delegate.cc
+++ b/ash/shell/content/client/shell_main_delegate.cc
@@ -33,15 +33,17 @@
       std::move(request));
 }
 
-std::unique_ptr<service_manager::Service> CreateShortcutViewer() {
+std::unique_ptr<service_manager::Service> CreateShortcutViewer(
+    service_manager::mojom::ServiceRequest request) {
   logging::SetLogPrefix("shortcut");
-  return std::make_unique<
-      keyboard_shortcut_viewer::ShortcutViewerApplication>();
+  return std::make_unique<keyboard_shortcut_viewer::ShortcutViewerApplication>(
+      std::move(request));
 }
 
-std::unique_ptr<service_manager::Service> CreateTapVisualizer() {
+std::unique_ptr<service_manager::Service> CreateTapVisualizer(
+    service_manager::mojom::ServiceRequest request) {
   logging::SetLogPrefix("tap");
-  return std::make_unique<tap_visualizer::TapVisualizerApp>();
+  return std::make_unique<tap_visualizer::TapVisualizerApp>(std::move(request));
 }
 
 std::unique_ptr<service_manager::Service> CreateTestImeDriver(
@@ -55,19 +57,6 @@
   ~ShellContentUtilityClient() override = default;
 
   // ContentUtilityClient:
-  void RegisterServices(StaticServiceMap* services) override {
-    {
-      service_manager::EmbeddedServiceInfo info;
-      info.factory = base::BindRepeating(&CreateShortcutViewer);
-      (*services)[shortcut_viewer::mojom::kServiceName] = info;
-    }
-    {
-      service_manager::EmbeddedServiceInfo info;
-      info.factory = base::BindRepeating(&CreateTapVisualizer);
-      (*services)[tap_visualizer::mojom::kServiceName] = info;
-    }
-  }
-
   std::unique_ptr<service_manager::Service> HandleServiceRequest(
       const std::string& service_name,
       service_manager::mojom::ServiceRequest request) override {
@@ -75,6 +64,10 @@
       return CreateQuickLaunch(std::move(request));
     if (service_name == test_ime_driver::mojom::kServiceName)
       return CreateTestImeDriver(std::move(request));
+    if (service_name == shortcut_viewer::mojom::kServiceName)
+      return CreateShortcutViewer(std::move(request));
+    if (service_name == tap_visualizer::mojom::kServiceName)
+      return CreateTapVisualizer(std::move(request));
 
     return nullptr;
   }
diff --git a/ash/test/ash_test_views_delegate.cc b/ash/test/ash_test_views_delegate.cc
index 26ef9e4..4c8be685 100644
--- a/ash/test/ash_test_views_delegate.cc
+++ b/ash/test/ash_test_views_delegate.cc
@@ -5,6 +5,7 @@
 #include "ash/test/ash_test_views_delegate.h"
 
 #include "ash/shell.h"
+#include "ui/base/ui_base_features.h"
 
 namespace ash {
 
@@ -16,9 +17,13 @@
     views::Widget::InitParams* params,
     views::internal::NativeWidgetDelegate* delegate) {
   if (running_outside_ash_) {
-    DCHECK(ash::Shell::HasInstance());
-    if (!params->parent && !params->context)
-      params->context = Shell::GetRootWindowForNewWindows();
+    // With Mash, MusClient::CreateNativeWidget uses a DesktopNativeWidgetAura,
+    // which doesn't need a context.
+    if (!features::IsUsingWindowService()) {
+      DCHECK(ash::Shell::HasInstance());
+      if (!params->parent && !params->context)
+        params->context = Shell::GetRootWindowForNewWindows();
+    }
   } else {
     CHECK(params->native_widget || params->context || params->parent)
         << "Widgets must be created with a context or parent. In tests use "
diff --git a/ash/wallpaper/wallpaper_controller.cc b/ash/wallpaper/wallpaper_controller.cc
index a659605f..5a5cd4a 100644
--- a/ash/wallpaper/wallpaper_controller.cc
+++ b/ash/wallpaper/wallpaper_controller.cc
@@ -476,7 +476,7 @@
       color_profiles_(GetProminentColorProfiles()),
       wallpaper_reload_delay_(kWallpaperReloadDelay),
       sequenced_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
-          {base::MayBlock(), base::TaskPriority::USER_BLOCKING,
+          {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
            base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})),
       scoped_session_observer_(this),
       weak_factory_(this) {
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc
index 79c77290..f9aac4a 100644
--- a/ash/wallpaper/wallpaper_controller_unittest.cc
+++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -2312,7 +2312,9 @@
   EXPECT_EQ(user_wallpaper_info, synced_online_wallpaper_info);
 }
 
-TEST_F(WallpaperControllerTest, AddFirstWallpaperAnimationEndCallback) {
+// Disabled due to flakes; see https://crbug.com/910493.
+TEST_F(WallpaperControllerTest,
+       DISABLED_AddFirstWallpaperAnimationEndCallback) {
   ui::ScopedAnimationDurationScaleMode test_duration_mode(
       ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
   std::unique_ptr<aura::Window> test_window(
diff --git a/ash/ws/window_service_owner.cc b/ash/ws/window_service_owner.cc
index ec8a0a7..a48c7386 100644
--- a/ash/ws/window_service_owner.cc
+++ b/ash/ws/window_service_owner.cc
@@ -13,9 +13,7 @@
 #include "base/lazy_instance.h"
 #include "base/unguessable_token.h"
 #include "services/content/public/cpp/buildflags.h"
-#include "services/service_manager/public/cpp/service_context.h"
 #include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/window_service.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
@@ -65,23 +63,21 @@
 WindowServiceOwner::WindowServiceOwner(
     std::unique_ptr<ws::GpuInterfaceProvider> gpu_interface_provider)
     : window_service_delegate_(std::make_unique<WindowServiceDelegateImpl>()),
-      owned_window_service_(
-          std::make_unique<ws::WindowService>(window_service_delegate_.get(),
-                                              std::move(gpu_interface_provider),
-                                              Shell::Get()->focus_controller(),
-                                              !::features::IsMultiProcessMash(),
-                                              Shell::Get()->aura_env())),
-      window_service_(owned_window_service_.get()) {
-  window_service_->SetFrameDecorationValues(
+      window_service_(window_service_delegate_.get(),
+                      std::move(gpu_interface_provider),
+                      Shell::Get()->focus_controller(),
+                      !::features::IsMultiProcessMash(),
+                      Shell::Get()->aura_env()) {
+  window_service_.SetFrameDecorationValues(
       NonClientFrameController::GetPreferredClientAreaInsets(),
       NonClientFrameController::GetMaxTitleBarButtonWidth());
-  window_service_->SetDisplayForNewWindows(
+  window_service_.SetDisplayForNewWindows(
       display::Screen::GetScreen()->GetDisplayForNewWindows().id());
-  RegisterWindowProperties(window_service_->property_converter());
+  RegisterWindowProperties(window_service_.property_converter());
 
 #if BUILDFLAG(ENABLE_REMOTE_NAVIGABLE_CONTENTS_VIEW)
   content::NavigableContentsView::SetRemoteViewManager(
-      std::make_unique<ServerRemoteContentViewManager>(window_service_));
+      std::make_unique<ServerRemoteContentViewManager>(&window_service_));
 #endif  // BUILDFLAG(ENABLE_REMOTE_NAVIGABLE_CONTENTS_VIEW)
 }
 
@@ -89,13 +85,7 @@
 
 void WindowServiceOwner::BindWindowService(
     service_manager::mojom::ServiceRequest request) {
-  // This should only be called once. If called more than once it means the
-  // WindowService lost its connection to the service_manager, which triggered
-  // a new WindowService to be created. That should never happen.
-  DCHECK(!service_context_);
-
-  service_context_ = std::make_unique<service_manager::ServiceContext>(
-      std::move(owned_window_service_), std::move(request));
+  window_service_.BindServiceRequest(std::move(request));
 }
 
 }  // namespace ash
diff --git a/ash/ws/window_service_owner.h b/ash/ws/window_service_owner.h
index ce39401..3a66b38 100644
--- a/ash/ws/window_service_owner.h
+++ b/ash/ws/window_service_owner.h
@@ -11,14 +11,10 @@
 #include "ash/shell_init_params.h"
 #include "base/memory/scoped_refptr.h"
 #include "services/service_manager/public/mojom/service.mojom.h"
-
-namespace service_manager {
-class ServiceContext;
-}
+#include "services/ws/window_service.h"
 
 namespace ws {
 class GpuInterfaceProvider;
-class WindowService;
 }  // namespace ws
 
 namespace ash {
@@ -38,22 +34,13 @@
   // WindowService.
   void BindWindowService(service_manager::mojom::ServiceRequest request);
 
-  ws::WindowService* window_service() { return window_service_; }
+  ws::WindowService* window_service() { return &window_service_; }
 
  private:
   friend class AshTestHelper;
 
   std::unique_ptr<WindowServiceDelegateImpl> window_service_delegate_;
-
-  // Handles the ServiceRequest. Owns |window_service_|.
-  std::unique_ptr<service_manager::ServiceContext> service_context_;
-
-  // The WindowService. The constructor creates the WindowService and assigns
-  // it to |owned_window_service_| and |window_service_|. When
-  // BindWindowService() is called |owned_window_service_| is passed to
-  // |service_context_|.
-  std::unique_ptr<ws::WindowService> owned_window_service_;
-  ws::WindowService* window_service_;
+  ws::WindowService window_service_;
 
   DISALLOW_COPY_AND_ASSIGN(WindowServiceOwner);
 };
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 9f5395e..b6c062e6 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -722,6 +722,7 @@
     "task/post_task.h",
     "task/scoped_set_task_priority_for_current_thread.cc",
     "task/scoped_set_task_priority_for_current_thread.h",
+    "task/sequence_manager/associated_thread_id.cc",
     "task/sequence_manager/associated_thread_id.h",
     "task/sequence_manager/enqueue_order.cc",
     "task/sequence_manager/enqueue_order.h",
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
index aae65a6..679a7d2 100644
--- a/base/android/jni_android.cc
+++ b/base/android/jni_android.cc
@@ -58,7 +58,7 @@
     }
 
     ret = g_jvm->AttachCurrentThread(&env, &args);
-    DCHECK_EQ(JNI_OK, ret);
+    CHECK_EQ(JNI_OK, ret);
   }
   return env;
 }
@@ -71,7 +71,7 @@
   args.group = NULL;
   JNIEnv* env = NULL;
   jint ret = g_jvm->AttachCurrentThread(&env, &args);
-  DCHECK_EQ(JNI_OK, ret);
+  CHECK_EQ(JNI_OK, ret);
   return env;
 }
 
diff --git a/base/task/sequence_manager/associated_thread_id.cc b/base/task/sequence_manager/associated_thread_id.cc
new file mode 100644
index 0000000..bd1cdda9
--- /dev/null
+++ b/base/task/sequence_manager/associated_thread_id.cc
@@ -0,0 +1,34 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/task/sequence_manager/associated_thread_id.h"
+
+namespace base {
+namespace sequence_manager {
+namespace internal {
+
+AssociatedThreadId::AssociatedThreadId() = default;
+AssociatedThreadId::~AssociatedThreadId() = default;
+
+void AssociatedThreadId::BindToCurrentThread() {
+  // TODO(altimin): Remove this after MessageLoopImpl is gone and
+  // initialisation is simplified.
+  auto current_thread_id = PlatformThread::CurrentId();
+  auto prev_thread_id =
+      thread_id_.exchange(current_thread_id, std::memory_order_release);
+  ANALYZER_ALLOW_UNUSED(prev_thread_id);
+  DCHECK(prev_thread_id == current_thread_id ||
+         prev_thread_id == kInvalidThreadId);
+
+  // Rebind the thread and sequence checkers to the current thread/sequence.
+  DETACH_FROM_THREAD(thread_checker);
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker);
+
+  DETACH_FROM_SEQUENCE(sequence_checker);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker);
+}
+
+}  // namespace internal
+}  // namespace sequence_manager
+}  // namespace base
\ No newline at end of file
diff --git a/base/task/sequence_manager/associated_thread_id.h b/base/task/sequence_manager/associated_thread_id.h
index 56052c2..157a43c 100644
--- a/base/task/sequence_manager/associated_thread_id.h
+++ b/base/task/sequence_manager/associated_thread_id.h
@@ -5,10 +5,12 @@
 #ifndef BASE_TASK_SEQUENCE_MANAGER_ASSOCIATED_THREAD_ID_H_
 #define BASE_TASK_SEQUENCE_MANAGER_ASSOCIATED_THREAD_ID_H_
 
+#include <atomic>
 #include <memory>
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/optional.h"
 #include "base/sequence_checker.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_checker.h"
@@ -19,10 +21,14 @@
 
 // TODO(eseckler): Make this owned by SequenceManager once the TaskQueue
 // refactor has happened (https://crbug.com/865411).
-struct BASE_EXPORT AssociatedThreadId
+//
+// This class is thread-safe. But see notes about memory ordering guarantees for
+// the various methods.
+class BASE_EXPORT AssociatedThreadId
     : public base::RefCountedThreadSafe<AssociatedThreadId> {
  public:
-  PlatformThreadId thread_id = kInvalidThreadId;
+  AssociatedThreadId();
+
   // TODO(eseckler): Replace thread_checker with sequence_checker everywhere.
   THREAD_CHECKER(thread_checker);
   SEQUENCE_CHECKER(sequence_checker);
@@ -39,21 +45,53 @@
 
   // Rebind the associated thread to the current thread. This allows creating
   // the SequenceManager and TaskQueues on a different thread/sequence than the
-  // one it will manage. Should only be called once.
-  void BindToCurrentThread() {
-    // TODO(altimin): Remove this after MessageLoopImpl is gone and
-    // initialisation is simplified.
-    if (thread_id == PlatformThread::CurrentId())
-      return;
-    DCHECK_EQ(kInvalidThreadId, thread_id);
-    thread_id = PlatformThread::CurrentId();
+  // one it will manage.
+  //
+  // Can only be called once.
+  void BindToCurrentThread();
 
-    // Rebind the thread and sequence checkers to the current thread/sequence.
-    DETACH_FROM_THREAD(thread_checker);
-    DCHECK_CALLED_ON_VALID_THREAD(thread_checker);
+  // Returns the id of the thread bound to this object via a previous call to
+  // BindToCurrentThread(), nullopt if no thread was bound yet.
+  //
+  // This method guarantees a happens-before ordering with
+  // BindToCurrentThread(), that is all memory writes that happened-before the
+  // call to BindToCurrentThread() will become visible side-effects in the
+  // current thread.
+  //
+  // Attention: The result might be stale by the time this method returns.
+  Optional<PlatformThreadId> GetBoundThreadId() const {
+    auto thread_id = thread_id_.load(std::memory_order_acquire);
+    if (thread_id == kInvalidThreadId) {
+      return nullopt;
+    } else {
+      return thread_id;
+    }
+  }
 
-    DETACH_FROM_SEQUENCE(sequence_checker);
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker);
+  // Checks whether this object has already been bound to a thread.
+  //
+  // This method guarantees a happens-before ordering with
+  // BindToCurrentThread(), that is all memory writes that happened-before the
+  // call to BindToCurrentThread() will become visible side-effects in the
+  // current thread.
+  //
+  // Attention: The result might be stale by the time this method returns.
+  bool IsBound() const {
+    return thread_id_.load(std::memory_order_acquire) != kInvalidThreadId;
+  }
+
+  // Checks whether this object is bound to the current thread. Returns false if
+  // this object is not bound to any thread.
+  //
+  // Note that this method provides no memory ordering guarantees but those are
+  // not really needed. If this method returns true we are on the same thread
+  // that called BindToCurrentThread(). If the method returns false this object
+  // could be unbound, so there is no possible ordering.
+  //
+  // Attention:: The result might be stale by the time this method returns.
+  bool IsBoundToCurrentThread() const {
+    return thread_id_.load(std::memory_order_relaxed) ==
+           PlatformThread::CurrentId();
   }
 
   // TODO(eseckler): Add a method that checks that we are either bound already
@@ -61,7 +99,11 @@
 
  private:
   friend class base::RefCountedThreadSafe<AssociatedThreadId>;
-  ~AssociatedThreadId() = default;
+  ~AssociatedThreadId();
+
+  // All access to this member can be std::memory_order_relaxed as this class
+  // provides no ordering guarantees.
+  std::atomic<PlatformThreadId> thread_id_{kInvalidThreadId};
 };
 
 }  // namespace internal
diff --git a/base/task/sequence_manager/lazily_deallocated_deque.h b/base/task/sequence_manager/lazily_deallocated_deque.h
index 7a895eb..40875e46 100644
--- a/base/task/sequence_manager/lazily_deallocated_deque.h
+++ b/base/task/sequence_manager/lazily_deallocated_deque.h
@@ -32,7 +32,7 @@
 // MaybeShrinkQueue to avoid unnecessary churn.
 //
 // NB this queue isn't by itself thread safe.
-template <typename T>
+template <typename T, TimeTicks (*now_source)() = TimeTicks::Now>
 class LazilyDeallocatedDeque {
  public:
   enum {
@@ -168,7 +168,7 @@
     DCHECK_GE(max_size_, size_);
 
     // Rate limit how often we shrink the queue because it's somewhat expensive.
-    TimeTicks current_time = TimeTicks::Now();
+    TimeTicks current_time = now_source();
     if (current_time < next_resize_time_)
       return;
 
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc
index 3223a8a..e9af972 100644
--- a/base/task/sequence_manager/sequence_manager_impl.cc
+++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -13,6 +13,7 @@
 #include "base/debug/crash_logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop_current.h"
+#include "base/optional.h"
 #include "base/rand_util.h"
 #include "base/task/sequence_manager/real_time_domain.h"
 #include "base/task/sequence_manager/task_time_observer.h"
@@ -199,9 +200,7 @@
 }
 
 void SequenceManagerImpl::BindToCurrentThread() {
-  // Associated thread is bound early for thread controller with message pump.
-  if (associated_thread_->thread_id == kInvalidThreadId)
-    associated_thread_->BindToCurrentThread();
+  associated_thread_->BindToCurrentThread();
 }
 
 void SequenceManagerImpl::BindToCurrentThread(
@@ -920,15 +919,15 @@
 }
 
 std::string SequenceManagerImpl::GetThreadName() const {
-  DCHECK_NE(kInvalidThreadId, associated_thread_->thread_id)
+  Optional<PlatformThreadId> thread_id = associated_thread_->GetBoundThreadId();
+  DCHECK(thread_id)
       << "GetThreadName() must only be called after BindToCurrentThread()'s "
       << "side-effects have been synchronized with this thread.";
-  return ThreadIdNameManager::GetInstance()->GetName(
-      associated_thread_->thread_id);
+  return ThreadIdNameManager::GetInstance()->GetName(*thread_id);
 }
 
 bool SequenceManagerImpl::IsBoundToCurrentThread() const {
-  return associated_thread_->thread_id == PlatformThread::CurrentId();
+  return associated_thread_->IsBoundToCurrentThread();
 }
 
 MessagePump* SequenceManagerImpl::GetMessagePump() const {
diff --git a/base/task/sequence_manager/task_queue.cc b/base/task/sequence_manager/task_queue.cc
index e2bd7dd..30c36dd 100644
--- a/base/task/sequence_manager/task_queue.cc
+++ b/base/task/sequence_manager/task_queue.cc
@@ -242,7 +242,7 @@
 }
 
 bool TaskQueue::IsOnMainThread() const {
-  return associated_thread_->thread_id == PlatformThread::CurrentId();
+  return associated_thread_->IsBoundToCurrentThread();
 }
 
 Optional<MoveableAutoLock> TaskQueue::AcquireImplReadLockIfNeeded() const {
diff --git a/base/task/sequence_manager/task_queue.h b/base/task/sequence_manager/task_queue.h
index 4f12923..137eaaab 100644
--- a/base/task/sequence_manager/task_queue.h
+++ b/base/task/sequence_manager/task_queue.h
@@ -28,7 +28,7 @@
 namespace sequence_manager {
 
 namespace internal {
-struct AssociatedThreadId;
+class AssociatedThreadId;
 class SequenceManagerImpl;
 class TaskQueueImpl;
 }  // namespace internal
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc
index 8423bef..2ce6b08 100644
--- a/base/task/sequence_manager/task_queue_impl.cc
+++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -153,7 +153,7 @@
 }
 
 bool TaskQueueImpl::RunsTasksInCurrentSequence() const {
-  return PlatformThread::CurrentId() == associated_thread_->thread_id;
+  return associated_thread_->IsBoundToCurrentThread();
 }
 
 void TaskQueueImpl::PostTask(PostedTask task, CurrentThread current_thread) {
@@ -469,7 +469,7 @@
 
   // It's only safe to access the work queues from the main thread.
   // TODO(alexclarke): We should find another way of tracing this
-  if (PlatformThread::CurrentId() != associated_thread_->thread_id)
+  if (!associated_thread_->IsBoundToCurrentThread())
     return;
 
   AutoLock lock(immediate_incoming_queue_lock_);
@@ -621,12 +621,8 @@
 }
 
 TimeDomain* TaskQueueImpl::GetTimeDomain() const {
-  if (associated_thread_->thread_id == kInvalidThreadId ||
-      PlatformThread::CurrentId() == associated_thread_->thread_id)
-    return main_thread_only().time_domain;
-
-  AutoLock lock(any_thread_lock_);
-  return any_thread().time_domain;
+  DCHECK(associated_thread_->IsBoundToCurrentThread());
+  return main_thread_only().time_domain;
 }
 
 void TaskQueueImpl::SetBlameContext(trace_event::BlameContext* blame_context) {
diff --git a/base/task/sequence_manager/task_queue_impl.h b/base/task/sequence_manager/task_queue_impl.h
index 881cd66..5cffe9e 100644
--- a/base/task/sequence_manager/task_queue_impl.h
+++ b/base/task/sequence_manager/task_queue_impl.h
@@ -345,7 +345,10 @@
 
   void MoveReadyImmediateTasksToImmediateWorkQueueLocked();
 
-  using TaskDeque = LazilyDeallocatedDeque<Task>;
+  // LazilyDeallocatedDeque use TimeTicks to figure out when to resize.  We
+  // should use real time here always.
+  using TaskDeque =
+      LazilyDeallocatedDeque<Task, subtle::TimeTicksNowIgnoringOverride>;
 
   // Extracts all the tasks from the immediate incoming queue and swaps it with
   // |queue| which must be empty.
diff --git a/base/task/sequence_manager/task_queue_proxy.cc b/base/task/sequence_manager/task_queue_proxy.cc
index 89d6884..b8cdca51 100644
--- a/base/task/sequence_manager/task_queue_proxy.cc
+++ b/base/task/sequence_manager/task_queue_proxy.cc
@@ -42,7 +42,7 @@
 }
 
 bool TaskQueueProxy::RunsTasksInCurrentSequence() const {
-  return associated_thread_->thread_id == PlatformThread::CurrentId();
+  return associated_thread_->IsBoundToCurrentThread();
 }
 
 void TaskQueueProxy::DetachFromTaskQueueImpl() {
diff --git a/base/task/sequence_manager/task_queue_proxy.h b/base/task/sequence_manager/task_queue_proxy.h
index c84c2c4..88084217 100644
--- a/base/task/sequence_manager/task_queue_proxy.h
+++ b/base/task/sequence_manager/task_queue_proxy.h
@@ -16,7 +16,7 @@
 namespace sequence_manager {
 namespace internal {
 
-struct AssociatedThreadId;
+class AssociatedThreadId;
 class TaskQueueImpl;
 
 // Task runners are ref-counted and unaccountable, so we need a safe way
diff --git a/base/task/sequence_manager/task_queue_selector.h b/base/task/sequence_manager/task_queue_selector.h
index d3bd22d..94c3abcb 100644
--- a/base/task/sequence_manager/task_queue_selector.h
+++ b/base/task/sequence_manager/task_queue_selector.h
@@ -17,7 +17,7 @@
 namespace sequence_manager {
 namespace internal {
 
-struct AssociatedThreadId;
+class AssociatedThreadId;
 
 // TaskQueueSelector is used by the SchedulerHelper to enable prioritization
 // of particular task queues.
diff --git a/base/task/sequence_manager/thread_controller.h b/base/task/sequence_manager/thread_controller.h
index dcb4bd0..81fd9f9 100644
--- a/base/task/sequence_manager/thread_controller.h
+++ b/base/task/sequence_manager/thread_controller.h
@@ -21,7 +21,7 @@
 namespace sequence_manager {
 namespace internal {
 
-struct AssociatedThreadId;
+class AssociatedThreadId;
 class SequencedTaskSource;
 
 // Implementation of this interface is used by SequenceManager to schedule
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
index 3b4bc58..efe91f19 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
@@ -156,16 +156,15 @@
 }
 
 bool ThreadControllerWithMessagePumpImpl::RunsTasksInCurrentSequence() {
-  return associated_thread_->thread_id == PlatformThread::CurrentId();
+  return associated_thread_->IsBoundToCurrentThread();
 }
 
 void ThreadControllerWithMessagePumpImpl::SetDefaultTaskRunner(
     scoped_refptr<SingleThreadTaskRunner> task_runner) {
-  DCHECK(associated_thread_->thread_id == kInvalidThreadId ||
-         associated_thread_->thread_id == PlatformThread::CurrentId());
   AutoLock lock(task_runner_lock_);
   task_runner_ = task_runner;
-  if (associated_thread_->thread_id != kInvalidThreadId) {
+  if (associated_thread_->IsBound()) {
+    DCHECK(associated_thread_->IsBoundToCurrentThread());
     // Thread task runner handle will be created in BindToCurrentThread().
     InitializeThreadTaskRunnerHandle();
   }
diff --git a/base/task/sequence_manager/time_domain.h b/base/task/sequence_manager/time_domain.h
index d6f3271..a09d22c9 100644
--- a/base/task/sequence_manager/time_domain.h
+++ b/base/task/sequence_manager/time_domain.h
@@ -21,7 +21,7 @@
 class SequenceManager;
 
 namespace internal {
-struct AssociatedThreadId;
+class AssociatedThreadId;
 class SequenceManagerImpl;
 class TaskQueueImpl;
 }  // namespace internal
diff --git a/build/android/gn/zip.py b/build/android/gn/zip.py
deleted file mode 100755
index 3e9668d..0000000
--- a/build/android/gn/zip.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Archives a set of files.
-"""
-
-import ast
-import optparse
-import os
-import sys
-
-sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, 'gyp'))
-from util import build_utils
-
-def main():
-  parser = optparse.OptionParser()
-  build_utils.AddDepfileOption(parser)
-
-  parser.add_option('--inputs', help='List of files to archive.')
-  parser.add_option('--output', help='Path to output archive.')
-  parser.add_option('--base-dir',
-                    help='If provided, the paths in the archive will be '
-                    'relative to this directory', default='.')
-
-  options, _ = parser.parse_args()
-
-  inputs = ast.literal_eval(options.inputs)
-  output = options.output
-  base_dir = options.base_dir
-
-  with build_utils.AtomicOutput(output) as f:
-    build_utils.DoZip(inputs, f, base_dir)
-
-  if options.depfile:
-    build_utils.WriteDepfile(options.depfile, output)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/build/android/gyp/create_dist_jar.py b/build/android/gyp/create_dist_jar.py
deleted file mode 100755
index 7f78935a..0000000
--- a/build/android/gyp/create_dist_jar.py
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Merges a list of jars into a single jar."""
-
-import argparse
-import sys
-
-from util import build_utils
-
-
-def main(args):
-  args = build_utils.ExpandFileArgs(args)
-  parser = argparse.ArgumentParser()
-  build_utils.AddDepfileOption(parser)
-  parser.add_argument('--output', required=True, help='Path to output jar.')
-  parser.add_argument('--jars', required=True, help='GN list of jar inputs.')
-  options = parser.parse_args(args)
-
-  input_jars = build_utils.ParseGnList(options.jars)
-  build_utils.MergeZips(options.output, input_jars)
-
-  if options.depfile:
-    build_utils.WriteDepfile(options.depfile, options.output, input_jars,
-                             add_pydeps=False)
-
-
-if __name__ == '__main__':
-  main(sys.argv[1:])
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
index fabe15f6..b5fd17a 100644
--- a/build/android/gyp/util/build_utils.py
+++ b/build/android/gyp/util/build_utils.py
@@ -360,6 +360,8 @@
         By default, items will be |zipfile.ZIP_STORED|.
     zip_prefix_path: Path prepended to file path in zip file.
   """
+  if base_dir is None:
+    base_dir = '.'
   input_tuples = []
   for tup in inputs:
     if isinstance(tup, basestring):
diff --git a/build/android/gyp/zip.py b/build/android/gyp/zip.py
new file mode 100755
index 0000000..b950396
--- /dev/null
+++ b/build/android/gyp/zip.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+#
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Archives a set of files."""
+
+import argparse
+import os
+import sys
+import zipfile
+
+from util import build_utils
+
+
+def main(args):
+  args = build_utils.ExpandFileArgs(args)
+  parser = argparse.ArgumentParser(args)
+  parser.add_argument('--input-files', help='GN-list of files to zip.')
+  parser.add_argument(
+      '--input-files-base-dir',
+      help='Paths in the archive will be relative to this directory')
+  parser.add_argument('--input-zips', help='GN-list of zips to merge.')
+  parser.add_argument(
+      '--input-zips-excluded-globs',
+      help='GN-list of globs for paths to exclude.')
+  parser.add_argument('--output', required=True, help='Path to output archive.')
+  compress_group = parser.add_mutually_exclusive_group()
+  compress_group.add_argument(
+      '--compress', action='store_true', help='Compress entries')
+  compress_group.add_argument(
+      '--no-compress',
+      action='store_false',
+      dest='compress',
+      help='Do not compress entries')
+  build_utils.AddDepfileOption(parser)
+  options = parser.parse_args(args)
+
+  with build_utils.AtomicOutput(options.output) as f:
+    with zipfile.ZipFile(f.name, 'w') as out_zip:
+      depfile_deps = None
+      if options.input_files:
+        files = build_utils.ParseGnList(options.input_files)
+        build_utils.DoZip(
+            files,
+            out_zip,
+            base_dir=options.input_files_base_dir,
+            compress_fn=lambda _: options.compress)
+
+      if options.input_zips:
+        files = build_utils.ParseGnList(options.input_zips)
+        depfile_deps = files
+        path_transform = None
+        if options.input_zips_excluded_globs:
+          globs = build_utils.ParseGnList(options.input_zips_excluded_globs)
+          path_transform = (
+              lambda p: None if build_utils.MatchesGlob(p, globs) else p)
+        build_utils.MergeZips(
+            out_zip,
+            files,
+            path_transform=path_transform,
+            compress=options.compress)
+
+  # Depfile used only by dist_jar().
+  if options.depfile:
+    build_utils.WriteDepfile(
+        options.depfile, options.output, inputs=depfile_deps, add_pydeps=False)
+
+
+if __name__ == '__main__':
+  main(sys.argv[1:])
diff --git a/build/android/gyp/create_dist_jar.pydeps b/build/android/gyp/zip.pydeps
similarity index 62%
rename from build/android/gyp/create_dist_jar.pydeps
rename to build/android/gyp/zip.pydeps
index f4224d7..ce99648 100644
--- a/build/android/gyp/create_dist_jar.pydeps
+++ b/build/android/gyp/zip.pydeps
@@ -1,7 +1,7 @@
 # Generated by running:
-#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_dist_jar.pydeps build/android/gyp/create_dist_jar.py
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/zip.pydeps build/android/gyp/zip.py
 ../../gn_helpers.py
-create_dist_jar.py
 util/__init__.py
 util/build_utils.py
 util/md5_check.py
+zip.py
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index c1c7ae1..008d09e 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1447,6 +1447,8 @@
   #     implementation .jars.
   #   use_unprocessed_jars: Use unprocessed / undesugared .jars.
   #   direct_deps_only: Do not recurse on deps.
+  #   jar_excluded_patterns (optional)
+  #     List of globs for paths to exclude.
   #
   # Example
   #   dist_jar("lib_fatjar") {
@@ -1509,7 +1511,7 @@
     _rebased_build_config = rebase_path(_build_config, root_build_dir)
     action_with_pydeps(_jar_target_name) {
       forward_variables_from(invoker, [ "data" ])
-      script = "//build/android/gyp/create_dist_jar.py"
+      script = "//build/android/gyp/zip.py"
       depfile = "$target_gen_dir/$target_name.d"
       deps = _deps
 
@@ -1526,15 +1528,16 @@
         rebase_path(depfile, root_build_dir),
         "--output",
         rebase_path(invoker.output, root_build_dir),
+        "--no-compress",
       ]
 
       if (_direct_deps_only) {
         if (_use_interface_jars) {
-          args += [
-            "--jars=@FileArg($_rebased_build_config:javac:interface_classpath)",
-          ]
+          args += [ "--input-zips=@FileArg($_rebased_build_config:javac:interface_classpath)" ]
         } else if (_use_unprocessed_jars) {
-          args += [ "--jars=@FileArg($_rebased_build_config:javac:classpath)" ]
+          args += [
+            "--input-zips=@FileArg($_rebased_build_config:javac:classpath)",
+          ]
         } else {
           assert(
               false,
@@ -1542,13 +1545,17 @@
         }
       } else {
         if (_use_interface_jars) {
-          args += [ "--jars=@FileArg($_rebased_build_config:dist_jar:all_interface_jars)" ]
+          args += [ "--input-zips=@FileArg($_rebased_build_config:dist_jar:all_interface_jars)" ]
         } else if (_use_unprocessed_jars) {
-          args += [ "--jars=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)" ]
+          args += [ "--input-zips=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)" ]
         } else {
-          args += [ "--jars=@FileArg($_rebased_build_config:deps_info:java_runtime_classpath)" ]
+          args += [ "--input-zips=@FileArg($_rebased_build_config:deps_info:java_runtime_classpath)" ]
         }
       }
+      if (defined(invoker.jar_excluded_patterns)) {
+        args +=
+            [ "--input-zips-excluded-globs=${invoker.jar_excluded_patterns}" ]
+      }
     }
   }
 
diff --git a/build/config/zip.gni b/build/config/zip.gni
index 8265e1d..58cb692f 100644
--- a/build/config/zip.gni
+++ b/build/config/zip.gni
@@ -2,54 +2,49 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("python.gni")
+
 # Creates a zip archive of the inputs.
 #
-# inputs (required)
-#     List of input files relative to the current directory.
-#
 # output (required)
-#     File name to write.
-#
+#     Path to output zip.
+# inputs (required)
+#     List of input files to zip.
 # base_dir (optional)
 #     If provided, the archive paths will be relative to this directory.
+#     Applies only to |inputs|.
 #
-# deps, public_deps, data_deps, testonly, visibility (optional)
+# deps, public_deps, data, data_deps, testonly, visibility
 #     Normal meaning.
 template("zip") {
-  action(target_name) {
-    script = "//build/android/gn/zip.py"
-    depfile = "$target_gen_dir/$target_name.d"
+  action_with_pydeps(target_name) {
+    forward_variables_from(invoker,
+                           [
+                             "data",
+                             "data_deps",
+                             "deps",
+                             "public_deps",
+                             "testonly",
+                             "visibility",
+                           ])
+    script = "//build/android/gyp/zip.py"
     inputs = invoker.inputs
     outputs = [
       invoker.output,
     ]
 
-    assert(defined(invoker.inputs))
-    rebase_inputs = rebase_path(invoker.inputs, root_build_dir)
-
-    assert(defined(invoker.output))
-    rebase_output = rebase_path(invoker.output, root_build_dir)
-
     args = [
-      "--depfile",
-      rebase_path(depfile, root_build_dir),
-      "--inputs=$rebase_inputs",
-      "--output=$rebase_output",
+      "--output",
+      rebase_path(invoker.output, root_build_dir),
     ]
+
+    _rebased_inputs = rebase_path(invoker.inputs, root_build_dir)
+    args += [ "--input-files=$_rebased_inputs" ]
     if (defined(invoker.base_dir)) {
       args += [
-        "--base-dir",
+        "--input-files-base-dir",
         rebase_path(invoker.base_dir, root_build_dir),
       ]
     }
-
-    forward_variables_from(invoker,
-                           [
-                             "testonly",
-                             "deps",
-                             "public_deps",
-                             "data_deps",
-                             "visibility",
-                           ])
   }
 }
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc
index 37323ba..8d8ce68d 100644
--- a/cc/test/pixel_test.cc
+++ b/cc/test/pixel_test.cc
@@ -269,7 +269,7 @@
       std::move(gpu_host_proxy), gpu::GpuProcessActivityFlags(),
       gl::init::CreateOffscreenGLSurface(gfx::Size()),
       nullptr /* sync_point_manager */, nullptr /* shutdown_event */);
-  task_executor_ = std::make_unique<gpu::GpuInProcessThreadService>(
+  task_executor_ = base::MakeRefCounted<gpu::GpuInProcessThreadService>(
       gpu_thread_->task_runner(), gpu_service_->scheduler(),
       gpu_service_->sync_point_manager(), gpu_service_->mailbox_manager(),
       gpu_service_->share_group(),
@@ -327,7 +327,7 @@
       gpu_service_->gpu_channel_manager()->delegate();
   child_context_provider_ =
       base::MakeRefCounted<viz::VizProcessContextProvider>(
-          task_executor_.get(), gpu::kNullSurfaceHandle,
+          task_executor_, gpu::kNullSurfaceHandle,
           gpu_memory_buffer_manager_.get(), image_factory,
           gpu_channel_manager_delegate, gpu::SharedMemoryLimits(),
           false /* requires_alpha_channel */);
diff --git a/cc/test/pixel_test.h b/cc/test/pixel_test.h
index 5f01960d..d7ca70b 100644
--- a/cc/test/pixel_test.h
+++ b/cc/test/pixel_test.h
@@ -86,7 +86,7 @@
   std::unique_ptr<base::Thread> io_thread_;
   std::unique_ptr<viz::GpuServiceImpl> gpu_service_;
   std::unique_ptr<gpu::GpuMemoryBufferManager> gpu_memory_buffer_manager_;
-  std::unique_ptr<gpu::CommandBufferTaskExecutor> task_executor_;
+  scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor_;
 
   viz::RendererSettings renderer_settings_;
   gfx::Size device_viewport_size_;
diff --git a/chrome/MAJOR_BRANCH_DATE b/chrome/MAJOR_BRANCH_DATE
index 37e953ef..6abebde 100644
--- a/chrome/MAJOR_BRANCH_DATE
+++ b/chrome/MAJOR_BRANCH_DATE
@@ -1 +1 @@
-MAJOR_BRANCH_DATE=2018-10-12
+MAJOR_BRANCH_DATE=2018-11-30
diff --git a/chrome/VERSION b/chrome/VERSION
index 2c71de2..6561aef 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
-MAJOR=72
+MAJOR=73
 MINOR=0
-BUILD=3626
+BUILD=3627
 PATCH=0
diff --git a/chrome/android/java/res_autofill_assistant/layout/init_screen.xml b/chrome/android/java/res_autofill_assistant/layout/init_screen.xml
index cd93f12..857a01aa 100644
--- a/chrome/android/java/res_autofill_assistant/layout/init_screen.xml
+++ b/chrome/android/java/res_autofill_assistant/layout/init_screen.xml
@@ -22,116 +22,142 @@
         android:layout_marginTop="@dimen/control_container_height"
         android:background="@color/black_alpha_65"/>
 
-    <LinearLayout
-        android:id="@+id/init"
+    <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="fill_parent"
-        android:gravity="center_horizontal"
-        android:orientation="vertical"
-        android:paddingStart="50dp"
-        android:paddingEnd="50dp"
-        android:paddingBottom="15dp"
-        android:layout_marginTop="100dp"
-        android:paddingTop="100dp"
-        android:background="@drawable/autofill_assistant_bottombar_bg">
+        android:layout_height="match_parent">
 
-        <ImageView
-            tools:ignore="contentDescription"
-            android:layout_width="250dp"
-            android:layout_height="141dp"
-            android:scaleType="centerCrop"
-            android:src="@drawable/onboarding_background"
-            android:paddingStart="25dp"
-            android:paddingEnd="25dp"
-            android:paddingTop="10dp"
-            android:paddingBottom="15dp"/>
-
-        <TextView
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:textAppearance="@style/BlackTitle2"
-            android:text="@string/autofill_assistant_onboarding_title" />
-
-        <TextView
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:paddingTop="40dp"
-            android:textAppearance="@style/BlackBodyDefault"
-            android:gravity="center"
-            android:text="@string/autofill_assistant_init_message" />
-
-        <Space
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"/>
-
-        <CheckBox
-            android:id="@+id/checkbox_dont_show_init_again"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="@style/BlackBodyDefault"
-            android:paddingStart="25dp"
-            android:text="@string/dont_display_again"/>
-
+        <!-- Main vertical layout -->
         <LinearLayout
-            android:layout_width="wrap_content"
+            android:id="@+id/init"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:paddingTop="20dp"
-            android:paddingBottom="8dp"
-            android:gravity="center_vertical"
-            android:orientation="horizontal">
+            android:layout_alignParentBottom="true"
+            android:gravity="bottom|center"
+            android:orientation="vertical"
+            tools:ignore="UselessParent"
+            android:background="@drawable/autofill_assistant_bottombar_bg">
 
-            <org.chromium.ui.widget.ButtonCompat
-                android:id="@+id/button_init_not_ok"
+            <!-- Header -->
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="start"
+                android:orientation="horizontal">
+
+                <android.support.v7.widget.AppCompatImageView
+                    android:layout_width="24dp"
+                    android:layout_height="24dp"
+                    android:layout_marginStart="24dp"
+                    android:layout_marginTop="24dp"
+                    android:gravity="start"
+                    app:srcCompat="@drawable/ic_autofill_assistant_24dp" />
+            </LinearLayout>
+
+            <!-- Image background -->
+            <ImageView
+                tools:ignore="contentDescription"
+                android:layout_width="250dp"
+                android:layout_height="141dp"
+                android:scaleType="centerCrop"
+                android:src="@drawable/onboarding_background"
+                android:paddingStart="25dp"
+                android:paddingEnd="25dp"
+                android:paddingTop="10dp"
+                android:paddingBottom="15dp"/>
+
+            <!-- Title (e.g., 'Fast Checkout')-->
+            <TextView
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textAppearance="@style/BlackTitle2"
+                android:text="@string/autofill_assistant_onboarding_title" />
+
+            <!-- Subtitle (e.g., 'Google Assistant saves you time...')-->
+            <Space android:layout_width="0dp" android:layout_height="10dp"/>
+            <TextView
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:textAppearance="@style/BlackBodyDefault"
+                android:paddingStart="35dp"
+                android:paddingEnd="35dp"
+                android:text="@string/autofill_assistant_init_message" />
+
+            <!-- Don't show again checkbox surrounded by padding space -->
+            <Space android:layout_width="0dp" android:layout_height="25dp"/>
+            <CheckBox
+                android:id="@+id/checkbox_dont_show_init_again"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:minHeight="36dp"
-                android:minWidth="120dp"
-                android:singleLine="true"
-                android:gravity="center"
-                android:paddingStart="24dp"
-                android:paddingEnd="24dp"
+                android:textAppearance="@style/BlackBodyDefault"
+                android:paddingStart="10dp"
+                android:text="@string/dont_display_again"/>
+            <Space android:layout_width="0dp" android:layout_height="25dp"/>
+
+            <!-- Terms and Conditions message and link -->
+            <FrameLayout
+                android:layout_height="wrap_content"
+                android:layout_width="match_parent"
+                android:paddingStart="12dp"
+                android:paddingEnd="12dp"
                 android:paddingTop="9dp"
                 android:paddingBottom="9dp"
-                android:text="@string/no_thanks"
-                style="@style/TextButton" />
-
-            <org.chromium.ui.widget.ButtonCompat
-                android:id="@+id/button_init_ok"
-                android:gravity="center"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
                 android:layout_marginStart="16dp"
-                android:minHeight="36dp"
-                android:minWidth="120dp"
-                android:singleLine="true"
-                android:paddingStart="24dp"
-                android:paddingEnd="24dp"
-                android:paddingTop="9dp"
-                android:paddingBottom="9dp"
-                android:text="@string/init_ok"
-                style="FilledButton" />
+                android:layout_marginEnd="16dp"
+                android:background="@drawable/autofill_assistant_checkbox_bg" >
+
+                <TextView
+                    android:id="@+id/google_terms_message"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_margin="0dp"
+                    android:layout_gravity="center"
+                    android:textAppearance="@style/BlackBodyDefault"
+                    android:text="@string/autofill_assistant_google_terms_description" />
+            </FrameLayout>
+
+
+            <!-- Horizontal layout for the buttons -->
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="bottom|center"
+                android:orientation="horizontal"
+                android:paddingTop="20dp">
+
+                <!-- 'No' button -->
+                <org.chromium.ui.widget.ButtonCompat
+                    android:id="@+id/button_init_not_ok"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:minHeight="36dp"
+                    android:minWidth="120dp"
+                    android:singleLine="true"
+                    android:gravity="center"
+                    android:paddingStart="24dp"
+                    android:paddingEnd="24dp"
+                    android:paddingTop="9dp"
+                    android:paddingBottom="9dp"
+                    android:text="@string/no_thanks"
+                    style="@style/TextButton" />
+
+                <!-- 'Yes' button -->
+                <org.chromium.ui.widget.ButtonCompat
+                    android:id="@+id/button_init_ok"
+                    android:gravity="center"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="16dp"
+                    android:minHeight="36dp"
+                    android:minWidth="120dp"
+                    android:singleLine="true"
+                    android:paddingStart="24dp"
+                    android:paddingEnd="24dp"
+                    android:paddingTop="9dp"
+                    android:paddingBottom="9dp"
+                    android:text="@string/init_ok"
+                    style="FilledButton" />
+            </LinearLayout>
+            <Space android:layout_width="0dp" android:layout_height="5dp"/>
         </LinearLayout>
-    </LinearLayout>
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="56dp"
-        android:layout_marginStart="24dp"
-        android:layout_marginEnd="24dp"
-        android:orientation="horizontal"
-        android:gravity="center_vertical"
-        android:layout_marginTop="116dp">
-
-        <android.support.v7.widget.AppCompatImageView
-            android:layout_width="24dp"
-            android:layout_height="24dp"
-            app:srcCompat="@drawable/ic_autofill_assistant_24dp" />
-
-        <Space
-            android:layout_height="match_parent"
-            android:layout_width="0dp"
-            android:layout_weight="1"/>
-    </LinearLayout>
-
+    </RelativeLayout>
 </FrameLayout>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiDelegate.java
index 04f3fd9a..5d18285 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiDelegate.java
@@ -256,7 +256,7 @@
                                  .findViewById(R.id.autofill_assistant);
         // TODO(crbug.com/806868): Set hint text on overlay.
         mTouchEventFilter = (TouchEventFilter) mFullContainer.findViewById(R.id.touch_event_filter);
-        mBottomBar = mFullContainer.findViewById(R.id.bottombar);
+        mBottomBar = mFullContainer.findViewById(R.id.autofill_assistant_bottombar);
         mBottomBarBehavior = BottomSheetBehavior.from(mBottomBar);
         mBottomBar.findViewById(R.id.close_button)
                 .setOnClickListener(unusedView -> mClient.onDismiss());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/FirstRunScreen.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/FirstRunScreen.java
index 777f093..6b37d36 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/FirstRunScreen.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/FirstRunScreen.java
@@ -4,14 +4,18 @@
 
 package org.chromium.chrome.browser.autofill_assistant;
 
+import android.text.SpannableString;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.CheckBox;
+import android.widget.TextView;
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.ui.text.NoUnderlineClickableSpan;
+import org.chromium.ui.text.SpanApplier;
 
 /** Class for managing the first run screen. */
 class FirstRunScreen {
@@ -24,6 +28,26 @@
         View initView = LayoutInflater.from(activity)
                                 .inflate(R.layout.init_screen, coordinatorView)
                                 .findViewById(R.id.init_screen);
+
+        TextView termsTextView = initView.findViewById(R.id.google_terms_message);
+        String termsString = activity.getApplicationContext().getString(
+                R.string.autofill_assistant_google_terms_description);
+
+        NoUnderlineClickableSpan termsDescriptionSpan = new NoUnderlineClickableSpan(
+                (widget)
+                        -> {
+                                // TODO(crbug.com/806868) enable when the URL for our terms &
+                                // conditions is up.
+                                /*
+                                CustomTabActivity.showInfoPage(context,
+                                        activity.getApplicationContext().getString(
+                                                R.string.autofill_assistant_google_terms_url));
+                                */
+                        });
+        SpannableString spannableMessage = SpanApplier.applySpans(
+                termsString, new SpanApplier.SpanInfo("<link>", "</link>", termsDescriptionSpan));
+        termsTextView.setText(spannableMessage);
+
         // Set focusable for accessibility.
         initView.findViewById(R.id.init).setFocusable(true);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
index a4417a6d..e470dc3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -934,7 +934,15 @@
             public void onUrlUpdated(Tab tab) {
                 // Update the color on every new URL.
                 updateColor(tab);
-                maybeUpdateCctHeaderVisibility(tab.getUrl());
+            }
+
+            @Override
+            public void onDidFinishNavigation(Tab tab, String url, boolean isInMainFrame,
+                    boolean isErrorPage, boolean hasCommitted, boolean isSameDocument,
+                    boolean isFragmentNavigation, @Nullable Integer pageTransition, int errorCode,
+                    int httpStatusCode) {
+                if (!isInMainFrame || !hasCommitted) return;
+                maybeUpdateCctHeaderVisibility(url);
             }
 
             /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java
index 4822c8f..cbb0056c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountSigninView.java
@@ -342,12 +342,13 @@
 
         // The clickable "Settings" link.
         NoUnderlineClickableSpan settingsSpan = new NoUnderlineClickableSpan((widget) -> {
+            if (mSelectedAccountName == null) return;
             mListener.onAccountSelected(mSelectedAccountName, mIsDefaultAccountSelected, true);
             RecordUserAction.record("Signin_Signin_WithAdvancedSyncSettings");
 
             // Record the fact that the user consented to the consent text by clicking
             // on |mSigninSettingsControl|.
-            recordConsent((TextView) widget);
+            recordConsent((TextView) widget, mSelectedAccountName);
         });
         mConsentTextTracker.setText(mSigninSettingsControl,
                 getSettingsControlDescription(mChildAccountStatus), input -> {
@@ -749,12 +750,14 @@
     private void setUpConfirmButton() {
         mConsentTextTracker.setText(mPositiveButton, R.string.signin_accept);
         mPositiveButton.setOnClickListener(view -> {
+            if (mSelectedAccountName == null) return;
+
             mListener.onAccountSelected(mSelectedAccountName, mIsDefaultAccountSelected, false);
             RecordUserAction.record("Signin_Signin_WithDefaultSyncSettings");
 
             // Record the fact that the user consented to the consent text by clicking
             // on |mPositiveButton|.
-            recordConsent((TextView) view);
+            recordConsent((TextView) view, mSelectedAccountName);
         });
         setUpMoreButtonVisible(true);
     }
@@ -802,13 +805,14 @@
      * Records the Sync consent.
      * @param confirmationView The view that the user clicked when consenting.
      */
-    private void recordConsent(TextView confirmationView) {
+    private void recordConsent(TextView confirmationView, String selectedAccountName) {
         // TODO(crbug.com/831257): Provide the account id synchronously from AccountManagerFacade.
+        assert selectedAccountName != null;
         final AccountIdProvider accountIdProvider = AccountIdProvider.getInstance();
         new AsyncTask<String>() {
             @Override
             public String doInBackground() {
-                return accountIdProvider.getAccountId(mSelectedAccountName);
+                return accountIdProvider.getAccountId(selectedAccountName);
             }
 
             @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
index c1d9c153..f2497c17 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
@@ -5,12 +5,15 @@
 package org.chromium.chrome.browser.webapps;
 
 import android.app.Activity;
+import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Handler;
 import android.os.StrictMode;
 import android.os.SystemClock;
+import android.support.annotation.NonNull;
 import android.text.TextUtils;
 import android.util.Base64;
 
@@ -42,88 +45,87 @@
     public static final String ACTION_START_WEBAPP =
             "com.google.android.apps.chrome.webapps.WebappManager.ACTION_START_WEBAPP";
 
-    private static final String TAG = "webapps";
+    /**
+     * Delay in ms for relaunching WebAPK as a result of getting intent with extra
+     * {@link WebApkConstants.EXTRA_RELAUNCH}. The delay was chosen arbirtarily and seems to
+     * work.
+     */
+    private static final int WEBAPK_LAUNCH_DELAY_MS = 20;
 
-    /** Timestamp of Activity creation for tracking how long it takes to complete. */
-    private long mCreateTime;
+    private static final String TAG = "webapps";
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mCreateTime = SystemClock.elapsedRealtime();
+        long createTimestamp = SystemClock.elapsedRealtime();
 
-        Intent launchIntent = createLaunchIntent();
-        if (launchIntent == null) {
-            ApiCompatibilityUtils.finishAndRemoveTask(this);
+        Context appContext = getApplicationContext();
+        ChromeWebApkHost.init();
+        Intent intent = getIntent();
+        WebappInfo webappInfo = tryCreateWebappInfo(appContext, intent);
+
+        if (shouldRelaunchWebApk(intent, webappInfo)) {
+            relaunchWebApk(this, intent, webappInfo);
             return;
         }
 
-        IntentUtils.safeStartActivity(this, launchIntent);
-
-        if (IntentUtils.isIntentForNewTaskOrNewDocument(launchIntent)) {
-            ApiCompatibilityUtils.finishAndRemoveTask(this);
-        } else {
-            finish();
+        if (shouldLaunchWebapp(appContext, intent, webappInfo)) {
+            launchWebapp(this, intent, webappInfo, createTimestamp);
+            return;
         }
+
+        launchInTab(this, intent, webappInfo);
     }
 
-    public Intent createLaunchIntent() {
-        Intent intent = getIntent();
-
-        ChromeWebApkHost.init();
-        WebappInfo webappInfo = tryCreateWebappInfo(intent);
-
+    private static boolean shouldLaunchWebapp(
+            Context appContext, Intent intent, WebappInfo webappInfo) {
         // {@link WebApkInfo#create()} and {@link WebappInfo#create()} return null if the intent
         // does not specify required values such as the uri.
-        if (webappInfo == null) {
-            String url = IntentUtils.safeGetStringExtra(intent, ShortcutHelper.EXTRA_URL);
-            return createLaunchInTabIntent(url, ShortcutSource.UNKNOWN);
-        }
+        if (webappInfo == null) return false;
 
         String webappUrl = webappInfo.uri().toString();
-        int webappSource = webappInfo.source();
         String webappMac = IntentUtils.safeGetStringExtra(intent, ShortcutHelper.EXTRA_MAC);
 
-        // Permit the launch to a standalone web app frame if any of the following are true:
-        // - the request was for a WebAPK that is valid;
-        // - the MAC is present and valid for the homescreen shortcut to be opened;
-        // - the intent was sent by Chrome.
-        if (webappInfo.isForWebApk() || isValidMacForUrl(webappUrl, webappMac)
-                || wasIntentFromChrome(intent)) {
-            int source = webappSource;
-            // Retrieves the source of the WebAPK from WebappDataStorage if it is unknown. The
-            // {@link webappSource} will not be unknown in the case of an external intent or a
-            // notification that launches a WebAPK. Otherwise, it's not trustworthy and we must read
-            // the SharedPreference to get the installation source.
-            if (webappInfo.isForWebApk() && (webappSource == ShortcutSource.UNKNOWN)) {
-                source = getWebApkSource(webappInfo);
-            }
-            LaunchMetrics.recordHomeScreenLaunchIntoStandaloneActivity(
-                    webappUrl, source, webappInfo.displayMode());
+        return (webappInfo.isForWebApk() || isValidMacForUrl(appContext, webappUrl, webappMac)
+                || wasIntentFromChrome(intent));
+    }
 
-            // Add all information needed to launch WebappActivity without {@link
-            // WebappActivity#sWebappInfoMap} to launch intent. When the Android OS has killed a
-            // WebappActivity and the user selects the WebappActivity from "Android Recents" the
-            // WebappActivity is launched without going through WebappLauncherActivity first.
-            WebappActivity.addWebappInfo(webappInfo.id(), webappInfo);
-            Intent launchIntent = createWebappLaunchIntent(webappInfo);
-            IntentHandler.addTimestampToIntent(launchIntent, mCreateTime);
-            // Pass through WebAPK shell launch timestamp to the new intent.
-            long shellLaunchTimestamp =
-                    IntentHandler.getWebApkShellLaunchTimestampFromIntent(intent);
-            IntentHandler.addShellLaunchTimestampToIntent(launchIntent, shellLaunchTimestamp);
-            return launchIntent;
+    private static void launchWebapp(Activity launchingActivity, Intent intent,
+            @NonNull WebappInfo webappInfo, long createTimestamp) {
+        String webappUrl = webappInfo.uri().toString();
+        int webappSource = webappInfo.source();
+
+        // Retrieves the source of the WebAPK from WebappDataStorage if it is unknown. The
+        // {@link webappSource} is only known in the cases of an external intent or a
+        // notification that launches a WebAPK. Otherwise, it's not trustworthy and we must read
+        // the SharedPreference to get the installation source.
+        if (webappInfo.isForWebApk() && webappSource == ShortcutSource.UNKNOWN) {
+            webappSource = getWebApkSource(webappInfo);
         }
+        LaunchMetrics.recordHomeScreenLaunchIntoStandaloneActivity(
+                webappUrl, webappSource, webappInfo.displayMode());
 
-        Log.e(TAG, "Shortcut (%s) opened in Chrome.", webappUrl);
+        // Add all information needed to launch WebappActivity without {@link
+        // WebappActivity#sWebappInfoMap} to launch intent. When the Android OS has killed a
+        // WebappActivity and the user selects the WebappActivity from "Android Recents" the
+        // WebappActivity is launched without going through WebappLauncherActivity first.
+        WebappActivity.addWebappInfo(webappInfo.id(), webappInfo);
+        Intent launchIntent = createWebappLaunchIntent(webappInfo);
+        IntentHandler.addTimestampToIntent(launchIntent, createTimestamp);
+        // Pass through WebAPK shell launch timestamp to the new intent.
+        long shellLaunchTimestamp = IntentHandler.getWebApkShellLaunchTimestampFromIntent(intent);
+        IntentHandler.addShellLaunchTimestampToIntent(launchIntent, shellLaunchTimestamp);
 
-        // The shortcut data doesn't match the current encoding. Change the intent action to
-        // launch the URL with a VIEW Intent in the regular browser.
-        return createLaunchInTabIntent(webappUrl, webappSource);
+        IntentUtils.safeStartActivity(launchingActivity, launchIntent);
+        if (IntentUtils.isIntentForNewTaskOrNewDocument(launchIntent)) {
+            ApiCompatibilityUtils.finishAndRemoveTask(launchingActivity);
+        } else {
+            launchingActivity.finish();
+        }
     }
 
     // Gets the source of a WebAPK from the WebappDataStorage if the source has been stored before.
-    private int getWebApkSource(WebappInfo webappInfo) {
+    private static int getWebApkSource(WebappInfo webappInfo) {
         WebappDataStorage storage = null;
 
         StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
@@ -143,16 +145,55 @@
         return ShortcutSource.WEBAPK_UNKNOWN;
     }
 
-    private Intent createLaunchInTabIntent(String webappUrl, int webappSource) {
-        if (TextUtils.isEmpty(webappUrl)) return null;
+    /**
+     * Returns whether {@link sourceIntent} was sent by a WebAPK to relaunch itself.
+     *
+     * A WebAPK sends an intent to Chrome to get relaunched when it knows it is about to get killed
+     * as result of a call to PackageManager#setComponentEnabledSetting().
+     */
+    private static boolean shouldRelaunchWebApk(Intent sourceIntent, WebappInfo webappInfo) {
+        return webappInfo != null && webappInfo.isForWebApk()
+                && sourceIntent.hasExtra(WebApkConstants.EXTRA_RELAUNCH);
+    }
+
+    /** Relaunches WebAPK. */
+    private static void relaunchWebApk(
+            Activity launchingActivity, Intent sourceIntent, @NonNull WebappInfo info) {
+        Intent launchIntent = new Intent(Intent.ACTION_VIEW, info.uri());
+        launchIntent.setPackage(info.webApkPackageName());
+        launchIntent.setFlags(
+                Intent.FLAG_ACTIVITY_NEW_TASK | ApiCompatibilityUtils.getActivityNewDocumentFlag());
+        Bundle extras = sourceIntent.getExtras();
+        if (extras != null) {
+            launchIntent.putExtras(extras);
+        }
+
+        launchAfterDelay(
+                launchingActivity.getApplicationContext(), launchIntent, WEBAPK_LAUNCH_DELAY_MS);
+        ApiCompatibilityUtils.finishAndRemoveTask(launchingActivity);
+    }
+
+    /** Extracts start URL from source intent and launches URL in Chrome tab. */
+    private static void launchInTab(
+            Activity launchingActivity, Intent sourceIntent, WebappInfo webappInfo) {
+        Context appContext = launchingActivity.getApplicationContext();
+        String webappUrl = IntentUtils.safeGetStringExtra(sourceIntent, ShortcutHelper.EXTRA_URL);
+        int webappSource = (webappInfo == null) ? ShortcutSource.UNKNOWN : webappInfo.source();
+
+        if (TextUtils.isEmpty(webappUrl)) return;
 
         Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(webappUrl));
-        launchIntent.setClassName(getPackageName(), ChromeLauncherActivity.class.getName());
+        launchIntent.setClassName(
+                appContext.getPackageName(), ChromeLauncherActivity.class.getName());
         launchIntent.putExtra(ShortcutHelper.REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB, true);
         launchIntent.putExtra(ShortcutHelper.EXTRA_SOURCE, webappSource);
         launchIntent.setFlags(
                 Intent.FLAG_ACTIVITY_NEW_TASK | ApiCompatibilityUtils.getActivityNewDocumentFlag());
-        return launchIntent;
+
+        Log.e(TAG, "Shortcut (%s) opened in Chrome.", webappUrl);
+
+        IntentUtils.safeStartActivity(appContext, launchIntent);
+        ApiCompatibilityUtils.finishAndRemoveTask(launchingActivity);
     }
 
     /**
@@ -161,16 +202,17 @@
      * The MAC is used to prevent malicious apps from launching Chrome into a full screen
      * Activity for phishing attacks (among other reasons).
      *
+     * @param context
      * @param url The URL for the web app.
      * @param mac MAC to compare the URL against.  See {@link WebappAuthenticator}.
      * @return Whether the MAC is valid for the URL.
      */
-    private boolean isValidMacForUrl(String url, String mac) {
+    private static boolean isValidMacForUrl(Context context, String url, String mac) {
         return mac != null
-                && WebappAuthenticator.isUrlValid(this, url, Base64.decode(mac, Base64.DEFAULT));
+                && WebappAuthenticator.isUrlValid(context, url, Base64.decode(mac, Base64.DEFAULT));
     }
 
-    private boolean wasIntentFromChrome(Intent intent) {
+    private static boolean wasIntentFromChrome(Intent intent) {
         return IntentHandler.wasIntentSenderChrome(intent);
     }
 
@@ -273,14 +315,14 @@
     }
 
     /** Tries to create WebappInfo/WebApkInfo for the intent. */
-    private WebappInfo tryCreateWebappInfo(Intent intent) {
+    private static WebappInfo tryCreateWebappInfo(Context appContext, Intent intent) {
         // Builds WebApkInfo for the intent if the WebAPK package specified in the intent is a valid
         // WebAPK and the URL specified in the intent can be fulfilled by the WebAPK.
         String webApkPackage =
                 IntentUtils.safeGetStringExtra(intent, WebApkConstants.EXTRA_WEBAPK_PACKAGE_NAME);
         String url = IntentUtils.safeGetStringExtra(intent, ShortcutHelper.EXTRA_URL);
         if (!TextUtils.isEmpty(webApkPackage) && !TextUtils.isEmpty(url)
-                && WebApkValidator.canWebApkHandleUrl(this, webApkPackage, url)) {
+                && WebApkValidator.canWebApkHandleUrl(appContext, webApkPackage, url)) {
             return WebApkInfo.create(intent);
         }
 
@@ -288,4 +330,14 @@
                 webApkPackage, url);
         return WebappInfo.create(intent);
     }
+
+    /** Launches intent after a delay. */
+    private static void launchAfterDelay(Context appContext, Intent intent, int launchDelayMs) {
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                IntentUtils.safeStartActivity(appContext, intent);
+            }
+        }, launchDelayMs);
+    }
 }
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index 5c25307..7b0a8ceb 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -4000,7 +4000,7 @@
         Don't display again
       </message>
       <message name="IDS_AUTOFILL_ASSISTANT_INIT_MESSAGE" desc="Onboarding message describing autofill assistant's capability.">
-        Google Assistant can help you get things done faster and easier on the web
+        The Google Assistant saves you time by speeding you through the website's checkout.
       </message>
       <!-- Autofill Assistant preferences -->
       <message name="IDS_PREFS_AUTOFILL_ASSISTANT_TITLE" desc="Title for the Autofill Assistant preferences screen. [CHAR-LIMIT=32]">
@@ -4009,6 +4009,9 @@
       <message name="IDS_PREFS_AUTOFILL_ASSISTANT_SWITCH" desc="Title for the switch toggling whether Autofill Assistant is enabled. [CHAR-LIMIT=32]">
         Automate
       </message>
+      <message name="IDS_AUTOFILL_ASSISTANT_GOOGLE_TERMS_DESCRIPTION" desc="Message linking to the Google terms and conditions for Fast Checkout.">
+        By continuing you agree to the Google terms and conditions for Fast Checkout. <ph name="BEGIN_LINK">&lt;link&gt;</ph>Read more<ph name="END_LINK">&lt;/link&gt;</ph>
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ServicificationBackgroundServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ServicificationBackgroundServiceTest.java
index d55f418..48d89e8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ServicificationBackgroundServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ServicificationBackgroundServiceTest.java
@@ -107,8 +107,8 @@
     @Test
     @MediumTest
     @Feature({"ServicificationStartup"})
-    @CommandLineFlags.Add({"allow-start-service-manager-only",
-            "enable-features=NetworkService,NetworkServiceInProcess"})
+    @CommandLineFlags.
+    Add({"enable-features=NetworkService,NetworkServiceInProcess,AllowStartingServiceManagerOnly"})
     public void testSeriveManagerStarts() {
         startOnRunTaskAndVerify(ServiceManagerStartupUtils.TASK_TAG, true);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
index 44908cf9..8826be85 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
@@ -219,11 +219,11 @@
         final Statement base = super.apply(new Statement() {
             @Override
             public void evaluate() throws Throwable {
+                setUpMockAndroidSyncSettings();
+
                 startMainActivityForSyncTest();
                 mContext = InstrumentationRegistry.getTargetContext();
 
-                setUpMockAndroidSyncSettings();
-
                 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
                     @Override
                     public void run() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
index 2f8dae24..624f341 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
@@ -22,6 +22,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.UrlConstants;
@@ -179,6 +180,7 @@
      */
     @Test
     @MediumTest
+    @DisabledTest(message = "crbug.com/910549")
     public void testControllerFlingScrolling() throws InterruptedException {
         mVrTestRule.loadUrl(
                 VrBrowserTestFramework.getFileUrlForHtmlTestFile("test_controller_scrolling"),
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 37df527..a8b2f9ea 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-72.0.3625.0_rc-r1.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-72.0.3626.0_rc-r1.afdo.bz2
\ No newline at end of file
diff --git a/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkConstants.java b/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkConstants.java
index 624749e..4c4bfe1 100644
--- a/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkConstants.java
+++ b/chrome/android/webapk/libs/common/src/org/chromium/webapk/lib/common/WebApkConstants.java
@@ -32,6 +32,8 @@
     // activity.
     public static final String EXTRA_USE_TRANSPARENT_SPLASH =
             "org.chromium.chrome.browser.webapk.transparent_splash";
+    // Tells the host browser to relaunch the WebAPK.
+    public static final String EXTRA_RELAUNCH = "org.chromium.webapk.relaunch";
 
     // Must be kept in sync with chrome/browser/android/shortcut_info.h.
     public static final int SHORTCUT_SOURCE_UNKNOWN = 0;
diff --git a/chrome/android/webapk/shell_apk/BUILD.gn b/chrome/android/webapk/shell_apk/BUILD.gn
index 94056cb6..d327043 100644
--- a/chrome/android/webapk/shell_apk/BUILD.gn
+++ b/chrome/android/webapk/shell_apk/BUILD.gn
@@ -44,7 +44,6 @@
       "src/org/chromium/webapk/shell_apk/HostBrowserClassLoader.java",
       "src/org/chromium/webapk/shell_apk/HostBrowserLauncher.java",
       "src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java",
-      "src/org/chromium/webapk/shell_apk/HostBrowserLauncherActivity.java",
       "src/org/chromium/webapk/shell_apk/ChooseHostBrowserDialog.java",
       "src/org/chromium/webapk/shell_apk/HostBrowserUtils.java",
       "src/org/chromium/webapk/shell_apk/IdentityService.java",
diff --git a/chrome/android/webapk/shell_apk/current_version/current_version.gni b/chrome/android/webapk/shell_apk/current_version/current_version.gni
index 9d61bed..2334e16 100644
--- a/chrome/android/webapk/shell_apk/current_version/current_version.gni
+++ b/chrome/android/webapk/shell_apk/current_version/current_version.gni
@@ -12,4 +12,4 @@
 # //chrome/android/webapk/shell_apk:webapk is changed. This includes
 # Java files, Android resource files and AndroidManifest.xml. Does not affect
 # Chrome.apk
-current_shell_apk_version = 76
+current_shell_apk_version = 78
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java
index 2c3ea500..723673ab 100644
--- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java
+++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java
@@ -68,7 +68,8 @@
         Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(intentStartUrl));
         Robolectric.buildActivity(MainActivity.class, launchIntent).create();
 
-        assertWebApkLaunched(expectedStartUrl);
+        Intent startedActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertWebApkLaunched(startedActivityIntent, expectedStartUrl);
     }
 
     /**
@@ -93,7 +94,8 @@
         Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(intentStartUrl));
         Robolectric.buildActivity(MainActivity.class, launchIntent).create();
 
-        assertWebApkLaunched(expectedStartUrl);
+        Intent startedActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertWebApkLaunched(startedActivityIntent, expectedStartUrl);
     }
 
     /**
@@ -118,7 +120,8 @@
         Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(intentStartUrl));
         Robolectric.buildActivity(MainActivity.class, launchIntent).create();
 
-        assertWebApkLaunched(expectedStartUrl);
+        Intent startedActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertWebApkLaunched(startedActivityIntent, expectedStartUrl);
     }
 
     /**
@@ -142,7 +145,8 @@
         Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(intentStartUrl));
         Robolectric.buildActivity(MainActivity.class, launchIntent).create();
 
-        assertWebApkLaunched(intentStartUrl);
+        Intent startedActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertWebApkLaunched(startedActivityIntent, intentStartUrl);
     }
 
     /**
@@ -169,7 +173,8 @@
         Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(intentStartUrl));
         Robolectric.buildActivity(MainActivity.class, launchIntent).create();
 
-        assertWebApkLaunched(expectedStartUrl);
+        Intent startedActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertWebApkLaunched(startedActivityIntent, expectedStartUrl);
     }
 
     /**
@@ -192,10 +197,10 @@
         Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(startUrl));
         Robolectric.buildActivity(MainActivity.class, launchIntent).create();
 
-        Intent startActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
-        Assert.assertEquals(BROWSER_PACKAGE_NAME, startActivityIntent.getPackage());
-        Assert.assertEquals(Intent.ACTION_VIEW, startActivityIntent.getAction());
-        Assert.assertEquals(startUrl, startActivityIntent.getDataString());
+        Intent startedActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        Assert.assertEquals(BROWSER_PACKAGE_NAME, startedActivityIntent.getPackage());
+        Assert.assertEquals(Intent.ACTION_VIEW, startedActivityIntent.getAction());
+        Assert.assertEquals(startUrl, startedActivityIntent.getDataString());
     }
 
     /**
@@ -218,17 +223,54 @@
         Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(startUrl));
         Robolectric.buildActivity(MainActivity.class, launchIntent).create();
 
-        assertWebApkLaunched(startUrl);
+        Intent startedActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertWebApkLaunched(startedActivityIntent, startUrl);
     }
 
-    /** Asserts that {@link BROWSER_PACKAGE_NAME} was launched in WebAPK mode. */
-    private void assertWebApkLaunched(String expectedStartUrl) {
-        Intent startActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
-        Assert.assertEquals(BROWSER_PACKAGE_NAME, startActivityIntent.getPackage());
-        Assert.assertEquals(
-                HostBrowserLauncher.ACTION_START_WEBAPK, startActivityIntent.getAction());
-        Assert.assertEquals(
-                expectedStartUrl, startActivityIntent.getStringExtra(WebApkConstants.EXTRA_URL));
+    /**
+     * Check that extras which should be propagated from the WebAPK launch intent to the browser
+     * launch intent are in fact propagated.
+     */
+    @Test
+    public void testPropagatedDeepLinkExtras() throws Exception {
+        final String startUrl = "https://www.google.com/";
+
+        Bundle extrasToPropagate = new Bundle();
+        // WebAPK should not override these extras if they are provided in the WebAPK launch intent.
+        extrasToPropagate.putBoolean(WebApkConstants.EXTRA_FORCE_NAVIGATION, true);
+        extrasToPropagate.putLong(WebApkConstants.EXTRA_WEBAPK_LAUNCH_TIME, 314159);
+
+        // WebAPK should copy to the browser launch intent arbirtary extras provided in the WebAPK
+        // launch intent.
+        extrasToPropagate.putString("randomKey", "randomValue");
+
+        Bundle bundle = new Bundle();
+        bundle.putString(WebApkMetaDataKeys.START_URL, startUrl);
+        bundle.putString(WebApkMetaDataKeys.SCOPE, startUrl);
+        bundle.putString(WebApkMetaDataKeys.RUNTIME_HOST, BROWSER_PACKAGE_NAME);
+        WebApkTestHelper.registerWebApkWithMetaData(WebApkUtilsTest.WEBAPK_PACKAGE_NAME, bundle);
+
+        Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(startUrl));
+        launchIntent.putExtras((Bundle) extrasToPropagate.clone());
+        Robolectric.buildActivity(MainActivity.class, launchIntent).create();
+
+        Intent startedActivityIntent = ShadowApplication.getInstance().getNextStartedActivity();
+        assertWebApkLaunched(startedActivityIntent, startUrl);
+        Bundle actualExtras = startedActivityIntent.getExtras();
+        Assert.assertNotNull(actualExtras);
+        for (String key : extrasToPropagate.keySet()) {
+            Assert.assertEquals(extrasToPropagate.get(key), actualExtras.get(key));
+        }
+    }
+
+    /**
+     * Asserts that the passed in intent is an intent to launch {@link BROWSER_PACKAGE_NAME} in
+     * WebAPK mode.
+     */
+    private void assertWebApkLaunched(Intent intent, String expectedStartUrl) {
+        Assert.assertEquals(BROWSER_PACKAGE_NAME, intent.getPackage());
+        Assert.assertEquals(HostBrowserLauncher.ACTION_START_WEBAPK, intent.getAction());
+        Assert.assertEquals(expectedStartUrl, intent.getStringExtra(WebApkConstants.EXTRA_URL));
     }
 
     private void installBrowser(String browserPackageName) {
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
index 386fc312..184f3f31 100644
--- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
+++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
@@ -6,13 +6,16 @@
 
 import android.app.Activity;
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
+import android.os.Bundle;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -29,6 +32,7 @@
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 import org.chromium.webapk.lib.common.WebApkConstants;
 import org.chromium.webapk.shell_apk.HostBrowserLauncher;
+import org.chromium.webapk.shell_apk.WebApkSharedPreferences;
 import org.chromium.webapk.shell_apk.WebApkUtils;
 
 import java.util.ArrayList;
@@ -47,6 +51,7 @@
     /** Chromium version which does not support showing the splash screen within WebAPK. */
     private static final int BROWSER_H2O_INCOMPATIBLE_VERSION = 57;
 
+    private Context mAppContext;
     private ShadowApplication mShadowApplication;
     private PackageManager mPackageManager;
     private ShadowPackageManager mShadowPackageManager;
@@ -54,7 +59,8 @@
     @Before
     public void setUp() {
         mShadowApplication = ShadowApplication.getInstance();
-        mPackageManager = RuntimeEnvironment.application.getPackageManager();
+        mAppContext = RuntimeEnvironment.application;
+        mPackageManager = mAppContext.getPackageManager();
         mShadowPackageManager = Shadows.shadowOf(mPackageManager);
     }
 
@@ -82,8 +88,12 @@
         launchedIntents = launchAndCheckBrowserLaunched(false /* splashActivityInitiallyEnabled */,
                 true /* browserCompatibleWithSplashActivity */, launchIntent,
                 H2OTransparentLauncherActivity.class, deepLinkUrl);
-        Assert.assertEquals(2, launchedIntents.size());
+        Assert.assertEquals(5, launchedIntents.size());
         assertIntentComponentClassNameEquals(H2OMainActivity.class, launchedIntents.get(0));
+        Assert.assertEquals(BROWSER_PACKAGE_NAME, launchedIntents.get(1).getPackage());
+        assertIntentComponentClassNameEquals(
+                H2OTransparentLauncherActivity.class, launchedIntents.get(2));
+        assertIntentComponentClassNameEquals(SplashActivity.class, launchedIntents.get(3));
 
         launchedIntents = launchAndCheckBrowserLaunched(true /* splashActivityInitiallyEnabled */,
                 false /* browserCompatibleWithSplashActivity */, launchIntent,
@@ -114,7 +124,11 @@
         launchedIntents = launchAndCheckBrowserLaunched(false /* splashActivityInitiallyEnabled */,
                 true /* browserCompatibleWithSplashActivity */, launchIntent, H2OMainActivity.class,
                 DEFAULT_START_URL);
-        Assert.assertEquals(1, launchedIntents.size());
+        Assert.assertEquals(4, launchedIntents.size());
+        Assert.assertEquals(BROWSER_PACKAGE_NAME, launchedIntents.get(0).getPackage());
+        assertIntentComponentClassNameEquals(
+                H2OTransparentLauncherActivity.class, launchedIntents.get(1));
+        assertIntentComponentClassNameEquals(SplashActivity.class, launchedIntents.get(2));
 
         launchedIntents = launchAndCheckBrowserLaunched(true /* splashActivityInitiallyEnabled */,
                 false /* browserCompatibleWithSplashActivity */, launchIntent, SplashActivity.class,
@@ -180,6 +194,79 @@
                 source, browserLaunchIntent.getIntExtra(WebApkConstants.EXTRA_SOURCE, -1));
     }
 
+    /**
+     * Check that the WebAPK does not propagate the {@link EXTRA_RELAUNCH} extra. When
+     * the host browser relaunches the WebAPK, the host browser might copy over all of
+     * the extras and not remove the relaunch intent. Check that this scenario does not
+     * yield an infinite loop.
+     */
+    @Test
+    @Ignore
+    public void testDoesNotPropagateRelaunchDirective() throws Exception {
+        final String deepLinkUrl = "https://pwa.rocks/deep_link.html";
+
+        Intent launchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(deepLinkUrl));
+        launchIntent.setPackage(WEBAPK_PACKAGE_NAME);
+        launchIntent.putExtra(WebApkConstants.EXTRA_RELAUNCH, true);
+
+        ArrayList<Intent> launchedIntents =
+                launchAndCheckBrowserLaunched(true /* splashActivityInitiallyEnabled */,
+                        true /* browserCompatibleWithSplashActivity */, launchIntent,
+                        H2OTransparentLauncherActivity.class, deepLinkUrl);
+        Assert.assertTrue(launchedIntents.size() > 1);
+
+        Intent browserLaunchIntent = launchedIntents.get(launchedIntents.size() - 1);
+        Assert.assertFalse(browserLaunchIntent.hasExtra(WebApkConstants.EXTRA_RELAUNCH));
+    }
+
+    /**
+     * Test that WebAPK does not keep asking the host browser to relaunch the WebAPK if changing the
+     * enabled component is slow.
+     */
+    @Test
+    @Ignore
+    public void testDoesNotLoopIfEnablingSplashActivityIsSlow() {
+        // SplashActivity is disabled. Host browser is compatible with SplashActivity.
+        changeWebApkActivityEnabledSetting(mPackageManager, SplashActivity.class,
+                PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
+        changeWebApkActivityEnabledSetting(mPackageManager, H2OMainActivity.class,
+                PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+        installBrowser(
+                BROWSER_PACKAGE_NAME, H2OLauncher.MINIMUM_REQUIRED_CHROMIUM_VERSION_NEW_SPLASH);
+
+        Intent launchIntent = new Intent(Intent.ACTION_MAIN);
+        launchIntent.setPackage(WEBAPK_PACKAGE_NAME);
+
+        // WebAPK requested host browser to relaunch WebAPK recently. The WebAPK should not ask
+        // the host browser to relaunch it again.
+        {
+            SharedPreferences.Editor editor = WebApkSharedPreferences.getPrefs(mAppContext).edit();
+            editor.putLong(
+                    WebApkSharedPreferences.SHARED_PREF_REQUEST_HOST_BROWSER_RELAUNCH_TIMESTAMP,
+                    System.currentTimeMillis() - 1);
+            editor.apply();
+
+            Robolectric.buildActivity(H2OMainActivity.class, launchIntent).create();
+            Intent startedActivityIntent = mShadowApplication.getNextStartedActivity();
+            Assert.assertEquals(BROWSER_PACKAGE_NAME, startedActivityIntent.getPackage());
+            Assert.assertFalse(startedActivityIntent.hasExtra(WebApkConstants.EXTRA_RELAUNCH));
+        }
+
+        // WebAPK requested host browser to relaunch WebAPK a long time ago. The WebAPK should ask
+        // the host browser to relaunch it.
+        {
+            SharedPreferences.Editor editor = WebApkSharedPreferences.getPrefs(mAppContext).edit();
+            editor.putLong(
+                    WebApkSharedPreferences.SHARED_PREF_REQUEST_HOST_BROWSER_RELAUNCH_TIMESTAMP, 1);
+            editor.apply();
+
+            Robolectric.buildActivity(H2OMainActivity.class, launchIntent).create();
+            Intent startedActivityIntent = mShadowApplication.getNextStartedActivity();
+            Assert.assertEquals(BROWSER_PACKAGE_NAME, startedActivityIntent.getPackage());
+            Assert.assertTrue(startedActivityIntent.hasExtra(WebApkConstants.EXTRA_RELAUNCH));
+        }
+    }
+
     /** Checks the name of the intent's component class name. */
     private static void assertIntentComponentClassNameEquals(Class expectedClass, Intent intent) {
         Assert.assertEquals(expectedClass.getName(), intent.getComponent().getClassName());
@@ -200,17 +287,12 @@
     private ArrayList<Intent> launchAndCheckBrowserLaunched(boolean splashActivityInitiallyEnabled,
             boolean browserCompatibleWithSplashActivity, Intent launchIntent,
             Class<? extends Activity> launchActivity, String expectedLaunchUrl) {
-        ComponentName h2oMainComponent =
-                new ComponentName(WEBAPK_PACKAGE_NAME, H2OMainActivity.class.getName());
-        ComponentName splashComponent =
-                new ComponentName(WEBAPK_PACKAGE_NAME, SplashActivity.class.getName());
-
-        mPackageManager.setComponentEnabledSetting(
-                splashActivityInitiallyEnabled ? splashComponent : h2oMainComponent,
-                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
-        mPackageManager.setComponentEnabledSetting(
-                splashActivityInitiallyEnabled ? h2oMainComponent : splashComponent,
-                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
+        changeWebApkActivityEnabledSetting(mPackageManager,
+                splashActivityInitiallyEnabled ? SplashActivity.class : H2OMainActivity.class,
+                PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+        changeWebApkActivityEnabledSetting(mPackageManager,
+                splashActivityInitiallyEnabled ? H2OMainActivity.class : SplashActivity.class,
+                PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
         installBrowser(BROWSER_PACKAGE_NAME,
                 browserCompatibleWithSplashActivity
                         ? H2OLauncher.MINIMUM_REQUIRED_CHROMIUM_VERSION_NEW_SPLASH
@@ -231,16 +313,25 @@
                 expectedLaunchUrl, browserLaunchIntent.getStringExtra(WebApkConstants.EXTRA_URL));
 
         Assert.assertEquals(browserCompatibleWithSplashActivity,
-                isWebApkActivityEnabled(mPackageManager, splashComponent));
+                isWebApkActivityEnabled(mPackageManager, SplashActivity.class));
         Assert.assertEquals(!browserCompatibleWithSplashActivity,
-                isWebApkActivityEnabled(mPackageManager, h2oMainComponent));
+                isWebApkActivityEnabled(mPackageManager, H2OMainActivity.class));
 
         return launchedIntents;
     }
 
-    /** Returns whether the passed in component is enabled. */
+    /** Changes whether the passed in WebAPK activity is enabled. */
+    private static void changeWebApkActivityEnabledSetting(
+            PackageManager packageManager, Class<? extends Activity> activity, int enabledSetting) {
+        ComponentName component = new ComponentName(WEBAPK_PACKAGE_NAME, activity.getName());
+        packageManager.setComponentEnabledSetting(
+                component, enabledSetting, PackageManager.DONT_KILL_APP);
+    }
+
+    /** Returns whether the passed in WebAPK activity is enabled. */
     private static boolean isWebApkActivityEnabled(
-            PackageManager packageManager, ComponentName component) {
+            PackageManager packageManager, Class<? extends Activity> activity) {
+        ComponentName component = new ComponentName(WEBAPK_PACKAGE_NAME, activity.getName());
         int enabledSetting = packageManager.getComponentEnabledSetting(component);
         return (enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
     }
@@ -261,7 +352,21 @@
 
             activityIntentChain.add(startedActivityIntent);
 
-            if (browserPackage.equals(startedActivityIntent.getPackage())) break;
+            if (browserPackage.equals(startedActivityIntent.getPackage())) {
+                if (!startedActivityIntent.hasExtra(WebApkConstants.EXTRA_RELAUNCH)) break;
+
+                // Emulate host browser relaunch behaviour.
+                String startUrl = startedActivityIntent.getStringExtra(WebApkConstants.EXTRA_URL);
+                Intent relaunchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(startUrl));
+                relaunchIntent.setComponent(new ComponentName(
+                        WEBAPK_PACKAGE_NAME, H2OTransparentLauncherActivity.class.getName()));
+                Bundle startedActivityExtras = startedActivityIntent.getExtras();
+                if (startedActivityExtras != null) {
+                    relaunchIntent.putExtras(startedActivityExtras);
+                }
+                mAppContext.startActivity(relaunchIntent);
+                continue;
+            }
 
             Class<? extends Activity> startedActivityClass = null;
             try {
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncher.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncher.java
index 116137f..e152090 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncher.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncher.java
@@ -59,31 +59,32 @@
             return;
         }
 
-        Intent launchIntent = createLaunchInWebApkModeIntent(context, params);
-        if (params.getSelectedShareTargetActivityClassName() != null) {
-            grantUriPermissionToHostBrowser(
-                    context, launchIntent, params.getHostBrowserPackageName());
-        }
-        try {
-            context.startActivity(launchIntent);
-        } catch (ActivityNotFoundException e) {
-            Log.w(TAG, "Unable to launch browser in WebAPK mode.");
-            e.printStackTrace();
-        }
+        launchBrowserInWebApkMode(context, params, null, Intent.FLAG_ACTIVITY_NEW_TASK);
     }
 
-    /** Creates intent to launch host browser in WebAPK mode. */
-    public static Intent createLaunchInWebApkModeIntent(
-            Context context, HostBrowserLauncherParams params) {
+    /** Launches host browser in WebAPK mode. */
+    public static void launchBrowserInWebApkMode(
+            Context context, HostBrowserLauncherParams params, Bundle extraExtras, int flags) {
+        if (params.getSelectedShareTargetActivityClassName() != null) {
+            grantUriPermissionToHostBrowser(
+                    context, params.getOriginalIntent(), params.getHostBrowserPackageName());
+        }
+
         Intent intent = new Intent();
         intent.setAction(ACTION_START_WEBAPK);
         intent.setPackage(params.getHostBrowserPackageName());
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.setFlags(flags);
 
         Bundle copiedExtras = params.getOriginalIntent().getExtras();
         if (copiedExtras != null) {
             intent.putExtras(copiedExtras);
         }
+
+        // {@link WebApkConstants.EXTRA_RELAUNCH} causes the browser the relaunch the WebAPK. Avoid
+        // an infinite relaunch loop by explicity removing the extra and adding it back only if it
+        // is in {@link extraExtras}.
+        intent.removeExtra(WebApkConstants.EXTRA_RELAUNCH);
+
         intent.putExtra(WebApkConstants.EXTRA_URL, params.getStartUrl())
                 .putExtra(WebApkConstants.EXTRA_SOURCE, params.getSource())
                 .putExtra(WebApkConstants.EXTRA_WEBAPK_PACKAGE_NAME, context.getPackageName())
@@ -91,12 +92,22 @@
                         params.getSelectedShareTargetActivityClassName())
                 .putExtra(WebApkConstants.EXTRA_FORCE_NAVIGATION, params.getForceNavigation());
 
+        if (extraExtras != null) {
+            intent.putExtras(extraExtras);
+        }
+
         // Only pass on the start time if no user action was required between launching the webapk
         // and chrome starting up. See https://crbug.com/842023
         if (!params.wasDialogShown()) {
             intent.putExtra(WebApkConstants.EXTRA_WEBAPK_LAUNCH_TIME, params.getLaunchTimeMs());
         }
-        return intent;
+
+        try {
+            context.startActivity(intent);
+        } catch (ActivityNotFoundException e) {
+            Log.w(TAG, "Unable to launch browser in WebAPK mode.");
+            e.printStackTrace();
+        }
     }
 
     /** Launches a WebAPK in its runtime host browser as a tab. */
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherActivity.java
deleted file mode 100644
index d999329..0000000
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherActivity.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.webapk.shell_apk;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.os.SystemClock;
-
-/**
- * Base class for activity which launches host browser.
- */
-public abstract class HostBrowserLauncherActivity extends Activity {
-    private long mActivityStartTimeMs;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        mActivityStartTimeMs = SystemClock.elapsedRealtime();
-        super.onCreate(savedInstanceState);
-
-        showSplashScreen();
-
-        new LaunchHostBrowserSelector(this).selectHostBrowser(
-                new LaunchHostBrowserSelector.Callback() {
-                    @Override
-                    public void onBrowserSelected(
-                            String hostBrowserPackageName, boolean dialogShown) {
-                        if (hostBrowserPackageName == null) {
-                            finish();
-                            return;
-                        }
-                        HostBrowserLauncherParams params =
-                                HostBrowserLauncherParams.createForIntent(
-                                        HostBrowserLauncherActivity.this, getIntent(),
-                                        hostBrowserPackageName, dialogShown, mActivityStartTimeMs);
-                        onHostBrowserSelected(params);
-                    }
-                });
-    }
-
-    protected abstract void showSplashScreen();
-
-    protected abstract void onHostBrowserSelected(HostBrowserLauncherParams params);
-}
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java
index 0f8374c..1e07757 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java
@@ -43,13 +43,21 @@
 
         int hostBrowserMajorChromiumVersion = HostBrowserUtils.queryHostBrowserMajorChromiumVersion(
                 context, hostBrowserPackageName);
+        long intentLaunchTimeMs = intent.getLongExtra(WebApkConstants.EXTRA_WEBAPK_LAUNCH_TIME, -1);
+        if (intentLaunchTimeMs > 0) {
+            launchTimeMs = intentLaunchTimeMs;
+        }
 
         String startUrl = null;
         int source = WebApkConstants.SHORTCUT_SOURCE_UNKNOWN;
         boolean forceNavigation = false;
 
+        // If the intent was from the WebAPK relaunching itself or from the host browser relaunching
+        // the WebAPK via {@link H2OLauncher#requestRelaunchFromHostBrowser()}, we cannot determine
+        // whether the intent is a share intent from the intent's action.
         String selectedShareTargetActivityClassName = intent.getStringExtra(
                 WebApkConstants.EXTRA_WEBAPK_SELECTED_SHARE_TARGET_ACTIVITY_CLASS_NAME);
+
         if (Intent.ACTION_SEND.equals(intent.getAction())
                 || Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) {
             selectedShareTargetActivityClassName = intent.getComponent().getClassName();
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/TransparentLauncherActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/TransparentLauncherActivity.java
index d6f9deb..ca0c73ab 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/TransparentLauncherActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/TransparentLauncherActivity.java
@@ -4,20 +4,42 @@
 
 package org.chromium.webapk.shell_apk;
 
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.SystemClock;
+
 /**
  * UI-less activity which launches host browser.
  */
-public class TransparentLauncherActivity extends HostBrowserLauncherActivity {
+public class TransparentLauncherActivity extends Activity {
     @Override
-    protected void showSplashScreen() {}
+    protected void onCreate(Bundle savedInstanceState) {
+        long activityStartTimeMs = SystemClock.elapsedRealtime();
+        super.onCreate(savedInstanceState);
 
-    @Override
+        new LaunchHostBrowserSelector(this).selectHostBrowser(
+                new LaunchHostBrowserSelector.Callback() {
+                    @Override
+                    public void onBrowserSelected(
+                            String hostBrowserPackageName, boolean dialogShown) {
+                        if (hostBrowserPackageName == null) {
+                            finish();
+                            return;
+                        }
+                        HostBrowserLauncherParams params =
+                                HostBrowserLauncherParams.createForIntent(
+                                        TransparentLauncherActivity.this, getIntent(),
+                                        hostBrowserPackageName, dialogShown, activityStartTimeMs);
+
+                        onHostBrowserSelected(params);
+                        finish();
+                    }
+                });
+    }
+
     protected void onHostBrowserSelected(HostBrowserLauncherParams params) {
-        if (params == null) {
-            finish();
-            return;
+        if (params != null) {
+            HostBrowserLauncher.launch(getApplicationContext(), params);
         }
-        HostBrowserLauncher.launch(getApplicationContext(), params);
-        finish();
     }
 }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkSharedPreferences.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkSharedPreferences.java
index fecd38e..094f45d2 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkSharedPreferences.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkSharedPreferences.java
@@ -26,6 +26,10 @@
     public static final String PREF_RUNTIME_DEX_VERSION =
             "org.chromium.webapk.shell_apk.dex_version";
 
+    /** Timestamp of when the WebAPK asked the host browser to relaunch the WebAPK. */
+    public static final String SHARED_PREF_REQUEST_HOST_BROWSER_RELAUNCH_TIMESTAMP =
+            "org.chromium.webapk.shell_apk.request_host_browser_relaunch_timestamp";
+
     public static SharedPreferences getPrefs(Context context) {
         return context.getSharedPreferences(PREF_PACKAGE, Context.MODE_PRIVATE);
     }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OLauncher.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OLauncher.java
index e70a1d26..011c51b 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OLauncher.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OLauncher.java
@@ -5,10 +5,10 @@
 package org.chromium.webapk.shell_apk.h2o;
 
 import android.app.Activity;
-import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Bundle;
@@ -17,6 +17,7 @@
 import org.chromium.webapk.lib.common.WebApkConstants;
 import org.chromium.webapk.shell_apk.HostBrowserLauncher;
 import org.chromium.webapk.shell_apk.HostBrowserLauncherParams;
+import org.chromium.webapk.shell_apk.WebApkSharedPreferences;
 
 /** Contains methods for launching host browser where ShellAPK shows the splash screen. */
 public class H2OLauncher {
@@ -35,6 +36,16 @@
                 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
     }
 
+    /** Returns whether the WebAPK requested a relaunch within the last {@link deltaMs}. */
+    public static boolean didRequestRelaunchFromHostBrowserWithinLastMs(
+            Context context, long deltaMs) {
+        SharedPreferences sharedPrefs = WebApkSharedPreferences.getPrefs(context);
+        long now = System.currentTimeMillis();
+        long lastRequestTimestamp = sharedPrefs.getLong(
+                WebApkSharedPreferences.SHARED_PREF_REQUEST_HOST_BROWSER_RELAUNCH_TIMESTAMP, -1);
+        return (now - lastRequestTimestamp) <= deltaMs;
+    }
+
     /**
      * Changes which components are enabled.
      *
@@ -56,20 +67,9 @@
     public static void launch(Activity splashActivity, HostBrowserLauncherParams params) {
         Log.v(TAG, "WebAPK Launch URL: " + params.getStartUrl());
 
-        Intent intent = HostBrowserLauncher.createLaunchInWebApkModeIntent(
-                splashActivity.getApplicationContext(), params);
-        intent.putExtra(WebApkConstants.EXTRA_USE_TRANSPARENT_SPLASH, true);
-
-        // Clear Intent.FLAG_ACTIVITY_NEW_TASK flag set by
-        // {@link HostBrowserLauncher#createLaunchInWebApkModeIntent()}.
-        intent.setFlags(0);
-
-        try {
-            splashActivity.startActivity(intent);
-        } catch (ActivityNotFoundException e) {
-            Log.w(TAG, "Unable to launch browser in WebAPK mode.");
-            e.printStackTrace();
-        }
+        Bundle extraExtras = new Bundle();
+        extraExtras.putBoolean(WebApkConstants.EXTRA_USE_TRANSPARENT_SPLASH, true);
+        HostBrowserLauncher.launchBrowserInWebApkMode(splashActivity, params, extraExtras, 0);
     }
 
     /** Launches the given component, passing extras from the given intent. */
@@ -92,4 +92,19 @@
 
         context.startActivity(intent);
     }
+
+    /** Sends intent to host browser to request that the host browser relaunch the WebAPK. */
+    public static void requestRelaunchFromHostBrowser(
+            Context context, HostBrowserLauncherParams params) {
+        long timestamp = System.currentTimeMillis();
+        SharedPreferences.Editor editor = WebApkSharedPreferences.getPrefs(context).edit();
+        editor.putLong(WebApkSharedPreferences.SHARED_PREF_REQUEST_HOST_BROWSER_RELAUNCH_TIMESTAMP,
+                timestamp);
+        editor.apply();
+
+        Bundle extraExtras = new Bundle();
+        extraExtras.putBoolean(WebApkConstants.EXTRA_RELAUNCH, true);
+        HostBrowserLauncher.launchBrowserInWebApkMode(
+                context, params, extraExtras, Intent.FLAG_ACTIVITY_NEW_TASK);
+    }
 }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java
index cc0acef..f181472 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OMainActivity.java
@@ -17,6 +17,9 @@
  * transparent window in WebAPK mode till the URL has been loaded".
  */
 public class H2OMainActivity extends TransparentLauncherActivity {
+    /** Minimum interval between requests for the host browser to relaunch the WebAPK. */
+    private static final long MINIMUM_INTERVAL_BETWEEN_RELAUNCHES_MS = 20000;
+
     /** Returns whether {@link H2OMainActivity} is enabled. */
     public static boolean checkComponentEnabled(Context context) {
         PackageManager pm = context.getPackageManager();
@@ -30,18 +33,23 @@
     @Override
     protected void onHostBrowserSelected(HostBrowserLauncherParams params) {
         if (params == null) {
-            finish();
             return;
         }
 
         Context appContext = getApplicationContext();
-        HostBrowserLauncher.launch(appContext, params);
-
-        if (H2OLauncher.shouldIntentLaunchSplashActivity(params)) {
+        if (H2OLauncher.shouldIntentLaunchSplashActivity(params)
+                && !H2OLauncher.didRequestRelaunchFromHostBrowserWithinLastMs(
+                        appContext, MINIMUM_INTERVAL_BETWEEN_RELAUNCHES_MS)) {
+            // Request the host browser to relaunch the WebAPK. We cannot relaunch ourselves
+            // because {@link H2OLauncher#changeEnabledComponentsAndKillShellApk()} kills the
+            // WebAPK app. We cannot use AlarmManager or JobScheduler because their minimum
+            // delay (several seconds) is too high.
+            H2OLauncher.requestRelaunchFromHostBrowser(appContext, params);
             H2OLauncher.changeEnabledComponentsAndKillShellApk(appContext,
                     new ComponentName(appContext, SplashActivity.class), getComponentName());
+            return;
         }
 
-        finish();
+        HostBrowserLauncher.launch(appContext, params);
     }
 }
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OTransparentLauncherActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OTransparentLauncherActivity.java
index 86d34c5..308e957 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OTransparentLauncherActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/H2OTransparentLauncherActivity.java
@@ -19,13 +19,11 @@
     @Override
     protected void onHostBrowserSelected(HostBrowserLauncherParams params) {
         if (params == null) {
-            finish();
             return;
         }
 
         boolean shouldLaunchSplash = H2OLauncher.shouldIntentLaunchSplashActivity(params);
         if (relaunchIfNeeded(params, shouldLaunchSplash)) {
-            finish();
             return;
         }
 
@@ -39,12 +37,10 @@
             H2OLauncher.copyIntentExtrasAndLaunch(appContext, getIntent(),
                     params.getSelectedShareTargetActivityClassName(),
                     new ComponentName(appContext, SplashActivity.class));
-            finish();
             return;
         }
 
         HostBrowserLauncher.launch(getApplicationContext(), params);
-        finish();
     }
 
     /**
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
index fc827e6..969d606 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
@@ -4,6 +4,7 @@
 
 package org.chromium.webapk.shell_apk.h2o;
 
+import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -11,19 +12,20 @@
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.os.Bundle;
+import android.os.SystemClock;
 import android.widget.FrameLayout;
 
 import org.chromium.webapk.lib.common.WebApkMetaDataKeys;
 import org.chromium.webapk.lib.common.WebApkMetaDataUtils;
 import org.chromium.webapk.lib.common.splash.SplashLayout;
 import org.chromium.webapk.shell_apk.HostBrowserLauncher;
-import org.chromium.webapk.shell_apk.HostBrowserLauncherActivity;
 import org.chromium.webapk.shell_apk.HostBrowserLauncherParams;
+import org.chromium.webapk.shell_apk.LaunchHostBrowserSelector;
 import org.chromium.webapk.shell_apk.R;
 import org.chromium.webapk.shell_apk.WebApkUtils;
 
 /** Displays splash screen. */
-public class SplashActivity extends HostBrowserLauncherActivity {
+public class SplashActivity extends Activity {
     /** Returns whether {@link SplashActivity} is enabled. */
     public static boolean checkComponentEnabled(Context context) {
         PackageManager pm = context.getPackageManager();
@@ -34,7 +36,34 @@
     }
 
     @Override
-    protected void showSplashScreen() {
+    protected void onCreate(Bundle savedInstanceState) {
+        final long activityStartTimeMs = SystemClock.elapsedRealtime();
+        super.onCreate(savedInstanceState);
+
+        showSplashScreen();
+        selectHostBrowser(activityStartTimeMs);
+    }
+
+    private void selectHostBrowser(final long activityStartTimeMs) {
+        new LaunchHostBrowserSelector(this).selectHostBrowser(
+                new LaunchHostBrowserSelector.Callback() {
+                    @Override
+                    public void onBrowserSelected(
+                            String hostBrowserPackageName, boolean dialogShown) {
+                        if (hostBrowserPackageName == null) {
+                            finish();
+                            return;
+                        }
+                        HostBrowserLauncherParams params =
+                                HostBrowserLauncherParams.createForIntent(SplashActivity.this,
+                                        getIntent(), hostBrowserPackageName, dialogShown,
+                                        activityStartTimeMs);
+                        onHostBrowserSelected(params);
+                    }
+                });
+    }
+
+    private void showSplashScreen() {
         Bundle metadata = WebApkUtils.readMetaData(this);
         Resources resources = getResources();
 
@@ -56,8 +85,8 @@
                 getWindow(), WebApkUtils.getDarkenedColorForStatusBar(themeColor));
     }
 
-    @Override
-    protected void onHostBrowserSelected(HostBrowserLauncherParams params) {
+    /** Called once the host browser has been selected. */
+    private void onHostBrowserSelected(HostBrowserLauncherParams params) {
         if (params == null) {
             finish();
             return;
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index c0e0067e..2a61f30 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1414,6 +1414,8 @@
     "signin/about_signin_internals_factory.h",
     "signin/account_consistency_mode_manager.cc",
     "signin/account_consistency_mode_manager.h",
+    "signin/account_consistency_mode_manager_factory.cc",
+    "signin/account_consistency_mode_manager_factory.h",
     "signin/account_fetcher_service_factory.cc",
     "signin/account_fetcher_service_factory.h",
     "signin/account_investigator_factory.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 8ad7262..599e695 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1106,12 +1106,6 @@
      arraysize(kWebXrRenderPathChoiceSharedBuffer), nullptr}};
 #endif  // defined(OS_ANDROID) && BUILDFLAG(ENABLE_VR)
 
-const FeatureEntry::FeatureParam kUnifiedConsentShowBump[] = {
-    {unified_consent::kUnifiedConsentShowBumpParameter, "true"}};
-const FeatureEntry::FeatureVariation kUnifiedConsentVariations[] = {
-    {"(with consent bump)", kUnifiedConsentShowBump,
-     arraysize(kUnifiedConsentShowBump), nullptr}};
-
 const FeatureEntry::FeatureParam kSimplifyHttpsIndicatorEvToSecure[] = {
     {OmniboxFieldTrial::kSimplifyHttpsIndicatorParameterName,
      OmniboxFieldTrial::kSimplifyHttpsIndicatorParameterEvToSecure}};
@@ -3710,14 +3704,7 @@
 
     {"unified-consent", flag_descriptions::kUnifiedConsentName,
      flag_descriptions::kUnifiedConsentDescription, kOsAll,
-     FEATURE_WITH_PARAMS_VALUE_TYPE(unified_consent::kUnifiedConsent,
-                                    kUnifiedConsentVariations,
-                                    "UnifiedConsent")},
-
-    {"force-unified-consent-bump",
-     flag_descriptions::kForceUnifiedConsentBumpName,
-     flag_descriptions::kForceUnifiedConsentBumpDescription, kOsAll,
-     FEATURE_VALUE_TYPE(unified_consent::kForceUnifiedConsentBump)},
+     FEATURE_VALUE_TYPE(unified_consent::kUnifiedConsent)},
 
     {"simplify-https-indicator", flag_descriptions::kSimplifyHttpsIndicatorName,
      flag_descriptions::kSimplifyHttpsIndicatorDescription, kOsDesktop,
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index 7e23c44..d115c07 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -692,7 +692,7 @@
   AccountInfo primary_account =
       AddAccountToProfile(kAccountId, profile, /*is_primary=*/true);
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
-  identity::SetAccountWithRefreshTokenInPersistentErrorState(
+  identity::UpdatePersistentErrorOfRefreshTokenForAccount(
       identity_manager, primary_account.account_id,
       GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
           GoogleServiceAuthError::InvalidGaiaCredentialsReason::
diff --git a/chrome/browser/browsing_data/counters/browsing_data_counter_utils_browsertest.cc b/chrome/browser/browsing_data/counters/browsing_data_counter_utils_browsertest.cc
index 7ac6090..c31e75fe 100644
--- a/chrome/browser/browsing_data/counters/browsing_data_counter_utils_browsertest.cc
+++ b/chrome/browser/browsing_data/counters/browsing_data_counter_utils_browsertest.cc
@@ -43,7 +43,7 @@
 #endif
         scoped_unified_consent_(
             GetParam()
-                ? unified_consent::UnifiedConsentFeatureState::kEnabledNoBump
+                ? unified_consent::UnifiedConsentFeatureState::kEnabled
                 : unified_consent::UnifiedConsentFeatureState::kDisabled) {
   }
   ~BrowsingDataCounterUtilsBrowserTest() override = default;
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_context.cc b/chrome/browser/chromeos/arc/auth/arc_auth_context.cc
index d1ebcb4..efccbc7 100644
--- a/chrome/browser/chromeos/arc/auth/arc_auth_context.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_auth_context.cc
@@ -104,8 +104,7 @@
 }
 
 void ArcAuthContext::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   // There is no need to check |is_valid| here. It is intended to avoid
   // adding the ability to query the persistent error state to the
   // IdentityManager API, which is irrelevant for this case.
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_context.h b/chrome/browser/chromeos/arc/auth/arc_auth_context.h
index 594db4c7..c04e542 100644
--- a/chrome/browser/chromeos/arc/auth/arc_auth_context.h
+++ b/chrome/browser/chromeos/arc/auth/arc_auth_context.h
@@ -51,8 +51,8 @@
       identity::AccessTokenFetcher::TokenCallback callback);
 
   // identity::IdentityManager::Observer:
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokensLoaded() override;
 
   // UbertokenConsumer:
diff --git a/chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc b/chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc
index 41670aa..7b9b14e 100644
--- a/chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc
+++ b/chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc
@@ -100,8 +100,7 @@
 }
 
 void ArcAndroidManagementChecker::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   if (account_info.account_id != device_account_id_)
     return;
   OnRefreshTokensLoaded();
diff --git a/chrome/browser/chromeos/arc/policy/arc_android_management_checker.h b/chrome/browser/chromeos/arc/policy/arc_android_management_checker.h
index f7542bc..168684c 100644
--- a/chrome/browser/chromeos/arc/policy/arc_android_management_checker.h
+++ b/chrome/browser/chromeos/arc/policy/arc_android_management_checker.h
@@ -43,8 +43,8 @@
   void EnsureRefreshTokenLoaded();
 
   // identity::IdentityManager::Observer:
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokensLoaded() override;
 
   // Unowned pointers.
diff --git a/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.cc b/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.cc
index e4fa1048..9d4135c 100644
--- a/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.cc
+++ b/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.cc
@@ -200,8 +200,7 @@
 }
 
 void ChromeCryptAuthService::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   OnAuthenticationStateChanged();
 }
 
diff --git a/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.h b/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.h
index 990c529..8931e18 100644
--- a/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.h
+++ b/chrome/browser/chromeos/cryptauth/chrome_cryptauth_service.h
@@ -63,8 +63,8 @@
  private:
   // identity::IdentityManager::Observer:
   void OnPrimaryAccountSet(const AccountInfo& primary_account_info) override;
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
 
   void OnAuthenticationStateChanged();
   void PerformEnrollmentAndDeviceSyncIfPossible();
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
index 2a11a21845..a56fc72 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -703,6 +703,34 @@
 }
 
 ExtensionFunction::ResponseAction
+FileManagerPrivateInternalUnsharePathWithCrostiniFunction::Run() {
+  using extensions::api::file_manager_private_internal::
+      UnsharePathWithCrostini::Params;
+  const std::unique_ptr<Params> params(Params::Create(*args_));
+  EXTENSION_FUNCTION_VALIDATE(params);
+
+  Profile* profile = Profile::FromBrowserContext(browser_context());
+  const scoped_refptr<storage::FileSystemContext> file_system_context =
+      file_manager::util::GetFileSystemContextForRenderFrameHost(
+          profile, render_frame_host());
+  storage::FileSystemURL cracked =
+      file_system_context->CrackURL(GURL(params->url));
+  crostini::CrostiniSharePath::GetForProfile(profile)->UnsharePath(
+      crostini::kCrostiniDefaultVmName, cracked.path(),
+      base::BindOnce(
+          &FileManagerPrivateInternalUnsharePathWithCrostiniFunction::
+              UnsharePathCallback,
+          this));
+
+  return RespondLater();
+}
+
+void FileManagerPrivateInternalUnsharePathWithCrostiniFunction::
+    UnsharePathCallback(bool success, std::string failure_reason) {
+  Respond(success ? NoArguments() : Error(failure_reason));
+}
+
+ExtensionFunction::ResponseAction
 FileManagerPrivateInternalGetCrostiniSharedPathsFunction::Run() {
   Profile* profile = Profile::FromBrowserContext(browser_context());
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
index 89aeb7c..95af4da 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
@@ -324,6 +324,27 @@
       FileManagerPrivateInternalSharePathsWithCrostiniFunction);
 };
 
+// Implements the chrome.fileManagerPrivate.unsharePathWithCrostini
+// method.  Unshares specified path.
+class FileManagerPrivateInternalUnsharePathWithCrostiniFunction
+    : public UIThreadExtensionFunction {
+ public:
+  DECLARE_EXTENSION_FUNCTION(
+      "fileManagerPrivateInternal.unsharePathWithCrostini",
+      FILEMANAGERPRIVATEINTERNAL_UNSHAREPATHWITHCROSTINI)
+  FileManagerPrivateInternalUnsharePathWithCrostiniFunction() = default;
+
+ protected:
+  ~FileManagerPrivateInternalUnsharePathWithCrostiniFunction() override =
+      default;
+
+ private:
+  ResponseAction Run() override;
+  void UnsharePathCallback(bool success, std::string failure_reason);
+  DISALLOW_COPY_AND_ASSIGN(
+      FileManagerPrivateInternalUnsharePathWithCrostiniFunction);
+};
+
 // Implements the chrome.fileManagerPrivate.getCrostiniSharedPaths
 // method.  Returns list of file entries.
 class FileManagerPrivateInternalGetCrostiniSharedPathsFunction
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
index a937d89..5ad6f08 100644
--- a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
@@ -401,8 +401,6 @@
     command_line_->GetProcessCommandLine()->InitFromArgv({""});
     SetUpCommandLine(command_line_->GetProcessCommandLine());
 
-    SetUpStylusAvailability();
-
     std::unique_ptr<chromeos::DBusThreadManagerSetter> dbus_setter =
         chromeos::DBusThreadManager::GetSetterForTesting();
     dbus_setter->SetPowerManagerClient(
@@ -410,6 +408,8 @@
 
     BrowserWithTestWindowTest::SetUp();
 
+    SetUpStylusAvailability();
+
     session_manager_ = std::make_unique<session_manager::SessionManager>();
     session_manager_->SessionStarted();
     session_manager_->SetSessionState(
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_common.cc b/chrome/browser/chromeos/login/ui/login_display_host_common.cc
index 835742c..fd2428e 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_common.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_common.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/login/ui/login_display_host_common.h"
 
+#include "base/bind_helpers.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/login/app_launch_controller.h"
@@ -13,6 +14,7 @@
 #include "chrome/browser/chromeos/login/startup_utils.h"
 #include "chrome/browser/chromeos/mobile_config.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/system/device_disabling_manager.h"
 #include "chrome/browser/ui/ash/wallpaper_controller_client.h"
 #include "chrome/browser/ui/webui/chromeos/internet_detail_dialog.h"
@@ -258,6 +260,7 @@
   if (shutting_down_)
     return;
 
+  ProfileHelper::Get()->ClearSigninProfile(base::DoNothing());
   shutting_down_ = true;
   registrar_.RemoveAll();
   base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
diff --git a/chrome/browser/chromeos/oauth2_token_service_delegate.cc b/chrome/browser/chromeos/oauth2_token_service_delegate.cc
index 3e02ede..32798588 100644
--- a/chrome/browser/chromeos/oauth2_token_service_delegate.cc
+++ b/chrome/browser/chromeos/oauth2_token_service_delegate.cc
@@ -12,7 +12,6 @@
 #include "base/logging.h"
 #include "chrome/browser/chromeos/account_mapper_util.h"
 #include "chromeos/account_manager/account_manager.h"
-#include "components/signin/core/browser/signin_error_controller.h"
 #include "content/public/browser/network_service_instance.h"
 #include "google_apis/gaia/oauth2_access_token_fetcher_immediate_error.h"
 #include "net/base/backoff_entry.h"
@@ -41,53 +40,12 @@
 
 }  // namespace
 
-class ChromeOSOAuth2TokenServiceDelegate::AccountErrorStatus
-    : public SigninErrorController::AuthStatusProvider {
- public:
-  AccountErrorStatus(SigninErrorController* signin_error_controller,
-                     const std::string& account_id)
-      : signin_error_controller_(signin_error_controller),
-        account_id_(account_id) {
-    signin_error_controller_->AddProvider(this);
-  }
-
-  ~AccountErrorStatus() override {
-    signin_error_controller_->RemoveProvider(this);
-  }
-
-  // SigninErrorController::AuthStatusProvider overrides.
-  std::string GetAccountId() const override { return account_id_; }
-
-  GoogleServiceAuthError GetAuthStatus() const override {
-    return last_auth_error_;
-  }
-
-  void SetLastAuthError(const GoogleServiceAuthError& error) {
-    last_auth_error_ = error;
-    signin_error_controller_->AuthStatusChanged();
-  }
-
- private:
-  // A non-owning pointer to |SigninErrorController|.
-  SigninErrorController* const signin_error_controller_;
-
-  // The account id being tracked by |this| instance of |AccountErrorStatus|.
-  const std::string account_id_;
-
-  // The last auth error seen for |account_id_|.
-  GoogleServiceAuthError last_auth_error_;
-
-  DISALLOW_COPY_AND_ASSIGN(AccountErrorStatus);
-};
-
 ChromeOSOAuth2TokenServiceDelegate::ChromeOSOAuth2TokenServiceDelegate(
     AccountTrackerService* account_tracker_service,
-    chromeos::AccountManager* account_manager,
-    SigninErrorController* signin_error_controller)
+    chromeos::AccountManager* account_manager)
     : account_mapper_util_(
           std::make_unique<AccountMapperUtil>(account_tracker_service)),
       account_manager_(account_manager),
-      signin_error_controller_(signin_error_controller),
       backoff_entry_(&kBackoffPolicy),
       backoff_error_(GoogleServiceAuthError::NONE),
       weak_factory_(this) {
@@ -113,12 +71,12 @@
   // We will reject the request if we are facing a persistent error for this
   // account.
   auto it = errors_.find(account_id);
-  if (it != errors_.end() && it->second->GetAuthStatus().IsPersistentError()) {
+  if (it != errors_.end() && it->second.last_auth_error.IsPersistentError()) {
     VLOG(1) << "Request for token has been rejected due to persistent error #"
-            << it->second->GetAuthStatus().state();
+            << it->second.last_auth_error.state();
     // |OAuth2TokenService| will manage the lifetime of this pointer.
     return new OAuth2AccessTokenFetcherImmediateError(
-        consumer, it->second->GetAuthStatus());
+        consumer, it->second.last_auth_error);
   }
   // Or when we need to backoff.
   if (backoff_entry_.ShouldRejectRequest()) {
@@ -160,22 +118,16 @@
   }
 
   auto it = errors_.find(account_id);
-  if (error.state() == GoogleServiceAuthError::NONE) {
-    // If the error status is NONE, and we were not tracking any error anyways,
-    // just ignore the update.
-    // Otherwise, delete the error tracking for this account.
-    if (it != errors_.end()) {
+  if ((it != errors_.end())) {
+    // Update the existing error.
+    if (error.state() == GoogleServiceAuthError::NONE)
       errors_.erase(it);
-      FireAuthErrorChanged(account_id, error);
-    }
-  } else if ((it == errors_.end()) || (it->second->GetAuthStatus() != error)) {
-    // Error status is not NONE. We need to start tracking the account / update
-    // the last seen error, if it is different.
-    if (it == errors_.end()) {
-      errors_.emplace(account_id, std::make_unique<AccountErrorStatus>(
-                                      signin_error_controller_, account_id));
-    }
-    errors_[account_id]->SetLastAuthError(error);
+    else
+      it->second.last_auth_error = error;
+    FireAuthErrorChanged(account_id, error);
+  } else if (error.state() != GoogleServiceAuthError::NONE) {
+    // Add a new error.
+    errors_.emplace(account_id, AccountErrorStatus{error});
     FireAuthErrorChanged(account_id, error);
   }
 }
@@ -184,7 +136,7 @@
     const std::string& account_id) const {
   auto it = errors_.find(account_id);
   if (it != errors_.end()) {
-    return it->second->GetAuthStatus();
+    return it->second.last_auth_error;
   }
 
   return GoogleServiceAuthError::AuthErrorNone();
diff --git a/chrome/browser/chromeos/oauth2_token_service_delegate.h b/chrome/browser/chromeos/oauth2_token_service_delegate.h
index ce5907d..b705ace 100644
--- a/chrome/browser/chromeos/oauth2_token_service_delegate.h
+++ b/chrome/browser/chromeos/oauth2_token_service_delegate.h
@@ -19,7 +19,6 @@
 #include "services/network/public/cpp/network_connection_tracker.h"
 
 class AccountTrackerService;
-class SigninErrorController;
 
 namespace chromeos {
 
@@ -30,15 +29,13 @@
       public AccountManager::Observer,
       public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
-  // Accepts non-owning pointers to |AccountTrackerService|, |AccountManager|
-  // and |SigninErrorController|. |AccountTrackerService| and
-  // |SigninErrorController| are |KeyedService|s. |AccountManager| transitively
-  // belongs to |g_browser_process|. They outlive (as they must) |this|
-  // delegate.
+  // Accepts non-owning pointers to |AccountTrackerService| and
+  // |AccountManager|. |AccountTrackerService| is a |KeyedService|.
+  // |AccountManager| transitively belongs to |g_browser_process|. They outlive
+  // (as they must) |this| delegate.
   ChromeOSOAuth2TokenServiceDelegate(
       AccountTrackerService* account_tracker_service,
-      AccountManager* account_manager,
-      SigninErrorController* signin_error_controller);
+      AccountManager* account_manager);
   ~ChromeOSOAuth2TokenServiceDelegate() override;
 
   // OAuth2TokenServiceDelegate overrides.
@@ -75,10 +72,10 @@
                            BackOffIsResetOnNetworkChange);
 
   // A utility class to keep track of |GoogleServiceAuthError|s for an account.
-  // This is used for providing account error status reports to
-  // |SigninErrorController| and for firing
-  // |OAuth2TokenService::Observer::OnAuthErrorChanged|.
-  class AccountErrorStatus;
+  struct AccountErrorStatus {
+    // The last auth error seen.
+    GoogleServiceAuthError last_auth_error;
+  };
 
   // Callback handler for |AccountManager::GetAccounts|.
   void GetAccountsCallback(
@@ -90,14 +87,11 @@
   // throughout the lifetime of a user session.
   AccountManager* account_manager_;
 
-  // A non-owning pointer to |SigninErrorController|.
-  SigninErrorController* const signin_error_controller_;
-
   // A cache of AccountKeys.
   std::set<AccountManager::AccountKey> account_keys_;
 
   // A map from account id to the last seen error for that account.
-  std::map<std::string, std::unique_ptr<AccountErrorStatus>> errors_;
+  std::map<std::string, AccountErrorStatus> errors_;
 
   // Used to rate-limit token fetch requests so as to not overload the server.
   net::BackoffEntry backoff_entry_;
diff --git a/chrome/browser/chromeos/oauth2_token_service_delegate_unittest.cc b/chrome/browser/chromeos/oauth2_token_service_delegate_unittest.cc
index 0077381..035efd74 100644
--- a/chrome/browser/chromeos/oauth2_token_service_delegate_unittest.cc
+++ b/chrome/browser/chromeos/oauth2_token_service_delegate_unittest.cc
@@ -17,7 +17,6 @@
 #include "chromeos/account_manager/account_manager.h"
 #include "components/signin/core/browser/account_info.h"
 #include "components/signin/core/browser/account_tracker_service.h"
-#include "components/signin/core/browser/signin_error_controller.h"
 #include "components/signin/core/browser/signin_pref_names.h"
 #include "components/signin/core/browser/test_signin_client.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
@@ -107,43 +106,13 @@
   std::vector<std::vector<std::string>> batch_change_records_;
 };
 
-class SigninErrorObserver : public SigninErrorController::Observer {
- public:
-  explicit SigninErrorObserver(SigninErrorController* signin_error_controller)
-      : signin_error_controller_(signin_error_controller) {
-    signin_error_controller_->AddObserver(this);
-  }
-
-  ~SigninErrorObserver() override {
-    signin_error_controller_->RemoveObserver(this);
-  }
-
-  // |SigninErrorController::Observer| overrides.
-  void OnErrorChanged() override {
-    last_err_account_id_ = signin_error_controller_->error_account_id();
-    last_err_ = signin_error_controller_->auth_error();
-  }
-
-  std::string last_err_account_id_;
-  GoogleServiceAuthError last_err_ = GoogleServiceAuthError::AuthErrorNone();
-
- private:
-  // Non-owning pointer to |SigninErrorController|.
-  SigninErrorController* const signin_error_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(SigninErrorObserver);
-};
-
 }  // namespace
 
 class CrOSOAuthDelegateTest : public testing::Test {
  public:
   CrOSOAuthDelegateTest()
       : scoped_task_environment_(
-            base::test::ScopedTaskEnvironment::MainThreadType::UI),
-        signin_error_controller_(
-            SigninErrorController::AccountMode::ANY_ACCOUNT),
-        signin_error_observer_(&signin_error_controller_) {}
+            base::test::ScopedTaskEnvironment::MainThreadType::UI) {}
   ~CrOSOAuthDelegateTest() override = default;
 
  protected:
@@ -168,8 +137,7 @@
     gaia_account_key_ = {account_info_.gaia, ACCOUNT_TYPE_GAIA};
 
     delegate_ = std::make_unique<ChromeOSOAuth2TokenServiceDelegate>(
-        &account_tracker_service_, &account_manager_,
-        &signin_error_controller_);
+        &account_tracker_service_, &account_manager_);
     delegate_->LoadCredentials(
         account_info_.account_id /* primary_account_id */);
   }
@@ -216,8 +184,6 @@
   AccountManager::AccountKey gaia_account_key_;
   AccountTrackerService account_tracker_service_;
   AccountManager account_manager_;
-  SigninErrorController signin_error_controller_;
-  SigninErrorObserver signin_error_observer_;
   std::unique_ptr<ChromeOSOAuth2TokenServiceDelegate> delegate_;
   AccountManager::DelayNetworkCallRunner immediate_callback_runner_ =
       base::BindRepeating(
@@ -336,7 +302,7 @@
 
   // Register callbacks before AccountManager has been fully initialized.
   auto delegate = std::make_unique<ChromeOSOAuth2TokenServiceDelegate>(
-      &account_tracker_service_, &account_manager, &signin_error_controller_);
+      &account_tracker_service_, &account_manager);
   delegate->LoadCredentials(account1.account_id /* primary_account_id */);
   TokenServiceObserver observer;
   delegate->AddObserver(&observer);
@@ -416,29 +382,20 @@
   auto error =
       GoogleServiceAuthError(GoogleServiceAuthError::State::SERVICE_ERROR);
 
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_observer_.last_err_);
   delegate_->UpdateAuthError(account_info_.account_id, error);
 
   EXPECT_EQ(error, delegate_->GetAuthError(account_info_.account_id));
-  EXPECT_EQ(account_info_.account_id,
-            signin_error_observer_.last_err_account_id_);
-  EXPECT_EQ(error, signin_error_observer_.last_err_);
 }
 
 TEST_F(CrOSOAuthDelegateTest, TransientErrorsAreNotShown) {
   auto transient_error = GoogleServiceAuthError(
       GoogleServiceAuthError::State::SERVICE_UNAVAILABLE);
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_observer_.last_err_);
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             delegate_->GetAuthError(account_info_.account_id));
 
   delegate_->UpdateAuthError(account_info_.account_id, transient_error);
 
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_observer_.last_err_);
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             delegate_->GetAuthError(account_info_.account_id));
 }
 
diff --git a/chrome/browser/chromeos/profiles/profile_helper.cc b/chrome/browser/chromeos/profiles/profile_helper.cc
index b558862..e74d0a2 100644
--- a/chrome/browser/chromeos/profiles/profile_helper.cc
+++ b/chrome/browser/chromeos/profiles/profile_helper.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/profiles/profiles_state.h"
+#include "chrome/browser/ui/browser_list.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
 #include "chromeos/chromeos_constants.h"
@@ -52,6 +53,11 @@
       user_id_hash != chrome::kTestUserProfileDir;
 }
 
+void WrapAsBrowsersCloseCallback(const base::RepeatingClosure& callback,
+                                 const base::FilePath& path) {
+  callback.Run();
+}
+
 class UsernameHashMatcher {
  public:
   explicit UsernameHashMatcher(const std::string& h) : username_hash(h) {}
@@ -286,7 +292,7 @@
     return;
   }
   on_clear_profile_stage_finished_ =
-      base::BarrierClosure(2, base::Bind(&ProfileHelper::OnSigninProfileCleared,
+      base::BarrierClosure(3, base::Bind(&ProfileHelper::OnSigninProfileCleared,
                                          weak_factory_.GetWeakPtr()));
   LOG_ASSERT(!browsing_data_remover_);
   browsing_data_remover_ =
@@ -302,6 +308,16 @@
   login::SigninPartitionManager::Factory::GetForBrowserContext(
       GetSigninProfile())
       ->CloseCurrentSigninSession(on_clear_profile_stage_finished_);
+
+  BrowserList::CloseAllBrowsersWithProfile(
+      GetSigninProfile(),
+      base::BindRepeating(
+          &WrapAsBrowsersCloseCallback,
+          on_clear_profile_stage_finished_) /* on_close_success */,
+      base::BindRepeating(
+          &WrapAsBrowsersCloseCallback,
+          on_clear_profile_stage_finished_) /* on_close_aborted */,
+      true /* skip_beforeunload */);
 }
 
 Profile* ProfileHelper::GetProfileByAccountId(const AccountId& account_id) {
diff --git a/chrome/browser/extensions/api/identity/identity_api.cc b/chrome/browser/extensions/api/identity/identity_api.cc
index 6329e42..cad20ee 100644
--- a/chrome/browser/extensions/api/identity/identity_api.cc
+++ b/chrome/browser/extensions/api/identity/identity_api.cc
@@ -171,8 +171,7 @@
 }
 
 void IdentityAPI::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   // Refresh tokens are sometimes made available in contexts where
   // AccountTrackerService is not tracking the account in question (one example
   // is SupervisedUserService::InitSync()). Bail out in these cases.
diff --git a/chrome/browser/extensions/api/identity/identity_api.h b/chrome/browser/extensions/api/identity/identity_api.h
index 5cde6ca..88aa6091 100644
--- a/chrome/browser/extensions/api/identity/identity_api.h
+++ b/chrome/browser/extensions/api/identity/identity_api.h
@@ -133,8 +133,8 @@
   static const bool kServiceIsNULLWhileTesting = true;
 
   // identity::IdentityManager::Observer:
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
 
   // AccountTrackerService::Observer:
   // NOTE: This class listens for signout events via this callback (which itself
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index eca2a58..5281484 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1983,11 +1983,6 @@
     "features. This includes new confirmation screens and improved settings "
     "pages.";
 
-const char kForceUnifiedConsentBumpName[] = "Force Unified Consent Bump";
-const char kForceUnifiedConsentBumpDescription[] =
-    "Force the unified consent bump UI to be shown on every start-up. This "
-    "flag is for debug purpose, to test the UI.";
-
 const char kUiPartialSwapName[] = "Partial swap";
 const char kUiPartialSwapDescription[] = "Sets partial swap behavior.";
 
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 5127389..38a93ff 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1188,9 +1188,6 @@
 extern const char kUnifiedConsentName[];
 extern const char kUnifiedConsentDescription[];
 
-extern const char kForceUnifiedConsentBumpName[];
-extern const char kForceUnifiedConsentBumpDescription[];
-
 extern const char kUiPartialSwapName[];
 extern const char kUiPartialSwapDescription[];
 
diff --git a/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.cc b/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.cc
index 23a5a27..4b9d048 100644
--- a/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.cc
+++ b/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.cc
@@ -137,8 +137,7 @@
 }
 
 void DesktopProfileSessionDurationsService::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   DVLOG(1) << __func__;
   HandleSyncAndAccountChange();
 }
diff --git a/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.h b/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.h
index 8db368c9..04e6e0e 100644
--- a/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.h
+++ b/chrome/browser/metrics/desktop_session_duration/desktop_profile_session_durations_service.h
@@ -48,8 +48,8 @@
   void OnStateChanged(syncer::SyncService* sync) override;
 
   // IdentityManager::Observer:
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
   void OnRefreshTokensLoaded() override;
 
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc
index 1f8e24db..ecc8351 100644
--- a/chrome/browser/metrics/ukm_browsertest.cc
+++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -158,7 +158,7 @@
 #endif
         scoped_unified_consent_(
             is_unified_consent_enabled
-                ? unified_consent::UnifiedConsentFeatureState::kEnabledNoBump
+                ? unified_consent::UnifiedConsentFeatureState::kEnabled
                 : unified_consent::UnifiedConsentFeatureState::kDisabled) {
   }
 
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc
index 1c982f9..a65063b 100644
--- a/chrome/browser/net/profile_network_context_service.cc
+++ b/chrome/browser/net/profile_network_context_service.cc
@@ -33,12 +33,14 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/network_service_instance.h"
+#include "content/public/browser/shared_cors_origin_access_list.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/service_names.mojom.h"
 #include "content/public/common/url_constants.h"
 #include "mojo/public/cpp/bindings/associated_interface_ptr.h"
 #include "net/http/http_util.h"
 #include "net/net_buildflags.h"
+#include "services/network/public/cpp/cors/origin_access_list.h"
 #include "services/network/public/cpp/features.h"
 
 #if defined(OS_CHROMEOS)
@@ -486,6 +488,14 @@
   }
 #endif
 
+  if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+    // Should be initialized with existing per-profile CORS access lists.
+    network_context_params->cors_origin_access_list =
+        content::BrowserContext::GetSharedCorsOriginAccessList(profile_)
+            ->GetOriginAccessList()
+            .CreateCorsOriginAccessPatternsList();
+  }
+
   return network_context_params;
 }
 
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service.cc b/chrome/browser/policy/cloud/user_policy_signin_service.cc
index 82379d7..02f69a6 100644
--- a/chrome/browser/policy/cloud/user_policy_signin_service.cc
+++ b/chrome/browser/policy/cloud/user_policy_signin_service.cc
@@ -139,8 +139,7 @@
 }
 
 void UserPolicySigninService::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   // Ignore OAuth tokens or those for any account but the primary one.
   if (account_info.account_id != identity_manager()->GetPrimaryAccountId())
     return;
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service.h b/chrome/browser/policy/cloud/user_policy_signin_service.h
index ed33c9e..55301ef6 100644
--- a/chrome/browser/policy/cloud/user_policy_signin_service.h
+++ b/chrome/browser/policy/cloud/user_policy_signin_service.h
@@ -62,8 +62,8 @@
   // identity::IdentityManager::Observer implementation:
   // UserPolicySigninServiceBase is already an observer of IdentityManager.
   void OnPrimaryAccountSet(const AccountInfo& account_info) override;
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
 
   // CloudPolicyService::Observer implementation:
   void OnCloudPolicyServiceInitializationCompleted() override;
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index faca3ff..1cc6329 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -698,6 +698,9 @@
   { key::kNTLMShareAuthenticationEnabled,
     prefs::kNTLMShareAuthenticationEnabled,
     base::Value::Type::BOOLEAN },
+  { key::kPrintingSendUsernameAndFilenameEnabled,
+    prefs::kPrintingSendUsernameAndFilenameEnabled,
+    base::Value::Type::BOOLEAN },
 #endif  // defined(OS_CHROMEOS)
 
 // Metrics reporting is controlled by a platform specific policy for ChromeOS
diff --git a/chrome/browser/previews/previews_lite_page_browsertest.cc b/chrome/browser/previews/previews_lite_page_browsertest.cc
index bd8ad51a..518a8036 100644
--- a/chrome/browser/previews/previews_lite_page_browsertest.cc
+++ b/chrome/browser/previews/previews_lite_page_browsertest.cc
@@ -115,12 +115,12 @@
   }
 
   void SetUp() override {
-    SetUpLitePageTest(false /* use_timeout */);
+    SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
 
     InProcessBrowserTest::SetUp();
   }
 
-  void SetUpLitePageTest(bool use_timeout) {
+  void SetUpLitePageTest(bool use_timeout, bool is_control) {
     https_server_ = std::make_unique<net::EmbeddedTestServer>(
         net::EmbeddedTestServer::TYPE_HTTPS);
     https_server_->ServeFilesFromSourceDirectory("chrome/test/data");
@@ -191,7 +191,8 @@
           {"blacklisted_path_suffixes", ".mp4,.jpg"},
           {"trigger_on_localhost", "true"},
           {"navigation_timeout_milliseconds",
-           use_timeout ? base::IntToString(kTimeoutMs) : "0"}};
+           use_timeout ? base::IntToString(kTimeoutMs) : "0"},
+          {"control_group", is_control ? "true" : "false"}};
       base::FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
           "TrialName1", "GroupName1", feature_parameters);
 
@@ -244,6 +245,17 @@
     return GetWebContents()->GetController().GetVisibleEntry()->GetURL();
   }
 
+  void VerifyInfoStatus(
+      previews::PreviewsUserData::ServerLitePageStatus status) {
+    PreviewsUITabHelper* ui_tab_helper =
+        PreviewsUITabHelper::FromWebContents(GetWebContents());
+    previews::PreviewsUserData* previews_data =
+        ui_tab_helper->previews_user_data();
+
+    EXPECT_TRUE(previews_data->server_lite_page_info());
+    EXPECT_EQ(previews_data->server_lite_page_info()->status, status);
+  }
+
   void VerifyPreviewLoaded() const {
     // The Virtual URL is set in a WebContentsObserver::OnFinishNavigation.
     // Since |ui_test_utils::NavigationToURL| uses the same signal to stop
@@ -545,8 +557,7 @@
         break;
       case kRedirect:
         response->set_code(net::HTTP_TEMPORARY_REDIRECT);
-        response->AddCustomHeader("Location",
-                                  HttpsLitePageURL(kSuccess).spec());
+        response->AddCustomHeader("Location", HttpLitePageURL(kSuccess).spec());
         break;
       case kBypass:
         response->set_code(net::HTTP_TEMPORARY_REDIRECT);
@@ -643,6 +654,8 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
     VerifyPreviewLoaded();
+    VerifyInfoStatus(
+        previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
                                        true, 1);
   }
@@ -779,9 +792,11 @@
                        DISABLE_ON_WIN_MAC(LitePagePreviewsReload)) {
   ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
   VerifyPreviewLoaded();
+  VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
 
   GetWebContents()->GetController().Reload(content::ReloadType::NORMAL, false);
   VerifyPreviewLoaded();
+  VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
 
   // Set the ECT so that a preview won't be triggered on the reload.
   g_browser_process->network_quality_tracker()
@@ -801,6 +816,7 @@
                        DISABLE_ON_WIN_MAC(LitePagePreviewsLoadOriginal)) {
   ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
   VerifyPreviewLoaded();
+  VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
 
   PreviewsUITabHelper::FromWebContents(GetWebContents())
       ->ReloadWithoutPreviews();
@@ -814,6 +830,8 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), redirect_url());
     VerifyPreviewLoaded();
+    VerifyInfoStatus(
+        previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
                                        true, 1);
   }
@@ -823,6 +841,8 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), https_redirect_url());
     VerifyPreviewLoaded();
+    VerifyInfoStatus(
+        previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
                                        true, 1);
   }
@@ -832,6 +852,8 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kRedirect));
     VerifyPreviewNotLoaded();
+    VerifyInfoStatus(
+        previews::PreviewsUserData::ServerLitePageStatus::kRedirect);
     ClearDeciderState();
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
                                        true, 1);
@@ -849,6 +871,7 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kBypass));
     VerifyPreviewNotLoaded();
+    VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kBypass);
     ClearDeciderState();
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
                                        true, 1);
@@ -868,6 +891,7 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kHostBlacklist));
     VerifyPreviewNotLoaded();
+    VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kBypass);
 
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
                                        true, 1);
@@ -897,6 +921,7 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kAuthFailure));
     VerifyPreviewNotLoaded();
+    VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
     ClearDeciderState();
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
                                        true, 1);
@@ -912,6 +937,7 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kLoadshed));
     VerifyPreviewNotLoaded();
+    VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
     ClearDeciderState();
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
                                        true, 1);
@@ -1021,7 +1047,7 @@
   ~PreviewsLitePageServerTimeoutBrowserTest() override = default;
 
   void SetUp() override {
-    SetUpLitePageTest(true /* use_timeout */);
+    SetUpLitePageTest(true /* use_timeout */, false /* is_control */);
 
     InProcessBrowserTest::SetUp();
   }
@@ -1036,6 +1062,7 @@
     ui_test_utils::NavigateToURL(browser(),
                                  HttpsLitePageURL(kSuccess, nullptr, -1));
     VerifyPreviewNotLoaded();
+    VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
     ClearDeciderState();
     histogram_tester.ExpectBucketCount(
         "Previews.ServerLitePage.ServerResponse",
@@ -1079,6 +1106,7 @@
     base::HistogramTester histogram_tester;
     ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
     VerifyPreviewNotLoaded();
+    VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
     ClearDeciderState();
 
     histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
@@ -1159,7 +1187,7 @@
   ~PreviewsLitePageNotificationDSEnabledBrowserTest() override = default;
 
   void SetUp() override {
-    SetUpLitePageTest(false /* use_timeout */);
+    SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
 
     InProcessBrowserTest::SetUp();
   }
@@ -1210,7 +1238,7 @@
   ~PreviewsLitePageNotificationDSDisabledBrowserTest() override = default;
 
   void SetUp() override {
-    SetUpLitePageTest(false /* use_timeout */);
+    SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
 
     InProcessBrowserTest::SetUp();
   }
@@ -1246,3 +1274,25 @@
   ClearDeciderState();
   EXPECT_EQ(0U, GetInfoBarService()->infobar_count());
 }
+
+class PreviewsLitePageControlBrowserTest
+    : public PreviewsLitePageServerBrowserTest {
+ public:
+  PreviewsLitePageControlBrowserTest() = default;
+
+  ~PreviewsLitePageControlBrowserTest() override = default;
+
+  void SetUp() override {
+    SetUpLitePageTest(false /* use_timeout */, true /* is_control */);
+
+    InProcessBrowserTest::SetUp();
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(PreviewsLitePageControlBrowserTest,
+                       DISABLE_ON_WIN_MAC(LitePagePreviewsControlGroup)) {
+  ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
+  VerifyPreviewNotLoaded();
+  VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kControl);
+  ClearDeciderState();
+}
diff --git a/chrome/browser/previews/previews_lite_page_navigation_throttle.cc b/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
index 335f475..39908bb 100644
--- a/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
+++ b/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
@@ -92,41 +92,6 @@
   return url_params;
 }
 
-// Gets the ServerLitePageInfo struct from an existing attempted lite page
-// navigation, if there is one. If not, returns nullptr.
-std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo>
-GetServerLitePageInfo(content::NavigationHandle* handle) {
-  PreviewsUITabHelper* ui_tab_helper =
-      PreviewsUITabHelper::FromWebContents(handle->GetWebContents());
-  if (!ui_tab_helper)
-    return nullptr;
-
-  previews::PreviewsUserData* previews_data =
-      ui_tab_helper->GetPreviewsUserData(handle);
-  if (!previews_data)
-    return nullptr;
-
-  if (!previews_data->server_lite_page_info())
-    return nullptr;
-
-  return std::make_unique<previews::PreviewsUserData::ServerLitePageInfo>(
-      *previews_data->server_lite_page_info());
-}
-
-// Gets the ServerLitePageInfo struct from an existing attempted lite page
-// navigation, if there is one. If not, returns a new ServerLitePageInfo
-// initialized with |handle| that is not associated with a PreviewsUserData.
-std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo>
-GetOrCreateServerLitePageInfo(content::NavigationHandle* handle) {
-  std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
-      GetServerLitePageInfo(handle);
-  if (!info) {
-    info = std::make_unique<previews::PreviewsUserData::ServerLitePageInfo>();
-    info->original_navigation_start = handle->NavigationStart();
-  }
-  return info;
-}
-
 }  // namespace
 
 class WebContentsLifetimeHelper
@@ -349,12 +314,21 @@
   if (!blacklist_reasons.empty())
     return false;
 
+  // This should always be at the end, but before the control group check.
   if (manager_->NeedsToNotifyUser()) {
     manager_->NotifyUser(navigation_handle()->GetWebContents());
     UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.IneligibleReasons",
                               IneligibleReason::kInfoBarNotSeen);
     return false;
   }
+
+  // This should always be last.
+  if (previews::params::IsInLitePageRedirectControl()) {
+    previews::PreviewsUserData::ServerLitePageInfo* info =
+        GetOrCreateServerLitePageInfo();
+    info->status = previews::PreviewsUserData::ServerLitePageStatus::kControl;
+    return false;
+  }
   return true;
 }
 
@@ -426,8 +400,8 @@
   content::BrowserContext* browser_context =
       navigation_handle()->GetWebContents()->GetBrowserContext();
 
-  std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
-      GetOrCreateServerLitePageInfo(navigation_handle());
+  previews::PreviewsUserData::ServerLitePageInfo* info =
+      GetOrCreateServerLitePageInfo();
 
   // Set DRP headers.
   DataReductionProxyChromeSettings* drp_settings =
@@ -444,22 +418,13 @@
 
   // Add in the page id to the chrome-proxy header.
   if (request_headers.HasHeader(kChromeProxyHeader)) {
-    // Persist some state in |info| so it can be used by metrics later on.
-    base::Optional<std::string> session_id =
-        data_reduction_proxy::DataReductionProxyRequestOptions::
-            GetSessionKeyFromRequestHeaders(request_headers);
-    if (session_id.has_value())
-      info->drp_session_key = session_id.value();
-    uint64_t page_id = manager_->GeneratePageID();
-    info->page_id = page_id;
-
     std::string header_value;
     request_headers.GetHeader(kChromeProxyHeader, &header_value);
 
     // 64 bit uint fits in 16 characters when represented in hexadecimal, but
     // there needs to be a trailing null terminated character in the buffer.
     char page_id_buffer[17];
-    base::strings::SafeSPrintf(page_id_buffer, "%x", page_id);
+    base::strings::SafeSPrintf(page_id_buffer, "%x", info->page_id);
     header_value += ", pid=" + std::string(page_id_buffer);
     request_headers.SetHeader(kChromeProxyHeader, header_value);
   }
@@ -475,6 +440,10 @@
   // load the original page.
   const base::TimeDelta timeout =
       previews::params::LitePagePreviewsNavigationTimeoutDuration();
+  std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo>
+      timed_out_info = info->Clone();
+  timed_out_info->status =
+      previews::PreviewsUserData::ServerLitePageStatus::kError;
   if (timeout > base::TimeDelta()) {
     base::PostDelayedTaskWithTraits(
         FROM_HERE, {content::BrowserThread::UI},
@@ -486,7 +455,7 @@
                 base::Unretained(web_contents), manager_,
                 MakeOpenURLParams(navigation_handle(),
                                   navigation_handle()->GetURL(), std::string()),
-                info->Clone(), false)),
+                std::move(timed_out_info), false)),
         timeout);
   }
 
@@ -539,7 +508,7 @@
                        helper->GetWeakPtr(),
                        MakeOpenURLParams(navigation_handle(),
                                          GURL(original_url), std::string()),
-                       GetOrCreateServerLitePageInfo(navigation_handle())));
+                       GetOrCreateServerLitePageInfo()->Clone()));
     return content::NavigationThrottle::CANCEL;
   }
 
@@ -569,6 +538,8 @@
     // it is pointing towards the original page, it is considered a bypass.
     // Otherwise it is just a forwarded bypass.
     if (GURL(original_url) == navigation_handle()->GetURL()) {
+      GetServerLitePageInfo()->status =
+          previews::PreviewsUserData::ServerLitePageStatus::kBypass;
       manager_->AddSingleBypass(navigation_handle()->GetURL().spec());
       UMA_HISTOGRAM_MEDIUM_TIMES(
           "Previews.ServerLitePage.HttpOnlyFallbackPenalty",
@@ -578,6 +549,8 @@
     } else {
       UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
                                 ServerResponse::kRedirect);
+      GetServerLitePageInfo()->status =
+          previews::PreviewsUserData::ServerLitePageStatus::kRedirect;
     }
 
     // Check if the original host should be blacklisted, as directed by the
@@ -614,17 +587,16 @@
 
   UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
                             ServerResponse::kFailed);
+  GetServerLitePageInfo()->status =
+      previews::PreviewsUserData::ServerLitePageStatus::kError;
 
   // The Preview was triggered but there was some irrecoverable issue (like
   // there is no network connection). Load the original page and let it go
   // through the normal process for whatever error it is.
-  std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
-      GetServerLitePageInfo(navigation_handle());
-  DCHECK(info);
   LoadAndBypass(
       navigation_handle()->GetWebContents(), manager_,
       MakeOpenURLParams(navigation_handle(), GURL(original_url), std::string()),
-      std::move(info), true);
+      GetServerLitePageInfo()->Clone(), true);
   return content::NavigationThrottle::CANCEL;
 }
 
@@ -659,6 +631,8 @@
 
     UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
                               ServerResponse::kOk);
+    GetOrCreateServerLitePageInfo()->status =
+        previews::PreviewsUserData::ServerLitePageStatus::kSuccess;
 
     return content::NavigationThrottle::PROCEED;
   }
@@ -689,16 +663,68 @@
                               ServerResponse::kOther);
   }
 
-  std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
-      GetServerLitePageInfo(navigation_handle());
-  DCHECK(info);
+  previews::PreviewsUserData::ServerLitePageInfo* info =
+      GetOrCreateServerLitePageInfo();
+  info->status = previews::PreviewsUserData::ServerLitePageStatus::kError;
   LoadAndBypass(
       navigation_handle()->GetWebContents(), manager_,
       MakeOpenURLParams(navigation_handle(), GURL(original_url), std::string()),
-      std::move(info), true);
+      info->Clone(), true);
   return content::NavigationThrottle::CANCEL;
 }
 
+previews::PreviewsUserData::ServerLitePageInfo*
+PreviewsLitePageNavigationThrottle::GetServerLitePageInfo() const {
+  PreviewsUITabHelper* ui_tab_helper = PreviewsUITabHelper::FromWebContents(
+      navigation_handle()->GetWebContents());
+  if (!ui_tab_helper)
+    return nullptr;
+
+  previews::PreviewsUserData* previews_data =
+      ui_tab_helper->GetPreviewsUserData(navigation_handle());
+  if (!previews_data)
+    return nullptr;
+
+  return previews_data->server_lite_page_info();
+}
+
+previews::PreviewsUserData::ServerLitePageInfo*
+PreviewsLitePageNavigationThrottle::GetOrCreateServerLitePageInfo() const {
+  PreviewsUITabHelper* ui_tab_helper = PreviewsUITabHelper::FromWebContents(
+      navigation_handle()->GetWebContents());
+  if (!ui_tab_helper)
+    return nullptr;
+
+  previews::PreviewsUserData* previews_data =
+      ui_tab_helper->GetPreviewsUserData(navigation_handle());
+  if (!previews_data)
+    return nullptr;
+
+  if (previews_data->server_lite_page_info()) {
+    return previews_data->server_lite_page_info();
+  }
+
+  previews_data->set_server_lite_page_info(
+      std::make_unique<previews::PreviewsUserData::ServerLitePageInfo>());
+
+  DataReductionProxyChromeSettings* drp_settings =
+      DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
+          navigation_handle()->GetWebContents()->GetBrowserContext());
+  base::Optional<std::string> session_id;
+  if (drp_settings) {
+    session_id = data_reduction_proxy::DataReductionProxyRequestOptions::
+        GetSessionKeyFromRequestHeaders(drp_settings->GetProxyRequestHeaders());
+  }
+
+  previews::PreviewsUserData::ServerLitePageInfo* info =
+      previews_data->server_lite_page_info();
+  info->original_navigation_start = navigation_handle()->NavigationStart();
+  if (session_id.has_value())
+    info->drp_session_key = session_id.value();
+  info->page_id = manager_->GeneratePageID();
+  return info;
+}
+
 const char* PreviewsLitePageNavigationThrottle::GetNameForLogging() {
   return "PreviewsLitePageNavigationThrottle";
 }
diff --git a/chrome/browser/previews/previews_lite_page_navigation_throttle.h b/chrome/browser/previews/previews_lite_page_navigation_throttle.h
index 5b02483..e531a84 100644
--- a/chrome/browser/previews/previews_lite_page_navigation_throttle.h
+++ b/chrome/browser/previews/previews_lite_page_navigation_throttle.h
@@ -138,6 +138,17 @@
   // method to return.
   content::NavigationThrottle::ThrottleCheckResult TriggerPreview() const;
 
+  // Gets the ServerLitePageInfo struct from an existing attempted lite page
+  // navigation, if there is one. If not, returns nullptr.
+  previews::PreviewsUserData::ServerLitePageInfo* GetServerLitePageInfo() const;
+
+  // Gets the ServerLitePageInfo struct from an existing attempted lite page
+  // navigation, if there is one. If not, returns a new ServerLitePageInfo
+  // initialized with metadata from navigation_handle() and |this| that is owned
+  // by the PreviewsUserData associated with navigation_handle().
+  previews::PreviewsUserData::ServerLitePageInfo*
+  GetOrCreateServerLitePageInfo() const;
+
   // content::NavigationThrottle implementation:
   content::NavigationThrottle::ThrottleCheckResult WillStartRequest() override;
   content::NavigationThrottle::ThrottleCheckResult WillRedirectRequest()
diff --git a/chrome/browser/printing/printing_init.cc b/chrome/browser/printing/printing_init.cc
index a35350f..69b288c0 100644
--- a/chrome/browser/printing/printing_init.cc
+++ b/chrome/browser/printing/printing_init.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/printing/printing_init.h"
 
+#include "chrome/common/chrome_content_client.h"
 #include "components/printing/browser/print_manager_utils.h"
 #include "content/public/browser/web_contents.h"
 #include "printing/buildflags/buildflags.h"
@@ -29,7 +30,7 @@
 #else
   printing::PrintViewManagerBasic::CreateForWebContents(web_contents);
 #endif  // BUILDFLAG(ENABLE_PRINT_PREVIEW)
-  CreateCompositeClientIfNeeded(web_contents);
+  CreateCompositeClientIfNeeded(web_contents, GetUserAgent());
 }
 
 }  // namespace printing
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 8d8f6ee..5fe0de9 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -65,6 +65,7 @@
 #include "chrome/browser/sessions/session_service_factory.h"
 #include "chrome/browser/sessions/tab_restore_service_factory.h"
 #include "chrome/browser/signin/about_signin_internals_factory.h"
+#include "chrome/browser/signin/account_consistency_mode_manager_factory.h"
 #include "chrome/browser/signin/account_fetcher_service_factory.h"
 #include "chrome/browser/signin/account_investigator_factory.h"
 #include "chrome/browser/signin/account_reconcilor_factory.h"
@@ -218,6 +219,7 @@
   }
 #endif
   AboutSigninInternalsFactory::GetInstance();
+  AccountConsistencyModeManagerFactory::GetInstance();
   AccountFetcherServiceFactory::GetInstance();
   AccountInvestigatorFactory::GetInstance();
   AccountReconcilorFactory::GetInstance();
diff --git a/chrome/browser/profiles/profile_downloader.cc b/chrome/browser/profiles/profile_downloader.cc
index ebf40f7..6a56331 100644
--- a/chrome/browser/profiles/profile_downloader.cc
+++ b/chrome/browser/profiles/profile_downloader.cc
@@ -289,8 +289,7 @@
 }
 
 void ProfileDownloader::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   if (account_info.account_id != account_id_)
     return;
 
diff --git a/chrome/browser/profiles/profile_downloader.h b/chrome/browser/profiles/profile_downloader.h
index 59c2be8..cbfd8bf 100644
--- a/chrome/browser/profiles/profile_downloader.h
+++ b/chrome/browser/profiles/profile_downloader.h
@@ -97,8 +97,8 @@
   void OnDecodeImageFailed() override;
 
   // Overriden from identity::IdentityManager::Observer:
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
 
   // Implementation of AccountTrackerService::Observer.
   void OnAccountUpdated(const AccountInfo& info) override;
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 7773960e..57e2783 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -426,12 +426,6 @@
 #if BUILDFLAG(ENABLE_PRINTING)
   registry->RegisterBooleanPref(prefs::kPrintingEnabled, true);
 #if defined(OS_CHROMEOS)
-  registry->RegisterIntegerPref(prefs::kPrintingAllowedColorModes, 0);
-  registry->RegisterIntegerPref(prefs::kPrintingAllowedDuplexModes, 0);
-  registry->RegisterListPref(prefs::kPrintingAllowedPageSizes);
-  registry->RegisterIntegerPref(prefs::kPrintingColorDefault, 0);
-  registry->RegisterIntegerPref(prefs::kPrintingDuplexDefault, 0);
-  registry->RegisterDictionaryPref(prefs::kPrintingSizeDefault);
   registry->RegisterBooleanPref(
       prefs::kOobeMarketingOptInScreenFinished, false,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
diff --git a/chrome/browser/resource_coordinator/render_process_probe.cc b/chrome/browser/resource_coordinator/render_process_probe.cc
index 4241a80..f6e7ac2 100644
--- a/chrome/browser/resource_coordinator/render_process_probe.cc
+++ b/chrome/browser/resource_coordinator/render_process_probe.cc
@@ -14,8 +14,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/service_manager_connection.h"
-#include "services/resource_coordinator/public/cpp/process_resource_coordinator.h"
-#include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
 
 #if defined(OS_MACOSX)
 #include "content/public/browser/browser_child_process_host.h"
diff --git a/chrome/browser/resource_coordinator/tab_helper.cc b/chrome/browser/resource_coordinator/tab_helper.cc
index 8934081a..dd78cb4 100644
--- a/chrome/browser/resource_coordinator/tab_helper.cc
+++ b/chrome/browser/resource_coordinator/tab_helper.cc
@@ -20,12 +20,8 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/service_manager_connection.h"
-#include "content/public/common/service_names.mojom.h"
 #include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
 #include "services/resource_coordinator/public/cpp/page_resource_coordinator.h"
-#include "services/resource_coordinator/public/cpp/process_resource_coordinator.h"
-#include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
-#include "services/resource_coordinator/public/mojom/service_constants.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 #if !defined(OS_ANDROID)
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.css b/chrome/browser/resources/local_ntp/most_visited_single.css
index 5c4edb8..4bedf47 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.css
+++ b/chrome/browser/resources/local_ntp/most_visited_single.css
@@ -204,8 +204,6 @@
   font-family: 'Roboto', arial, sans-serif;
   font-size: var(--md-title-font-size);
   font-weight: 500;
-  height: var(--md-title-height);
-  line-height: var(--md-title-height);
   overflow: hidden;
   text-align: center;
   text-overflow: ellipsis;
@@ -213,6 +211,9 @@
   width: 96px;
 }
 
+.md-title span {
+  line-height: var(--md-title-height);
+}
 /* Font weight on Mac and ChromeOS looks heavier on default background and
  * needs to be reduced. */
 body.mac-chromeos .md-title {
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js
index 4af3f6a..d0c68835 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.js
+++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -773,7 +773,8 @@
   mdTitleContainer.className = CLASSES.MD_TITLE_CONTAINER;
   let mdTitle = document.createElement('div');
   mdTitle.className = CLASSES.MD_TITLE;
-  mdTitle.innerText = data.title;
+  let mdTitleTextwrap = document.createElement('span');
+  mdTitleTextwrap.innerText = data.title;
   mdTitle.style.direction = data.direction || 'ltr';
   // Windows font family fallback to Segoe
   if (navigator.userAgent.indexOf('Windows') > -1) {
@@ -783,6 +784,7 @@
   mdTileInner.appendChild(mdTitleContainer);
   mdTile.appendChild(mdTileInner);
   mdTileContainer.appendChild(mdTile);
+  mdTitle.appendChild(mdTitleTextwrap);
 
   if (!data.isAddButton) {
     let mdMenu = document.createElement('button');
diff --git a/chrome/browser/signin/account_consistency_mode_manager.cc b/chrome/browser/signin/account_consistency_mode_manager.cc
index bd52dde..ff2c9946 100644
--- a/chrome/browser/signin/account_consistency_mode_manager.cc
+++ b/chrome/browser/signin/account_consistency_mode_manager.cc
@@ -8,20 +8,16 @@
 
 #include "base/command_line.h"
 #include "base/logging.h"
-#include "base/memory/singleton.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/signin/account_consistency_mode_manager_factory.h"
 #include "chrome/common/pref_names.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/core/browser/signin_buildflags.h"
 #include "components/signin/core/browser/signin_pref_names.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/browser_thread.h"
 #include "google_apis/google_api_keys.h"
 
 #if defined(OS_CHROMEOS)
@@ -63,40 +59,6 @@
 };
 #endif
 
-class AccountConsistencyModeManagerFactory
-    : public BrowserContextKeyedServiceFactory {
- public:
-  // Returns an instance of the factory singleton.
-  static AccountConsistencyModeManagerFactory* GetInstance() {
-    return base::Singleton<AccountConsistencyModeManagerFactory>::get();
-  }
-
-  static AccountConsistencyModeManager* GetForProfile(Profile* profile) {
-    DCHECK(profile);
-    return static_cast<AccountConsistencyModeManager*>(
-        GetInstance()->GetServiceForBrowserContext(profile, true));
-  }
-
- private:
-  friend struct base::DefaultSingletonTraits<
-      AccountConsistencyModeManagerFactory>;
-
-  AccountConsistencyModeManagerFactory()
-      : BrowserContextKeyedServiceFactory(
-            "AccountConsistencyModeManager",
-            BrowserContextDependencyManager::GetInstance()) {}
-
-  ~AccountConsistencyModeManagerFactory() override = default;
-
-  // BrowserContextKeyedServiceFactory:
-  KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* context) const override {
-    DCHECK(!context->IsOffTheRecord());
-    Profile* profile = static_cast<Profile*>(context);
-    return new AccountConsistencyModeManager(profile);
-  }
-};
-
 // Returns the default account consistency for guest profiles.
 AccountConsistencyMethod GetMethodForNonRegularProfile() {
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
diff --git a/chrome/browser/signin/account_consistency_mode_manager_factory.cc b/chrome/browser/signin/account_consistency_mode_manager_factory.cc
new file mode 100644
index 0000000..4eb10ed
--- /dev/null
+++ b/chrome/browser/signin/account_consistency_mode_manager_factory.cc
@@ -0,0 +1,46 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/signin/account_consistency_mode_manager_factory.h"
+
+#include "base/logging.h"
+#include "build/build_config.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+#include "components/signin/core/browser/signin_buildflags.h"
+
+// static
+AccountConsistencyModeManagerFactory*
+AccountConsistencyModeManagerFactory::GetInstance() {
+  return base::Singleton<AccountConsistencyModeManagerFactory>::get();
+}
+
+// static
+AccountConsistencyModeManager*
+AccountConsistencyModeManagerFactory::GetForProfile(Profile* profile) {
+  DCHECK(profile);
+  return static_cast<AccountConsistencyModeManager*>(
+      GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+AccountConsistencyModeManagerFactory::AccountConsistencyModeManagerFactory()
+    : BrowserContextKeyedServiceFactory(
+          "AccountConsistencyModeManager",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+AccountConsistencyModeManagerFactory::~AccountConsistencyModeManagerFactory() =
+    default;
+
+KeyedService* AccountConsistencyModeManagerFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  DCHECK(!context->IsOffTheRecord());
+  return new AccountConsistencyModeManager(
+      Profile::FromBrowserContext(context));
+}
+
+void AccountConsistencyModeManagerFactory::RegisterProfilePrefs(
+    user_prefs::PrefRegistrySyncable* registry) {
+  AccountConsistencyModeManager::RegisterProfilePrefs(registry);
+}
diff --git a/chrome/browser/signin/account_consistency_mode_manager_factory.h b/chrome/browser/signin/account_consistency_mode_manager_factory.h
new file mode 100644
index 0000000..2b41f44
--- /dev/null
+++ b/chrome/browser/signin/account_consistency_mode_manager_factory.h
@@ -0,0 +1,34 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SIGNIN_ACCOUNT_CONSISTENCY_MODE_MANAGER_FACTORY_H_
+#define CHROME_BROWSER_SIGNIN_ACCOUNT_CONSISTENCY_MODE_MANAGER_FACTORY_H_
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/signin/account_consistency_mode_manager.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class AccountConsistencyModeManagerFactory
+    : public BrowserContextKeyedServiceFactory {
+ public:
+  // Returns an instance of the factory singleton.
+  static AccountConsistencyModeManagerFactory* GetInstance();
+
+  static AccountConsistencyModeManager* GetForProfile(Profile* profile);
+
+ private:
+  friend struct base::DefaultSingletonTraits<
+      AccountConsistencyModeManagerFactory>;
+
+  AccountConsistencyModeManagerFactory();
+  ~AccountConsistencyModeManagerFactory() override;
+
+  // BrowserContextKeyedServiceFactory:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+  void RegisterProfilePrefs(
+      user_prefs::PrefRegistrySyncable* registry) override;
+};
+
+#endif  // CHROME_BROWSER_SIGNIN_ACCOUNT_CONSISTENCY_MODE_MANAGER_FACTORY_H_
diff --git a/chrome/browser/signin/chrome_signin_client_factory.cc b/chrome/browser/signin/chrome_signin_client_factory.cc
index 72b8b766..d7449d3 100644
--- a/chrome/browser/signin/chrome_signin_client_factory.cc
+++ b/chrome/browser/signin/chrome_signin_client_factory.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/signin/chrome_signin_client_factory.h"
 
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/signin/account_consistency_mode_manager.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
 ChromeSigninClientFactory::ChromeSigninClientFactory()
@@ -31,8 +30,3 @@
     content::BrowserContext* context) const {
   return new ChromeSigninClient(Profile::FromBrowserContext(context));
 }
-
-void ChromeSigninClientFactory::RegisterProfilePrefs(
-    user_prefs::PrefRegistrySyncable* registry) {
-  AccountConsistencyModeManager::RegisterProfilePrefs(registry);
-}
diff --git a/chrome/browser/signin/chrome_signin_client_factory.h b/chrome/browser/signin/chrome_signin_client_factory.h
index 43d8140..e88d3f23 100644
--- a/chrome/browser/signin/chrome_signin_client_factory.h
+++ b/chrome/browser/signin/chrome_signin_client_factory.h
@@ -32,8 +32,6 @@
   // BrowserContextKeyedServiceFactory:
   KeyedService* BuildServiceInstanceFor(
       content::BrowserContext* profile) const override;
-  void RegisterProfilePrefs(
-      user_prefs::PrefRegistrySyncable* registry) override;
 };
 
 #endif  // CHROME_BROWSER_SIGNIN_CHROME_SIGNIN_CLIENT_FACTORY_H_
diff --git a/chrome/browser/signin/chrome_signin_client_unittest.cc b/chrome/browser/signin/chrome_signin_client_unittest.cc
index 483617b..6d83e8e 100644
--- a/chrome/browser/signin/chrome_signin_client_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_client_unittest.cc
@@ -23,6 +23,7 @@
 #include "components/signin/core/browser/signin_error_controller.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "google_apis/gaia/fake_oauth2_token_service.h"
 #include "services/network/test/test_network_connection_tracker.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -177,14 +178,18 @@
   }
 
   void CreateClient(Profile* profile) {
-    client_.reset(new MockChromeSigninClient(profile));
-    SigninErrorController* controller = new SigninErrorController(
-        SigninErrorController::AccountMode::ANY_ACCOUNT);
-    fake_controller_.reset(controller);
+    if (fake_controller_)
+      fake_controller_->Shutdown();
+
+    client_ = std::make_unique<MockChromeSigninClient>(profile);
+    token_service_ = std::make_unique<FakeOAuth2TokenService>();
+    fake_controller_ = std::make_unique<SigninErrorController>(
+        SigninErrorController::AccountMode::ANY_ACCOUNT, token_service_.get());
   }
 
-  std::unique_ptr<SigninErrorController> fake_controller_;
   std::unique_ptr<MockChromeSigninClient> client_;
+  std::unique_ptr<FakeOAuth2TokenService> token_service_;
+  std::unique_ptr<SigninErrorController> fake_controller_;
   std::unique_ptr<MockSigninManager> manager_;
 };
 
diff --git a/chrome/browser/signin/dice_browsertest.cc b/chrome/browser/signin/dice_browsertest.cc
index c3d3bfb..44fdc05 100644
--- a/chrome/browser/signin/dice_browsertest.cc
+++ b/chrome/browser/signin/dice_browsertest.cc
@@ -540,9 +540,9 @@
     RunClosureIfValid(std::move(on_primary_account_set_quit_closure_));
   }
 
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override {
-    if (is_valid && account_info.account_id == GetMainAccountID()) {
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override {
+    if (account_info.account_id == GetMainAccountID()) {
       refresh_token_available_ = true;
       RunClosureIfValid(std::move(refresh_token_available_quit_closure_));
     }
diff --git a/chrome/browser/signin/dice_response_handler_unittest.cc b/chrome/browser/signin/dice_response_handler_unittest.cc
index 08011bd..bf46f82b 100644
--- a/chrome/browser/signin/dice_response_handler_unittest.cc
+++ b/chrome/browser/signin/dice_response_handler_unittest.cc
@@ -124,7 +124,8 @@
         token_service_(&pref_service_,
                        std::make_unique<FakeOAuth2TokenServiceDelegate>()),
         signin_error_controller_(
-            SigninErrorController::AccountMode::PRIMARY_ACCOUNT),
+            SigninErrorController::AccountMode::PRIMARY_ACCOUNT,
+            &token_service_),
         signin_manager_(&signin_client_,
                         &token_service_,
                         &account_tracker_service_,
diff --git a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc
index 0c57d4c..5c0ffa8 100644
--- a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc
+++ b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.cc
@@ -324,47 +324,9 @@
       }));
 }
 
-MutableProfileOAuth2TokenServiceDelegate::AccountStatus::AccountStatus(
-    SigninErrorController* signin_error_controller,
-    const std::string& account_id,
-    const std::string& refresh_token)
-    : signin_error_controller_(signin_error_controller),
-      account_id_(account_id),
-      refresh_token_(refresh_token),
-      last_auth_error_(GoogleServiceAuthError::NONE) {
-  DCHECK(signin_error_controller_);
-  DCHECK(!account_id_.empty());
-  DCHECK(!refresh_token.empty());
-}
-
-void MutableProfileOAuth2TokenServiceDelegate::AccountStatus::Initialize() {
-  signin_error_controller_->AddProvider(this);
-}
-
-MutableProfileOAuth2TokenServiceDelegate::AccountStatus::~AccountStatus() {
-  signin_error_controller_->RemoveProvider(this);
-}
-
-void MutableProfileOAuth2TokenServiceDelegate::AccountStatus::SetLastAuthError(
-    const GoogleServiceAuthError& error) {
-  last_auth_error_ = error;
-  signin_error_controller_->AuthStatusChanged();
-}
-
-std::string
-MutableProfileOAuth2TokenServiceDelegate::AccountStatus::GetAccountId() const {
-  return account_id_;
-}
-
-GoogleServiceAuthError
-MutableProfileOAuth2TokenServiceDelegate::AccountStatus::GetAuthStatus() const {
-  return last_auth_error_;
-}
-
 MutableProfileOAuth2TokenServiceDelegate::
     MutableProfileOAuth2TokenServiceDelegate(
         SigninClient* client,
-        SigninErrorController* signin_error_controller,
         AccountTrackerService* account_tracker_service,
         scoped_refptr<TokenWebData> token_web_data,
         signin::AccountConsistencyMethod account_consistency,
@@ -374,7 +336,6 @@
       backoff_entry_(&backoff_policy_),
       backoff_error_(GoogleServiceAuthError::NONE),
       client_(client),
-      signin_error_controller_(signin_error_controller),
       account_tracker_service_(account_tracker_service),
       token_web_data_(token_web_data),
       account_consistency_(account_consistency),
@@ -382,7 +343,6 @@
       can_revoke_credentials_(can_revoke_credentials) {
   VLOG(1) << "MutablePO2TS::MutablePO2TS";
   DCHECK(client);
-  DCHECK(signin_error_controller);
   DCHECK(account_tracker_service_);
   // It's okay to fill the backoff policy after being used in construction.
   backoff_policy_.num_errors_to_ignore = 0;
@@ -415,11 +375,11 @@
     OAuth2AccessTokenConsumer* consumer) {
   ValidateAccountId(account_id);
   // check whether the account has persistent error.
-  if (refresh_tokens_[account_id]->GetAuthStatus().IsPersistentError()) {
+  if (refresh_tokens_[account_id].last_auth_error.IsPersistentError()) {
     VLOG(1) << "Request for token has been rejected due to persistent error #"
-            << refresh_tokens_[account_id]->GetAuthStatus().state();
+            << refresh_tokens_[account_id].last_auth_error.state();
     return new OAuth2AccessTokenFetcherImmediateError(
-        consumer, refresh_tokens_[account_id]->GetAuthStatus());
+        consumer, refresh_tokens_[account_id].last_auth_error);
   }
   if (backoff_entry_.ShouldRejectRequest()) {
     VLOG(1) << "Request for token has been rejected due to backoff rules from"
@@ -436,7 +396,7 @@
     const std::string& account_id) const {
   auto it = refresh_tokens_.find(account_id);
   return (it == refresh_tokens_.end()) ? GoogleServiceAuthError::AuthErrorNone()
-                                       : it->second->GetAuthStatus();
+                                       : it->second.last_auth_error;
 }
 
 void MutableProfileOAuth2TokenServiceDelegate::UpdateAuthError(
@@ -464,9 +424,9 @@
     return;
   }
 
-  AccountStatus* status = refresh_tokens_[account_id].get();
-  if (error != status->GetAuthStatus()) {
-    status->SetLastAuthError(error);
+  AccountStatus* status = &refresh_tokens_[account_id];
+  if (error != status->last_auth_error) {
+    status->last_auth_error = error;
     FireAuthErrorChanged(account_id, error);
   }
 }
@@ -475,11 +435,10 @@
     const std::string& account_id) const {
   auto iter = refresh_tokens_.find(account_id);
   if (iter == refresh_tokens_.end() ||
-      iter->second->GetAuthStatus() !=
-          GoogleServiceAuthError::AuthErrorNone()) {
+      iter->second.last_auth_error != GoogleServiceAuthError::AuthErrorNone()) {
     return std::string();
   }
-  const std::string& refresh_token = iter->second->refresh_token();
+  const std::string& refresh_token = iter->second.refresh_token;
   DCHECK(!refresh_token.empty());
   return refresh_token;
 }
@@ -494,7 +453,7 @@
     const std::string& account_id) const {
   auto iter = refresh_tokens_.find(account_id);
   if (iter != refresh_tokens_.end()) {
-    const std::string refresh_token = iter->second->refresh_token();
+    const std::string refresh_token = iter->second.refresh_token;
     DCHECK(!refresh_token.empty());
     return refresh_token;
   }
@@ -806,7 +765,7 @@
   // If token present, and different from the new one, cancel its requests,
   // and clear the entries in cache related to that account.
   if (refresh_token_present) {
-    DCHECK_NE(refresh_token, refresh_tokens_[account_id]->refresh_token());
+    DCHECK_NE(refresh_token, refresh_tokens_[account_id].refresh_token);
     VLOG(1) << "MutablePO2TS::UpdateCredentials; Refresh Token was present. "
             << "account_id=" << account_id;
 
@@ -822,9 +781,9 @@
     // would also be invalidated server-side).
     // See http://crbug.com/865189 for more information about this regression.
     if (is_refresh_token_invalidated)
-      RevokeCredentialsOnServer(refresh_tokens_[account_id]->refresh_token());
+      RevokeCredentialsOnServer(refresh_tokens_[account_id].refresh_token);
 
-    refresh_tokens_[account_id]->set_refresh_token(refresh_token);
+    refresh_tokens_[account_id].refresh_token = refresh_token;
     UpdateAuthError(account_id, error);
   } else {
     VLOG(1) << "MutablePO2TS::UpdateCredentials; Refresh Token was absent. "
@@ -885,7 +844,7 @@
   if (refresh_tokens_.count(account_id) > 0) {
     VLOG(1) << "MutablePO2TS::RevokeCredentials for account_id=" << account_id;
     ScopedBatchChange batch(this);
-    const std::string& token = refresh_tokens_[account_id]->refresh_token();
+    const std::string& token = refresh_tokens_[account_id].refresh_token;
     RecordTokenRevoked(token);
     RevokeCredentialsOnServer(token);
     refresh_tokens_.erase(account_id);
@@ -949,12 +908,8 @@
     const std::string& refresh_token,
     const GoogleServiceAuthError& error) {
   DCHECK_EQ(0u, refresh_tokens_.count(account_id));
-  AccountStatus* status =
-      new AccountStatus(signin_error_controller_, account_id, refresh_token);
-  refresh_tokens_[account_id].reset(status);
-  status->Initialize();
-  status->SetLastAuthError(error);
-  FireAuthErrorChanged(account_id, status->GetAuthStatus());
+  refresh_tokens_[account_id] = AccountStatus{refresh_token, error};
+  FireAuthErrorChanged(account_id, error);
 }
 
 void MutableProfileOAuth2TokenServiceDelegate::FinishLoadingCredentials() {
diff --git a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h
index d5b9c5ad..16b9b514 100644
--- a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h
+++ b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h
@@ -14,7 +14,6 @@
 #include "components/signin/core/browser/account_consistency_method.h"
 #include "components/signin/core/browser/account_tracker_service.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
-#include "components/signin/core/browser/signin_error_controller.h"
 #include "components/signin/core/browser/webdata/token_web_data.h"
 #include "components/webdata/common/web_data_service_base.h"
 #include "components/webdata/common/web_data_service_consumer.h"
@@ -34,7 +33,6 @@
  public:
   MutableProfileOAuth2TokenServiceDelegate(
       SigninClient* client,
-      SigninErrorController* signin_error_controller,
       AccountTrackerService* account_tracker_service,
       scoped_refptr<TokenWebData> token_web_data,
       signin::AccountConsistencyMethod account_consistency,
@@ -89,32 +87,9 @@
 
   class RevokeServerRefreshToken;
 
-  class AccountStatus : public SigninErrorController::AuthStatusProvider {
-   public:
-    AccountStatus(SigninErrorController* signin_error_controller,
-                  const std::string& account_id,
-                  const std::string& refresh_token);
-    ~AccountStatus() override;
-
-    // Must be called after the account has been added to the AccountStatusMap.
-    void Initialize();
-
-    const std::string& refresh_token() const { return refresh_token_; }
-    void set_refresh_token(const std::string& token) { refresh_token_ = token; }
-
-    void SetLastAuthError(const GoogleServiceAuthError& error);
-
-    // SigninErrorController::AuthStatusProvider implementation.
-    std::string GetAccountId() const override;
-    GoogleServiceAuthError GetAuthStatus() const override;
-
-   private:
-    SigninErrorController* signin_error_controller_;
-    std::string account_id_;
-    std::string refresh_token_;
-    GoogleServiceAuthError last_auth_error_;
-
-    DISALLOW_COPY_AND_ASSIGN(AccountStatus);
+  struct AccountStatus {
+    std::string refresh_token;
+    GoogleServiceAuthError last_auth_error;
   };
 
   FRIEND_TEST_ALL_PREFIXES(MutableProfileOAuth2TokenServiceDelegateTest,
@@ -203,8 +178,7 @@
 
   // Maps the |account_id| of accounts known to ProfileOAuth2TokenService
   // to information about the account.
-  typedef std::map<std::string, std::unique_ptr<AccountStatus>>
-      AccountStatusMap;
+  typedef std::map<std::string, AccountStatus> AccountStatusMap;
   // In memory refresh token store mapping account_id to refresh_token.
   AccountStatusMap refresh_tokens_;
 
@@ -227,7 +201,6 @@
   GoogleServiceAuthError backoff_error_;
 
   SigninClient* client_;
-  SigninErrorController* signin_error_controller_;
   AccountTrackerService* account_tracker_service_;
   scoped_refptr<TokenWebData> token_web_data_;
   signin::AccountConsistencyMethod account_consistency_;
diff --git a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc
index 1bd925b9..eacc8176 100644
--- a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc
+++ b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate_unittest.cc
@@ -25,7 +25,6 @@
 #include "components/signin/core/browser/device_id_helper.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/core/browser/signin_buildflags.h"
-#include "components/signin/core/browser/signin_error_controller.h"
 #include "components/signin/core/browser/signin_manager_base.h"
 #include "components/signin/core/browser/signin_pref_names.h"
 #include "components/signin/core/browser/test_signin_client.h"
@@ -85,9 +84,7 @@
       public WebDataServiceConsumer {
  public:
   MutableProfileOAuth2TokenServiceDelegateTest()
-      : signin_error_controller_(
-            SigninErrorController::AccountMode::ANY_ACCOUNT),
-        access_token_success_count_(0),
+      : access_token_success_count_(0),
         access_token_failure_count_(0),
         access_token_failure_(GoogleServiceAuthError::NONE),
         token_available_count_(0),
@@ -150,11 +147,9 @@
   CreateOAuth2ServiceDelegate(
       signin::AccountConsistencyMethod account_consistency) {
     return std::make_unique<MutableProfileOAuth2TokenServiceDelegate>(
-        client_.get(), &signin_error_controller_, &account_tracker_service_,
-        token_web_data_, account_consistency, revoke_all_tokens_on_load_,
+        client_.get(), &account_tracker_service_, token_web_data_,
+        account_consistency, revoke_all_tokens_on_load_,
         true /* can_revoke_credantials */);
-    // Make sure delegate has a chance to load itself before continuing.
-    base::RunLoop().RunUntilIdle();
   }
 
   void InitializeOAuth2ServiceDelegate(
@@ -263,7 +258,6 @@
   std::unique_ptr<MutableProfileOAuth2TokenServiceDelegate>
       oauth2_service_delegate_;
   TestingOAuth2TokenServiceConsumer consumer_;
-  SigninErrorController signin_error_controller_;
   sync_preferences::TestingPrefServiceSyncable pref_service_;
   AccountTrackerService account_tracker_service_;
   scoped_refptr<TokenWebData> token_web_data_;
@@ -305,9 +299,9 @@
   EXPECT_TRUE(
       oauth2_service_delegate_->RefreshTokenIsAvailable(main_account_id));
   EXPECT_EQ(1U, oauth2_service_delegate_->refresh_tokens_.size());
-  EXPECT_EQ(main_refresh_token,
-            oauth2_service_delegate_->refresh_tokens_[main_account_id]
-                ->refresh_token());
+  EXPECT_EQ(
+      main_refresh_token,
+      oauth2_service_delegate_->refresh_tokens_[main_account_id].refresh_token);
 
   // Add an old legacy token to the DB, to ensure it will not overwrite existing
   // credentials for main account.
@@ -340,12 +334,12 @@
   // TODO(fgorski): cover both using RefreshTokenIsAvailable() and then get the
   // tokens using GetRefreshToken()
   EXPECT_EQ(2U, oauth2_service_delegate_->refresh_tokens_.size());
-  EXPECT_EQ(main_refresh_token,
-            oauth2_service_delegate_->refresh_tokens_[main_account_id]
-                ->refresh_token());
+  EXPECT_EQ(
+      main_refresh_token,
+      oauth2_service_delegate_->refresh_tokens_[main_account_id].refresh_token);
   EXPECT_EQ(other_refresh_token,
             oauth2_service_delegate_->refresh_tokens_[other_account_id]
-                ->refresh_token());
+                .refresh_token);
 
   oauth2_service_delegate_->RevokeAllCredentials();
   EXPECT_EQ(2, start_batch_changes_);
@@ -423,10 +417,6 @@
   EXPECT_EQ(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
                 GoogleServiceAuthError::InvalidGaiaCredentialsReason::
                     CREDENTIALS_MISSING),
-            signin_error_controller_.auth_error());
-  EXPECT_EQ(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
-                GoogleServiceAuthError::InvalidGaiaCredentialsReason::
-                    CREDENTIALS_MISSING),
             oauth2_service_delegate_->GetAuthError("account_id"));
   EXPECT_EQ(1, start_batch_changes_);
   EXPECT_EQ(1, end_batch_changes_);
@@ -447,7 +437,7 @@
   EXPECT_EQ(1U, oauth2_service_delegate_->refresh_tokens_.size());
   EXPECT_EQ(
       MutableProfileOAuth2TokenServiceDelegate::kInvalidRefreshToken,
-      oauth2_service_delegate_->refresh_tokens_["account_id"]->refresh_token());
+      oauth2_service_delegate_->refresh_tokens_["account_id"].refresh_token);
   // Setup a DB with tokens that don't require upgrade and clear memory.
   oauth2_service_delegate_->UpdateCredentials("account_id", "refresh_token");
   oauth2_service_delegate_->UpdateCredentials("account_id2", "refresh_token2");
@@ -464,8 +454,6 @@
   EXPECT_EQ(OAuth2TokenServiceDelegate::LOAD_CREDENTIALS_FINISHED_WITH_SUCCESS,
             oauth2_service_delegate_->load_credentials_state());
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_controller_.auth_error());
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             oauth2_service_delegate_->GetAuthError("account_id"));
   EXPECT_EQ(2, token_available_count_);
   EXPECT_EQ(0, token_revoked_count_);
@@ -710,7 +698,7 @@
   EXPECT_EQ(
       MutableProfileOAuth2TokenServiceDelegate::kInvalidRefreshToken,
       oauth2_service_delegate_->refresh_tokens_[primary_account.account_id]
-          ->refresh_token());
+          .refresh_token);
   EXPECT_EQ(
       GoogleServiceAuthError::InvalidGaiaCredentialsReason::CREDENTIALS_MISSING,
       oauth2_service_delegate_->GetAuthError(primary_account.account_id)
@@ -879,10 +867,6 @@
                     GoogleServiceAuthError::InvalidGaiaCredentialsReason::
                         CREDENTIALS_REJECTED_BY_CLIENT)),
             oauth2_service_delegate_->GetAuthError("account_id"));
-  EXPECT_EQ(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
-                GoogleServiceAuthError::InvalidGaiaCredentialsReason::
-                    CREDENTIALS_REJECTED_BY_CLIENT),
-            signin_error_controller_.auth_error());
 
   // Update the token: authentication error is fixed, no actual server
   // revocation.
@@ -891,8 +875,6 @@
   EXPECT_EQ(1, auth_error_changed_count_);
   ExpectOneTokenAvailableNotification();
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_controller_.auth_error());
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             oauth2_service_delegate_->GetAuthError("account_id"));
 }
 
@@ -952,10 +934,6 @@
                oauth2_service_delegate_->GetRefreshToken("account_id").c_str());
 
   // The account is in authentication error.
-  EXPECT_EQ(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
-                GoogleServiceAuthError::InvalidGaiaCredentialsReason::
-                    CREDENTIALS_REJECTED_BY_CLIENT),
-            signin_error_controller_.auth_error());
   EXPECT_EQ(GoogleServiceAuthError(
                 GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
                     GoogleServiceAuthError::InvalidGaiaCredentialsReason::
@@ -1022,15 +1000,11 @@
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDisabled);
   oauth2_service_delegate_->UpdateCredentials(kEmail, "refreshToken");
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_controller_.auth_error());
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             oauth2_service_delegate_->GetAuthError(kEmail));
 
   GoogleServiceAuthError authfail(GoogleServiceAuthError::ACCOUNT_DELETED);
   oauth2_service_delegate_->UpdateAuthError(kEmail, authfail);
   EXPECT_NE(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_controller_.auth_error());
-  EXPECT_NE(GoogleServiceAuthError::AuthErrorNone(),
             oauth2_service_delegate_->GetAuthError(kEmail));
 
   // Create a "success" fetch we don't expect to get called.
@@ -1053,15 +1027,11 @@
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDisabled);
   oauth2_service_delegate_->UpdateCredentials(kEmail, "refreshToken");
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_controller_.auth_error());
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             oauth2_service_delegate_->GetAuthError(kEmail));
 
   GoogleServiceAuthError authfail(GoogleServiceAuthError::SERVICE_UNAVAILABLE);
   oauth2_service_delegate_->UpdateAuthError(kEmail, authfail);
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_controller_.auth_error());
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             oauth2_service_delegate_->GetAuthError(kEmail));
 
   // Create a "success" fetch we don't expect to get called just yet.
@@ -1099,15 +1069,11 @@
   InitializeOAuth2ServiceDelegate(signin::AccountConsistencyMethod::kDisabled);
   oauth2_service_delegate_->UpdateCredentials(kEmail, "refreshToken");
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_controller_.auth_error());
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             oauth2_service_delegate_->GetAuthError(kEmail));
 
   GoogleServiceAuthError authfail(GoogleServiceAuthError::SERVICE_UNAVAILABLE);
   oauth2_service_delegate_->UpdateAuthError(kEmail, authfail);
   EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
-            signin_error_controller_.auth_error());
-  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
             oauth2_service_delegate_->GetAuthError(kEmail));
 
   // Create a "success" fetch we don't expect to get called just yet.
@@ -1368,22 +1334,6 @@
 // Checks that OnAuthErrorChanged() is called during UpdateCredentials(), and
 // that RefreshTokenIsAvailable() can be used at this time.
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, OnAuthErrorChanged) {
-  class ControllerErrorObserver : public SigninErrorController::Observer {
-   public:
-    explicit ControllerErrorObserver(
-        MutableProfileOAuth2TokenServiceDelegate* delegate)
-        : delegate_(delegate) {}
-
-    void OnErrorChanged() override {
-      error_changed_ = true;
-      EXPECT_TRUE(delegate_->RefreshTokenIsAvailable("account_id"));
-    }
-
-    MutableProfileOAuth2TokenServiceDelegate* delegate_;
-    bool error_changed_ = false;
-
-    DISALLOW_COPY_AND_ASSIGN(ControllerErrorObserver);
-  };
 
   class TokenServiceErrorObserver : public OAuth2TokenService::Observer {
    public:
@@ -1417,18 +1367,13 @@
 
   TokenServiceErrorObserver token_service_observer(
       oauth2_service_delegate_.get());
-  ControllerErrorObserver controller_observer(oauth2_service_delegate_.get());
   oauth2_service_delegate_->AddObserver(&token_service_observer);
-  signin_error_controller_.AddObserver(&controller_observer);
 
   ASSERT_FALSE(token_service_observer.error_changed_);
-  ASSERT_FALSE(controller_observer.error_changed_);
   oauth2_service_delegate_->UpdateCredentials("account_id", "token");
   EXPECT_TRUE(token_service_observer.error_changed_);
-  EXPECT_TRUE(controller_observer.error_changed_);
 
   oauth2_service_delegate_->RemoveObserver(&token_service_observer);
-  signin_error_controller_.RemoveObserver(&controller_observer);
 }
 
 TEST_F(MutableProfileOAuth2TokenServiceDelegateTest, GetAuthError) {
diff --git a/chrome/browser/signin/profile_oauth2_token_service_factory.cc b/chrome/browser/signin/profile_oauth2_token_service_factory.cc
index 60745f9..ab4a1e6 100644
--- a/chrome/browser/signin/profile_oauth2_token_service_factory.cc
+++ b/chrome/browser/signin/profile_oauth2_token_service_factory.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/signin/account_consistency_mode_manager.h"
 #include "chrome/browser/signin/account_tracker_service_factory.h"
 #include "chrome/browser/signin/chrome_signin_client_factory.h"
-#include "chrome/browser/signin/signin_error_controller_factory.h"
 #include "chrome/browser/web_data_service_factory.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -65,8 +64,7 @@
 
   return std::make_unique<chromeos::ChromeOSOAuth2TokenServiceDelegate>(
       AccountTrackerServiceFactory::GetInstance()->GetForProfile(profile),
-      account_manager,
-      SigninErrorControllerFactory::GetInstance()->GetForProfile(profile));
+      account_manager);
 }
 #endif  // defined(OS_CHROMEOS)
 
@@ -102,7 +100,6 @@
 
   return std::make_unique<MutableProfileOAuth2TokenServiceDelegate>(
       ChromeSigninClientFactory::GetInstance()->GetForProfile(profile),
-      SigninErrorControllerFactory::GetInstance()->GetForProfile(profile),
       AccountTrackerServiceFactory::GetInstance()->GetForProfile(profile),
       WebDataServiceFactory::GetTokenWebDataForProfile(
           profile, ServiceAccessType::EXPLICIT_ACCESS),
@@ -145,7 +142,6 @@
 #endif
   DependsOn(WebDataServiceFactory::GetInstance());
   DependsOn(ChromeSigninClientFactory::GetInstance());
-  DependsOn(SigninErrorControllerFactory::GetInstance());
   DependsOn(AccountTrackerServiceFactory::GetInstance());
   DependsOn(WebDataServiceFactory::GetInstance());
 }
diff --git a/chrome/browser/signin/signin_error_controller_factory.cc b/chrome/browser/signin/signin_error_controller_factory.cc
index c11d137..9d0af3e 100644
--- a/chrome/browser/signin/signin_error_controller_factory.cc
+++ b/chrome/browser/signin/signin_error_controller_factory.cc
@@ -7,13 +7,17 @@
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/account_consistency_mode_manager.h"
+#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/signin/core/browser/account_consistency_method.h"
+#include "components/signin/core/browser/profile_oauth2_token_service.h"
 
 SigninErrorControllerFactory::SigninErrorControllerFactory()
     : BrowserContextKeyedServiceFactory(
           "SigninErrorController",
-          BrowserContextDependencyManager::GetInstance()) {}
+          BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance());
+}
 
 SigninErrorControllerFactory::~SigninErrorControllerFactory() {}
 
@@ -31,14 +35,15 @@
 
 KeyedService* SigninErrorControllerFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
+  Profile* profile = Profile::FromBrowserContext(context);
   SigninErrorController::AccountMode account_mode =
 #if defined(OS_CHROMEOS)
       SigninErrorController::AccountMode::ANY_ACCOUNT;
 #else
-      AccountConsistencyModeManager::IsMirrorEnabledForProfile(
-          Profile::FromBrowserContext(context))
+      AccountConsistencyModeManager::IsMirrorEnabledForProfile(profile)
           ? SigninErrorController::AccountMode::ANY_ACCOUNT
           : SigninErrorController::AccountMode::PRIMARY_ACCOUNT;
 #endif
-  return new SigninErrorController(account_mode);
+  return new SigninErrorController(
+      account_mode, ProfileOAuth2TokenServiceFactory::GetForProfile(profile));
 }
diff --git a/chrome/browser/sync/sync_ui_util_unittest.cc b/chrome/browser/sync/sync_ui_util_unittest.cc
index 3886fd1..58bbf6f5 100644
--- a/chrome/browser/sync/sync_ui_util_unittest.cc
+++ b/chrome/browser/sync/sync_ui_util_unittest.cc
@@ -183,8 +183,6 @@
       return;
     }
     case STATUS_CASE_CONFIRM_SYNC_SETTINGS: {
-      EXPECT_CALL(*service, IsSyncConfirmationNeeded())
-          .WillRepeatedly(Return(true));
       EXPECT_CALL(*service, IsPassphraseRequired())
           .WillRepeatedly(Return(false));
       syncer::SyncEngine::Status status;
@@ -410,9 +408,9 @@
   SigninManagerBase* signin =
       SigninManagerFactory::GetForProfile(profile.get());
 
-  ProfileSyncServiceMock service(
+  NiceMock<ProfileSyncServiceMock> service(
       CreateProfileSyncServiceParamsForTest(profile.get()));
-  EXPECT_CALL(service, IsSyncConfirmationNeeded()).WillRepeatedly(Return(true));
+  ASSERT_TRUE(service.IsSyncConfirmationNeeded());
 
   base::string16 actionable_error_status_label;
   base::string16 link_label;
diff --git a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
index d06ad744..c58140f 100644
--- a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
+++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
@@ -561,7 +561,7 @@
     return false;
   }
 
-  service()->RequestStop(ProfileSyncService::CLEAR_DATA);
+  service()->StopAndClear();
 
   DVLOG(1) << "DisableSyncForAllDatatypes(): Disabled sync for all "
            << "datatypes on " << profile_debug_name_;
diff --git a/chrome/browser/sync/test/integration/single_client_directory_sync_test.cc b/chrome/browser/sync/test/integration/single_client_directory_sync_test.cc
index e27c07c..31db02d6 100644
--- a/chrome/browser/sync/test/integration/single_client_directory_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_directory_sync_test.cc
@@ -79,7 +79,7 @@
 IN_PROC_BROWSER_TEST_F(SingleClientDirectorySyncTest,
                        StopThenDisableDeletesDirectory) {
   // If SyncStandaloneTransport is enabled, then the sync service will
-  // immediately restart (and thus recreate directory files) after RequestStop.
+  // immediately restart (and thus recreate directory files) after StopAndClear.
   // TODO(crbug.com/856179): Rewrite this test to pass with
   // kSyncStandaloneTransport enabled.
   base::test::ScopedFeatureList feature_list;
@@ -91,7 +91,7 @@
                                 ->GetModelTypeStoreService()
                                 ->GetSyncDataPath();
   ASSERT_TRUE(FolderContainsFiles(directory_path));
-  sync_service->RequestStop(browser_sync::ProfileSyncService::CLEAR_DATA);
+  sync_service->StopAndClear();
 
   // Wait for StartupController::StartUp()'s tasks to finish.
   base::RunLoop run_loop;
diff --git a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
index 29c5291..9a962be 100644
--- a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
@@ -389,7 +389,7 @@
   EXPECT_EQ(kDefaultCustomerID, pdm->GetPaymentsCustomerData()->customer_id);
 
   // Turn off sync, the data should be gone.
-  GetSyncService(0)->RequestStop(syncer::SyncService::CLEAR_DATA);
+  GetSyncService(0)->StopAndClear();
   WaitForNumberOfCards(pdm, 0);
 
   EXPECT_EQ(0uL, pdm->GetCreditCards().size());
@@ -397,8 +397,8 @@
 
   // Turn sync on again, the data should come back.
   GetSyncService(0)->GetUserSettings()->SetSyncRequested(true);
-  // RequestStop(CLEAR_DATA) also clears the "first setup complete" flag, so
-  // set it again.
+  // StopAndClear() also clears the "first setup complete" flag, so set it
+  // again.
   GetSyncService(0)->GetUserSettings()->SetFirstSetupComplete();
   // Wait until Sync restores the card and it arrives at PDM.
   WaitForNumberOfCards(pdm, 1);
@@ -1025,13 +1025,14 @@
 // This tests that switching between Sync-the-feature and
 // Sync-standalone-transport properly migrates server credit cards between the
 // profile (i.e. persisted) and account (i.e. ephemeral) storage.
-// When turning off Sync-the-feature via SyncService::RequestStop, you can
-// specify either KEEP_DATA or CLEAR_DATA. For full coverage, we test all
-// transitions, and each time verify that the card is in the correct storage:
+// Sync can either be turned off temporarily via
+// SyncUserSettings::SetSyncRequested(false), or permanently via
+// SyncService::StopAndClear. For full coverage, we test all transitions, and
+// each time verify that the card is in the correct storage:
 // 1. Start out in Sync-the-feature mode -> profile storage.
-// 2. RequestStop(KEEP_DATA) -> account storage.
+// 2. SetSyncRequested(false) -> account storage.
 // 3. Enable Sync-the-feature again -> profile storage.
-// 4. RequestStop(CLEAR_DATA) -> account storage.
+// 4. StopAndClear() -> account storage.
 // 5. Enable Sync-the-feature again -> profile storage.
 IN_PROC_BROWSER_TEST_F(SingleClientWalletSyncTest,
                        SwitchesBetweenAccountAndProfileStorageOnTogglingSync) {
@@ -1121,7 +1122,7 @@
   EXPECT_EQ(1U, GetServerCards(profile_data).size());
 
   // STEP 4. Turn off Sync-the-feature again, but this time clear data.
-  GetSyncService(0)->RequestStop(syncer::SyncService::CLEAR_DATA);
+  GetSyncService(0)->StopAndClear();
 
   // Wait for Sync to get reconfigured into transport mode.
   ASSERT_TRUE(GetClient(0)->AwaitSyncSetupCompletion(
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
index a2110813..61bdeafb 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -197,7 +197,7 @@
 }
 
 MATCHER_P(ArcPackageInfoIs, package, "") {
-  return arg.Equals(package);
+  return arg.Equals(*package);
 }
 
 }  // namespace
@@ -2178,7 +2178,7 @@
 
   prefs->AddObserver(&observer);
 
-  EXPECT_CALL(observer, OnPackageInstalled(ArcPackageInfoIs(*package)))
+  EXPECT_CALL(observer, OnPackageInstalled(ArcPackageInfoIs(package.get())))
       .Times(1);
   EXPECT_CALL(observer,
               OnAppRegistered(app_id1, GetAppInfoExpectation(
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index 7362bc6..43f4c1c 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -388,23 +388,6 @@
                          ash::LAUNCH_FROM_UNKNOWN, base::DoNothing());
 }
 
-// Creates a window with TYPE_APP shelf item type and the given app_id.
-views::Widget* CreateShelfAppWindow(const std::string& app_id) {
-  views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
-  params.bounds = gfx::Rect(5, 5, 20, 20);
-  views::Widget* widget = new views::Widget();
-  widget->Init(params);
-
-  aura::Window* window = widget->GetNativeWindow();
-  const ash::ShelfID shelf_id(app_id);
-  window->SetProperty(ash::kShelfIDKey, new std::string(shelf_id.Serialize()));
-  window->SetProperty<int>(ash::kShelfItemTypeKey, ash::TYPE_APP);
-
-  widget->Show();
-  widget->Activate();
-  return widget;
-}
-
 }  // namespace
 
 // A test ChromeLauncherController subclass that uses TestShelfController.
@@ -1047,6 +1030,25 @@
                          appinfo.name, std::string());
   }
 
+  // Creates a window with TYPE_APP shelf item type and the given app_id.
+  views::Widget* CreateShelfAppWindow(const std::string& app_id) {
+    views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
+    params.context = GetContext();
+    params.bounds = gfx::Rect(5, 5, 20, 20);
+    views::Widget* widget = new views::Widget();
+    widget->Init(params);
+
+    aura::Window* window = widget->GetNativeWindow();
+    const ash::ShelfID shelf_id(app_id);
+    window->SetProperty(ash::kShelfIDKey,
+                        new std::string(shelf_id.Serialize()));
+    window->SetProperty<int>(ash::kShelfItemTypeKey, ash::TYPE_APP);
+
+    widget->Show();
+    widget->Activate();
+    return widget;
+  }
+
   // Needed for extension service & friends to work.
   scoped_refptr<Extension> extension_chrome_;
   scoped_refptr<Extension> extension1_;
@@ -1075,9 +1077,9 @@
 
  private:
   TestBrowserWindow* CreateTestBrowserWindowAura() {
-    std::unique_ptr<aura::Window> window(new aura::Window(nullptr));
+    std::unique_ptr<aura::Window> window(new aura::Window(
+        nullptr, aura::client::WINDOW_TYPE_NORMAL, GetContext()->env()));
     window->set_id(0);
-    window->SetType(aura::client::WINDOW_TYPE_NORMAL);
     window->Init(ui::LAYER_TEXTURED);
     aura::client::ParentWindowWithContext(window.get(), GetContext(),
                                           gfx::Rect(200, 200));
diff --git a/chrome/browser/ui/extensions/hosted_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
index a12e0f7..a86076b 100644
--- a/chrome/browser/ui/extensions/hosted_app_browsertest.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
@@ -1412,17 +1412,8 @@
             GetSecureAppURL());
 }
 
-// Crashes on Mac 10.12 only.  https://crbug.com/897719
-#if defined(OS_MACOSX)
-#define MAYBE_DesktopPWAsFlagDisabledCreatedForInstalledPwa \
-  DISABLED_DesktopPWAsFlagDisabledCreatedForInstalledPwa
-#else
-#define MAYBE_DesktopPWAsFlagDisabledCreatedForInstalledPwa \
-  DesktopPWAsFlagDisabledCreatedForInstalledPwa
-#endif
-
 IN_PROC_BROWSER_TEST_P(HostedAppTest,
-                       MAYBE_DesktopPWAsFlagDisabledCreatedForInstalledPwa) {
+                       DesktopPWAsFlagDisabledCreatedForInstalledPwa) {
   const extensions::Extension* app;
   {
     base::test::ScopedFeatureList feature_list;
@@ -1491,8 +1482,8 @@
 
     chrome::ExecuteCommand(app_browser, IDC_OPEN_IN_CHROME);
 
-    // The browser frame is closed next event loop so it's still safe to
-    // access here.
+    // The browser frame is closed next event loop so it's still safe to access
+    // here.
     EXPECT_EQ(0, app_browser->tab_strip_model()->count());
 
     EXPECT_EQ(2, browser()->tab_strip_model()->count());
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
index 6eeea38..e713957d 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view_unittest.cc
@@ -42,10 +42,6 @@
  public:
   BookmarkBarViewTest() {}
 
-  void SetUp() override {
-    BrowserWithTestWindowTest::SetUp();
-  }
-
   void TearDown() override {
     test_helper_.reset();
     bookmark_bar_view_.reset();
@@ -381,8 +377,14 @@
   views::Widget widget;
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
   params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+#if !defined(OS_CHROMEOS)
+  // On Chrome OS, this always creates a NativeWidgetAura, but it should create
+  // a DesktopNativeWidgetAura for Mash. We can get by without manually creating
+  // it because AshTestViewsDelegate and MusClient will do the right thing
+  // automatically.
   params.native_widget = views::test::CreatePlatformDesktopNativeWidgetImpl(
       params, &widget, nullptr);
+#endif
   widget.Init(params);
   widget.Show();
   widget.GetRootView()->AddChildView(bookmark_bar_view_.get());
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
index 29718048..368ee50 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
@@ -28,12 +28,14 @@
 #include "ui/aura/mus/window_port_mus.h"
 #include "ui/aura/mus/window_tree_host_mus.h"
 #include "ui/aura/window.h"
+#include "ui/aura/window_targeter.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/paint_context.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/events/event_rewriter.h"
 #include "ui/views/background.h"
+#include "ui/views/controls/native/native_view_host.h"
 #include "ui/views/mus/mus_client.h"
 #include "ui/views/view.h"
 #include "ui/views/widget/native_widget_aura.h"
@@ -254,6 +256,18 @@
   if (visible_fraction_ == visible_fraction)
     return;
 
+  // Sets the top inset only when the top-of-window views is fully visible. This
+  // means some gesture may not be recognized well during the animation, but
+  // that's fine since a complicated gesture wouldn't be involved during the
+  // animation duration. See: https://crbug.com/901544.
+  if (browser_view_->IsBrowserTypeNormal()) {
+    if (visible_fraction == 1.0) {
+      browser_view_->contents_web_view()->holder()->SetHitTestTopInset(
+          browser_view_->top_container()->height());
+    } else if (visible_fraction_ == 1.0) {
+      browser_view_->contents_web_view()->holder()->SetHitTestTopInset(0);
+    }
+  }
   visible_fraction_ = visible_fraction;
   browser_view_->Layout();
   browser_view_->frame()->GetFrameView()->UpdateClientArea();
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_unittest.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_unittest.cc
index f50cb0f9..2ea5153 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_unittest.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_unittest.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/frame/immersive_context_mus.h"
 #include "chrome/browser/ui/views/frame/test_with_browser_view.h"
 #include "chrome/browser/ui/views/frame/top_container_view.h"
 #include "chrome/browser/ui/views/fullscreen_control/fullscreen_control_host.h"
@@ -109,6 +110,9 @@
   }
 
  private:
+  // Not used in non-Mash, but harmless.
+  ImmersiveContextMus immersive_context_;
+
   // Not owned.
   ImmersiveModeController* controller_;
 
@@ -302,6 +306,7 @@
   // Make sure the fullscreen control popup doesn't show up.
   ui::MouseEvent mouse_move(ui::ET_MOUSE_MOVED, gfx::Point(1, 1), gfx::Point(),
                             base::TimeTicks(), 0, 0);
+  ASSERT_TRUE(browser_view()->fullscreen_control_host_for_test());
   browser_view()->fullscreen_control_host_for_test()->OnMouseEvent(mouse_move);
   EXPECT_FALSE(browser_view()->fullscreen_control_host_for_test()->IsVisible());
 }
@@ -323,6 +328,7 @@
   // Make sure the fullscreen control popup doesn't show up.
   ui::MouseEvent mouse_move(ui::ET_MOUSE_MOVED, gfx::Point(1, 1), gfx::Point(),
                             base::TimeTicks(), 0, 0);
+  ASSERT_TRUE(browser_view()->fullscreen_control_host_for_test());
   browser_view()->fullscreen_control_host_for_test()->OnMouseEvent(mouse_move);
   EXPECT_FALSE(browser_view()->fullscreen_control_host_for_test()->IsVisible());
 }
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
index a06562a..05653070 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -1134,9 +1134,15 @@
                        DetachToOwnWindowWhileInImmersiveFullscreenMode) {
   // Toggle the immersive fullscreen mode for the initial browser.
   chrome::ToggleFullscreenMode(browser());
-  ASSERT_TRUE(BrowserView::GetBrowserViewForBrowser(browser())
-                  ->immersive_mode_controller()
-                  ->IsEnabled());
+  ImmersiveModeController* controller =
+      BrowserView::GetBrowserViewForBrowser(browser())
+          ->immersive_mode_controller();
+  ASSERT_TRUE(controller->IsEnabled());
+
+  // Forcively reveal the tabstrip immediately.
+  std::unique_ptr<ImmersiveRevealedLock> lock(
+      controller->GetRevealedLock(ImmersiveModeController::ANIMATE_REVEAL_NO));
+  aura::test::WaitForAllChangesToComplete();
 
   // Add another tab.
   AddTabAndResetBrowser(browser());
@@ -1148,10 +1154,9 @@
   ASSERT_TRUE(DragInputToNotifyWhenDone(
       tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip),
       base::Bind(&DetachToOwnWindowStep2, this)));
-  if (input_source() == INPUT_SOURCE_MOUSE) {
+  if (input_source() == INPUT_SOURCE_MOUSE)
     ReleaseMouseAfterWindowDetached();
-    QuitWhenNotDragging();
-  }
+  QuitWhenNotDragging();
 
   // Should no longer be dragging.
   ASSERT_FALSE(tab_strip->IsDragSessionActive());
diff --git a/chrome/browser/ui/views/tabs/tab_strip_unittest.cc b/chrome/browser/ui/views/tabs/tab_strip_unittest.cc
index 22207585..55d49d2 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_unittest.cc
@@ -157,8 +157,8 @@
     tab_strip_ = new TabStrip(std::unique_ptr<TabStripController>(controller_));
     controller_->set_tab_strip(tab_strip_);
     // Do this to force TabStrip to create the buttons.
-    parent_.AddChildView(tab_strip_);
-    parent_.set_owned_by_client();
+    auto* parent = new views::View;
+    parent->AddChildView(tab_strip_);
 
     widget_.reset(new views::Widget);
     views::Widget::InitParams init_params =
@@ -167,7 +167,7 @@
         views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
     init_params.bounds = gfx::Rect(0, 0, 200, 200);
     widget_->Init(init_params);
-    widget_->SetContentsView(&parent_);
+    widget_->SetContentsView(parent);
   }
 
   void TearDown() override {
@@ -218,8 +218,6 @@
 
   // Owned by TabStrip.
   FakeBaseTabStripController* controller_ = nullptr;
-  // Owns |tab_strip_|.
-  views::View parent_;
   TabStrip* tab_strip_ = nullptr;
   std::unique_ptr<views::Widget> widget_;
 
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc
index f193ab2..bb9f298 100644
--- a/chrome/browser/ui/webauthn/sheet_models.cc
+++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -438,6 +438,11 @@
   return l10n_util::GetStringUTF16(IDS_WEBAUTHN_BLE_PAIRING_BEGIN_NEXT);
 }
 
+void AuthenticatorBlePairingBeginSheetModel::OnAccept() {
+  dialog_model()->SetCurrentStep(
+      AuthenticatorRequestDialogModel::Step::kBleDeviceSelection);
+}
+
 // AuthenticatorBleEnterPairingModeSheetModel ---------------------------------
 
 gfx::ImageSkia*
diff --git a/chrome/browser/ui/webauthn/sheet_models.h b/chrome/browser/ui/webauthn/sheet_models.h
index 6df38e4..4ba545c 100644
--- a/chrome/browser/ui/webauthn/sheet_models.h
+++ b/chrome/browser/ui/webauthn/sheet_models.h
@@ -233,6 +233,7 @@
   bool IsAcceptButtonVisible() const override;
   bool IsAcceptButtonEnabled() const override;
   base::string16 GetAcceptButtonLabel() const override;
+  void OnAccept() override;
 };
 
 class AuthenticatorBleEnterPairingModeSheetModel
diff --git a/chrome/browser/ui/webui/print_preview/policy_settings.cc b/chrome/browser/ui/webui/print_preview/policy_settings.cc
index 5177d8d..9f979900 100644
--- a/chrome/browser/ui/webui/print_preview/policy_settings.cc
+++ b/chrome/browser/ui/webui/print_preview/policy_settings.cc
@@ -13,6 +13,16 @@
 void PolicySettings::RegisterProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
   registry->RegisterBooleanPref(prefs::kPrintHeaderFooter, true);
+#if defined(OS_CHROMEOS)
+  registry->RegisterIntegerPref(prefs::kPrintingAllowedColorModes, 0);
+  registry->RegisterIntegerPref(prefs::kPrintingAllowedDuplexModes, 0);
+  registry->RegisterListPref(prefs::kPrintingAllowedPageSizes);
+  registry->RegisterIntegerPref(prefs::kPrintingColorDefault, 0);
+  registry->RegisterIntegerPref(prefs::kPrintingDuplexDefault, 0);
+  registry->RegisterDictionaryPref(prefs::kPrintingSizeDefault);
+  registry->RegisterBooleanPref(prefs::kPrintingSendUsernameAndFilenameEnabled,
+                                false);
+#endif
 }
 
 }  // namespace printing
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index 196d8b9..1ce3214c 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -50,6 +50,7 @@
 #include "components/signin/core/browser/signin_pref_names.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/sync/base/passphrase_enums.h"
+#include "components/sync/driver/sync_user_settings.h"
 #include "components/unified_consent/feature.h"
 #include "components/unified_consent/unified_consent_metrics.h"
 #include "content/public/browser/render_view_host.h"
@@ -721,11 +722,11 @@
     // 2) Pokes the sync service to start *immediately*, i.e. bypass deferred
     //    startup.
     // It's possible that both of these are already the case, i.e. the engine is
-    // already in the process of initializing, in which case RequestStart() will
-    // effectively do nothing. It's also possible that the sync service is
-    // already running in standalone transport mode and so the engine is already
-    // initialized. In that case, this will trigger the service to switch to
-    // full Sync-the-feature mode.
+    // already in the process of initializing, in which case
+    // SetSyncRequested(true) will effectively do nothing. It's also possible
+    // that the sync service is already running in standalone transport mode and
+    // so the engine is already initialized. In that case, this will trigger the
+    // service to switch to full Sync-the-feature mode.
     service->GetUserSettings()->SetSyncRequested(true);
 
     // See if it's even possible to bring up the sync engine - if not
@@ -865,11 +866,11 @@
         // because we don't want the sync engine to remain in the
         // first-setup-incomplete state.
         // Note: In order to disable sync across restarts on Chrome OS,
-        // we must call RequestStop(CLEAR_DATA), which suppresses sync startup
-        // in addition to disabling it.
+        // we must call StopAndClear(), which suppresses sync startup in
+        // addition to disabling it.
         if (sync_service) {
           DVLOG(1) << "Sync setup aborted by user action";
-          sync_service->RequestStop(ProfileSyncService::CLEAR_DATA);
+          sync_service->StopAndClear();
 #if !defined(OS_CHROMEOS)
           // Sign out the user on desktop Chrome if they click cancel during
           // initial setup.
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index d7bf193a..cf8c82a 100644
--- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -489,7 +489,7 @@
   // It's important to tell sync the user cancelled the setup flow before we
   // tell it we're through with the setup progress.
   testing::InSequence seq;
-  EXPECT_CALL(*mock_pss_, RequestStop(ProfileSyncService::CLEAR_DATA));
+  EXPECT_CALL(*mock_pss_, StopAndClear());
   EXPECT_CALL(*mock_pss_, OnSetupInProgressHandleDestroyed());
 
   handler_->CloseSyncSetup();
@@ -1038,7 +1038,7 @@
   std::tie(dice_enabled, unified_consent_enabled) = GetParam();
   unified_consent::ScopedUnifiedConsent unified_consent(
       unified_consent_enabled
-          ? unified_consent::UnifiedConsentFeatureState::kEnabledWithBump
+          ? unified_consent::UnifiedConsentFeatureState::kEnabled
           : unified_consent::UnifiedConsentFeatureState::kDisabled);
   ScopedAccountConsistency dice(
       dice_enabled ? signin::AccountConsistencyMethod::kDice
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
index e53be43..23e3479 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
+++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -414,7 +414,7 @@
     : public DiceTurnSyncOnHelperTestBase {
  public:
   DiceTurnSyncOnHelperTestWithUnifiedConsent()
-      : scoped_unified_consent_(UnifiedConsentFeatureState::kEnabledNoBump) {}
+      : scoped_unified_consent_(UnifiedConsentFeatureState::kEnabled) {}
   ~DiceTurnSyncOnHelperTestWithUnifiedConsent() override {}
 
  private:
diff --git a/chrome/browser/ui/webui/sync_internals_message_handler.cc b/chrome/browser/ui/webui/sync_internals_message_handler.cc
index 55c7e9f2..6397118 100644
--- a/chrome/browser/ui/webui/sync_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/sync_internals_message_handler.cc
@@ -308,7 +308,7 @@
     return;
 
   service->GetUserSettings()->SetSyncRequested(true);
-  // If the service was previously stopped with CLEAR_DATA, then the
+  // If the service was previously stopped via StopAndClear(), then the
   // "first-setup-complete" bit was also cleared, and now the service wouldn't
   // fully start up. So set that too.
   service->GetUserSettings()->SetFirstSetupComplete();
@@ -333,7 +333,7 @@
   if (!service)
     return;
 
-  service->RequestStop(SyncService::CLEAR_DATA);
+  service->StopAndClear();
 }
 
 void SyncInternalsMessageHandler::HandleTriggerRefresh(
diff --git a/chrome/browser/unified_consent/unified_consent_browsertest.cc b/chrome/browser/unified_consent/unified_consent_browsertest.cc
index 98e5637..21d9ad6 100644
--- a/chrome/browser/unified_consent/unified_consent_browsertest.cc
+++ b/chrome/browser/unified_consent/unified_consent_browsertest.cc
@@ -24,7 +24,9 @@
 
 class UnifiedConsentBrowserTest : public SyncTest {
  public:
-  UnifiedConsentBrowserTest() : SyncTest(SINGLE_CLIENT) {}
+  UnifiedConsentBrowserTest(UnifiedConsentFeatureState feature_state =
+                                UnifiedConsentFeatureState::kEnabled)
+      : SyncTest(SINGLE_CLIENT), scoped_unified_consent_state_(feature_state) {}
   ~UnifiedConsentBrowserTest() override = default;
 
   void DisableGoogleServices() {
@@ -64,19 +66,18 @@
  protected:
   base::HistogramTester histogram_tester_;
 
+ private:
+  ScopedUnifiedConsent scoped_unified_consent_state_;
+
   DISALLOW_COPY_AND_ASSIGN(UnifiedConsentBrowserTest);
 };
 
 class UnifiedConsentDisabledBrowserTest : public UnifiedConsentBrowserTest {
  public:
   UnifiedConsentDisabledBrowserTest()
-      : scoped_unified_consent_disabled(UnifiedConsentFeatureState::kDisabled) {
-  }
+      : UnifiedConsentBrowserTest(UnifiedConsentFeatureState::kDisabled) {}
   ~UnifiedConsentDisabledBrowserTest() override = default;
 
- private:
-  ScopedUnifiedConsent scoped_unified_consent_disabled;
-
   DISALLOW_COPY_AND_ASSIGN(UnifiedConsentDisabledBrowserTest);
 };
 
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
index 26b7d60..81fce024 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -153,7 +153,7 @@
       Step next_step = ShouldShowBlePairingUI(
                            previously_paired_with_bluetooth_authenticator_,
                            pair_with_new_device_for_bluetooth_low_energy)
-                           ? Step::kBleDeviceSelection
+                           ? Step::kBlePairingBegin
                            : Step::kBleActivate;
       EnsureBleAdapterIsPoweredBeforeContinuingWithStep(next_step);
       break;
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
index 23253efe..72333df3 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -371,7 +371,7 @@
     Step expected_final_step;
   } kTestCases[] = {
       {AuthenticatorTransport::kBluetoothLowEnergy, nullptr,
-       Step::kBleDeviceSelection},
+       Step::kBlePairingBegin},
       {AuthenticatorTransport::kBluetoothLowEnergy, &test_paired_device_list_,
        Step::kBleActivate},
   };
diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl
index 7f4aa81..5a6cfa3 100644
--- a/chrome/common/extensions/api/file_manager_private.idl
+++ b/chrome/common/extensions/api/file_manager_private.idl
@@ -1150,7 +1150,7 @@
   // |callback|
   static void mountCrostini(SimpleCallback callback);
 
-  // Shares directory with crostini container.
+  // Shares paths with crostini container.
   // |entries| Entries of the files or directories to share.
   // |persist| If true, shares will persist across restarts.
   // |callback|
@@ -1158,6 +1158,13 @@
   static void sharePathsWithCrostini(
       [instanceof=Entry] object[] entries, boolean persist, SimpleCallback callback);
 
+  // Unshares path with crostini container.
+  // |entry| Entry of the file or directory to unshare.
+  // |callback|
+  [nocompile]
+  static void unsharePathWithCrostini(
+      [instanceof=Entry] object entry, SimpleCallback callback);
+
   // Returns list of paths shared with crostini container.
   [nocompile]
   static void getCrostiniSharedPaths(GetCrostiniSharedPathsCallback callback);
diff --git a/chrome/common/extensions/api/file_manager_private_internal.idl b/chrome/common/extensions/api/file_manager_private_internal.idl
index b089677..9fb75d3 100644
--- a/chrome/common/extensions/api/file_manager_private_internal.idl
+++ b/chrome/common/extensions/api/file_manager_private_internal.idl
@@ -106,6 +106,7 @@
                                GetRecentFilesCallback callback);
     static void sharePathsWithCrostini(DOMString[] urls, boolean persist,
                                       SimpleCallback callback);
+    static void unsharePathWithCrostini(DOMString url, SimpleCallback callback);
     static void getCrostiniSharedPaths(
         GetCrostiniSharedPathsCallback callback);
     static void getLinuxPackageInfo(DOMString url,
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 2a47064..f11b4cd0 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1194,6 +1194,11 @@
 
 // A pref holding the default page size.
 const char kPrintingSizeDefault[] = "printing.size_default";
+
+// Boolean flag which represents whether username and filename should be sent
+// to print server.
+const char kPrintingSendUsernameAndFilenameEnabled[] =
+    "printing.send_username_and_filename_enabled";
 #endif  // OS_CHROMEOS
 
 // An integer pref specifying the fallback behavior for sites outside of content
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 65c6f65..c0a3735 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -399,6 +399,7 @@
 extern const char kPrintingColorDefault[];
 extern const char kPrintingDuplexDefault[];
 extern const char kPrintingSizeDefault[];
+extern const char kPrintingSendUsernameAndFilenameEnabled[];
 #endif  // OS_CHROMEOS
 
 extern const char kDefaultSupervisedUserFilteringBehavior[];
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 488d0ec..f854ba8d 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -114,8 +114,8 @@
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/scheduler/web_renderer_process_type.h"
 #include "third_party/blink/public/platform/url_conversion.h"
 #include "third_party/blink/public/platform/web_cache.h"
@@ -362,9 +362,6 @@
   for (const char* origin : kPredefinedAllowedCompositorOrigins)
     allowed_compositor_origins_.insert(origin);
 #endif
-#if BUILDFLAG(ENABLE_PRINTING)
-  printing::SetAgent(GetUserAgent());
-#endif
 
   heap_profiling::SetGCHeapAllocationHookFunctions(
       &blink::WebHeap::SetAllocationHook, &blink::WebHeap::SetFreeHook);
@@ -1735,3 +1732,10 @@
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
   return true;
 }
+
+void ChromeContentRendererClient::DidSetUserAgent(
+    const std::string& user_agent) {
+#if BUILDFLAG(ENABLE_PRINTING)
+  printing::SetAgent(user_agent);
+#endif
+}
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h
index 39e180b..15e5e19a 100644
--- a/chrome/renderer/chrome_content_renderer_client.h
+++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -237,6 +237,7 @@
   blink::WebFrame* FindFrame(blink::WebLocalFrame* relative_to_frame,
                              const std::string& name) override;
   bool IsSafeRedirectTarget(const GURL& url) override;
+  void DidSetUserAgent(const std::string& user_agent) override;
 
 #if BUILDFLAG(ENABLE_PLUGINS)
   static chrome::mojom::PluginInfoHostAssociatedPtr& GetPluginInfoHost();
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index 8b20ab1..0f0d515 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -46,7 +46,7 @@
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_data.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
 #include "third_party/blink/public/platform/web_url.h"
diff --git a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
index 76eb11f..73a0cdb 100644
--- a/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/file_manager_private_custom_bindings.js
@@ -238,6 +238,12 @@
       });
 
   apiFunctions.setHandleRequest(
+      'unsharePathWithCrostini', function(entry, callback) {
+        fileManagerPrivateInternal.unsharePathWithCrostini(
+            getEntryURL(entry), callback);
+      });
+
+  apiFunctions.setHandleRequest(
       'getCrostiniSharedPaths', function(callback) {
         fileManagerPrivateInternal.getCrostiniSharedPaths(
             function(entryDescriptions, firstForSession) {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java
index 4e4bed3..c0a56ef5 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java
@@ -10,7 +10,6 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
-import org.chromium.chrome.browser.init.ProcessInitializationHandler;
 import org.chromium.chrome.browser.signin.AccountTrackerService;
 import org.chromium.chrome.browser.signin.OAuth2TokenService;
 import org.chromium.components.signin.AccountIdProvider;
@@ -43,8 +42,6 @@
      */
     @WorkerThread
     public static void setUpAuthForTest() {
-        ThreadUtils.runOnUiThreadBlocking(
-                () -> ProcessInitializationHandler.getInstance().initializePreNative());
         sAccountManager = new FakeAccountManagerDelegate(
                 FakeAccountManagerDelegate.DISABLE_PROFILE_DATA_SOURCE);
         AccountManagerFacade.overrideAccountManagerFacadeForTests(sAccountManager);
diff --git a/chrome/test/base/browser_with_test_window_test.cc b/chrome/test/base/browser_with_test_window_test.cc
index 9b59a940..b6ae3ed 100644
--- a/chrome/test/base/browser_with_test_window_test.cc
+++ b/chrome/test/base/browser_with_test_window_test.cc
@@ -32,7 +32,12 @@
 #include "components/constrained_window/constrained_window_views.h"
 
 #if defined(OS_CHROMEOS)
+#include "ash/public/cpp/mus_property_mirror_ash.h"
 #include "ash/test/ash_test_views_delegate.h"
+#include "content/public/browser/context_factory.h"
+#include "ui/aura/mus/window_tree_client.h"
+#include "ui/aura/test/env_test_helper.h"
+#include "ui/views/mus/mus_client.h"
 #else
 #include "ui/views/test/test_views_delegate.h"
 #endif
@@ -107,6 +112,23 @@
   // is responsible for cleaning it up (usually by NativeWidget destruction).
   window_.reset(CreateBrowserWindow());
 
+#if defined(OS_CHROMEOS)
+  if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS) {
+    views::MusClient::InitParams mus_client_init_params;
+    mus_client_init_params.connector =
+        ash_test_helper()->GetWindowServiceConnector();
+    mus_client_init_params.create_wm_state = false;
+    mus_client_init_params.running_in_ws_process = true;
+    mus_client_init_params.window_tree_client =
+        aura::test::EnvTestHelper().GetWindowTreeClient();
+    mus_client_ = std::make_unique<views::MusClient>(mus_client_init_params);
+    mus_client_->SetMusPropertyMirror(
+        std::make_unique<ash::MusPropertyMirrorAsh>());
+
+    aura::Env::GetInstance()->set_context_factory(content::GetContextFactory());
+  }
+#endif
+
   browser_.reset(
       CreateBrowser(profile(), browser_type_, hosted_app_, window_.get()));
 }
diff --git a/chrome/test/base/browser_with_test_window_test.h b/chrome/test/base/browser_with_test_window_test.h
index f5ed4de..f4f7f2e4 100644
--- a/chrome/test/base/browser_with_test_window_test.h
+++ b/chrome/test/base/browser_with_test_window_test.h
@@ -34,6 +34,7 @@
 
 #if defined(TOOLKIT_VIEWS)
 namespace views {
+class MusClient;
 class TestViewsDelegate;
 }
 #endif
@@ -194,6 +195,7 @@
 #if defined(OS_CHROMEOS)
   AshTestEnvironmentChrome ash_test_environment_;
   ash::AshTestHelper ash_test_helper_;
+  std::unique_ptr<views::MusClient> mus_client_;
 #elif defined(TOOLKIT_VIEWS)
   std::unique_ptr<views::ScopedViewsTestHelper> views_test_helper_;
 #endif
diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc
index 6c694fc..882c62a 100644
--- a/chrome/test/chromedriver/capabilities.cc
+++ b/chrome/test/chromedriver/capabilities.cc
@@ -699,6 +699,7 @@
 Capabilities::Capabilities()
     : accept_insecure_certs(false),
       page_load_strategy(PageLoadStrategy::kNormal),
+      strict_file_interactability(false),
       android_use_running_app(false),
       detach(false),
       extension_load_timeout(base::TimeDelta::FromSeconds(10)),
@@ -731,6 +732,8 @@
   parser_map["pageLoadStrategy"] = base::BindRepeating(&ParsePageLoadStrategy);
   parser_map["proxy"] = base::BindRepeating(&ParseProxy, w3c_compliant);
   parser_map["timeouts"] = base::BindRepeating(&ParseTimeouts);
+  parser_map["strictFileInteractability"] =
+      base::BindRepeating(&ParseBoolean, &strict_file_interactability);
   if (!w3c_compliant) {
     // TODO(https://crbug.com/chromedriver/2596): "unexpectedAlertBehaviour" is
     // legacy name of "unhandledPromptBehavior", remove when we stop supporting
diff --git a/chrome/test/chromedriver/capabilities.h b/chrome/test/chromedriver/capabilities.h
index ed86de5..60ce726 100644
--- a/chrome/test/chromedriver/capabilities.h
+++ b/chrome/test/chromedriver/capabilities.h
@@ -125,6 +125,8 @@
   base::TimeDelta page_load_timeout = Session::kDefaultPageLoadTimeout;
   base::TimeDelta implicit_wait_timeout = Session::kDefaultImplicitWaitTimeout;
 
+  bool strict_file_interactability;
+
   std::string unhandled_prompt_behavior;
 
   //
diff --git a/chrome/test/chromedriver/session.cc b/chrome/test/chromedriver/session.cc
index 4450157..38bc708 100644
--- a/chrome/test/chromedriver/session.cc
+++ b/chrome/test/chromedriver/session.cc
@@ -51,7 +51,8 @@
       implicit_wait(kDefaultImplicitWaitTimeout),
       page_load_timeout(kDefaultPageLoadTimeout),
       script_timeout(kDefaultScriptTimeout),
-      auto_reporting_enabled(false) {}
+      auto_reporting_enabled(false),
+      strict_file_interactability(false){}
 
 Session::Session(const std::string& id, std::unique_ptr<Chrome> chrome)
     : id(id),
@@ -68,7 +69,8 @@
       implicit_wait(kDefaultImplicitWaitTimeout),
       page_load_timeout(kDefaultPageLoadTimeout),
       script_timeout(kDefaultScriptTimeout),
-      auto_reporting_enabled(false) {}
+      auto_reporting_enabled(false),
+      strict_file_interactability(false){}
 
 Session::~Session() {}
 
diff --git a/chrome/test/chromedriver/session.h b/chrome/test/chromedriver/session.h
index 2a26abc1..7b3ab8f 100644
--- a/chrome/test/chromedriver/session.h
+++ b/chrome/test/chromedriver/session.h
@@ -107,6 +107,7 @@
   // |CommandListener|s might be |CommandListenerProxy|s that forward to
   // |DevToolsEventListener|s owned by |chrome|.
   std::vector<std::unique_ptr<CommandListener>> command_listeners;
+  bool strict_file_interactability;
   std::string unhandled_prompt_behavior;
 };
 
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index d4007e1..2c7df76 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -138,6 +138,8 @@
                    session->page_load_timeout.InMilliseconds());
   caps->SetInteger("timeouts.implicit",
                    session->implicit_wait.InMilliseconds());
+  caps->SetBoolean("strictFileInteractability",
+                    session->strict_file_interactability);
   caps->SetString(session->w3c_compliant ? "unhandledPromptBehavior"
                                          : "unexpectedAlertBehaviour",
                   session->unhandled_prompt_behavior);
@@ -277,7 +279,8 @@
   session->implicit_wait = capabilities.implicit_wait_timeout;
   session->page_load_timeout = capabilities.page_load_timeout;
   session->script_timeout = capabilities.script_timeout;
-
+  session->strict_file_interactability =
+        capabilities.strict_file_interactability;
   Log::Level driver_level = Log::kWarning;
   if (capabilities.logging_prefs.count(WebDriverLog::kDriverType))
     driver_level = capabilities.logging_prefs[WebDriverLog::kDriverType];
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index efa23bb..f12cf015 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -181,13 +181,9 @@
     'RemoteBrowserTest.*',
     # Flaky: https://crbug.com/899919
     'SessionHandlingTest.testGetSessions',
-]
-
-# https://crbug.com/904061
-if util.GetPlatformName() == 'mac':
-  _INTEGRATION_NEGATIVE_FILTER += [
+    # Flaky and affects subsequent tests: https://crbug.com/904061
     'ChromeDriverSiteIsolation.testCanClickOOPIF',
-  ]
+]
 
 
 def _GetDesktopNegativeFilter(version_name):
diff --git a/chrome/test/data/extensions/api_test/file_browser/crostini_test/test.js b/chrome/test/data/extensions/api_test/file_browser/crostini_test/test.js
index b29fba38..b449fb0 100644
--- a/chrome/test/data/extensions/api_test/file_browser/crostini_test/test.js
+++ b/chrome/test/data/extensions/api_test/file_browser/crostini_test/test.js
@@ -73,5 +73,11 @@
         chrome.test.callbackPass((entries, firstForSession) => {
           chrome.test.assertFalse(firstForSession);
         }));
-  }
+  },
+  function testUnsharePathWithCrostiniSuccess() {
+    getEntry('downloads', 'share_dir').then((entry) => {
+      chrome.fileManagerPrivate.unsharePathWithCrostini(
+          entry, chrome.test.callbackPass());
+    });
+  },
 ]);
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index a46c654..ad9bc13 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -356,6 +356,14 @@
     ]
   },
 
+  "PrintingSendUsernameAndFilenameEnabled": {
+    "os": ["chromeos"],
+    "test_policy": { "PrintingSendUsernameAndFilenameEnabled": true },
+    "pref_mappings": [
+      { "pref": "printing.send_username_and_filename_enabled" }
+    ]
+  },
+
   "CloudPrintSubmitEnabled": {
     "os": ["win", "mac", "linux"],
     "test_policy": { "CloudPrintSubmitEnabled": false },
diff --git a/chrome/test/data/webrtc/webrtc_jsep01_test.html b/chrome/test/data/webrtc/webrtc_jsep01_test.html
index 8a35eac..f2286612 100644
--- a/chrome/test/data/webrtc/webrtc_jsep01_test.html
+++ b/chrome/test/data/webrtc/webrtc_jsep01_test.html
@@ -11,6 +11,13 @@
   <script type="text/javascript" src="indexeddb.js"></script>
   <script type="text/javascript" src="peerconnection_getstats.js"></script>
   <script type="text/javascript" src="peerconnection_replacetrack.js"></script>
+  <script type="text/javascript">
+    function showVideo() {
+      // For debugging by humans.
+      document.getElementById('local-view').style.display = "inline";
+      document.getElementById('remote-view').style.display = "inline";
+    }
+  </script>
 </head>
 <body>
   <table border="0">
@@ -21,6 +28,9 @@
       <td><canvas id="blueCanvas" width="10" height="10" style="background-color:#0000FF"/></td>
       <td><canvas id="whiteCanvas" width="10" height="10" style="background-color:#FFFFFF"/></td>
     </tr>
+    <tr>
+      <td><button onclick="showVideo()">Click here to show video</button></td>
+    </tr>
   </table>
 </body>
 </html>
diff --git a/chrome/test/data/webui/signin_browsertest.cc b/chrome/test/data/webui/signin_browsertest.cc
index 15aa0de..7c320784 100644
--- a/chrome/test/data/webui/signin_browsertest.cc
+++ b/chrome/test/data/webui/signin_browsertest.cc
@@ -20,5 +20,5 @@
   EnableDice();
   scoped_unified_consent_ =
       std::make_unique<unified_consent::ScopedUnifiedConsent>(
-          unified_consent::UnifiedConsentFeatureState::kEnabledNoBump);
+          unified_consent::UnifiedConsentFeatureState::kEnabled);
 }
diff --git a/chrome/utility/OWNERS b/chrome/utility/OWNERS
new file mode 100644
index 0000000..8cdc929
--- /dev/null
+++ b/chrome/utility/OWNERS
@@ -0,0 +1,2 @@
+# For service-related code
+per-file chrome_content_utility_client.*=rockot@google.com
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc
index 82b757a..e621415 100644
--- a/chrome/utility/chrome_content_utility_client.cc
+++ b/chrome/utility/chrome_content_utility_client.cc
@@ -290,11 +290,6 @@
   }
 #endif
 
-#if defined(OS_CHROMEOS)
-  // TODO(jamescook): Figure out why we have to do this when not using mash.
-  mash_service_factory_->RegisterOutOfProcessServices(services);
-#endif
-
 #if BUILDFLAG(ENABLE_SIMPLE_BROWSER_SERVICE_OUT_OF_PROCESS)
   {
     service_manager::EmbeddedServiceInfo service_info;
@@ -323,8 +318,7 @@
 
 #if BUILDFLAG(ENABLE_PRINTING)
   if (service_name == printing::mojom::kServiceName) {
-    return printing::CreatePdfCompositorService(GetUserAgent(),
-                                                std::move(request));
+    return printing::CreatePdfCompositorService(std::move(request));
   }
 #endif
 
diff --git a/chrome/utility/mash_service_factory.cc b/chrome/utility/mash_service_factory.cc
index f5fc4f5..fa980b87 100644
--- a/chrome/utility/mash_service_factory.cc
+++ b/chrome/utility/mash_service_factory.cc
@@ -35,17 +35,6 @@
   kMaxValue = kFontDeprecated,
 };
 
-using ServiceFactoryFunction = std::unique_ptr<service_manager::Service>();
-
-void RegisterMashService(
-    content::ContentUtilityClient::StaticServiceMap* services,
-    const std::string& name,
-    ServiceFactoryFunction factory_function) {
-  service_manager::EmbeddedServiceInfo service_info;
-  service_info.factory = base::BindRepeating(factory_function);
-  services->emplace(name, service_info);
-}
-
 // Wrapper function so we only have one copy of histogram macro generated code.
 void RecordMashServiceLaunch(MashService service) {
   UMA_HISTOGRAM_ENUMERATION("Launch.MashService", service);
@@ -66,17 +55,19 @@
       std::move(request));
 }
 
-std::unique_ptr<service_manager::Service> CreateShortcutViewerApp() {
+std::unique_ptr<service_manager::Service> CreateShortcutViewerApp(
+    service_manager::mojom::ServiceRequest request) {
   RecordMashServiceLaunch(MashService::kShortcutViewer);
   logging::SetLogPrefix("shortcut");
-  return std::make_unique<
-      keyboard_shortcut_viewer::ShortcutViewerApplication>();
+  return std::make_unique<keyboard_shortcut_viewer::ShortcutViewerApplication>(
+      std::move(request));
 }
 
-std::unique_ptr<service_manager::Service> CreateTapVisualizerApp() {
+std::unique_ptr<service_manager::Service> CreateTapVisualizerApp(
+    service_manager::mojom::ServiceRequest request) {
   RecordMashServiceLaunch(MashService::kTapVisualizer);
   logging::SetLogPrefix("tap");
-  return std::make_unique<tap_visualizer::TapVisualizerApp>();
+  return std::make_unique<tap_visualizer::TapVisualizerApp>(std::move(request));
 }
 
 }  // namespace
@@ -85,16 +76,6 @@
 
 MashServiceFactory::~MashServiceFactory() = default;
 
-void MashServiceFactory::RegisterOutOfProcessServices(
-    content::ContentUtilityClient::StaticServiceMap* services) {
-  RegisterMashService(services, shortcut_viewer::mojom::kServiceName,
-                      &CreateShortcutViewerApp);
-  RegisterMashService(services, tap_visualizer::mojom::kServiceName,
-                      &CreateTapVisualizerApp);
-
-  keyboard_shortcut_viewer::ShortcutViewerApplication::RegisterForTraceEvents();
-}
-
 std::unique_ptr<service_manager::Service>
 MashServiceFactory::HandleServiceRequest(
     const std::string& service_name,
@@ -103,6 +84,13 @@
     return CreateAshService(std::move(request));
   if (service_name == quick_launch::mojom::kServiceName)
     return CreateQuickLaunchService(std::move(request));
+  if (service_name == shortcut_viewer::mojom::kServiceName) {
+    keyboard_shortcut_viewer::ShortcutViewerApplication ::
+        RegisterForTraceEvents();
+    return CreateShortcutViewerApp(std::move(request));
+  }
+  if (service_name == tap_visualizer::mojom::kServiceName)
+    return CreateTapVisualizerApp(std::move(request));
 
   return nullptr;
 }
diff --git a/chrome/utility/mash_service_factory.h b/chrome/utility/mash_service_factory.h
index 95d09c5..b5763f1 100644
--- a/chrome/utility/mash_service_factory.h
+++ b/chrome/utility/mash_service_factory.h
@@ -18,10 +18,6 @@
   MashServiceFactory();
   ~MashServiceFactory();
 
-  // Registers out-of-process services for mash.
-  void RegisterOutOfProcessServices(
-      content::ContentUtilityClient::StaticServiceMap* services);
-
   // Handles an incoming service request for this utility process. Returns
   // null if the named service is unknown or cannot be created.
   std::unique_ptr<service_manager::Service> HandleServiceRequest(
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index 31808a4..9eebb35 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -545,4 +545,10 @@
 
     jni_package = "chromecast"
   }
+
+  java_cpp_enum("java_enums") {
+    sources = [
+      "cast_content_window.h",
+    ]
+  }
 }
diff --git a/chromecast/browser/android/BUILD.gn b/chromecast/browser/android/BUILD.gn
index 77884cdc..99cf358 100644
--- a/chromecast/browser/android/BUILD.gn
+++ b/chromecast/browser/android/BUILD.gn
@@ -2,8 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//chromecast/chromecast.gni")
 import("//build/config/android/rules.gni")
+import("//chromecast/chromecast.gni")
 import("//media/media_options.gni")
 
 assert(is_android)
@@ -129,6 +129,7 @@
   srcjar_deps = [
     ":cast_shell_build_config_gen",
     ":logs_provider_aidl",
+    "//chromecast/browser:java_enums",
   ]
 
   deps = [
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsIntentUtils.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsIntentUtils.java
index 1055b0f..568a617 100644
--- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsIntentUtils.java
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsIntentUtils.java
@@ -55,21 +55,21 @@
     /**
      * Action type of intent from cast app to android to request for a visibility priority change.
      */
-    static final String ACTION_REQUEST_VISIBILITY_PRIORITY =
+    public static final String ACTION_REQUEST_VISIBILITY_PRIORITY =
             "com.google.android.apps.castshell.intent.action.REQUEST_VISIBILITY_PRIORITY";
 
     /**
      * Action type of intent from CastShell to external acivity to notify whether the gesture
      * has been consumed.
      */
-    static final String ACTION_GESTURE_CONSUMED =
+    public static final String ACTION_GESTURE_CONSUMED =
             "com.google.android.apps.castshell.intent.action.GESTURE_CONSUMED";
 
     /**
      * Action type of intent from cast app to android to request to move the cast view out of
      * screen.
      */
-    static final String ACTION_REQUEST_MOVE_OUT =
+    public static final String ACTION_REQUEST_MOVE_OUT =
             "com.google.android.apps.castshell.intent.action.REQUEST_MOVE_OUT";
 
     /**
@@ -136,17 +136,20 @@
             "com.google.android.apps.castshell.intent.extra.GESTURE_TYPE";
 
     /**
-     * Key of extra value of the intent ACTION_GUESTURE_CONSUMED, value is whether gesture
+     * Key of extra value of the intent ACTION_GESTURE_CONSUMED, value is whether gesture
      * is consumed(consumed: true, not: false).
      */
     private static final String INTENT_EXTRA_GESTURE_CONSUMED =
             "com.google.android.apps.castshell.intent.extra.GESTURE_CONSUMED";
 
-    // Matches to chromecast::shell::VisibilityPriority
-    static final int VISIBITY_TYPE_UNKNOWN = 0;
-    static final int VISIBITY_TYPE_FULL_SCREEN = 1;
-    static final int VISIBITY_TYPE_PARTIAL_OUT = 2;
-    static final int VISIBITY_TYPE_HIDDEN = 3;
+    @VisibilityType
+    static final int VISIBITY_TYPE_UNKNOWN = VisibilityType.UNKNOWN;
+    @VisibilityType
+    static final int VISIBITY_TYPE_FULL_SCREEN = VisibilityType.FULL_SCREEN;
+    @VisibilityType
+    static final int VISIBITY_TYPE_PARTIAL_OUT = VisibilityType.PARTIAL_OUT;
+    @VisibilityType
+    static final int VISIBITY_TYPE_HIDDEN = VisibilityType.HIDDEN;
 
     // CastWebContentsSurfaceHelper -> CastWebContentsComponent.Receiver
     // -> CastContentWindowAndroid
@@ -157,17 +160,17 @@
 
     // Host activity of CastWebContentsFragment -> CastWebContentsComponent.Receiver
     // -> CastContentWindowAndroid
-    public static Intent onGesture(String instanceId, int gestureType) {
+    public static Intent onGesture(String instanceId, @GestureType int gestureType) {
         return onGesture(getInstanceUri(instanceId), gestureType);
     }
 
     // Host activity of CastWebContentsFragment -> CastWebContentsComponent.Receiver
     // -> CastContentWindowAndroid
-    public static Intent onGestureWithUriString(String uri, int gestureType) {
+    public static Intent onGestureWithUriString(String uri, @GestureType int gestureType) {
         return onGesture(Uri.parse(uri), gestureType);
     }
 
-    private static Intent onGesture(Uri uri, int gestureType) {
+    private static Intent onGesture(Uri uri, @GestureType int gestureType) {
         if (DEBUG) Log.d(TAG, "onGesture with uri:" + uri + " type:" + gestureType);
         Intent intent = new Intent(ACTION_ON_GESTURE, uri);
         intent.putExtra(INTENT_EXTRA_GESTURE_TYPE, gestureType);
@@ -184,17 +187,18 @@
 
     // Host activity of CastWebContentsFragment -> CastWebContentsComponent.Receiver
     // -> CastContentWindowAndroid
-    public static Intent onVisibilityChange(String instanceId, int visibilityType) {
+    public static Intent onVisibilityChange(String instanceId, @VisibilityType int visibilityType) {
         return onVisibilityChange(getInstanceUri(instanceId), visibilityType);
     }
 
     // Host activity of CastWebContentsFragment -> CastWebContentsComponent.Receiver
     // -> CastContentWindowAndroid
-    public static Intent onVisibilityChangeWithUriString(String uri, int visibilityType) {
+    public static Intent onVisibilityChangeWithUriString(
+            String uri, @VisibilityType int visibilityType) {
         return onVisibilityChange(Uri.parse(uri), visibilityType);
     }
 
-    private static Intent onVisibilityChange(Uri uri, int visibilityType) {
+    private static Intent onVisibilityChange(Uri uri, @VisibilityType int visibilityType) {
         if (DEBUG) Log.d(TAG, "onVisibilityChange with uri:" + uri + " type:" + visibilityType);
 
         Intent intent = new Intent(ACTION_ON_VISIBILITY_CHANGE, uri);
@@ -210,7 +214,8 @@
     }
 
     // CastContentWindowAndroid -> Host activity of CastWebContentsFragment
-    public static Intent requestVisibilityPriority(String instanceId, int visibilityPriority) {
+    public static Intent requestVisibilityPriority(
+            String instanceId, @VisibilityPriority int visibilityPriority) {
         Intent intent = new Intent(ACTION_REQUEST_VISIBILITY_PRIORITY);
         intent.putExtra(INTENT_EXTRA_URI, getInstanceUri(instanceId).toString());
         intent.putExtra(INTENT_EXTRA_VISIBILITY_PRIORITY, visibilityPriority);
@@ -218,7 +223,8 @@
     }
 
     // CastWebContentsComponent.Receiver -> Host activity of CastWebContentsFragment
-    public static Intent gestureConsumed(String instanceId, int gestureType, boolean consumed) {
+    public static Intent gestureConsumed(
+            String instanceId, @GestureType int gestureType, boolean consumed) {
         Intent intent = new Intent(ACTION_GESTURE_CONSUMED);
         intent.putExtra(INTENT_EXTRA_URI, getInstanceUri(instanceId).toString());
         intent.putExtra(INTENT_EXTRA_GESTURE_TYPE, gestureType);
@@ -227,6 +233,7 @@
     }
 
     // Used by intent of ACTION_ON_GESTURE
+    @GestureType
     public static int getGestureType(Intent in) {
         return in.getIntExtra(INTENT_EXTRA_GESTURE_TYPE, 0);
     }
@@ -237,26 +244,29 @@
     }
 
     // Used by intent of ACTION_ON_VISIBILITY_CHANGE
+    @VisibilityType
     public static int getVisibilityType(Intent in) {
         return in.getIntExtra(INTENT_EXTRA_VISIBILITY_TYPE, 0);
     }
 
-    // Used by intent of ACTION_KEY_EVENT
+    // Used by intent of ACTION_REQUEST_VISIBILITY_PRIORITY, ACTION_SHOW_WEB_CONTENT
+    @VisibilityPriority
     public static int getVisibilityPriority(Bundle bundle) {
         return bundle.getInt(INTENT_EXTRA_VISIBILITY_PRIORITY, 0);
     }
 
     // Used by intent of ACTION_REQUEST_VISIBILITY_PRIORITY, ACTION_SHOW_WEB_CONTENT
+    @VisibilityPriority
     public static int getVisibilityPriority(Intent in) {
         return getVisibilityPriority(in.getExtras());
     }
 
-    // Used by intent of ACTION_REQUEST_VISIBILITY_PRIORITY, ACTION_SHOW_WEB_CONTENT
+    // Used by intent of ACTION_GESTURE_CONSUMED
     public static boolean isGestureConsumed(Intent in) {
         return isGestureConsumed(in.getExtras());
     }
 
-    // Used by intent of ACTION_REQUEST_VISIBILITY_PRIORITY, ACTION_SHOW_WEB_CONTENT
+    // Used by intent of ACTION_GESTURE_CONSUMED
     public static boolean isGestureConsumed(Bundle bundle) {
         return bundle.getBoolean(INTENT_EXTRA_GESTURE_CONSUMED);
     }
@@ -303,7 +313,7 @@
 
     // CastWebContentsComponent.Receiver -> Host activity of CastWebContentsFragment
     public static Intent requestStartCastFragment(WebContents webContents, String appId,
-            int visibilityPriority, boolean enableTouch, String instanceId,
+            @VisibilityPriority int visibilityPriority, boolean enableTouch, String instanceId,
             boolean isRemoteControlMode, boolean turnOnScreen) {
         Intent intent = new Intent();
         intent.setAction(CastIntents.ACTION_SHOW_WEB_CONTENT);
diff --git a/chromecast/browser/cast_content_window.h b/chromecast/browser/cast_content_window.h
index 80744b87..c5a6c81 100644
--- a/chromecast/browser/cast_content_window.h
+++ b/chromecast/browser/cast_content_window.h
@@ -21,6 +21,7 @@
 namespace shell {
 
 // Describes visual context of the window within the UI.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chromecast.shell
 enum class VisibilityType {
   // Unknown visibility state.
   UNKNOWN = 0,
@@ -43,6 +44,7 @@
 // 2. Whether the window should become immediately visible
 // 3. How much screen space the window should occupy
 // 4. What state to return to when the activity is completed
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chromecast.shell
 enum class VisibilityPriority {
   // Default priority. It is up to system to decide how to show the activity.
   DEFAULT = 0,
@@ -72,6 +74,7 @@
   HIDDEN_STICKY = 6,
 };
 
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chromecast.shell
 enum class GestureType {
   NO_GESTURE = 0,
   GO_BACK = 1,
diff --git a/components/autofill/core/browser/autofill_experiments.cc b/components/autofill/core/browser/autofill_experiments.cc
index 3d93a20..3482820 100644
--- a/components/autofill/core/browser/autofill_experiments.cc
+++ b/components/autofill/core/browser/autofill_experiments.cc
@@ -22,6 +22,7 @@
 #include "components/sync/driver/sync_service_utils.h"
 #include "components/variations/variations_associated_data.h"
 #include "google_apis/gaia/gaia_auth_util.h"
+#include "google_apis/gaia/google_service_auth_error.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_base_features.h"
 
@@ -68,17 +69,23 @@
 bool IsCreditCardUploadEnabled(const PrefService* pref_service,
                                const syncer::SyncService* sync_service,
                                const std::string& user_email) {
-  // Check Autofill sync setting.
-  if (!(sync_service && sync_service->CanSyncFeatureStart() &&
-        sync_service->GetPreferredDataTypes().Has(syncer::AUTOFILL_PROFILE))) {
+  if (!sync_service || sync_service->GetAuthError().IsPersistentError() ||
+      !sync_service->GetActiveDataTypes().Has(syncer::AUTOFILL_WALLET_DATA)) {
+    // If credit card sync is not active, we're not offering to upload cards.
     return false;
   }
 
-  // Check if the upload to Google state is active.
-  if (syncer::GetUploadToGoogleState(sync_service,
-                                     syncer::ModelType::AUTOFILL_WALLET_DATA) !=
-      syncer::UploadState::ACTIVE) {
-    return false;
+  if (sync_service->IsSyncFeatureActive()) {
+    if (!sync_service->GetActiveDataTypes().Has(syncer::AUTOFILL_PROFILE)) {
+      // In full sync mode, we only allow card upload when addresses are also
+      // active, because we upload potential billing addresses with the card.
+      return false;
+    }
+  } else {
+    // If Wallet sync is running even when sync the feature is off, the account
+    // Wallet feature must be on.
+    DCHECK(base::FeatureList::IsEnabled(
+        features::kAutofillEnableAccountWalletStorage));
   }
 
   // Also don't offer upload for users that have a secondary sync passphrase.
@@ -88,6 +95,11 @@
   if (sync_service->IsUsingSecondaryPassphrase())
     return false;
 
+  // Don't offer upload for users that are only syncing locally, since they
+  // won't receive the cards back from Google Payments.
+  if (sync_service->IsLocalSyncEnabled())
+    return false;
+
   // Check Payments integration user setting.
   if (!prefs::IsPaymentsIntegrationEnabled(pref_service))
     return false;
diff --git a/components/autofill/core/browser/autofill_experiments_unittest.cc b/components/autofill/core/browser/autofill_experiments_unittest.cc
index 91e6e95..242f2c1 100644
--- a/components/autofill/core/browser/autofill_experiments_unittest.cc
+++ b/components/autofill/core/browser/autofill_experiments_unittest.cc
@@ -49,13 +49,6 @@
   EXPECT_FALSE(IsCreditCardUploadEnabled());
 }
 
-TEST_F(AutofillExperimentsTest, DenyUpload_SyncServiceCannotStart) {
-  scoped_feature_list_.InitAndEnableFeature(features::kAutofillUpstream);
-  sync_service_.SetDisableReasons(
-      syncer::SyncService::DISABLE_REASON_USER_CHOICE);
-  EXPECT_FALSE(IsCreditCardUploadEnabled());
-}
-
 TEST_F(AutofillExperimentsTest, DenyUpload_AuthError) {
   scoped_feature_list_.InitAndEnableFeature(features::kAutofillUpstream);
   sync_service_.SetAuthError(
@@ -63,24 +56,17 @@
   EXPECT_FALSE(IsCreditCardUploadEnabled());
 }
 
-TEST_F(AutofillExperimentsTest,
-       DenyUpload_SyncServiceDoesNotHaveAutofillProfilePreferredDataType) {
+TEST_F(AutofillExperimentsTest, DenyUpload_SyncDoesNotHaveWalletDataType) {
   scoped_feature_list_.InitAndEnableFeature(features::kAutofillUpstream);
-  sync_service_.SetPreferredDataTypes(syncer::ModelTypeSet());
   sync_service_.SetActiveDataTypes(syncer::ModelTypeSet());
   EXPECT_FALSE(IsCreditCardUploadEnabled());
 }
 
-TEST_F(AutofillExperimentsTest, DenyUpload_SyncCycleNotComplete) {
+TEST_F(AutofillExperimentsTest,
+       DenyUpload_FullSyncDoesNotHaveAutofillProfileActiveDataType) {
   scoped_feature_list_.InitAndEnableFeature(features::kAutofillUpstream);
-  sync_service_.SetLastCycleSnapshot(syncer::SyncCycleSnapshot());
-  EXPECT_FALSE(IsCreditCardUploadEnabled());
-}
-
-TEST_F(AutofillExperimentsTest, DenyUpload_SyncConfigurationNotDone) {
-  scoped_feature_list_.InitAndEnableFeature(features::kAutofillUpstream);
-  sync_service_.SetTransportState(
-      syncer::SyncService::TransportState::CONFIGURING);
+  sync_service_.SetActiveDataTypes(
+      syncer::ModelTypeSet(syncer::AUTOFILL_WALLET_DATA));
   EXPECT_FALSE(IsCreditCardUploadEnabled());
 }
 
@@ -103,6 +89,36 @@
   EXPECT_FALSE(IsCreditCardUploadEnabled(""));
 }
 
+TEST_F(AutofillExperimentsTest, AllowUpload_TransportModeOnly) {
+  scoped_feature_list_.InitWithFeatures(
+      /*enable_features=*/{features::kAutofillUpstream,
+                           features::kAutofillEnableAccountWalletStorage},
+      /*disable_features=*/{});
+  // When we have no primary account, Sync will start in Transport-only mode
+  // (if allowed).
+  sync_service_.SetIsAuthenticatedAccountPrimary(false);
+
+  EXPECT_TRUE(IsCreditCardUploadEnabled("john.smith@gmail.com"));
+}
+
+TEST_F(AutofillExperimentsTest,
+       AllowUpload_TransportSyncDoesNotHaveAutofillProfileActiveDataType) {
+  scoped_feature_list_.InitWithFeatures(
+      /*enable_features=*/{features::kAutofillUpstream,
+                           features::kAutofillEnableAccountWalletStorage},
+      /*disable_features=*/{});
+  // When we have no primary account, Sync will start in Transport-only mode
+  // (if allowed).
+  sync_service_.SetIsAuthenticatedAccountPrimary(false);
+
+  // Update the active types to only include Wallet. This disables all other
+  // types, including profiles.
+  sync_service_.SetActiveDataTypes(
+      syncer::ModelTypeSet(syncer::AUTOFILL_WALLET_DATA));
+
+  EXPECT_TRUE(IsCreditCardUploadEnabled());
+}
+
 TEST_F(AutofillExperimentsTest, AllowUpload_UserEmailWithGoogleDomain) {
   scoped_feature_list_.InitAndEnableFeature(features::kAutofillUpstream);
   EXPECT_TRUE(IsCreditCardUploadEnabled("john.smith@gmail.com"));
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index 919461f3..3f61dab 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -1416,10 +1416,13 @@
   if (is_syncing_for_test_)
     return true;
 
-  // Server cards should be suggested if the sync service active.
-  return syncer::GetUploadToGoogleState(
-             sync_service_, syncer::ModelType::AUTOFILL_WALLET_DATA) ==
-         syncer::UploadState::ACTIVE;
+  // Server cards should be suggested if the sync service is active.
+  // We check for persistent auth errors, because we don't want to offer server
+  // cards when the user is in the "sync paused" state.
+  return sync_service_ &&
+         sync_service_->GetActiveDataTypes().Has(
+             syncer::AUTOFILL_WALLET_DATA) &&
+         !sync_service_->GetAuthError().IsPersistentError();
 }
 
 std::string PersonalDataManager::CountryCodeForCurrentTimezone() const {
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index 274d50fe..b92d777 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -189,7 +189,7 @@
   }
 
   void ResetPersonalDataManager(UserMode user_mode,
-                                bool use_account_server_storage) {
+                                bool use_sync_transport_mode) {
     bool is_incognito = (user_mode == USER_MODE_INCOGNITO);
     personal_data_.reset(new PersonalDataManagerMock("en"));
     personal_data_->Init(
@@ -207,7 +207,7 @@
     AccountInfo account_info;
     account_info.email = "sync@account";
     sync_service_.SetAuthenticatedAccountInfo(account_info);
-    sync_service_.SetIsAuthenticatedAccountPrimary(!use_account_server_storage);
+    sync_service_.SetIsAuthenticatedAccountPrimary(!use_sync_transport_mode);
     personal_data_->OnSyncServiceInitialized(&sync_service_);
     personal_data_->OnStateChanged(&sync_service_);
 
@@ -218,7 +218,7 @@
   }
 
   void ResetPersonalDataManager(UserMode user_mode) {
-    ResetPersonalDataManager(user_mode, /*use_account_server_storage=*/false);
+    ResetPersonalDataManager(user_mode, /*use_sync_transport_mode=*/false);
   }
 
   void ResetProfiles() {
@@ -5572,7 +5572,7 @@
   ///////////////////////////////////////////////////////////////////////
   EnableWalletCardImport();
   ResetPersonalDataManager(USER_MODE_NORMAL,
-                           /*use_account_server_storage=*/true);
+                           /*use_sync_transport_mode=*/true);
   ASSERT_FALSE(personal_data_->IsSyncFeatureEnabled());
 
   // Add a local profile.
@@ -6248,6 +6248,34 @@
 }
 #endif  // !defined(OS_ANDROID)
 
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
+TEST_F(PersonalDataManagerTest, ServerCardsShowInTransportMode) {
+  // Set up PersonalDataManager in transport mode.
+  ResetPersonalDataManager(USER_MODE_NORMAL,
+                           /*use_sync_transport_mode=*/true);
+  SetUpThreeCardTypes();
+
+  // Check that the server cards are available for suggestion.
+  EXPECT_EQ(3U, personal_data_->GetCreditCards().size());
+  EXPECT_EQ(
+      3U, personal_data_->GetCreditCardsToSuggest(/*include_server_cards=*/true)
+              .size());
+  EXPECT_EQ(1U, personal_data_->GetLocalCreditCards().size());
+  EXPECT_EQ(2U, personal_data_->GetServerCreditCards().size());
+
+  // Stop Wallet sync.
+  sync_service_.SetActiveDataTypes(syncer::ModelTypeSet());
+
+  // Check that server cards are unavailable.
+  EXPECT_EQ(3U, personal_data_->GetCreditCards().size());
+  EXPECT_EQ(
+      1U, personal_data_->GetCreditCardsToSuggest(/*include_server_cards=*/true)
+              .size());
+  EXPECT_EQ(1U, personal_data_->GetLocalCreditCards().size());
+  EXPECT_EQ(2U, personal_data_->GetServerCreditCards().size());
+}
+#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
+
 // Tests that all the non settings origins of autofill profiles are cleared but
 // that the settings origins are untouched.
 TEST_F(PersonalDataManagerTest, ClearProfileNonSettingsOrigins) {
@@ -6524,7 +6552,7 @@
 // cards still works.
 TEST_F(PersonalDataManagerTest, UsePersistentServerStorage) {
   ResetPersonalDataManager(USER_MODE_NORMAL,
-                           /*use_account_server_storage=*/false);
+                           /*use_sync_transport_mode=*/false);
   SetUpThreeCardTypes();
 
   // include_server_cards is set to false, therefore no server cards should be
@@ -6542,7 +6570,7 @@
 TEST_F(PersonalDataManagerTest, SwitchServerStorages) {
   // Start with account storage.
   ResetPersonalDataManager(USER_MODE_NORMAL,
-                           /*use_account_server_storage=*/true);
+                           /*use_sync_transport_mode=*/true);
   SetUpThreeCardTypes();
 
   // Check that we do have 2 server cards, as expected.
@@ -6579,7 +6607,7 @@
 // cards still works.
 TEST_F(PersonalDataManagerTest, UseCorrectStorageForDifferentCards) {
   ResetPersonalDataManager(USER_MODE_NORMAL,
-                           /*use_account_server_storage=*/true);
+                           /*use_sync_transport_mode=*/true);
 
   // Add a server card.
   CreditCard server_card;
diff --git a/components/autofill_assistant/browser/batch_element_checker.cc b/components/autofill_assistant/browser/batch_element_checker.cc
index a6fe702..9fbb8c5 100644
--- a/components/autofill_assistant/browser/batch_element_checker.cc
+++ b/components/autofill_assistant/browser/batch_element_checker.cc
@@ -15,8 +15,7 @@
 namespace autofill_assistant {
 namespace {
 // Waiting period between two checks.
-static constexpr base::TimeDelta kCheckPeriod =
-    base::TimeDelta::FromMilliseconds(100);
+static constexpr base::TimeDelta kCheckPeriod = base::TimeDelta::FromSeconds(1);
 }  // namespace
 
 BatchElementChecker::BatchElementChecker(WebController* web_controller)
diff --git a/components/autofill_assistant/browser/batch_element_checker_unittest.cc b/components/autofill_assistant/browser/batch_element_checker_unittest.cc
index dced9c7..4b45a975 100644
--- a/components/autofill_assistant/browser/batch_element_checker_unittest.cc
+++ b/components/autofill_assistant/browser/batch_element_checker_unittest.cc
@@ -25,8 +25,7 @@
 
 namespace {
 
-static constexpr base::TimeDelta kTimeUnit =
-    base::TimeDelta::FromMilliseconds(100);
+static constexpr base::TimeDelta kTimeUnit = base::TimeDelta::FromSeconds(1);
 
 class BatchElementCheckerTest : public testing::Test {
  protected:
@@ -266,7 +265,7 @@
                           ElementExistenceCallback("1"));
   checks_.AddElementCheck(kExistenceCheck, Selector({"2"}),
                           ElementExistenceCallback("2"));
-  checks_.Run(base::TimeDelta::FromSeconds(1), base::DoNothing(),
+  checks_.Run(base::TimeDelta::FromSeconds(10), base::DoNothing(),
               DoneCallback("all_done"));
 
   // The first try should have run, not fully successful, and should now be
@@ -331,7 +330,7 @@
 
   checks_.AddElementCheck(kExistenceCheck, Selector({"element"}),
                           base::DoNothing());
-  checks_.Run(base::TimeDelta::FromSeconds(1), TryCallback("try"),
+  checks_.Run(base::TimeDelta::FromSeconds(10), TryCallback("try"),
               DoneCallback("all_done"));
 
   // The first try does not fully succeed.
diff --git a/components/browser_sync/profile_sync_service.cc b/components/browser_sync/profile_sync_service.cc
index aa45a0d..1640c8e 100644
--- a/components/browser_sync/profile_sync_service.cc
+++ b/components/browser_sync/profile_sync_service.cc
@@ -842,8 +842,7 @@
 
 bool ProfileSyncService::IsSyncConfirmationNeeded() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return (!IsLocalSyncEnabled() && IsSignedIn()) && !IsSetupInProgress() &&
-         !IsFirstSetupComplete() &&
+  return !IsSetupInProgress() && !IsFirstSetupComplete() &&
          !HasDisableReason(DISABLE_REASON_USER_CHOICE) &&
          IsAuthenticatedAccountPrimary();
 }
@@ -1111,10 +1110,10 @@
         UMA_HISTOGRAM_ENUMERATION("Sync.StopSource", syncer::BIRTHDAY_ERROR,
                                   syncer::STOP_SOURCE_LIMIT);
       }
-      // Note: Here we explicitly want RequestStop (rather than StopImpl), so
+      // Note: Here we explicitly want StopAndClear (rather than StopImpl), so
       // that IsSyncRequested gets set to false, and Sync won't start again on
       // the next browser startup.
-      RequestStop(CLEAR_DATA);
+      StopAndClear();
 #if !defined(OS_CHROMEOS)
       // On every platform except ChromeOS, sign out the user after a dashboard
       // clear.
@@ -1984,6 +1983,10 @@
       switches::kDisableSync);
 }
 
+void ProfileSyncService::StopAndClear() {
+  RequestStop(CLEAR_DATA);
+}
+
 void ProfileSyncService::RequestStop(SyncStopDataFate data_fate) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   sync_prefs_.SetSyncRequested(false);
diff --git a/components/browser_sync/profile_sync_service.h b/components/browser_sync/profile_sync_service.h
index 58d3234..699efd87 100644
--- a/components/browser_sync/profile_sync_service.h
+++ b/components/browser_sync/profile_sync_service.h
@@ -229,7 +229,8 @@
   bool IsLocalSyncEnabled() const override;
   void TriggerRefresh(const syncer::ModelTypeSet& types) override;
   void OnDataTypeRequestsSyncStartup(syncer::ModelType type) override;
-  void RequestStop(SyncStopDataFate data_fate) override;
+  void StopAndClear() override;
+  void RequestStop(SyncStopDataFate data_fate);
   virtual void RequestStart();  // Virtual for testing.
   syncer::ModelTypeSet GetActiveDataTypes() const override;
   void AddObserver(syncer::SyncServiceObserver* observer) override;
@@ -369,8 +370,7 @@
   // confirmation dialog hasn't been shown. Note that once the dialog is
   // showing (i.e. IsFirstSetupInProgress() is true), this will return false.
   // TODO(crbug.com/839834): This method is somewhat misnamed.
-  // Virtual for testing.
-  virtual bool IsSyncConfirmationNeeded() const;
+  bool IsSyncConfirmationNeeded() const;
 
   // syncer::UnrecoverableErrorHandler implementation.
   void OnUnrecoverableError(const base::Location& from_here,
diff --git a/components/browser_sync/profile_sync_service_mock.h b/components/browser_sync/profile_sync_service_mock.h
index 58476dae..0eb3666 100644
--- a/components/browser_sync/profile_sync_service_mock.h
+++ b/components/browser_sync/profile_sync_service_mock.h
@@ -54,7 +54,7 @@
                     const std::string& message));
   MOCK_CONST_METHOD0(GetUserShare, syncer::UserShare*());
   MOCK_METHOD0(RequestStart, void());
-  MOCK_METHOD1(RequestStop, void(ProfileSyncService::SyncStopDataFate));
+  MOCK_METHOD0(StopAndClear, void());
 
   MOCK_METHOD1(AddObserver, void(syncer::SyncServiceObserver*));
   MOCK_METHOD1(RemoveObserver, void(syncer::SyncServiceObserver*));
@@ -77,7 +77,6 @@
   MOCK_CONST_METHOD0(GetAuthError, const GoogleServiceAuthError&());
   MOCK_CONST_METHOD0(IsSetupInProgress, bool());
   MOCK_CONST_METHOD0(GetLastSyncedTime, base::Time());
-  MOCK_CONST_METHOD0(IsSyncConfirmationNeeded, bool());
   MOCK_METHOD1(OnActionableError, void(const syncer::SyncProtocolError&));
   MOCK_CONST_METHOD1(IsDataTypeControllerRunning, bool(syncer::ModelType));
 
diff --git a/components/browser_sync/profile_sync_service_startup_unittest.cc b/components/browser_sync/profile_sync_service_startup_unittest.cc
index 97d20d7..0a46a5f2 100644
--- a/components/browser_sync/profile_sync_service_startup_unittest.cc
+++ b/components/browser_sync/profile_sync_service_startup_unittest.cc
@@ -522,8 +522,8 @@
   sync_service()->Initialize();
 
   EXPECT_CALL(*data_type_manager, Stop(syncer::STOP_SYNC));
-  // On RequestStop(), the sync service will immediately start up again in
-  // transport mode.
+  // On SetSyncRequested(false), the sync service will immediately start up
+  // again in transport mode.
   SetUpFakeSyncEngine();
   data_type_manager = SetUpDataTypeManagerMock();
   EXPECT_CALL(*data_type_manager, Configure(_, _));
@@ -547,7 +547,7 @@
   sync_service()->Initialize();
 
   EXPECT_CALL(*data_type_manager, Stop(syncer::DISABLE_SYNC));
-  sync_service()->RequestStop(syncer::SyncService::CLEAR_DATA);
+  sync_service()->StopAndClear();
 
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_FALSE(sync_service()->IsSyncFeatureActive());
@@ -565,12 +565,12 @@
 
   sync_service()->Initialize();
 
-  // On RequestStop(), the sync service will immediately start up again in
+  // On StopAndClear(), the sync service will immediately start up again in
   // transport mode.
   SetUpFakeSyncEngine();
   data_type_manager = SetUpDataTypeManagerMock();
   EXPECT_CALL(*data_type_manager, Configure(_, _));
-  sync_service()->RequestStop(syncer::SyncService::CLEAR_DATA);
+  sync_service()->StopAndClear();
 
   // Sync-the-feature is still considered off.
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
diff --git a/components/browser_sync/profile_sync_service_unittest.cc b/components/browser_sync/profile_sync_service_unittest.cc
index ec1078e..c8dcb374 100644
--- a/components/browser_sync/profile_sync_service_unittest.cc
+++ b/components/browser_sync/profile_sync_service_unittest.cc
@@ -537,7 +537,7 @@
   ShutdownAndDeleteService();
 }
 
-// Test RequestStop() before we've initialized the backend.
+// Test SetSyncRequested(false) before we've initialized the backend.
 TEST_F(ProfileSyncServiceWithoutStandaloneTransportTest, EarlyRequestStop) {
   CreateService(ProfileSyncService::AUTO_START);
   // Set up a fake sync engine that will not immediately finish initialization.
@@ -603,7 +603,7 @@
   EXPECT_TRUE(service()->IsSyncFeatureEnabled());
 }
 
-// Test RequestStop() after we've initialized the backend.
+// Test SetSyncRequested(false) after we've initialized the backend.
 TEST_F(ProfileSyncServiceWithoutStandaloneTransportTest,
        DisableAndEnableSyncTemporarily) {
   CreateService(ProfileSyncService::AUTO_START);
@@ -898,7 +898,7 @@
   ASSERT_TRUE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo());
 
   // Sign out.
-  service()->RequestStop(ProfileSyncService::CLEAR_DATA);
+  service()->StopAndClear();
 
   EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
             service()->GetTransportState());
@@ -920,7 +920,7 @@
   ASSERT_TRUE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo());
 
   // Sign out.
-  service()->RequestStop(ProfileSyncService::CLEAR_DATA);
+  service()->StopAndClear();
 
   // Even though Sync-the-feature is disabled, Sync-the-transport should still
   // be running, and should have updated the last synced time.
diff --git a/components/browser_sync/sync_auth_manager.cc b/components/browser_sync/sync_auth_manager.cc
index f2e8be8..c9f85540 100644
--- a/components/browser_sync/sync_auth_manager.cc
+++ b/components/browser_sync/sync_auth_manager.cc
@@ -257,8 +257,7 @@
 }
 
 void SyncAuthManager::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   if (UpdateSyncAccountIfNecessary()) {
     // If the syncing account was updated as a result of this, then all that's
     // necessary has been handled; nothing else to be done here.
@@ -274,9 +273,6 @@
   // CREDENTIALS_REJECTED_BY_CLIENT) if the user signs out of that account on
   // the web.
   // TODO(blundell): Hide this logic inside IdentityManager.
-  // NOTE: We don't use |is_valid| because we will shortly be eliminating that
-  // parameter. TODO(https://crbug.com/908412): Eliminate that parameter and
-  // this comment.
   bool is_refresh_token_valid = true;
   GoogleServiceAuthError token_error =
       identity_manager_->GetErrorStateOfRefreshTokenForAccount(
diff --git a/components/browser_sync/sync_auth_manager.h b/components/browser_sync/sync_auth_manager.h
index 7694eef..8a943886 100644
--- a/components/browser_sync/sync_auth_manager.h
+++ b/components/browser_sync/sync_auth_manager.h
@@ -92,8 +92,8 @@
   void OnPrimaryAccountSet(const AccountInfo& primary_account_info) override;
   void OnPrimaryAccountCleared(
       const AccountInfo& previous_primary_account_info) override;
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
   void OnAccountsInCookieUpdated(
       const std::vector<AccountInfo>& accounts) override;
diff --git a/components/browsing_data/core/browsing_data_utils_unittest.cc b/components/browsing_data/core/browsing_data_utils_unittest.cc
index 099a97d2..aa2f1369 100644
--- a/components/browsing_data/core/browsing_data_utils_unittest.cc
+++ b/components/browsing_data/core/browsing_data_utils_unittest.cc
@@ -6,9 +6,9 @@
 
 #include <string>
 
-#include "base/message_loop/message_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/browsing_data/core/counters/autofill_counter.h"
@@ -48,7 +48,7 @@
   PrefService* prefs() { return &prefs_; }
 
  private:
-  base::MessageLoop loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   sync_preferences::TestingPrefServiceSyncable prefs_;
 };
 
diff --git a/components/browsing_data/core/counters/browsing_data_counter_unittest.cc b/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
index ab1bc7f..4bafa9e 100644
--- a/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
+++ b/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
@@ -8,8 +8,8 @@
 #include <vector>
 
 #include "base/bind_helpers.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "components/browsing_data/core/pref_names.h"
@@ -103,7 +103,7 @@
  private:
   std::unique_ptr<TestingPrefServiceSimple> pref_service_;
   std::unique_ptr<MockBrowsingDataCounter> counter_;
-  base::MessageLoop loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
 };
 
 TEST_F(BrowsingDataCounterTest, NoResponse) {
diff --git a/components/browsing_data/core/history_notice_utils_unittest.cc b/components/browsing_data/core/history_notice_utils_unittest.cc
index bde68326..2aacba6 100644
--- a/components/browsing_data/core/history_notice_utils_unittest.cc
+++ b/components/browsing_data/core/history_notice_utils_unittest.cc
@@ -7,9 +7,9 @@
 #include <memory>
 
 #include "base/callback.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
+#include "base/test/scoped_task_environment.h"
 #include "components/history/core/test/fake_web_history_service.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/driver/test_sync_service.h"
@@ -60,7 +60,7 @@
   std::unique_ptr<syncer::TestSyncService> sync_service_;
   std::unique_ptr<history::FakeWebHistoryService> history_service_;
 
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
 };
 
 TEST_F(HistoryNoticeUtilsTest, NotSyncing) {
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index bc63f8e..4170df2 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -5,6 +5,7 @@
 import("//build/buildflag_header.gni")
 import("//build/config/android/config.gni")
 import("//build/config/android/rules.gni")
+import("//build/config/zip.gni")
 import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
 import("//build/util/version.gni")
@@ -50,7 +51,7 @@
   ]
 }
 
-java_library("cronet_jni_registration_java") {
+android_library("cronet_jni_registration_java") {
   srcjar_deps = [ ":cronet_jni_registration" ]
 }
 
@@ -455,7 +456,7 @@
 android_java_prebuilt("package_api_java") {
   jar_path = "$_package_dir/cronet_api.jar"
   deps = [
-    ":copy_cronet_java8_jars_cronet_api_javaX",
+    ":repackage_api",
   ]
 }
 
@@ -463,7 +464,7 @@
   jar_path = "$_package_dir/cronet_impl_common_java.jar"
   deps = [
     ":package_api_java",
-    ":repackage_extracted_common_jars",
+    ":repackage_common",
   ]
 }
 
@@ -472,7 +473,7 @@
   deps = [
     ":package_api_java",
     ":package_impl_common_java",
-    ":repackage_extracted_native_jars",
+    ":repackage_native",
     "//third_party/android_deps:android_support_v4_java",
     "//third_party/jsr-305:jsr_305_javalib",
   ]
@@ -481,9 +482,9 @@
 android_java_prebuilt("package_impl_platform_java") {
   jar_path = "$_package_dir/cronet_impl_platform_java.jar"
   deps = [
-    ":copy_cronet_java8_jars_cronet_impl_platform_base_javaX",
     ":package_api_java",
     ":package_impl_common_java",
+    ":repackage_platform",
   ]
 }
 
@@ -584,58 +585,8 @@
   jar_path = "$_package_dir/cronet_impl_platform_java-src.jar"
 }
 
-template("copy_java8_jars") {
-  _deps = []
-  foreach(_dep, invoker.deps) {
-    _dep_name = get_label_info(_dep, "name")
-    _source_jar =
-        get_label_info(_dep, "target_gen_dir") + "/" + _dep_name + ".javac.jar"
-    _output_jar = "$_package_dir/" + _dep_name + ".jar"
-
-    # Adjust file names that are different from the target name that builds it.
-    if (_output_jar == "$_package_dir/" + "cronet_api_java.jar") {
-      _output_jar = "$_package_dir/" + "cronet_api.jar"
-    }
-    if (_output_jar == "$_package_dir/" + "cronet_impl_platform_base_java.jar") {
-      _output_jar = "$_package_dir/" + "cronet_impl_platform_java.jar"
-    }
-
-    # _deps have targets which match the java target whitelist. Add a
-    # trailing X to avoid the copy() target matching the whitelist.
-    # See _java_target_whitelist in build/config/android/internal_rules.gni.
-    _copy_target_name = "${target_name}_${_dep_name}X"
-    copy(_copy_target_name) {
-      sources = [
-        _source_jar,
-      ]
-      outputs = [
-        _output_jar,
-      ]
-      deps = [
-        ":$_dep_name",
-      ]
-    }
-
-    _deps += [ ":" + _copy_target_name ]
-  }
-
-  group(target_name) {
-    deps = _deps
-  }
-}
-
-copy_java8_jars("copy_cronet_java8_jars") {
-  deps = [
-    ":cronet_api_java",
-    ":cronet_impl_platform_base_java",
-  ]
-}
-
-_extract_cronet_native_jars_dir = "$target_gen_dir/cronet_native_jar_extract"
-_extract_cronet_common_jars_dir = "$target_gen_dir/cronet_common_jar_extract"
-
 # List of patterns of .class files to exclude from the jar.
-jar_excluded_patterns = [
+_jar_excluded_patterns = [
   # Excludes Android support libraries crbug.com/832770.
   "android/*",
   "*/library_loader/*.class",
@@ -646,118 +597,43 @@
   "org/chromium/base/memory/MemoryPressureMonitor*.class",
 ]
 
-action("extract_cronet_native_jars") {
-  # extract_from_jars.py deletes the target directory before extracting.
-  script = "//components/cronet/tools/extract_from_jars.py"
-  depfile = "$target_gen_dir/$target_name.d"
-
-  _stamp_file = "$target_gen_dir/$target_name.stamp"
-  outputs = [
-    _stamp_file,
-  ]
-
-  deps = [
-    ":cronet_impl_native_base_java",
-    ":cronet_jni_registration_java",
-  ]
-  deps += cronet_impl_native_java_deps_to_package
-
-  sources = []
-
-  # Extract pre-desugared jar for each dependency.
-  foreach(dep, deps) {
-    sources += [ get_label_info(dep, "target_gen_dir") + "/" +
-                 get_label_info(dep, "name") + ".javac.jar" ]
+template("repackage_jars") {
+  dist_jar(target_name) {
+    requires_android = true
+    direct_deps_only = true
+    use_unprocessed_jars = true
+    no_build_hooks = true
+    forward_variables_from(invoker, "*")
   }
+}
 
-  _rebased_sources = rebase_path(sources, root_build_dir)
-
-  args = [
-    "--classes-dir",
-    rebase_path(_extract_cronet_native_jars_dir, root_build_dir),
-    "--jars=${_rebased_sources}",
-    "--depfile",
-    rebase_path(depfile, root_build_dir),
-    "--stamp",
-    rebase_path(_stamp_file, root_build_dir),
+repackage_jars("repackage_api") {
+  output = "$_package_dir/cronet_api.jar"
+  deps = [
+    ":cronet_api_java",
   ]
 }
 
-action("repackage_extracted_native_jars") {
-  _output_jar = "$_package_dir/cronet_impl_native_java.jar"
-
-  script = "//build/android/gyp/jar.py"
-  outputs = [
-    _output_jar,
-  ]
-
-  args = [
-    "--classes-dir",
-    rebase_path(_extract_cronet_native_jars_dir, root_build_dir),
-    "--excluded-classes=$jar_excluded_patterns",
-    "--jar-path",
-    rebase_path(_output_jar, root_build_dir),
-  ]
-
+repackage_jars("repackage_platform") {
+  output = "$_package_dir/cronet_impl_platform_java.jar"
   deps = [
-    ":extract_cronet_native_jars",
+    ":cronet_impl_platform_base_java",
   ]
 }
 
-action("extract_cronet_common_jars") {
-  # extract_from_jars.py deletes the target directory before extracting.
-  script = "//components/cronet/tools/extract_from_jars.py"
-  depfile = "$target_gen_dir/$target_name.d"
-
-  _stamp_file = "$target_gen_dir/$target_name.stamp"
-  outputs = [
-    _stamp_file,
-  ]
-
-  deps = [
-    ":cronet_impl_common_base_java",
-  ]
-  deps += cronet_impl_common_java_deps_to_package
-
-  sources = []
-
-  # Extract pre-desugared jar for each dependency.
-  foreach(dep, deps) {
-    sources += [ get_label_info(dep, "target_gen_dir") + "/" +
-                 get_label_info(dep, "name") + ".javac.jar" ]
-  }
-
-  _rebased_sources = rebase_path(sources, root_build_dir)
-
-  args = [
-    "--classes-dir",
-    rebase_path(_extract_cronet_common_jars_dir, root_build_dir),
-    "--jars=${_rebased_sources}",
-    "--depfile",
-    rebase_path(depfile, root_build_dir),
-    "--stamp",
-    rebase_path(_stamp_file, root_build_dir),
-  ]
+repackage_jars("repackage_native") {
+  output = "$_package_dir/cronet_impl_native_java.jar"
+  deps = cronet_impl_native_java_deps_to_package + [
+           ":cronet_impl_native_base_java",
+           ":cronet_jni_registration_java",
+         ]
+  jar_excluded_patterns = _jar_excluded_patterns
 }
 
-action("repackage_extracted_common_jars") {
-  _output_jar = "$_package_dir/cronet_impl_common_java.jar"
-
-  script = "//build/android/gyp/jar.py"
-  outputs = [
-    _output_jar,
-  ]
-
-  args = [
-    "--classes-dir",
-    rebase_path(_extract_cronet_common_jars_dir, root_build_dir),
-    "--jar-path",
-    rebase_path(_output_jar, root_build_dir),
-  ]
-
-  deps = [
-    ":extract_cronet_common_jars",
-  ]
+repackage_jars("repackage_common") {
+  output = "$_package_dir/cronet_impl_common_java.jar"
+  deps = cronet_impl_common_java_deps_to_package +
+         [ ":cronet_impl_common_base_java" ]
 }
 
 if (!is_component_build) {
@@ -1251,69 +1127,14 @@
   }
 
   _test_package_dir = "$root_out_dir/cronet/test"
-  _extract_cronet_test_jars_dir = "$target_gen_dir/cronet_test_jar_extract"
 
-  cronet_test_deps = [ ":cronet_javatests" ]
-  cronet_test_deps += cronet_javatests_deps_to_package
-
-  action("extract_cronet_test_jars") {
-    # extract_from_jars.py deletes the target directory before extracting.
-    script = "//components/cronet/tools/extract_from_jars.py"
-    depfile = "$target_gen_dir/$target_name.d"
+  repackage_jars("repackage_test_jars") {
+    output = "$_test_package_dir/cronet_tests_java.jar"
     testonly = true
-
-    sources = [
-      NETTY4_JAR_FILE,
-    ]
-
-    # Extract pre-desugared jar for each cronet_test_deps.
-    foreach(dep, cronet_test_deps) {
-      sources += [ get_label_info(dep, "target_gen_dir") + "/" +
-                   get_label_info(dep, "name") + ".javac.jar" ]
-    }
-
-    _stamp_file = "$target_gen_dir/$target_name.stamp"
-    outputs = [
-      _stamp_file,
-    ]
-
-    _rebased_sources = rebase_path(sources, root_build_dir)
-
-    args = [
-      "--classes-dir",
-      rebase_path(_extract_cronet_test_jars_dir, root_build_dir),
-      "--jars=${_rebased_sources}",
-      "--depfile",
-      rebase_path(depfile, root_build_dir),
-      "--stamp",
-      rebase_path(_stamp_file, root_build_dir),
-    ]
-
-    deps = [
-      "//third_party/netty4:netty_all_java",
-    ]
-    deps += cronet_test_deps
-  }
-
-  action("repackage_extracted_test_jars") {
-    _output_jar = "$_test_package_dir/cronet_tests_java.jar"
-    testonly = true
-
-    script = "//build/android/gyp/jar.py"
-    outputs = [
-      _output_jar,
-    ]
-
-    args = [
-      "--classes-dir",
-      rebase_path(_extract_cronet_test_jars_dir, root_build_dir),
-      "--jar-path",
-      rebase_path(_output_jar, root_build_dir),
-    ]
-
-    deps = [
-      ":extract_cronet_test_jars",
-    ]
+    deps = cronet_javatests_deps_to_package + [
+             ":cronet_javatests",
+             "//third_party/netty4:netty_all_java",
+           ]
   }
 
   zip("jar_cronet_sample_source") {
@@ -1353,7 +1174,7 @@
                     "//net/android:net_android_java_enums_srcjar",
                     "//net/android:net_errors_java",
                   ]
-    excluded_patterns = jar_excluded_patterns
+    excluded_patterns = _jar_excluded_patterns
     jar_path = "$_package_dir/cronet_impl_native_java-src.jar"
   }
 
@@ -1609,7 +1430,6 @@
         (!(target_cpu == "arm" && arm_version == 7) || !arm_use_neon)) {
       deps = [
         ":api_static_checks",
-        ":copy_cronet_java8_jars",
         ":cronet_package_copy",
         ":cronet_package_copy_native_lib",
         ":cronet_package_copy_native_lib_unstripped",
@@ -1622,8 +1442,10 @@
         ":jar_cronet_impl_native_java_source",
         ":jar_cronet_impl_platform_java_source",
         ":jar_cronet_sample_source",
-        ":repackage_extracted_common_jars",
-        ":repackage_extracted_native_jars",
+        ":repackage_api",
+        ":repackage_common",
+        ":repackage_native",
+        ":repackage_platform",
       ]
       if (current_cpu == "arm" && arm_version == 7) {
         deps += [ ":enforce_no_neon" ]
@@ -1642,7 +1464,7 @@
         ":cronet_package_copy_test_assets",
         ":cronet_package_copy_test_files",
         ":cronet_package_copy_test_support_apks",
-        ":repackage_extracted_test_jars",
+        ":repackage_test_jars",
       ]
     }
   }
diff --git a/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java b/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java
index 0da9937..2793060 100644
--- a/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java
+++ b/components/cronet/android/test/src/org/chromium/net/Http2TestServer.java
@@ -157,28 +157,36 @@
 
         @Override
         public void run() {
-            try {
-                // Configure the server.
-                EventLoopGroup group = new NioEventLoopGroup();
+            boolean retry = false;
+            do {
                 try {
-                    ServerBootstrap b = new ServerBootstrap();
-                    b.option(ChannelOption.SO_BACKLOG, 1024);
-                    b.group(group)
-                            .channel(NioServerSocketChannel.class)
-                            .handler(new LoggingHandler(LogLevel.INFO))
-                            .childHandler(new Http2ServerInitializer(mSslCtx));
+                    // Configure the server.
+                    EventLoopGroup group = new NioEventLoopGroup();
+                    try {
+                        ServerBootstrap b = new ServerBootstrap();
+                        b.option(ChannelOption.SO_BACKLOG, 1024);
+                        b.group(group)
+                                .channel(NioServerSocketChannel.class)
+                                .handler(new LoggingHandler(LogLevel.INFO))
+                                .childHandler(new Http2ServerInitializer(mSslCtx));
 
-                    sServerChannel = b.bind(PORT).sync().channel();
-                    Log.i(TAG, "Netty HTTP/2 server started on " + getServerUrl());
-                    mBlock.open();
-                    sServerChannel.closeFuture().sync();
-                } finally {
-                    group.shutdownGracefully();
+                        sServerChannel = b.bind(PORT).sync().channel();
+                        Log.i(TAG, "Netty HTTP/2 server started on " + getServerUrl());
+                        mBlock.open();
+                        sServerChannel.closeFuture().sync();
+                    } finally {
+                        group.shutdownGracefully();
+                    }
+                    Log.i(TAG, "Stopped Http2TestServerRunnable!");
+                    retry = false;
+                } catch (Exception e) {
+                    Log.e(TAG, "Netty server failed to start", e);
+                    // Retry once if we hit https://github.com/netty/netty/issues/2616 before the
+                    // server starts.
+                    retry = !retry && sServerChannel == null
+                            && e.toString().contains("java.nio.channels.ClosedChannelException");
                 }
-                Log.i(TAG, "Stopped Http2TestServerRunnable!");
-            } catch (Exception e) {
-                Log.e(TAG, e.toString());
-            }
+            } while (retry);
         }
     }
 
diff --git a/components/cronet/tools/extract_from_jars.py b/components/cronet/tools/extract_from_jars.py
deleted file mode 100755
index ccddea41..0000000
--- a/components/cronet/tools/extract_from_jars.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import optparse
-import os
-import sys
-
-REPOSITORY_ROOT = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..', '..'))
-
-sys.path.append(os.path.join(REPOSITORY_ROOT, 'build/android/gyp/util'))
-import build_utils
-
-
-def ExtractJars(options):
-  # The paths of the files in the jar will be the same as they are passed in to
-  # the command. Because of this, the command should be run in
-  # options.classes_dir so the .class file paths in the jar are correct.
-  jar_cwd = options.classes_dir
-  build_utils.DeleteDirectory(jar_cwd)
-  build_utils.MakeDirectory(jar_cwd)
-  for jar in build_utils.ParseGnList(options.jars):
-    jar_path = os.path.abspath(jar)
-    jar_cmd = ['jar', 'xf', jar_path]
-    build_utils.CheckOutput(jar_cmd, cwd=jar_cwd)
-
-
-def main():
-  parser = optparse.OptionParser()
-  build_utils.AddDepfileOption(parser)
-  parser.add_option('--classes-dir', help='Directory to extract .class files.')
-  parser.add_option('--jars', help='Paths to jars to extract.')
-  parser.add_option('--stamp', help='Path to touch on success.')
-
-  options, _ = parser.parse_args()
-
-  ExtractJars(options)
-
-  if options.depfile:
-    assert options.stamp
-    build_utils.WriteDepfile(options.depfile, options.stamp)
-
-  if options.stamp:
-    build_utils.Touch(options.stamp)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
-
diff --git a/components/favicon/core/favicon_handler.cc b/components/favicon/core/favicon_handler.cc
index ae2eecd8..330f665 100644
--- a/components/favicon/core/favicon_handler.cc
+++ b/components/favicon/core/favicon_handler.cc
@@ -231,13 +231,13 @@
       &cancelable_task_tracker_for_page_url_);
 }
 
-bool FaviconHandler::UpdateFaviconCandidate(
-    const DownloadedFavicon& downloaded_favicon) {
-  if (downloaded_favicon.candidate.score > best_favicon_.candidate.score)
-    best_favicon_ = downloaded_favicon;
-
+bool FaviconHandler::ShouldDownloadNextCandidate() const {
   // Stop downloading if the current candidate is the last candidate.
   if (current_candidate_index_ + 1 >= final_candidates_->size())
+    return false;
+
+  // Continue downloading if no valid favicon has been downloaded yet.
+  if (best_favicon_.candidate.icon_type == favicon_base::IconType::kInvalid)
     return true;
 
   // |next_candidate_score| is based on the sizes provided in the <link> tag,
@@ -245,10 +245,9 @@
   float next_candidate_score =
       (*final_candidates_)[current_candidate_index_ + 1].score;
 
-  // Stop downloading if the next candidate is not better than the best one
-  // observed so far, which means any following candidate should also be worse
-  // or equal too.
-  return next_candidate_score <= best_favicon_.candidate.score;
+  // Continue downloading only if the next candidate is better than the best one
+  // observed so far.
+  return next_candidate_score > best_favicon_.candidate.score;
 }
 
 void FaviconHandler::SetFavicon(const GURL& icon_url,
@@ -493,7 +492,6 @@
   // Mark download as finished.
   image_download_request_.Cancel();
 
-  bool request_next_icon = true;
   if (bitmaps.empty()) {
     if (http_status_code == 404) {
       DVLOG(1) << "Failed to Download Favicon:" << image_url;
@@ -519,22 +517,18 @@
                                           &score);
     }
 
-    if (!image_skia.isNull()) {
-      // The downloaded icon is still valid when there is no FaviconURL update
-      // during the downloading.
-      DownloadedFavicon downloaded_favicon;
-      downloaded_favicon.image = gfx::Image(image_skia);
-      downloaded_favicon.candidate.icon_url = image_url;
-      downloaded_favicon.candidate.icon_type = icon_type;
-      downloaded_favicon.candidate.score = score;
-      request_next_icon = !UpdateFaviconCandidate(downloaded_favicon);
+    if (!image_skia.isNull() && score > best_favicon_.candidate.score) {
+      best_favicon_.image = gfx::Image(image_skia);
+      best_favicon_.candidate.icon_url = image_url;
+      best_favicon_.candidate.icon_type = icon_type;
+      best_favicon_.candidate.score = score;
     }
   }
 
-  if (request_next_icon &&
-      current_candidate_index_ + 1 < final_candidates_->size()) {
+  if (ShouldDownloadNextCandidate()) {
     // Process the next candidate.
     ++current_candidate_index_;
+    DCHECK_LT(current_candidate_index_, final_candidates_->size());
     DownloadCurrentCandidateOrAskFaviconService();
   } else {
     if (best_favicon_.candidate.icon_type == favicon_base::IconType::kInvalid) {
diff --git a/components/favicon/core/favicon_handler.h b/components/favicon/core/favicon_handler.h
index 08373a52..5d2d67b 100644
--- a/components/favicon/core/favicon_handler.h
+++ b/components/favicon/core/favicon_handler.h
@@ -246,9 +246,9 @@
       const std::vector<SkBitmap>& bitmaps,
       const std::vector<gfx::Size>& original_bitmap_sizes);
 
-  // Updates |best_favicon_| and returns true if it was considered a satisfying
-  // image (e.g. exact size match).
-  bool UpdateFaviconCandidate(const DownloadedFavicon& downloaded_favicon);
+  // Returns true if the next candidate in |final_candidates_| should be
+  // downloaded.
+  bool ShouldDownloadNextCandidate() const;
 
   // Sets the image data for the favicon.
   void SetFavicon(const GURL& icon_url,
diff --git a/components/favicon/core/favicon_handler_unittest.cc b/components/favicon/core/favicon_handler_unittest.cc
index 18128fd4..a30391a 100644
--- a/components/favicon/core/favicon_handler_unittest.cc
+++ b/components/favicon/core/favicon_handler_unittest.cc
@@ -1421,6 +1421,31 @@
   EXPECT_THAT(delegate_.downloads(), SizeIs(1));
 }
 
+// Mostly for behavioral documentation purposes: test that downloads stops when
+// remaining candidates are worse or equal, for the following advanced scenario:
+// - The page provides multiple favicons: various with explicit sizes
+//   information and one without.
+// - Among the ones with explicit sizes information, downloading the best
+//   returns a 404.
+// - The remaining ones (with explicit sizes information) are worse than the one
+//   without sizes information, and shouldn't be downloaded.
+TEST_F(FaviconHandlerTest,
+       StopsDownloadingWhenRemainingCandidatesWorseDespite404) {
+  const GURL k404IconURL("http://www.google.com/404.png");
+  const GURL kIconURL192x192 = GURL("http://www.google.com/favicon192x192");
+
+  RunHandlerWithCandidates(
+      FaviconDriverObserver::NON_TOUCH_16_DIP,
+      {
+          FaviconURL(kIconURL64x64, kFavicon, kEmptySizes),
+          FaviconURL(k404IconURL, kFavicon, SizeVector(1U, gfx::Size(32, 32))),
+          FaviconURL(kIconURL192x192, kFavicon,
+                     SizeVector(1U, gfx::Size(192, 192))),
+      });
+
+  EXPECT_THAT(delegate_.downloads(), ElementsAre(kIconURL64x64, k404IconURL));
+}
+
 TEST_F(FaviconHandlerMultipleFaviconsTest,
        DownloadsAllIconsWithoutSizesAttributeIfNotWantsLargest) {
   RunHandlerWithCandidates(FaviconDriverObserver::NON_TOUCH_16_DIP,
diff --git a/components/feature_engagement/internal/in_memory_event_store_unittest.cc b/components/feature_engagement/internal/in_memory_event_store_unittest.cc
index 930084f2..73bf2b4 100644
--- a/components/feature_engagement/internal/in_memory_event_store_unittest.cc
+++ b/components/feature_engagement/internal/in_memory_event_store_unittest.cc
@@ -10,8 +10,8 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace feature_engagement {
@@ -33,7 +33,7 @@
   bool load_callback_has_been_invoked_;
   bool last_result_;
   std::unique_ptr<std::vector<Event>> loaded_events_;
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
 };
 }  // namespace
 
diff --git a/components/feature_engagement/internal/never_availability_model_unittest.cc b/components/feature_engagement/internal/never_availability_model_unittest.cc
index 495011f..a8d5421 100644
--- a/components/feature_engagement/internal/never_availability_model_unittest.cc
+++ b/components/feature_engagement/internal/never_availability_model_unittest.cc
@@ -6,9 +6,9 @@
 
 #include "base/bind.h"
 #include "base/feature_list.h"
-#include "base/message_loop/message_loop.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace feature_engagement {
@@ -31,7 +31,7 @@
   base::Optional<bool> success_;
 
  private:
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(NeverAvailabilityModelTest);
 };
diff --git a/components/feature_engagement/internal/tracker_impl_unittest.cc b/components/feature_engagement/internal/tracker_impl_unittest.cc
index 8cb3398..197a10e 100644
--- a/components/feature_engagement/internal/tracker_impl_unittest.cc
+++ b/components/feature_engagement/internal/tracker_impl_unittest.cc
@@ -11,12 +11,12 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/feature_list.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/metrics/user_action_tester.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/feature_engagement/internal/availability_model_impl.h"
 #include "components/feature_engagement/internal/display_lock_controller.h"
@@ -415,7 +415,7 @@
 
   virtual bool ShouldAvailabilityStoreBeReady() { return true; }
 
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   std::unique_ptr<TrackerImpl> tracker_;
   TestTrackerInMemoryEventStore* event_store_;
   TestTrackerAvailabilityModel* availability_model_;
diff --git a/components/gcm_driver/account_tracker.cc b/components/gcm_driver/account_tracker.cc
index a03b387..7fc5a3f 100644
--- a/components/gcm_driver/account_tracker.cc
+++ b/components/gcm_driver/account_tracker.cc
@@ -66,8 +66,7 @@
 }
 
 void AccountTracker::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   TRACE_EVENT1("identity", "AccountTracker::OnRefreshTokenUpdatedForAccount",
                "account_id", account_info.account_id);
 
diff --git a/components/gcm_driver/account_tracker.h b/components/gcm_driver/account_tracker.h
index 09d4656..bdb9336 100644
--- a/components/gcm_driver/account_tracker.h
+++ b/components/gcm_driver/account_tracker.h
@@ -80,8 +80,8 @@
   void OnPrimaryAccountSet(const AccountInfo& primary_account_info) override;
   void OnPrimaryAccountCleared(
       const AccountInfo& previous_primary_account_info) override;
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
 
   void OnUserInfoFetchSuccess(AccountIdFetcher* fetcher,
diff --git a/components/invalidation/impl/fcm_invalidation_listener_unittest.cc b/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
index 7eef642..76810e3 100644
--- a/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
+++ b/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
@@ -5,9 +5,9 @@
 #include <string>
 #include <vector>
 
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/invalidation/impl/fake_invalidation_state_tracker.h"
 #include "components/invalidation/impl/fcm_invalidation_listener.h"
@@ -315,7 +315,7 @@
   TopicSet registred_topics_;
 
  private:
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   FCMSyncNetworkChannel* fcm_sync_network_channel_;
   MockRegistrationManager* registration_manager_;
 
diff --git a/components/invalidation/impl/gcm_invalidation_bridge_unittest.cc b/components/invalidation/impl/gcm_invalidation_bridge_unittest.cc
index fa124a49..76aa67e 100644
--- a/components/invalidation/impl/gcm_invalidation_bridge_unittest.cc
+++ b/components/invalidation/impl/gcm_invalidation_bridge_unittest.cc
@@ -10,9 +10,9 @@
 #include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/macros.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/gcm_driver/fake_gcm_driver.h"
 #include "components/gcm_driver/gcm_driver.h"
@@ -98,7 +98,7 @@
     connection_online_ = online;
   }
 
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   identity::IdentityTestEnvironment identity_test_env_;
   std::unique_ptr<gcm::GCMDriver> gcm_driver_;
   std::unique_ptr<ProfileIdentityProvider> identity_provider_;
diff --git a/components/invalidation/impl/non_blocking_invalidator_unittest.cc b/components/invalidation/impl/non_blocking_invalidator_unittest.cc
index 19d1daed..345a01c 100644
--- a/components/invalidation/impl/non_blocking_invalidator_unittest.cc
+++ b/components/invalidation/impl/non_blocking_invalidator_unittest.cc
@@ -9,8 +9,8 @@
 #include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
 #include "components/invalidation/impl/fake_invalidation_handler.h"
 #include "components/invalidation/impl/invalidation_state_tracker.h"
@@ -86,7 +86,7 @@
   }
 
  private:
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   base::Thread io_thread_;
   std::unique_ptr<jingle_glue::NetworkServiceConfigTestUtil> net_config_helper_;
   std::unique_ptr<NonBlockingInvalidator> invalidator_;
diff --git a/components/invalidation/impl/per_user_topic_registration_manager_unittest.cc b/components/invalidation/impl/per_user_topic_registration_manager_unittest.cc
index 0fda8bc..20abffb 100644
--- a/components/invalidation/impl/per_user_topic_registration_manager_unittest.cc
+++ b/components/invalidation/impl/per_user_topic_registration_manager_unittest.cc
@@ -7,9 +7,10 @@
 #include "base/json/json_string_value_serializer.h"
 #include "base/json/json_writer.h"
 #include "base/macros.h"
-#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/values.h"
 #include "components/invalidation/impl/json_unsafe_parser.h"
 #include "components/invalidation/impl/profile_identity_provider.h"
@@ -142,7 +143,7 @@
   }
 
  private:
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   network::TestURLLoaderFactory url_loader_factory_;
   TestingPrefServiceSimple pref_service_;
 
diff --git a/components/invalidation/impl/per_user_topic_registration_request_unittest.cc b/components/invalidation/impl/per_user_topic_registration_request_unittest.cc
index 4cb1320..b2fe913 100644
--- a/components/invalidation/impl/per_user_topic_registration_request_unittest.cc
+++ b/components/invalidation/impl/per_user_topic_registration_request_unittest.cc
@@ -7,9 +7,11 @@
 #include "base/json/json_reader.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/gtest_util.h"
 #include "base/test/mock_callback.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/test/test_simple_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
@@ -69,7 +71,7 @@
   }
 
  private:
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   network::TestURLLoaderFactory url_loader_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(PerUserTopicRegistrationRequestTest);
diff --git a/components/invalidation/impl/profile_identity_provider.cc b/components/invalidation/impl/profile_identity_provider.cc
index f392053..5476c974 100644
--- a/components/invalidation/impl/profile_identity_provider.cc
+++ b/components/invalidation/impl/profile_identity_provider.cc
@@ -110,8 +110,7 @@
 }
 
 void ProfileIdentityProvider::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   ProcessRefreshTokenUpdateForAccount(account_info.account_id);
 }
 
diff --git a/components/invalidation/impl/profile_identity_provider.h b/components/invalidation/impl/profile_identity_provider.h
index 98f6e8c..7341fe31 100644
--- a/components/invalidation/impl/profile_identity_provider.h
+++ b/components/invalidation/impl/profile_identity_provider.h
@@ -32,8 +32,8 @@
   void SetActiveAccountId(const std::string& account_id) override;
 
   // identity::IdentityManager::Observer:
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
 
  private:
diff --git a/components/invalidation/impl/registration_manager_unittest.cc b/components/invalidation/impl/registration_manager_unittest.cc
index b9b7d8bc..abcd15a 100644
--- a/components/invalidation/impl/registration_manager_unittest.cc
+++ b/components/invalidation/impl/registration_manager_unittest.cc
@@ -13,8 +13,8 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/message_loop/message_loop.h"
 #include "base/stl_util.h"
+#include "base/test/scoped_task_environment.h"
 #include "components/invalidation/public/invalidation_util.h"
 #include "google/cacheinvalidation/include/invalidation-client.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -223,7 +223,7 @@
 
  private:
   // Needed by timers in RegistrationManager.
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(RegistrationManagerTest);
 };
diff --git a/components/invalidation/impl/sync_invalidation_listener_unittest.cc b/components/invalidation/impl/sync_invalidation_listener_unittest.cc
index 7b371f04..9111944 100644
--- a/components/invalidation/impl/sync_invalidation_listener_unittest.cc
+++ b/components/invalidation/impl/sync_invalidation_listener_unittest.cc
@@ -13,10 +13,10 @@
 
 #include "base/compiler_specific.h"
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/invalidation/impl/fake_invalidation_state_tracker.h"
 #include "components/invalidation/impl/push_client_channel.h"
@@ -444,7 +444,7 @@
   ObjectIdSet registered_ids_;
 
  private:
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   notifier::FakePushClient* const fake_push_client_;
 
  protected:
diff --git a/components/invalidation/impl/sync_system_resources_unittest.cc b/components/invalidation/impl/sync_system_resources_unittest.cc
index 76446c6..799dc00 100644
--- a/components/invalidation/impl/sync_system_resources_unittest.cc
+++ b/components/invalidation/impl/sync_system_resources_unittest.cc
@@ -11,8 +11,8 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "components/invalidation/impl/push_client_channel.h"
 #include "components/invalidation/impl/state_writer.h"
 #include "google/cacheinvalidation/include/types.h"
@@ -85,7 +85,7 @@
   }
 
   // Needed by |sync_system_resources_|.
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   MockStateWriter mock_state_writer_;
   PushClientChannel push_client_channel_;
   SyncSystemResources sync_system_resources_;
diff --git a/components/invalidation/impl/ticl_profile_settings_provider_unittest.cc b/components/invalidation/impl/ticl_profile_settings_provider_unittest.cc
index d01d5d21..22340ad 100644
--- a/components/invalidation/impl/ticl_profile_settings_provider_unittest.cc
+++ b/components/invalidation/impl/ticl_profile_settings_provider_unittest.cc
@@ -7,7 +7,7 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/message_loop/message_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/gcm_driver/fake_gcm_driver.h"
 #include "components/gcm_driver/gcm_channel_status_syncer.h"
@@ -40,7 +40,7 @@
 
   TiclInvalidationService::InvalidationNetworkChannel GetNetworkChannel();
 
-  base::MessageLoop message_loop_;
+  base::test::ScopedTaskEnvironment task_environment_;
   std::unique_ptr<jingle_glue::NetworkServiceConfigTestUtil> net_config_helper_;
   gcm::FakeGCMDriver gcm_driver_;
 
diff --git a/components/journey/journey_info_json_request.cc b/components/journey/journey_info_json_request.cc
index 237f59f..d5d6c34 100644
--- a/components/journey/journey_info_json_request.cc
+++ b/components/journey/journey_info_json_request.cc
@@ -151,31 +151,6 @@
 
 std::unique_ptr<network::SimpleURLLoader>
 JourneyInfoJsonRequest::Builder::BuildSimpleURLLoader() const {
-  // TODO(meiliang): update the policy section with correct setting and
-  // chrome_policy
-  net::NetworkTrafficAnnotationTag traffic_annotation =
-      net::DefineNetworkTrafficAnnotation("journey_journey_info_json_request",
-                                          R"(
-        semantics {
-          sender: "Journey info Json request"
-          description:
-            "Chromium can show a list of pages that are related to currently "
-            "visited page."
-          trigger:
-            "Triggered at every tab selection, and every 30s has passed since "
-            "the last request for that journey if there is already a journey "
-            "to match to the tab."
-          data:
-            "Only white-listed signed-in test user's OAuth2 credentials,"
-            "the task_id or the timestamps of the current tab."
-          destination: GOOGLE_OWNED_SERVICE
-        }
-        policy {
-          cookies_allowed: NO
-          setting: "None."
-          chrome_policy {}
-        })");
-
   auto resource_request = std::make_unique<network::ResourceRequest>();
   resource_request->url = GURL(url_);
   resource_request->load_flags =
@@ -184,7 +159,7 @@
   resource_request->method = "POST";
 
   auto simple_loader = network::SimpleURLLoader::Create(
-      std::move(resource_request), traffic_annotation);
+      std::move(resource_request), NO_TRAFFIC_ANNOTATION_YET);
   simple_loader->SetAllowHttpErrorResults(true);
   simple_loader->AttachStringForUpload(body_,
                                        "application/json; charset=UTF-8");
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 729b702..db69edc 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -1826,6 +1826,23 @@
       'desc': '''Overrides default printing page size. If the page size is unavailable this policy is ignored.''',
     },
     {
+      'name': 'PrintingSendUsernameAndFilenameEnabled',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:72-'],
+      'future': True,
+      'features': {
+        'can_be_recommended': False,
+        'dynamic_refresh': True,
+        'per_profile': True,
+      },
+      'example_value': True,
+      'id': 506,
+      'caption': '''Send username and filename to native printers''',
+      'tags': [],
+      'desc': '''Send username and filename to native printers server with every print job. The default is not to send.''',
+    },
+    {
       'name': 'ForceSafeSearch',
       'type': 'main',
       'schema': { 'type': 'boolean' },
@@ -14095,5 +14112,5 @@
   },
   'placeholders': [],
   'deleted_policy_ids': [412],
-  'highest_id_currently_used': 505
+  'highest_id_currently_used': 506,
 }
diff --git a/components/previews/content/previews_user_data.h b/components/previews/content/previews_user_data.h
index 8d652ab..c326510 100644
--- a/components/previews/content/previews_user_data.h
+++ b/components/previews/content/previews_user_data.h
@@ -22,6 +22,34 @@
  public:
   explicit PreviewsUserData(uint64_t page_id);
 
+  enum class ServerLitePageStatus {
+    // The preview has been attempted yet or we have not received a response
+    // from the server yet.
+    kUnknown = 0,
+
+    // A preview was committed.
+    kSuccess = 1,
+
+    // The server bypassed the request and the preview was not committed.
+    kBypass = 2,
+
+    // The server redirected to another site. If this is the state at commit,
+    // the preview was not committed. Before commit, this indicates that we
+    // attempted the preview and may attempt another one if triggered later in
+    // the redirect
+    // chain.
+    kRedirect = 3,
+
+    // The server responded with some error, or didn't respond at all, and the
+    // original page was loaded.
+    kError = 4,
+
+    // This navigation met all triggering criteria, but the configured
+    // variations indicate that we were in a control group, so the preview was
+    // not triggered or committed.
+    kControl = 5,
+  };
+
   struct ServerLitePageInfo {
     std::unique_ptr<ServerLitePageInfo> Clone() {
       return std::make_unique<ServerLitePageInfo>(*this);
@@ -36,6 +64,9 @@
 
     // The DRP session key used for this preview.
     std::string drp_session_key = std::string();
+
+    // The current state of the preview.
+    ServerLitePageStatus status = ServerLitePageStatus::kUnknown;
   };
 
   ~PreviewsUserData();
diff --git a/components/previews/core/previews_experiments.cc b/components/previews/core/previews_experiments.cc
index f364c9e6..905b5946 100644
--- a/components/previews/core/previews_experiments.cc
+++ b/components/previews/core/previews_experiments.cc
@@ -206,6 +206,11 @@
                                           "lite_page_preview_experiment");
 }
 
+bool IsInLitePageRedirectControl() {
+  return base::GetFieldTrialParamByFeatureAsBool(
+      features::kLitePageServerPreviews, "control_group", false);
+}
+
 net::EffectiveConnectionType GetECTThresholdForPreview(
     previews::PreviewsType type) {
   switch (type) {
diff --git a/components/previews/core/previews_experiments.h b/components/previews/core/previews_experiments.h
index ade32f4..8656b7a 100644
--- a/components/previews/core/previews_experiments.h
+++ b/components/previews/core/previews_experiments.h
@@ -118,6 +118,10 @@
 // The experimental config to send to the previews server.
 std::string LitePageRedirectPreviewExperiment();
 
+// Returns true if we should only report metrics and not trigger when the Lite
+// Page Redirect preview is enabled.
+bool IsInLitePageRedirectControl();
+
 // The threshold of EffectiveConnectionType above which preview |type| will be
 // triggered.
 net::EffectiveConnectionType GetECTThresholdForPreview(
diff --git a/components/printing/browser/print_composite_client.cc b/components/printing/browser/print_composite_client.cc
index 483e0de..a6ce3c5 100644
--- a/components/printing/browser/print_composite_client.cc
+++ b/components/printing/browser/print_composite_client.cc
@@ -261,6 +261,7 @@
   mojom::PdfCompositorPtr compositor;
   connector_->BindInterface(mojom::kServiceName, &compositor);
   compositor->SetWebContentsURL(web_contents()->GetLastCommittedURL());
+  compositor->SetUserAgent(user_agent_);
   return compositor;
 }
 
diff --git a/components/printing/browser/print_composite_client.h b/components/printing/browser/print_composite_client.h
index 13e2bae6..9005f2c 100644
--- a/components/printing/browser/print_composite_client.h
+++ b/components/printing/browser/print_composite_client.h
@@ -67,6 +67,8 @@
       const PrintHostMsg_DidPrintContent_Params& content,
       mojom::PdfCompositor::CompositeDocumentToPdfCallback callback);
 
+  void SetUserAgent(const std::string& user_agent) { user_agent_ = user_agent; }
+
  private:
   // Callback functions for getting the replies.
   static void OnDidCompositePageToPdf(
@@ -104,6 +106,8 @@
   // for that document.
   std::map<int, base::flat_set<uint64_t>> printed_subframes_;
 
+  std::string user_agent_;
+
   DISALLOW_COPY_AND_ASSIGN(PrintCompositeClient);
 };
 
diff --git a/components/printing/browser/print_manager_utils.cc b/components/printing/browser/print_manager_utils.cc
index 7347093e..c1073ba 100644
--- a/components/printing/browser/print_manager_utils.cc
+++ b/components/printing/browser/print_manager_utils.cc
@@ -28,7 +28,8 @@
   return g_oopif_enabled;
 }
 
-void CreateCompositeClientIfNeeded(content::WebContents* web_contents) {
+void CreateCompositeClientIfNeeded(content::WebContents* web_contents,
+                                   const std::string& user_agent) {
   // TODO(weili): We only create pdf compositor client and use pdf compositor
   // service when site-per-process or isolate-origins flag/feature is enabled,
   // or top-document-isolation feature is enabled. This may not cover all cases
@@ -39,6 +40,8 @@
       base::FeatureList::IsEnabled(
           features::kUsePdfCompositorServiceForPrint)) {
     PrintCompositeClient::CreateForWebContents(web_contents);
+    PrintCompositeClient::FromWebContents(web_contents)
+        ->SetUserAgent(user_agent);
     SetOopifEnabled();
   }
 }
diff --git a/components/printing/browser/print_manager_utils.h b/components/printing/browser/print_manager_utils.h
index 0013d32..bd27814 100644
--- a/components/printing/browser/print_manager_utils.h
+++ b/components/printing/browser/print_manager_utils.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_PRINTING_BROWSER_PRINT_MANAGER_UTILS_H_
 #define COMPONENTS_PRINTING_BROWSER_PRINT_MANAGER_UTILS_H_
 
+#include <string>
+
 struct PrintMsg_Print_Params;
 
 namespace content {
@@ -19,7 +21,8 @@
 
 // Check on the current feature settings to decide whether we need to
 // create a PDF compositor client for this |web_contents|.
-void CreateCompositeClientIfNeeded(content::WebContents* web_contents);
+void CreateCompositeClientIfNeeded(content::WebContents* web_contents,
+                                   const std::string& user_agent);
 
 // Converts given settings to Print_Params and stores them in the output
 // parameter |params|.
diff --git a/components/services/pdf_compositor/pdf_compositor_impl.cc b/components/services/pdf_compositor/pdf_compositor_impl.cc
index 4604a097..b6dbd07a 100644
--- a/components/services/pdf_compositor/pdf_compositor_impl.cc
+++ b/components/services/pdf_compositor/pdf_compositor_impl.cc
@@ -23,9 +23,8 @@
 namespace printing {
 
 PdfCompositorImpl::PdfCompositorImpl(
-    const std::string& creator,
     std::unique_ptr<service_manager::ServiceContextRef> service_ref)
-    : service_ref_(std::move(service_ref)), creator_(creator) {}
+    : service_ref_(std::move(service_ref)) {}
 
 PdfCompositorImpl::~PdfCompositorImpl() = default;
 
@@ -108,6 +107,11 @@
   crash_key.Set(url.spec());
 }
 
+void PdfCompositorImpl::SetUserAgent(const std::string& user_agent) {
+  if (!user_agent.empty())
+    creator_ = user_agent;
+}
+
 void PdfCompositorImpl::UpdateRequestsWithSubframeInfo(
     uint64_t frame_guid,
     const std::vector<uint64_t>& pending_subframes) {
diff --git a/components/services/pdf_compositor/pdf_compositor_impl.h b/components/services/pdf_compositor/pdf_compositor_impl.h
index e432024..06c4bffa 100644
--- a/components/services/pdf_compositor/pdf_compositor_impl.h
+++ b/components/services/pdf_compositor/pdf_compositor_impl.h
@@ -26,8 +26,7 @@
 
 class PdfCompositorImpl : public mojom::PdfCompositor {
  public:
-  PdfCompositorImpl(
-      const std::string& creator,
+  explicit PdfCompositorImpl(
       std::unique_ptr<service_manager::ServiceContextRef> service_ref);
   ~PdfCompositorImpl() override;
 
@@ -48,6 +47,7 @@
       const ContentToFrameMap& subframe_content_map,
       mojom::PdfCompositor::CompositeDocumentToPdfCallback callback) override;
   void SetWebContentsURL(const GURL& url) override;
+  void SetUserAgent(const std::string& user_agent) override;
 
  protected:
   // This is the uniform underlying type for both
@@ -160,7 +160,11 @@
       const ContentToFrameMap& subframe_content_map);
 
   const std::unique_ptr<service_manager::ServiceContextRef> service_ref_;
-  const std::string creator_;
+  // The creator of this service.
+
+  // Currently contains the service creator's user agent string if given,
+  // otherwise just use string "Chromium".
+  std::string creator_ = "Chromium";
 
   // Keep track of all frames' information indexed by frame id.
   FrameMap frame_info_map_;
diff --git a/components/services/pdf_compositor/pdf_compositor_impl_unittest.cc b/components/services/pdf_compositor/pdf_compositor_impl_unittest.cc
index efdc599d..a03c4cc 100644
--- a/components/services/pdf_compositor/pdf_compositor_impl_unittest.cc
+++ b/components/services/pdf_compositor/pdf_compositor_impl_unittest.cc
@@ -23,7 +23,7 @@
 
 class MockPdfCompositorImpl : public PdfCompositorImpl {
  public:
-  MockPdfCompositorImpl() : PdfCompositorImpl("unittest", nullptr) {}
+  MockPdfCompositorImpl() : PdfCompositorImpl(nullptr) {}
   ~MockPdfCompositorImpl() override {}
 
   MOCK_METHOD2(OnFulfillRequest, void(uint64_t, int));
@@ -95,7 +95,7 @@
 };
 
 TEST_F(PdfCompositorImplTest, IsReadyToComposite) {
-  PdfCompositorImpl impl("unittest", nullptr);
+  PdfCompositorImpl impl(nullptr);
   // Frame 2 and 3 are painted.
   impl.AddSubframeContent(2, CreateTestData(2, -1), ContentToFrameMap());
   impl.AddSubframeContent(3, CreateTestData(3, -1), ContentToFrameMap());
@@ -131,7 +131,7 @@
 }
 
 TEST_F(PdfCompositorImplTest, MultiLayerDependency) {
-  PdfCompositorImpl impl("unittest", nullptr);
+  PdfCompositorImpl impl(nullptr);
   // Frame 3 has content 1 which refers to subframe 1.
   ContentToFrameMap subframe_content_map = {{1, 1}};
   impl.AddSubframeContent(3, CreateTestData(3, -1), subframe_content_map);
@@ -171,7 +171,7 @@
 }
 
 TEST_F(PdfCompositorImplTest, DependencyLoop) {
-  PdfCompositorImpl impl("unittest", nullptr);
+  PdfCompositorImpl impl(nullptr);
   // Frame 3 has content 1, which refers to frame 1.
   // Frame 1 has content 3, which refers to frame 3.
   ContentToFrameMap subframe_content_map = {{3, 3}};
@@ -304,7 +304,7 @@
 }
 
 TEST_F(PdfCompositorImplCrashKeyTest, SetCrashKey) {
-  PdfCompositorImpl impl("unittest", nullptr);
+  PdfCompositorImpl impl(nullptr);
   std::string url_str("https://www.example.com/");
   GURL url(url_str);
   impl.SetWebContentsURL(url);
diff --git a/components/services/pdf_compositor/pdf_compositor_service.cc b/components/services/pdf_compositor/pdf_compositor_service.cc
index f4a2180..e93447e 100644
--- a/components/services/pdf_compositor/pdf_compositor_service.cc
+++ b/components/services/pdf_compositor/pdf_compositor_service.cc
@@ -32,12 +32,11 @@
 
 namespace {
 
-void OnPdfCompositorRequest(const std::string& creator,
-                            service_manager::ServiceKeepalive* keepalive,
+void OnPdfCompositorRequest(service_manager::ServiceKeepalive* keepalive,
                             printing::mojom::PdfCompositorRequest request) {
-  mojo::MakeStrongBinding(std::make_unique<printing::PdfCompositorImpl>(
-                              creator, keepalive->CreateRef()),
-                          std::move(request));
+  mojo::MakeStrongBinding(
+      std::make_unique<printing::PdfCompositorImpl>(keepalive->CreateRef()),
+      std::move(request));
 }
 
 }  // namespace
@@ -45,10 +44,8 @@
 namespace printing {
 
 PdfCompositorService::PdfCompositorService(
-    const std::string& creator,
     service_manager::mojom::ServiceRequest request)
-    : creator_(creator.empty() ? "Chromium" : creator),
-      binding_(this, std::move(request)),
+    : binding_(this, std::move(request)),
       keepalive_(&binding_, base::TimeDelta{}) {}
 
 PdfCompositorService::~PdfCompositorService() {
@@ -59,19 +56,17 @@
 
 // static
 std::unique_ptr<service_manager::Service> PdfCompositorService::Create(
-    const std::string& creator,
     service_manager::mojom::ServiceRequest request) {
 #if defined(OS_WIN)
   // Initialize direct write font proxy so skia can use it.
   content::InitializeDWriteFontProxy();
 #endif
-  return std::make_unique<printing::PdfCompositorService>(creator,
-                                                          std::move(request));
+  return std::make_unique<printing::PdfCompositorService>(std::move(request));
 }
 
 void PdfCompositorService::OnStart() {
   registry_.AddInterface(
-      base::BindRepeating(&OnPdfCompositorRequest, creator_, &keepalive_));
+      base::BindRepeating(&OnPdfCompositorRequest, &keepalive_));
 
   if (skip_initialization_for_testing_)
     return;
diff --git a/components/services/pdf_compositor/pdf_compositor_service.h b/components/services/pdf_compositor/pdf_compositor_service.h
index b0bc48f9..6e5610f 100644
--- a/components/services/pdf_compositor/pdf_compositor_service.h
+++ b/components/services/pdf_compositor/pdf_compositor_service.h
@@ -21,13 +21,11 @@
 
 class PdfCompositorService : public service_manager::Service {
  public:
-  PdfCompositorService(const std::string& creator,
-                       service_manager::mojom::ServiceRequest request);
+  explicit PdfCompositorService(service_manager::mojom::ServiceRequest request);
   ~PdfCompositorService() override;
 
   // Factory function for use as an embedded service.
   static std::unique_ptr<service_manager::Service> Create(
-      const std::string& creator,
       service_manager::mojom::ServiceRequest request);
 
   // service_manager::Service:
@@ -41,11 +39,6 @@
   }
 
  private:
-  // The creator of this service.
-  // Currently contains the service creator's user agent string if given,
-  // otherwise just use string "Chromium".
-  const std::string creator_;
-
   service_manager::ServiceBinding binding_;
   service_manager::ServiceKeepalive keepalive_;
   bool skip_initialization_for_testing_ = false;
diff --git a/components/services/pdf_compositor/pdf_compositor_service_unittest.cc b/components/services/pdf_compositor/pdf_compositor_service_unittest.cc
index fe38e37..506c029 100644
--- a/components/services/pdf_compositor/pdf_compositor_service_unittest.cc
+++ b/components/services/pdf_compositor/pdf_compositor_service_unittest.cc
@@ -28,7 +28,6 @@
   PdfCompositorServiceTest()
       : connector_(test_connector_factory_.CreateConnector()),
         service_(
-            "pdf_compositor_service_unittest",
             test_connector_factory_.RegisterInstance(mojom::kServiceName)) {
     // We don't want the service instance setting up its own discardable memory
     // allocator, which it normally does. Instead it will use the one provided
diff --git a/components/services/pdf_compositor/public/cpp/pdf_compositor_service_factory.cc b/components/services/pdf_compositor/public/cpp/pdf_compositor_service_factory.cc
index d0eb57b..d74c5bf 100644
--- a/components/services/pdf_compositor/public/cpp/pdf_compositor_service_factory.cc
+++ b/components/services/pdf_compositor/public/cpp/pdf_compositor_service_factory.cc
@@ -13,7 +13,6 @@
 namespace printing {
 
 std::unique_ptr<service_manager::Service> CreatePdfCompositorService(
-    const std::string& creator,
     service_manager::mojom::ServiceRequest request) {
 #if defined(OS_POSIX) && !defined(OS_ANDROID)
   content::UtilityThread::Get()->EnsureBlinkInitializedWithSandboxSupport();
@@ -23,7 +22,7 @@
   // Hook up blink's codecs so skia can call them.
   SkGraphics::SetImageGeneratorFromEncodedDataFactory(
       blink::WebImageGenerator::CreateAsSkImageGenerator);
-  return printing::PdfCompositorService::Create(creator, std::move(request));
+  return printing::PdfCompositorService::Create(std::move(request));
 }
 
 }  // namespace printing
diff --git a/components/services/pdf_compositor/public/cpp/pdf_compositor_service_factory.h b/components/services/pdf_compositor/public/cpp/pdf_compositor_service_factory.h
index 41f8b6a..61400738 100644
--- a/components/services/pdf_compositor/public/cpp/pdf_compositor_service_factory.h
+++ b/components/services/pdf_compositor/public/cpp/pdf_compositor_service_factory.h
@@ -14,7 +14,6 @@
 namespace printing {
 
 std::unique_ptr<service_manager::Service> CreatePdfCompositorService(
-    const std::string& creator,
     service_manager::mojom::ServiceRequest request);
 
 }  // namespace printing
diff --git a/components/services/pdf_compositor/public/interfaces/pdf_compositor.mojom b/components/services/pdf_compositor/public/interfaces/pdf_compositor.mojom
index c6d31c38..0fba3601 100644
--- a/components/services/pdf_compositor/public/interfaces/pdf_compositor.mojom
+++ b/components/services/pdf_compositor/public/interfaces/pdf_compositor.mojom
@@ -61,4 +61,7 @@
   // Sets the URL which is committed in the main frame of the WebContents,
   // for use in crash diagnosis.
   SetWebContentsURL(url.mojom.Url url);
+
+  // Sets the user-agent string for the document.
+  SetUserAgent(string user_agent);
 };
diff --git a/components/signin/core/browser/BUILD.gn b/components/signin/core/browser/BUILD.gn
index ad4cd91..08a41ee 100644
--- a/components/signin/core/browser/BUILD.gn
+++ b/components/signin/core/browser/BUILD.gn
@@ -243,8 +243,6 @@
   sources = [
     "fake_account_fetcher_service.cc",
     "fake_account_fetcher_service.h",
-    "fake_auth_status_provider.cc",
-    "fake_auth_status_provider.h",
   ]
 
   deps = [
diff --git a/components/signin/core/browser/fake_auth_status_provider.cc b/components/signin/core/browser/fake_auth_status_provider.cc
deleted file mode 100644
index 77e10db..0000000
--- a/components/signin/core/browser/fake_auth_status_provider.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/signin/core/browser/fake_auth_status_provider.h"
-
-FakeAuthStatusProvider::FakeAuthStatusProvider(SigninErrorController* error)
-  : error_provider_(error),
-    auth_error_(GoogleServiceAuthError::AuthErrorNone()) {
-  error_provider_->AddProvider(this);
-}
-
-FakeAuthStatusProvider::~FakeAuthStatusProvider() {
-  error_provider_->RemoveProvider(this);
-}
-
-std::string FakeAuthStatusProvider::GetAccountId() const {
-  return account_id_;
-}
-
-GoogleServiceAuthError FakeAuthStatusProvider::GetAuthStatus() const {
-  return auth_error_;
-}
-
-void FakeAuthStatusProvider::SetAuthError(const std::string& account_id,
-                                          const GoogleServiceAuthError& error) {
-  account_id_ = account_id;
-  auth_error_ = error;
-  error_provider_->AuthStatusChanged();
-}
diff --git a/components/signin/core/browser/fake_auth_status_provider.h b/components/signin/core/browser/fake_auth_status_provider.h
deleted file mode 100644
index 48a03787..0000000
--- a/components/signin/core/browser/fake_auth_status_provider.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_SIGNIN_CORE_BROWSER_FAKE_AUTH_STATUS_PROVIDER_H_
-#define COMPONENTS_SIGNIN_CORE_BROWSER_FAKE_AUTH_STATUS_PROVIDER_H_
-
-#include "components/signin/core/browser/signin_error_controller.h"
-
-// Helper class that reports auth errors to SigninErrorController. Automatically
-// registers and de-registers itself as an AuthStatusProvider in the
-// constructor and destructor.
-class FakeAuthStatusProvider
-    : public SigninErrorController::AuthStatusProvider {
- public:
-  explicit FakeAuthStatusProvider(SigninErrorController* error);
-  ~FakeAuthStatusProvider() override;
-
-  // Sets the auth error that this provider reports to SigninErrorController.
-  // Also notifies SigninErrorController via AuthStatusChanged().
-  void SetAuthError(const std::string& account_id,
-                    const GoogleServiceAuthError& error);
-
-  void set_error_without_status_change(const GoogleServiceAuthError& error) {
-    auth_error_ = error;
-  }
-
-  // AuthStatusProvider implementation.
-  std::string GetAccountId() const override;
-  GoogleServiceAuthError GetAuthStatus() const override;
-
- private:
-  SigninErrorController* error_provider_;
-  std::string account_id_;
-  GoogleServiceAuthError auth_error_;
-};
-
-#endif  // COMPONENTS_SIGNIN_CORE_BROWSER_FAKE_AUTH_STATUS_PROVIDER_H_
diff --git a/components/signin/core/browser/signin_error_controller.cc b/components/signin/core/browser/signin_error_controller.cc
index 305228d..57ecada 100644
--- a/components/signin/core/browser/signin_error_controller.cc
+++ b/components/signin/core/browser/signin_error_controller.cc
@@ -6,45 +6,24 @@
 
 #include "components/signin/core/browser/signin_metrics.h"
 
-namespace {
-
-typedef std::set<const SigninErrorController::AuthStatusProvider*>
-    AuthStatusProviderSet;
-
-}  // namespace
-
-SigninErrorController::AuthStatusProvider::AuthStatusProvider() {
-}
-
-SigninErrorController::AuthStatusProvider::~AuthStatusProvider() {
-}
-
-SigninErrorController::SigninErrorController(AccountMode mode)
+SigninErrorController::SigninErrorController(AccountMode mode,
+                                             OAuth2TokenService* token_service)
     : account_mode_(mode),
-      auth_error_(GoogleServiceAuthError::AuthErrorNone()) {}
-
-SigninErrorController::~SigninErrorController() {
-  DCHECK(provider_set_.empty())
-      << "All AuthStatusProviders should be unregistered before "
-      << "SigninErrorController is destroyed";
+      token_service_(token_service),
+      scoped_token_service_observer_(this),
+      auth_error_(GoogleServiceAuthError::AuthErrorNone()) {
+  DCHECK(token_service_);
+  scoped_token_service_observer_.Add(token_service_);
+  Update();
 }
 
-void SigninErrorController::AddProvider(const AuthStatusProvider* provider) {
-  DCHECK(provider_set_.find(provider) == provider_set_.end())
-      << "Adding same AuthStatusProvider multiple times";
-  provider_set_.insert(provider);
-  AuthStatusChanged();
+SigninErrorController::~SigninErrorController() = default;
+
+void SigninErrorController::Shutdown() {
+  scoped_token_service_observer_.RemoveAll();
 }
 
-void SigninErrorController::RemoveProvider(const AuthStatusProvider* provider) {
-  auto iter = provider_set_.find(provider);
-  DCHECK(iter != provider_set_.end())
-      << "Removing provider that was never added";
-  provider_set_.erase(iter);
-  AuthStatusChanged();
-}
-
-void SigninErrorController::AuthStatusChanged() {
+void SigninErrorController::Update() {
   GoogleServiceAuthError::State prev_state = auth_error_.state();
   std::string prev_account_id = error_account_id_;
   bool error_changed = false;
@@ -53,22 +32,19 @@
   // actionable error state and some provider exposes a similar error and
   // account id, use that error. Otherwise, just take the first actionable
   // error we find.
-  for (auto it = provider_set_.begin(); it != provider_set_.end(); ++it) {
-    std::string account_id = (*it)->GetAccountId();
-
+  for (const std::string& account_id : token_service_->GetAccounts()) {
     // In PRIMARY_ACCOUNT mode, ignore all secondary accounts.
     if (account_mode_ == AccountMode::PRIMARY_ACCOUNT &&
         (account_id != primary_account_id_)) {
       continue;
     }
 
-    GoogleServiceAuthError error = (*it)->GetAuthStatus();
-
-    // Ignore the states we don't want to elevate to the user.
-    if (error.state() == GoogleServiceAuthError::NONE ||
-        error.IsTransientError()) {
+    if (!token_service_->RefreshTokenHasError(account_id))
       continue;
-    }
+
+    GoogleServiceAuthError error = token_service_->GetAuthError(account_id);
+    // TokenService only reports persistent errors.
+    DCHECK(error.IsPersistentError());
 
     // Prioritize this error if it matches the previous |auth_error_|.
     if (error.state() == prev_state && account_id == prev_account_id) {
@@ -102,14 +78,14 @@
 }
 
 bool SigninErrorController::HasError() const {
-  return auth_error_.state() != GoogleServiceAuthError::NONE &&
-      auth_error_.state() != GoogleServiceAuthError::CONNECTION_FAILED;
+  DCHECK(!auth_error_.IsTransientError());
+  return auth_error_.state() != GoogleServiceAuthError::NONE;
 }
 
 void SigninErrorController::SetPrimaryAccountID(const std::string& account_id) {
   primary_account_id_ = account_id;
   if (account_mode_ == AccountMode::PRIMARY_ACCOUNT)
-    AuthStatusChanged();  // Recompute the error state.
+    Update();  // Recompute the error state.
 }
 
 void SigninErrorController::AddObserver(Observer* observer) {
@@ -119,3 +95,13 @@
 void SigninErrorController::RemoveObserver(Observer* observer) {
   observer_list_.RemoveObserver(observer);
 }
+
+void SigninErrorController::OnEndBatchChanges() {
+  Update();
+}
+
+void SigninErrorController::OnAuthErrorChanged(
+    const std::string& account_id,
+    const GoogleServiceAuthError& auth_error) {
+  Update();
+}
diff --git a/components/signin/core/browser/signin_error_controller.h b/components/signin/core/browser/signin_error_controller.h
index 1a2c08a8..20d2d51 100644
--- a/components/signin/core/browser/signin_error_controller.h
+++ b/components/signin/core/browser/signin_error_controller.h
@@ -9,14 +9,17 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
+#include "base/scoped_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "google_apis/gaia/google_service_auth_error.h"
+#include "google_apis/gaia/oauth2_token_service.h"
 
 // Keep track of auth errors and expose them to observers in the UI. Services
 // that wish to expose auth errors to the user should register an
 // AuthStatusProvider to report their current authentication state, and should
 // invoke AuthStatusChanged() when their authentication state may have changed.
-class SigninErrorController : public KeyedService {
+class SigninErrorController : public KeyedService,
+                              public OAuth2TokenService::Observer {
  public:
   enum class AccountMode {
     // Signin error controller monitors all the accounts. When multiple accounts
@@ -28,19 +31,6 @@
     PRIMARY_ACCOUNT
   };
 
-  class AuthStatusProvider {
-   public:
-    AuthStatusProvider();
-    virtual ~AuthStatusProvider();
-
-    // Returns the account id with the status specified by GetAuthStatus().
-    virtual std::string GetAccountId() const = 0;
-
-    // API invoked by SigninErrorController to get the current auth status of
-    // the various signed in services.
-    virtual GoogleServiceAuthError GetAuthStatus() const = 0;
-  };
-
   // The observer class for SigninErrorController lets the controller notify
   // observers when an error arises or changes.
   class Observer {
@@ -49,19 +39,12 @@
     virtual void OnErrorChanged() = 0;
   };
 
-  explicit SigninErrorController(AccountMode mode);
+  explicit SigninErrorController(AccountMode mode,
+                                 OAuth2TokenService* token_service);
   ~SigninErrorController() override;
 
-  // Adds a provider which the SigninErrorController object will start querying
-  // for auth status.
-  void AddProvider(const AuthStatusProvider* provider);
-
-  // Removes a provider previously added by SigninErrorController (generally
-  // only called in preparation for shutdown).
-  void RemoveProvider(const AuthStatusProvider* provider);
-
-  // Invoked when the auth status of an AuthStatusProvider has changed.
-  void AuthStatusChanged();
+  // KeyedService implementation:
+  void Shutdown() override;
 
   // True if there exists an error worth elevating to the user.
   bool HasError() const;
@@ -76,8 +59,18 @@
   const GoogleServiceAuthError& auth_error() const { return auth_error_; }
 
  private:
+  // Invoked when the auth status has changed.
+  void Update();
+
+  // OAuth2TokenService::Observer implementation:
+  void OnEndBatchChanges() override;
+  void OnAuthErrorChanged(const std::string& account_id,
+                          const GoogleServiceAuthError& auth_error) override;
+
   const AccountMode account_mode_;
-  std::set<const AuthStatusProvider*> provider_set_;
+  OAuth2TokenService* token_service_;
+  ScopedObserver<OAuth2TokenService, SigninErrorController>
+      scoped_token_service_observer_;
 
   // The primary account ID. Only used in the PRIMARY_ACCOUNT account mode.
   std::string primary_account_id_;
diff --git a/components/signin/core/browser/signin_error_controller_unittest.cc b/components/signin/core/browser/signin_error_controller_unittest.cc
index 62bec6a..fabde75 100644
--- a/components/signin/core/browser/signin_error_controller_unittest.cc
+++ b/components/signin/core/browser/signin_error_controller_unittest.cc
@@ -10,154 +10,119 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "components/signin/core/browser/fake_auth_status_provider.h"
+#include "base/scoped_observer.h"
+#include "components/prefs/testing_pref_service.h"
+#include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-static const char kTestAccountId[] = "testuser@test.com";
-static const char kOtherTestAccountId[] = "otheruser@test.com";
+namespace {
 
-TEST(SigninErrorControllerTest, NoErrorAuthStatusProviders) {
+static const char kTestAccountId[] = "account_id";
+static const char kOtherTestAccountId[] = "other_id";
+
+class MockSigninErrorControllerObserver
+    : public SigninErrorController::Observer {
+ public:
+  MOCK_METHOD0(OnErrorChanged, void());
+};
+
+}  // namespace
+
+TEST(SigninErrorControllerTest, SingleAccount) {
+  MockSigninErrorControllerObserver observer;
+  EXPECT_CALL(observer, OnErrorChanged()).Times(0);
+
+  TestingPrefServiceSimple pref_service;
+  FakeProfileOAuth2TokenService token_service(&pref_service);
   SigninErrorController error_controller(
-      SigninErrorController::AccountMode::ANY_ACCOUNT);
-  std::unique_ptr<FakeAuthStatusProvider> provider;
-
-  // No providers.
+      SigninErrorController::AccountMode::ANY_ACCOUNT, &token_service);
+  ScopedObserver<SigninErrorController, SigninErrorController::Observer>
+      scoped_observer(&observer);
+  scoped_observer.Add(&error_controller);
   ASSERT_FALSE(error_controller.HasError());
+  ::testing::Mock::VerifyAndClearExpectations(&observer);
 
-  // Add a provider.
-  provider.reset(new FakeAuthStatusProvider(&error_controller));
-  ASSERT_FALSE(error_controller.HasError());
+  // The fake token service does not call OnEndBatchChanges() as part of
+  // UpdateCredentials(), and thus the signin error controller is not updated.
+  EXPECT_CALL(observer, OnErrorChanged()).Times(0);
 
-  // Remove the provider.
-  provider.reset();
-  ASSERT_FALSE(error_controller.HasError());
+  token_service.UpdateCredentials(kTestAccountId, "token");
+  ::testing::Mock::VerifyAndClearExpectations(&observer);
+
+  GoogleServiceAuthError error1 =
+      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
+  EXPECT_CALL(observer, OnErrorChanged()).Times(1);
+  token_service.UpdateAuthErrorForTesting(kTestAccountId, error1);
+  EXPECT_TRUE(error_controller.HasError());
+  EXPECT_EQ(error1, error_controller.auth_error());
+  ::testing::Mock::VerifyAndClearExpectations(&observer);
+
+  GoogleServiceAuthError error2 =
+      GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED);
+  EXPECT_CALL(observer, OnErrorChanged()).Times(1);
+  token_service.UpdateAuthErrorForTesting(kTestAccountId, error2);
+  EXPECT_TRUE(error_controller.HasError());
+  EXPECT_EQ(error2, error_controller.auth_error());
+  ::testing::Mock::VerifyAndClearExpectations(&observer);
+
+  EXPECT_CALL(observer, OnErrorChanged()).Times(1);
+  token_service.UpdateAuthErrorForTesting(
+      kTestAccountId, GoogleServiceAuthError::AuthErrorNone());
+  EXPECT_FALSE(error_controller.HasError());
+  EXPECT_EQ(GoogleServiceAuthError::AuthErrorNone(),
+            error_controller.auth_error());
+  ::testing::Mock::VerifyAndClearExpectations(&observer);
 }
 
-TEST(SigninErrorControllerTest, ErrorAuthStatusProvider) {
+TEST(SigninErrorControllerTest, AccountTransitionAnyAccount) {
+  TestingPrefServiceSimple pref_service;
+  FakeProfileOAuth2TokenService token_service(&pref_service);
+  token_service.UpdateCredentials(kTestAccountId, "token");
+  token_service.UpdateCredentials(kOtherTestAccountId, "token");
   SigninErrorController error_controller(
-      SigninErrorController::AccountMode::ANY_ACCOUNT);
-  std::unique_ptr<FakeAuthStatusProvider> provider;
-  std::unique_ptr<FakeAuthStatusProvider> error_provider;
-
-  provider.reset(new FakeAuthStatusProvider(&error_controller));
+      SigninErrorController::AccountMode::ANY_ACCOUNT, &token_service);
   ASSERT_FALSE(error_controller.HasError());
 
-  error_provider.reset(new FakeAuthStatusProvider(&error_controller));
-  error_provider->SetAuthError(
+  token_service.UpdateAuthErrorForTesting(
       kTestAccountId,
-      GoogleServiceAuthError(
-          GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
-  ASSERT_TRUE(error_controller.HasError());
-
-  error_provider.reset();
-  ASSERT_FALSE(error_controller.HasError());
-
-  provider.reset();
-  // All providers should be removed now.
-  ASSERT_FALSE(error_controller.HasError());
-}
-
-TEST(SigninErrorControllerTest, AuthStatusProviderErrorTransition) {
-  SigninErrorController error_controller(
-      SigninErrorController::AccountMode::ANY_ACCOUNT);
-  std::unique_ptr<FakeAuthStatusProvider> provider0(
-      new FakeAuthStatusProvider(&error_controller));
-  std::unique_ptr<FakeAuthStatusProvider> provider1(
-      new FakeAuthStatusProvider(&error_controller));
-
-  ASSERT_FALSE(error_controller.HasError());
-  provider0->SetAuthError(
-      kTestAccountId,
-      GoogleServiceAuthError(
-          GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
-  ASSERT_TRUE(error_controller.HasError());
-  provider1->SetAuthError(
-      kTestAccountId,
-      GoogleServiceAuthError(GoogleServiceAuthError::ACCOUNT_DISABLED));
-  ASSERT_TRUE(error_controller.HasError());
-
-  // Now resolve the auth errors - the menu item should go away.
-  provider0->SetAuthError(kTestAccountId,
-                         GoogleServiceAuthError::AuthErrorNone());
-  ASSERT_TRUE(error_controller.HasError());
-  provider1->SetAuthError(kTestAccountId,
-                          GoogleServiceAuthError::AuthErrorNone());
-  ASSERT_FALSE(error_controller.HasError());
-
-  provider0.reset();
-  provider1.reset();
-  ASSERT_FALSE(error_controller.HasError());
-}
-
-TEST(SigninErrorControllerTest, AuthStatusProviderAccountTransitionAnyAccount) {
-  SigninErrorController error_controller(
-      SigninErrorController::AccountMode::ANY_ACCOUNT);
-  std::unique_ptr<FakeAuthStatusProvider> provider0(
-      new FakeAuthStatusProvider(&error_controller));
-  std::unique_ptr<FakeAuthStatusProvider> provider1(
-      new FakeAuthStatusProvider(&error_controller));
-
-  ASSERT_FALSE(error_controller.HasError());
-
-  provider0->SetAuthError(
-      kTestAccountId,
-      GoogleServiceAuthError(
-          GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
-  provider1->SetAuthError(
+      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
+  token_service.UpdateAuthErrorForTesting(
       kOtherTestAccountId,
       GoogleServiceAuthError(GoogleServiceAuthError::NONE));
   ASSERT_TRUE(error_controller.HasError());
   ASSERT_STREQ(kTestAccountId, error_controller.error_account_id().c_str());
 
-  // Swap providers reporting errors.
-  provider1->set_error_without_status_change(
-      GoogleServiceAuthError(
-          GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
-  provider0->set_error_without_status_change(
-      GoogleServiceAuthError(GoogleServiceAuthError::NONE));
-  error_controller.AuthStatusChanged();
-  ASSERT_TRUE(error_controller.HasError());
-  ASSERT_STREQ(kOtherTestAccountId,
-               error_controller.error_account_id().c_str());
-
   // Now resolve the auth errors - the menu item should go away.
-  provider0->set_error_without_status_change(
-      GoogleServiceAuthError::AuthErrorNone());
-  provider1->set_error_without_status_change(
-      GoogleServiceAuthError::AuthErrorNone());
-  error_controller.AuthStatusChanged();
-  ASSERT_FALSE(error_controller.HasError());
-
-  provider0.reset();
-  provider1.reset();
+  token_service.UpdateAuthErrorForTesting(
+      kTestAccountId, GoogleServiceAuthError::AuthErrorNone());
   ASSERT_FALSE(error_controller.HasError());
 }
 
-TEST(SigninErrorControllerTest,
-     AuthStatusProviderAccountTransitionPrimaryAccount) {
+TEST(SigninErrorControllerTest, AccountTransitionPrimaryAccount) {
+  TestingPrefServiceSimple pref_service;
+  FakeProfileOAuth2TokenService token_service(&pref_service);
+  token_service.UpdateCredentials(kTestAccountId, "token");
+  token_service.UpdateCredentials(kOtherTestAccountId, "token");
   SigninErrorController error_controller(
-      SigninErrorController::AccountMode::PRIMARY_ACCOUNT);
-  std::unique_ptr<FakeAuthStatusProvider> provider0(
-      new FakeAuthStatusProvider(&error_controller));
-  std::unique_ptr<FakeAuthStatusProvider> provider1(
-      new FakeAuthStatusProvider(&error_controller));
-
+      SigninErrorController::AccountMode::PRIMARY_ACCOUNT, &token_service);
   ASSERT_FALSE(error_controller.HasError());
 
-  provider0->SetAuthError(
+  token_service.UpdateAuthErrorForTesting(
       kTestAccountId,
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
-  provider1->SetAuthError(kOtherTestAccountId,
-                          GoogleServiceAuthError(GoogleServiceAuthError::NONE));
+  token_service.UpdateAuthErrorForTesting(
+      kOtherTestAccountId,
+      GoogleServiceAuthError(GoogleServiceAuthError::NONE));
   ASSERT_FALSE(error_controller.HasError());  // No primary account.
   error_controller.SetPrimaryAccountID(kOtherTestAccountId);
   ASSERT_FALSE(error_controller.HasError());  // Error on secondary.
+  // Change the primary account.
   error_controller.SetPrimaryAccountID(kTestAccountId);
   ASSERT_TRUE(error_controller.HasError());
   ASSERT_STREQ(kTestAccountId, error_controller.error_account_id().c_str());
 
-  // Change the primary account.
-  provider1->SetAuthError(
+  token_service.UpdateAuthErrorForTesting(
       kOtherTestAccountId,
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
   ASSERT_TRUE(error_controller.HasError());
@@ -170,50 +135,49 @@
   // Signout.
   error_controller.SetPrimaryAccountID("");
   ASSERT_FALSE(error_controller.HasError());
-
-  provider0.reset();
-  provider1.reset();
 }
 
 // Verify that SigninErrorController handles errors properly.
 TEST(SigninErrorControllerTest, AuthStatusEnumerateAllErrors) {
+  TestingPrefServiceSimple pref_service;
+  FakeProfileOAuth2TokenService token_service(&pref_service);
+  token_service.UpdateCredentials(kTestAccountId, "token");
   SigninErrorController error_controller(
-      SigninErrorController::AccountMode::ANY_ACCOUNT);
-  typedef struct {
-    GoogleServiceAuthError::State error_state;
-    bool is_error;
-  } ErrorTableEntry;
+      SigninErrorController::AccountMode::ANY_ACCOUNT, &token_service);
 
-  ErrorTableEntry table[] = {
-    { GoogleServiceAuthError::NONE, false },
-    { GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, true },
-    { GoogleServiceAuthError::USER_NOT_SIGNED_UP, true },
-    { GoogleServiceAuthError::CONNECTION_FAILED, false },
-    { GoogleServiceAuthError::CAPTCHA_REQUIRED, true },
-    { GoogleServiceAuthError::ACCOUNT_DELETED, true },
-    { GoogleServiceAuthError::ACCOUNT_DISABLED, true },
-    { GoogleServiceAuthError::SERVICE_UNAVAILABLE, false },
-    { GoogleServiceAuthError::TWO_FACTOR, true },
-    { GoogleServiceAuthError::REQUEST_CANCELED, false },
-    { GoogleServiceAuthError::HOSTED_NOT_ALLOWED_DEPRECATED, false },
-    { GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE, true },
-    { GoogleServiceAuthError::SERVICE_ERROR, true },
-    { GoogleServiceAuthError::WEB_LOGIN_REQUIRED, true },
-  };
+  GoogleServiceAuthError::State table[] = {
+      GoogleServiceAuthError::NONE,
+      GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS,
+      GoogleServiceAuthError::USER_NOT_SIGNED_UP,
+      GoogleServiceAuthError::CONNECTION_FAILED,
+      GoogleServiceAuthError::CAPTCHA_REQUIRED,
+      GoogleServiceAuthError::ACCOUNT_DELETED,
+      GoogleServiceAuthError::ACCOUNT_DISABLED,
+      GoogleServiceAuthError::SERVICE_UNAVAILABLE,
+      GoogleServiceAuthError::TWO_FACTOR,
+      GoogleServiceAuthError::REQUEST_CANCELED,
+      GoogleServiceAuthError::HOSTED_NOT_ALLOWED_DEPRECATED,
+      GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE,
+      GoogleServiceAuthError::SERVICE_ERROR,
+      GoogleServiceAuthError::WEB_LOGIN_REQUIRED};
   static_assert(arraysize(table) == GoogleServiceAuthError::NUM_STATES,
       "table array does not match the number of auth error types");
 
-  for (size_t i = 0; i < arraysize(table); ++i) {
-    if (GoogleServiceAuthError::IsDeprecated(table[i].error_state))
+  for (GoogleServiceAuthError::State state : table) {
+    if (GoogleServiceAuthError::IsDeprecated(state))
       continue;
-    FakeAuthStatusProvider provider(&error_controller);
-    provider.SetAuthError(kTestAccountId,
-                          GoogleServiceAuthError(table[i].error_state));
 
-    EXPECT_EQ(error_controller.HasError(), table[i].is_error);
+    GoogleServiceAuthError error(state);
 
-    if (table[i].is_error) {
-      EXPECT_EQ(table[i].error_state, error_controller.auth_error().state());
+    if (error.IsTransientError())
+      continue;  // Only persistent errors or non-errors are reported.
+
+    token_service.UpdateAuthErrorForTesting(kTestAccountId, error);
+
+    EXPECT_EQ(error_controller.HasError(), error.IsPersistentError());
+
+    if (error.IsPersistentError()) {
+      EXPECT_EQ(state, error_controller.auth_error().state());
       EXPECT_STREQ(kTestAccountId, error_controller.error_account_id().c_str());
     } else {
       EXPECT_EQ(GoogleServiceAuthError::NONE,
@@ -225,50 +189,27 @@
 
 // Verify that existing error is not replaced by new error.
 TEST(SigninErrorControllerTest, AuthStatusChange) {
+  TestingPrefServiceSimple pref_service;
+  FakeProfileOAuth2TokenService token_service(&pref_service);
+  token_service.UpdateCredentials(kTestAccountId, "token");
+  token_service.UpdateCredentials(kOtherTestAccountId, "token");
   SigninErrorController error_controller(
-      SigninErrorController::AccountMode::ANY_ACCOUNT);
-  std::unique_ptr<FakeAuthStatusProvider> fake_provider0(
-      new FakeAuthStatusProvider(&error_controller));
-  std::unique_ptr<FakeAuthStatusProvider> fake_provider1(
-      new FakeAuthStatusProvider(&error_controller));
+      SigninErrorController::AccountMode::ANY_ACCOUNT, &token_service);
+  ASSERT_FALSE(error_controller.HasError());
 
-  // If there are multiple providers in the provider set...
-  //
-  // | provider0 |       provider1          | ...
-  // |   NONE    | INVALID_GAIA_CREDENTIALS | ...
-  //
-  // SigninErrorController picks the first error found when iterating through
-  // the set. But if another error crops up...
-  //
-  // |     provider0       |       provider1          | ...
-  // |   SERVICE_ERROR     | INVALID_GAIA_CREDENTIALS | ...
-  //
-  // we want the controller to still use the original error.
-
-  // The provider pointers are stored in a set, which is sorted by std::less.
-  std::less<SigninErrorController::AuthStatusProvider*> compare;
-  FakeAuthStatusProvider* provider0 =
-      compare(fake_provider0.get(), fake_provider1.get()) ?
-          fake_provider0.get() : fake_provider1.get();
-  FakeAuthStatusProvider* provider1 =
-      provider0 == fake_provider0.get() ?
-          fake_provider1.get() : fake_provider0.get();
-
-  provider0->SetAuthError(
-      kTestAccountId,
-      GoogleServiceAuthError(
-          GoogleServiceAuthError::NONE));
-  provider1->SetAuthError(
+  // Set an error for kOtherTestAccountId.
+  token_service.UpdateAuthErrorForTesting(
+      kTestAccountId, GoogleServiceAuthError(GoogleServiceAuthError::NONE));
+  token_service.UpdateAuthErrorForTesting(
       kOtherTestAccountId,
-      GoogleServiceAuthError(
-          GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
+      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
   ASSERT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS,
             error_controller.auth_error().state());
   ASSERT_STREQ(kOtherTestAccountId,
                error_controller.error_account_id().c_str());
 
-  // Change the 1st provider's error.
-  provider1->SetAuthError(
+  // Change the error for kOtherTestAccountId.
+  token_service.UpdateAuthErrorForTesting(
       kOtherTestAccountId,
       GoogleServiceAuthError(GoogleServiceAuthError::SERVICE_ERROR));
   ASSERT_EQ(GoogleServiceAuthError::SERVICE_ERROR,
@@ -276,26 +217,26 @@
   ASSERT_STREQ(kOtherTestAccountId,
                error_controller.error_account_id().c_str());
 
-  // Set the 0th provider's error -- nothing should change.
-  provider0->SetAuthError(
-      kTestAccountId,
-      GoogleServiceAuthError(
-          GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE));
+  // Set the error for kTestAccountId -- nothing should change.
+  token_service.UpdateAuthErrorForTesting(
+      kTestAccountId, GoogleServiceAuthError(
+                          GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE));
   ASSERT_EQ(GoogleServiceAuthError::SERVICE_ERROR,
             error_controller.auth_error().state());
   ASSERT_STREQ(kOtherTestAccountId,
                error_controller.error_account_id().c_str());
 
-  // Clear the 1st provider's error, so the 0th provider's error is used.
-  provider1->SetAuthError(
+  // Clear the error for kOtherTestAccountId, so the kTestAccountId's error is
+  // used.
+  token_service.UpdateAuthErrorForTesting(
       kOtherTestAccountId,
-      GoogleServiceAuthError(
-          GoogleServiceAuthError::NONE));
+      GoogleServiceAuthError(GoogleServiceAuthError::NONE));
   ASSERT_EQ(GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE,
             error_controller.auth_error().state());
   ASSERT_STREQ(kTestAccountId, error_controller.error_account_id().c_str());
 
-  fake_provider0.reset();
-  fake_provider1.reset();
+  // Clear the remaining error.
+  token_service.UpdateAuthErrorForTesting(
+      kTestAccountId, GoogleServiceAuthError(GoogleServiceAuthError::NONE));
   ASSERT_FALSE(error_controller.HasError());
 }
diff --git a/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.h b/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.h
index 1f13b5dc..69168d8 100644
--- a/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.h
+++ b/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.h
@@ -8,9 +8,7 @@
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
-#include "base/memory/linked_ptr.h"
 #include "base/threading/thread_checker.h"
-#include "components/signin/core/browser/signin_error_controller.h"
 #include "google_apis/gaia/oauth2_token_service_delegate.h"
 
 class AccountTrackerService;
@@ -22,8 +20,7 @@
   ProfileOAuth2TokenServiceIOSDelegate(
       SigninClient* client,
       std::unique_ptr<ProfileOAuth2TokenServiceIOSProvider> provider,
-      AccountTrackerService* account_tracker_service,
-      SigninErrorController* signin_error_controller);
+      AccountTrackerService* account_tracker_service);
   ~ProfileOAuth2TokenServiceIOSDelegate() override;
 
   OAuth2AccessTokenFetcher* CreateAccessTokenFetcher(
@@ -78,29 +75,13 @@
   FRIEND_TEST_ALL_PREFIXES(ProfileOAuth2TokenServiceIOSDelegateTest,
                            LoadRevokeCredentialsClearsExcludedAccounts);
 
-  class AccountStatus : public SigninErrorController::AuthStatusProvider {
-   public:
-    AccountStatus(SigninErrorController* signin_error_controller,
-                  const std::string& account_id);
-    ~AccountStatus() override;
-
-    void SetLastAuthError(const GoogleServiceAuthError& error);
-
-    // SigninErrorController::AuthStatusProvider implementation.
-    std::string GetAccountId() const override;
-    GoogleServiceAuthError GetAuthStatus() const override;
-
-   private:
-    SigninErrorController* signin_error_controller_;
-    std::string account_id_;
-    GoogleServiceAuthError last_auth_error_;
-
-    DISALLOW_COPY_AND_ASSIGN(AccountStatus);
+  struct AccountStatus {
+    GoogleServiceAuthError last_auth_error;
   };
 
   // Maps the |account_id| of accounts known to ProfileOAuth2TokenService
   // to information about the account.
-  typedef std::map<std::string, linked_ptr<AccountStatus>> AccountStatusMap;
+  typedef std::map<std::string, AccountStatus> AccountStatusMap;
 
   // Clears exclude secondary accounts preferences.
   void ClearExcludedSecondaryAccounts();
@@ -121,9 +102,6 @@
   std::unique_ptr<ProfileOAuth2TokenServiceIOSProvider> provider_;
   AccountTrackerService* account_tracker_service_;
 
-  // The error controller with which this instance was initialized, or NULL.
-  SigninErrorController* signin_error_controller_;
-
   DISALLOW_COPY_AND_ASSIGN(ProfileOAuth2TokenServiceIOSDelegate);
 };
 #endif  // COMPONENTS_SIGNIN_IOS_BROWSER_PROFILE_OAUTH2_TOKEN_SERVICE_IOS_DELEGATE_H_
diff --git a/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.mm b/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.mm
index c27f49c..ad6e03d 100644
--- a/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.mm
+++ b/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.mm
@@ -147,50 +147,16 @@
 
 }  // namespace
 
-ProfileOAuth2TokenServiceIOSDelegate::AccountStatus::AccountStatus(
-    SigninErrorController* signin_error_controller,
-    const std::string& account_id)
-    : signin_error_controller_(signin_error_controller),
-      account_id_(account_id),
-      last_auth_error_(GoogleServiceAuthError::NONE) {
-  DCHECK(signin_error_controller_);
-  DCHECK(!account_id_.empty());
-  signin_error_controller_->AddProvider(this);
-}
-
-ProfileOAuth2TokenServiceIOSDelegate::AccountStatus::~AccountStatus() {
-  signin_error_controller_->RemoveProvider(this);
-}
-
-void ProfileOAuth2TokenServiceIOSDelegate::AccountStatus::SetLastAuthError(
-    const GoogleServiceAuthError& error) {
-    last_auth_error_ = error;
-    signin_error_controller_->AuthStatusChanged();
-}
-
-std::string ProfileOAuth2TokenServiceIOSDelegate::AccountStatus::GetAccountId()
-    const {
-  return account_id_;
-}
-
-GoogleServiceAuthError
-ProfileOAuth2TokenServiceIOSDelegate::AccountStatus::GetAuthStatus() const {
-  return last_auth_error_;
-}
-
 ProfileOAuth2TokenServiceIOSDelegate::ProfileOAuth2TokenServiceIOSDelegate(
     SigninClient* client,
     std::unique_ptr<ProfileOAuth2TokenServiceIOSProvider> provider,
-    AccountTrackerService* account_tracker_service,
-    SigninErrorController* signin_error_controller)
+    AccountTrackerService* account_tracker_service)
     : client_(client),
       provider_(std::move(provider)),
-      account_tracker_service_(account_tracker_service),
-      signin_error_controller_(signin_error_controller) {
+      account_tracker_service_(account_tracker_service) {
   DCHECK(client_);
   DCHECK(provider_);
   DCHECK(account_tracker_service_);
-  DCHECK(signin_error_controller_);
 }
 
 ProfileOAuth2TokenServiceIOSDelegate::~ProfileOAuth2TokenServiceIOSDelegate() {
@@ -333,7 +299,7 @@
     const std::string& account_id) const {
   auto it = accounts_.find(account_id);
   return (it == accounts_.end()) ? GoogleServiceAuthError::AuthErrorNone()
-                                 : it->second->GetAuthStatus();
+                                 : it->second.last_auth_error;
 }
 
 void ProfileOAuth2TokenServiceIOSDelegate::UpdateAuthError(
@@ -352,9 +318,9 @@
     return;
   }
 
-  AccountStatus* status = accounts_[account_id].get();
-  if (error.state() != status->GetAuthStatus().state()) {
-    status->SetLastAuthError(error);
+  AccountStatus* status = &accounts_[account_id];
+  if (error.state() != status->last_auth_error.state()) {
+    status->last_auth_error = error;
     FireAuthErrorChanged(account_id, error);
   }
 }
@@ -370,21 +336,16 @@
   DCHECK(!account_tracker_service_->GetAccountInfo(account_id).email.empty());
 
   bool account_present = accounts_.count(account_id) > 0;
-  if (account_present &&
-      accounts_[account_id]->GetAuthStatus().state() ==
-          GoogleServiceAuthError::NONE) {
+  if (account_present && accounts_[account_id].last_auth_error.state() ==
+                             GoogleServiceAuthError::NONE) {
     // No need to update the account if it is already a known account and if
     // there is no auth error.
     return;
   }
 
-  if (!account_present) {
-    accounts_[account_id].reset(
-        new AccountStatus(signin_error_controller_, account_id));
-    FireAuthErrorChanged(account_id, accounts_[account_id]->GetAuthStatus());
-  }
-
-  UpdateAuthError(account_id, GoogleServiceAuthError::AuthErrorNone());
+  accounts_[account_id].last_auth_error =
+      GoogleServiceAuthError::AuthErrorNone();
+  FireAuthErrorChanged(account_id, GoogleServiceAuthError::AuthErrorNone());
   FireRefreshTokenAvailable(account_id);
 }
 
diff --git a/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm b/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm
index 6af23b4..bfd3e5d 100644
--- a/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm
+++ b/components/signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm
@@ -11,7 +11,6 @@
 #include "components/prefs/testing_pref_service.h"
 #include "components/signin/core/browser/account_tracker_service.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
-#include "components/signin/core/browser/signin_error_controller.h"
 #include "components/signin/core/browser/signin_pref_names.h"
 #include "components/signin/core/browser/test_signin_client.h"
 #include "components/signin/ios/browser/fake_profile_oauth2_token_service_ios_provider.h"
@@ -30,20 +29,16 @@
 class ProfileOAuth2TokenServiceIOSDelegateTest
     : public testing::Test,
       public OAuth2AccessTokenConsumer,
-      public OAuth2TokenService::Observer,
-      public SigninErrorController::Observer {
+      public OAuth2TokenService::Observer {
  public:
   ProfileOAuth2TokenServiceIOSDelegateTest()
       : factory_(NULL),
         client_(&prefs_),
-        signin_error_controller_(
-            SigninErrorController::AccountMode::ANY_ACCOUNT),
         token_available_count_(0),
         token_revoked_count_(0),
         tokens_loaded_count_(0),
         access_token_success_(0),
         access_token_failure_(0),
-        error_changed_count_(0),
         auth_error_changed_count_(0),
         last_access_token_error_(GoogleServiceAuthError::NONE) {}
 
@@ -64,14 +59,11 @@
     factory_.SetFakeResponse(GaiaUrls::GetInstance()->oauth2_revoke_url(), "",
                              net::HTTP_OK, net::URLRequestStatus::SUCCESS);
     oauth2_delegate_.reset(new ProfileOAuth2TokenServiceIOSDelegate(
-        &client_, base::WrapUnique(fake_provider_), &account_tracker_,
-        &signin_error_controller_));
+        &client_, base::WrapUnique(fake_provider_), &account_tracker_));
     oauth2_delegate_->AddObserver(this);
-    signin_error_controller_.AddObserver(this);
   }
 
   void TearDown() override {
-    signin_error_controller_.RemoveObserver(this);
     oauth2_delegate_->RemoveObserver(this);
     oauth2_delegate_->Shutdown();
   }
@@ -100,16 +92,12 @@
     ++auth_error_changed_count_;
   }
 
-  // SigninErrorController::Observer implementation.
-  void OnErrorChanged() override { ++error_changed_count_; }
-
   void ResetObserverCounts() {
     token_available_count_ = 0;
     token_revoked_count_ = 0;
     tokens_loaded_count_ = 0;
     token_available_count_ = 0;
     access_token_failure_ = 0;
-    error_changed_count_ = 0;
     auth_error_changed_count_ = 0;
   }
 
@@ -124,7 +112,6 @@
   TestingPrefServiceSimple prefs_;
   TestSigninClient client_;
   AccountTrackerService account_tracker_;
-  SigninErrorController signin_error_controller_;
   FakeProfileOAuth2TokenServiceIOSProvider* fake_provider_;
   std::unique_ptr<ProfileOAuth2TokenServiceIOSDelegate> oauth2_delegate_;
   TestingOAuth2TokenServiceConsumer consumer_;
@@ -133,7 +120,6 @@
   int tokens_loaded_count_;
   int access_token_success_;
   int access_token_failure_;
-  int error_changed_count_;
   int auth_error_changed_count_;
   GoogleServiceAuthError last_access_token_error_;
 };
@@ -311,13 +297,11 @@
   oauth2_delegate_->UpdateAuthError(GetAccountId(account1), error);
   EXPECT_EQ(error, oauth2_delegate_->GetAuthError("gaia_1"));
   EXPECT_EQ(1, auth_error_changed_count_);
-  EXPECT_EQ(1, error_changed_count_);
 
   oauth2_delegate_->RevokeAllCredentials();
   ResetObserverCounts();
   oauth2_delegate_->UpdateAuthError(GetAccountId(account1), error);
   EXPECT_EQ(0, auth_error_changed_count_);
-  EXPECT_EQ(0, error_changed_count_);
 }
 
 TEST_F(ProfileOAuth2TokenServiceIOSDelegateTest, GetAuthError) {
diff --git a/components/sync/driver/fake_sync_service.cc b/components/sync/driver/fake_sync_service.cc
index 766db94..6d3ba6d 100644
--- a/components/sync/driver/fake_sync_service.cc
+++ b/components/sync/driver/fake_sync_service.cc
@@ -61,9 +61,9 @@
   return false;
 }
 
-void FakeSyncService::OnDataTypeRequestsSyncStartup(ModelType type) {}
+void FakeSyncService::StopAndClear() {}
 
-void FakeSyncService::RequestStop(SyncService::SyncStopDataFate data_fate) {}
+void FakeSyncService::OnDataTypeRequestsSyncStartup(ModelType type) {}
 
 ModelTypeSet FakeSyncService::GetPreferredDataTypes() const {
   return ModelTypeSet();
diff --git a/components/sync/driver/fake_sync_service.h b/components/sync/driver/fake_sync_service.h
index 7cbcd79..551f7a8 100644
--- a/components/sync/driver/fake_sync_service.h
+++ b/components/sync/driver/fake_sync_service.h
@@ -37,7 +37,7 @@
   void RemoveObserver(SyncServiceObserver* observer) override;
   bool HasObserver(const SyncServiceObserver* observer) const override;
   void OnDataTypeRequestsSyncStartup(ModelType type) override;
-  void RequestStop(SyncService::SyncStopDataFate data_fate) override;
+  void StopAndClear() override;
   ModelTypeSet GetPreferredDataTypes() const override;
   std::unique_ptr<SyncSetupInProgressHandle> GetSetupInProgressHandle()
       override;
diff --git a/components/sync/driver/sync_service.h b/components/sync/driver/sync_service.h
index 20daf6b..183a85d0 100644
--- a/components/sync/driver/sync_service.h
+++ b/components/sync/driver/sync_service.h
@@ -253,13 +253,11 @@
   // ACTIONS / STATE CHANGE REQUESTS
   //////////////////////////////////////////////////////////////////////////////
 
-  // Stops sync at the user's request. |data_fate| controls whether the sync
-  // engine should clear its data directory when it shuts down. Generally
-  // KEEP_DATA is used when the user just stops sync, and CLEAR_DATA is used
-  // when they sign out of the profile entirely.
+  // Stops sync and clears all local data. This usually gets called when the
+  // user fully signs out (i.e. removes the primary account).
   // Note: This refers to Sync-the-feature. Sync-the-transport may remain active
   // after calling this.
-  virtual void RequestStop(SyncStopDataFate data_fate) = 0;
+  virtual void StopAndClear() = 0;
 
   // Called when a datatype (SyncableService) has a need for sync to start
   // ASAP, presumably because a local change event has occurred but we're
diff --git a/components/sync/driver/test_sync_service.cc b/components/sync/driver/test_sync_service.cc
index 8b3fa9f..407f264 100644
--- a/components/sync/driver/test_sync_service.cc
+++ b/components/sync/driver/test_sync_service.cc
@@ -144,7 +144,7 @@
   return active_data_types_;
 }
 
-void TestSyncService::RequestStop(SyncService::SyncStopDataFate data_fate) {}
+void TestSyncService::StopAndClear() {}
 
 void TestSyncService::OnDataTypeRequestsSyncStartup(ModelType type) {}
 
diff --git a/components/sync/driver/test_sync_service.h b/components/sync/driver/test_sync_service.h
index d5beaf6..897ed587 100644
--- a/components/sync/driver/test_sync_service.h
+++ b/components/sync/driver/test_sync_service.h
@@ -58,7 +58,7 @@
   ModelTypeSet GetPreferredDataTypes() const override;
   ModelTypeSet GetActiveDataTypes() const override;
 
-  void RequestStop(SyncStopDataFate data_fate) override;
+  void StopAndClear() override;
   void OnDataTypeRequestsSyncStartup(ModelType type) override;
   void TriggerRefresh(const ModelTypeSet& types) override;
   void ReenableDatatype(ModelType type) override;
diff --git a/components/ukm/observers/sync_disable_observer_unittest.cc b/components/ukm/observers/sync_disable_observer_unittest.cc
index f5abd51..b81afa8 100644
--- a/components/ukm/observers/sync_disable_observer_unittest.cc
+++ b/components/ukm/observers/sync_disable_observer_unittest.cc
@@ -9,6 +9,7 @@
 #include "components/sync/driver/test_sync_service.h"
 #include "components/sync/engine/connection_status.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "components/unified_consent/feature.h"
 #include "components/unified_consent/pref_names.h"
 #include "components/unified_consent/scoped_unified_consent.h"
 #include "components/unified_consent/unified_consent_service.h"
@@ -146,7 +147,7 @@
 
 TEST_F(SyncDisableObserverTest, OneEnabled_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
-      UnifiedConsentFeatureState::kEnabledNoBump);
+      UnifiedConsentFeatureState::kEnabled);
   sync_preferences::TestingPrefServiceSyncable prefs;
   RegisterUrlKeyedAnonymizedDataCollectionPref(prefs);
   SetUrlKeyedAnonymizedDataCollectionEnabled(&prefs, true);
@@ -239,7 +240,7 @@
 
 TEST_F(SyncDisableObserverTest, MixedProfiles_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
-      UnifiedConsentFeatureState::kEnabledNoBump);
+      UnifiedConsentFeatureState::kEnabled);
   sync_preferences::TestingPrefServiceSyncable prefs1;
   RegisterUrlKeyedAnonymizedDataCollectionPref(prefs1);
   sync_preferences::TestingPrefServiceSyncable prefs2;
@@ -275,7 +276,7 @@
 
 TEST_F(SyncDisableObserverTest, TwoEnabled_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
-      UnifiedConsentFeatureState::kEnabledNoBump);
+      UnifiedConsentFeatureState::kEnabled);
   sync_preferences::TestingPrefServiceSyncable prefs1;
   RegisterUrlKeyedAnonymizedDataCollectionPref(prefs1);
   sync_preferences::TestingPrefServiceSyncable prefs2;
@@ -315,7 +316,7 @@
 
 TEST_F(SyncDisableObserverTest, OneAddRemove_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
-      UnifiedConsentFeatureState::kEnabledNoBump);
+      UnifiedConsentFeatureState::kEnabled);
   sync_preferences::TestingPrefServiceSyncable prefs;
   RegisterUrlKeyedAnonymizedDataCollectionPref(prefs);
   TestSyncDisableObserver observer;
@@ -356,7 +357,7 @@
 
 TEST_F(SyncDisableObserverTest, PurgeOnDisable_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
-      UnifiedConsentFeatureState::kEnabledNoBump);
+      UnifiedConsentFeatureState::kEnabled);
 
   sync_preferences::TestingPrefServiceSyncable prefs;
   RegisterUrlKeyedAnonymizedDataCollectionPref(prefs);
diff --git a/components/unified_consent/feature.cc b/components/unified_consent/feature.cc
index 19b47f9..7f87d77 100644
--- a/components/unified_consent/feature.cc
+++ b/components/unified_consent/feature.cc
@@ -4,39 +4,14 @@
 
 #include "components/unified_consent/feature.h"
 
-#include "base/feature_list.h"
-#include "base/metrics/field_trial_params.h"
-#include "components/sync/driver/sync_driver_switches.h"
-
 namespace unified_consent {
 
-// base::Feature definitions.
+// base::Feature definition.
 const base::Feature kUnifiedConsent{"UnifiedConsent",
                                     base::FEATURE_DISABLED_BY_DEFAULT};
-const char kUnifiedConsentShowBumpParameter[] = "show_consent_bump";
-const base::Feature kForceUnifiedConsentBump{"ForceUnifiedConsentBump",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
-
-namespace {
-UnifiedConsentFeatureState GetUnifiedConsentFeatureState() {
-  if (!base::FeatureList::IsEnabled(kUnifiedConsent))
-    return UnifiedConsentFeatureState::kDisabled;
-
-  std::string show_bump = base::GetFieldTrialParamValueByFeature(
-      kUnifiedConsent, kUnifiedConsentShowBumpParameter);
-  return show_bump.empty() ? UnifiedConsentFeatureState::kEnabledNoBump
-                           : UnifiedConsentFeatureState::kEnabledWithBump;
-}
-}  // namespace
 
 bool IsUnifiedConsentFeatureEnabled() {
-  return GetUnifiedConsentFeatureState() !=
-         UnifiedConsentFeatureState::kDisabled;
-}
-
-bool IsUnifiedConsentFeatureWithBumpEnabled() {
-  return GetUnifiedConsentFeatureState() ==
-         UnifiedConsentFeatureState::kEnabledWithBump;
+  return base::FeatureList::IsEnabled(kUnifiedConsent);
 }
 
 }  // namespace unified_consent
diff --git a/components/unified_consent/feature.h b/components/unified_consent/feature.h
index 21bd42d..bd59685 100644
--- a/components/unified_consent/feature.h
+++ b/components/unified_consent/feature.h
@@ -9,30 +9,12 @@
 
 namespace unified_consent {
 
-// State of the "Unified Consent" feature.
-enum class UnifiedConsentFeatureState {
-  // Unified consent is disabled.
-  kDisabled,
-  // Unified consent is enabled, but the bump is not shown.
-  kEnabledNoBump,
-  // Unified consent is enabled and the bump is shown.
-  kEnabledWithBump
-};
-
-// Improved and unified consent for privacy-related features.
+// Single consent for Google services in Chrome.
 extern const base::Feature kUnifiedConsent;
-extern const char kUnifiedConsentShowBumpParameter[];
-extern const base::Feature kForceUnifiedConsentBump;
 
-// Returns true if the unified consent feature state is kEnabledNoBump or
-// kEnabledWithBump. Note that the bump may not be enabled, even if this returns
-// true. To check if the bump is enabled, use
-// IsUnifiedConsentFeatureWithBumpEnabled().
+// Returns true if the unified consent feature state is enabled.
 bool IsUnifiedConsentFeatureEnabled();
 
-// Returns true if the unified consent feature state is kEnabledWithBump.
-bool IsUnifiedConsentFeatureWithBumpEnabled();
-
 }  // namespace unified_consent
 
 #endif  // COMPONENTS_UNIFIED_CONSENT_FEATURE_H_
diff --git a/components/unified_consent/feature_unittest.cc b/components/unified_consent/feature_unittest.cc
index 60cc2f7..534e985 100644
--- a/components/unified_consent/feature_unittest.cc
+++ b/components/unified_consent/feature_unittest.cc
@@ -13,26 +13,15 @@
 TEST(UnifiedConsentFeatureTest, FeatureState) {
   // Unified consent is disabled by default.
   EXPECT_FALSE(IsUnifiedConsentFeatureEnabled());
-  EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled());
 
   {
     ScopedUnifiedConsent scoped_disabled(UnifiedConsentFeatureState::kDisabled);
     EXPECT_FALSE(IsUnifiedConsentFeatureEnabled());
-    EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled());
   }
 
   {
-    ScopedUnifiedConsent scoped_no_bump(
-        UnifiedConsentFeatureState::kEnabledNoBump);
+    ScopedUnifiedConsent scoped_enabled(UnifiedConsentFeatureState::kEnabled);
     EXPECT_TRUE(IsUnifiedConsentFeatureEnabled());
-    EXPECT_FALSE(IsUnifiedConsentFeatureWithBumpEnabled());
-  }
-
-  {
-    ScopedUnifiedConsent scoped_bump(
-        UnifiedConsentFeatureState::kEnabledWithBump);
-    EXPECT_TRUE(IsUnifiedConsentFeatureEnabled());
-    EXPECT_TRUE(IsUnifiedConsentFeatureWithBumpEnabled());
   }
 }
 
diff --git a/components/unified_consent/pref_names.cc b/components/unified_consent/pref_names.cc
index 21f394c..e242092 100644
--- a/components/unified_consent/pref_names.cc
+++ b/components/unified_consent/pref_names.cc
@@ -13,11 +13,6 @@
 const char kAllUnifiedConsentServicesWereEnabled[] =
     "unified_consent.all_services_were_enabled";
 
-// Boolean indicating whether all criteria is met for the consent bump to be
-// shown.
-const char kShouldShowUnifiedConsentBump[] =
-    "unified_consent.consent_bump.should_show";
-
 // Integer indicating the migration state of unified consent, defined in
 // unified_consent::MigrationState.
 const char kUnifiedConsentMigrationState[] = "unified_consent.migration_state";
diff --git a/components/unified_consent/pref_names.h b/components/unified_consent/pref_names.h
index c717732..534f9d14b 100644
--- a/components/unified_consent/pref_names.h
+++ b/components/unified_consent/pref_names.h
@@ -9,7 +9,6 @@
 namespace prefs {
 
 extern const char kAllUnifiedConsentServicesWereEnabled[];
-extern const char kShouldShowUnifiedConsentBump[];
 extern const char kUnifiedConsentMigrationState[];
 extern const char kUrlKeyedAnonymizedDataCollectionEnabled[];
 
diff --git a/components/unified_consent/scoped_unified_consent.cc b/components/unified_consent/scoped_unified_consent.cc
index a6076bf..d1eef04 100644
--- a/components/unified_consent/scoped_unified_consent.cc
+++ b/components/unified_consent/scoped_unified_consent.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/logging.h"
+#include "components/unified_consent/feature.h"
 
 namespace unified_consent {
 
@@ -19,16 +20,9 @@
     case UnifiedConsentFeatureState::kDisabled:
       unified_consent_feature_list_.InitAndDisableFeature(kUnifiedConsent);
       break;
-    case UnifiedConsentFeatureState::kEnabledNoBump:
+    case UnifiedConsentFeatureState::kEnabled:
       unified_consent_feature_list_.InitAndEnableFeature(kUnifiedConsent);
       break;
-    case UnifiedConsentFeatureState::kEnabledWithBump: {
-      std::map<std::string, std::string> feature_params;
-      feature_params[kUnifiedConsentShowBumpParameter] = "true";
-      unified_consent_feature_list_.InitAndEnableFeatureWithParameters(
-          kUnifiedConsent, feature_params);
-      break;
-    }
   }
 }
 
diff --git a/components/unified_consent/scoped_unified_consent.h b/components/unified_consent/scoped_unified_consent.h
index b7b4fc1..f4bce38 100644
--- a/components/unified_consent/scoped_unified_consent.h
+++ b/components/unified_consent/scoped_unified_consent.h
@@ -9,10 +9,17 @@
 
 #include "base/macros.h"
 #include "base/test/scoped_feature_list.h"
-#include "components/unified_consent/feature.h"
 
 namespace unified_consent {
 
+// State of the "Unified Consent" feature.
+enum class UnifiedConsentFeatureState {
+  // Unified consent is disabled.
+  kDisabled,
+  // Unified consent is enabled.
+  kEnabled,
+};
+
 // Changes the unified consent feature state while it is in scope. Useful for
 // tests.
 // Also enables the feature |switches::kSyncUserConsentSeparateType| as
diff --git a/components/unified_consent/unified_consent_metrics.cc b/components/unified_consent/unified_consent_metrics.cc
index 0ecc8801..9a76647 100644
--- a/components/unified_consent/unified_consent_metrics.cc
+++ b/components/unified_consent/unified_consent_metrics.cc
@@ -10,9 +10,6 @@
 
 namespace {
 
-// Histogram name for the consent bump action.
-const char kConsentBumpActionMetricName[] = "UnifiedConsent.ConsentBump.Action";
-
 // Histogram recorded at startup to log which Google services are enabled.
 const char kSyncAndGoogleServicesSettingsHistogram[] =
     "UnifiedConsent.SyncAndGoogleServicesSettings";
@@ -23,17 +20,6 @@
 
 namespace metrics {
 
-void RecordConsentBumpMetric(UnifiedConsentBumpAction action) {
-  UMA_HISTOGRAM_ENUMERATION(
-      kConsentBumpActionMetricName, action,
-      UnifiedConsentBumpAction::kUnifiedConsentBumpActionMoreOptionsMax);
-}
-
-void RecordConsentBumpEligibility(bool eligible) {
-  UMA_HISTOGRAM_BOOLEAN("UnifiedConsent.ConsentBump.EligibleAtStartup",
-                        eligible);
-}
-
 void RecordSettingsHistogram(UnifiedConsentServiceClient* service_client,
                              PrefService* pref_service) {
   bool metric_recorded = false;
diff --git a/components/unified_consent/unified_consent_metrics.h b/components/unified_consent/unified_consent_metrics.h
index b0e55a9a8e..aaf73a9 100644
--- a/components/unified_consent/unified_consent_metrics.h
+++ b/components/unified_consent/unified_consent_metrics.h
@@ -11,43 +11,6 @@
 
 namespace metrics {
 
-// Histogram enum: UnifiedConsentBumpAction.
-enum class UnifiedConsentBumpAction : int {
-  kUnifiedConsentBumpActionDefaultOptIn = 0,
-  kUnifiedConsentBumpActionMoreOptionsOptIn,
-  kUnifiedConsentBumpActionMoreOptionsReviewSettings,
-  kUnifiedConsentBumpActionMoreOptionsNoChanges,
-  kUnifiedConsentBumpActionMoreOptionsMax,
-};
-
-// Used in histograms. Do not change existing values, append new values at the
-// end.
-enum class ConsentBumpSuppressReason {
-  // There is no suppress reason. The consent bump was shown.
-  kNone,
-  // The user wasn't signed in during the migration.
-  kNotSignedIn,
-  // The user wasn't syncing everything during the migration.
-  kSyncEverythingOff,
-  // The user didn't have all on-by-default privacy settings enabled during
-  // migration.
-  kPrivacySettingOff,
-  kSettingsOptIn,
-  // The user was eligible for seeing the consent bump, but then signed out.
-  kUserSignedOut,
-  kSyncPaused,
-  // The user was eligible for seeing the consent bump, but turned an individual
-  // sync data type off.
-  kUserTurnedSyncDatatypeOff,
-  // The user was eligible for seeing the consent bump, but turned an
-  // on-by-default privacy setting off.
-  kUserTurnedPrivacySettingOff,
-  // The user has a custom passphrase tied to their sync account.
-  kCustomPassphrase,
-
-  kMaxValue = kCustomPassphrase
-};
-
 // Google services that can be toggled in user settings.
 // Used in histograms. Do not change existing values, append new values at the
 // end.
@@ -63,13 +26,6 @@
   kMaxValue = kAllServicesWereEnabled
 };
 
-// Records histogram action for the unified consent bump.
-void RecordConsentBumpMetric(UnifiedConsentBumpAction action);
-
-// Records whether the user is eligible for the consent bump. This method should
-// be called at startup.
-void RecordConsentBumpEligibility(bool eligible);
-
 // Records settings entries in the kSyncAndGoogleServicesSettingsHistogram.
 // kNone is recorded when none of the settings is enabled.
 void RecordSettingsHistogram(UnifiedConsentServiceClient* service_client,
diff --git a/components/unified_consent/unified_consent_service.cc b/components/unified_consent/unified_consent_service.cc
index ed27965..1ccfff8 100644
--- a/components/unified_consent/unified_consent_service.cc
+++ b/components/unified_consent/unified_consent_service.cc
@@ -37,9 +37,6 @@
   if (GetMigrationState() == MigrationState::kNotInitialized)
     MigrateProfileToUnifiedConsent();
 
-  // Check if this profile is still eligible for the consent bump.
-  CheckConsentBumpEligibility();
-
   identity_manager_->AddObserver(this);
   sync_service_->AddObserver(this);
 }
@@ -54,7 +51,6 @@
   registry->RegisterIntegerPref(
       prefs::kUnifiedConsentMigrationState,
       static_cast<int>(MigrationState::kNotInitialized));
-  registry->RegisterBooleanPref(prefs::kShouldShowUnifiedConsentBump, false);
   registry->RegisterBooleanPref(prefs::kAllUnifiedConsentServicesWereEnabled,
                                 false);
 }
@@ -86,7 +82,6 @@
   // Clear all unified consent prefs.
   user_pref_service->ClearPref(prefs::kUrlKeyedAnonymizedDataCollectionEnabled);
   user_pref_service->ClearPref(prefs::kUnifiedConsentMigrationState);
-  user_pref_service->ClearPref(prefs::kShouldShowUnifiedConsentBump);
   user_pref_service->ClearPref(prefs::kAllUnifiedConsentServicesWereEnabled);
 }
 
@@ -99,10 +94,6 @@
     SetMigrationState(MigrationState::kCompleted);
   }
 
-  if (ShouldShowConsentBump())
-    RecordConsentBumpSuppressReason(
-        metrics::ConsentBumpSuppressReason::kSettingsOptIn);
-
   // Enable all Google services except sync.
   pref_service_->SetBoolean(prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
                             true);
@@ -117,44 +108,6 @@
   pref_service_->SetBoolean(prefs::kAllUnifiedConsentServicesWereEnabled, true);
 }
 
-bool UnifiedConsentService::ShouldShowConsentBump() {
-  if (base::FeatureList::IsEnabled(kForceUnifiedConsentBump) &&
-      identity_manager_->HasPrimaryAccount()) {
-    return true;
-  }
-  return pref_service_->GetBoolean(prefs::kShouldShowUnifiedConsentBump);
-}
-
-void UnifiedConsentService::MarkConsentBumpShown() {
-  // Record suppress reason kNone, which means that it was shown. This also sets
-  // the |kShouldShowConsentBump| pref to false.
-  RecordConsentBumpSuppressReason(metrics::ConsentBumpSuppressReason::kNone);
-}
-
-void UnifiedConsentService::RecordConsentBumpSuppressReason(
-    metrics::ConsentBumpSuppressReason suppress_reason) {
-  UMA_HISTOGRAM_ENUMERATION("UnifiedConsent.ConsentBump.SuppressReason",
-                            suppress_reason);
-
-  switch (suppress_reason) {
-    case metrics::ConsentBumpSuppressReason::kNone:
-    case metrics::ConsentBumpSuppressReason::kNotSignedIn:
-    case metrics::ConsentBumpSuppressReason::kSyncEverythingOff:
-    case metrics::ConsentBumpSuppressReason::kPrivacySettingOff:
-    case metrics::ConsentBumpSuppressReason::kSettingsOptIn:
-    case metrics::ConsentBumpSuppressReason::kUserSignedOut:
-    case metrics::ConsentBumpSuppressReason::kUserTurnedSyncDatatypeOff:
-    case metrics::ConsentBumpSuppressReason::kUserTurnedPrivacySettingOff:
-    case metrics::ConsentBumpSuppressReason::kCustomPassphrase:
-      pref_service_->SetBoolean(prefs::kShouldShowUnifiedConsentBump, false);
-      break;
-    case metrics::ConsentBumpSuppressReason::kSyncPaused:
-      // Consent bump should be shown when sync is active again.
-      DCHECK(ShouldShowConsentBump());
-      break;
-  }
-}
-
 void UnifiedConsentService::Shutdown() {
   identity_manager_->RemoveObserver(this);
   sync_service_->RemoveObserver(this);
@@ -178,10 +131,6 @@
     // When the user signs out, the migration is complete.
     SetMigrationState(MigrationState::kCompleted);
   }
-
-  if (ShouldShowConsentBump())
-    RecordConsentBumpSuppressReason(
-        metrics::ConsentBumpSuppressReason::kUserSignedOut);
 }
 
 void UnifiedConsentService::OnStateChanged(syncer::SyncService* sync) {
@@ -192,14 +141,6 @@
 
   if (GetMigrationState() == MigrationState::kInProgressWaitForSyncInit)
     UpdateSettingsForMigration();
-
-  if (sync_service_->GetUserSettings()->IsUsingSecondaryPassphrase()) {
-    if (ShouldShowConsentBump()) {
-      // Do not show the consent bump when the user has a custom passphrase.
-      RecordConsentBumpSuppressReason(
-          metrics::ConsentBumpSuppressReason::kCustomPassphrase);
-    }
-  }
 }
 
 MigrationState UnifiedConsentService::GetMigrationState() {
@@ -220,25 +161,9 @@
   DCHECK_EQ(GetMigrationState(), MigrationState::kNotInitialized);
 
   if (!identity_manager_->HasPrimaryAccount()) {
-    RecordConsentBumpSuppressReason(
-        metrics::ConsentBumpSuppressReason::kNotSignedIn);
     SetMigrationState(MigrationState::kCompleted);
     return;
   }
-  bool is_syncing_everything =
-      sync_service_->GetUserSettings()->IsSyncEverythingEnabled();
-
-  if (!is_syncing_everything) {
-    RecordConsentBumpSuppressReason(
-        metrics::ConsentBumpSuppressReason::kSyncEverythingOff);
-  } else if (!AreAllOnByDefaultPrivacySettingsOn()) {
-    RecordConsentBumpSuppressReason(
-        metrics::ConsentBumpSuppressReason::kPrivacySettingOff);
-  } else {
-    // When the user was syncing everything, and all on-by-default privacy
-    // settings were on, the consent bump should be shown.
-    pref_service_->SetBoolean(prefs::kShouldShowUnifiedConsentBump, true);
-  }
 
   UpdateSettingsForMigration();
 }
@@ -262,33 +187,4 @@
   SetMigrationState(MigrationState::kCompleted);
 }
 
-bool UnifiedConsentService::AreAllOnByDefaultPrivacySettingsOn() {
-  for (auto service : {Service::kAlternateErrorPages,
-                       Service::kMetricsReporting, Service::kNetworkPrediction,
-                       Service::kSafeBrowsing, Service::kSearchSuggest}) {
-    if (service_client_->GetServiceState(service) == ServiceState::kDisabled)
-      return false;
-  }
-  return true;
-}
-
-void UnifiedConsentService::CheckConsentBumpEligibility() {
-  // Only check eligility if the user was eligible before.
-  if (!ShouldShowConsentBump()) {
-    metrics::RecordConsentBumpEligibility(false);
-    return;
-  }
-
-  if (!sync_service_->GetUserSettings()->GetChosenDataTypes().HasAll(
-          syncer::UserSelectableTypes())) {
-    RecordConsentBumpSuppressReason(
-        metrics::ConsentBumpSuppressReason::kUserTurnedSyncDatatypeOff);
-  } else if (!AreAllOnByDefaultPrivacySettingsOn()) {
-    RecordConsentBumpSuppressReason(
-        metrics::ConsentBumpSuppressReason::kUserTurnedPrivacySettingOff);
-  }
-  metrics::RecordConsentBumpEligibility(
-      pref_service_->GetBoolean(prefs::kShouldShowUnifiedConsentBump));
-}
-
 }  //  namespace unified_consent
diff --git a/components/unified_consent/unified_consent_service.h b/components/unified_consent/unified_consent_service.h
index 9f927c2..018d032f 100644
--- a/components/unified_consent/unified_consent_service.h
+++ b/components/unified_consent/unified_consent_service.h
@@ -65,17 +65,6 @@
   // in this method.
   void EnableGoogleServices();
 
-  // Returns true if all criteria is met to show the consent bump.
-  bool ShouldShowConsentBump();
-  // Marks the consent bump as shown. Any future calls to
-  // |ShouldShowConsentBump| are guaranteed to return false.
-  void MarkConsentBumpShown();
-  // Records the consent bump suppress reason and updates the state whether the
-  // consent bump should be shown. Note: In some cases, e.g. sync paused,
-  // |ShouldShowConsentBump| will still return true.
-  void RecordConsentBumpSuppressReason(
-      metrics::ConsentBumpSuppressReason suppress_reason);
-
   // KeyedService:
   void Shutdown() override;
 
@@ -92,24 +81,13 @@
   // Migration helpers.
   MigrationState GetMigrationState();
   void SetMigrationState(MigrationState migration_state);
-  // Called when the unified consent service is created. This sets the
-  // |kShouldShowUnifiedConsentBump| pref to true if the user is eligible and
-  // calls |UpdateSettingsForMigration| at the end.
+  // Called when the unified consent service is created.
   void MigrateProfileToUnifiedConsent();
   // Updates the settings preferences for the migration when the sync engine is
   // initialized. When it is not, this function will be called again from
   // |OnStateChanged| when the sync engine is initialized.
   void UpdateSettingsForMigration();
 
-  // Checks if all on-by-default non-personalized services are on.
-  bool AreAllOnByDefaultPrivacySettingsOn();
-
-  // This method is called on startup to check the eligibility criteria for
-  // showing the consent bump. The check is only done when the profile was
-  // eligible before. If the user is not eligible anymore, the
-  // kShouldShowUnifiedConsentBump pref is set to false.
-  void CheckConsentBumpEligibility();
-
   std::unique_ptr<UnifiedConsentServiceClient> service_client_;
   PrefService* pref_service_;
   identity::IdentityManager* identity_manager_;
diff --git a/components/unified_consent/unified_consent_service_unittest.cc b/components/unified_consent/unified_consent_service_unittest.cc
index 48454eb..efa4227 100644
--- a/components/unified_consent/unified_consent_service_unittest.cc
+++ b/components/unified_consent/unified_consent_service_unittest.cc
@@ -131,7 +131,7 @@
   void CreateConsentService(bool client_services_on_by_default = false) {
     if (!scoped_unified_consent_) {
       SetUnifiedConsentFeatureState(
-          unified_consent::UnifiedConsentFeatureState::kEnabledWithBump);
+          unified_consent::UnifiedConsentFeatureState::kEnabled);
     }
 
     auto client =
@@ -176,10 +176,6 @@
     return true;
   }
 
-  bool AreAllOnByDefaultPrivacySettingsOn() {
-    return consent_service_->AreAllOnByDefaultPrivacySettingsOn();
-  }
-
   unified_consent::MigrationState GetMigrationState() {
     int migration_state_int =
         pref_service_.GetInteger(prefs::kUnifiedConsentMigrationState);
@@ -232,92 +228,6 @@
   EXPECT_TRUE(AreAllGoogleServicesEnabled());
 }
 
-#if !defined(OS_CHROMEOS)
-TEST_F(UnifiedConsentServiceTest, Migration_SyncingEverythingAndAllServicesOn) {
-  base::HistogramTester histogram_tester;
-
-  // Create inconsistent state.
-  identity_test_environment_.SetPrimaryAccount("testaccount");
-  sync_service_.GetUserSettings()->SetChosenDataTypes(
-      true, syncer::UserSelectableTypes());
-  EXPECT_TRUE(sync_service_.GetUserSettings()->IsSyncEverythingEnabled());
-  sync_service_.SetTransportState(
-      syncer::SyncService::TransportState::INITIALIZING);
-  EXPECT_FALSE(sync_service_.IsSyncFeatureActive());
-
-  CreateConsentService(true /* client_services_on_by_default */);
-  EXPECT_TRUE(AreAllGoogleServicesEnabled());
-  // After the creation of the consent service, the profile started to migrate
-  // (but waiting for sync init) and |ShouldShowConsentBump| should return true.
-  EXPECT_EQ(GetMigrationState(),
-            unified_consent::MigrationState::kInProgressWaitForSyncInit);
-  EXPECT_TRUE(consent_service_->ShouldShowConsentBump());
-
-  // When sync is active, the migration should continue and finish.
-  sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
-  sync_service_.FireStateChanged();
-  base::RunLoop().RunUntilIdle();
-
-  // No metric for the consent bump suppress reason should have been recorded at
-  // this point.
-  histogram_tester.ExpectTotalCount("UnifiedConsent.ConsentBump.SuppressReason",
-                                    0);
-
-  // When the user signs out, the migration state changes to completed and the
-  // consent bump doesn't need to be shown anymore.
-  identity_test_environment_.ClearPrimaryAccount();
-  EXPECT_EQ(GetMigrationState(), unified_consent::MigrationState::kCompleted);
-  EXPECT_FALSE(consent_service_->ShouldShowConsentBump());
-  // A metric for the consent bump suppress reason should have been recorded at
-  // this point.
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.ConsentBump.SuppressReason",
-      metrics::ConsentBumpSuppressReason::kUserSignedOut, 1);
-}
-
-TEST_F(UnifiedConsentServiceTest, Migration_SyncingEverythingAndServicesOff) {
-  base::HistogramTester histogram_tester;
-
-  // Create inconsistent state.
-  identity_test_environment_.SetPrimaryAccount("testaccount");
-  sync_service_.GetUserSettings()->SetChosenDataTypes(
-      true, syncer::UserSelectableTypes());
-  EXPECT_TRUE(sync_service_.GetUserSettings()->IsSyncEverythingEnabled());
-  EXPECT_TRUE(sync_service_.IsSyncFeatureActive());
-
-  CreateConsentService();
-  EXPECT_FALSE(AreAllOnByDefaultPrivacySettingsOn());
-  // After the creation of the consent service, the profile is migrated and
-  // |ShouldShowConsentBump| should return false.
-  EXPECT_EQ(GetMigrationState(), unified_consent::MigrationState::kCompleted);
-  EXPECT_FALSE(consent_service_->ShouldShowConsentBump());
-
-  // A metric for the consent bump suppress reason should have been recorded at
-  // this point.
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.ConsentBump.SuppressReason",
-      metrics::ConsentBumpSuppressReason::kPrivacySettingOff, 1);
-}
-#endif  // !defined(OS_CHROMEOS)
-
-TEST_F(UnifiedConsentServiceTest, Migration_NotSyncingEverything) {
-  base::HistogramTester histogram_tester;
-
-  identity_test_environment_.SetPrimaryAccount("testaccount");
-  sync_service_.GetUserSettings()->SetChosenDataTypes(
-      false, syncer::UserSelectableTypes());
-  EXPECT_FALSE(sync_service_.GetUserSettings()->IsSyncEverythingEnabled());
-
-  CreateConsentService();
-  // When the user is not syncing everything the migration is completed after
-  // the creation of the consent service.
-  EXPECT_EQ(GetMigrationState(), unified_consent::MigrationState::kCompleted);
-  // The suppress reason for not showing the consent bump should be recorded.
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.ConsentBump.SuppressReason",
-      metrics::ConsentBumpSuppressReason::kSyncEverythingOff, 1);
-}
-
 TEST_F(UnifiedConsentServiceTest, Migration_UpdateSettings) {
   // Create user that syncs history and has no custom passphrase.
   identity_test_environment_.SetPrimaryAccount("testaccount");
@@ -377,13 +287,9 @@
   base::HistogramTester histogram_tester;
 
   CreateConsentService();
-  // Since there were not inconsistencies, the migration is completed after the
+  // The user is signed out, so the migration is completed after the
   // creation of the consent service.
   EXPECT_EQ(GetMigrationState(), unified_consent::MigrationState::kCompleted);
-  // The suppress reason for not showing the consent bump should be recorded.
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.ConsentBump.SuppressReason",
-      metrics::ConsentBumpSuppressReason::kNotSignedIn, 1);
 }
 #endif  // !defined(OS_CHROMEOS)
 
@@ -420,143 +326,4 @@
             service_client_->GetServiceState(Service::kContextualSearch));
 }
 
-TEST_F(UnifiedConsentServiceTest, ConsentBump_EligibleOnSecondStartup) {
-  base::HistogramTester histogram_tester;
-
-  identity_test_environment_.SetPrimaryAccount("testaccount");
-  sync_service_.GetUserSettings()->SetChosenDataTypes(
-      true, syncer::UserSelectableTypes());
-  syncer::SyncPrefs sync_prefs(&pref_service_);
-  EXPECT_TRUE(sync_service_.GetUserSettings()->IsSyncEverythingEnabled());
-
-  // First time creation of the service migrates the profile and initializes the
-  // consent bump pref.
-  CreateConsentService(true /* client_services_on_by_default */);
-  EXPECT_TRUE(AreAllGoogleServicesEnabled());
-  EXPECT_TRUE(consent_service_->ShouldShowConsentBump());
-  histogram_tester.ExpectTotalCount("UnifiedConsent.ConsentBump.SuppressReason",
-                                    0);
-  histogram_tester.ExpectUniqueSample(
-      "UnifiedConsent.ConsentBump.EligibleAtStartup", true, 1);
-
-  // Simulate shutdown.
-  consent_service_->Shutdown();
-  consent_service_.reset();
-
-  // After the second startup, the user should still be eligible.
-  CreateConsentService(true /* client_services_on_by_default */);
-  EXPECT_TRUE(AreAllGoogleServicesEnabled());
-  EXPECT_TRUE(consent_service_->ShouldShowConsentBump());
-  histogram_tester.ExpectTotalCount("UnifiedConsent.ConsentBump.SuppressReason",
-                                    0);
-  histogram_tester.ExpectUniqueSample(
-      "UnifiedConsent.ConsentBump.EligibleAtStartup", true, 2);
-}
-
-TEST_F(UnifiedConsentServiceTest,
-       ConsentBump_NotEligibleOnSecondStartup_DisabledSyncDatatype) {
-  base::HistogramTester histogram_tester;
-
-  identity_test_environment_.SetPrimaryAccount("testaccount");
-  sync_service_.GetUserSettings()->SetChosenDataTypes(
-      true, syncer::UserSelectableTypes());
-  syncer::SyncPrefs sync_prefs(&pref_service_);
-  EXPECT_TRUE(sync_service_.GetUserSettings()->IsSyncEverythingEnabled());
-
-  // First time creation of the service migrates the profile and initializes the
-  // consent bump pref.
-  CreateConsentService(true /* client_services_on_by_default */);
-  EXPECT_TRUE(AreAllGoogleServicesEnabled());
-  EXPECT_TRUE(consent_service_->ShouldShowConsentBump());
-  histogram_tester.ExpectTotalCount("UnifiedConsent.ConsentBump.SuppressReason",
-                                    0);
-  histogram_tester.ExpectUniqueSample(
-      "UnifiedConsent.ConsentBump.EligibleAtStartup", true, 1);
-
-  // Simulate shutdown.
-  consent_service_->Shutdown();
-  consent_service_.reset();
-
-  // User disables BOOKMARKS.
-  auto data_types = sync_service_.GetPreferredDataTypes();
-  data_types.RetainAll(syncer::UserSelectableTypes());
-  data_types.Remove(syncer::BOOKMARKS);
-  sync_service_.GetUserSettings()->SetChosenDataTypes(false, data_types);
-
-  // After the second startup, the user should not be eligible anymore.
-  CreateConsentService(true /* client_services_on_by_default */);
-  EXPECT_FALSE(consent_service_->ShouldShowConsentBump());
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.ConsentBump.SuppressReason",
-      metrics::ConsentBumpSuppressReason::kUserTurnedSyncDatatypeOff, 1);
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.ConsentBump.EligibleAtStartup", true, 1);
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.ConsentBump.EligibleAtStartup", false, 1);
-}
-
-TEST_F(UnifiedConsentServiceTest,
-       ConsentBump_NotEligibleOnSecondStartup_DisabledPrivacySetting) {
-  base::HistogramTester histogram_tester;
-
-  identity_test_environment_.SetPrimaryAccount("testaccount");
-  sync_service_.GetUserSettings()->SetChosenDataTypes(
-      true, syncer::UserSelectableTypes());
-  syncer::SyncPrefs sync_prefs(&pref_service_);
-  EXPECT_TRUE(sync_service_.GetUserSettings()->IsSyncEverythingEnabled());
-
-  // First time creation of the service migrates the profile and initializes the
-  // consent bump pref.
-  CreateConsentService(true /* client_services_on_by_default */);
-  EXPECT_TRUE(AreAllGoogleServicesEnabled());
-  EXPECT_TRUE(consent_service_->ShouldShowConsentBump());
-  histogram_tester.ExpectTotalCount("UnifiedConsent.ConsentBump.SuppressReason",
-                                    0);
-  // Simulate shutdown.
-  consent_service_->Shutdown();
-  consent_service_.reset();
-
-  // Disable privacy setting.
-  service_client_->SetServiceEnabled(Service::kSafeBrowsing, false);
-
-  // After the second startup, the user should not be eligible anymore.
-  CreateConsentService(false /* client_services_on_by_default */);
-  EXPECT_FALSE(consent_service_->ShouldShowConsentBump());
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.ConsentBump.SuppressReason",
-      metrics::ConsentBumpSuppressReason::kUserTurnedPrivacySettingOff, 1);
-}
-
-TEST_F(UnifiedConsentServiceTest, ConsentBump_SuppressedWithCustomPassphrase) {
-  base::HistogramTester histogram_tester;
-
-  // Setup sync account with custom passphrase, such that it would be eligible
-  // for the consent bump without custom passphrase.
-  identity_test_environment_.SetPrimaryAccount("testaccount");
-  sync_service_.GetUserSettings()->SetChosenDataTypes(
-      true, syncer::UserSelectableTypes());
-  sync_service_.SetIsUsingSecondaryPassphrase(true);
-  syncer::SyncPrefs sync_prefs(&pref_service_);
-  EXPECT_TRUE(sync_service_.GetUserSettings()->IsSyncEverythingEnabled());
-  sync_service_.SetTransportState(
-      syncer::SyncService::TransportState::INITIALIZING);
-  EXPECT_FALSE(sync_service_.IsEngineInitialized());
-
-  // Before sync is initialized, the user is eligible for seeing the consent
-  // bump.
-  CreateConsentService(true /* client_services_on_by_default */);
-  EXPECT_TRUE(AreAllGoogleServicesEnabled());
-  EXPECT_TRUE(consent_service_->ShouldShowConsentBump());
-
-  // When sync is initialized, it fires the observer in the consent service.
-  // This will suppress the consent bump.
-  sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
-  EXPECT_TRUE(sync_service_.IsEngineInitialized());
-  sync_service_.FireStateChanged();
-  EXPECT_FALSE(consent_service_->ShouldShowConsentBump());
-  histogram_tester.ExpectUniqueSample(
-      "UnifiedConsent.ConsentBump.SuppressReason",
-      metrics::ConsentBumpSuppressReason::kCustomPassphrase, 1);
-}
-
 }  // namespace unified_consent
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc b/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc
index 7624aa1..893ae47a 100644
--- a/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc
+++ b/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc
@@ -67,7 +67,7 @@
 TEST_F(UrlKeyedDataCollectionConsentHelperTest,
        AnonymizedDataCollection_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
-      UnifiedConsentFeatureState::kEnabledNoBump);
+      UnifiedConsentFeatureState::kEnabled);
   std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper =
       UrlKeyedDataCollectionConsentHelper::
           NewAnonymizedDataCollectionConsentHelper(&pref_service_,
@@ -124,7 +124,7 @@
 TEST_F(UrlKeyedDataCollectionConsentHelperTest,
        PersonalizedDataCollection_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
-      UnifiedConsentFeatureState::kEnabledNoBump);
+      UnifiedConsentFeatureState::kEnabled);
   std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper =
       UrlKeyedDataCollectionConsentHelper::
           NewPersonalizedDataCollectionConsentHelper(&sync_service_);
@@ -170,7 +170,7 @@
   }
   {
     ScopedUnifiedConsent scoped_unified_consent(
-        UnifiedConsentFeatureState::kEnabledNoBump);
+        UnifiedConsentFeatureState::kEnabled);
     std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper =
         UrlKeyedDataCollectionConsentHelper::
             NewPersonalizedDataCollectionConsentHelper(
diff --git a/components/viz/service/display_embedder/gpu_display_provider.cc b/components/viz/service/display_embedder/gpu_display_provider.cc
index e9015fa..5ddb3746 100644
--- a/components/viz/service/display_embedder/gpu_display_provider.cc
+++ b/components/viz/service/display_embedder/gpu_display_provider.cc
@@ -65,7 +65,7 @@
 GpuDisplayProvider::GpuDisplayProvider(
     uint32_t restart_id,
     GpuServiceImpl* gpu_service_impl,
-    gpu::CommandBufferTaskExecutor* task_executor,
+    scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
     gpu::GpuChannelManagerDelegate* gpu_channel_manager_delegate,
     std::unique_ptr<gpu::GpuMemoryBufferManager> gpu_memory_buffer_manager,
     gpu::ImageFactory* image_factory,
@@ -74,7 +74,7 @@
     bool wait_for_all_pipeline_stages_before_draw)
     : restart_id_(restart_id),
       gpu_service_impl_(gpu_service_impl),
-      task_executor_(task_executor),
+      task_executor_(std::move(task_executor)),
       gpu_channel_manager_delegate_(gpu_channel_manager_delegate),
       gpu_memory_buffer_manager_(std::move(gpu_memory_buffer_manager)),
       image_factory_(image_factory),
diff --git a/components/viz/service/display_embedder/gpu_display_provider.h b/components/viz/service/display_embedder/gpu_display_provider.h
index c0dee45..e28bca5 100644
--- a/components/viz/service/display_embedder/gpu_display_provider.h
+++ b/components/viz/service/display_embedder/gpu_display_provider.h
@@ -42,7 +42,7 @@
   GpuDisplayProvider(
       uint32_t restart_id,
       GpuServiceImpl* gpu_service_impl,
-      gpu::CommandBufferTaskExecutor* task_executor,
+      scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
       gpu::GpuChannelManagerDelegate* gpu_channel_manager_delegate,
       std::unique_ptr<gpu::GpuMemoryBufferManager> gpu_memory_buffer_manager,
       gpu::ImageFactory* image_factory,
@@ -75,7 +75,7 @@
 
   const uint32_t restart_id_;
   GpuServiceImpl* const gpu_service_impl_;
-  gpu::CommandBufferTaskExecutor* const task_executor_;
+  scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor_;
   gpu::GpuChannelManagerDelegate* const gpu_channel_manager_delegate_;
   std::unique_ptr<gpu::GpuMemoryBufferManager> gpu_memory_buffer_manager_;
   gpu::ImageFactory* const image_factory_;
diff --git a/components/viz/service/display_embedder/viz_process_context_provider.cc b/components/viz/service/display_embedder/viz_process_context_provider.cc
index d46a58e..7da9957f 100644
--- a/components/viz/service/display_embedder/viz_process_context_provider.cc
+++ b/components/viz/service/display_embedder/viz_process_context_provider.cc
@@ -87,7 +87,7 @@
 }  // namespace
 
 VizProcessContextProvider::VizProcessContextProvider(
-    gpu::CommandBufferTaskExecutor* task_executor,
+    scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
     gpu::SurfaceHandle surface_handle,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     gpu::ImageFactory* image_factory,
@@ -95,8 +95,9 @@
     const gpu::SharedMemoryLimits& limits,
     bool requires_alpha_channel)
     : attributes_(CreateAttributes(requires_alpha_channel)) {
-  InitializeContext(task_executor, surface_handle, gpu_memory_buffer_manager,
-                    image_factory, gpu_channel_manager_delegate, limits);
+  InitializeContext(std::move(task_executor), surface_handle,
+                    gpu_memory_buffer_manager, image_factory,
+                    gpu_channel_manager_delegate, limits);
 
   if (context_result_ == gpu::ContextResult::kSuccess) {
     // |gles2_implementation_| is owned here so bind an unretained pointer or
@@ -200,7 +201,7 @@
 }
 
 void VizProcessContextProvider::InitializeContext(
-    gpu::CommandBufferTaskExecutor* task_executor,
+    scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
     gpu::SurfaceHandle surface_handle,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
     gpu::ImageFactory* image_factory,
@@ -209,7 +210,7 @@
   const bool is_offscreen = surface_handle == gpu::kNullSurfaceHandle;
 
   command_buffer_ =
-      std::make_unique<gpu::InProcessCommandBuffer>(task_executor);
+      std::make_unique<gpu::InProcessCommandBuffer>(std::move(task_executor));
   context_result_ = command_buffer_->Initialize(
       /*surface=*/nullptr, is_offscreen, surface_handle, attributes_,
       /*share_command_buffer=*/nullptr, gpu_memory_buffer_manager,
diff --git a/components/viz/service/display_embedder/viz_process_context_provider.h b/components/viz/service/display_embedder/viz_process_context_provider.h
index a9509787..11c9f0d 100644
--- a/components/viz/service/display_embedder/viz_process_context_provider.h
+++ b/components/viz/service/display_embedder/viz_process_context_provider.h
@@ -47,7 +47,7 @@
       public base::trace_event::MemoryDumpProvider {
  public:
   VizProcessContextProvider(
-      gpu::CommandBufferTaskExecutor* task_executor,
+      scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
       gpu::SurfaceHandle surface_handle,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       gpu::ImageFactory* image_factory,
@@ -84,7 +84,7 @@
   ~VizProcessContextProvider() override;
 
   void InitializeContext(
-      gpu::CommandBufferTaskExecutor* task_executor,
+      scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
       gpu::SurfaceHandle surface_handle,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
       gpu::ImageFactory* image_factory,
diff --git a/components/viz/service/main/viz_compositor_thread_runner.cc b/components/viz/service/main/viz_compositor_thread_runner.cc
index 4076c9286..47ecab5 100644
--- a/components/viz/service/main/viz_compositor_thread_runner.cc
+++ b/components/viz/service/main/viz_compositor_thread_runner.cc
@@ -82,7 +82,7 @@
 
 void VizCompositorThreadRunner::CreateFrameSinkManager(
     mojom::FrameSinkManagerParamsPtr params,
-    gpu::CommandBufferTaskExecutor* task_executor,
+    scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
     GpuServiceImpl* gpu_service) {
   // All of the unretained objects are owned on the GPU thread and destroyed
   // after VizCompositorThread has been shutdown.
@@ -90,8 +90,8 @@
       FROM_HERE,
       base::BindOnce(
           &VizCompositorThreadRunner::CreateFrameSinkManagerOnCompositorThread,
-          base::Unretained(this), std::move(params),
-          base::Unretained(task_executor), base::Unretained(gpu_service)));
+          base::Unretained(this), std::move(params), std::move(task_executor),
+          base::Unretained(gpu_service)));
 }
 
 #if defined(USE_VIZ_DEVTOOLS)
@@ -119,7 +119,7 @@
 
 void VizCompositorThreadRunner::CreateFrameSinkManagerOnCompositorThread(
     mojom::FrameSinkManagerParamsPtr params,
-    gpu::CommandBufferTaskExecutor* task_executor,
+    scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
     GpuServiceImpl* gpu_service) {
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK(!frame_sink_manager_);
@@ -143,7 +143,7 @@
             gpu_service->sync_point_manager());
     auto* image_factory = gpu_service->gpu_image_factory();
     display_provider_ = std::make_unique<GpuDisplayProvider>(
-        params->restart_id, gpu_service, task_executor, gpu_service,
+        params->restart_id, gpu_service, std::move(task_executor), gpu_service,
         std::move(gpu_memory_buffer_manager), image_factory,
         server_shared_bitmap_manager_.get(), headless,
         run_all_compositor_stages_before_draw);
diff --git a/components/viz/service/main/viz_compositor_thread_runner.h b/components/viz/service/main/viz_compositor_thread_runner.h
index badfbd5..5f7fc500 100644
--- a/components/viz/service/main/viz_compositor_thread_runner.h
+++ b/components/viz/service/main/viz_compositor_thread_runner.h
@@ -60,9 +60,10 @@
   // version without supports only software compositing. Should be called from
   // the thread that owns |this| to initialize state on VizCompositorThread.
   void CreateFrameSinkManager(mojom::FrameSinkManagerParamsPtr params);
-  void CreateFrameSinkManager(mojom::FrameSinkManagerParamsPtr params,
-                              gpu::CommandBufferTaskExecutor* task_executor,
-                              GpuServiceImpl* gpu_service);
+  void CreateFrameSinkManager(
+      mojom::FrameSinkManagerParamsPtr params,
+      scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
+      GpuServiceImpl* gpu_service);
 
 #if defined(USE_VIZ_DEVTOOLS)
   void CreateVizDevTools(mojom::VizDevToolsParamsPtr params);
@@ -82,7 +83,7 @@
  private:
   void CreateFrameSinkManagerOnCompositorThread(
       mojom::FrameSinkManagerParamsPtr params,
-      gpu::CommandBufferTaskExecutor* task_executor,
+      scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor,
       GpuServiceImpl* gpu_service);
 #if defined(USE_VIZ_DEVTOOLS)
   void CreateVizDevToolsOnCompositorThread(mojom::VizDevToolsParamsPtr params);
diff --git a/components/viz/service/main/viz_main_impl.cc b/components/viz/service/main/viz_main_impl.cc
index 0ed216c..a31ea7dd 100644
--- a/components/viz/service/main/viz_main_impl.cc
+++ b/components/viz/service/main/viz_main_impl.cc
@@ -261,14 +261,14 @@
     DCHECK_EQ(gl::GetGLImplementation(), gl::kGLImplementationDisabled);
   }
 
-  task_executor_ = std::make_unique<gpu::GpuInProcessThreadService>(
+  task_executor_ = base::MakeRefCounted<gpu::GpuInProcessThreadService>(
       gpu_thread_task_runner_, gpu_service_->scheduler(),
       gpu_service_->sync_point_manager(), gpu_service_->mailbox_manager(),
       gpu_service_->share_group(), format, gpu_service_->gpu_feature_info(),
       gpu_service_->gpu_channel_manager()->gpu_preferences());
 
   viz_compositor_thread_runner_->CreateFrameSinkManager(
-      std::move(params), task_executor_.get(), gpu_service_.get());
+      std::move(params), task_executor_, gpu_service_.get());
 }
 
 void VizMainImpl::CreateVizDevTools(mojom::VizDevToolsParamsPtr params) {
diff --git a/components/viz/service/main/viz_main_impl.h b/components/viz/service/main/viz_main_impl.h
index 8c72a1b..02efb3db 100644
--- a/components/viz/service/main/viz_main_impl.h
+++ b/components/viz/service/main/viz_main_impl.h
@@ -146,8 +146,15 @@
 
   // This is created for OOP-D only. It allows the display compositor to use
   // InProcessCommandBuffer to send GPU commands to the GPU thread from the
-  // compositor thread. This must outlive |viz_compositor_thread_runner_|.
-  std::unique_ptr<gpu::CommandBufferTaskExecutor> task_executor_;
+  // compositor thread.
+  // TODO(kylechar): The only reason this member variable exists is so the last
+  // reference is released and the object is destroyed on the GPU thread. This
+  // works because |task_executor_| is destroyed after the VizCompositorThread
+  // has been shutdown. All usage of CommandBufferTaskExecutor has the same
+  // pattern, where the last scoped_refptr is released on the GPU thread after
+  // all InProcessCommandBuffers are destroyed, so the class doesn't need to be
+  // RefCountedThreadSafe.
+  scoped_refptr<gpu::CommandBufferTaskExecutor> task_executor_;
 
   // If the gpu service is not yet ready then we stash pending
   // FrameSinkManagerParams.
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 13bae27..00e4f819e 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -107,7 +107,6 @@
   "+third_party/blink/public/platform/modules/locks/lock_manager.mojom.h",
   "+third_party/blink/public/platform/modules/notifications/web_notification_constants.h",
   "+third_party/blink/public/platform/modules/service_worker/web_service_worker_error.h",
-  "+third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h",
   "+third_party/blink/public/public_buildflags.h",
   "+third_party/blink/public/web/web_ax_enums.h",
   "+third_party/blink/public/web/web_console_message.h",
@@ -135,7 +134,6 @@
   "+third_party/blink/public/platform/modules/background_sync/background_sync.mojom.h",
   "+third_party/blink/public/platform/modules/bluetooth/web_bluetooth.mojom.h",
   "+third_party/blink/public/platform/modules/broadcastchannel/broadcast_channel.mojom.h",
-  "+third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h",
   "+third_party/blink/public/platform/modules/cookie_store/cookie_store.mojom.h",
   "+third_party/blink/public/platform/modules/geolocation/geolocation_service.mojom.h",
   "+third_party/blink/public/platform/modules/installedapp/installed_app_provider.mojom.h",
diff --git a/content/browser/background_fetch/background_fetch_cross_origin_filter_unittest.cc b/content/browser/background_fetch/background_fetch_cross_origin_filter_unittest.cc
index 1681349..99abdca 100644
--- a/content/browser/background_fetch/background_fetch_cross_origin_filter_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_cross_origin_filter_unittest.cc
@@ -12,7 +12,7 @@
 #include "content/common/service_worker/service_worker_types.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
index 5e6926a..de1f7f7 100644
--- a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
@@ -41,9 +41,9 @@
 #include "storage/browser/blob/blob_data_handle.h"
 #include "storage/browser/blob/blob_storage_context.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
 
diff --git a/content/browser/background_fetch/background_fetch_job_controller.cc b/content/browser/background_fetch/background_fetch_job_controller.cc
index c102701..483965d 100644
--- a/content/browser/background_fetch/background_fetch_job_controller.cc
+++ b/content/browser/background_fetch/background_fetch_job_controller.cc
@@ -101,9 +101,6 @@
   completed_downloads_ = completed_downloads;
   total_downloads_ = total_downloads;
 
-  // TODO(nator): Update this when we support uploads.
-  total_downloads_size_ = options_.download_total;
-
   std::vector<std::string> active_guids;
   active_guids.reserve(active_fetch_requests.size());
   for (const auto& request_info : active_fetch_requests)
@@ -112,7 +109,7 @@
   auto fetch_description = std::make_unique<BackgroundFetchDescription>(
       registration_id().unique_id(), options_.title, registration_id().origin(),
       icon_, completed_downloads, total_downloads,
-      complete_requests_downloaded_bytes_cache_, total_downloads_size_,
+      complete_requests_downloaded_bytes_cache_, options_.download_total,
       std::move(active_guids), start_paused);
 
   delegate_proxy_->CreateDownloadJob(GetWeakPtr(), std::move(fetch_description),
@@ -198,7 +195,7 @@
 BackgroundFetchJobController::NewRegistration() const {
   return std::make_unique<BackgroundFetchRegistration>(
       registration_id().developer_id(), registration_id().unique_id(),
-      0 /* upload_total */, 0 /* uploaded */, total_downloads_size_,
+      0 /* upload_total */, 0 /* uploaded */, options_.download_total,
       complete_requests_downloaded_bytes_cache_,
       blink::mojom::BackgroundFetchResult::UNSET, failure_reason_);
 }
diff --git a/content/browser/background_fetch/background_fetch_job_controller.h b/content/browser/background_fetch/background_fetch_job_controller.h
index e48e6f2..0fad34b 100644
--- a/content/browser/background_fetch/background_fetch_job_controller.h
+++ b/content/browser/background_fetch/background_fetch_job_controller.h
@@ -79,18 +79,6 @@
   // created with member fields.
   std::unique_ptr<BackgroundFetchRegistration> NewRegistration() const;
 
-  // Returns the options with which this job is fetching data.
-  const BackgroundFetchOptions& options() const { return options_; }
-
-  // Returns total downloaded bytes.
-  int downloaded() const { return complete_requests_downloaded_bytes_cache_; }
-
-  // Returns total size of downloads, as indicated by the developer.
-  int download_total() const { return total_downloads_size_; }
-
-  // Returns the number of requests that comprise the whole job.
-  int total_downloads() const { return total_downloads_; }
-
   const BackgroundFetchRegistrationId& registration_id() const {
     return registration_id_;
   }
@@ -171,9 +159,6 @@
   // delivering progress events without having to read from the database.
   uint64_t complete_requests_downloaded_bytes_cache_;
 
-  // Total downloads size, as indicated by the developer.
-  int total_downloads_size_ = 0;
-
   // Callback run each time download progress updates.
   ProgressCallback progress_callback_;
 
diff --git a/content/browser/background_fetch/background_fetch_job_controller_unittest.cc b/content/browser/background_fetch/background_fetch_job_controller_unittest.cc
index 54e3683..504292d6 100644
--- a/content/browser/background_fetch/background_fetch_job_controller_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_job_controller_unittest.cc
@@ -31,8 +31,8 @@
 #include "content/public/test/mock_download_manager.h"
 #include "content/public/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 
 using testing::_;
 
diff --git a/content/browser/background_fetch/background_fetch_request_match_params.h b/content/browser/background_fetch/background_fetch_request_match_params.h
index c771e06..3eab4913 100644
--- a/content/browser/background_fetch/background_fetch_request_match_params.h
+++ b/content/browser/background_fetch/background_fetch_request_match_params.h
@@ -7,7 +7,7 @@
 
 #include "base/optional.h"
 #include "content/common/service_worker/service_worker_types.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/background_fetch/background_fetch_scheduler_unittest.cc b/content/browser/background_fetch/background_fetch_scheduler_unittest.cc
index 2a4ce20..b0e83ea 100644
--- a/content/browser/background_fetch/background_fetch_scheduler_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_scheduler_unittest.cc
@@ -19,7 +19,7 @@
 #include "content/public/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 using ::testing::ElementsAre;
 
diff --git a/content/browser/background_fetch/background_fetch_service_impl.cc b/content/browser/background_fetch/background_fetch_service_impl.cc
index 96deec6..f92780e 100644
--- a/content/browser/background_fetch/background_fetch_service_impl.cc
+++ b/content/browser/background_fetch/background_fetch_service_impl.cc
@@ -21,7 +21,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/background_fetch/background_fetch_service_unittest.cc b/content/browser/background_fetch/background_fetch_service_unittest.cc
index 468f3a4..08fbea41 100644
--- a/content/browser/background_fetch/background_fetch_service_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_service_unittest.cc
@@ -32,7 +32,7 @@
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace content {
diff --git a/content/browser/background_fetch/storage/create_metadata_task.cc b/content/browser/background_fetch/storage/create_metadata_task.cc
index 5fe9d52..5dc9d94 100644
--- a/content/browser/background_fetch/storage/create_metadata_task.cc
+++ b/content/browser/background_fetch/storage/create_metadata_task.cc
@@ -21,7 +21,7 @@
 #include "content/common/service_worker/service_worker_type_converter.h"
 #include "content/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/background_fetch/storage/delete_registration_task.h b/content/browser/background_fetch/storage/delete_registration_task.h
index 89195b8..b4b3fe0 100644
--- a/content/browser/background_fetch/storage/delete_registration_task.h
+++ b/content/browser/background_fetch/storage/delete_registration_task.h
@@ -10,7 +10,7 @@
 
 #include "content/browser/background_fetch/storage/database_task.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 #include "url/origin.h"
 
 namespace content {
diff --git a/content/browser/background_fetch/storage/match_requests_task.cc b/content/browser/background_fetch/storage/match_requests_task.cc
index 5b1a400f..821a681 100644
--- a/content/browser/background_fetch/storage/match_requests_task.cc
+++ b/content/browser/background_fetch/storage/match_requests_task.cc
@@ -11,7 +11,7 @@
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/common/service_worker/service_worker_type_converter.h"
 #include "services/network/public/cpp/cors/cors.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index f37ebdb2..d797e30 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -13,6 +13,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/barrier_closure.h"
 #include "base/base64.h"
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -138,9 +139,6 @@
                        base::RetainedRef(this)));
   }
 
- private:
-  friend class base::RefCounted<CorsOriginPatternSetter>;
-
   static std::vector<network::mojom::CorsOriginPatternPtr> ClonePatterns(
       const std::vector<network::mojom::CorsOriginPatternPtr>& patterns) {
     std::vector<network::mojom::CorsOriginPatternPtr> cloned_patterns;
@@ -150,6 +148,9 @@
     return cloned_patterns;
   }
 
+ private:
+  friend class base::RefCounted<CorsOriginPatternSetter>;
+
   ~CorsOriginPatternSetter() { std::move(closure_).Run(); }
 
   const url::Origin source_origin_;
@@ -730,12 +731,21 @@
         ->SetForOrigin(source_origin, std::move(allow_patterns),
                        std::move(block_patterns), std::move(closure));
   } else {
+    auto barrier_closure = BarrierClosure(2, std::move(closure));
     auto setter = base::MakeRefCounted<CorsOriginPatternSetter>(
-        source_origin, std::move(allow_patterns), std::move(block_patterns),
-        std::move(closure));
+        source_origin, CorsOriginPatternSetter::ClonePatterns(allow_patterns),
+        CorsOriginPatternSetter::ClonePatterns(block_patterns),
+        barrier_closure);
     ForEachStoragePartition(
         browser_context, base::BindRepeating(&CorsOriginPatternSetter::SetLists,
                                              base::RetainedRef(setter.get())));
+
+    // Keeps per-profile access lists in the browser process to make all
+    // NetworkContext belonging to the profile to be synchronized.
+    UserDataAdapter<SharedCorsOriginAccessList>::Get(
+        browser_context, kSharedCorsOriginAccessListKey)
+        ->SetForOrigin(source_origin, std::move(allow_patterns),
+                       std::move(block_patterns), barrier_closure);
   }
 }
 
diff --git a/content/browser/browsing_data/clear_site_data_handler.cc b/content/browser/browsing_data/clear_site_data_handler.cc
index c00b371..a292b948 100644
--- a/content/browser/browsing_data/clear_site_data_handler.cc
+++ b/content/browser/browsing_data/clear_site_data_handler.cc
@@ -103,12 +103,13 @@
 
 // static
 void ClearSiteDataHandler::HandleHeader(
+    base::RepeatingCallback<BrowserContext*()> browser_context_getter,
     base::RepeatingCallback<WebContents*()> web_contents_getter,
     const GURL& url,
     const std::string& header_value,
     int load_flags,
     base::OnceClosure callback) {
-  ClearSiteDataHandler handler(std::move(web_contents_getter), url,
+  ClearSiteDataHandler handler(browser_context_getter, web_contents_getter, url,
                                header_value, load_flags, std::move(callback),
                                std::make_unique<ConsoleMessagesDelegate>());
   handler.HandleHeaderAndOutputConsoleMessages();
@@ -127,18 +128,21 @@
 }
 
 ClearSiteDataHandler::ClearSiteDataHandler(
+    base::RepeatingCallback<BrowserContext*()> browser_context_getter,
     base::RepeatingCallback<WebContents*()> web_contents_getter,
     const GURL& url,
     const std::string& header_value,
     int load_flags,
     base::OnceClosure callback,
     std::unique_ptr<ConsoleMessagesDelegate> delegate)
-    : web_contents_getter_(std::move(web_contents_getter)),
+    : browser_context_getter_(browser_context_getter),
+      web_contents_getter_(web_contents_getter),
       url_(url),
       header_value_(header_value),
       load_flags_(load_flags),
       callback_(std::move(callback)),
       delegate_(std::move(delegate)) {
+  DCHECK(browser_context_getter_);
   DCHECK(web_contents_getter_);
   DCHECK(delegate_);
 }
@@ -292,7 +296,7 @@
                                                bool clear_storage,
                                                bool clear_cache,
                                                base::OnceClosure callback) {
-  clear_site_data_utils::ClearSiteData(web_contents_getter_, origin,
+  clear_site_data_utils::ClearSiteData(browser_context_getter_, origin,
                                        clear_cookies, clear_storage,
                                        clear_cache, std::move(callback));
 }
diff --git a/content/browser/browsing_data/clear_site_data_handler.h b/content/browser/browsing_data/clear_site_data_handler.h
index 2a509de..9d836ae 100644
--- a/content/browser/browsing_data/clear_site_data_handler.h
+++ b/content/browser/browsing_data/clear_site_data_handler.h
@@ -20,6 +20,7 @@
 namespace content {
 
 class WebContents;
+class BrowserContext;
 
 // This handler parses the Clear-Site-Data header and executes the clearing
 // of browsing data. The resource load is delayed until the header is parsed
@@ -67,6 +68,7 @@
   // method calls ParseHeader() to parse it, and then ExecuteClearingTask() if
   // applicable.
   static void HandleHeader(
+      base::RepeatingCallback<BrowserContext*()> browser_context_getter,
       base::RepeatingCallback<WebContents*()> web_contents_getter,
       const GURL& url,
       const std::string& header_value,
@@ -83,6 +85,7 @@
 
  protected:
   ClearSiteDataHandler(
+      base::RepeatingCallback<BrowserContext*()> browser_context_getter,
       base::RepeatingCallback<WebContents*()> web_contents_getter,
       const GURL& url,
       const std::string& header_value,
@@ -136,6 +139,7 @@
 
  private:
   // Required to clear the data.
+  base::RepeatingCallback<BrowserContext*()> browser_context_getter_;
   base::RepeatingCallback<WebContents*()> web_contents_getter_;
 
   // Target URL whose data will be cleared.
diff --git a/content/browser/browsing_data/clear_site_data_handler_browsertest.cc b/content/browser/browsing_data/clear_site_data_handler_browsertest.cc
index 051b6ec..2e5f004 100644
--- a/content/browser/browsing_data/clear_site_data_handler_browsertest.cc
+++ b/content/browser/browsing_data/clear_site_data_handler_browsertest.cc
@@ -1005,9 +1005,8 @@
   GURL url = embedded_test_server()->GetURL("127.0.0.1", "/");
   AddQuery(&url, "file", "worker_test.html");
   NavigateToURL(shell(), url);
-  // TODO(crbug.com/898465): Fix and enable expectation for storage deletion.
-  // delegate()->ExpectClearSiteDataCall(url::Origin::Create(url), false, true,
-  // false);
+  delegate()->ExpectClearSiteDataCall(url::Origin::Create(url), false, true,
+                                      false);
   SetClearSiteDataHeader("\"storage\"");
   EXPECT_TRUE(RunScriptAndGetBool("installServiceWorker()"));
   delegate()->VerifyAndClearExpectations();
@@ -1015,7 +1014,7 @@
 }
 
 // Tests that sending Clear-Site-Data during a service worker update
-// doesn't fail. (see crbug.com/898465)
+// removes the service worker. (see crbug.com/898465)
 IN_PROC_BROWSER_TEST_F(ClearSiteDataHandlerBrowserTest,
                        ClearSiteDataDuringServiceWorkerUpdate) {
   GURL url = embedded_test_server()->GetURL("127.0.0.1", "/");
@@ -1025,13 +1024,13 @@
   EXPECT_TRUE(RunScriptAndGetBool("installServiceWorker()"));
   delegate()->VerifyAndClearExpectations();
   // Update the service worker and send C-S-D during update.
+  delegate()->ExpectClearSiteDataCall(url::Origin::Create(url), false, true,
+                                      false);
   SetClearSiteDataHeader("\"storage\"");
-  EXPECT_TRUE(RunScriptAndGetBool("updateServiceWorker()"));
-  // TODO(crbug.com/898465): Fix and enable expectation for storage deletion.
-  // delegate()->ExpectClearSiteDataCall(url::Origin::Create(url), false, true,
-  // false);
+  // Expect the update to fail and the service worker to be removed.
+  EXPECT_FALSE(RunScriptAndGetBool("updateServiceWorker()"));
   delegate()->VerifyAndClearExpectations();
-  EXPECT_TRUE(RunScriptAndGetBool("hasServiceWorker()"));
+  EXPECT_FALSE(RunScriptAndGetBool("hasServiceWorker()"));
 }
 
 }  // namespace content
diff --git a/content/browser/browsing_data/clear_site_data_handler_unittest.cc b/content/browser/browsing_data/clear_site_data_handler_unittest.cc
index c49509e..a9dbe03 100644
--- a/content/browser/browsing_data/clear_site_data_handler_unittest.cc
+++ b/content/browser/browsing_data/clear_site_data_handler_unittest.cc
@@ -36,6 +36,10 @@
 
 const char kClearCookiesHeader[] = "\"cookies\"";
 
+BrowserContext* FakeBrowserContextGetter() {
+  return nullptr;
+}
+
 WebContents* FakeWebContentsGetter() {
   return nullptr;
 }
@@ -44,13 +48,15 @@
 // functionality.
 class TestHandler : public ClearSiteDataHandler {
  public:
-  TestHandler(base::RepeatingCallback<WebContents*()> web_contents_getter,
+  TestHandler(base::RepeatingCallback<BrowserContext*()> browser_context_getter,
+              base::RepeatingCallback<WebContents*()> web_contents_getter,
               const GURL& url,
               const std::string& header_value,
               int load_flags,
               base::OnceClosure callback,
               std::unique_ptr<ConsoleMessagesDelegate> delegate)
-      : ClearSiteDataHandler(std::move(web_contents_getter),
+      : ClearSiteDataHandler(browser_context_getter,
+                             web_contents_getter,
                              url,
                              header_value,
                              load_flags,
@@ -222,7 +228,8 @@
       net::TestURLRequestContext context;
       std::unique_ptr<net::URLRequest> request(context.CreateRequest(
           url, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
-      TestHandler handler(base::BindRepeating(&FakeWebContentsGetter),
+      TestHandler handler(base::BindRepeating(&FakeBrowserContextGetter),
+                          base::BindRepeating(&FakeWebContentsGetter),
                           request->url(), test_case.header,
                           request->load_flags(), base::DoNothing(),
                           std::make_unique<ConsoleMessagesDelegate>());
@@ -292,6 +299,7 @@
                             nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
   std::vector<Message> message_buffer;
   TestHandler handler(
+      base::BindRepeating(&FakeBrowserContextGetter),
       base::BindRepeating(&FakeWebContentsGetter), request->url(),
       kClearCookiesHeader, request->load_flags(), base::DoNothing(),
       std::make_unique<VectorConsoleMessagesDelegate>(&message_buffer));
@@ -317,6 +325,7 @@
   request->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES);
   std::vector<Message> message_buffer;
   TestHandler handler(
+      base::BindRepeating(&FakeBrowserContextGetter),
       base::BindRepeating(&FakeWebContentsGetter), request->url(),
       kClearCookiesHeader, request->load_flags(), base::DoNothing(),
       std::make_unique<VectorConsoleMessagesDelegate>(&message_buffer));
@@ -364,6 +373,7 @@
                               nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
     std::vector<Message> message_buffer;
     TestHandler handler(
+        base::BindRepeating(&FakeBrowserContextGetter),
         base::BindRepeating(&FakeWebContentsGetter), request->url(),
         kClearCookiesHeader, request->load_flags(), base::DoNothing(),
         std::make_unique<VectorConsoleMessagesDelegate>(&message_buffer));
@@ -456,6 +466,7 @@
     // navigation, redirect, or subresource header responses.
     for (size_t i = 0; i < base::size(kTestCases); i++) {
       TestHandler handler(
+          base::BindRepeating(&FakeBrowserContextGetter),
           base::BindRepeating(&FakeWebContentsGetter), GURL(kTestCases[i].url),
           kTestCases[i].header, request->load_flags(), base::DoNothing(),
           std::make_unique<StringConsoleMessagesDelegate>(&output_buffer));
diff --git a/content/browser/browsing_data/clear_site_data_throttle.cc b/content/browser/browsing_data/clear_site_data_throttle.cc
index e5421a4..7fd6575 100644
--- a/content/browser/browsing_data/clear_site_data_throttle.cc
+++ b/content/browser/browsing_data/clear_site_data_throttle.cc
@@ -14,7 +14,9 @@
 #include "base/task/post_task.h"
 #include "base/values.h"
 #include "content/browser/browsing_data/clear_site_data_utils.h"
+#include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/service_worker/service_worker_response_info.h"
+#include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -75,6 +77,21 @@
   base::PostTaskWithTraits(FROM_HERE, {BrowserThread::IO}, std::move(callback));
 }
 
+BrowserContext* GetBrowserContext(
+    int process_id,
+    const ResourceRequestInfo::WebContentsGetter& web_contents_getter) {
+  // TODO(dullweber): Could we always use RenderProcessHost?
+  WebContents* web_contents = web_contents_getter.Run();
+  if (web_contents)
+    return web_contents->GetBrowserContext();
+
+  RenderProcessHost* process_host = RenderProcessHostImpl::FromID(process_id);
+  if (process_host)
+    return process_host->GetBrowserContext();
+
+  return nullptr;
+}
+
 // Outputs a single |formatted_message| on the UI thread.
 void OutputFormattedMessage2(WebContents* web_contents,
                              ConsoleMessageLevel level,
@@ -395,12 +412,13 @@
                                                 bool clear_cache,
                                                 base::OnceClosure callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  auto* request_info = ResourceRequestInfo::ForRequest(request_);
   base::PostTaskWithTraits(
       FROM_HERE, {BrowserThread::UI},
       base::BindOnce(
           &clear_site_data_utils::ClearSiteData,
-          ResourceRequestInfo::ForRequest(request_)
-              ->GetWebContentsGetterForRequest(),
+          base::BindRepeating(&GetBrowserContext, request_info->GetChildID(),
+                              request_info->GetWebContentsGetterForRequest()),
           origin, clear_cookies, clear_storage, clear_cache,
           base::BindOnce(&JumpFromUIToIOThread, std::move(callback))));
 }
diff --git a/content/browser/browsing_data/clear_site_data_utils.cc b/content/browser/browsing_data/clear_site_data_utils.cc
index d10b4d9..431925a 100644
--- a/content/browser/browsing_data/clear_site_data_utils.cc
+++ b/content/browser/browsing_data/clear_site_data_utils.cc
@@ -127,22 +127,21 @@
 }  // namespace
 
 void ClearSiteData(
-    const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
+    const base::RepeatingCallback<BrowserContext*()>& browser_context_getter,
     const url::Origin& origin,
     bool clear_cookies,
     bool clear_storage,
     bool clear_cache,
     base::OnceClosure callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  WebContents* web_contents = web_contents_getter.Run();
-  // TODO(crbug.com/898465): Fix Clear-Site-Data for requests without
-  // WebContents. (E.g. service worker updates)
-  if (!web_contents) {
+  BrowserContext* browser_context = browser_context_getter.Run();
+  if (!browser_context) {
     std::move(callback).Run();
     return;
   }
-  (new SiteDataClearer(web_contents->GetBrowserContext(), origin, clear_cookies,
-                       clear_storage, clear_cache, std::move(callback)))
+  (new SiteDataClearer(browser_context, origin, clear_cookies, clear_storage,
+                       clear_cache, std::move(callback)))
+
       ->RunAndDestroySelfWhenDone();
 }
 
diff --git a/content/browser/browsing_data/clear_site_data_utils.h b/content/browser/browsing_data/clear_site_data_utils.h
index 8f7eef7..3cb07f4 100644
--- a/content/browser/browsing_data/clear_site_data_utils.h
+++ b/content/browser/browsing_data/clear_site_data_utils.h
@@ -6,13 +6,13 @@
 #define CONTENT_BROWSER_BROWSING_DATA_CLEAR_SITE_DATA_UTILS_H_
 
 #include "base/callback_forward.h"
-#include "content/public/browser/resource_request_info.h"
 
 namespace url {
 class Origin;
 }
 
 namespace content {
+class BrowserContext;
 namespace clear_site_data_utils {
 
 // Removes browsing data associated with |origin| when the Clear-Site-Data
@@ -21,7 +21,7 @@
 // thread when done.
 // TODO(dullweber): Consider merging back when network service is shipped.
 void ClearSiteData(
-    const ResourceRequestInfo::WebContentsGetter& web_contents_getter,
+    const base::RepeatingCallback<BrowserContext*()>& browser_context_getter,
     const url::Origin& origin,
     bool clear_cookies,
     bool clear_storage,
diff --git a/content/browser/cache_storage/cache_storage.h b/content/browser/cache_storage/cache_storage.h
index 863e5cf..fb301325 100644
--- a/content/browser/cache_storage/cache_storage.h
+++ b/content/browser/cache_storage/cache_storage.h
@@ -20,7 +20,7 @@
 #include "base/memory/weak_ptr.h"
 #include "content/browser/cache_storage/cache_storage_cache.h"
 #include "content/browser/cache_storage/cache_storage_cache_observer.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 #include "url/origin.h"
 
 namespace base {
diff --git a/content/browser/cache_storage/cache_storage_cache.h b/content/browser/cache_storage/cache_storage_cache.h
index a7b4e7c..a8cb56f 100644
--- a/content/browser/cache_storage/cache_storage_cache.h
+++ b/content/browser/cache_storage/cache_storage_cache.h
@@ -21,8 +21,8 @@
 #include "content/common/service_worker/service_worker_types.h"
 #include "net/base/io_buffer.h"
 #include "net/disk_cache/disk_cache.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 #include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
 #include "url/origin.h"
 
 namespace crypto {
diff --git a/content/browser/cache_storage/cache_storage_cache_entry_handler.h b/content/browser/cache_storage/cache_storage_cache_entry_handler.h
index 8922028..f1eae81 100644
--- a/content/browser/cache_storage/cache_storage_cache_entry_handler.h
+++ b/content/browser/cache_storage/cache_storage_cache_entry_handler.h
@@ -14,7 +14,7 @@
 #include "content/common/content_export.h"
 #include "net/disk_cache/disk_cache.h"
 #include "storage/browser/blob/blob_data_builder.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 
 namespace storage {
 class BlobStorageContext;
diff --git a/content/browser/cache_storage/cache_storage_cache_unittest.cc b/content/browser/cache_storage/cache_storage_cache_unittest.cc
index b378f2d..dc016b67 100644
--- a/content/browser/cache_storage/cache_storage_cache_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_cache_unittest.cc
@@ -52,7 +52,7 @@
 #include "storage/browser/test/mock_special_storage_policy.h"
 #include "storage/common/blob_storage/blob_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "url/origin.h"
 
 using blink::mojom::CacheStorageError;
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.cc b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
index dc21e33..7c24ef4 100644
--- a/content/browser/cache_storage/cache_storage_dispatcher_host.cc
+++ b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
@@ -29,8 +29,8 @@
 #include "content/public/common/origin_util.h"
 #include "content/public/common/referrer_type_converters.h"
 #include "mojo/public/cpp/bindings/message.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.h b/content/browser/cache_storage/cache_storage_dispatcher_host.h
index 4e72d5e..2cd443f1a 100644
--- a/content/browser/cache_storage/cache_storage_dispatcher_host.h
+++ b/content/browser/cache_storage/cache_storage_dispatcher_host.h
@@ -20,7 +20,7 @@
 #include "mojo/public/cpp/bindings/associated_binding_set.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding_set.h"
 #include "mojo/public/cpp/bindings/strong_binding_set.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace url {
 class Origin;
diff --git a/content/browser/cache_storage/cache_storage_histogram_utils.h b/content/browser/cache_storage/cache_storage_histogram_utils.h
index 80380db..43db7774 100644
--- a/content/browser/cache_storage/cache_storage_histogram_utils.h
+++ b/content/browser/cache_storage/cache_storage_histogram_utils.h
@@ -7,7 +7,7 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "content/browser/cache_storage/cache_storage_scheduler_types.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc
index 1171be3c..f187862 100644
--- a/content/browser/cache_storage/cache_storage_manager_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -56,8 +56,8 @@
 #include "storage/browser/test/mock_special_storage_policy.h"
 #include "storage/common/blob_storage/blob_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "url/origin.h"
 
 using blink::mojom::CacheStorageError;
diff --git a/content/browser/cookie_store/cookie_store_manager_unittest.cc b/content/browser/cookie_store/cookie_store_manager_unittest.cc
index 423c034..e9cf653 100644
--- a/content/browser/cookie_store/cookie_store_manager_unittest.cc
+++ b/content/browser/cookie_store/cookie_store_manager_unittest.cc
@@ -117,7 +117,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index 18b0397..991a10dd 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -182,6 +182,55 @@
   }
 }
 
+// static
+void RenderFrameDevToolsAgentHost::UpdateRawHeadersAccess(
+    RenderFrameHostImpl* old_rfh,
+    RenderFrameHostImpl* new_rfh) {
+  DCHECK_NE(old_rfh, new_rfh);
+  RenderProcessHost* old_rph = old_rfh ? old_rfh->GetProcess() : nullptr;
+  RenderProcessHost* new_rph = new_rfh ? new_rfh->GetProcess() : nullptr;
+  if (old_rph == new_rph)
+    return;
+  std::set<url::Origin> old_process_origins;
+  std::set<url::Origin> new_process_origins;
+  for (const auto& entry : g_agent_host_instances.Get()) {
+    RenderFrameHostImpl* frame_host = entry.second->frame_host_;
+    if (!frame_host)
+      continue;
+    // Do not skip the nodes if they're about to get attached.
+    if (!entry.second->IsAttached() &&
+        (!new_rfh || entry.first != new_rfh->frame_tree_node())) {
+      continue;
+    }
+    RenderProcessHost* process_host = frame_host->GetProcess();
+    if (process_host == old_rph)
+      old_process_origins.insert(frame_host->GetLastCommittedOrigin());
+    else if (process_host == new_rph)
+      new_process_origins.insert(frame_host->GetLastCommittedOrigin());
+  }
+  if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+    if (old_rph && old_process_origins.empty()) {
+      ChildProcessSecurityPolicyImpl::GetInstance()->RevokeReadRawCookies(
+          old_rph->GetID());
+    }
+    if (new_rph && !new_process_origins.empty()) {
+      ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies(
+          new_rph->GetID());
+    }
+    return;
+  }
+  if (old_rph) {
+    GetNetworkService()->SetRawHeadersAccess(
+        old_rph->GetID(), std::vector<url::Origin>(old_process_origins.begin(),
+                                                   old_process_origins.end()));
+  }
+  if (new_rph) {
+    GetNetworkService()->SetRawHeadersAccess(
+        new_rph->GetID(), std::vector<url::Origin>(new_process_origins.begin(),
+                                                   new_process_origins.end()));
+  }
+}
+
 RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost(
     FrameTreeNode* frame_tree_node)
     : DevToolsAgentHostImpl(frame_tree_node->devtools_frame_token().ToString()),
@@ -266,7 +315,7 @@
     // DevToolsFrameTraceRecorder. Taking snapshots happens in TracingHandler.
     if (!use_video_capture_api)
       frame_trace_recorder_.reset(new DevToolsFrameTraceRecorder());
-    GrantPolicy();
+    UpdateRawHeadersAccess(nullptr, frame_host_);
 #if defined(OS_ANDROID)
     GetWakeLock()->RequestWakeLock();
 #endif
@@ -278,7 +327,7 @@
   // Destroying session automatically detaches in renderer.
   if (sessions().empty()) {
     frame_trace_recorder_.reset();
-    RevokePolicy();
+    UpdateRawHeadersAccess(frame_host_, nullptr);
 #if defined(OS_ANDROID)
     GetWakeLock()->CancelWakeLock();
 #endif
@@ -371,10 +420,10 @@
     return;
   }
 
-  if (IsAttached())
-    RevokePolicy();
-
+  RenderFrameHostImpl* old_host = frame_host_;
   frame_host_ = frame_host;
+  if (IsAttached())
+    UpdateRawHeadersAccess(old_host, frame_host);
 
   std::vector<DevToolsSession*> restricted_sessions;
   for (DevToolsSession* session : sessions()) {
@@ -390,46 +439,9 @@
       inspector->TargetReloadedAfterCrash();
   }
 
-  if (IsAttached())
-    GrantPolicy();
   UpdateRendererChannel(IsAttached());
 }
 
-void RenderFrameDevToolsAgentHost::GrantPolicy() {
-  if (!frame_host_)
-    return;
-  uint32_t process_id = frame_host_->GetProcess()->GetID();
-  if (base::FeatureList::IsEnabled(network::features::kNetworkService))
-    GetNetworkService()->SetRawHeadersAccess(process_id, true);
-  ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadRawCookies(
-      process_id);
-}
-
-void RenderFrameDevToolsAgentHost::RevokePolicy() {
-  if (!frame_host_)
-    return;
-
-  bool process_has_agents = false;
-  RenderProcessHost* process_host = frame_host_->GetProcess();
-  for (const auto& ftn_agent : g_agent_host_instances.Get()) {
-    RenderFrameDevToolsAgentHost* agent = ftn_agent.second;
-    if (!agent->IsAttached())
-      continue;
-    if (agent->frame_host_ && agent->frame_host_ != frame_host_ &&
-        agent->frame_host_->GetProcess() == process_host) {
-      process_has_agents = true;
-    }
-  }
-
-  // We are the last to disconnect from the renderer -> revoke permissions.
-  if (!process_has_agents) {
-    if (base::FeatureList::IsEnabled(network::features::kNetworkService))
-      GetNetworkService()->SetRawHeadersAccess(process_host->GetID(), false);
-    ChildProcessSecurityPolicyImpl::GetInstance()->RevokeReadRawCookies(
-        process_host->GetID());
-  }
-}
-
 void RenderFrameDevToolsAgentHost::DidStartNavigation(
     NavigationHandle* navigation_handle) {
   NavigationHandleImpl* handle =
@@ -472,9 +484,10 @@
 
 void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() {
   scoped_refptr<RenderFrameDevToolsAgentHost> protect(this);
-  if (IsAttached())
-    RevokePolicy();
-  ForceDetachAllSessions();
+  if (IsAttached()) {
+    ForceDetachAllSessions();
+    UpdateRawHeadersAccess(frame_host_, nullptr);
+  }
   frame_host_ = nullptr;
   UpdateRendererChannel(IsAttached());
   SetFrameTreeNode(nullptr);
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.h b/content/browser/devtools/render_frame_devtools_agent_host.h
index 40a1dce..a2281d7 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.h
+++ b/content/browser/devtools/render_frame_devtools_agent_host.h
@@ -90,6 +90,10 @@
 
  private:
   friend class DevToolsAgentHost;
+
+  static void UpdateRawHeadersAccess(RenderFrameHostImpl* old_rfh,
+                                     RenderFrameHostImpl* new_rfh);
+
   explicit RenderFrameDevToolsAgentHost(FrameTreeNode*);
   ~RenderFrameDevToolsAgentHost() override;
 
@@ -118,8 +122,6 @@
   void OnSwapCompositorFrame(const IPC::Message& message);
   void DestroyOnRenderFrameGone();
   void UpdateFrameHost(RenderFrameHostImpl* frame_host);
-  void GrantPolicy();
-  void RevokePolicy();
   void SetFrameTreeNode(FrameTreeNode* frame_tree_node);
 
   bool ShouldAllowSession(DevToolsSession* session);
diff --git a/content/browser/frame_host/mixed_content_navigation_throttle.cc b/content/browser/frame_host/mixed_content_navigation_throttle.cc
index ea6fff1..b891a611 100644
--- a/content/browser/frame_host/mixed_content_navigation_throttle.cc
+++ b/content/browser/frame_host/mixed_content_navigation_throttle.cc
@@ -19,7 +19,7 @@
 #include "content/public/common/origin_util.h"
 #include "content/public/common/web_preferences.h"
 #include "net/base/url_util.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 #include "url/url_constants.h"
diff --git a/content/browser/frame_host/mixed_content_navigation_throttle.h b/content/browser/frame_host/mixed_content_navigation_throttle.h
index 152ce97..9d91405 100644
--- a/content/browser/frame_host/mixed_content_navigation_throttle.h
+++ b/content/browser/frame_host/mixed_content_navigation_throttle.h
@@ -12,7 +12,7 @@
 #include "content/common/content_export.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/navigation_throttle.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_mixed_content_context_type.h"
 
 namespace content {
diff --git a/content/browser/frame_host/navigation_handle_impl.h b/content/browser/frame_host/navigation_handle_impl.h
index 1b5ce13..2941010 100644
--- a/content/browser/frame_host/navigation_handle_impl.h
+++ b/content/browser/frame_host/navigation_handle_impl.h
@@ -28,7 +28,7 @@
 #include "content/public/browser/navigation_throttle.h"
 #include "content/public/browser/navigation_type.h"
 #include "content/public/browser/restore_type.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_mixed_content_context_type.h"
 #include "url/gurl.h"
 
diff --git a/content/browser/frame_host/navigation_handle_impl_browsertest.cc b/content/browser/frame_host/navigation_handle_impl_browsertest.cc
index d01131c..8e4710d3 100644
--- a/content/browser/frame_host/navigation_handle_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_handle_impl_browsertest.cc
@@ -36,7 +36,7 @@
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/url_request/url_request_failed_job.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "ui/base/page_transition_types.h"
 #include "url/url_constants.h"
 
diff --git a/content/browser/frame_host/navigation_handle_impl_unittest.cc b/content/browser/frame_host/navigation_handle_impl_unittest.cc
index 2b41a42..277f4788 100644
--- a/content/browser/frame_host/navigation_handle_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_handle_impl_unittest.cc
@@ -14,7 +14,7 @@
 #include "content/test/test_render_frame_host.h"
 #include "content/test/test_web_contents.h"
 #include "net/ssl/ssl_connection_status_flags.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index e7ca131..0e9457d2 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -72,7 +72,7 @@
 #include "services/network/public/cpp/url_loader_completion_status.h"
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
 #include "third_party/blink/public/common/service_worker/service_worker_utils.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/resource_request_blocked_reason.h"
 #include "third_party/blink/public/platform/web_mixed_content_context_type.h"
 #include "url/url_constants.h"
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index cd6c865..c7ab636 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -4565,7 +4565,7 @@
                        common_params.should_replace_current_entry));
   } else {
     // Pass the controller service worker info if we have one.
-    mojom::ControllerServiceWorkerInfoPtr controller;
+    blink::mojom::ControllerServiceWorkerInfoPtr controller;
     blink::mojom::ServiceWorkerObjectAssociatedPtrInfo remote_object;
     blink::mojom::ServiceWorkerState sent_state;
     if (subresource_loader_params &&
diff --git a/content/browser/loader/mime_sniffing_resource_handler.h b/content/browser/loader/mime_sniffing_resource_handler.h
index 8e85dba3..350576d 100644
--- a/content/browser/loader/mime_sniffing_resource_handler.h
+++ b/content/browser/loader/mime_sniffing_resource_handler.h
@@ -15,7 +15,7 @@
 #include "content/browser/loader/resource_controller.h"
 #include "content/common/content_export.h"
 #include "ppapi/buildflags/buildflags.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace net {
 class URLRequest;
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index 686e303..3bf7b678 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -1202,7 +1202,7 @@
         DCHECK(!blink::ServiceWorkerUtils::IsServicificationEnabled());
         subresource_loader_params_ = SubresourceLoaderParams();
         subresource_loader_params_->controller_service_worker_info =
-            mojom::ControllerServiceWorkerInfo::New();
+            blink::mojom::ControllerServiceWorkerInfo::New();
         subresource_loader_params_->controller_service_worker_info->mode =
             sw_provider_host->GetControllerMode();
         base::WeakPtr<ServiceWorkerObjectHost> sw_object_host =
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc
index a4552b6..5f254e8c 100644
--- a/content/browser/loader/navigation_url_loader_impl_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -91,8 +91,8 @@
         base::BindOnce(&TestNavigationLoaderInterceptor::DeleteURLLoader,
                        base::Unretained(this)),
         std::move(request), 0 /* options */, resource_request,
-        false /* report_raw_headers */, std::move(client),
-        TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0, /* request_id */
+        std::move(client), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
+        0, /* request_id */
         resource_scheduler_client_, nullptr,
         nullptr /* network_usage_accumulator */, nullptr /* header_client */);
   }
diff --git a/content/browser/loader/resource_dispatcher_host_impl.h b/content/browser/loader/resource_dispatcher_host_impl.h
index 7a1b183..38978d7 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.h
+++ b/content/browser/loader/resource_dispatcher_host_impl.h
@@ -43,7 +43,7 @@
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/keepalive_statistics_recorder.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "url/gurl.h"
 
 namespace base {
diff --git a/content/browser/loader/resource_message_filter.cc b/content/browser/loader/resource_message_filter.cc
index 482c2c9..d873292 100644
--- a/content/browser/loader/resource_message_filter.cc
+++ b/content/browser/loader/resource_message_filter.cc
@@ -21,6 +21,7 @@
 #include "content/public/browser/shared_cors_origin_access_list.h"
 #include "content/public/common/content_switches.h"
 #include "services/network/cors/cors_url_loader_factory.h"
+#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "storage/browser/fileapi/file_system_context.h"
 
@@ -181,14 +182,21 @@
   // The WeakPtr of the filter must be created on the IO thread. So sets the
   // WeakPtr of |requester_info_| now.
   requester_info_->set_filter(GetWeakPtr());
-  url_loader_factory_ = std::make_unique<network::cors::CorsURLLoaderFactory>(
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kDisableWebSecurity),
-      std::make_unique<URLLoaderFactoryImpl>(requester_info_),
-      base::BindRepeating(&ResourceDispatcherHostImpl::CancelRequest,
-                          base::Unretained(ResourceDispatcherHostImpl::Get()),
-                          requester_info_->child_id()),
-      &shared_cors_origin_access_list_->GetOriginAccessList());
+  if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+    // ResourceMessageFilter should not be used if NetworkService is enabled,
+    // but still some tests rely on it.
+    url_loader_factory_ =
+        std::make_unique<URLLoaderFactoryImpl>(requester_info_);
+  } else {
+    url_loader_factory_ = std::make_unique<network::cors::CorsURLLoaderFactory>(
+        base::CommandLine::ForCurrentProcess()->HasSwitch(
+            switches::kDisableWebSecurity),
+        std::make_unique<URLLoaderFactoryImpl>(requester_info_),
+        base::BindRepeating(&ResourceDispatcherHostImpl::CancelRequest,
+                            base::Unretained(ResourceDispatcherHostImpl::Get()),
+                            requester_info_->child_id()),
+        &shared_cors_origin_access_list_->GetOriginAccessList());
+  }
 
   std::vector<network::mojom::URLLoaderFactoryRequest> requests =
       std::move(queued_clone_requests_);
diff --git a/content/browser/loader/shared_cors_origin_access_list_impl.cc b/content/browser/loader/shared_cors_origin_access_list_impl.cc
index dce98468..b7bb68d 100644
--- a/content/browser/loader/shared_cors_origin_access_list_impl.cc
+++ b/content/browser/loader/shared_cors_origin_access_list_impl.cc
@@ -22,18 +22,26 @@
     std::vector<network::mojom::CorsOriginPatternPtr> block_patterns,
     base::OnceClosure closure) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
-  base::PostTaskWithTraitsAndReply(
-      FROM_HERE, {BrowserThread::IO},
-      base::BindOnce(&SharedCorsOriginAccessListImpl::SetForOriginOnIOThread,
-                     base::RetainedRef(this), source_origin,
-                     std::move(allow_patterns), std::move(block_patterns)),
-      std::move(closure));
+  if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+    origin_access_list_.SetAllowListForOrigin(source_origin, allow_patterns);
+    origin_access_list_.SetBlockListForOrigin(source_origin, block_patterns);
+    std::move(closure).Run();
+  } else {
+    base::PostTaskWithTraitsAndReply(
+        FROM_HERE, {BrowserThread::IO},
+        base::BindOnce(&SharedCorsOriginAccessListImpl::SetForOriginOnIOThread,
+                       base::RetainedRef(this), source_origin,
+                       std::move(allow_patterns), std::move(block_patterns)),
+        std::move(closure));
+  }
 }
 
 const network::cors::OriginAccessList&
 SharedCorsOriginAccessListImpl::GetOriginAccessList() const {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (base::FeatureList::IsEnabled(network::features::kNetworkService))
+    DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  else
+    DCHECK_CURRENTLY_ON(BrowserThread::IO);
   return origin_access_list_;
 }
 
@@ -44,6 +52,7 @@
     std::vector<network::mojom::CorsOriginPatternPtr> allow_patterns,
     std::vector<network::mojom::CorsOriginPatternPtr> block_patterns) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
   origin_access_list_.SetAllowListForOrigin(source_origin, allow_patterns);
   origin_access_list_.SetBlockListForOrigin(source_origin, block_patterns);
 }
diff --git a/content/browser/network_service_client.cc b/content/browser/network_service_client.cc
index 28d1de8..1af94fd 100644
--- a/content/browser/network_service_client.cc
+++ b/content/browser/network_service_client.cc
@@ -319,6 +319,27 @@
   return WebContentsGetterRegistry::GetInstance()->Get(window_id);
 }
 
+WebContents* GetWebContents(int process_id, int routing_id) {
+  if (process_id != network::mojom::kBrowserProcessId) {
+    return WebContentsImpl::FromRenderFrameHostID(process_id, routing_id);
+  }
+  return WebContents::FromFrameTreeNodeId(routing_id);
+}
+
+BrowserContext* GetBrowserContext(int process_id, int routing_id) {
+  WebContents* web_contents = GetWebContents(process_id, routing_id);
+  if (web_contents)
+    return web_contents->GetBrowserContext();
+  // Some requests such as service worker updates are not associated with
+  // a WebContents so we can't use it to obtain the BrowserContext.
+  // TODO(dullweber): Could we always use RenderProcessHost?
+  RenderProcessHost* process_host = RenderProcessHostImpl::FromID(process_id);
+  if (process_host)
+    return process_host->GetBrowserContext();
+
+  return nullptr;
+}
+
 void OnCertificateRequestedContinuation(
     uint32_t process_id,
     uint32_t routing_id,
@@ -329,10 +350,7 @@
     base::RepeatingCallback<WebContents*(void)> web_contents_getter) {
   if (!web_contents_getter) {
     web_contents_getter =
-        process_id != network::mojom::kBrowserProcessId
-            ? base::BindRepeating(WebContentsImpl::FromRenderFrameHostID,
-                                  process_id, routing_id)
-            : base::BindRepeating(WebContents::FromFrameTreeNodeId, routing_id);
+        base::BindRepeating(GetWebContents, process_id, routing_id);
   }
   if (!web_contents_getter.Run()) {
     network::mojom::SSLPrivateKeyPtr ssl_private_key;
@@ -379,9 +397,7 @@
     const base::Optional<network::ResourceResponseHead>& head,
     network::mojom::AuthChallengeResponderPtr auth_challenge_responder) {
   base::Callback<WebContents*(void)> web_contents_getter =
-      process_id ? base::Bind(WebContentsImpl::FromRenderFrameHostID,
-                              process_id, routing_id)
-                 : base::Bind(WebContents::FromFrameTreeNodeId, routing_id);
+      base::BindRepeating(GetWebContents, process_id, routing_id);
 
   if (!web_contents_getter.Run()) {
     std::move(auth_challenge_responder)->OnAuthCredentials(base::nullopt);
@@ -439,9 +455,7 @@
   SSLErrorDelegate* delegate =
       new SSLErrorDelegate(std::move(response));  // deletes self
   base::Callback<WebContents*(void)> web_contents_getter =
-      process_id ? base::Bind(WebContentsImpl::FromRenderFrameHostID,
-                              process_id, routing_id)
-                 : base::Bind(WebContents::FromFrameTreeNodeId, routing_id);
+      base::BindRepeating(GetWebContents, process_id, routing_id);
   SSLManager::OnSSLCertificateError(
       delegate->GetWeakPtr(), static_cast<ResourceType>(resource_type), url,
       std::move(web_contents_getter), ssl_info, fatal);
@@ -501,11 +515,7 @@
     load_info.upload_position = info->upload_position;
     load_info.upload_size = info->upload_size;
     load_info.web_contents_getter =
-        info->process_id
-            ? base::BindRepeating(WebContentsImpl::FromRenderFrameHostID,
-                                  info->process_id, info->routing_id)
-            : base::BindRepeating(WebContents::FromFrameTreeNodeId,
-                                  info->routing_id);
+        base::BindRepeating(GetWebContents, info->process_id, info->routing_id);
     rdh_infos->push_back(std::move(load_info));
   }
 
@@ -522,15 +532,13 @@
                                            const std::string& header_value,
                                            int load_flags,
                                            OnClearSiteDataCallback callback) {
-  base::RepeatingCallback<WebContents*(void)> web_contents_getter =
-      process_id
-          ? base::BindRepeating(WebContentsImpl::FromRenderFrameHostID,
-                                process_id, routing_id)
-          : base::BindRepeating(WebContents::FromFrameTreeNodeId, routing_id);
-
-  ClearSiteDataHandler::HandleHeader(std::move(web_contents_getter), url,
-                                     header_value, load_flags,
-                                     std::move(callback));
+  auto browser_context_getter =
+      base::BindRepeating(GetBrowserContext, process_id, routing_id);
+  auto web_contents_getter =
+      base::BindRepeating(GetWebContents, process_id, routing_id);
+  ClearSiteDataHandler::HandleHeader(browser_context_getter,
+                                     web_contents_getter, url, header_value,
+                                     load_flags, std::move(callback));
 }
 
 void NetworkServiceClient::OnCertDBChanged() {
diff --git a/content/browser/payments/payment_app_content_unittest_base.cc b/content/browser/payments/payment_app_content_unittest_base.cc
index a726975..a6bacfc 100644
--- a/content/browser/payments/payment_app_content_unittest_base.cc
+++ b/content/browser/payments/payment_app_content_unittest_base.cc
@@ -67,7 +67,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
diff --git a/content/browser/renderer_host/code_cache_host_impl.h b/content/browser/renderer_host/code_cache_host_impl.h
index 0be8aed..f48ff405 100644
--- a/content/browser/renderer_host/code_cache_host_impl.h
+++ b/content/browser/renderer_host/code_cache_host_impl.h
@@ -14,8 +14,8 @@
 #include "content/browser/cache_storage/cache_storage_cache_handle.h"
 #include "content/common/content_export.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 #include "third_party/blink/public/mojom/loader/code_cache.mojom.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
 
 class GURL;
 
diff --git a/content/browser/renderer_host/render_message_filter.h b/content/browser/renderer_host/render_message_filter.h
index 038a966..ef5bd796 100644
--- a/content/browser/renderer_host/render_message_filter.h
+++ b/content/browser/renderer_host/render_message_filter.h
@@ -25,7 +25,7 @@
 #include "content/public/common/widget_type.h"
 #include "gpu/config/gpu_info.h"
 #include "ipc/message_filter.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/native_widget_types.h"
diff --git a/content/browser/renderer_interface_binders.cc b/content/browser/renderer_interface_binders.cc
index 5a6e7ed..976328a7 100644
--- a/content/browser/renderer_interface_binders.cc
+++ b/content/browser/renderer_interface_binders.cc
@@ -34,8 +34,8 @@
 #include "services/shape_detection/public/mojom/constants.mojom.h"
 #include "services/shape_detection/public/mojom/facedetection_provider.mojom.h"
 #include "services/shape_detection/public/mojom/textdetection.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 #include "third_party/blink/public/mojom/cookie_store/cookie_store.mojom.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
 #include "third_party/blink/public/platform/modules/notifications/notification_service.mojom.h"
 #include "url/origin.h"
 
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h
index e020221..8285bd8 100644
--- a/content/browser/service_worker/embedded_worker_instance.h
+++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -24,14 +24,14 @@
 #include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/browser/service_worker/service_worker_metrics.h"
 #include "content/common/content_export.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
 #include "content/common/service_worker/embedded_worker.mojom.h"
 #include "content/common/service_worker/service_worker.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
 #include "url/gurl.h"
 
 namespace content {
diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_unittest.cc
index 10d12ea..ee11f7b 100644
--- a/content/browser/service_worker/embedded_worker_instance_unittest.cc
+++ b/content/browser/service_worker/embedded_worker_instance_unittest.cc
@@ -184,7 +184,7 @@
     return mojo::MakeRequest(&service_workers_.back());
   }
 
-  mojom::ControllerServiceWorkerRequest CreateController() {
+  blink::mojom::ControllerServiceWorkerRequest CreateController() {
     controllers_.emplace_back();
     return mojo::MakeRequest(&controllers_.back());
   }
@@ -220,7 +220,7 @@
 
   // Mojo endpoints.
   std::vector<mojom::ServiceWorkerPtr> service_workers_;
-  std::vector<mojom::ControllerServiceWorkerPtr> controllers_;
+  std::vector<blink::mojom::ControllerServiceWorkerPtr> controllers_;
   std::vector<blink::mojom::ServiceWorkerInstalledScriptsManagerPtr>
       installed_scripts_managers_;
   std::vector<blink::mojom::ServiceWorkerInstalledScriptsManagerHostRequest>
@@ -249,7 +249,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
@@ -817,7 +817,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index 158f4f5..f14b7d8 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -531,7 +531,7 @@
     const GURL& script_url,
     bool pause_after_download,
     mojom::ServiceWorkerRequest service_worker_request,
-    mojom::ControllerServiceWorkerRequest controller_request,
+    blink::mojom::ControllerServiceWorkerRequest controller_request,
     mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
     mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
     blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info) {
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h
index edb4d84..902a084 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.h
+++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -160,7 +160,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index fa7d6db..797b312 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -1572,6 +1572,13 @@
   }
   // The last update time should be bumped.
   EXPECT_LT(last_update_time, GetLastUpdateCheck(registration_id));
+
+  // Tidy up.
+  base::RunLoop run_loop;
+  public_context()->UnregisterServiceWorker(
+      embedded_test_server()->GetURL(kScope),
+      base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure()));
+  run_loop.Run();
 }
 
 class MockContentBrowserClient : public TestContentBrowserClient {
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index a355373..4271ff1 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -520,6 +520,7 @@
     } else {
       barrier.Run();
     }
+    job_coordinator_->Abort(registration->scope());
     UnregisterServiceWorker(
         registration->scope(),
         base::BindOnce(&SuccessCollectorCallback, barrier, overall_success));
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc
index cf1ea0c..ca274c4 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -313,7 +313,7 @@
   // Otherwise let's send the controller service worker information along
   // with the navigation commit.
   SubresourceLoaderParams params;
-  auto controller_info = mojom::ControllerServiceWorkerInfo::New();
+  auto controller_info = blink::mojom::ControllerServiceWorkerInfo::New();
   controller_info->mode = provider_host_->GetControllerMode();
   // Note that |controller_info->endpoint| is null if the controller has no
   // fetch event handler. In that case the renderer frame won't get the
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.h b/content/browser/service_worker/service_worker_controllee_request_handler.h
index 59e495a..4f557eb 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.h
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.h
@@ -22,7 +22,7 @@
 #include "content/public/common/resource_type.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "url/gurl.h"
 
 namespace net {
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
index 710ed18c..fc23d881 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -33,8 +33,8 @@
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 namespace service_worker_controllee_request_handler_unittest {
diff --git a/content/browser/service_worker/service_worker_database.cc b/content/browser/service_worker/service_worker_database.cc
index d652c99..6f313b7 100644
--- a/content/browser/service_worker/service_worker_database.cc
+++ b/content/browser/service_worker/service_worker_database.cc
@@ -397,6 +397,8 @@
     return status;
 
   std::string prefix = CreateRegistrationKeyPrefix(origin);
+
+  // Read all registrations.
   {
     std::unique_ptr<leveldb::Iterator> itr(
         db_->NewIterator(leveldb::ReadOptions()));
@@ -421,21 +423,34 @@
         break;
       }
       registrations->push_back(registration);
-
-      if (opt_resources_list) {
-        std::vector<ResourceRecord> resources;
-        status = ReadResourceRecords(registration, &resources);
-        if (status != STATUS_OK) {
-          registrations->clear();
-          opt_resources_list->clear();
-          break;
-        }
-        opt_resources_list->push_back(resources);
-      }
     }
   }
 
+  // Count reading all registrations as one "read operation" for UMA
+  // purposes.
   HandleReadResult(FROM_HERE, status);
+  if (status != STATUS_OK)
+    return status;
+
+  // Read the resources if requested. This must be done after the loop with
+  // leveldb::Iterator above, because it calls ReadResouceRecords() which
+  // deletes |db_| on failure, and iterators must be destroyed before the
+  // database.
+  if (opt_resources_list) {
+    for (const auto& registration : *registrations) {
+      std::vector<ResourceRecord> resources;
+      // NOTE: ReadResourceRecords already calls HandleReadResult() on its own,
+      // so to avoid double-counting the UMA, don't call it again after this.
+      status = ReadResourceRecords(registration, &resources);
+      if (status != STATUS_OK) {
+        registrations->clear();
+        opt_resources_list->clear();
+        break;
+      }
+      opt_resources_list->push_back(resources);
+    }
+  }
+
   return status;
 }
 
diff --git a/content/browser/service_worker/service_worker_database_unittest.cc b/content/browser/service_worker/service_worker_database_unittest.cc
index 93cd04f..90a2b42 100644
--- a/content/browser/service_worker/service_worker_database_unittest.cc
+++ b/content/browser/service_worker/service_worker_database_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/macros.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "content/browser/service_worker/service_worker_database.pb.h"
 #include "content/common/service_worker/service_worker_types.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -2042,4 +2043,64 @@
   EXPECT_TRUE(resources_out.empty());
 }
 
+// Tests that GetRegistrationsForOrigin() detects corruption without crashing.
+// It must delete the database after freeing the iterator it uses to read all
+// registrations. Regression test for https://crbug.com/909024.
+TEST(ServiceWorkerDatabaseTest, Corruption_GetRegistrationsForOrigin) {
+  std::unique_ptr<ServiceWorkerDatabase> database(CreateDatabaseInMemory());
+  ServiceWorkerDatabase::RegistrationData deleted_version;
+  std::vector<int64_t> newly_purgeable_resources;
+  std::vector<Resource> resources;
+  GURL origin("https://example.com");
+
+  // Write a normal registration.
+  RegistrationData data1;
+  data1.registration_id = 1;
+  data1.scope = URL(origin, "/foo");
+  data1.script = URL(origin, "/resource1");
+  data1.version_id = 1;
+  data1.resources_total_size_bytes = 2016;
+  resources = {CreateResource(1, URL(origin, "/resource1"), 2016)};
+  ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK,
+            database->WriteRegistration(data1, resources, &deleted_version,
+                                        &newly_purgeable_resources));
+
+  // Write a corrupt registration.
+  RegistrationData data2;
+  data2.registration_id = 2;
+  data2.scope = URL(origin, "/foo");
+  data2.script = URL(origin, "/resource2");
+  data2.version_id = 2;
+  data2.resources_total_size_bytes = 2016;
+  // Simulate that "/resource2" wasn't correctly written in the database by
+  // not adding it.
+  resources = {CreateResource(3, URL(origin, "/resource3"), 2016)};
+  ASSERT_EQ(ServiceWorkerDatabase::STATUS_OK,
+            database->WriteRegistration(data2, resources, &deleted_version,
+                                        &newly_purgeable_resources));
+
+  // Call GetRegistrationsForOrigin(). It should detect corruption, and not
+  // crash.
+  base::HistogramTester histogram_tester;
+  std::vector<RegistrationData> registrations;
+  std::vector<std::vector<ServiceWorkerDatabase::ResourceRecord>>
+      resources_list;
+  EXPECT_EQ(ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED,
+            database->GetRegistrationsForOrigin(origin, &registrations,
+                                                &resources_list));
+  EXPECT_TRUE(registrations.empty());
+  EXPECT_TRUE(resources_list.empty());
+
+  // There should be three "read" operations logged:
+  // 1. Reading all registration data.
+  // 2. Reading the resources of the first registration.
+  // 3. Reading the resources of the second registration. This one fails.
+  histogram_tester.ExpectTotalCount("ServiceWorker.Database.ReadResult", 3);
+  histogram_tester.ExpectBucketCount("ServiceWorker.Database.ReadResult",
+                                     ServiceWorkerDatabase::STATUS_OK, 2);
+  histogram_tester.ExpectBucketCount(
+      "ServiceWorker.Database.ReadResult",
+      ServiceWorkerDatabase::STATUS_ERROR_CORRUPTED, 1);
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_job_coordinator.cc b/content/browser/service_worker/service_worker_job_coordinator.cc
index 98c9fe1..599b320e 100644
--- a/content/browser/service_worker/service_worker_job_coordinator.cc
+++ b/content/browser/service_worker/service_worker_job_coordinator.cc
@@ -150,6 +150,14 @@
   queued_job->AddCallback(std::move(callback));
 }
 
+void ServiceWorkerJobCoordinator::Abort(const GURL& scope) {
+  auto pending_jobs = job_queues_.find(scope);
+  if (pending_jobs == job_queues_.end())
+    return;
+  pending_jobs->second.AbortAll();
+  job_queues_.erase(pending_jobs);
+}
+
 void ServiceWorkerJobCoordinator::AbortAll() {
   for (auto& job_pair : job_queues_)
     job_pair.second.AbortAll();
diff --git a/content/browser/service_worker/service_worker_job_coordinator.h b/content/browser/service_worker/service_worker_job_coordinator.h
index 2f31b48..76a3796 100644
--- a/content/browser/service_worker/service_worker_job_coordinator.h
+++ b/content/browser/service_worker/service_worker_job_coordinator.h
@@ -41,7 +41,9 @@
               bool skip_script_comparison,
               ServiceWorkerRegisterJob::RegistrationCallback callback);
 
-  // Calls ServiceWorkerRegisterJobBase::Abort() on all jobs and removes them.
+  // Calls ServiceWorkerRegisterJobBase::Abort() on the specified jobs (all jobs
+  // for a given scope, or all jobs entirely) and removes them.
+  void Abort(const GURL& scope);
   void AbortAll();
 
   // Removes the job. A job that was not aborted must call FinishJob when it is
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc
index a0aa3a84..33f4459d 100644
--- a/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -501,7 +501,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
@@ -769,6 +769,44 @@
   EXPECT_EQ(scoped_refptr<ServiceWorkerRegistration>(), registration);
 }
 
+TEST_F(ServiceWorkerJobTest, AbortScope) {
+  GURL script_url("https://www.example.com/service_worker.js");
+  blink::mojom::ServiceWorkerRegistrationOptions options1;
+  options1.scope = GURL("https://www.example.com/1");
+  blink::mojom::ServiceWorkerRegistrationOptions options2;
+  options2.scope = GURL("https://www.example.com/2");
+
+  bool registration1_called = false;
+  scoped_refptr<ServiceWorkerRegistration> registration1;
+  job_coordinator()->Register(
+      script_url, options1,
+      SaveRegistration(blink::ServiceWorkerStatusCode::kErrorAbort,
+                       &registration1_called, &registration1));
+
+  bool registration2_called = false;
+  scoped_refptr<ServiceWorkerRegistration> registration2;
+  job_coordinator()->Register(
+      script_url, options2,
+      SaveRegistration(blink::ServiceWorkerStatusCode::kOk,
+                       &registration2_called, &registration2));
+
+  ASSERT_FALSE(registration1_called);
+  ASSERT_FALSE(registration2_called);
+  job_coordinator()->Abort(options1.scope);
+
+  base::RunLoop().RunUntilIdle();
+  ASSERT_TRUE(registration1_called);
+  ASSERT_TRUE(registration2_called);
+
+  registration1 = FindRegistrationForScope(
+      options1.scope, blink::ServiceWorkerStatusCode::kErrorNotFound);
+  EXPECT_EQ(nullptr, registration1);
+
+  registration2 = FindRegistrationForScope(options2.scope,
+                                           blink::ServiceWorkerStatusCode::kOk);
+  EXPECT_NE(nullptr, registration2);
+}
+
 // Tests that the waiting worker enters the 'redundant' state upon
 // unregistration.
 TEST_F(ServiceWorkerJobTest, UnregisterWaitingSetsRedundant) {
@@ -971,7 +1009,7 @@
       const GURL& script,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
@@ -1114,7 +1152,7 @@
       const GURL& script,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
diff --git a/content/browser/service_worker/service_worker_object_host_unittest.cc b/content/browser/service_worker/service_worker_object_host_unittest.cc
index f91a53c..151df190 100644
--- a/content/browser/service_worker/service_worker_object_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_object_host_unittest.cc
@@ -77,7 +77,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc
index 95fd594..d961865f 100644
--- a/content/browser/service_worker/service_worker_provider_host.cc
+++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -441,7 +441,7 @@
   UpdateController(true /* notify_controllerchange */);
 }
 
-mojom::ControllerServiceWorkerPtr
+blink::mojom::ControllerServiceWorkerPtr
 ServiceWorkerProviderHost::GetControllerServiceWorkerPtr() {
   DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   DCHECK(controller_);
@@ -449,7 +449,7 @@
       ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST) {
     return nullptr;
   }
-  mojom::ControllerServiceWorkerPtr controller_ptr;
+  blink::mojom::ControllerServiceWorkerPtr controller_ptr;
   controller_->controller()->Clone(mojo::MakeRequest(&controller_ptr));
   return controller_ptr;
 }
@@ -946,7 +946,7 @@
     bool notify_controllerchange) {
   DCHECK(IsProviderForClient());
 
-  auto controller_info = mojom::ControllerServiceWorkerInfo::New();
+  auto controller_info = blink::mojom::ControllerServiceWorkerInfo::New();
   controller_info->client_id = client_uuid();
   if (fetch_request_window_id_) {
     controller_info->fetch_request_window_id =
@@ -1248,7 +1248,7 @@
 }
 
 void ServiceWorkerProviderHost::StartControllerComplete(
-    mojom::ControllerServiceWorkerRequest controller_request,
+    blink::mojom::ControllerServiceWorkerRequest controller_request,
     blink::ServiceWorkerStatusCode status) {
   DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   if (status == blink::ServiceWorkerStatusCode::kOk)
@@ -1256,7 +1256,7 @@
 }
 
 void ServiceWorkerProviderHost::EnsureControllerServiceWorker(
-    mojom::ControllerServiceWorkerRequest controller_request,
+    blink::mojom::ControllerServiceWorkerRequest controller_request,
     mojom::ControllerServiceWorkerPurpose purpose) {
   // TODO(kinuko): Log the reasons we drop the request.
   if (!IsContextAlive() || !controller_)
diff --git a/content/browser/service_worker/service_worker_provider_host.h b/content/browser/service_worker/service_worker_provider_host.h
index 7c6a5fd..755263b 100644
--- a/content/browser/service_worker/service_worker_provider_host.h
+++ b/content/browser/service_worker/service_worker_provider_host.h
@@ -32,9 +32,9 @@
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_feature.mojom.h"
 
 namespace network {
@@ -269,7 +269,7 @@
   //
   // TODO(kinuko): revisit this if we start to use the ControllerServiceWorker
   // for posting messages.
-  mojom::ControllerServiceWorkerPtr GetControllerServiceWorkerPtr();
+  blink::mojom::ControllerServiceWorkerPtr GetControllerServiceWorkerPtr();
 
   // For service worker clients. Sets |url_| and |site_for_cookies_| and updates
   // the client uuid if it's a cross-origin transition.
@@ -552,7 +552,7 @@
   void GetRegistrationForReady(
       GetRegistrationForReadyCallback callback) override;
   void EnsureControllerServiceWorker(
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::ControllerServiceWorkerPurpose purpose) override;
   void CloneContainerHost(
       mojom::ServiceWorkerContainerHostRequest container_host_request) override;
@@ -582,7 +582,7 @@
 
   // Callback for ServiceWorkerVersion::RunAfterStartWorker()
   void StartControllerComplete(
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       blink::ServiceWorkerStatusCode status);
 
   bool IsValidGetRegistrationMessage(const GURL& client_url,
diff --git a/content/browser/service_worker/service_worker_provider_host_unittest.cc b/content/browser/service_worker/service_worker_provider_host_unittest.cc
index 826e3b0..c65c510 100644
--- a/content/browser/service_worker/service_worker_provider_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_provider_host_unittest.cc
@@ -464,9 +464,10 @@
 
   ~MockServiceWorkerContainer() override = default;
 
-  void SetController(mojom::ControllerServiceWorkerInfoPtr controller_info,
-                     const std::vector<blink::mojom::WebFeature>& used_features,
-                     bool should_notify_controllerchange) override {
+  void SetController(
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
+      const std::vector<blink::mojom::WebFeature>& used_features,
+      bool should_notify_controllerchange) override {
     was_set_controller_called_ = true;
   }
   void PostMessageToClient(blink::mojom::ServiceWorkerObjectInfoPtr controller,
diff --git a/content/browser/service_worker/service_worker_request_handler.h b/content/browser/service_worker/service_worker_request_handler.h
index 260941d..42ea68dc 100644
--- a/content/browser/service_worker/service_worker_request_handler.h
+++ b/content/browser/service_worker/service_worker_request_handler.h
@@ -20,7 +20,7 @@
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace net {
 class NetworkDelegate;
diff --git a/content/browser/service_worker/service_worker_request_handler_unittest.cc b/content/browser/service_worker/service_worker_request_handler_unittest.cc
index 159f6ba..06ee7af0d 100644
--- a/content/browser/service_worker/service_worker_request_handler_unittest.cc
+++ b/content/browser/service_worker/service_worker_request_handler_unittest.cc
@@ -27,7 +27,7 @@
 #include "storage/browser/blob/blob_storage_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/service_worker/service_worker_utils.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 namespace service_worker_request_handler_unittest {
diff --git a/content/browser/service_worker/service_worker_url_request_job.h b/content/browser/service_worker/service_worker_url_request_job.h
index cb556569..b947136 100644
--- a/content/browser/service_worker/service_worker_url_request_job.h
+++ b/content/browser/service_worker/service_worker_url_request_job.h
@@ -35,8 +35,8 @@
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
 #include "storage/common/blob_storage/blob_storage_constants.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 #include "url/gurl.h"
 
 namespace net {
diff --git a/content/browser/service_worker/service_worker_url_request_job_unittest.cc b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
index 8c54aa4..2b393b2 100644
--- a/content/browser/service_worker/service_worker_url_request_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
@@ -60,11 +60,11 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 namespace service_worker_url_request_job_unittest {
@@ -502,7 +502,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
@@ -538,7 +538,7 @@
   GURL script_url_;
   bool pause_after_download_;
   mojom::ServiceWorkerRequest start_worker_request_;
-  mojom::ControllerServiceWorkerRequest controller_request_;
+  blink::mojom::ControllerServiceWorkerRequest controller_request_;
   mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo
       start_worker_instance_host_;
   mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info_;
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index 21862dc..7a25c1e 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -36,7 +36,6 @@
 #include "content/browser/service_worker/service_worker_ping_controller.h"
 #include "content/browser/service_worker/service_worker_script_cache_map.h"
 #include "content/common/content_export.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
 #include "content/common/service_worker/service_worker.mojom.h"
 #include "content/common/service_worker/service_worker_types.h"
 #include "ipc/ipc_message.h"
@@ -44,6 +43,7 @@
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
@@ -353,7 +353,7 @@
   // TODO(kinuko): Relying on the callsites to start the worker when it's
   // not running is a bit sketchy, maybe this should queue a task to check
   // if the pending request is pending too long? https://crbug.com/797222
-  mojom::ControllerServiceWorker* controller() {
+  blink::mojom::ControllerServiceWorker* controller() {
     if (!controller_ptr_.is_bound()) {
       DCHECK(!controller_request_.is_pending());
       controller_request_ = mojo::MakeRequest(&controller_ptr_);
@@ -845,8 +845,8 @@
   // |controller_request_| is non-null only when the |controller_ptr_| is
   // requested before the worker is started, it is passed to the worker (and
   // becomes null) once it's started.
-  mojom::ControllerServiceWorkerPtr controller_ptr_;
-  mojom::ControllerServiceWorkerRequest controller_request_;
+  blink::mojom::ControllerServiceWorkerPtr controller_ptr_;
+  blink::mojom::ControllerServiceWorkerRequest controller_request_;
 
   std::unique_ptr<ServiceWorkerInstalledScriptsSender>
       installed_scripts_sender_;
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc
index df92e160..c828c32 100644
--- a/content/browser/service_worker/service_worker_version_unittest.cc
+++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -247,7 +247,7 @@
       const GURL& script_url,
       bool pause_after_download,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info)
@@ -301,7 +301,8 @@
       instance_host_ptr_map_;
   std::map<int /* embedded_worker_id */, mojom::ServiceWorkerRequest>
       service_worker_request_map_;
-  std::map<int /* embedded_worker_id */, mojom::ControllerServiceWorkerRequest>
+  std::map<int /* embedded_worker_id */,
+           blink::mojom::ControllerServiceWorkerRequest>
       controller_request_map_;
   DISALLOW_COPY_AND_ASSIGN(MessageReceiverDisallowStart);
 };
diff --git a/content/browser/tracing/cast_tracing_agent.cc b/content/browser/tracing/cast_tracing_agent.cc
index 803bb97..a44d7ba19 100644
--- a/content/browser/tracing/cast_tracing_agent.cc
+++ b/content/browser/tracing/cast_tracing_agent.cc
@@ -9,12 +9,19 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/logging.h"
+#include "base/no_destructor.h"
+#include "base/sequence_checker.h"
 #include "base/task/post_task.h"
 #include "base/trace_event/trace_config.h"
 #include "chromecast/tracing/system_tracing_common.h"
 #include "content/public/browser/browser_thread.h"
 #include "services/service_manager/public/cpp/connector.h"
+#include "services/tracing/public/cpp/perfetto/producer_client.h"
 #include "services/tracing/public/mojom/constants.mojom.h"
+#include "services/tracing/public/mojom/perfetto_service.mojom.h"
+#include "third_party/perfetto/include/perfetto/tracing/core/trace_writer.h"
+#include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_trace_event.pbzero.h"
+#include "third_party/perfetto/protos/perfetto/trace/trace_packet.pbzero.h"
 
 namespace content {
 namespace {
@@ -39,6 +46,232 @@
   return base::JoinString(categories, ",");
 }
 
+void DestroySystemTracerOnWorker(
+    std::unique_ptr<chromecast::SystemTracer> tracer) {}
+
+}  // namespace
+
+class CastSystemTracingSession {
+ public:
+  using SuccessCallback = base::OnceCallback<void(bool)>;
+  using TraceDataCallback =
+      base::RepeatingCallback<void(chromecast::SystemTracer::Status status,
+                                   std::string trace_data)>;
+
+  CastSystemTracingSession(
+      const scoped_refptr<base::SequencedTaskRunner>& worker_task_runner)
+      : worker_task_runner_(worker_task_runner) {
+    DETACH_FROM_SEQUENCE(worker_sequence_checker_);
+  }
+
+  ~CastSystemTracingSession() {
+    worker_task_runner_->PostTask(FROM_HERE,
+                                  base::BindOnce(&DestroySystemTracerOnWorker,
+                                                 std::move(system_tracer_)));
+  }
+
+  // Begin tracing if configured in |config|. Calls |success_callback| on the
+  // current sequence with |true| if tracing was started and |false| otherwise.
+  void StartTracing(const std::string& config, SuccessCallback callback) {
+    base::trace_event::TraceConfig trace_config(config);
+
+    if (!trace_config.IsSystraceEnabled()) {
+      std::move(callback).Run(false /* success */);
+      return;
+    }
+
+    worker_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            &CastSystemTracingSession::StartTracingOnWorker,
+            base::Unretained(this), base::SequencedTaskRunnerHandle::Get(),
+            GetTracingCategories(trace_config), std::move(callback)));
+  }
+
+  // Stops the active tracing session, calls |callback| on the current sequence
+  // at least once but possibly multiple times until all data was collected.
+  void StopTracing(TraceDataCallback callback) {
+    worker_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&CastSystemTracingSession::StopAndFlushOnWorker,
+                       base::Unretained(this),
+                       base::SequencedTaskRunnerHandle::Get(), callback));
+  }
+
+ private:
+  void StartTracingOnWorker(scoped_refptr<base::TaskRunner> reply_task_runner,
+                            const std::string& categories,
+                            SuccessCallback callback) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_);
+    DCHECK(!is_tracing_);
+    system_tracer_ = chromecast::SystemTracer::Create();
+    system_tracer_->StartTracing(
+        categories,
+        base::BindOnce(&CastSystemTracingSession::FinishStartOnWorker,
+                       base::Unretained(this), reply_task_runner,
+                       std::move(callback)));
+  }
+
+  void FinishStartOnWorker(scoped_refptr<base::TaskRunner> reply_task_runner,
+                           SuccessCallback callback,
+                           chromecast::SystemTracer::Status status) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_);
+    is_tracing_ = status == chromecast::SystemTracer::Status::OK;
+    if (callback) {
+      reply_task_runner->PostTask(
+          FROM_HERE, base::BindOnce(std::move(callback), is_tracing_));
+    }
+  }
+
+  void StopAndFlushOnWorker(scoped_refptr<base::TaskRunner> reply_task_runner,
+                            TraceDataCallback callback) {
+    if (!is_tracing_) {
+      reply_task_runner->PostTask(
+          FROM_HERE,
+          base::BindOnce(callback, chromecast::SystemTracer::Status::OK,
+                         std::string()));
+      return;
+    }
+    DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_);
+    system_tracer_->StopTracing(base::BindRepeating(
+        &CastSystemTracingSession::HandleTraceDataOnWorker,
+        base::Unretained(this), reply_task_runner, std::move(callback)));
+  }
+
+  void HandleTraceDataOnWorker(
+      scoped_refptr<base::TaskRunner> reply_task_runner,
+      TraceDataCallback callback,
+      chromecast::SystemTracer::Status status,
+      std::string trace_data) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(worker_sequence_checker_);
+    reply_task_runner->PostTask(
+        FROM_HERE, base::BindOnce(callback, status, std::move(trace_data)));
+  }
+
+  SEQUENCE_CHECKER(worker_sequence_checker_);
+
+  // Task runner for collecting traces in a worker thread.
+  scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
+
+  bool is_tracing_ = false;
+  std::unique_ptr<chromecast::SystemTracer> system_tracer_;
+
+  DISALLOW_COPY_AND_ASSIGN(CastSystemTracingSession);
+};
+
+namespace {
+
+using ChromeEventBundleHandle =
+    protozero::MessageHandle<perfetto::protos::pbzero::ChromeEventBundle>;
+
+class CastDataSource : public tracing::ProducerClient::DataSourceBase {
+ public:
+  static CastDataSource* GetInstance() {
+    static base::NoDestructor<CastDataSource> instance;
+    return instance.get();
+  }
+
+  // Called from the tracing::ProducerClient on its sequence.
+  void StartTracing(
+      tracing::ProducerClient* producer_client,
+      const tracing::mojom::DataSourceConfig& data_source_config) override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(perfetto_sequence_checker_);
+    DCHECK(!producer_client_);
+    DCHECK(!session_);
+    producer_client_ = producer_client;
+    target_buffer_ = data_source_config.target_buffer;
+    session_ = std::make_unique<CastSystemTracingSession>(worker_task_runner_);
+    session_->StartTracing(data_source_config.trace_config,
+                           base::BindOnce(&CastDataSource::SystemTracerStarted,
+                                          base::Unretained(this)));
+  }
+
+  // Called from the tracing::ProducerClient on its sequence.
+  void StopTracing(base::OnceClosure stop_complete_callback) override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(perfetto_sequence_checker_);
+    DCHECK(producer_client_);
+    DCHECK(session_);
+    if (!session_started_) {
+      session_started_callback_ =
+          base::BindOnce(&CastDataSource::StopTracing, base::Unretained(this),
+                         std::move(stop_complete_callback));
+      return;
+    }
+
+    trace_writer_ = producer_client_->CreateTraceWriter(target_buffer_);
+    DCHECK(trace_writer_);
+    stop_complete_callback_ = std::move(stop_complete_callback);
+    session_->StopTracing(base::BindRepeating(&CastDataSource::OnTraceData,
+                                              base::Unretained(this)));
+  }
+
+  void Flush(base::RepeatingClosure flush_complete_callback) override {
+    // Cast's SystemTracer doesn't currently support flushing while recording.
+    flush_complete_callback.Run();
+  }
+
+ private:
+  friend class base::NoDestructor<CastDataSource>;
+
+  CastDataSource()
+      : DataSourceBase(tracing::mojom::kSystemTraceDataSourceName),
+        worker_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+            {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+             base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {
+    DETACH_FROM_SEQUENCE(perfetto_sequence_checker_);
+  }
+
+  void SystemTracerStarted(bool success) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(perfetto_sequence_checker_);
+    session_started_ = true;
+    if (session_started_callback_)
+      std::move(session_started_callback_).Run();
+  }
+
+  void OnTraceData(chromecast::SystemTracer::Status status,
+                   std::string trace_data) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(perfetto_sequence_checker_);
+
+    if (!stop_complete_callback_)
+      return;
+    DCHECK(trace_writer_);
+    DCHECK(session_);
+
+    if (status != chromecast::SystemTracer::Status::FAIL) {
+      perfetto::TraceWriter::TracePacketHandle trace_packet_handle =
+          trace_writer_->NewTracePacket();
+      ChromeEventBundleHandle event_bundle =
+          ChromeEventBundleHandle(trace_packet_handle->set_chrome_events());
+      event_bundle->add_legacy_ftrace_output(trace_data.data(),
+                                             trace_data.length());
+    }
+
+    if (status != chromecast::SystemTracer::Status::KEEP_GOING) {
+      trace_writer_->Flush();
+      trace_writer_.reset();
+      session_.reset();
+      session_started_ = false;
+      producer_client_ = nullptr;
+      std::move(stop_complete_callback_).Run();
+    }
+  }
+
+  SEQUENCE_CHECKER(perfetto_sequence_checker_);
+
+  // Task runner for collecting traces in a worker thread.
+  scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
+
+  std::unique_ptr<CastSystemTracingSession> session_;
+  bool session_started_ = false;
+  base::OnceClosure session_started_callback_;
+  std::unique_ptr<perfetto::TraceWriter> trace_writer_;
+  base::OnceClosure stop_complete_callback_;
+  uint32_t target_buffer_ = 0;
+  tracing::ProducerClient* producer_client_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(CastDataSource);
+};
+
 }  // namespace
 
 CastTracingAgent::CastTracingAgent(service_manager::Connector* connector)
@@ -46,10 +279,11 @@
                 "systemTraceEvents",
                 tracing::mojom::TraceDataType::STRING,
                 false /* supports_explicit_clock_sync */,
-                base::kNullProcessId) {
-  task_runner_ = base::CreateSequencedTaskRunnerWithTraits(
-      {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
-       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
+                base::kNullProcessId),
+      worker_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+          {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+           base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {
+  tracing::ProducerClient::Get()->AddDataSource(CastDataSource::GetInstance());
 }
 
 CastTracingAgent::~CastTracingAgent() = default;
@@ -59,97 +293,43 @@
                                     base::TimeTicks coordinator_time,
                                     Agent::StartTracingCallback callback) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  base::trace_event::TraceConfig trace_config(config);
-
-  if (!trace_config.IsSystraceEnabled()) {
-    std::move(callback).Run(false /* success */);
-    return;
-  }
-
-  start_tracing_callback_ = std::move(callback);
-
-  task_runner_->PostTask(FROM_HERE,
-                         base::BindOnce(&CastTracingAgent::StartTracingOnIO,
-                                        base::Unretained(this),
-                                        base::ThreadTaskRunnerHandle::Get(),
-                                        GetTracingCategories(trace_config)));
+  DCHECK(!session_);
+  session_ = std::make_unique<CastSystemTracingSession>(worker_task_runner_);
+  session_->StartTracing(
+      config, base::BindOnce(&CastTracingAgent::StartTracingCallbackProxy,
+                             base::Unretained(this), std::move(callback)));
 }
 
 void CastTracingAgent::StopAndFlush(tracing::mojom::RecorderPtr recorder) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  // We should only be called after starting the trace session succeeded.
+  DCHECK(session_);
   recorder_ = std::move(recorder);
-
-  task_runner_->PostTask(FROM_HERE,
-                         base::BindOnce(&CastTracingAgent::StopAndFlushOnIO,
-                                        base::Unretained(this),
-                                        base::ThreadTaskRunnerHandle::Get()));
+  session_->StopTracing(base::BindRepeating(&CastTracingAgent::HandleTraceData,
+                                            base::Unretained(this)));
 }
 
 void CastTracingAgent::GetCategories(Agent::GetCategoriesCallback callback) {
   std::move(callback).Run(GetAllTracingCategories());
 }
 
-void CastTracingAgent::StartTracingOnIO(
-    scoped_refptr<base::TaskRunner> reply_task_runner,
-    const std::string& categories) {
-  system_tracer_ = chromecast::SystemTracer::Create();
-
-  system_tracer_->StartTracing(
-      categories, base::BindOnce(&CastTracingAgent::FinishStartOnIO,
-                                 base::Unretained(this), reply_task_runner));
-}
-
-void CastTracingAgent::FinishStartOnIO(
-    scoped_refptr<base::TaskRunner> reply_task_runner,
-    chromecast::SystemTracer::Status status) {
-  reply_task_runner->PostTask(FROM_HERE,
-                              base::BindOnce(&CastTracingAgent::FinishStart,
-                                             base::Unretained(this), status));
-  if (status != chromecast::SystemTracer::Status::OK) {
-    base::SequencedTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&CastTracingAgent::CleanupOnIO, base::Unretained(this)));
-  }
-}
-
-void CastTracingAgent::FinishStart(chromecast::SystemTracer::Status status) {
+void CastTracingAgent::StartTracingCallbackProxy(
+    Agent::StartTracingCallback callback,
+    bool success) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-  std::move(start_tracing_callback_)
-      .Run(status == chromecast::SystemTracer::Status::OK);
-}
-
-void CastTracingAgent::StopAndFlushOnIO(
-    scoped_refptr<base::TaskRunner> reply_task_runner) {
-  system_tracer_->StopTracing(
-      base::BindRepeating(&CastTracingAgent::HandleTraceDataOnIO,
-                          base::Unretained(this), reply_task_runner));
-}
-
-void CastTracingAgent::HandleTraceDataOnIO(
-    scoped_refptr<base::TaskRunner> reply_task_runner,
-    chromecast::SystemTracer::Status status,
-    std::string trace_data) {
-  reply_task_runner->PostTask(
-      FROM_HERE,
-      base::BindOnce(&CastTracingAgent::HandleTraceData, base::Unretained(this),
-                     status, std::move(trace_data)));
-  if (status != chromecast::SystemTracer::Status::KEEP_GOING) {
-    base::SequencedTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&CastTracingAgent::CleanupOnIO, base::Unretained(this)));
-  }
+  if (!success)
+    session_.reset();
+  std::move(callback).Run(success);
 }
 
 void CastTracingAgent::HandleTraceData(chromecast::SystemTracer::Status status,
                                        std::string trace_data) {
   if (recorder_ && status != chromecast::SystemTracer::Status::FAIL)
     recorder_->AddChunk(std::move(trace_data));
-  if (status != chromecast::SystemTracer::Status::KEEP_GOING)
+  if (status != chromecast::SystemTracer::Status::KEEP_GOING) {
     recorder_.reset();
-}
-
-void CastTracingAgent::CleanupOnIO() {
-  system_tracer_.reset();
+    session_.reset();
+  }
 }
 
 }  // namespace content
diff --git a/content/browser/tracing/cast_tracing_agent.h b/content/browser/tracing/cast_tracing_agent.h
index 1604d95..0a45ac50 100644
--- a/content/browser/tracing/cast_tracing_agent.h
+++ b/content/browser/tracing/cast_tracing_agent.h
@@ -22,6 +22,10 @@
 
 namespace content {
 
+class CastSystemTracingSession;
+
+// TODO(crbug.com/839086): Remove once we have replaced the legacy tracing
+// service with perfetto.
 class CastTracingAgent : public tracing::BaseAgent {
  public:
   explicit CastTracingAgent(service_manager::Connector* connector);
@@ -35,26 +39,17 @@
   void StopAndFlush(tracing::mojom::RecorderPtr recorder) override;
   void GetCategories(Agent::GetCategoriesCallback callback) override;
 
-  void StartTracingOnIO(scoped_refptr<base::TaskRunner> reply_task_runner,
-                        const std::string& categories);
-  void FinishStartOnIO(scoped_refptr<base::TaskRunner> reply_task_runner,
-                       chromecast::SystemTracer::Status status);
-  void FinishStart(chromecast::SystemTracer::Status status);
-  void StopAndFlushOnIO(scoped_refptr<base::TaskRunner> reply_task_runner);
-  void HandleTraceDataOnIO(scoped_refptr<base::TaskRunner> reply_task_runner,
-                           chromecast::SystemTracer::Status,
-                           std::string trace_data);
+  void StartTracingCallbackProxy(Agent::StartTracingCallback callback,
+                                 bool success);
   void HandleTraceData(chromecast::SystemTracer::Status status,
                        std::string trace_data);
-  void CleanupOnIO();
 
-  Agent::StartTracingCallback start_tracing_callback_;
   tracing::mojom::RecorderPtr recorder_;
 
   // Task runner for collecting traces in a worker thread.
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
 
-  std::unique_ptr<chromecast::SystemTracer> system_tracer_;
+  std::unique_ptr<CastSystemTracingSession> session_;
 
   DISALLOW_COPY_AND_ASSIGN(CastTracingAgent);
 };
diff --git a/content/browser/tracing/tracing_controller_browsertest.cc b/content/browser/tracing/tracing_controller_browsertest.cc
index a267fe7a5..4899633 100644
--- a/content/browser/tracing/tracing_controller_browsertest.cc
+++ b/content/browser/tracing/tracing_controller_browsertest.cc
@@ -526,13 +526,6 @@
 #define MAYBE_SystemTraceEvents DISABLED_SystemTraceEvents
 #endif
 IN_PROC_BROWSER_TEST_F(TracingControllerTest, MAYBE_SystemTraceEvents) {
-#if !defined(OS_CHROMEOS)
-  // TODO(crbug.com/900603): Enable this test for perfetto on other platforms
-  // once passing.
-  if (tracing::TracingUsesPerfettoBackend())
-    return;
-#endif
-
   TestStartAndStopTracingString(true /* enable_systrace */);
   EXPECT_TRUE(last_data().find("systemTraceEvents") != std::string::npos);
 }
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc
index 09a5de0..e570f68 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -825,9 +825,10 @@
 void WebContentsViewAura::CreateAuraWindow(aura::Window* context) {
   DCHECK(aura::Env::HasInstance());
   DCHECK(!window_);
-  window_ = std::make_unique<aura::Window>(this);
+  window_ = std::make_unique<aura::Window>(
+      this, aura::client::WINDOW_TYPE_CONTROL,
+      context ? context->env() : aura::Env::GetInstance());
   window_->set_owned_by_parent(false);
-  window_->SetType(aura::client::WINDOW_TYPE_CONTROL);
   window_->SetName("WebContentsViewAura");
   window_->Init(ui::LAYER_NOT_DRAWN);
   aura::Window* root_window = context ? context->GetRootWindow() : nullptr;
diff --git a/content/browser/websockets/websocket_manager.cc b/content/browser/websockets/websocket_manager.cc
index 3f5114286..a825a6d7 100644
--- a/content/browser/websockets/websocket_manager.cc
+++ b/content/browser/websockets/websocket_manager.cc
@@ -81,7 +81,7 @@
     OnLostConnectionToClient(impl);
   }
 
-  bool CanReadRawCookies() override {
+  bool CanReadRawCookies(const GURL& url) override {
     return ChildProcessSecurityPolicyImpl::GetInstance()->CanReadRawCookies(
         manager_->process_id_);
   }
diff --git a/content/browser/worker_host/mock_shared_worker.cc b/content/browser/worker_host/mock_shared_worker.cc
index 4a1a4ae2..d212ddb 100644
--- a/content/browser/worker_host/mock_shared_worker.cc
+++ b/content/browser/worker_host/mock_shared_worker.cc
@@ -109,7 +109,7 @@
         main_script_loader_factory,
     blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
     std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories,
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     mojom::SharedWorkerHostPtr host,
     mojom::SharedWorkerRequest request,
     service_manager::mojom::InterfaceProviderPtr interface_provider) {
diff --git a/content/browser/worker_host/mock_shared_worker.h b/content/browser/worker_host/mock_shared_worker.h
index 51af99a..8b6c2b9f 100644
--- a/content/browser/worker_host/mock_shared_worker.h
+++ b/content/browser/worker_host/mock_shared_worker.h
@@ -78,7 +78,7 @@
           main_script_loader_factory,
       blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
       std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories,
-      mojom::ControllerServiceWorkerInfoPtr controller_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
       mojom::SharedWorkerHostPtr host,
       mojom::SharedWorkerRequest request,
       service_manager::mojom::InterfaceProviderPtr interface_provider) override;
diff --git a/content/browser/worker_host/shared_worker_host.cc b/content/browser/worker_host/shared_worker_host.cc
index bef09c17..f9a34b9 100644
--- a/content/browser/worker_host/shared_worker_host.cc
+++ b/content/browser/worker_host/shared_worker_host.cc
@@ -242,7 +242,7 @@
   // only provided if NetworkService is enabled. In the non-NetworkService case,
   // the controller is sent in SetController IPCs during the request for the
   // shared worker script.
-  mojom::ControllerServiceWorkerInfoPtr controller;
+  blink::mojom::ControllerServiceWorkerInfoPtr controller;
   blink::mojom::ServiceWorkerObjectAssociatedPtrInfo remote_object;
   blink::mojom::ServiceWorkerState sent_state;
   if (subresource_loader_params &&
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 0b75458..2db6c60 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -428,15 +428,6 @@
   if (base::FeatureList::IsEnabled(features::kLazyImageVisibleLoadTimeMetrics))
     WebRuntimeFeatures::EnableLazyImageVisibleLoadTimeMetrics(true);
 
-  WebRuntimeFeatures::EnableRestrictLazyFrameLoadingToDataSaver(
-      base::GetFieldTrialParamByFeatureAsBool(
-          features::kLazyFrameLoading,
-          "restrict-lazy-load-frames-to-data-saver-only", false));
-  WebRuntimeFeatures::EnableRestrictLazyImageLoadingToDataSaver(
-      base::GetFieldTrialParamByFeatureAsBool(
-          features::kLazyFrameLoading,
-          "restrict-lazy-load-images-to-data-saver-only", false));
-
   WebRuntimeFeatures::EnableV8ContextSnapshot(
       base::FeatureList::IsEnabled(features::kV8ContextSnapshot));
 
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 9513422..899e1558 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -512,7 +512,6 @@
     "render_widget_window_tree_client_factory.mojom",
     "renderer.mojom",
     "renderer_host.mojom",
-    "service_worker/controller_service_worker.mojom",
     "service_worker/embedded_worker.mojom",
     "service_worker/service_worker.mojom",
     "service_worker/service_worker_container.mojom",
diff --git a/content/common/DEPS b/content/common/DEPS
index 1c03bc8..17c74a5 100644
--- a/content/common/DEPS
+++ b/content/common/DEPS
@@ -50,10 +50,8 @@
   "+third_party/blink/public/platform/linux/web_fallback_font.h",
   "+third_party/blink/public/platform/mac/web_scrollbar_theme.h",
   "+third_party/blink/public/platform/modules/bluetooth/web_bluetooth.mojom.h",
-  "+third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h",
   "+third_party/blink/public/platform/modules/device_orientation/WebDeviceMotionData.h",
   "+third_party/blink/public/platform/modules/device_orientation/WebDeviceOrientationData.h",
-  "+third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h",
   "+third_party/blink/public/platform/modules/mediasession/media_session.mojom.h",
   "+third_party/blink/public/platform/modules/mediastream/media_devices.mojom.h",
   "+third_party/blink/public/platform/modules/permissions/permission.mojom.h",
diff --git a/content/common/content_param_traits_macros.h b/content/common/content_param_traits_macros.h
index a2c4c7a..a16bb785 100644
--- a/content/common/content_param_traits_macros.h
+++ b/content/common/content_param_traits_macros.h
@@ -16,8 +16,8 @@
 #include "content/public/common/input_event_ack_state.h"
 #include "content/public/common/resource_type.h"
 #include "ipc/ipc_message_macros.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_content_security_policy.h"
 #include "third_party/blink/public/platform/web_input_event.h"
 #include "third_party/blink/public/web/web_ime_text_span.h"
diff --git a/content/common/frame.mojom b/content/common/frame.mojom
index a9cd1241..2b6003122 100644
--- a/content/common/frame.mojom
+++ b/content/common/frame.mojom
@@ -6,7 +6,6 @@
 
 import "content/common/navigation_client.mojom";
 import "content/common/navigation_params.mojom";
-import "content/common/service_worker/controller_service_worker.mojom";
 import "content/common/url_loader_factory_bundle.mojom";
 import "content/public/common/resource_type.mojom";
 import "content/public/common/resource_load_info.mojom";
@@ -22,6 +21,7 @@
 import "third_party/blink/public/mojom/feature_policy/feature_policy.mojom";
 import "third_party/blink/public/mojom/frame/navigation_initiator.mojom";
 import "third_party/blink/public/mojom/referrer.mojom";
+import "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom";
 import "third_party/blink/public/web/commit_result.mojom";
 import "third_party/blink/public/web/devtools_agent.mojom";
 import "third_party/blink/public/web/window_features.mojom";
@@ -107,7 +107,7 @@
       network.mojom.URLLoaderClientEndpoints? url_loader_client_endpoints,
       URLLoaderFactoryBundle? subresource_loader_factories,
       array<TransferrableURLLoader>? subresource_overrides,
-      ControllerServiceWorkerInfo? controller_service_worker_info,
+      blink.mojom.ControllerServiceWorkerInfo? controller_service_worker_info,
       network.mojom.URLLoaderFactory? prefetch_loader_factory,
       mojo_base.mojom.UnguessableToken devtools_navigation_token)
       => (blink.mojom.CommitResult commit_result);
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 17be42a..cf08b9a 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -61,7 +61,7 @@
 #include "third_party/blink/public/common/messaging/message_port_channel.h"
 #include "third_party/blink/public/common/messaging/transferable_message.h"
 #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/web_intrinsic_sizing_info.h"
diff --git a/content/common/navigation_client.mojom b/content/common/navigation_client.mojom
index 49c5db43..14ee7ad 100644
--- a/content/common/navigation_client.mojom
+++ b/content/common/navigation_client.mojom
@@ -6,11 +6,11 @@
 
 import "services/network/public/mojom/url_loader.mojom";
 import "services/network/public/mojom/url_loader_factory.mojom";
-import "content/common/service_worker/controller_service_worker.mojom";
 import "content/common/url_loader_factory_bundle.mojom";
 import "content/public/common/transferrable_url_loader.mojom";
 import "mojo/public/mojom/base/unguessable_token.mojom";
 import "url/mojom/url.mojom";
+import "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom";
 import "third_party/blink/public/web/commit_result.mojom";
 
 // See src/content/common/navigation_params.h
@@ -59,7 +59,7 @@
       network.mojom.URLLoaderClientEndpoints? url_loader_client_endpoints,
       URLLoaderFactoryBundle? subresource_loader_factories,
       array<TransferrableURLLoader>? subresource_overrides,
-      ControllerServiceWorkerInfo? controller_service_worker_info,
+      blink.mojom.ControllerServiceWorkerInfo? controller_service_worker_info,
       network.mojom.URLLoaderFactory? prefetch_loader_factory,
       mojo_base.mojom.UnguessableToken devtools_navigation_token)
       => (blink.mojom.CommitResult commit_result);
diff --git a/content/common/navigation_params.h b/content/common/navigation_params.h
index 60ab1d9..64febc0 100644
--- a/content/common/navigation_params.h
+++ b/content/common/navigation_params.h
@@ -28,7 +28,7 @@
 #include "services/network/public/cpp/resource_request_body.h"
 #include "services/network/public/cpp/resource_response.h"
 #include "services/network/public/cpp/resource_response_info.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_mixed_content_context_type.h"
 #include "ui/base/page_transition_types.h"
 #include "url/gurl.h"
diff --git a/content/common/navigation_params.mojom b/content/common/navigation_params.mojom
index d64b842a..e43f80a 100644
--- a/content/common/navigation_params.mojom
+++ b/content/common/navigation_params.mojom
@@ -5,7 +5,7 @@
 module content.mojom;
 
 import "mojo/public/mojom/base/values.mojom";
-import "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom";
+import "third_party/blink/public/mojom/fetch/fetch_api_request.mojom";
 import "url/mojom/origin.mojom";
 import "url/mojom/url.mojom";
 
diff --git a/content/common/navigation_subresource_loader_params.h b/content/common/navigation_subresource_loader_params.h
index c92e942..cdecc74 100644
--- a/content/common/navigation_subresource_loader_params.h
+++ b/content/common/navigation_subresource_loader_params.h
@@ -6,8 +6,9 @@
 #define CONTENT_COMMON_NAVIGATION_SUBRESOURCE_LOADER_PARAMS_H_
 
 #include "base/memory/weak_ptr.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
+#include "content/common/content_export.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 
 namespace content {
 
@@ -36,7 +37,7 @@
   // updated before being sent over Mojo and then registered with
   // |controller_service_worker_object_host|. See
   // ServiceWorkerObjectHost::CreateIncompleteObjectInfo() for details.
-  mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info;
+  blink::mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info;
   base::WeakPtr<ServiceWorkerObjectHost> controller_service_worker_object_host;
 };
 
diff --git a/content/common/service_worker/embedded_worker.mojom b/content/common/service_worker/embedded_worker.mojom
index 4dcf473c..3a4052b 100644
--- a/content/common/service_worker/embedded_worker.mojom
+++ b/content/common/service_worker/embedded_worker.mojom
@@ -5,7 +5,6 @@
 module content.mojom;
 
 import "content/common/native_types.mojom";
-import "content/common/service_worker/controller_service_worker.mojom";
 import "content/common/service_worker/service_worker.mojom";
 import "content/common/service_worker/service_worker_provider.mojom";
 import "content/common/url_loader_factory_bundle.mojom";
@@ -16,6 +15,7 @@
 import "mojo/public/mojom/base/unguessable_token.mojom";
 import "services/service_manager/public/mojom/interface_provider.mojom";
 import "third_party/blink/public/mojom/script/script_type.mojom";
+import "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom";
@@ -65,7 +65,7 @@
   ServiceWorker& service_worker_request;
   // S13nServiceWorker: cloned and passed to each controllee to directly
   // dispatch events from the controllees.
-  ControllerServiceWorker& controller_request;
+  blink.mojom.ControllerServiceWorker& controller_request;
   // Information to transfer installed scripts from the browser to the renderer.
   blink.mojom.ServiceWorkerInstalledScriptsInfo? installed_scripts_info;
   // Interface for the renderer to send the status updates to the browser.
diff --git a/content/common/service_worker/service_worker_container.mojom b/content/common/service_worker/service_worker_container.mojom
index fd67fc7a..2a78a6f 100644
--- a/content/common/service_worker/service_worker_container.mojom
+++ b/content/common/service_worker/service_worker_container.mojom
@@ -4,9 +4,9 @@
 
 module content.mojom;
 
-import "content/common/service_worker/controller_service_worker.mojom";
 import "mojo/public/mojom/base/string16.mojom";
 import "third_party/blink/public/mojom/messaging/transferable_message.mojom";
+import "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom";
@@ -86,7 +86,7 @@
   // reported to the controllees, but the browser process is responsible for
   // properly handling the failure and recording the reasons.
   // |purpose| is used for UMA.
-  EnsureControllerServiceWorker(ControllerServiceWorker& controller,
+  EnsureControllerServiceWorker(blink.mojom.ControllerServiceWorker& controller,
                                 ControllerServiceWorkerPurpose purpose);
 
   // S13nServiceWorker:
@@ -132,7 +132,7 @@
   // features the controller has used, for UseCounter purposes.
   // If |should_notify_controllerchange| is true, dispatch a 'controllerchange'
   // event.
-  SetController(ControllerServiceWorkerInfo controller_info,
+  SetController(blink.mojom.ControllerServiceWorkerInfo controller_info,
                 array<blink.mojom.WebFeature> used_features,
                 bool should_notify_controllerchange);
 
diff --git a/content/common/service_worker/service_worker_provider.mojom b/content/common/service_worker/service_worker_provider.mojom
index d3ae678..1f61b37 100644
--- a/content/common/service_worker/service_worker_provider.mojom
+++ b/content/common/service_worker/service_worker_provider.mojom
@@ -7,10 +7,10 @@
 import "content/common/service_worker/service_worker_container.mojom";
 import "services/network/public/mojom/url_loader_factory.mojom";
 import "services/service_manager/public/mojom/interface_provider.mojom";
+import "third_party/blink/public/mojom/cache_storage/cache_storage.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom";
-import "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom";
 
 // The name of the InterfaceProviderSpec in service manifests used by the
 // frame tree to expose service-worker-specific interfaces between renderer
diff --git a/content/common/service_worker/service_worker_type_converter.h b/content/common/service_worker/service_worker_type_converter.h
index cc0dad9..3d56dc6 100644
--- a/content/common/service_worker/service_worker_type_converter.h
+++ b/content/common/service_worker/service_worker_type_converter.h
@@ -8,7 +8,7 @@
 #include "content/common/content_export.h"
 #include "content/common/service_worker/service_worker_types.h"
 #include "mojo/public/cpp/bindings/type_converter.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace mojo {
 // TODO(https://crbug.com/789854) Remove these converters once
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h
index f2dab4fa..b31733e 100644
--- a/content/common/service_worker/service_worker_types.h
+++ b/content/common/service_worker/service_worker_types.h
@@ -17,12 +17,12 @@
 #include "content/common/content_export.h"
 #include "content/public/common/referrer.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_state.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 #include "url/gurl.h"
 
 // This file is to have common definitions that are to be shared by
diff --git a/content/common/service_worker/service_worker_utils.cc b/content/common/service_worker/service_worker_utils.cc
index f4550db..fca9310 100644
--- a/content/common/service_worker/service_worker_utils.cc
+++ b/content/common/service_worker/service_worker_utils.cc
@@ -17,7 +17,7 @@
 #include "net/http/http_byte_range.h"
 #include "net/http/http_util.h"
 #include "services/network/public/cpp/features.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 namespace content {
 
diff --git a/content/common/shared_worker/shared_worker_factory.mojom b/content/common/shared_worker/shared_worker_factory.mojom
index cdc72033..49175680 100644
--- a/content/common/shared_worker/shared_worker_factory.mojom
+++ b/content/common/shared_worker/shared_worker_factory.mojom
@@ -4,7 +4,6 @@
 
 module content.mojom;
 
-import "content/common/service_worker/controller_service_worker.mojom";
 import "content/common/service_worker/service_worker_provider.mojom";
 import "content/common/shared_worker/shared_worker.mojom";
 import "content/common/shared_worker/shared_worker_host.mojom";
@@ -15,6 +14,7 @@
 import "mojo/public/mojom/base/unguessable_token.mojom";
 import "services/network/public/mojom/url_loader_factory.mojom";
 import "services/service_manager/public/mojom/interface_provider.mojom";
+import "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom";
 import "third_party/blink/public/mojom/shared_worker/worker_main_script_load_params.mojom";
 import "third_party/blink/public/web/worker_content_settings_proxy.mojom";
 
@@ -86,7 +86,7 @@
       //
       // In S13nServiceWorker, the controller is sent via
       // ServiceWorkerContainer.SetController().
-      ControllerServiceWorkerInfo? controller_info,
+      blink.mojom.ControllerServiceWorkerInfo? controller_info,
 
       SharedWorkerHost host,
       SharedWorker& shared_worker,
diff --git a/content/public/browser/background_fetch_description.cc b/content/public/browser/background_fetch_description.cc
index cc3b5af2..178015204 100644
--- a/content/public/browser/background_fetch_description.cc
+++ b/content/public/browser/background_fetch_description.cc
@@ -13,8 +13,8 @@
     SkBitmap icon,
     int completed_parts,
     int total_parts,
-    int completed_parts_size,
-    int total_parts_size,
+    uint64_t completed_parts_size,
+    uint64_t total_parts_size,
     std::vector<std::string> outstanding_guids,
     bool start_paused)
     : job_unique_id(job_unique_id),
diff --git a/content/public/browser/background_fetch_description.h b/content/public/browser/background_fetch_description.h
index be9984d..5d5d9ef 100644
--- a/content/public/browser/background_fetch_description.h
+++ b/content/public/browser/background_fetch_description.h
@@ -5,7 +5,9 @@
 #ifndef CONTENT_PUBLIC_BROWSER_BACKGROUND_FETCH_DESCRIPTION_H_
 #define CONTENT_PUBLIC_BROWSER_BACKGROUND_FETCH_DESCRIPTION_H_
 
+#include <stdint.h>
 #include <vector>
+
 #include "content/common/content_export.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "url/origin.h"
@@ -21,8 +23,8 @@
                              SkBitmap icon,
                              int completed_parts,
                              int total_parts,
-                             int completed_parts_size,
-                             int total_parts_size,
+                             uint64_t completed_parts_size,
+                             uint64_t total_parts_size,
                              std::vector<std::string> outstanding_guids,
                              bool start_paused);
   ~BackgroundFetchDescription();
@@ -33,8 +35,8 @@
   SkBitmap icon;
   int completed_parts;
   int total_parts;
-  int completed_parts_size;
-  int total_parts_size;
+  uint64_t completed_parts_size;
+  uint64_t total_parts_size;
   std::vector<std::string> outstanding_guids;
   bool start_paused;
 
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h
index c462710..ab71ef2 100644
--- a/content/public/browser/render_process_host.h
+++ b/content/public/browser/render_process_host.h
@@ -25,7 +25,7 @@
 #include "media/media_buildflags.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 #include "ui/gfx/native_widget_types.h"
 
 #if defined(OS_ANDROID)
diff --git a/content/public/browser/shared_cors_origin_access_list.h b/content/public/browser/shared_cors_origin_access_list.h
index 6e2854c..8024ad4 100644
--- a/content/public/browser/shared_cors_origin_access_list.h
+++ b/content/public/browser/shared_cors_origin_access_list.h
@@ -22,8 +22,14 @@
 
 // A public interface to manage CORS origin access lists on the UI thread.
 // The shared network::cors::OriginAccessList instance can only be accessed on
-// the IO thread. Callers on UI thread must use this wrapper class.
-// TODO(toyoshim): Remove once the NetworkService is enabled.
+// the IO thread if NetworkService is not enabled. Callers on UI thread must use
+// this wrapper class to make it work with and without NetworkService until
+// NetworkService is fully enabled. If NetworkService is enabled,
+// network::cors::OriginAccessList is accessed only on the UI thread, and all
+// calls can be finished synchronously. This is used for remembering per-profile
+// access lists in the browser process.
+// TODO(toyoshim): Remove this class, and use network::cors::OriginAccessList
+// directly once NetworkService is fully enabled.
 class CONTENT_EXPORT SharedCorsOriginAccessList
     : public base::RefCountedThreadSafe<SharedCorsOriginAccessList> {
  public:
@@ -33,7 +39,7 @@
   // instance so that its IsAllowed() method works for all users that refer the
   // shared network::cors::OriginAccessList instance returned by
   // origin_access_list() below. |allow_patterns| and |block_patterns| will be
-  // moved so to pass the lists to the IO thread.
+  // moved so to pass the lists to the IO thread if NetworkService is disabled.
   // Should be called on the UI thread, and |closure| runs on the UI thread too.
   virtual void SetForOrigin(
       const url::Origin& source_origin,
diff --git a/content/public/renderer/associated_resource_fetcher.h b/content/public/renderer/associated_resource_fetcher.h
index 004974c..d83fd72 100644
--- a/content/public/renderer/associated_resource_fetcher.h
+++ b/content/public/renderer/associated_resource_fetcher.h
@@ -9,7 +9,7 @@
 
 #include "base/callback.h"
 #include "content/common/content_export.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 
 class GURL;
diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc
index 8f891a8..da16158 100644
--- a/content/public/renderer/content_renderer_client.cc
+++ b/content/public/renderer/content_renderer_client.cc
@@ -288,4 +288,6 @@
   return true;
 }
 
+void ContentRendererClient::DidSetUserAgent(const std::string& user_agent) {}
+
 }  // namespace content
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h
index f3bd63d..d002c178 100644
--- a/content/public/renderer/content_renderer_client.h
+++ b/content/public/renderer/content_renderer_client.h
@@ -437,6 +437,10 @@
 
   // Returns true if it is safe to redirect to |url|, otherwise returns false.
   virtual bool IsSafeRedirectTarget(const GURL& url);
+
+  // The user agent string is given from the browser process. This is called at
+  // most once.
+  virtual void DidSetUserAgent(const std::string& user_agent);
 };
 
 }  // namespace content
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc
index 80c8909f..f045298 100644
--- a/content/public/test/mock_render_process_host.cc
+++ b/content/public/test/mock_render_process_host.cc
@@ -39,7 +39,6 @@
 #include "media/media_buildflags.h"
 #include "mojo/public/cpp/bindings/associated_interface_ptr.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
-#include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
 
 namespace content {
 
diff --git a/content/public/test/test_utils.cc b/content/public/test/test_utils.cc
index 003e15a..a82028f 100644
--- a/content/public/test/test_utils.cc
+++ b/content/public/test/test_utils.cc
@@ -38,7 +38,7 @@
 #include "content/public/test/test_launcher.h"
 #include "content/public/test/test_service_manager_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "url/url_util.h"
 
 namespace content {
diff --git a/content/public/test/test_utils.h b/content/public/test/test_utils.h
index 3a9dd1f35..e86315f 100644
--- a/content/public/test/test_utils.h
+++ b/content/public/test/test_utils.h
@@ -22,7 +22,7 @@
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_source.h"
 #include "content/public/browser/web_contents_observer.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 
 #if defined(OS_ANDROID)
 #include <jni.h>
diff --git a/content/renderer/fetchers/multi_resolution_image_resource_fetcher.h b/content/renderer/fetchers/multi_resolution_image_resource_fetcher.h
index 7dcc783..d72a651 100644
--- a/content/renderer/fetchers/multi_resolution_image_resource_fetcher.h
+++ b/content/renderer/fetchers/multi_resolution_image_resource_fetcher.h
@@ -11,7 +11,7 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "url/gurl.h"
 
diff --git a/content/renderer/image_downloader/image_downloader_base.cc b/content/renderer/image_downloader/image_downloader_base.cc
index f5eab2c..efbd415 100644
--- a/content/renderer/image_downloader/image_downloader_base.cc
+++ b/content/renderer/image_downloader/image_downloader_base.cc
@@ -14,7 +14,7 @@
 #include "content/public/renderer/render_thread.h"
 #include "content/renderer/fetchers/multi_resolution_image_resource_fetcher.h"
 #include "net/base/data_url.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "ui/gfx/favicon_size.h"
diff --git a/content/renderer/internal_document_state_data.h b/content/renderer/internal_document_state_data.h
index edfdd6ff..2a3750b 100644
--- a/content/renderer/internal_document_state_data.h
+++ b/content/renderer/internal_document_state_data.h
@@ -10,7 +10,7 @@
 
 #include "base/macros.h"
 #include "base/supports_user_data.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "url/gurl.h"
 
 namespace blink {
diff --git a/content/renderer/loader/url_loader_client_impl_unittest.cc b/content/renderer/loader/url_loader_client_impl_unittest.cc
index 42a3691b..1ee557c 100644
--- a/content/renderer/loader/url_loader_client_impl_unittest.cc
+++ b/content/renderer/loader/url_loader_client_impl_unittest.cc
@@ -17,7 +17,7 @@
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
 
 namespace content {
diff --git a/content/renderer/loader/web_url_request_util.cc b/content/renderer/loader/web_url_request_util.cc
index 6197434a..32e127e 100644
--- a/content/renderer/loader/web_url_request_util.cc
+++ b/content/renderer/loader/web_url_request_util.cc
@@ -25,9 +25,9 @@
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/mojom/blob/blob_registry.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/file_path_conversion.h"
 #include "third_party/blink/public/platform/interface_provider.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_data.h"
 #include "third_party/blink/public/platform/web_http_body.h"
diff --git a/content/renderer/loader/web_url_request_util.h b/content/renderer/loader/web_url_request_util.h
index de7df07..58d5763 100644
--- a/content/renderer/loader/web_url_request_util.h
+++ b/content/renderer/loader/web_url_request_util.h
@@ -13,7 +13,7 @@
 #include "services/network/public/cpp/resource_request_body.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
 #include "third_party/blink/public/mojom/blob/blob_registry.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_mixed_content_context_type.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
index ac039e1..22ce98b0 100644
--- a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
+++ b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
@@ -1848,13 +1848,14 @@
 
 void RTCPeerConnectionHandler::StartEventLog() {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
+  constexpr int64_t kOutputPeriodMs = 5000;
   // TODO(eladalon): StartRtcEventLog() return value is not useful; remove it
   // or find a way to be able to use it.
   // https://crbug.com/775415
   native_peer_connection_->StartRtcEventLog(
       std::make_unique<RtcEventLogOutputSinkProxy>(
           peer_connection_observer_.get()),
-      webrtc::RtcEventLog::kImmediateOutput);
+      kOutputPeriodMs);
 }
 
 void RTCPeerConnectionHandler::StopEventLog() {
diff --git a/content/renderer/navigation_client.cc b/content/renderer/navigation_client.cc
index a9d8f577..3dfdd6f3 100644
--- a/content/renderer/navigation_client.cc
+++ b/content/renderer/navigation_client.cc
@@ -21,7 +21,7 @@
     std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders,
     base::Optional<std::vector<::content::mojom::TransferrableURLLoaderPtr>>
         subresource_overrides,
-    mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
     network::mojom::URLLoaderFactoryPtr prefetch_loader_factory,
     const base::UnguessableToken& devtools_navigation_token,
     CommitNavigationCallback callback) {
diff --git a/content/renderer/navigation_client.h b/content/renderer/navigation_client.h
index b8f8d69..325a399 100644
--- a/content/renderer/navigation_client.h
+++ b/content/renderer/navigation_client.h
@@ -26,7 +26,8 @@
       std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders,
       base::Optional<std::vector<::content::mojom::TransferrableURLLoaderPtr>>
           subresource_overrides,
-      mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr
+          controller_service_worker_info,
       network::mojom::URLLoaderFactoryPtr prefetch_loader_factory,
       const base::UnguessableToken& devtools_navigation_token,
       CommitNavigationCallback callback) override;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 3448d04..31099711 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -172,10 +172,10 @@
 #include "third_party/blink/public/common/frame/user_activation_update_type.h"
 #include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
 #include "third_party/blink/public/platform/file_path_conversion.h"
 #include "third_party/blink/public/platform/interface_provider.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/modules/permissions/permission.mojom.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/public/platform/url_conversion.h"
@@ -3192,7 +3192,7 @@
     std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories,
     base::Optional<std::vector<mojom::TransferrableURLLoaderPtr>>
         subresource_overrides,
-    mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
     network::mojom::URLLoaderFactoryPtr prefetch_loader_factory,
     const base::UnguessableToken& devtools_navigation_token,
     CommitNavigationCallback callback) {
@@ -7293,7 +7293,8 @@
 std::unique_ptr<blink::WebServiceWorkerNetworkProvider>
 RenderFrameImpl::BuildServiceWorkerNetworkProviderForNavigation(
     const RequestNavigationParams* request_params,
-    mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info) {
+    blink::mojom::ControllerServiceWorkerInfoPtr
+        controller_service_worker_info) {
   scoped_refptr<network::SharedURLLoaderFactory> fallback_factory =
       network::SharedURLLoaderFactory::Create(
           GetLoaderFactoryBundle()->CloneWithoutDefaultFactory());
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 3e509e8..a6b35fc 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -75,11 +75,11 @@
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
 #include "third_party/blink/public/common/frame/frame_owner_element_type.h"
 #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/manifest/manifest_manager.mojom.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/platform/autoplay.mojom.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/platform/web_effective_connection_type.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/public/platform/web_loading_behavior_flag.h"
@@ -544,7 +544,8 @@
       std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders,
       base::Optional<std::vector<mojom::TransferrableURLLoaderPtr>>
           subresource_overrides,
-      mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr
+          controller_service_worker_info,
       network::mojom::URLLoaderFactoryPtr prefetch_loader_factory,
       const base::UnguessableToken& devtools_navigation_token,
       CommitNavigationCallback callback) override;
@@ -1291,7 +1292,8 @@
   std::unique_ptr<blink::WebServiceWorkerNetworkProvider>
   BuildServiceWorkerNetworkProviderForNavigation(
       const RequestNavigationParams* request_params,
-      mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info);
+      blink::mojom::ControllerServiceWorkerInfoPtr
+          controller_service_worker_info);
 
   // Stores the WebLocalFrame we are associated with.  This is null from the
   // constructor until BindToFrame() is called, and it is null after
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 68682fd..f706c47 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -2205,6 +2205,7 @@
 void RenderThreadImpl::SetUserAgent(const std::string& user_agent) {
   DCHECK(user_agent_.IsNull());
   user_agent_ = WebString::FromUTF8(user_agent);
+  GetContentClient()->renderer()->DidSetUserAgent(user_agent);
 }
 
 void RenderThreadImpl::UpdateScrollbarTheme(
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index 63e86af..b36a2df3 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -25,8 +25,8 @@
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/common/screen_orientation/web_screen_orientation_type.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
 #include "third_party/blink/public/mojom/loader/code_cache.mojom.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom.h"
 #include "third_party/blink/public/platform/modules/webdatabase/web_database.mojom.h"
 
 #if defined(OS_LINUX)
diff --git a/content/renderer/service_worker/controller_service_worker_connector.cc b/content/renderer/service_worker/controller_service_worker_connector.cc
index b9900a2..317da90 100644
--- a/content/renderer/service_worker/controller_service_worker_connector.cc
+++ b/content/renderer/service_worker/controller_service_worker_connector.cc
@@ -12,7 +12,7 @@
 
 ControllerServiceWorkerConnector::ControllerServiceWorkerConnector(
     mojom::ServiceWorkerContainerHostPtrInfo container_host_info,
-    mojom::ControllerServiceWorkerPtr controller_ptr,
+    blink::mojom::ControllerServiceWorkerPtr controller_ptr,
     const std::string& client_id)
     : client_id_(client_id) {
   container_host_ptr_.Bind(std::move(container_host_info));
@@ -22,14 +22,14 @@
   SetControllerServiceWorkerPtr(std::move(controller_ptr));
 }
 
-mojom::ControllerServiceWorker*
+blink::mojom::ControllerServiceWorker*
 ControllerServiceWorkerConnector::GetControllerServiceWorker(
     mojom::ControllerServiceWorkerPurpose purpose) {
   switch (state_) {
     case State::kDisconnected: {
       DCHECK(!controller_service_worker_);
       DCHECK(container_host_ptr_);
-      mojom::ControllerServiceWorkerPtr controller_ptr;
+      blink::mojom::ControllerServiceWorkerPtr controller_ptr;
       container_host_ptr_->EnsureControllerServiceWorker(
           mojo::MakeRequest(&controller_ptr), purpose);
       SetControllerServiceWorkerPtr(std::move(controller_ptr));
@@ -73,12 +73,12 @@
 }
 
 void ControllerServiceWorkerConnector::AddBinding(
-    mojom::ControllerServiceWorkerConnectorRequest request) {
+    blink::mojom::ControllerServiceWorkerConnectorRequest request) {
   bindings_.AddBinding(this, std::move(request));
 }
 
 void ControllerServiceWorkerConnector::UpdateController(
-    mojom::ControllerServiceWorkerPtr controller_ptr) {
+    blink::mojom::ControllerServiceWorkerPtr controller_ptr) {
   if (state_ == State::kNoContainerHost)
     return;
   SetControllerServiceWorkerPtr(std::move(controller_ptr));
@@ -87,7 +87,7 @@
 }
 
 void ControllerServiceWorkerConnector::SetControllerServiceWorkerPtr(
-    mojom::ControllerServiceWorkerPtr controller_ptr) {
+    blink::mojom::ControllerServiceWorkerPtr controller_ptr) {
   controller_service_worker_ = std::move(controller_ptr);
   if (controller_service_worker_) {
     controller_service_worker_.set_connection_error_handler(base::BindOnce(
diff --git a/content/renderer/service_worker/controller_service_worker_connector.h b/content/renderer/service_worker/controller_service_worker_connector.h
index 49a66ad..ae625ab 100644
--- a/content/renderer/service_worker/controller_service_worker_connector.h
+++ b/content/renderer/service_worker/controller_service_worker_connector.h
@@ -11,9 +11,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/observer_list.h"
 #include "content/common/content_export.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
 #include "content/common/service_worker/service_worker_container.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 
 namespace content {
 
@@ -26,7 +26,7 @@
 // ServiceWorkerProviderContext::ControlleeState and
 // ServiceWorkerSubresourceLoader{,Factory}.
 class CONTENT_EXPORT ControllerServiceWorkerConnector
-    : public mojom::ControllerServiceWorkerConnector,
+    : public blink::mojom::ControllerServiceWorkerConnector,
       public base::RefCounted<ControllerServiceWorkerConnector> {
  public:
   // Observes the connection to the controller.
@@ -64,12 +64,12 @@
   // original |container_host|).
   ControllerServiceWorkerConnector(
       mojom::ServiceWorkerContainerHostPtrInfo container_host_info,
-      mojom::ControllerServiceWorkerPtr controller_ptr,
+      blink::mojom::ControllerServiceWorkerPtr controller_ptr,
       const std::string& client_id);
 
   // This may return nullptr if the connection to the ContainerHost (in the
   // browser process) is already terminated.
-  mojom::ControllerServiceWorker* GetControllerServiceWorker(
+  blink::mojom::ControllerServiceWorker* GetControllerServiceWorker(
       mojom::ControllerServiceWorkerPurpose purpose);
 
   void AddObserver(Observer* observer);
@@ -78,11 +78,12 @@
   void OnContainerHostConnectionClosed();
   void OnControllerConnectionClosed();
 
-  void AddBinding(mojom::ControllerServiceWorkerConnectorRequest request);
+  void AddBinding(
+      blink::mojom::ControllerServiceWorkerConnectorRequest request);
 
-  // mojom::ControllerServiceWorkerConnector:
+  // blink::mojom::ControllerServiceWorkerConnector:
   void UpdateController(
-      mojom::ControllerServiceWorkerPtr controller_ptr) override;
+      blink::mojom::ControllerServiceWorkerPtr controller_ptr) override;
 
   State state() const { return state_; }
 
@@ -90,21 +91,21 @@
 
  private:
   void SetControllerServiceWorkerPtr(
-      mojom::ControllerServiceWorkerPtr controller_ptr);
+      blink::mojom::ControllerServiceWorkerPtr controller_ptr);
 
   State state_ = State::kDisconnected;
 
   friend class base::RefCounted<ControllerServiceWorkerConnector>;
   ~ControllerServiceWorkerConnector() override;
 
-  mojo::BindingSet<mojom::ControllerServiceWorkerConnector> bindings_;
+  mojo::BindingSet<blink::mojom::ControllerServiceWorkerConnector> bindings_;
 
   // Connection to the container host in the browser process.
   mojom::ServiceWorkerContainerHostPtr container_host_ptr_;
 
   // Connection to the controller service worker, which lives in a renderer
   // process that's not necessarily the same as this connector.
-  mojom::ControllerServiceWorkerPtr controller_service_worker_;
+  blink::mojom::ControllerServiceWorkerPtr controller_service_worker_;
 
   base::ObserverList<Observer>::Unchecked observer_list_;
 
diff --git a/content/renderer/service_worker/controller_service_worker_impl.cc b/content/renderer/service_worker/controller_service_worker_impl.cc
index 66db6a3..2f7498c8 100644
--- a/content/renderer/service_worker/controller_service_worker_impl.cc
+++ b/content/renderer/service_worker/controller_service_worker_impl.cc
@@ -10,7 +10,7 @@
 namespace content {
 
 ControllerServiceWorkerImpl::ControllerServiceWorkerImpl(
-    mojom::ControllerServiceWorkerRequest request,
+    blink::mojom::ControllerServiceWorkerRequest request,
     base::WeakPtr<ServiceWorkerContextClient> context_client)
     : context_client_(std::move(context_client)) {
   CHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
@@ -20,7 +20,7 @@
 ControllerServiceWorkerImpl::~ControllerServiceWorkerImpl() = default;
 
 void ControllerServiceWorkerImpl::Clone(
-    mojom::ControllerServiceWorkerRequest request) {
+    blink::mojom::ControllerServiceWorkerRequest request) {
   bindings_.AddBinding(this, std::move(request));
 }
 
diff --git a/content/renderer/service_worker/controller_service_worker_impl.h b/content/renderer/service_worker/controller_service_worker_impl.h
index ebda20b..d897b78 100644
--- a/content/renderer/service_worker/controller_service_worker_impl.h
+++ b/content/renderer/service_worker/controller_service_worker_impl.h
@@ -8,8 +8,8 @@
 #include <utility>
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 
 namespace content {
 
@@ -18,7 +18,7 @@
 // S13nServiceWorker:
 // An instance of this class is created on the service worker thread
 // when ServiceWorkerContextClient's WorkerContextData is created.
-// This implements mojom::ControllerServiceWorker and its Mojo endpoint
+// This implements blink::mojom::ControllerServiceWorker and its Mojo endpoint
 // is connected by each controllee and also by the ServiceWorkerProviderHost
 // in the browser process.
 // Subresource requests made by the controllees are sent to this class as
@@ -27,27 +27,28 @@
 // TODO(kinuko): Implement self-killing timer, that does something similar to
 // what ServiceWorkerVersion::StopWorkerIfIdle does in the browser process in
 // non-S13n code.
-class ControllerServiceWorkerImpl : public mojom::ControllerServiceWorker {
+class ControllerServiceWorkerImpl
+    : public blink::mojom::ControllerServiceWorker {
  public:
   // |context_client|'s weak pointer is the one that is bound to the worker
   // thread. (It should actually outlive this instance, but allow us to make
   // sure the thread safety)
   ControllerServiceWorkerImpl(
-      mojom::ControllerServiceWorkerRequest request,
+      blink::mojom::ControllerServiceWorkerRequest request,
       base::WeakPtr<ServiceWorkerContextClient> context_client);
   ~ControllerServiceWorkerImpl() override;
 
-  // mojom::ControllerServiceWorker:
+  // blink::mojom::ControllerServiceWorker:
   void DispatchFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
       blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       DispatchFetchEventCallback callback) override;
-  void Clone(mojom::ControllerServiceWorkerRequest request) override;
+  void Clone(blink::mojom::ControllerServiceWorkerRequest request) override;
 
  private:
   // Connected by the ServiceWorkerProviderHost in the browser process
   // and by the controllees.
-  mojo::BindingSet<mojom::ControllerServiceWorker> bindings_;
+  mojo::BindingSet<blink::mojom::ControllerServiceWorker> bindings_;
 
   base::WeakPtr<ServiceWorkerContextClient> context_client_;
 
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index dce6f2a..fd5e24d 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -584,7 +584,7 @@
     bool is_starting_installed_worker,
     RendererPreferences renderer_preferences,
     mojom::ServiceWorkerRequest service_worker_request,
-    mojom::ControllerServiceWorkerRequest controller_request,
+    blink::mojom::ControllerServiceWorkerRequest controller_request,
     mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
     mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
     std::unique_ptr<EmbeddedWorkerInstanceClientImpl> embedded_worker_client,
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index f289f7a..a99b1e86 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -19,7 +19,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
 #include "content/common/service_worker/embedded_worker.mojom.h"
 #include "content/common/service_worker/service_worker.mojom.h"
 #include "content/common/service_worker/service_worker_provider.mojom.h"
@@ -29,6 +28,7 @@
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
 #include "third_party/blink/public/mojom/blob/blob_registry.mojom.h"
 #include "third_party/blink/public/mojom/payments/payment_app.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
@@ -91,7 +91,7 @@
       bool is_starting_installed_worker,
       RendererPreferences renderer_preferences,
       mojom::ServiceWorkerRequest service_worker_request,
-      mojom::ControllerServiceWorkerRequest controller_request,
+      blink::mojom::ControllerServiceWorkerRequest controller_request,
       mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
       mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info,
       std::unique_ptr<EmbeddedWorkerInstanceClientImpl> embedded_worker_client,
@@ -378,7 +378,7 @@
 
   // These Mojo objects are bound on the worker thread.
   mojom::ServiceWorkerRequest pending_service_worker_request_;
-  mojom::ControllerServiceWorkerRequest pending_controller_request_;
+  blink::mojom::ControllerServiceWorkerRequest pending_controller_request_;
 
   // This is bound on the main thread.
   scoped_refptr<mojom::ThreadSafeEmbeddedWorkerInstanceHostAssociatedPtr>
diff --git a/content/renderer/service_worker/service_worker_context_client_unittest.cc b/content/renderer/service_worker/service_worker_context_client_unittest.cc
index f8acc4a..4e8ef98 100644
--- a/content/renderer/service_worker/service_worker_context_client_unittest.cc
+++ b/content/renderer/service_worker/service_worker_context_client_unittest.cc
@@ -50,7 +50,7 @@
 struct ContextClientPipes {
   // From the browser to ServiceWorkerContextClient.
   mojom::ServiceWorkerPtr service_worker;
-  mojom::ControllerServiceWorkerPtr controller;
+  blink::mojom::ControllerServiceWorkerPtr controller;
   blink::mojom::ServiceWorkerRegistrationObjectAssociatedPtr registration;
 
   // From ServiceWorkerContextClient to the browser.
@@ -467,7 +467,7 @@
   const GURL expected_url("https://example.com/expected");
 
   // FetchEvent dispatched directly from the controlled clients through
-  // mojom::ControllerServiceWorker should be queued in the idle state.
+  // blink::mojom::ControllerServiceWorker should be queued in the idle state.
   {
     blink::mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
     blink::mojom::ServiceWorkerFetchResponseCallbackRequest
@@ -518,7 +518,7 @@
       fetch_callback_request_2;
 
   // FetchEvent dispatched directly from the controlled clients through
-  // mojom::ControllerServiceWorker should be queued in the idle state.
+  // blink::mojom::ControllerServiceWorker should be queued in the idle state.
   {
     blink::mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
     fetch_callback_request_1 = mojo::MakeRequest(&fetch_callback_ptr);
diff --git a/content/renderer/service_worker/service_worker_network_provider.cc b/content/renderer/service_worker/service_worker_network_provider.cc
index e8062bd3..3a7bbbe 100644
--- a/content/renderer/service_worker/service_worker_network_provider.cc
+++ b/content/renderer/service_worker/service_worker_network_provider.cc
@@ -160,7 +160,7 @@
     int route_id,
     const RequestNavigationParams* request_params,
     blink::WebLocalFrame* frame,
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory) {
   // Determine if a ServiceWorkerNetworkProvider should be created and properly
   // initialized for the navigation. A default ServiceWorkerNetworkProvider
@@ -214,7 +214,7 @@
     mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info,
     network::mojom::URLLoaderFactoryAssociatedPtrInfo
         script_loader_factory_info,
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory) {
   // S13nServiceWorker: |info| holds info about the precreated provider host.
   if (info) {
@@ -286,7 +286,7 @@
     blink::mojom::ServiceWorkerProviderType provider_type,
     int provider_id,
     bool is_parent_frame_secure,
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory) {
   DCHECK_NE(provider_id, kInvalidServiceWorkerProviderId);
   DCHECK(provider_type == blink::mojom::ServiceWorkerProviderType::kForWindow ||
@@ -325,7 +325,7 @@
     mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info,
     network::mojom::URLLoaderFactoryAssociatedPtrInfo
         script_loader_factory_info,
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory) {
   context_ = base::MakeRefCounted<ServiceWorkerProviderContext>(
       info->provider_id,
diff --git a/content/renderer/service_worker/service_worker_network_provider.h b/content/renderer/service_worker/service_worker_network_provider.h
index ea98eb7..a16382d2 100644
--- a/content/renderer/service_worker/service_worker_network_provider.h
+++ b/content/renderer/service_worker/service_worker_network_provider.h
@@ -15,9 +15,9 @@
 #include "base/memory/weak_ptr.h"
 #include "base/supports_user_data.h"
 #include "content/common/content_export.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
 #include "content/common/service_worker/service_worker_provider.mojom.h"
 #include "content/renderer/service_worker/service_worker_provider_context.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
 
 namespace blink {
@@ -81,7 +81,7 @@
       int route_id,
       const RequestNavigationParams* request_params,
       blink::WebLocalFrame* frame,
-      mojom::ControllerServiceWorkerInfoPtr controller_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
       scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory);
 
   // Creates a ServiceWorkerNetworkProvider for a shared worker (as a
@@ -94,7 +94,7 @@
       mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info,
       network::mojom::URLLoaderFactoryAssociatedPtrInfo
           script_loader_factory_info,
-      mojom::ControllerServiceWorkerInfoPtr controller_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
       scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory);
 
   // Creates a ServiceWorkerNetworkProvider for a "controller" (i.e.
@@ -140,14 +140,14 @@
       blink::mojom::ServiceWorkerProviderType type,
       int provider_id,
       bool is_parent_frame_secure,
-      mojom::ControllerServiceWorkerInfoPtr controller_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
       scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory);
 
   ServiceWorkerNetworkProvider(
       mojom::ServiceWorkerProviderInfoForSharedWorkerPtr info,
       network::mojom::URLLoaderFactoryAssociatedPtrInfo
           script_loader_factory_info,
-      mojom::ControllerServiceWorkerInfoPtr controller_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
       scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory);
 
   // This is for controllers, used in CreateForController.
diff --git a/content/renderer/service_worker/service_worker_provider_context.cc b/content/renderer/service_worker/service_worker_provider_context.cc
index c4e30d4e..c88382508 100644
--- a/content/renderer/service_worker/service_worker_provider_context.cc
+++ b/content/renderer/service_worker/service_worker_provider_context.cc
@@ -35,13 +35,13 @@
 
 void CreateSubresourceLoaderFactoryForProviderContext(
     mojom::ServiceWorkerContainerHostPtrInfo container_host_info,
-    mojom::ControllerServiceWorkerPtrInfo controller_ptr_info,
+    blink::mojom::ControllerServiceWorkerPtrInfo controller_ptr_info,
     const std::string& client_id,
     std::unique_ptr<network::SharedURLLoaderFactoryInfo> fallback_factory_info,
-    mojom::ControllerServiceWorkerConnectorRequest connector_request,
+    blink::mojom::ControllerServiceWorkerConnectorRequest connector_request,
     network::mojom::URLLoaderFactoryRequest request,
     scoped_refptr<base::SequencedTaskRunner> task_runner) {
-  mojom::ControllerServiceWorkerPtr controller_ptr;
+  blink::mojom::ControllerServiceWorkerPtr controller_ptr;
   controller_ptr.Bind(std::move(controller_ptr_info));
   auto connector = base::MakeRefCounted<ControllerServiceWorkerConnector>(
       std::move(container_host_info), std::move(controller_ptr), client_id);
@@ -60,7 +60,7 @@
     blink::mojom::ServiceWorkerProviderType provider_type,
     mojom::ServiceWorkerContainerAssociatedRequest request,
     mojom::ServiceWorkerContainerHostAssociatedPtrInfo host_ptr_info,
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory)
     : provider_type_(provider_type),
       provider_id_(provider_id),
@@ -253,7 +253,7 @@
 }
 
 void ServiceWorkerProviderContext::SetController(
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     const std::vector<blink::mojom::WebFeature>& used_features,
     bool should_notify_controllerchange) {
   DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
@@ -317,7 +317,7 @@
       // depending on when the request is actually passed to the factory (this
       // part is inherently racy).
       state->controller_connector->UpdateController(
-          mojom::ControllerServiceWorkerPtr(
+          blink::mojom::ControllerServiceWorkerPtr(
               std::move(state->controller_endpoint)));
     }
   }
diff --git a/content/renderer/service_worker/service_worker_provider_context.h b/content/renderer/service_worker/service_worker_provider_context.h
index 898cf11..4737038 100644
--- a/content/renderer/service_worker/service_worker_provider_context.h
+++ b/content/renderer/service_worker/service_worker_provider_context.h
@@ -15,13 +15,13 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner_helpers.h"
 #include "content/common/content_export.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
 #include "content/common/service_worker/service_worker_container.mojom.h"
 #include "content/common/service_worker/service_worker_provider.mojom.h"
 #include "content/renderer/service_worker/service_worker_provider_state_for_client.h"
 #include "content/renderer/service_worker/web_service_worker_provider_impl.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
@@ -85,7 +85,7 @@
       blink::mojom::ServiceWorkerProviderType provider_type,
       mojom::ServiceWorkerContainerAssociatedRequest request,
       mojom::ServiceWorkerContainerHostAssociatedPtrInfo host_ptr_info,
-      mojom::ControllerServiceWorkerInfoPtr controller_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
       scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory);
 
   // Constructor for service worker execution contexts.
@@ -189,9 +189,10 @@
   void UnregisterWorkerFetchContext(mojom::ServiceWorkerWorkerClient*);
 
   // Implementation of mojom::ServiceWorkerContainer.
-  void SetController(mojom::ControllerServiceWorkerInfoPtr controller_info,
-                     const std::vector<blink::mojom::WebFeature>& used_features,
-                     bool should_notify_controllerchange) override;
+  void SetController(
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
+      const std::vector<blink::mojom::WebFeature>& used_features,
+      bool should_notify_controllerchange) override;
   void PostMessageToClient(blink::mojom::ServiceWorkerObjectInfoPtr source,
                            blink::TransferableMessage message) override;
   void CountFeature(blink::mojom::WebFeature feature) override;
diff --git a/content/renderer/service_worker/service_worker_provider_context_unittest.cc b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
index d729bab..b3e9f40 100644
--- a/content/renderer/service_worker/service_worker_provider_context_unittest.cc
+++ b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
@@ -173,12 +173,13 @@
 
 // S13nServiceWorker: a fake ControllerServiceWorker implementation that
 // basically does nothing but records DispatchFetchEvent calls.
-class FakeControllerServiceWorker : public mojom::ControllerServiceWorker {
+class FakeControllerServiceWorker
+    : public blink::mojom::ControllerServiceWorker {
  public:
   FakeControllerServiceWorker() = default;
   ~FakeControllerServiceWorker() override = default;
 
-  // mojom::ControllerServiceWorker:
+  // blink::mojom::ControllerServiceWorker:
   void DispatchFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
       blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
@@ -189,7 +190,7 @@
     if (fetch_event_callback_)
       std::move(fetch_event_callback_).Run();
   }
-  void Clone(mojom::ControllerServiceWorkerRequest request) override {
+  void Clone(blink::mojom::ControllerServiceWorkerRequest request) override {
     bindings_.AddBinding(this, std::move(request));
   }
 
@@ -207,7 +208,7 @@
   int fetch_event_count_ = 0;
   network::ResourceRequest fetch_event_request_;
   base::OnceClosure fetch_event_callback_;
-  mojo::BindingSet<mojom::ControllerServiceWorker> bindings_;
+  mojo::BindingSet<blink::mojom::ControllerServiceWorker> bindings_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeControllerServiceWorker);
 };
@@ -238,7 +239,7 @@
     NOTIMPLEMENTED();
   }
   void EnsureControllerServiceWorker(
-      mojom::ControllerServiceWorkerRequest request,
+      blink::mojom::ControllerServiceWorkerRequest request,
       mojom::ControllerServiceWorkerPurpose purpose) override {
     NOTIMPLEMENTED();
   }
@@ -321,7 +322,7 @@
         std::move(container_request), nullptr /* host_ptr_info */,
         nullptr /* controller_info */, nullptr /* loader_factory*/);
 
-    auto info = mojom::ControllerServiceWorkerInfo::New();
+    auto info = blink::mojom::ControllerServiceWorkerInfo::New();
     info->mode = blink::mojom::ControllerServiceWorkerMode::kControlled;
     info->object_info = std::move(object_info);
     container_ptr->SetController(std::move(info),
@@ -366,7 +367,7 @@
     provider_impl->SetClient(client.get());
     ASSERT_FALSE(client->was_set_controller_called());
 
-    auto info = mojom::ControllerServiceWorkerInfo::New();
+    auto info = blink::mojom::ControllerServiceWorkerInfo::New();
     info->mode = blink::mojom::ControllerServiceWorkerMode::kControlled;
     info->object_info = std::move(object_info);
     container_ptr->SetController(std::move(info),
@@ -400,7 +401,7 @@
   auto client = std::make_unique<MockWebServiceWorkerProviderClientImpl>();
   provider_impl->SetClient(client.get());
 
-  container_ptr->SetController(mojom::ControllerServiceWorkerInfo::New(),
+  container_ptr->SetController(blink::mojom::ControllerServiceWorkerInfo::New(),
                                std::vector<blink::mojom::WebFeature>(), true);
   base::RunLoop().RunUntilIdle();
 
@@ -435,8 +436,8 @@
 
   // Make the ControllerServiceWorkerInfo.
   FakeControllerServiceWorker fake_controller1;
-  auto controller_info1 = mojom::ControllerServiceWorkerInfo::New();
-  mojom::ControllerServiceWorkerPtr controller_ptr1;
+  auto controller_info1 = blink::mojom::ControllerServiceWorkerInfo::New();
+  blink::mojom::ControllerServiceWorkerPtr controller_ptr1;
   fake_controller1.Clone(mojo::MakeRequest(&controller_ptr1));
   controller_info1->mode =
       blink::mojom::ControllerServiceWorkerMode::kControlled;
@@ -475,8 +476,8 @@
       object_host2->CreateObjectInfo();
   EXPECT_EQ(1, object_host2->GetBindingCount());
   FakeControllerServiceWorker fake_controller2;
-  auto controller_info2 = mojom::ControllerServiceWorkerInfo::New();
-  mojom::ControllerServiceWorkerPtr controller_ptr2;
+  auto controller_info2 = blink::mojom::ControllerServiceWorkerInfo::New();
+  blink::mojom::ControllerServiceWorkerPtr controller_ptr2;
   fake_controller2.Clone(mojo::MakeRequest(&controller_ptr2));
   controller_info2->mode =
       blink::mojom::ControllerServiceWorkerMode::kControlled;
@@ -519,7 +520,7 @@
   // (3) Test if resetting the controller to nullptr works.
   base::RunLoop drop_binding_loop2;
   object_host2->RunOnConnectionError(drop_binding_loop2.QuitClosure());
-  container_ptr->SetController(mojom::ControllerServiceWorkerInfo::New(),
+  container_ptr->SetController(blink::mojom::ControllerServiceWorkerInfo::New(),
                                std::vector<blink::mojom::WebFeature>(), true);
 
   // The controller is reset. References to the old controller must be
@@ -560,8 +561,8 @@
       object_host4->CreateObjectInfo();
   EXPECT_EQ(1, object_host4->GetBindingCount());
   FakeControllerServiceWorker fake_controller4;
-  auto controller_info4 = mojom::ControllerServiceWorkerInfo::New();
-  mojom::ControllerServiceWorkerPtr controller_ptr4;
+  auto controller_info4 = blink::mojom::ControllerServiceWorkerInfo::New();
+  blink::mojom::ControllerServiceWorkerPtr controller_ptr4;
   fake_controller4.Clone(mojo::MakeRequest(&controller_ptr4));
   controller_info4->mode =
       blink::mojom::ControllerServiceWorkerMode::kControlled;
@@ -613,8 +614,7 @@
   // fetch event handler.
   blink::mojom::ServiceWorkerObjectInfoPtr object_info =
       object_host->CreateObjectInfo();
-  auto controller_info = mojom::ControllerServiceWorkerInfo::New();
-  mojom::ControllerServiceWorkerPtr controller_ptr;
+  auto controller_info = blink::mojom::ControllerServiceWorkerInfo::New();
   controller_info->mode =
       blink::mojom::ControllerServiceWorkerMode::kNoFetchEventHandler;
   controller_info->object_info = std::move(object_info);
diff --git a/content/renderer/service_worker/service_worker_provider_state_for_client.h b/content/renderer/service_worker/service_worker_provider_state_for_client.h
index 77ea29c..f307620 100644
--- a/content/renderer/service_worker/service_worker_provider_state_for_client.h
+++ b/content/renderer/service_worker/service_worker_provider_state_for_client.h
@@ -13,13 +13,13 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "content/common/content_export.h"
-#include "content/common/service_worker/controller_service_worker.mojom.h"
 #include "content/common/service_worker/service_worker_container.mojom.h"
 #include "content/common/service_worker/service_worker_provider.mojom.h"
 #include "content/renderer/service_worker/web_service_worker_provider_impl.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/platform/web_feature.mojom.h"
 
 namespace content {
@@ -88,8 +88,8 @@
   // subresource loader factory and lives on a background thread. This is
   // populated when GetSubresourceLoader() creates the subresource loader
   // factory and takes |controller_endpoint|.
-  mojom::ControllerServiceWorkerPtrInfo controller_endpoint;
-  mojom::ControllerServiceWorkerConnectorPtr controller_connector;
+  blink::mojom::ControllerServiceWorkerPtrInfo controller_endpoint;
+  blink::mojom::ControllerServiceWorkerConnectorPtr controller_connector;
 };
 
 }  // namespace content
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc
index 924883be..783b9a8 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader.cc
@@ -224,7 +224,7 @@
 void ServiceWorkerSubresourceLoader::DispatchFetchEvent() {
   blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_ptr;
   response_callback_binding_.Bind(mojo::MakeRequest(&response_callback_ptr));
-  mojom::ControllerServiceWorker* controller =
+  blink::mojom::ControllerServiceWorker* controller =
       controller_connector_->GetControllerServiceWorker(
           mojom::ControllerServiceWorkerPurpose::FETCH_SUB_RESOURCE);
 
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
index f3d1ed7..6c0bbca 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -122,7 +122,8 @@
   DISALLOW_COPY_AND_ASSIGN(FakeNetworkURLLoaderFactory);
 };
 
-class FakeControllerServiceWorker : public mojom::ControllerServiceWorker {
+class FakeControllerServiceWorker
+    : public blink::mojom::ControllerServiceWorker {
  public:
   FakeControllerServiceWorker() = default;
   ~FakeControllerServiceWorker() override = default;
@@ -239,7 +240,7 @@
     }
   }
 
-  // mojom::ControllerServiceWorker:
+  // blink::mojom::ControllerServiceWorker:
   void DispatchFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
       blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
@@ -335,7 +336,7 @@
       std::move(fetch_event_callback_).Run();
   }
 
-  void Clone(mojom::ControllerServiceWorkerRequest request) override {
+  void Clone(blink::mojom::ControllerServiceWorkerRequest request) override {
     bindings_.AddBinding(this, std::move(request));
   }
 
@@ -368,7 +369,7 @@
   int fetch_event_count_ = 0;
   network::ResourceRequest fetch_event_request_;
   base::OnceClosure fetch_event_callback_;
-  mojo::BindingSet<mojom::ControllerServiceWorker> bindings_;
+  mojo::BindingSet<blink::mojom::ControllerServiceWorker> bindings_;
 
   // For ResponseMode::kStream.
   blink::mojom::ServiceWorkerStreamHandlePtr stream_handle_;
@@ -420,7 +421,7 @@
     NOTIMPLEMENTED();
   }
   void EnsureControllerServiceWorker(
-      mojom::ControllerServiceWorkerRequest request,
+      blink::mojom::ControllerServiceWorkerRequest request,
       mojom::ControllerServiceWorkerPurpose purpose) override {
     get_controller_service_worker_count_++;
     if (!fake_controller_)
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
index ca81827..c5b5696 100644
--- a/content/renderer/shared_worker/embedded_shared_worker_stub.cc
+++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
@@ -220,7 +220,7 @@
         main_script_loader_factory,
     blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
     std::unique_ptr<URLLoaderFactoryBundleInfo> factory_bundle,
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     mojom::SharedWorkerHostPtr host,
     mojom::SharedWorkerRequest request,
     service_manager::mojom::InterfaceProviderPtr interface_provider)
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.h b/content/renderer/shared_worker/embedded_shared_worker_stub.h
index 5e895ba..2e340b7 100644
--- a/content/renderer/shared_worker/embedded_shared_worker_stub.h
+++ b/content/renderer/shared_worker/embedded_shared_worker_stub.h
@@ -73,7 +73,7 @@
           main_script_loader_factory,
       blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
       std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories,
-      mojom::ControllerServiceWorkerInfoPtr controller_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
       mojom::SharedWorkerHostPtr host,
       mojom::SharedWorkerRequest request,
       service_manager::mojom::InterfaceProviderPtr interface_provider);
@@ -139,7 +139,7 @@
   network::mojom::URLLoaderFactoryAssociatedPtrInfo main_script_loader_factory_;
 
   // NetworkService:
-  mojom::ControllerServiceWorkerInfoPtr controller_info_;
+  blink::mojom::ControllerServiceWorkerInfoPtr controller_info_;
 
   // S13nServiceWorker: The factory bundle used for loading subresources for
   // this shared worker.
diff --git a/content/renderer/shared_worker/shared_worker_factory_impl.cc b/content/renderer/shared_worker/shared_worker_factory_impl.cc
index e29a97c..0be432f6 100644
--- a/content/renderer/shared_worker/shared_worker_factory_impl.cc
+++ b/content/renderer/shared_worker/shared_worker_factory_impl.cc
@@ -34,7 +34,7 @@
         main_script_loader_factory,
     blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
     std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories,
-    mojom::ControllerServiceWorkerInfoPtr controller_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
     mojom::SharedWorkerHostPtr host,
     mojom::SharedWorkerRequest request,
     service_manager::mojom::InterfaceProviderPtr interface_provider) {
diff --git a/content/renderer/shared_worker/shared_worker_factory_impl.h b/content/renderer/shared_worker/shared_worker_factory_impl.h
index dcc0e45..12f9e59 100644
--- a/content/renderer/shared_worker/shared_worker_factory_impl.h
+++ b/content/renderer/shared_worker/shared_worker_factory_impl.h
@@ -35,7 +35,7 @@
           main_script_loader_factory,
       blink::mojom::WorkerMainScriptLoadParamsPtr main_script_load_params,
       std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories,
-      mojom::ControllerServiceWorkerInfoPtr controller_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
       mojom::SharedWorkerHostPtr host,
       mojom::SharedWorkerRequest request,
       service_manager::mojom::InterfaceProviderPtr interface_provider) override;
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 0b32b02c..7f65371 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -194,24 +194,6 @@
                                       render_frame_host);
 }
 
-void ShellContentBrowserClient::RegisterInProcessServices(
-    StaticServiceMap* services,
-    content::ServiceManagerConnection* connection) {
-#if defined(OS_CHROMEOS)
-  if (features::IsSingleProcessMash()) {
-    service_manager::EmbeddedServiceInfo info;
-    info.factory =
-        base::BindRepeating([]() -> std::unique_ptr<service_manager::Service> {
-          return ws::test::CreateInProcessWindowService(
-              GetContextFactory(), GetContextFactoryPrivate(),
-              CreateGpuInterfaceProvider());
-        });
-    info.task_runner = base::ThreadTaskRunnerHandle::Get();
-    services->insert(std::make_pair(test_ws::mojom::kServiceName, info));
-  }
-#endif
-}
-
 void ShellContentBrowserClient::RegisterOutOfProcessServices(
     OutOfProcessServiceMap* services) {
   (*services)[kTestServiceUrl] =
@@ -235,6 +217,16 @@
         media::CreateMediaServiceForTesting(std::move(request)));
   }
 #endif
+
+#if defined(OS_CHROMEOS)
+  if (features::IsSingleProcessMash() &&
+      service_name == test_ws::mojom::kServiceName) {
+    service_manager::Service::RunAsyncUntilTermination(
+        ws::test::CreateInProcessWindowService(
+            GetContextFactory(), GetContextFactoryPrivate(),
+            CreateGpuInterfaceProvider(), std::move(request)));
+  }
+#endif
 }
 
 bool ShellContentBrowserClient::ShouldTerminateOnServiceQuit(
diff --git a/content/shell/browser/shell_content_browser_client.h b/content/shell/browser/shell_content_browser_client.h
index 880ed172..ed340f4 100644
--- a/content/shell/browser/shell_content_browser_client.h
+++ b/content/shell/browser/shell_content_browser_client.h
@@ -38,8 +38,6 @@
       content::RenderFrameHost* render_frame_host,
       const std::string& interface_name,
       mojo::ScopedMessagePipeHandle interface_pipe) override;
-  void RegisterInProcessServices(StaticServiceMap* services,
-                                 ServiceManagerConnection* connection) override;
   void RegisterOutOfProcessServices(OutOfProcessServiceMap* services) override;
   void HandleServiceRequest(
       const std::string& service_name,
diff --git a/content/shell/utility/shell_content_utility_client.cc b/content/shell/utility/shell_content_utility_client.cc
index 79b5910..e42bb885 100644
--- a/content/shell/utility/shell_content_utility_client.cc
+++ b/content/shell/utility/shell_content_utility_client.cc
@@ -130,15 +130,20 @@
     info.factory = base::BindRepeating(&echo::CreateEchoService);
     services->insert(std::make_pair(echo::mojom::kServiceName, info));
   }
+}
 
+std::unique_ptr<service_manager::Service>
+ShellContentUtilityClient::HandleServiceRequest(
+    const std::string& service_name,
+    service_manager::mojom::ServiceRequest request) {
 #if defined(OS_CHROMEOS)
-  if (features::IsMultiProcessMash()) {
-    service_manager::EmbeddedServiceInfo info;
-    info.factory =
-        base::BindRepeating(&ws::test::CreateOutOfProcessWindowService);
-    services->insert(std::make_pair(test_ws::mojom::kServiceName, info));
+  if (features::IsMultiProcessMash() &&
+      service_name == test_ws::mojom::kServiceName) {
+    return ws::test::CreateOutOfProcessWindowService(std::move(request));
   }
 #endif
+
+  return nullptr;
 }
 
 void ShellContentUtilityClient::RegisterNetworkBinders(
diff --git a/content/shell/utility/shell_content_utility_client.h b/content/shell/utility/shell_content_utility_client.h
index ae0e351..53c02bc 100644
--- a/content/shell/utility/shell_content_utility_client.h
+++ b/content/shell/utility/shell_content_utility_client.h
@@ -20,6 +20,9 @@
   // ContentUtilityClient:
   void UtilityThreadStarted() override;
   void RegisterServices(StaticServiceMap* services) override;
+  std::unique_ptr<service_manager::Service> HandleServiceRequest(
+      const std::string& service_name,
+      service_manager::mojom::ServiceRequest request) override;
   void RegisterNetworkBinders(
       service_manager::BinderRegistry* registry) override;
   void RegisterAudioBinders(service_manager::BinderRegistry* registry) override;
diff --git a/content/test/data/accessibility/aria/aria-editable-expected-auralinux.txt b/content/test/data/accessibility/aria/aria-editable-expected-auralinux.txt
index e54a5f8..0d5871a 100644
--- a/content/test/data/accessibility/aria/aria-editable-expected-auralinux.txt
+++ b/content/test/data/accessibility/aria/aria-editable-expected-auralinux.txt
@@ -1,8 +1,8 @@
 [document web]
 ++[section] editable selectable-text
 ++++[paragraph] editable
-++++++[text] name='Editable paragraph' editable
+++++++[text] name='Editable text/' editable
 ++++[paragraph]
-++++++[text] name='Non-editable paragraph'
+++++++[text] name='Non-editable text'
 ++[section] editable
 ++++[text] name='Fake-editable' editable
diff --git a/content/test/data/accessibility/aria/aria-editable-expected-blink.txt b/content/test/data/accessibility/aria/aria-editable-expected-blink.txt
index 82a3e8d..2862a062 100644
--- a/content/test/data/accessibility/aria/aria-editable-expected-blink.txt
+++ b/content/test/data/accessibility/aria/aria-editable-expected-blink.txt
@@ -1,11 +1,11 @@
 rootWebArea
-++genericContainer editable multiline richlyEditable value='Editable paragraph<newline><newline>Non-editable paragraph' editableRoot=true
+++genericContainer editable multiline richlyEditable value='Editable text/Non-editable text' editableRoot=true
 ++++paragraph editable richlyEditable
-++++++staticText editable richlyEditable name='Editable paragraph'
-++++++++inlineTextBox name='Editable paragraph'
+++++++staticText editable richlyEditable name='Editable text/'
+++++++++inlineTextBox name='Editable text/'
 ++++paragraph
-++++++staticText name='Non-editable paragraph'
-++++++++inlineTextBox name='Non-editable paragraph'
+++++++staticText name='Non-editable text'
+++++++++inlineTextBox name='Non-editable text'
 ++genericContainer editable richlyEditable
 ++++staticText editable richlyEditable name='Fake-editable'
 ++++++inlineTextBox name='Fake-editable'
diff --git a/content/test/data/accessibility/aria/aria-editable-expected-mac.txt b/content/test/data/accessibility/aria/aria-editable-expected-mac.txt
index 434d7a8..48863fd 100644
--- a/content/test/data/accessibility/aria/aria-editable-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-editable-expected-mac.txt
@@ -1,8 +1,8 @@
 AXWebArea
-++AXTextArea AXValue='Editable paragraph<newline><newline>Non-editable paragraph' AXEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph' AXHighestEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph'
-++++AXGroup AXEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph' AXHighestEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph'
-++++++AXStaticText AXValue='Editable paragraph' AXEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph' AXHighestEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph'
-++++AXGroup AXEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph' AXHighestEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph'
-++++++AXStaticText AXValue='Non-editable paragraph' AXEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph' AXHighestEditableAncestor='AXTextArea Editable paragraph<newline><newline>Non-editable paragraph'
+++AXTextArea AXValue='Editable text/Non-editable text' AXEditableAncestor='AXTextArea Editable text/Non-editable text' AXHighestEditableAncestor='AXTextArea Editable text/Non-editable text'
+++++AXGroup AXEditableAncestor='AXTextArea Editable text/Non-editable text' AXHighestEditableAncestor='AXTextArea Editable text/Non-editable text'
+++++++AXStaticText AXValue='Editable text/' AXEditableAncestor='AXTextArea Editable text/Non-editable text' AXHighestEditableAncestor='AXTextArea Editable text/Non-editable text'
+++++AXGroup AXEditableAncestor='AXTextArea Editable text/Non-editable text' AXHighestEditableAncestor='AXTextArea Editable text/Non-editable text'
+++++++AXStaticText AXValue='Non-editable text' AXEditableAncestor='AXTextArea Editable text/Non-editable text' AXHighestEditableAncestor='AXTextArea Editable text/Non-editable text'
 ++AXGroup
 ++++AXStaticText AXValue='Fake-editable'
diff --git a/content/test/data/accessibility/aria/aria-editable-expected-win.txt b/content/test/data/accessibility/aria/aria-editable-expected-win.txt
index 199a34b..13e7438 100644
--- a/content/test/data/accessibility/aria/aria-editable-expected-win.txt
+++ b/content/test/data/accessibility/aria/aria-editable-expected-win.txt
@@ -1,8 +1,8 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
-++IA2_ROLE_SECTION value='Editable paragraph<newline><newline>Non-editable paragraph' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
+++IA2_ROLE_SECTION value='Editable text/Non-editable text' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE
 ++++IA2_ROLE_PARAGRAPH IA2_STATE_EDITABLE
-++++++ROLE_SYSTEM_STATICTEXT name='Editable paragraph' IA2_STATE_EDITABLE
+++++++ROLE_SYSTEM_STATICTEXT name='Editable text/' IA2_STATE_EDITABLE
 ++++IA2_ROLE_PARAGRAPH
-++++++ROLE_SYSTEM_STATICTEXT name='Non-editable paragraph'
+++++++ROLE_SYSTEM_STATICTEXT name='Non-editable text'
 ++IA2_ROLE_SECTION IA2_STATE_EDITABLE
-++++ROLE_SYSTEM_STATICTEXT name='Fake-editable' IA2_STATE_EDITABLE
+++++ROLE_SYSTEM_STATICTEXT name='Fake-editable' IA2_STATE_EDITABLE
\ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-editable.html b/content/test/data/accessibility/aria/aria-editable.html
index ddecba2a..85a58d5 100644
--- a/content/test/data/accessibility/aria/aria-editable.html
+++ b/content/test/data/accessibility/aria/aria-editable.html
@@ -9,11 +9,5 @@
 -->
 <!-- TODO(accessibility) Put aria-goog-editable on a standards track so that it
   becomes aria-editable -->
-<div contenteditable>
-  <p>Editable paragraph</p>
-  <p aria-goog-editable="false">Non-editable paragraph</p>
-</div>
-
-<div aria-goog-editable="true">
-  Fake-editable
-</div>
+<div contenteditable><span role="paragraph">Editable text/</span><span role="paragraph" aria-goog-editable="false">Non-editable text</span></div>
+<div aria-goog-editable="true">Fake-editable</div>
diff --git a/content/test/mock_navigation_client_impl.cc b/content/test/mock_navigation_client_impl.cc
index ee2c597f..d3de500 100644
--- a/content/test/mock_navigation_client_impl.cc
+++ b/content/test/mock_navigation_client_impl.cc
@@ -23,7 +23,7 @@
     std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders,
     base::Optional<std::vector<::content::mojom::TransferrableURLLoaderPtr>>
         subresource_overrides,
-    mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
+    blink::mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
     network::mojom::URLLoaderFactoryPtr prefetch_loader_factory,
     const base::UnguessableToken& devtools_navigation_token,
     CommitNavigationCallback callback) {}
diff --git a/content/test/mock_navigation_client_impl.h b/content/test/mock_navigation_client_impl.h
index 069f2471..20af7425 100644
--- a/content/test/mock_navigation_client_impl.h
+++ b/content/test/mock_navigation_client_impl.h
@@ -25,7 +25,8 @@
       std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders,
       base::Optional<std::vector<::content::mojom::TransferrableURLLoaderPtr>>
           subresource_overrides,
-      mojom::ControllerServiceWorkerInfoPtr controller_service_worker_info,
+      blink::mojom::ControllerServiceWorkerInfoPtr
+          controller_service_worker_info,
       network::mojom::URLLoaderFactoryPtr prefetch_loader_factory,
       const base::UnguessableToken& devtools_navigation_token,
       CommitNavigationCallback callback) override;
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index ffd6bb4d..b5511db 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -163,7 +163,7 @@
       network::ResourceResponseHead(), common_params, request_params,
       network::mojom::URLLoaderClientEndpointsPtr(),
       std::make_unique<URLLoaderFactoryBundleInfo>(), base::nullopt,
-      mojom::ControllerServiceWorkerInfoPtr(),
+      blink::mojom::ControllerServiceWorkerInfoPtr(),
       network::mojom::URLLoaderFactoryPtr(), base::UnguessableToken::Create(),
       CommitNavigationCallback());
 }
diff --git a/content/utility/OWNERS b/content/utility/OWNERS
index a628238..651168d 100644
--- a/content/utility/OWNERS
+++ b/content/utility/OWNERS
@@ -1,3 +1,6 @@
 # Mac Sandbox profiles.
 per-file *.sb=set noparent
 per-file *.sb=rsesek@chromium.org
+
+# For service-related code
+per-file utility_service_factory.*=rockot@google.com
diff --git a/content/utility/utility_service_factory.cc b/content/utility/utility_service_factory.cc
index 009d860..b3d97ad 100644
--- a/content/utility/utility_service_factory.cc
+++ b/content/utility/utility_service_factory.cc
@@ -109,10 +109,6 @@
 
 #endif  // BUILDFLAG(ENABLE_LIBRARY_CDMS)
 
-std::unique_ptr<service_manager::Service> CreateVizService() {
-  return std::make_unique<viz::Service>();
-}
-
 }  // namespace
 
 UtilityServiceFactory::UtilityServiceFactory()
@@ -153,10 +149,6 @@
   }
 #endif  // BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
 #endif
-
-  service_manager::EmbeddedServiceInfo viz_info;
-  viz_info.factory = base::Bind(&CreateVizService);
-  services->insert(std::make_pair(viz::mojom::kVizServiceName, viz_info));
 }
 
 bool UtilityServiceFactory::HandleServiceRequest(
@@ -183,6 +175,8 @@
   } else if (name == video_capture::mojom::kServiceName) {
     running_service_ =
         std::make_unique<video_capture::ServiceImpl>(std::move(request));
+  } else if (name == viz::mojom::kVizServiceName) {
+    running_service_ = std::make_unique<viz::Service>(std::move(request));
   }
 #if BUILDFLAG(ENABLE_LIBRARY_CDMS)
   else if (name == media::mojom::kCdmServiceName) {
diff --git a/device/BUILD.gn b/device/BUILD.gn
index fa1385f..8d87581 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -102,6 +102,7 @@
     "gamepad/abstract_haptic_gamepad_unittest.cc",
     "gamepad/gamepad_provider_unittest.cc",
     "gamepad/gamepad_service_unittest.cc",
+    "gamepad/hid_haptic_gamepad_base_unittest.cc",
     "gamepad/public/cpp/gamepad_mojom_traits_unittest.cc",
     "test/run_all_unittests.cc",
   ]
diff --git a/device/gamepad/BUILD.gn b/device/gamepad/BUILD.gn
index ee033fb..160cace 100644
--- a/device/gamepad/BUILD.gn
+++ b/device/gamepad/BUILD.gn
@@ -66,6 +66,14 @@
     "gamepad_user_gesture.h",
     "hid_dll_functions_win.cc",
     "hid_dll_functions_win.h",
+    "hid_haptic_gamepad_base.cc",
+    "hid_haptic_gamepad_base.h",
+    "hid_haptic_gamepad_linux.cc",
+    "hid_haptic_gamepad_linux.h",
+    "hid_haptic_gamepad_mac.cc",
+    "hid_haptic_gamepad_mac.h",
+    "hid_haptic_gamepad_win.cc",
+    "hid_haptic_gamepad_win.h",
     "raw_input_data_fetcher_win.cc",
     "raw_input_data_fetcher_win.h",
     "raw_input_gamepad_device_win.cc",
diff --git a/device/gamepad/gamepad_device_linux.cc b/device/gamepad/gamepad_device_linux.cc
index 84dc0ac..4989605 100644
--- a/device/gamepad/gamepad_device_linux.cc
+++ b/device/gamepad/gamepad_device_linux.cc
@@ -193,7 +193,7 @@
 }
 
 bool GamepadDeviceLinux::SupportsVibration() const {
-  if (dualshock4_)
+  if (dualshock4_ || hid_haptics_)
     return true;
 
   // Vibration is only supported over USB.
@@ -485,12 +485,14 @@
   uint16_t product_id;
   bool is_dualshock4 = false;
   bool is_switch_pro = false;
+  bool is_hid_haptic = false;
   if (GetHidrawDevinfo(hidraw_fd_, &bus_type_, &vendor_id, &product_id)) {
     is_dualshock4 =
         Dualshock4ControllerLinux::IsDualshock4(vendor_id, product_id);
     is_switch_pro =
         SwitchProControllerLinux::IsSwitchPro(vendor_id, product_id);
-    DCHECK(!is_dualshock4 || !is_switch_pro);
+    is_hid_haptic = HidHapticGamepadLinux::IsHidHaptic(vendor_id, product_id);
+    DCHECK_LE(is_dualshock4 + is_switch_pro + is_hid_haptic, 1);
   }
 
   if (is_dualshock4 && !dualshock4_)
@@ -503,6 +505,11 @@
       switch_pro_->SendConnectionStatusQuery();
   }
 
+  if (is_hid_haptic && !hid_haptics_) {
+    hid_haptics_ =
+        HidHapticGamepadLinux::Create(vendor_id, product_id, hidraw_fd_);
+  }
+
   return true;
 }
 
@@ -513,6 +520,9 @@
   if (switch_pro_)
     switch_pro_->Shutdown();
   switch_pro_.reset();
+  if (hid_haptics_)
+    hid_haptics_->Shutdown();
+  hid_haptics_.reset();
   if (hidraw_fd_ >= 0) {
     close(hidraw_fd_);
     hidraw_fd_ = -1;
@@ -531,6 +541,11 @@
     return;
   }
 
+  if (hid_haptics_) {
+    hid_haptics_->SetVibration(strong_magnitude, weak_magnitude);
+    return;
+  }
+
   uint16_t strong_magnitude_scaled =
       static_cast<uint16_t>(strong_magnitude * kRumbleMagnitudeMax);
   uint16_t weak_magnitude_scaled =
@@ -563,6 +578,11 @@
     return;
   }
 
+  if (hid_haptics_) {
+    hid_haptics_->SetZeroVibration();
+    return;
+  }
+
   if (effect_id_ != kInvalidEffectId)
     StartOrStopEffect(evdev_fd_, effect_id_, false);
 }
diff --git a/device/gamepad/gamepad_device_linux.h b/device/gamepad/gamepad_device_linux.h
index 2f926e6..6bffaff 100644
--- a/device/gamepad/gamepad_device_linux.h
+++ b/device/gamepad/gamepad_device_linux.h
@@ -12,6 +12,7 @@
 #include "device/gamepad/abstract_haptic_gamepad.h"
 #include "device/gamepad/dualshock4_controller_linux.h"
 #include "device/gamepad/gamepad_standard_mappings.h"
+#include "device/gamepad/hid_haptic_gamepad_linux.h"
 #include "device/gamepad/switch_pro_controller_linux.h"
 #include "device/gamepad/udev_gamepad_linux.h"
 
@@ -161,6 +162,9 @@
 
   // Nintendo Switch Pro controller functionality, if available.
   std::unique_ptr<SwitchProControllerLinux> switch_pro_;
+
+  // A controller that uses a HID output report for vibration effects.
+  std::unique_ptr<HidHapticGamepadLinux> hid_haptics_;
 };
 
 }  // namespace device
diff --git a/device/gamepad/gamepad_device_mac.h b/device/gamepad/gamepad_device_mac.h
index 7c8bc08..808cdacb 100644
--- a/device/gamepad/gamepad_device_mac.h
+++ b/device/gamepad/gamepad_device_mac.h
@@ -12,6 +12,7 @@
 
 #include "device/gamepad/abstract_haptic_gamepad.h"
 #include "device/gamepad/dualshock4_controller_mac.h"
+#include "device/gamepad/hid_haptic_gamepad_mac.h"
 #include "device/gamepad/public/cpp/gamepad.h"
 
 namespace device {
@@ -105,6 +106,9 @@
 
   // Dualshock4 functionality, if available.
   std::unique_ptr<Dualshock4ControllerMac> dualshock4_;
+
+  // A controller that uses a HID output report for vibration effects.
+  std::unique_ptr<HidHapticGamepadMac> hid_haptics_;
 };
 
 }  // namespace device
diff --git a/device/gamepad/gamepad_device_mac.mm b/device/gamepad/gamepad_device_mac.mm
index e22246f..4dfb391 100644
--- a/device/gamepad/gamepad_device_mac.mm
+++ b/device/gamepad/gamepad_device_mac.mm
@@ -78,6 +78,9 @@
       ff_effect_ref_(nullptr) {
   if (Dualshock4ControllerMac::IsDualshock4(vendor_id, product_id)) {
     dualshock4_ = std::make_unique<Dualshock4ControllerMac>(device_ref);
+  } else if (HidHapticGamepadMac::IsHidHaptic(vendor_id, product_id)) {
+    hid_haptics_ =
+        HidHapticGamepadMac::Create(vendor_id, product_id, device_ref);
   } else if (device_ref) {
     ff_device_ref_ = CreateForceFeedbackDevice(device_ref);
     if (ff_device_ref_) {
@@ -92,16 +95,19 @@
 
 void GamepadDeviceMac::DoShutdown() {
   if (ff_device_ref_) {
-    if (ff_effect_ref_)
+    if (ff_effect_ref_) {
       FFDeviceReleaseEffect(ff_device_ref_, ff_effect_ref_);
+      ff_effect_ref_ = nullptr;
+    }
     FFReleaseDevice(ff_device_ref_);
-    ff_effect_ref_ = nullptr;
     ff_device_ref_ = nullptr;
   }
-  if (dualshock4_) {
+  if (dualshock4_)
     dualshock4_->Shutdown();
-    dualshock4_ = nullptr;
-  }
+  dualshock4_.reset();
+  if (hid_haptics_)
+    hid_haptics_->Shutdown();
+  hid_haptics_.reset();
 }
 
 // static
@@ -366,13 +372,15 @@
 }
 
 bool GamepadDeviceMac::SupportsVibration() {
-  return dualshock4_ || ff_device_ref_;
+  return dualshock4_ || hid_haptics_ || ff_device_ref_;
 }
 
 void GamepadDeviceMac::SetVibration(double strong_magnitude,
                                     double weak_magnitude) {
   if (dualshock4_) {
     dualshock4_->SetVibration(strong_magnitude, weak_magnitude);
+  } else if (hid_haptics_) {
+    hid_haptics_->SetVibration(strong_magnitude, weak_magnitude);
   } else if (ff_device_ref_) {
     FFCUSTOMFORCE* ff_custom_force =
         static_cast<FFCUSTOMFORCE*>(ff_effect_.lpvTypeSpecificParams);
@@ -396,6 +404,8 @@
 void GamepadDeviceMac::SetZeroVibration() {
   if (dualshock4_) {
     dualshock4_->SetZeroVibration();
+  } else if (hid_haptics_) {
+    hid_haptics_->SetZeroVibration();
   } else if (ff_effect_ref_) {
     FFEffectStop(ff_effect_ref_);
   }
diff --git a/device/gamepad/gamepad_service.cc b/device/gamepad/gamepad_service.cc
index 342dc4d4..bb9995a 100644
--- a/device/gamepad/gamepad_service.cc
+++ b/device/gamepad/gamepad_service.cc
@@ -172,8 +172,6 @@
     mojom::GamepadHapticEffectType type,
     mojom::GamepadEffectParametersPtr params,
     mojom::GamepadHapticsManager::PlayVibrationEffectOnceCallback callback) {
-  DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
-
   if (!provider_) {
     std::move(callback).Run(
         mojom::GamepadHapticsResult::GamepadHapticsResultError);
@@ -187,8 +185,6 @@
 void GamepadService::ResetVibrationActuator(
     uint32_t pad_index,
     mojom::GamepadHapticsManager::ResetVibrationActuatorCallback callback) {
-  DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
-
   if (!provider_) {
     std::move(callback).Run(
         mojom::GamepadHapticsResult::GamepadHapticsResultError);
diff --git a/device/gamepad/gamepad_standard_mappings_linux.cc b/device/gamepad/gamepad_standard_mappings_linux.cc
index 9ecc5c5..3fdc2bc 100644
--- a/device/gamepad/gamepad_standard_mappings_linux.cc
+++ b/device/gamepad/gamepad_standard_mappings_linux.cc
@@ -574,6 +574,93 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
+void MapperAnalogGamepad(const Gamepad& input, Gamepad* mapped) {
+  enum AnalogGamepadButtons {
+    ANALOG_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
+    ANALOG_GAMEPAD_BUTTON_EXTRA2,
+    ANALOG_GAMEPAD_BUTTON_COUNT
+  };
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[7]);
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[7]);
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[6]);
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
+      AxisPositiveAsButton(input.axes[6]);
+  mapped->buttons[BUTTON_INDEX_META] = input.buttons[7];
+  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA] = input.buttons[11];
+  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA2] = input.buttons[12];
+  mapped->buttons_length = ANALOG_GAMEPAD_BUTTON_COUNT;
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
+void MapperXSkills(const Gamepad& input, Gamepad* mapped) {
+  enum GamecubeButtons {
+    GAMECUBE_BUTTON_LEFT_TRIGGER_CLICK = BUTTON_INDEX_COUNT,
+    GAMECUBE_BUTTON_RIGHT_TRIGGER_CLICK,
+    GAMECUBE_BUTTON_COUNT
+  };
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];     // A
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[2];   // X
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[1];    // B
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[3];  // Y
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = NullButton();
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[6];  // Z
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = NullButton();
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = NullButton();
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_META] = NullButton();
+  mapped->buttons[GAMECUBE_BUTTON_LEFT_TRIGGER_CLICK] = input.buttons[4];
+  mapped->buttons[GAMECUBE_BUTTON_RIGHT_TRIGGER_CLICK] = input.buttons[5];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = input.axes[1];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[5];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[2];
+  mapped->buttons_length = GAMECUBE_BUTTON_COUNT;
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
+void MapperBoomN64Psx(const Gamepad& input, Gamepad* mapped) {
+  *mapped = input;
+  // Mapped for a PSX device with Analog mode enabled.
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = input.buttons[5];
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[12];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[14];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[15];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_META] = NullButton();
+  mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = -input.axes[1];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[2];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = -input.axes[3];
+  mapped->buttons_length = BUTTON_INDEX_COUNT - 1;  // no meta
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
 struct MappingData {
   const uint16_t vendor_id;
   const uint16_t product_id;
@@ -610,6 +697,7 @@
     {0x0955, 0x7210, MapperNvShield},      // Nvidia Shield gamepad (2015)
     {0x0955, 0x7214, MapperNvShield2017},  // Nvidia Shield gamepad (2017)
     {0x0b05, 0x4500, MapperADT1},          // Nexus Player Controller
+    {0x0b43, 0x0005, MapperXSkills},       // XSkills Gamecube USB adapter
     {0x0e8f, 0x0003, MapperXGEAR},         // XFXforce XGEAR PS2 Controller
     {0x1038, 0x1412, MapperSteelSeriesZeemote},    // Zeemote: SteelSeries FREE
     {0x1038, 0x1418, MapperSteelSeriesStratusXL},  // SteelSeries Stratus XL USB
@@ -620,6 +708,8 @@
     {0x2378, 0x1008, MapperOnLiveWireless},  // OnLive Controller (Bluetooth)
     {0x2378, 0x100a, MapperOnLiveWireless},  // OnLive Controller (Wired)
     {0x2836, 0x0001, MapperOUYA},            // OUYA Controller
+    {0x6666, 0x0667, MapperBoomN64Psx},      // boom PSX+N64 USB Converter
+    {0x6666, 0x9401, MapperAnalogGamepad},   // Analog game controller
 };
 const size_t kAvailableMappingsLen = base::size(AvailableMappings);
 
diff --git a/device/gamepad/gamepad_standard_mappings_mac.mm b/device/gamepad/gamepad_standard_mappings_mac.mm
index d183ea24..ba9d06f2 100644
--- a/device/gamepad/gamepad_standard_mappings_mac.mm
+++ b/device/gamepad/gamepad_standard_mappings_mac.mm
@@ -393,6 +393,97 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
+void MapperAnalogGamepad(const Gamepad& input, Gamepad* mapped) {
+  enum AnalogGamepadButtons {
+    ANALOG_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
+    ANALOG_GAMEPAD_BUTTON_EXTRA2,
+    ANALOG_GAMEPAD_BUTTON_COUNT
+  };
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[12];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
+  mapped->buttons[BUTTON_INDEX_META] = input.buttons[11];
+  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA] = input.buttons[16];
+  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA2] = input.buttons[17];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  DpadFromAxis(mapped, input.axes[9]);
+
+  mapped->buttons_length = ANALOG_GAMEPAD_BUTTON_COUNT;
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
+void MapperXSkills(const Gamepad& input, Gamepad* mapped) {
+  enum GamecubeButtons {
+    GAMECUBE_BUTTON_LEFT_TRIGGER_CLICK = BUTTON_INDEX_COUNT,
+    GAMECUBE_BUTTON_RIGHT_TRIGGER_CLICK,
+    GAMECUBE_BUTTON_COUNT
+  };
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];     // A
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[2];   // X
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[1];    // B
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[3];  // Y
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = NullButton();
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[6];  // Z
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = NullButton();
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = NullButton();
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_META] = NullButton();
+  mapped->buttons[GAMECUBE_BUTTON_LEFT_TRIGGER_CLICK] = input.buttons[4];
+  mapped->buttons[GAMECUBE_BUTTON_RIGHT_TRIGGER_CLICK] = input.buttons[5];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = input.axes[1];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[5];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[2];
+  mapped->buttons_length = GAMECUBE_BUTTON_COUNT;
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
+void MapperBoomN64Psx(const Gamepad& input, Gamepad* mapped) {
+  *mapped = input;
+  // Mapped for a PSX device with Analog mode enabled.
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = input.buttons[5];
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[12];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[14];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[15];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_META] = NullButton();
+  mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = input.axes[1];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[2];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  mapped->buttons_length = BUTTON_INDEX_COUNT - 1;  // no meta
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
 struct MappingData {
   const uint16_t vendor_id;
   const uint16_t product_id;
@@ -419,6 +510,7 @@
     {0x0583, 0x2060, MapperIBuffalo},              // iBuffalo Classic
     {0x0925, 0x0005, MapperSmartJoyPLUS},          // SmartJoy PLUS Adapter
     {0x0955, 0x7210, MapperNvShield},          // Nvidia Shield gamepad (2015)
+    {0x0b43, 0x0005, MapperXSkills},           // XSkills Gamecube USB adapter
     {0x0b05, 0x4500, MapperADT1},              // Nexus Player Controller
     {0x0e8f, 0x0003, MapperXGEAR},             // XFXforce XGEAR PS2 Controller
     {0x1532, 0x0900, MapperRazerServal},       // Razer Serval Controller
@@ -429,6 +521,8 @@
     {0x2378, 0x1008, MapperOnLiveWireless},    // OnLive Controller (Bluetooth)
     {0x2378, 0x100a, MapperOnLiveWireless},    // OnLive Controller (Wired)
     {0x2836, 0x0001, MapperOUYA},              // OUYA Controller
+    {0x6666, 0x0667, MapperBoomN64Psx},        // boom PSX+N64 USB Converter
+    {0x6666, 0x9401, MapperAnalogGamepad},     // Analog game controller
 };
 const size_t kAvailableMappingsLen = base::size(AvailableMappings);
 
diff --git a/device/gamepad/gamepad_standard_mappings_win.cc b/device/gamepad/gamepad_standard_mappings_win.cc
index 3d7630a..cc0f646 100644
--- a/device/gamepad/gamepad_standard_mappings_win.cc
+++ b/device/gamepad/gamepad_standard_mappings_win.cc
@@ -261,6 +261,97 @@
   mapped->axes_length = AXIS_INDEX_COUNT;
 }
 
+void MapperAnalogGamepad(const Gamepad& input, Gamepad* mapped) {
+  enum AnalogGamepadButtons {
+    ANALOG_GAMEPAD_BUTTON_EXTRA = BUTTON_INDEX_COUNT,
+    ANALOG_GAMEPAD_BUTTON_EXTRA2,
+    ANALOG_GAMEPAD_BUTTON_COUNT
+  };
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[12];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[14];
+  mapped->buttons[BUTTON_INDEX_META] = input.buttons[11];
+  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA] = input.buttons[16];
+  mapped->buttons[ANALOG_GAMEPAD_BUTTON_EXTRA2] = input.buttons[17];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  DpadFromAxis(mapped, input.axes[9]);
+
+  mapped->buttons_length = ANALOG_GAMEPAD_BUTTON_COUNT;
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
+void MapperXSkills(const Gamepad& input, Gamepad* mapped) {
+  enum GamecubeButtons {
+    GAMECUBE_BUTTON_LEFT_TRIGGER_CLICK = BUTTON_INDEX_COUNT,
+    GAMECUBE_BUTTON_RIGHT_TRIGGER_CLICK,
+    GAMECUBE_BUTTON_COUNT
+  };
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];     // A
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[2];   // X
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[1];    // B
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[3];  // Y
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = NullButton();
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[6];  // Z
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[3]);
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = NullButton();
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = NullButton();
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = NullButton();
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_META] = NullButton();
+  mapped->buttons[GAMECUBE_BUTTON_LEFT_TRIGGER_CLICK] = input.buttons[4];
+  mapped->buttons[GAMECUBE_BUTTON_RIGHT_TRIGGER_CLICK] = input.buttons[5];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = input.axes[1];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[5];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[2];
+  mapped->buttons_length = GAMECUBE_BUTTON_COUNT;
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
+void MapperBoomN64Psx(const Gamepad& input, Gamepad* mapped) {
+  *mapped = input;
+  // Mapped for a PSX device with Analog mode enabled.
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = input.buttons[5];
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[8];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = input.buttons[9];
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = input.buttons[12];
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = input.buttons[14];
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = input.buttons[15];
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] = input.buttons[13];
+  mapped->buttons[BUTTON_INDEX_META] = NullButton();
+  mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = input.axes[1];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[2];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[5];
+  mapped->buttons_length = BUTTON_INDEX_COUNT - 1;  // no meta
+  mapped->axes_length = AXIS_INDEX_COUNT;
+}
+
 struct MappingData {
   const uint16_t vendor_id;
   const uint16_t product_id;
@@ -278,12 +369,15 @@
     {0x0955, 0x7210, MapperNvShield},        // Nvidia Shield gamepad (2015)
     {0x0955, 0x7214, MapperNvShield2017},    // Nvidia Shield gamepad (2017)
     {0x0b05, 0x4500, MapperADT1},            // Nexus Player Controller
+    {0x0b43, 0x0005, MapperXSkills},         // XSkills Gamecube USB adapter
     {0x1532, 0x0900, MapperRazerServal},     // Razer Serval Controller
     {0x18d1, 0x2c40, MapperADT1},            // ADT-1 Controller
     {0x20d6, 0x6271, MapperMogaPro},         // Moga Pro Controller (HID mode)
     {0x2378, 0x1008, MapperOnLiveWireless},  // OnLive Controller (Bluetooth)
     {0x2378, 0x100a, MapperOnLiveWireless},  // OnLive Controller (Wired)
     {0x2836, 0x0001, MapperOUYA},            // OUYA Controller
+    {0x6666, 0x0667, MapperBoomN64Psx},      // boom PSX+N64 USB Converter
+    {0x6666, 0x9401, MapperAnalogGamepad},   // Analog game controller
 };
 const size_t kAvailableMappingsLen = base::size(AvailableMappings);
 
diff --git a/device/gamepad/hid_haptic_gamepad_base.cc b/device/gamepad/hid_haptic_gamepad_base.cc
new file mode 100644
index 0000000..8cea437
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_base.cc
@@ -0,0 +1,127 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/gamepad/hid_haptic_gamepad_base.h"
+
+namespace device {
+
+namespace {
+
+const size_t kBitsPerByte = 8;
+
+void MagnitudeToBytes(double magnitude,
+                      size_t report_size_bits,
+                      uint32_t logical_min,
+                      uint32_t logical_max,
+                      std::vector<uint8_t>* bytes) {
+  DCHECK(bytes);
+  DCHECK_EQ(report_size_bits % kBitsPerByte, 0U);
+  bytes->clear();
+  if (logical_min >= logical_max)
+    return;
+  // If the vibration actuator on the device is only on or off, ensure it will
+  // be on for any non-zero vibration magnitude.
+  if (logical_min == 0 && logical_max == 1)
+    magnitude = (magnitude > 0.0) ? 1.0 : 0.0;
+  uint32_t scaled_magnitude = static_cast<uint32_t>(
+      magnitude * (logical_max - logical_min) + logical_min);
+  size_t remaining_bits = report_size_bits;
+  // Fields larger than one byte are stored in little-endian byte order.
+  while (remaining_bits > 0) {
+    bytes->push_back(scaled_magnitude & 0xff);
+    remaining_bits -= kBitsPerByte;
+    scaled_magnitude >>= kBitsPerByte;
+  }
+}
+}  // namespace
+
+// Supported HID gamepads.
+HidHapticGamepadBase::HapticReportData kHapticReportData[] = {
+    // XSkills Gamecube USB adapter
+    {0x0b43, 0x0005, 0x00, 4, 3, 3, 1 * kBitsPerByte, 0, 1},
+    // Analog game controller
+    {0x6666, 0x9401, 0x05, 5, 1, 3, 2 * kBitsPerByte, 0, 0xffff},
+};
+size_t kHapticReportDataLength = base::size(kHapticReportData);
+
+HidHapticGamepadBase::HidHapticGamepadBase(const HapticReportData& data)
+    : report_id_(data.report_id),
+      report_length_bytes_(data.report_length_bytes),
+      strong_offset_bytes_(data.strong_offset_bytes),
+      weak_offset_bytes_(data.weak_offset_bytes),
+      report_size_bits_(data.report_size_bits),
+      logical_min_(data.logical_min),
+      logical_max_(data.logical_max) {}
+
+HidHapticGamepadBase::~HidHapticGamepadBase() = default;
+
+// static
+bool HidHapticGamepadBase::IsHidHaptic(uint16_t vendor_id,
+                                       uint16_t product_id) {
+  const auto* begin = kHapticReportData;
+  const auto* end = kHapticReportData + kHapticReportDataLength;
+  const auto* find_it =
+      std::find_if(begin, end, [=](const HapticReportData& d) {
+        return d.vendor_id == vendor_id && d.product_id == product_id;
+      });
+  return find_it != end;
+}
+
+// static
+const HidHapticGamepadBase::HapticReportData*
+HidHapticGamepadBase::GetHapticReportData(uint16_t vendor_id,
+                                          uint16_t product_id) {
+  const auto* begin = kHapticReportData;
+  const auto* end = kHapticReportData + kHapticReportDataLength;
+  const auto* find_it =
+      std::find_if(begin, end, [=](const HapticReportData& d) {
+        return d.vendor_id == vendor_id && d.product_id == product_id;
+      });
+  return find_it == end ? nullptr : &*find_it;
+}
+
+void HidHapticGamepadBase::SetVibration(double strong_magnitude,
+                                        double weak_magnitude) {
+  std::vector<uint8_t> control_report(report_length_bytes_);
+  control_report[0] = report_id_;
+  if (strong_offset_bytes_ == weak_offset_bytes_) {
+    // Single channel vibration. Combine both channels into a single magnitude.
+    std::vector<uint8_t> vibration_bytes;
+    double vibration_magnitude =
+        std::min(strong_magnitude + weak_magnitude, 1.0);
+    MagnitudeToBytes(vibration_magnitude, report_size_bits_, logical_min_,
+                     logical_max_, &vibration_bytes);
+    // Vibration magnitude must not overwrite the report ID.
+    DCHECK(report_id_ == 0x00 || strong_offset_bytes_ > 0);
+    // Vibration magnitude must not overrun the report buffer.
+    DCHECK_LE(strong_offset_bytes_ + vibration_bytes.size(),
+              report_length_bytes_);
+    std::copy(vibration_bytes.begin(), vibration_bytes.end(),
+              control_report.begin() + strong_offset_bytes_);
+  } else {
+    // Dual channel vibration.
+    std::vector<uint8_t> left_bytes;
+    std::vector<uint8_t> right_bytes;
+    MagnitudeToBytes(strong_magnitude, report_size_bits_, logical_min_,
+                     logical_max_, &left_bytes);
+    MagnitudeToBytes(weak_magnitude, report_size_bits_, logical_min_,
+                     logical_max_, &right_bytes);
+    // Vibration magnitude must not overwrite the report ID.
+    DCHECK(report_id_ == 0x00 || strong_offset_bytes_ > 0);
+    DCHECK(report_id_ == 0x00 || weak_offset_bytes_ > 0);
+    // Vibration magnitude must not overrun the report buffer.
+    DCHECK_LE(strong_offset_bytes_ + left_bytes.size(), report_length_bytes_);
+    DCHECK_LE(weak_offset_bytes_ + right_bytes.size(), report_length_bytes_);
+    // The strong and weak vibration magnitude fields must not overlap.
+    DCHECK(strong_offset_bytes_ + left_bytes.size() <= weak_offset_bytes_ ||
+           weak_offset_bytes_ + right_bytes.size() <= strong_offset_bytes_);
+    std::copy(left_bytes.begin(), left_bytes.end(),
+              control_report.begin() + strong_offset_bytes_);
+    std::copy(right_bytes.begin(), right_bytes.end(),
+              control_report.begin() + weak_offset_bytes_);
+  }
+  WriteOutputReport(control_report.data(), report_length_bytes_);
+}
+
+}  // namespace device
diff --git a/device/gamepad/hid_haptic_gamepad_base.h b/device/gamepad/hid_haptic_gamepad_base.h
new file mode 100644
index 0000000..c1124b4
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_base.h
@@ -0,0 +1,108 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_BASE_H_
+#define DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_BASE_H_
+
+#include "device/gamepad/abstract_haptic_gamepad.h"
+#include "device/gamepad/gamepad_export.h"
+
+namespace device {
+
+class DEVICE_GAMEPAD_EXPORT HidHapticGamepadBase
+    : public AbstractHapticGamepad {
+ public:
+  // Devices that support HID haptic effects with a simple output report can
+  // be supported through HidHapticGamepadBase by adding a new HapticReportData
+  // item to kHapticReportData.
+  //
+  // Example:
+  //   { 0x1234, 0xabcd, 0x42, 5, 1, 3, 2 * 8, 0, 0xffff }
+  // This item recognizes a device 1234:abcd that accepts a 5-byte output report
+  // containing report ID 0x42 at byte 0 and two 16-bit vibration magnitudes at
+  // bytes 1:2 and 3:4.
+  //    SetVibration(1.0, 0.5)
+  // This call describes a vibration effect with 100% intensity on the strong
+  // actuator and 50% intensity on the weak actuator. For the above device, it
+  // will scale each magnitude to the [0,0xffff] range when constructing the
+  // output report. The first value is scaled to 0xffff and the second is scaled
+  // to 0x7fff.
+  //    uint8_t[] {0x42, 0xff, 0xff, 0xff, 0x7f}
+  // The above bytes represent the output report data sent to the device. The
+  // report ID is written to byte 0, the strong magnitude 0xffff is written to
+  // bytes 1 and 2 in LE-order, and the weak magnitude is written to bytes 3 and
+  // 4 in LE-order.
+  struct HapticReportData {
+    // Supported HID gamepads are identified by their vendor and product IDs.
+    const uint16_t vendor_id;
+    const uint16_t product_id;
+    // The 8-bit report ID value to send at the start of the output report.
+    // Set to zero if the device does not use report IDs.
+    const uint8_t report_id;
+    // The total length of the output report in bytes, including the report ID.
+    const size_t report_length_bytes;
+    // The byte offsets of the strong and weak vibration magnitude fields within
+    // the output report. If |strong_offset_bytes| == |weak_offset_bytes| then
+    // the device is considered a single-channel haptic actuator. Magnitudes
+    // from the strong and weak channels will be combined into a single value.
+    const size_t strong_offset_bytes;
+    const size_t weak_offset_bytes;
+    // The width of a vibration magnitude field within the output report. Both
+    // strong and weak magnitude fields must have the same size. The report size
+    // must be a multiple of 8. Report fields with size greater than one byte
+    // will be stored in little-endian byte order.
+    const size_t report_size_bits;
+    // The logical extents of the vibration magnitude field, used for scaling
+    // the vibration value. If |logical_min| == 0 and |logical_max| == 1 then
+    // the device is considered an "on-off" actuator and any non-zero vibration
+    // magnitude will cause a vibration effect with maximum intensity.
+    const uint32_t logical_min;
+    const uint32_t logical_max;
+  };
+
+  ~HidHapticGamepadBase() override;
+
+  // Return true if the device IDs match an item in kHapticReportData.
+  static bool IsHidHaptic(uint16_t vendor_id, uint16_t product_id);
+
+  // Return the HapticReportData for the device with matching device IDs.
+  static const HidHapticGamepadBase::HapticReportData* GetHapticReportData(
+      uint16_t vendor_id,
+      uint16_t product_id);
+
+  // Set the current vibration magnitudes.
+  void SetVibration(double strong_magnitude, double weak_magnitude) override;
+
+  // Write the vibration output report to the device.
+  virtual size_t WriteOutputReport(void* report, size_t report_length) = 0;
+
+ protected:
+  HidHapticGamepadBase(const HapticReportData& data);
+
+ private:
+  // Report ID of the report to use for vibration commands, or zero if report
+  // IDs are not used.
+  uint8_t report_id_;
+
+  // The total size of the report, including the report ID (if any).
+  size_t report_length_bytes_;
+
+  // Byte offsets for the strong and weak magnitude values within the report.
+  size_t strong_offset_bytes_;
+  size_t weak_offset_bytes_;
+
+  // Width of the vibration magnitude values, in bits.
+  size_t report_size_bits_;
+
+  // Logical bounds of the vibration magnitude. Assumed to be positive.
+  uint32_t logical_min_;
+  uint32_t logical_max_;
+};
+
+extern HidHapticGamepadBase::HapticReportData kHapticReportData[];
+extern size_t kHapticReportDataLength;
+
+}  // namespace device
+
+#endif  // DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_BASE_H_
diff --git a/device/gamepad/hid_haptic_gamepad_base_unittest.cc b/device/gamepad/hid_haptic_gamepad_base_unittest.cc
new file mode 100644
index 0000000..9725f156
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_base_unittest.cc
@@ -0,0 +1,362 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/gamepad/hid_haptic_gamepad_base.h"
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/test/test_simple_task_runner.h"
+#include "device/gamepad/public/mojom/gamepad.mojom.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace device {
+
+namespace {
+
+// Describes a hypothetical HID haptic gamepad with two 16-bit vibration
+// magnitude fields.
+constexpr uint8_t kReportId = 0x42;
+constexpr size_t kReportLength = 5;
+constexpr HidHapticGamepadBase::HapticReportData kHapticReportData = {
+    0x1234, 0xabcd, kReportId, kReportLength, 1, 3, 16, 0, 0xffff};
+// The expected "stop vibration" report bytes.
+constexpr uint8_t kStopVibrationData[] = {kReportId, 0x00, 0x00, 0x00, 0x00};
+// The expected "start vibration" report bytes.
+constexpr uint8_t kStartVibrationData[] = {kReportId, 0xff, 0xff, 0xff, 0x7f};
+
+// An implementation of HidHapticGamepadBase that records its output reports.
+class FakeHidHapticGamepad : public HidHapticGamepadBase {
+ public:
+  FakeHidHapticGamepad(const HidHapticGamepadBase::HapticReportData& data)
+      : HidHapticGamepadBase(data) {}
+  ~FakeHidHapticGamepad() override = default;
+
+  base::TimeDelta TaskDelayFromMilliseconds(double delay_millis) override {
+    // Remove delays for testing.
+    return base::TimeDelta();
+  }
+
+  size_t WriteOutputReport(void* report, size_t report_length) override {
+    std::vector<uint8_t> report_bytes(report_length);
+    const uint8_t* report_begin = reinterpret_cast<uint8_t*>(report);
+    const uint8_t* report_end = report_begin + report_length;
+    std::copy(report_begin, report_end, report_bytes.begin());
+    output_reports_.push_back(std::move(report_bytes));
+    return report_length;
+  }
+
+  std::vector<std::vector<uint8_t>> output_reports_;
+};
+
+// Main test fixture
+class HidHapticGamepadBaseTest : public testing::Test {
+ public:
+  HidHapticGamepadBaseTest()
+      : start_vibration_output_report_(kStartVibrationData,
+                                       kStartVibrationData + kReportLength),
+        stop_vibration_output_report_(kStopVibrationData,
+                                      kStopVibrationData + kReportLength),
+        first_callback_count_(0),
+        second_callback_count_(0),
+        first_callback_result_(
+            mojom::GamepadHapticsResult::GamepadHapticsResultError),
+        second_callback_result_(
+            mojom::GamepadHapticsResult::GamepadHapticsResultError),
+        gamepad_(std::make_unique<FakeHidHapticGamepad>(kHapticReportData)),
+        task_runner_(new base::TestSimpleTaskRunner) {}
+
+  void TearDown() override { gamepad_->Shutdown(); }
+
+  void PostPlayEffect(
+      mojom::GamepadHapticEffectType type,
+      double duration,
+      double start_delay,
+      mojom::GamepadHapticsManager::PlayVibrationEffectOnceCallback callback) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(&FakeHidHapticGamepad::PlayEffect,
+                       base::Unretained(gamepad_.get()), type,
+                       mojom::GamepadEffectParameters::New(
+                           duration, start_delay, 1.0, 0.5),
+                       std::move(callback)),
+        base::TimeDelta());
+  }
+
+  void PostResetVibration(
+      mojom::GamepadHapticsManager::ResetVibrationActuatorCallback callback) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(&FakeHidHapticGamepad::ResetVibration,
+                       base::Unretained(gamepad_.get()), std::move(callback)),
+        base::TimeDelta());
+  }
+
+  void FirstCallback(mojom::GamepadHapticsResult result) {
+    first_callback_count_++;
+    first_callback_result_ = result;
+  }
+
+  void SecondCallback(mojom::GamepadHapticsResult result) {
+    second_callback_count_++;
+    second_callback_result_ = result;
+  }
+
+  const std::vector<uint8_t> start_vibration_output_report_;
+  const std::vector<uint8_t> stop_vibration_output_report_;
+  int first_callback_count_;
+  int second_callback_count_;
+  mojom::GamepadHapticsResult first_callback_result_;
+  mojom::GamepadHapticsResult second_callback_result_;
+  std::unique_ptr<FakeHidHapticGamepad> gamepad_;
+  scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
+
+  DISALLOW_COPY_AND_ASSIGN(HidHapticGamepadBaseTest);
+};
+
+TEST_F(HidHapticGamepadBaseTest, PlayEffectTest) {
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(0, first_callback_count_);
+
+  PostPlayEffect(
+      mojom::GamepadHapticEffectType::GamepadHapticEffectTypeDualRumble, 1.0,
+      0.0,
+      base::BindOnce(&HidHapticGamepadBaseTest::FirstCallback,
+                     base::Unretained(this)));
+
+  // Run the queued task, but stop before executing any new tasks queued by that
+  // task. This should pause before sending any output reports.
+  task_runner_->RunPendingTasks();
+
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(0, first_callback_count_);
+  EXPECT_TRUE(task_runner_->HasPendingTask());
+
+  // Run the next task, but pause before completing the effect.
+  task_runner_->RunPendingTasks();
+
+  EXPECT_THAT(gamepad_->output_reports_,
+              testing::ElementsAre(start_vibration_output_report_));
+  EXPECT_EQ(0, first_callback_count_);
+  EXPECT_TRUE(task_runner_->HasPendingTask());
+
+  // Complete the effect and issue the callback. After this, there should be no
+  // more pending tasks.
+  task_runner_->RunPendingTasks();
+
+  EXPECT_THAT(gamepad_->output_reports_,
+              testing::ElementsAre(start_vibration_output_report_,
+                                   stop_vibration_output_report_));
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultComplete,
+            first_callback_result_);
+  EXPECT_FALSE(task_runner_->HasPendingTask());
+}
+
+TEST_F(HidHapticGamepadBaseTest, ResetVibrationTest) {
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(0, first_callback_count_);
+
+  PostResetVibration(base::BindOnce(&HidHapticGamepadBaseTest::FirstCallback,
+                                    base::Unretained(this)));
+
+  task_runner_->RunUntilIdle();
+
+  // ResetVibration should return a "complete" result without sending any
+  // reports.
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultComplete,
+            first_callback_result_);
+}
+
+TEST_F(HidHapticGamepadBaseTest, UnsupportedEffectTypeTest) {
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(0, first_callback_count_);
+
+  mojom::GamepadHapticEffectType unsupported_effect_type =
+      static_cast<mojom::GamepadHapticEffectType>(123);
+  PostPlayEffect(unsupported_effect_type, 1.0, 0.0,
+                 base::BindOnce(&HidHapticGamepadBaseTest::FirstCallback,
+                                base::Unretained(this)));
+
+  task_runner_->RunUntilIdle();
+
+  // An unsupported effect should return a "not-supported" result without
+  // sending any reports.
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultNotSupported,
+            first_callback_result_);
+}
+
+TEST_F(HidHapticGamepadBaseTest, StartDelayTest) {
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(0, first_callback_count_);
+
+  // This test establishes the behavior for the start_delay parameter when
+  // PlayEffect is called without preempting an existing effect.
+  PostPlayEffect(
+      mojom::GamepadHapticEffectType::GamepadHapticEffectTypeDualRumble, 1.0,
+      0.0,
+      base::BindOnce(&HidHapticGamepadBaseTest::FirstCallback,
+                     base::Unretained(this)));
+
+  task_runner_->RunUntilIdle();
+
+  // With zero start_delay, exactly two reports are issued, to start and stop
+  // the effect.
+  EXPECT_THAT(gamepad_->output_reports_,
+              testing::ElementsAre(start_vibration_output_report_,
+                                   stop_vibration_output_report_));
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultComplete,
+            first_callback_result_);
+
+  PostPlayEffect(
+      mojom::GamepadHapticEffectType::GamepadHapticEffectTypeDualRumble, 1.0,
+      1.0,
+      base::BindOnce(&HidHapticGamepadBaseTest::FirstCallback,
+                     base::Unretained(this)));
+
+  task_runner_->RunUntilIdle();
+
+  EXPECT_EQ(2, first_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultComplete,
+            first_callback_result_);
+}
+
+TEST_F(HidHapticGamepadBaseTest, ZeroStartDelayPreemptionTest) {
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(0, first_callback_count_);
+  EXPECT_EQ(0, second_callback_count_);
+
+  // Start an ongoing effect. We'll preempt this one with another effect.
+  PostPlayEffect(
+      mojom::GamepadHapticEffectType::GamepadHapticEffectTypeDualRumble, 1.0,
+      0.0,
+      base::BindOnce(&HidHapticGamepadBaseTest::FirstCallback,
+                     base::Unretained(this)));
+
+  // Start a second effect with zero start_delay. This should cause the first
+  // effect to be preempted before it calls SetVibration.
+  PostPlayEffect(
+      mojom::GamepadHapticEffectType::GamepadHapticEffectTypeDualRumble, 1.0,
+      0.0,
+      base::BindOnce(&HidHapticGamepadBaseTest::SecondCallback,
+                     base::Unretained(this)));
+
+  // Execute the pending tasks, but stop before executing any newly queued
+  // tasks.
+  task_runner_->RunPendingTasks();
+
+  // The first effect should have already returned with a "preempted" result
+  // without issuing a report. The second effect is not yet started.
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(0, second_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultPreempted,
+            first_callback_result_);
+
+  task_runner_->RunPendingTasks();
+
+  // The second effect should have been started.
+  EXPECT_THAT(gamepad_->output_reports_,
+              testing::ElementsAre(start_vibration_output_report_));
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(0, second_callback_count_);
+
+  task_runner_->RunUntilIdle();
+
+  // Now the second effect should have returned with a "complete" result.
+  EXPECT_THAT(gamepad_->output_reports_,
+              testing::ElementsAre(start_vibration_output_report_,
+                                   stop_vibration_output_report_));
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(1, second_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultComplete,
+            second_callback_result_);
+}
+
+TEST_F(HidHapticGamepadBaseTest, NonZeroStartDelayPreemptionTest) {
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(0, first_callback_count_);
+  EXPECT_EQ(0, second_callback_count_);
+
+  // Start an ongoing effect. We'll preempt this one with another effect.
+  PostPlayEffect(
+      mojom::GamepadHapticEffectType::GamepadHapticEffectTypeDualRumble, 1.0,
+      0.0,
+      base::BindOnce(&HidHapticGamepadBaseTest::FirstCallback,
+                     base::Unretained(this)));
+
+  // Start a second effect with non-zero start_delay. This should cause the
+  // first effect to be preempted before it calls SetVibration.
+  PostPlayEffect(
+      mojom::GamepadHapticEffectType::GamepadHapticEffectTypeDualRumble, 1.0,
+      1.0,
+      base::BindOnce(&HidHapticGamepadBaseTest::SecondCallback,
+                     base::Unretained(this)));
+
+  // Execute the pending tasks, but stop before executing any newly queued
+  // tasks.
+  task_runner_->RunPendingTasks();
+
+  // The first effect should have already returned with a "preempted" result.
+  // Because the second effect has a non-zero start_delay and is preempting
+  // another effect, it will call SetZeroVibration to ensure no vibration
+  // occurs during its start_delay period.
+  EXPECT_THAT(gamepad_->output_reports_,
+              testing::ElementsAre(stop_vibration_output_report_));
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(0, second_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultPreempted,
+            first_callback_result_);
+
+  task_runner_->RunUntilIdle();
+
+  EXPECT_THAT(gamepad_->output_reports_,
+              testing::ElementsAre(stop_vibration_output_report_,
+                                   start_vibration_output_report_,
+                                   stop_vibration_output_report_));
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(1, second_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultComplete,
+            second_callback_result_);
+}
+
+TEST_F(HidHapticGamepadBaseTest, ResetVibrationPreemptionTest) {
+  EXPECT_TRUE(gamepad_->output_reports_.empty());
+  EXPECT_EQ(0, first_callback_count_);
+  EXPECT_EQ(0, second_callback_count_);
+
+  // Start an ongoing effect. We'll preempt it with a reset.
+  PostPlayEffect(
+      mojom::GamepadHapticEffectType::GamepadHapticEffectTypeDualRumble, 1.0,
+      0.0,
+      base::BindOnce(&HidHapticGamepadBaseTest::FirstCallback,
+                     base::Unretained(this)));
+
+  // Reset vibration. This should cause the effect to be preempted before it
+  // calls SetVibration.
+  PostResetVibration(base::BindOnce(&HidHapticGamepadBaseTest::SecondCallback,
+                                    base::Unretained(this)));
+
+  task_runner_->RunUntilIdle();
+
+  EXPECT_THAT(gamepad_->output_reports_,
+              testing::ElementsAre(stop_vibration_output_report_));
+  EXPECT_EQ(1, first_callback_count_);
+  EXPECT_EQ(1, second_callback_count_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultPreempted,
+            first_callback_result_);
+  EXPECT_EQ(mojom::GamepadHapticsResult::GamepadHapticsResultComplete,
+            second_callback_result_);
+}
+
+}  // namespace
+
+}  // namespace device
diff --git a/device/gamepad/hid_haptic_gamepad_linux.cc b/device/gamepad/hid_haptic_gamepad_linux.cc
new file mode 100644
index 0000000..d0680c9
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_linux.cc
@@ -0,0 +1,32 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/gamepad/hid_haptic_gamepad_linux.h"
+
+#include "base/posix/eintr_wrapper.h"
+
+namespace device {
+
+HidHapticGamepadLinux::HidHapticGamepadLinux(int fd,
+                                             const HapticReportData& data)
+    : HidHapticGamepadBase(data), fd_(fd) {}
+
+HidHapticGamepadLinux::~HidHapticGamepadLinux() = default;
+
+// static
+std::unique_ptr<HidHapticGamepadLinux>
+HidHapticGamepadLinux::Create(uint16_t vendor_id, uint16_t product_id, int fd) {
+  const auto* haptic_data = GetHapticReportData(vendor_id, product_id);
+  if (!haptic_data)
+    return nullptr;
+  return std::make_unique<HidHapticGamepadLinux>(fd, *haptic_data);
+}
+
+size_t HidHapticGamepadLinux::WriteOutputReport(void* report,
+                                                size_t report_length) {
+  ssize_t bytes_written = HANDLE_EINTR(write(fd_, report, report_length));
+  return bytes_written < 0 ? 0 : static_cast<size_t>(bytes_written);
+}
+
+}  // namespace device
diff --git a/device/gamepad/hid_haptic_gamepad_linux.h b/device/gamepad/hid_haptic_gamepad_linux.h
new file mode 100644
index 0000000..fa3c9a0
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_linux.h
@@ -0,0 +1,31 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_LINUX_H_
+#define DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_LINUX_H_
+
+#include "device/gamepad/hid_haptic_gamepad_base.h"
+
+#include <memory>
+
+namespace device {
+
+class HidHapticGamepadLinux : public HidHapticGamepadBase {
+ public:
+  HidHapticGamepadLinux(int fd, const HapticReportData& data);
+  ~HidHapticGamepadLinux() override;
+
+  static std::unique_ptr<HidHapticGamepadLinux> Create(uint16_t vendor_id,
+                                                       uint16_t product_id,
+                                                       int fd);
+
+  size_t WriteOutputReport(void* report, size_t report_length) override;
+
+ private:
+  int fd_;
+};
+
+}  // namespace device
+
+#endif  // DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_LINUX_H_
diff --git a/device/gamepad/hid_haptic_gamepad_mac.cc b/device/gamepad/hid_haptic_gamepad_mac.cc
new file mode 100644
index 0000000..4393b7f4
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_mac.cc
@@ -0,0 +1,44 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/gamepad/hid_haptic_gamepad_mac.h"
+
+#include <CoreFoundation/CoreFoundation.h>
+
+namespace device {
+
+HidHapticGamepadMac::HidHapticGamepadMac(IOHIDDeviceRef device_ref,
+                                         const HapticReportData& data)
+    : HidHapticGamepadBase(data), device_ref_(device_ref) {}
+
+HidHapticGamepadMac::~HidHapticGamepadMac() = default;
+
+void HidHapticGamepadMac::DoShutdown() {
+  device_ref_ = nullptr;
+}
+
+// static
+std::unique_ptr<HidHapticGamepadMac> HidHapticGamepadMac::Create(
+    uint16_t vendor_id,
+    uint16_t product_id,
+    IOHIDDeviceRef device_ref) {
+  const auto* haptic_data = GetHapticReportData(vendor_id, product_id);
+  if (!haptic_data)
+    return nullptr;
+  return std::make_unique<HidHapticGamepadMac>(device_ref, *haptic_data);
+}
+
+size_t HidHapticGamepadMac::WriteOutputReport(void* report,
+                                              size_t report_length) {
+  if (!device_ref_)
+    return 0;
+
+  const unsigned char* report_data = static_cast<unsigned char*>(report);
+  IOReturn success =
+      IOHIDDeviceSetReport(device_ref_, kIOHIDReportTypeOutput, report_data[0],
+                           report_data, report_length);
+  return (success == kIOReturnSuccess) ? report_length : 0;
+}
+
+}  // namespace device
diff --git a/device/gamepad/hid_haptic_gamepad_mac.h b/device/gamepad/hid_haptic_gamepad_mac.h
new file mode 100644
index 0000000..621d584
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_mac.h
@@ -0,0 +1,35 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_MAC_H_
+#define DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_MAC_H_
+
+#include "device/gamepad/hid_haptic_gamepad_base.h"
+
+#include <memory>
+
+#include <IOKit/hid/IOHIDManager.h>
+
+namespace device {
+
+class HidHapticGamepadMac : public HidHapticGamepadBase {
+ public:
+  HidHapticGamepadMac(IOHIDDeviceRef device_ref, const HapticReportData& data);
+  ~HidHapticGamepadMac() override;
+
+  static std::unique_ptr<HidHapticGamepadMac> Create(uint16_t vendor_id,
+                                                     uint16_t product_id,
+                                                     IOHIDDeviceRef device_ref);
+
+  void DoShutdown() override;
+
+  size_t WriteOutputReport(void* report, size_t report_length) override;
+
+ private:
+  IOHIDDeviceRef device_ref_;
+};
+
+}  // namespace device
+
+#endif  // DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_MAC_H_
diff --git a/device/gamepad/hid_haptic_gamepad_win.cc b/device/gamepad/hid_haptic_gamepad_win.cc
new file mode 100644
index 0000000..71d0316
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_win.cc
@@ -0,0 +1,99 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/gamepad/hid_haptic_gamepad_win.h"
+
+#include <Unknwn.h>
+#include <WinDef.h>
+#include <stdint.h>
+#include <windows.h>
+
+namespace device {
+
+HidHapticGamepadWin::HidHapticGamepadWin(HANDLE device_handle,
+                                         const HapticReportData& data)
+    : HidHapticGamepadBase(data) {
+  // Fetch the size of the RIDI_DEVICENAME string.
+  UINT size;
+  UINT result = ::GetRawInputDeviceInfo(device_handle, RIDI_DEVICENAME,
+                                        /*pData=*/nullptr, &size);
+  if (result == 0U) {
+    // Read RIDI_DEVICENAME into a buffer.
+    std::unique_ptr<wchar_t[]> name_buffer(new wchar_t[size]);
+    result = ::GetRawInputDeviceInfo(device_handle, RIDI_DEVICENAME,
+                                     name_buffer.get(), &size);
+    if (result == size) {
+      // Open the device handle for asynchronous I/O.
+      hid_handle_.Set(::CreateFile(
+          name_buffer.get(), GENERIC_READ | GENERIC_WRITE,
+          FILE_SHARE_READ | FILE_SHARE_WRITE,
+          /*lpSecurityAttributes=*/nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,
+          /*hTemplateFile=*/nullptr));
+    }
+  }
+}
+
+HidHapticGamepadWin::~HidHapticGamepadWin() = default;
+
+// static
+std::unique_ptr<HidHapticGamepadWin> HidHapticGamepadWin::Create(
+    uint16_t vendor_id,
+    uint16_t product_id,
+    HANDLE device_handle) {
+  const auto* haptic_data = GetHapticReportData(vendor_id, product_id);
+  if (!haptic_data)
+    return nullptr;
+  return std::make_unique<HidHapticGamepadWin>(device_handle, *haptic_data);
+}
+
+void HidHapticGamepadWin::DoShutdown() {
+  hid_handle_.Close();
+}
+
+size_t HidHapticGamepadWin::WriteOutputReport(void* report,
+                                              size_t report_length) {
+  DCHECK(report);
+  DCHECK_GE(report_length, 1U);
+  if (!hid_handle_.IsValid())
+    return 0;
+
+  base::win::ScopedHandle event_handle(
+      ::CreateEvent(/*lpEventAttributes=*/nullptr,
+                    /*bManualReset=*/false,
+                    /*bInitialState=*/false,
+                    /*lpName=*/L""));
+  OVERLAPPED overlapped = {0};
+  overlapped.hEvent = event_handle.Get();
+
+  // Set up an asynchronous write.
+  DWORD bytes_written = 0;
+  BOOL write_success = ::WriteFile(hid_handle_.Get(), report, report_length,
+                                   &bytes_written, &overlapped);
+  if (!write_success) {
+    DWORD error = ::GetLastError();
+    if (error == ERROR_IO_PENDING) {
+      // Wait for the write to complete. This causes WriteOutputReport to behave
+      // synchronously.
+      DWORD wait_object = ::WaitForSingleObject(overlapped.hEvent,
+                                                /*dwMilliseconds=*/100);
+      if (wait_object == WAIT_OBJECT_0) {
+        ::GetOverlappedResult(hid_handle_.Get(), &overlapped, &bytes_written,
+                              /*bWait=*/true);
+      } else {
+        // Wait failed, or the timeout was exceeded before the write completed.
+        // Cancel the write request.
+        if (::CancelIo(hid_handle_.Get())) {
+          HANDLE handles[2];
+          handles[0] = hid_handle_.Get();
+          handles[1] = overlapped.hEvent;
+          ::WaitForMultipleObjects(/*nCount=*/2, handles,
+                                   /*bWaitAll=*/false, INFINITE);
+        }
+      }
+    }
+  }
+  return write_success ? bytes_written : 0;
+}
+
+}  // namespace device
diff --git a/device/gamepad/hid_haptic_gamepad_win.h b/device/gamepad/hid_haptic_gamepad_win.h
new file mode 100644
index 0000000..1e3af00
--- /dev/null
+++ b/device/gamepad/hid_haptic_gamepad_win.h
@@ -0,0 +1,34 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_WIN_H_
+#define DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_WIN_H_
+
+#include "base/win/scoped_handle.h"
+#include "device/gamepad/hid_haptic_gamepad_base.h"
+
+#include <memory>
+
+namespace device {
+
+class HidHapticGamepadWin : public HidHapticGamepadBase {
+ public:
+  HidHapticGamepadWin(HANDLE device_handle, const HapticReportData& data);
+  ~HidHapticGamepadWin() override;
+
+  static std::unique_ptr<HidHapticGamepadWin> Create(uint16_t vendor_id,
+                                                     uint16_t product_id,
+                                                     HANDLE device_handle);
+
+  void DoShutdown() override;
+
+  size_t WriteOutputReport(void* report, size_t report_length) override;
+
+ private:
+  base::win::ScopedHandle hid_handle_;
+};
+
+}  // namespace device
+
+#endif  // DEVICE_GAMEPAD_HID_HAPTIC_GAMEPAD_WIN_H_
diff --git a/device/gamepad/raw_input_gamepad_device_win.cc b/device/gamepad/raw_input_gamepad_device_win.cc
index 171e4bb..3af6923 100644
--- a/device/gamepad/raw_input_gamepad_device_win.cc
+++ b/device/gamepad/raw_input_gamepad_device_win.cc
@@ -85,9 +85,13 @@
   if (hid_functions_->IsValid())
     is_valid_ = QueryDeviceInfo();
 
-  if (is_valid_ &&
-      Dualshock4ControllerWin::IsDualshock4(vendor_id_, product_id_)) {
-    dualshock4_ = std::make_unique<Dualshock4ControllerWin>(handle_);
+  if (is_valid_) {
+    if (Dualshock4ControllerWin::IsDualshock4(vendor_id_, product_id_)) {
+      dualshock4_ = std::make_unique<Dualshock4ControllerWin>(handle_);
+    } else if (HidHapticGamepadWin::IsHidHaptic(vendor_id_, product_id_)) {
+      hid_haptics_ =
+          HidHapticGamepadWin::Create(vendor_id_, product_id_, handle_);
+    }
   }
 }
 
@@ -102,7 +106,10 @@
 void RawInputGamepadDeviceWin::DoShutdown() {
   if (dualshock4_)
     dualshock4_->Shutdown();
-  dualshock4_ = nullptr;
+  dualshock4_.reset();
+  if (hid_haptics_)
+    hid_haptics_->Shutdown();
+  hid_haptics_.reset();
 }
 
 void RawInputGamepadDeviceWin::UpdateGamepad(RAWINPUT* input) {
@@ -204,13 +211,15 @@
 }
 
 bool RawInputGamepadDeviceWin::SupportsVibration() const {
-  return dualshock4_ != nullptr;
+  return dualshock4_ || hid_haptics_;
 }
 
 void RawInputGamepadDeviceWin::SetVibration(double strong_magnitude,
                                             double weak_magnitude) {
   if (dualshock4_)
     dualshock4_->SetVibration(strong_magnitude, weak_magnitude);
+  else if (hid_haptics_)
+    hid_haptics_->SetVibration(strong_magnitude, weak_magnitude);
 }
 
 bool RawInputGamepadDeviceWin::QueryDeviceInfo() {
diff --git a/device/gamepad/raw_input_gamepad_device_win.h b/device/gamepad/raw_input_gamepad_device_win.h
index 72cf57b..cb067288 100644
--- a/device/gamepad/raw_input_gamepad_device_win.h
+++ b/device/gamepad/raw_input_gamepad_device_win.h
@@ -18,6 +18,7 @@
 #include "device/gamepad/abstract_haptic_gamepad.h"
 #include "device/gamepad/dualshock4_controller_win.h"
 #include "device/gamepad/hid_dll_functions_win.h"
+#include "device/gamepad/hid_haptic_gamepad_win.h"
 #include "device/gamepad/public/cpp/gamepad.h"
 
 namespace device {
@@ -136,6 +137,9 @@
 
   // Dualshock4-specific functionality (e.g., haptics), if available.
   std::unique_ptr<Dualshock4ControllerWin> dualshock4_;
+
+  // A controller that uses a HID output report for vibration effects.
+  std::unique_ptr<HidHapticGamepadWin> hid_haptics_;
 };
 
 }  // namespace device
diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc
index f16b87ae..b8a391c 100644
--- a/extensions/browser/event_router.cc
+++ b/extensions/browser/event_router.cc
@@ -730,12 +730,24 @@
   }
   if (!ExtensionsBrowserClient::Get()->IsValidContext(browser_context))
     return;
+  // TODO(https://crbug.com/870838): Remove after investigating the bug.
+  if (!ExtensionRegistry::Get(browser_context)) {
+    LOG(ERROR) << "ExtensionRegistry does not exist.";
+    NOTREACHED();
+    return;
+  }
   const Extension* extension =
       ExtensionRegistry::Get(browser_context)->enabled_extensions().GetByID(
           extension_id);
   if (!extension)
     return;
   EventRouter* event_router = EventRouter::Get(browser_context);
+  // TODO(https://crbug.com/870838): Remove after investigating the bug.
+  if (!event_router) {
+    LOG(ERROR) << "EventRouter does not exist.";
+    NOTREACHED();
+    return;
+  }
   event_router->IncrementInFlightEvents(browser_context, extension, event_id,
                                         event_name);
   event_router->ReportEvent(histogram_value, extension,
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index d6caba7..10c3dd2d 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1357,6 +1357,7 @@
   CRYPTOTOKENPRIVATE_CANPROXYTOWEBAUTHN = 1294,
   INPUTMETHODPRIVATE_GETSETTING = 1295,
   INPUTMETHODPRIVATE_SETSETTING = 1296,
+  FILEMANAGERPRIVATEINTERNAL_UNSHAREPATHWITHCROSTINI = 1297,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/google_apis/drive/auth_service.cc b/google_apis/drive/auth_service.cc
index 90d91fe..736804a 100644
--- a/google_apis/drive/auth_service.cc
+++ b/google_apis/drive/auth_service.cc
@@ -201,8 +201,7 @@
 }
 
 void AuthService::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   if (account_info.account_id == account_id_)
     OnHandleRefreshToken(true);
 }
diff --git a/google_apis/drive/auth_service.h b/google_apis/drive/auth_service.h
index a380304..25b8fe2 100644
--- a/google_apis/drive/auth_service.h
+++ b/google_apis/drive/auth_service.h
@@ -52,8 +52,8 @@
   void ClearRefreshToken() override;
 
   // Overridden from IdentityManager::Observer
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
 
  private:
diff --git a/google_apis/gaia/fake_oauth2_token_service_delegate.cc b/google_apis/gaia/fake_oauth2_token_service_delegate.cc
index 8bd195c..7fc9c28 100644
--- a/google_apis/gaia/fake_oauth2_token_service_delegate.cc
+++ b/google_apis/gaia/fake_oauth2_token_service_delegate.cc
@@ -114,7 +114,7 @@
 void FakeOAuth2TokenServiceDelegate::UpdateAuthError(
     const std::string& account_id,
     const GoogleServiceAuthError& error) {
-  if (GetAuthError(account_id) == error)
+  if (error.IsTransientError() || GetAuthError(account_id) == error)
     return;
 
   // Drop transient errors to match OAuth2TokenService's stated contract for
diff --git a/gpu/ipc/command_buffer_task_executor.h b/gpu/ipc/command_buffer_task_executor.h
index 24a9cebf..0e593ae7 100644
--- a/gpu/ipc/command_buffer_task_executor.h
+++ b/gpu/ipc/command_buffer_task_executor.h
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
 #include "gpu/command_buffer/common/activity_flags.h"
 #include "gpu/command_buffer/common/sync_token.h"
 #include "gpu/command_buffer/service/framebuffer_completeness_cache.h"
@@ -38,7 +39,8 @@
 
 // Provides accessors for GPU service objects and the serializer interface to
 // the GPU thread used by InProcessCommandBuffer.
-class GL_IN_PROCESS_CONTEXT_EXPORT CommandBufferTaskExecutor {
+class GL_IN_PROCESS_CONTEXT_EXPORT CommandBufferTaskExecutor
+    : public base::RefCountedThreadSafe<CommandBufferTaskExecutor> {
  public:
   // Represents a single task execution sequence. Tasks posted to a sequence are
   // run in order. Tasks across sequences should be synchronized using sync
@@ -74,7 +76,6 @@
                             MailboxManager* mailbox_manager,
                             scoped_refptr<gl::GLShareGroup> share_group,
                             gl::GLSurfaceFormat share_group_surface_format);
-  virtual ~CommandBufferTaskExecutor();
 
   // Always use virtualized GL contexts if this returns true.
   virtual bool ForceVirtualizedGLContexts() const = 0;
@@ -125,6 +126,11 @@
   gles2::Outputter* outputter();
   gles2::ProgramCache* program_cache();
 
+ protected:
+  friend class base::RefCountedThreadSafe<CommandBufferTaskExecutor>;
+
+  virtual ~CommandBufferTaskExecutor();
+
  private:
   const GpuPreferences gpu_preferences_;
   const GpuFeatureInfo gpu_feature_info_;
diff --git a/gpu/ipc/gl_in_process_context.cc b/gpu/ipc/gl_in_process_context.cc
index e0113d0..02deb69 100644
--- a/gpu/ipc/gl_in_process_context.cc
+++ b/gpu/ipc/gl_in_process_context.cc
@@ -53,7 +53,7 @@
 }
 
 ContextResult GLInProcessContext::Initialize(
-    CommandBufferTaskExecutor* task_executor,
+    scoped_refptr<CommandBufferTaskExecutor> task_executor,
     scoped_refptr<gl::GLSurface> surface,
     bool is_offscreen,
     SurfaceHandle window,
@@ -72,7 +72,8 @@
   DCHECK_GE(attribs.offscreen_framebuffer_size.width(), 0);
   DCHECK_GE(attribs.offscreen_framebuffer_size.height(), 0);
 
-  command_buffer_ = std::make_unique<InProcessCommandBuffer>(task_executor);
+  command_buffer_ =
+      std::make_unique<InProcessCommandBuffer>(std::move(task_executor));
 
   auto result = command_buffer_->Initialize(
       surface, is_offscreen, window, attribs, /*share_command_buffer=*/nullptr,
diff --git a/gpu/ipc/gl_in_process_context.h b/gpu/ipc/gl_in_process_context.h
index 20c71ba8..b76cfa6 100644
--- a/gpu/ipc/gl_in_process_context.h
+++ b/gpu/ipc/gl_in_process_context.h
@@ -42,7 +42,7 @@
   // not thread safe. If |surface| is null, then the other parameters are used
   // to correctly create a surface.
   ContextResult Initialize(
-      CommandBufferTaskExecutor* task_executor,
+      scoped_refptr<CommandBufferTaskExecutor> task_executor,
       scoped_refptr<gl::GLSurface> surface,
       bool is_offscreen,
       SurfaceHandle window,
diff --git a/gpu/ipc/gpu_in_process_thread_service.h b/gpu/ipc/gpu_in_process_thread_service.h
index d3d5f06..1527230 100644
--- a/gpu/ipc/gpu_in_process_thread_service.h
+++ b/gpu/ipc/gpu_in_process_thread_service.h
@@ -31,7 +31,6 @@
       gl::GLSurfaceFormat share_group_surface_format,
       const GpuFeatureInfo& gpu_feature_info,
       const GpuPreferences& gpu_preferences);
-  ~GpuInProcessThreadService() override;
 
   // CommandBufferTaskExecutor implementation.
   bool ForceVirtualizedGLContexts() const override;
@@ -43,6 +42,8 @@
   void ScheduleDelayedWork(base::OnceClosure task) override;
 
  private:
+  ~GpuInProcessThreadService() override;
+
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   Scheduler* scheduler_;
 
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc
index 18aa079e..734ddfd 100644
--- a/gpu/ipc/in_process_command_buffer.cc
+++ b/gpu/ipc/in_process_command_buffer.cc
@@ -235,11 +235,11 @@
 };
 
 InProcessCommandBuffer::InProcessCommandBuffer(
-    CommandBufferTaskExecutor* task_executor)
+    scoped_refptr<CommandBufferTaskExecutor> task_executer)
     : command_buffer_id_(NextCommandBufferId()),
       flush_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
                    base::WaitableEvent::InitialState::NOT_SIGNALED),
-      task_executor_(task_executor),
+      task_executor_(std::move(task_executer)),
       fence_sync_wait_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
                              base::WaitableEvent::InitialState::NOT_SIGNALED),
       client_thread_weak_ptr_factory_(this),
@@ -301,7 +301,8 @@
     gpu::raster::GrShaderCache* gr_shader_cache,
     GpuProcessActivityFlags* activity_flags) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_);
-  DCHECK(!share_group || task_executor_ == share_group->task_executor_);
+  DCHECK(!share_group ||
+         task_executor_.get() == share_group->task_executor_.get());
   TRACE_EVENT0("gpu", "InProcessCommandBuffer::Initialize")
 
   gpu_memory_buffer_manager_ = gpu_memory_buffer_manager;
diff --git a/gpu/ipc/in_process_command_buffer.h b/gpu/ipc/in_process_command_buffer.h
index 1b609f28..038ddf3 100644
--- a/gpu/ipc/in_process_command_buffer.h
+++ b/gpu/ipc/in_process_command_buffer.h
@@ -83,7 +83,8 @@
       public DecoderClient,
       public ImageTransportSurfaceDelegate {
  public:
-  explicit InProcessCommandBuffer(CommandBufferTaskExecutor* task_executor);
+  explicit InProcessCommandBuffer(
+      scoped_refptr<CommandBufferTaskExecutor> task_executer);
   ~InProcessCommandBuffer() override;
 
   // If |surface| is not null, use it directly; in this case, the command
@@ -181,7 +182,7 @@
   int GetRasterDecoderIdForTest() const;
 
   CommandBufferTaskExecutor* service_for_testing() const {
-    return task_executor_;
+    return task_executor_.get();
   }
 
   gpu::SharedImageInterface* GetSharedImageInterface() const;
@@ -341,7 +342,7 @@
 
   // Accessed on both threads:
   base::WaitableEvent flush_event_;
-  CommandBufferTaskExecutor* const task_executor_;
+  scoped_refptr<CommandBufferTaskExecutor> task_executor_;
   std::unique_ptr<CommandBufferTaskExecutor::Sequence> task_sequence_;
   std::unique_ptr<SharedImageInterface> shared_image_interface_;
 
diff --git a/gpu/ipc/in_process_gpu_thread_holder.cc b/gpu/ipc/in_process_gpu_thread_holder.cc
index 62899c9..6aa45df 100644
--- a/gpu/ipc/in_process_gpu_thread_holder.cc
+++ b/gpu/ipc/in_process_gpu_thread_holder.cc
@@ -48,7 +48,8 @@
   return &gpu_feature_info_;
 }
 
-CommandBufferTaskExecutor* InProcessGpuThreadHolder::GetTaskExecutor() {
+scoped_refptr<CommandBufferTaskExecutor>
+InProcessGpuThreadHolder::GetTaskExecutor() {
   if (!task_executor_) {
     base::WaitableEvent completion;
     task_runner()->PostTask(
@@ -57,7 +58,7 @@
                        base::Unretained(this), &completion));
     completion.Wait();
   }
-  return task_executor_.get();
+  return task_executor_;
 }
 
 void InProcessGpuThreadHolder::InitializeOnGpuThread(
@@ -65,7 +66,7 @@
   sync_point_manager_ = std::make_unique<SyncPointManager>();
   scheduler_ =
       std::make_unique<Scheduler>(task_runner(), sync_point_manager_.get());
-  task_executor_ = std::make_unique<GpuInProcessThreadService>(
+  task_executor_ = base::MakeRefCounted<GpuInProcessThreadService>(
       task_runner(), scheduler_.get(), sync_point_manager_.get(), nullptr,
       nullptr, gl::GLSurfaceFormat(), gpu_feature_info_, gpu_preferences_);
 
diff --git a/gpu/ipc/in_process_gpu_thread_holder.h b/gpu/ipc/in_process_gpu_thread_holder.h
index d455279..cdc98c3d 100644
--- a/gpu/ipc/in_process_gpu_thread_holder.h
+++ b/gpu/ipc/in_process_gpu_thread_holder.h
@@ -39,7 +39,7 @@
 
   // Returns a task executor that runs commands on the GPU thread. The task
   // executor will be created the first time this is called.
-  CommandBufferTaskExecutor* GetTaskExecutor();
+  scoped_refptr<CommandBufferTaskExecutor> GetTaskExecutor();
 
  private:
   void InitializeOnGpuThread(base::WaitableEvent* completion);
@@ -50,7 +50,7 @@
 
   std::unique_ptr<SyncPointManager> sync_point_manager_;
   std::unique_ptr<Scheduler> scheduler_;
-  std::unique_ptr<CommandBufferTaskExecutor> task_executor_;
+  scoped_refptr<CommandBufferTaskExecutor> task_executor_;
 
   DISALLOW_COPY_AND_ASSIGN(InProcessGpuThreadHolder);
 };
diff --git a/gpu/ipc/raster_in_process_context.cc b/gpu/ipc/raster_in_process_context.cc
index 61a1126..088a47d 100644
--- a/gpu/ipc/raster_in_process_context.cc
+++ b/gpu/ipc/raster_in_process_context.cc
@@ -42,7 +42,7 @@
 }
 
 ContextResult RasterInProcessContext::Initialize(
-    CommandBufferTaskExecutor* task_executor,
+    scoped_refptr<CommandBufferTaskExecutor> task_executor,
     const ContextCreationAttribs& attribs,
     const SharedMemoryLimits& memory_limits,
     GpuMemoryBufferManager* gpu_memory_buffer_manager,
@@ -60,7 +60,8 @@
   }
 
   client_task_runner_ = base::MakeRefCounted<base::TestSimpleTaskRunner>();
-  command_buffer_ = std::make_unique<InProcessCommandBuffer>(task_executor);
+  command_buffer_ =
+      std::make_unique<InProcessCommandBuffer>(std::move(task_executor));
   auto result = command_buffer_->Initialize(
       nullptr /* surface */, true /* is_offscreen */, kNullSurfaceHandle,
       attribs, nullptr /* share_command_buffer */, gpu_memory_buffer_manager,
diff --git a/gpu/ipc/raster_in_process_context.h b/gpu/ipc/raster_in_process_context.h
index 51208ac..562a676 100644
--- a/gpu/ipc/raster_in_process_context.h
+++ b/gpu/ipc/raster_in_process_context.h
@@ -42,7 +42,7 @@
   // pairs. |gpu_channel_manager| should be non-null when used in the GPU
   // process.
   ContextResult Initialize(
-      CommandBufferTaskExecutor* task_executor,
+      scoped_refptr<CommandBufferTaskExecutor> task_executor,
       const ContextCreationAttribs& attribs,
       const SharedMemoryLimits& memory_limits,
       GpuMemoryBufferManager* gpu_memory_buffer_manager,
diff --git a/gpu/ipc/webgpu_in_process_context.cc b/gpu/ipc/webgpu_in_process_context.cc
index 01e1b6a..f4280f86 100644
--- a/gpu/ipc/webgpu_in_process_context.cc
+++ b/gpu/ipc/webgpu_in_process_context.cc
@@ -39,7 +39,7 @@
 }
 
 ContextResult WebGPUInProcessContext::Initialize(
-    CommandBufferTaskExecutor* task_executor,
+    scoped_refptr<CommandBufferTaskExecutor> task_executor,
     const ContextCreationAttribs& attribs,
     const SharedMemoryLimits& memory_limits,
     GpuMemoryBufferManager* gpu_memory_buffer_manager,
@@ -53,7 +53,8 @@
   }
 
   client_task_runner_ = base::MakeRefCounted<base::TestSimpleTaskRunner>();
-  command_buffer_ = std::make_unique<InProcessCommandBuffer>(task_executor);
+  command_buffer_ =
+      std::make_unique<InProcessCommandBuffer>(std::move(task_executor));
 
   static const scoped_refptr<gl::GLSurface> surface = nullptr;
   static constexpr bool is_offscreen = true;
diff --git a/gpu/ipc/webgpu_in_process_context.h b/gpu/ipc/webgpu_in_process_context.h
index 1c0ae907..7ef77c59 100644
--- a/gpu/ipc/webgpu_in_process_context.h
+++ b/gpu/ipc/webgpu_in_process_context.h
@@ -40,7 +40,7 @@
   // pairs. |gpu_channel_manager| should be non-null when used in the GPU
   // process.
   ContextResult Initialize(
-      CommandBufferTaskExecutor* task_executor,
+      scoped_refptr<CommandBufferTaskExecutor> task_executor,
       const ContextCreationAttribs& attribs,
       const SharedMemoryLimits& memory_limits,
       GpuMemoryBufferManager* gpu_memory_buffer_manager,
diff --git a/headless/lib/utility/headless_content_utility_client.cc b/headless/lib/utility/headless_content_utility_client.cc
index 3703a36..f950d48 100644
--- a/headless/lib/utility/headless_content_utility_client.cc
+++ b/headless/lib/utility/headless_content_utility_client.cc
@@ -38,8 +38,7 @@
     service_manager::mojom::ServiceRequest request) {
 #if BUILDFLAG(ENABLE_PRINTING) && !defined(CHROME_MULTIPLE_DLL_BROWSER)
   if (service_name == printing::mojom::kServiceName) {
-    return printing::CreatePdfCompositorService(user_agent_,
-                                                std::move(request));
+    return printing::CreatePdfCompositorService(std::move(request));
   }
 #endif
 
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg
index dd58e0b..c42eaf4 100644
--- a/infra/config/global/luci-milo.cfg
+++ b/infra/config/global/luci-milo.cfg
@@ -3571,73 +3571,51 @@
   refs: "refs/heads/master"
   manifest_name: "REVISION"
   builders {
-    name: "buildbot/chromium.webrtc/Android Builder"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Android Builder"
     category: "android"
     short_name: "bld"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Android Tester"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Android Tester"
     category: "android"
     short_name: "tst"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Linux Builder"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Linux Builder"
     category: "linux"
     short_name: "bld"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Linux Tester"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Linux Tester"
     category: "linux"
     short_name: "tst"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Mac Builder"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Mac Builder"
     category: "mac"
     short_name: "bld"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Mac Tester"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Mac Tester"
     category: "mac"
     short_name: "tst"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Mac Tester (long-running)"
-    name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Mac Tester (long-running)"
-    category: "mac"
-    short_name: "lng"
-  }
-  builders {
-    name: "buildbot/chromium.webrtc/Win Builder"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Win Builder"
     category: "win"
     short_name: "bld"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Win10 Tester"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Win10 Tester"
     category: "win"
     short_name: "10"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Win7 Tester"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Win7 Tester"
     category: "win"
     short_name: "7"
   }
   builders {
-    name: "buildbot/chromium.webrtc/Win7 Tester (long-running)"
-    name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Win7 Tester (long-running)"
-    category: "win"
-    short_name: "lng"
-  }
-  builders {
-    name: "buildbot/chromium.webrtc/Win8 Tester"
     name: "buildbucket/luci.chromium.webrtc/WebRTC Chromium Win8 Tester"
     category: "win"
     short_name: "8"
@@ -3652,7 +3630,6 @@
   refs: "refs/heads/master"
   manifest_name: "REVISION"
   builders {
-    name: "buildbot/chromium.webrtc.fyi/WebRTC Chromium FYI Android Builder (dbg)"
     name: "buildbucket/luci.chromium.webrtc.fyi/WebRTC Chromium FYI Android Builder (dbg)"
     category: "android|debug|builder"
     short_name: "32"
diff --git a/infra/scripts/legacy/scripts/slave/chromium/sizes.py b/infra/scripts/legacy/scripts/slave/chromium/sizes.py
index 1598266..9554eac 100755
--- a/infra/scripts/legacy/scripts/slave/chromium/sizes.py
+++ b/infra/scripts/legacy/scripts/slave/chromium/sizes.py
@@ -34,9 +34,27 @@
 sys.path.append(os.path.join(SRC_DIR, 'third_party', 'catapult', 'tracing'))
 from tracing.value import convert_chart_json
 
+# If something adds a static initializer, revert it, don't increase these
+# numbers. We don't accept regressions in static initializers.
+#
+# Note: Counts for chrome and nacl_helper are one higher in branded builds
+# compared to release builds.  This is due to a static initializer in
+# WelsThreadPool.cpp (https://crbug.com/893594).
+EXPECTED_LINUX_SI_COUNTS = {
+  'chrome': 5,
+  'nacl_helper': 5,
+  'nacl_helper_bootstrap': 0,
+}
+
+# If something adds a static initializer, revert it, don't increase these
+# numbers. We don't accept regressions in static initializers.
+EXPECTED_MAC_SI_COUNT = 1  # https://crbug.com/893594
+
+
 class ResultsCollector(object):
   def __init__(self):
     self.results = {}
+    self.failures = []
 
   def add_result(self, name, identifier, value, units):
     assert name not in self.results
@@ -49,6 +67,9 @@
     # Legacy printing, previously used for parsing the text logs.
     print 'RESULT %s: %s= %s %s' % (name, identifier, value, units)
 
+  def add_failure(self, failure):
+    self.failures.append(failure)
+
 
 def get_size(filename):
   return os.stat(filename)[stat.ST_SIZE]
@@ -83,6 +104,12 @@
   return result, stdout
 
 
+def print_si_fail_hint(path_to_tool):
+  """Print a hint regarding how to handle a static initializer failure."""
+  print '# HINT: To get this list, run %s' % path_to_tool
+  print '# HINT: diff against the log from the last run to see what changed'
+
+
 def main_mac(options, args, results_collector):
   """Print appropriate size information about built Mac targets.
 
@@ -146,6 +173,55 @@
       du_s = re.search(r'(\d+)', stdout).group(1)
       print_dict['app_bundle_size'] = (int(du_s) * 1024)
 
+      # Count the number of files with at least one static initializer.
+      si_count = 0
+      # Find the __DATA,__mod_init_func section.
+      result, stdout = run_process(result,
+          ['otool', '-l', chromium_framework_executable])
+      section_index = stdout.find('sectname __mod_init_func')
+      if section_index != -1:
+        # If the section exists, the "size" line must follow it.
+        initializers_s = re.search('size 0x([0-9a-f]+)',
+                                   stdout[section_index:]).group(1)
+        word_size = 8  # Assume 64 bit
+        si_count = int(initializers_s, 16) / word_size
+      print_dict['initializers'] = si_count
+
+      # For Release builds only, use dump-static-initializers.py to print the
+      # list of static initializers.
+      if si_count > EXPECTED_MAC_SI_COUNT and options.target == 'Release':
+        result = 125
+        results_collector.add_failure(
+            'Expected 0 static initializers in %s, but found %d' %
+            (chromium_framework_executable, si_count))
+        print '\n# Static initializers in %s:' % chromium_framework_executable
+
+        # First look for a dSYM to get information about the initializers. If
+        # one is not present, check if there is an unstripped copy of the build
+        # output.
+        mac_tools_path = os.path.join(os.path.dirname(build_dir),
+                                      'tools', 'mac')
+        if os.path.exists(chromium_framework_dsym):
+          dump_static_initializers = os.path.join(
+              mac_tools_path, 'dump-static-initializers.py')
+          result, stdout = run_process(result, [dump_static_initializers,
+                                                chromium_framework_dsym])
+          print_si_fail_hint('tools/mac/dump-static-initializers.py')
+          print stdout
+        else:
+          show_mod_init_func = os.path.join(
+              mac_tools_path, 'show_mod_init_func.py')
+          args = [show_mod_init_func]
+          if os.path.exists(chromium_framework_unstripped):
+            args.append(chromium_framework_unstripped)
+          else:
+            print '# Warning: Falling back to potentially stripped output.'
+            args.append(chromium_framework_executable)
+          result, stdout = run_process(result, args)
+          print_si_fail_hint('tools/mac/show_mod_init_func.py')
+          print stdout
+
+
       results_collector.add_result(
           print_dict['app_name'], print_dict['app_name'],
           print_dict['app_size'], 'bytes')
@@ -173,6 +249,9 @@
       results_collector.add_result(
           print_dict['app_bundle'], print_dict['app_bundle'],
           print_dict['app_bundle_size'], 'bytes')
+      results_collector.add_result(
+          'chrome-si', 'initializers',
+          print_dict['initializers'], 'files')
 
       # Found a match, don't check the other base_names.
       return result
@@ -200,6 +279,15 @@
   result = 0
   sizes = []
 
+  def get_elf_section_size(readelf_stdout, section_name):
+    # Matches: .ctors PROGBITS 000000000516add0 5169dd0 000010 00 WA 0 0 8
+    match = re.search(r'\.%s.*$' % re.escape(section_name),
+                      readelf_stdout, re.MULTILINE)
+    if not match:
+      return (False, -1)
+    size_str = re.split(r'\W+', match.group(0))[5]
+    return (True, int(size_str, 16))
+
   sizes.append((binary_name, binary_name, 'size',
                 get_size(binary_file), 'bytes'))
 
@@ -216,6 +304,51 @@
       (binary_name + '-bss', 'bss', '', bss, 'bytes'),
       ]
 
+  # Find the number of files with at least one static initializer.
+  # First determine if we're 32 or 64 bit
+  result, stdout = run_process(result, ['readelf', '-h', binary_file])
+  elf_class_line = re.search('Class:.*$', stdout, re.MULTILINE).group(0)
+  elf_class = re.split(r'\W+', elf_class_line)[1]
+  if elf_class == 'ELF32':
+    word_size = 4
+  else:
+    word_size = 8
+
+  # Then find the number of files with global static initializers.
+  # NOTE: this is very implementation-specific and makes assumptions
+  # about how compiler and linker implement global static initializers.
+  si_count = 0
+  result, stdout = run_process(result, ['readelf', '-SW', binary_file])
+  has_init_array, init_array_size = get_elf_section_size(stdout, 'init_array')
+  if has_init_array:
+    si_count = init_array_size / word_size
+    # In newer versions of gcc crtbegin.o inserts frame_dummy into .init_array
+    # but we don't want to count this entry, since its alwasys present and not
+    # related to our code.
+    si_count -= 1
+  si_count = max(si_count, 0)
+  sizes.append((binary_name + '-si', 'initializers', '', si_count, 'files'))
+
+  # For Release builds only, use dump-static-initializers.py to print the list
+  # of static initializers.
+  if options.target == 'Release':
+    if (binary_name in EXPECTED_LINUX_SI_COUNTS and
+        si_count > EXPECTED_LINUX_SI_COUNTS[binary_name]):
+      result = 125
+      results_collector.add_failure(
+          'Expected <= %d static initializers in %s, but found %d' %
+          (EXPECTED_LINUX_SI_COUNTS[binary_name], binary_name, si_count))
+    if si_count > 0:
+      build_dir = os.path.dirname(target_dir)
+      dump_static_initializers = os.path.join(os.path.dirname(build_dir),
+                                              'tools', 'linux',
+                                              'dump-static-initializers.py')
+      result, stdout = run_process(result, [dump_static_initializers,
+                                            '-d', binary_file])
+      print '\n# Static initializers in %s:' % binary_file
+      print_si_fail_hint('tools/linux/dump-static-initializers.py')
+      print stdout
+
   # Determine if the binary has the DT_TEXTREL marker.
   result, stdout = run_process(result, ['readelf', '-Wd', binary_file])
   if re.search(r'\bTEXTREL\b', stdout) is None:
@@ -439,6 +572,8 @@
                            help='specify platform (%s) [default: %%default]'
                                 % ', '.join(platforms))
   option_parser.add_option('--json', help='Path to JSON output file')
+  option_parser.add_option('--failures',
+                           help='Path to JSON output file for failures')
   # This needs to be --output-dir (and not something like --output-directory) in
   # order to work properly with the build-side runtest.py script that's
   # currently used for dashboard uploading results from this script.
@@ -484,6 +619,10 @@
     with open(histogram_path, 'w') as f:
       f.write(histogram_result.stdout)
 
+  if options.failures:
+    with open(options.failures, 'w') as f:
+      json.dump(results_collector.failures, f)
+
   return rc
 
 
diff --git a/ios/build/config.gni b/ios/build/config.gni
index b61919f..db6a355 100644
--- a/ios/build/config.gni
+++ b/ios/build/config.gni
@@ -10,10 +10,10 @@
   "//dbus/*",
   "//jingle:jingle",
   "//media/*",
+  "//third_party/blink/*",
   "//third_party/ffmpeg/*",
   "//third_party/hunspell_dictionaries/*",
   "//third_party/webgl/*",
-  "//third_party/WebKit/*",
   "//third_party/webrtc:webrtc",
 ]
 
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn
index a7a58f5..5827e46 100644
--- a/ios/chrome/browser/BUILD.gn
+++ b/ios/chrome/browser/BUILD.gn
@@ -122,6 +122,7 @@
     "//ios/chrome/browser/browsing_data:feature_flags",
     "//ios/chrome/browser/crash_report:flags",
     "//ios/chrome/browser/download",
+    "//ios/chrome/browser/download:features",
     "//ios/chrome/browser/drag_and_drop",
     "//ios/chrome/browser/itunes_urls",
     "//ios/chrome/browser/mailto:feature_flags",
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index 393701b..90bfbf8c 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -46,6 +46,7 @@
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
 #include "ios/chrome/browser/chrome_switches.h"
 #include "ios/chrome/browser/crash_report/crash_report_flags.h"
+#include "ios/chrome/browser/download/features.h"
 #include "ios/chrome/browser/drag_and_drop/drag_and_drop_flag.h"
 #include "ios/chrome/browser/ios_chrome_flag_descriptions.h"
 #include "ios/chrome/browser/itunes_urls/itunes_urls_flag.h"
@@ -215,6 +216,9 @@
          feature_engagement::kIPHDemoMode,
          feature_engagement::kIPHDemoModeChoiceVariations,
          "IPH_DemoMode")},
+    {"preview-usdz", flag_descriptions::kUsdzPreviewName,
+     flag_descriptions::kUsdzPreviewDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(download::kUsdzPreview)},
     {"use-ddljson-api", flag_descriptions::kUseDdljsonApiName,
      flag_descriptions::kUseDdljsonApiDescription, flags_ui::kOsIos,
      MULTI_VALUE_TYPE(kUseDdljsonApiChoices)},
@@ -297,10 +301,6 @@
     {"unified-consent", flag_descriptions::kUnifiedConsentName,
      flag_descriptions::kUnifiedConsentDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(unified_consent::kUnifiedConsent)},
-    {"force-unified-consent-bump",
-     flag_descriptions::kForceUnifiedConsentBumpName,
-     flag_descriptions::kForceUnifiedConsentBumpDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(unified_consent::kForceUnifiedConsentBump)},
     {"autofill-dynamic-forms", flag_descriptions::kAutofillDynamicFormsName,
      flag_descriptions::kAutofillDynamicFormsDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(autofill::features::kAutofillDynamicForms)},
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm
index 1f4eeff3..f75a001a0 100644
--- a/ios/chrome/browser/context_menu/context_menu_egtest.mm
+++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -60,7 +60,7 @@
 // HTML content of the destination page.
 const char kDestinationHtml[] =
     "<html><body><script>document.title='new doc'</script>"
-    "<span id=\"message\">You made it!</span>"
+    "<center><span id=\"message\">You made it!</span></center>"
     "</body></html>";
 // The DOM element ID of the message on the destination page.
 const char kDestinationPageTextId[] = "message";
diff --git a/ios/chrome/browser/download/BUILD.gn b/ios/chrome/browser/download/BUILD.gn
index b51e6ba..df8a7a8 100644
--- a/ios/chrome/browser/download/BUILD.gn
+++ b/ios/chrome/browser/download/BUILD.gn
@@ -29,6 +29,7 @@
   ]
 
   deps = [
+    ":features",
     "//base",
     "//components/keyed_service/core",
     "//components/keyed_service/ios",
@@ -48,6 +49,19 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+source_set("features") {
+  sources = [
+    "features.h",
+    "features.mm",
+  ]
+
+  deps = [
+    "//base",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
+
 source_set("unit_tests") {
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
@@ -65,6 +79,7 @@
     "//base/test:test_support",
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/download",
+    "//ios/chrome/browser/download:features",
     "//ios/chrome/browser/ui:network_activity_indicator_manager",
     "//ios/chrome/test/fakes",
     "//ios/web/public",
@@ -81,8 +96,8 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
-    "pass_kit_test_util.cc",
-    "pass_kit_test_util.h",
+    "download_test_util.cc",
+    "download_test_util.h",
   ]
   deps = [
     "//base",
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
index b464c1a..901e35a 100644
--- a/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
+++ b/ios/chrome/browser/download/ar_quick_look_tab_helper.mm
@@ -122,6 +122,12 @@
 
 void ARQuickLookTabHelper::DidFinishDownload() {
   DCHECK_EQ(download_task_->GetState(), web::DownloadTask::State::kComplete);
+  // Inform the delegate only if the download has been successful.
+  if (download_task_->GetHttpCode() == 401 ||
+      download_task_->GetHttpCode() == 403 || download_task_->GetErrorCode() ||
+      download_task_->GetMimeType() != kUsdzMimeType) {
+    return;
+  }
 
   net::URLFetcherFileWriter* file_writer =
       download_task_->GetResponseWriter()->AsFileWriter();
diff --git a/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm b/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm
index 9522550..2bafadd6 100644
--- a/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm
+++ b/ios/chrome/browser/download/ar_quick_look_tab_helper_unittest.mm
@@ -194,8 +194,7 @@
   }));
   task_ptr->SetMimeType("text/html");
   task_ptr->SetDone(true);
-  EXPECT_EQ(1U, delegate().fileURLs.count);
-  EXPECT_TRUE([delegate().fileURLs.firstObject isKindOfClass:[NSURL class]]);
+  EXPECT_EQ(0U, delegate().fileURLs.count);
 
   histogram_tester()->ExpectBucketCount(
       kHistogramName,
@@ -227,8 +226,7 @@
   }));
   task_ptr->SetErrorCode(net::ERR_INTERNET_DISCONNECTED);
   task_ptr->SetDone(true);
-  EXPECT_EQ(1U, delegate().fileURLs.count);
-  EXPECT_TRUE([delegate().fileURLs.firstObject isKindOfClass:[NSURL class]]);
+  EXPECT_EQ(0U, delegate().fileURLs.count);
 
   histogram_tester()->ExpectBucketCount(
       kHistogramName,
@@ -260,8 +258,7 @@
   }));
   task_ptr->SetHttpCode(401);
   task_ptr->SetDone(true);
-  EXPECT_EQ(1U, delegate().fileURLs.count);
-  EXPECT_TRUE([delegate().fileURLs.firstObject isKindOfClass:[NSURL class]]);
+  EXPECT_EQ(0U, delegate().fileURLs.count);
 
   histogram_tester()->ExpectBucketCount(
       kHistogramName,
@@ -293,8 +290,7 @@
   }));
   task_ptr->SetHttpCode(403);
   task_ptr->SetDone(true);
-  EXPECT_EQ(1U, delegate().fileURLs.count);
-  EXPECT_TRUE([delegate().fileURLs.firstObject isKindOfClass:[NSURL class]]);
+  EXPECT_EQ(0U, delegate().fileURLs.count);
 
   histogram_tester()->ExpectBucketCount(
       kHistogramName,
diff --git a/ios/chrome/browser/download/browser_download_service.mm b/ios/chrome/browser/download/browser_download_service.mm
index 79fc9e27..86270fb 100644
--- a/ios/chrome/browser/download/browser_download_service.mm
+++ b/ios/chrome/browser/download/browser_download_service.mm
@@ -5,9 +5,12 @@
 #include "ios/chrome/browser/download/browser_download_service.h"
 
 #include "base/metrics/histogram_macros.h"
+#import "ios/chrome/browser/download/ar_quick_look_tab_helper.h"
 #import "ios/chrome/browser/download/download_manager_tab_helper.h"
+#import "ios/chrome/browser/download/features.h"
 #include "ios/chrome/browser/download/pass_kit_mime_type.h"
 #import "ios/chrome/browser/download/pass_kit_tab_helper.h"
+#include "ios/chrome/browser/download/usdz_mime_type.h"
 #import "ios/web/public/download/download_controller.h"
 #import "ios/web/public/download/download_task.h"
 
@@ -39,7 +42,7 @@
   if (mime_type == "text/calendar")
     return DownloadMimeTypeResult::iCalendar;
 
-  if (mime_type == "model/usd")
+  if (mime_type == kUsdzMimeType)
     return DownloadMimeTypeResult::UniversalSceneDescription;
 
   return DownloadMimeTypeResult::Other;
@@ -72,6 +75,13 @@
     if (tab_helper) {
       tab_helper->Download(std::move(task));
     }
+  } else if (task->GetMimeType() == kUsdzMimeType &&
+             download::IsUsdzPreviewEnabled()) {
+    ARQuickLookTabHelper* tab_helper =
+        ARQuickLookTabHelper::FromWebState(web_state);
+    if (tab_helper) {
+      tab_helper->Download(std::move(task));
+    }
   } else {
     DownloadManagerTabHelper* tab_helper =
         DownloadManagerTabHelper::FromWebState(web_state);
diff --git a/ios/chrome/browser/download/browser_download_service_unittest.mm b/ios/chrome/browser/download/browser_download_service_unittest.mm
index 71b4a7e..59329ad 100644
--- a/ios/chrome/browser/download/browser_download_service_unittest.mm
+++ b/ios/chrome/browser/download/browser_download_service_unittest.mm
@@ -8,10 +8,14 @@
 
 #include "base/macros.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/download/ar_quick_look_tab_helper.h"
 #import "ios/chrome/browser/download/download_manager_tab_helper.h"
+#import "ios/chrome/browser/download/features.h"
 #include "ios/chrome/browser/download/pass_kit_mime_type.h"
 #import "ios/chrome/browser/download/pass_kit_tab_helper.h"
+#include "ios/chrome/browser/download/usdz_mime_type.h"
 #import "ios/web/public/download/download_controller.h"
 #import "ios/web/public/download/download_task.h"
 #import "ios/web/public/test/fakes/fake_download_task.h"
@@ -61,7 +65,10 @@
  protected:
   BrowserDownloadServiceTest()
       : browser_state_(browser_state_builder_.Build()) {
+    scoped_feature_list_.InitAndEnableFeature(download::kUsdzPreview);
+
     StubTabHelper<PassKitTabHelper>::CreateForWebState(&web_state_);
+    StubTabHelper<ARQuickLookTabHelper>::CreateForWebState(&web_state_);
     StubTabHelper<DownloadManagerTabHelper>::CreateForWebState(&web_state_);
 
     // BrowserDownloadServiceFactory sets its service as
@@ -89,6 +96,11 @@
         PassKitTabHelper::FromWebState(&web_state_));
   }
 
+  StubTabHelper<ARQuickLookTabHelper>* ar_quick_look_tab_helper() {
+    return static_cast<StubTabHelper<ARQuickLookTabHelper>*>(
+        ARQuickLookTabHelper::FromWebState(&web_state_));
+  }
+
   StubTabHelper<DownloadManagerTabHelper>* download_manager_tab_helper() {
     return static_cast<StubTabHelper<DownloadManagerTabHelper>*>(
         DownloadManagerTabHelper::FromWebState(&web_state_));
@@ -101,6 +113,7 @@
   std::unique_ptr<BrowserDownloadService> service_;
   web::TestWebState web_state_;
   base::HistogramTester histogram_tester_;
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 // Tests that BrowserDownloadService downloads the task using
@@ -121,6 +134,31 @@
       1);
 }
 
+// Tests that BrowserDownloadService downloads the task using
+// ARQuickLookTabHelper.
+TEST_F(BrowserDownloadServiceTest, UsdzMimeType) {
+  if (!download::IsUsdzPreviewEnabled()) {
+    // Disabled on iOS versions below 12 because QLPreviewController is not
+    // available.
+    return;
+  }
+
+  ASSERT_TRUE(download_controller()->GetDelegate());
+  auto task =
+      std::make_unique<web::FakeDownloadTask>(GURL(kUrl), kUsdzMimeType);
+  web::DownloadTask* task_ptr = task.get();
+  download_controller()->GetDelegate()->OnDownloadCreated(
+      download_controller(), &web_state_, std::move(task));
+  ASSERT_EQ(1U, ar_quick_look_tab_helper()->tasks().size());
+  EXPECT_EQ(task_ptr, ar_quick_look_tab_helper()->tasks()[0].get());
+  ASSERT_TRUE(download_manager_tab_helper()->tasks().empty());
+  histogram_tester_.ExpectUniqueSample(
+      "Download.IOSDownloadMimeType",
+      static_cast<base::HistogramBase::Sample>(
+          DownloadMimeTypeResult::UniversalSceneDescription),
+      1);
+}
+
 // Tests that BrowserDownloadService uses DownloadManagerTabHelper for PDF Mime
 // Type.
 TEST_F(BrowserDownloadServiceTest, PdfMimeType) {
diff --git a/ios/chrome/browser/download/download_test_util.cc b/ios/chrome/browser/download/download_test_util.cc
new file mode 100644
index 0000000..8219b51c
--- /dev/null
+++ b/ios/chrome/browser/download/download_test_util.cc
@@ -0,0 +1,31 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/browser/download/download_test_util.h"
+
+#include "base/base_paths.h"
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+
+namespace testing {
+
+const char kPkPassFilePath[] =
+    "ios/testing/data/http_server_files/generic.pkpass";
+const char kUsdzFilePath[] = "ios/testing/data/http_server_files/redchair.usdz";
+
+std::string GetTestFileContents(const char* file_path) {
+  base::FilePath path;
+  base::PathService::Get(base::DIR_MODULE, &path);
+  path = path.Append(FILE_PATH_LITERAL(file_path));
+  base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+  size_t size_to_read = file.GetLength();
+  std::string contents;
+  contents.resize(size_to_read);
+  size_t size_read = file.ReadAtCurrentPos(&contents[0], size_to_read);
+  contents.resize(size_read);
+  return contents;
+}
+
+}  // namespace testing
diff --git a/ios/chrome/browser/download/download_test_util.h b/ios/chrome/browser/download/download_test_util.h
new file mode 100644
index 0000000..c517c30
--- /dev/null
+++ b/ios/chrome/browser/download/download_test_util.h
@@ -0,0 +1,21 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TEST_UTIL_H_
+#define IOS_CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TEST_UTIL_H_
+
+#include <string>
+
+namespace testing {
+
+extern const char kPkPassFilePath[];
+extern const char kUsdzFilePath[];
+
+// Returns contents of the test file at the given relative path in the chrome
+// test directory.
+std::string GetTestFileContents(const char* file_path);
+
+}  // namespace testing
+
+#endif  // IOS_CHROME_BROWSER_DOWNLOAD_DOWNLOAD_TEST_UTIL_H_
diff --git a/ios/chrome/browser/download/features.h b/ios/chrome/browser/download/features.h
new file mode 100644
index 0000000..aabd567
--- /dev/null
+++ b/ios/chrome/browser/download/features.h
@@ -0,0 +1,19 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_DOWNLOAD_FEATURES_H_
+#define IOS_CHROME_BROWSER_DOWNLOAD_FEATURES_H_
+
+#include "base/feature_list.h"
+
+namespace download {
+
+extern const base::Feature kUsdzPreview;
+
+// Returns whether USDZ AR Quick Look is enabled.
+bool IsUsdzPreviewEnabled();
+
+}  // namespace download
+
+#endif  // IOS_CHROME_BROWSER_DOWNLOAD_FEATURES_H_
diff --git a/ios/chrome/browser/download/features.mm b/ios/chrome/browser/download/features.mm
new file mode 100644
index 0000000..f2701e21
--- /dev/null
+++ b/ios/chrome/browser/download/features.mm
@@ -0,0 +1,27 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Foundation/Foundation.h>
+
+#include "ios/chrome/browser/download/features.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace download {
+
+// Controls previewing USDZ format 3D models in AR Quick Look.
+const base::Feature kUsdzPreview{"USDZPreview",
+                                 base::FEATURE_ENABLED_BY_DEFAULT};
+
+// Returns whether AR Quick Look in enabled.
+bool IsUsdzPreviewEnabled() {
+  if (@available(iOS 12, *)) {
+    return base::FeatureList::IsEnabled(kUsdzPreview);
+  }
+  return false;
+}
+
+}  // namespace download
diff --git a/ios/chrome/browser/download/pass_kit_tab_helper_unittest.mm b/ios/chrome/browser/download/pass_kit_tab_helper_unittest.mm
index 09794b10..2fab4a4 100644
--- a/ios/chrome/browser/download/pass_kit_tab_helper_unittest.mm
+++ b/ios/chrome/browser/download/pass_kit_tab_helper_unittest.mm
@@ -10,8 +10,8 @@
 
 #include "base/bind_helpers.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "ios/chrome/browser/download/download_test_util.h"
 #include "ios/chrome/browser/download/pass_kit_mime_type.h"
-#include "ios/chrome/browser/download/pass_kit_test_util.h"
 #import "ios/chrome/test/fakes/fake_pass_kit_tab_helper_delegate.h"
 #import "ios/web/public/test/fakes/fake_download_task.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
@@ -99,7 +99,8 @@
   web::FakeDownloadTask* task_ptr = task.get();
   tab_helper()->Download(std::move(task));
 
-  std::string pass_data = testing::GetTestPass();
+  std::string pass_data =
+      testing::GetTestFileContents(testing::kPkPassFilePath);
   auto buffer = base::MakeRefCounted<net::IOBuffer>(pass_data.size());
   memcpy(buffer->data(), pass_data.c_str(), pass_data.size());
   // Writing to URLFetcherStringWriter, which is used by PassKitTabHelper is
diff --git a/ios/chrome/browser/download/pass_kit_test_util.cc b/ios/chrome/browser/download/pass_kit_test_util.cc
deleted file mode 100644
index 45d2317..0000000
--- a/ios/chrome/browser/download/pass_kit_test_util.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ios/chrome/browser/download/pass_kit_test_util.h"
-
-#include "base/base_paths.h"
-#include "base/files/file.h"
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-
-namespace testing {
-
-std::string GetTestPass() {
-  base::FilePath path;
-  base::PathService::Get(base::DIR_MODULE, &path);
-  const char kFilePath[] = "ios/testing/data/http_server_files/generic.pkpass";
-  path = path.Append(FILE_PATH_LITERAL(kFilePath));
-  base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-  char pass_kit_data[file.GetLength()];
-  file.ReadAtCurrentPos(pass_kit_data, file.GetLength());
-  return std::string(pass_kit_data, file.GetLength());
-}
-
-}  // namespace testing
diff --git a/ios/chrome/browser/download/pass_kit_test_util.h b/ios/chrome/browser/download/pass_kit_test_util.h
deleted file mode 100644
index 4e0c58d..0000000
--- a/ios/chrome/browser/download/pass_kit_test_util.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_DOWNLOAD_PASS_KIT_TEST_UTIL_H_
-#define IOS_CHROME_BROWSER_DOWNLOAD_PASS_KIT_TEST_UTIL_H_
-
-#include <string>
-
-namespace testing {
-
-// Returns the content of a test pkpass file.
-std::string GetTestPass();
-
-}  // namespace testing
-
-#endif  // IOS_CHROME_BROWSER_DOWNLOAD_PASS_KIT_TEST_UTIL_H_
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
index 4973335..9f0de95 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -347,10 +347,9 @@
 const char kUseMultiloginEndpointDescription[] =
     "Use Gaia OAuth multilogin for identity consistency.";
 
-const char kForceUnifiedConsentBumpName[] = "Force Unified Consent Bump";
-const char kForceUnifiedConsentBumpDescription[] =
-    "Force the unified consent bump UI to be shown on every start-up. This "
-    "flag is for debug purpose, to test the UI.";
+const char kUsdzPreviewName[] = "Preview USDZ format 3D models";
+const char kUsdzPreviewDescription[] =
+    "Enables previewing USDZ format 3D models in AR Quick Look.";
 
 const char kUseDdljsonApiName[] = "Use new ddljson API for Doodles";
 const char kUseDdljsonApiDescription[] =
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h
index 0eb188b..c86a64f 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -283,9 +283,9 @@
 extern const char kUseMultiloginEndpointName[];
 extern const char kUseMultiloginEndpointDescription[];
 
-// Title and description for the flag to force the consent bump.
-extern const char kForceUnifiedConsentBumpName[];
-extern const char kForceUnifiedConsentBumpDescription[];
+// Title and description for the flag to enable previewing USDZ 3 model files.
+extern const char kUsdzPreviewName[];
+extern const char kUsdzPreviewDescription[];
 
 // Title and description for the flag to enable the ddljson Doodle API.
 extern const char kUseDdljsonApiName[];
diff --git a/ios/chrome/browser/signin/authentication_service.mm b/ios/chrome/browser/signin/authentication_service.mm
index db7108f..e6ae02b 100644
--- a/ios/chrome/browser/signin/authentication_service.mm
+++ b/ios/chrome/browser/signin/authentication_service.mm
@@ -19,6 +19,7 @@
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.h"
 #include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_user_settings.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "ios/chrome/browser/crash_report/breakpad_helper.h"
 #include "ios/chrome/browser/experimental_flags.h"
@@ -365,7 +366,7 @@
   // TODO(msarda): Remove this code once the authentication error UI checks
   // SigninGlobalError instead of the sync auth error state.
   // crbug.com/289493
-  sync_service_->RequestStart();
+  sync_service_->GetUserSettings()->SetSyncRequested(true);
   breakpad_helper::SetCurrentlySignedIn(true);
 }
 
@@ -380,7 +381,7 @@
 
   bool is_managed = IsAuthenticatedIdentityManaged();
 
-  sync_service_->RequestStop(syncer::SyncService::CLEAR_DATA);
+  sync_service_->StopAndClear();
   identity_manager_->ClearPrimaryAccount(
       identity::IdentityManager::ClearAccountTokensAction::kDefault,
       signout_source, signin_metrics::SignoutDelete::IGNORE_METRIC);
diff --git a/ios/chrome/browser/signin/authentication_service_unittest.mm b/ios/chrome/browser/signin/authentication_service_unittest.mm
index c8dac83a..ceb594d 100644
--- a/ios/chrome/browser/signin/authentication_service_unittest.mm
+++ b/ios/chrome/browser/signin/authentication_service_unittest.mm
@@ -31,7 +31,6 @@
 #include "ios/chrome/browser/signin/ios_chrome_signin_client.h"
 #include "ios/chrome/browser/signin/profile_oauth2_token_service_factory.h"
 #include "ios/chrome/browser/signin/signin_client_factory.h"
-#include "ios/chrome/browser/signin/signin_error_controller_factory.h"
 #include "ios/chrome/browser/sync/ios_chrome_profile_sync_test_util.h"
 #include "ios/chrome/browser/sync/profile_sync_service_factory.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
@@ -62,7 +61,6 @@
  public:
   explicit FakeSigninClient(
       ios::ChromeBrowserState* browser_state,
-      SigninErrorController* signin_error_controller,
       scoped_refptr<content_settings::CookieSettings> cookie_settings,
       scoped_refptr<HostContentSettingsMap> host_content_settings_map)
       : IOSChromeSigninClient(browser_state,
@@ -79,8 +77,6 @@
       ios::ChromeBrowserState::FromBrowserState(context);
   return std::make_unique<FakeSigninClient>(
       chrome_browser_state,
-      ios::SigninErrorControllerFactory::GetForBrowserState(
-          chrome_browser_state),
       ios::CookieSettingsFactory::GetForBrowserState(chrome_browser_state),
       ios::HostContentSettingsMapFactory::GetForBrowserState(
           chrome_browser_state));
@@ -229,8 +225,8 @@
   }
 
   // IdentityManager::Observer
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override {
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override {
     refresh_token_available_count_++;
   }
 
@@ -336,8 +332,7 @@
   EXPECT_CALL(*sync_setup_service_mock_, HasFinishedInitialSetup())
       .WillOnce(Return(false));
   // Expect a call to disable sync as part of the sign out process.
-  EXPECT_CALL(*profile_sync_service_mock_,
-              RequestStop(syncer::SyncService::CLEAR_DATA));
+  EXPECT_CALL(*profile_sync_service_mock_, StopAndClear());
 
   CreateAuthenticationService();
 
diff --git a/ios/chrome/browser/signin/fake_oauth2_token_service_builder.mm b/ios/chrome/browser/signin/fake_oauth2_token_service_builder.mm
index e8ab38a9..44391e6 100644
--- a/ios/chrome/browser/signin/fake_oauth2_token_service_builder.mm
+++ b/ios/chrome/browser/signin/fake_oauth2_token_service_builder.mm
@@ -10,7 +10,6 @@
 #include "ios/chrome/browser/signin/account_tracker_service_factory.h"
 #include "ios/chrome/browser/signin/profile_oauth2_token_service_ios_provider_impl.h"
 #include "ios/chrome/browser/signin/signin_client_factory.h"
-#include "ios/chrome/browser/signin/signin_error_controller_factory.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -24,8 +23,7 @@
       std::make_unique<ProfileOAuth2TokenServiceIOSDelegate>(
           SigninClientFactory::GetForBrowserState(browser_state),
           std::make_unique<ProfileOAuth2TokenServiceIOSProviderImpl>(),
-          ios::AccountTrackerServiceFactory::GetForBrowserState(browser_state),
-          ios::SigninErrorControllerFactory::GetForBrowserState(browser_state));
+          ios::AccountTrackerServiceFactory::GetForBrowserState(browser_state));
   return std::make_unique<FakeProfileOAuth2TokenService>(
       browser_state->GetPrefs(), std::move(delegate));
 }
diff --git a/ios/chrome/browser/signin/profile_oauth2_token_service_factory.mm b/ios/chrome/browser/signin/profile_oauth2_token_service_factory.mm
index 0fffadb..5169cb9 100644
--- a/ios/chrome/browser/signin/profile_oauth2_token_service_factory.mm
+++ b/ios/chrome/browser/signin/profile_oauth2_token_service_factory.mm
@@ -13,7 +13,6 @@
 #include "ios/chrome/browser/signin/account_tracker_service_factory.h"
 #include "ios/chrome/browser/signin/profile_oauth2_token_service_ios_provider_impl.h"
 #include "ios/chrome/browser/signin/signin_client_factory.h"
-#include "ios/chrome/browser/signin/signin_error_controller_factory.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -25,7 +24,6 @@
           BrowserStateDependencyManager::GetInstance()) {
   DependsOn(ios::AccountTrackerServiceFactory::GetInstance());
   DependsOn(SigninClientFactory::GetInstance());
-  DependsOn(ios::SigninErrorControllerFactory::GetInstance());
 }
 
 ProfileOAuth2TokenServiceFactory::~ProfileOAuth2TokenServiceFactory() {}
@@ -56,8 +54,6 @@
       SigninClientFactory::GetForBrowserState(chrome_browser_state),
       std::make_unique<ProfileOAuth2TokenServiceIOSProviderImpl>(),
       ios::AccountTrackerServiceFactory::GetForBrowserState(
-          chrome_browser_state),
-      ios::SigninErrorControllerFactory::GetForBrowserState(
           chrome_browser_state));
   return std::make_unique<ProfileOAuth2TokenService>(
       chrome_browser_state->GetPrefs(), std::move(delegate));
diff --git a/ios/chrome/browser/signin/signin_client_factory.h b/ios/chrome/browser/signin/signin_client_factory.h
index 42c6b07..e0d0f1d 100644
--- a/ios/chrome/browser/signin/signin_client_factory.h
+++ b/ios/chrome/browser/signin/signin_client_factory.h
@@ -21,7 +21,7 @@
 class ChromeBrowserState;
 }
 
-// Singleton that owns all SigninErrorControllers and associates them with
+// Singleton that owns all SigninClients and associates them with
 // ios::ChromeBrowserState.
 class SigninClientFactory : public BrowserStateKeyedServiceFactory {
  public:
diff --git a/ios/chrome/browser/signin/signin_error_controller_factory.cc b/ios/chrome/browser/signin/signin_error_controller_factory.cc
index c3b9ef5..be95642 100644
--- a/ios/chrome/browser/signin/signin_error_controller_factory.cc
+++ b/ios/chrome/browser/signin/signin_error_controller_factory.cc
@@ -10,8 +10,10 @@
 #include "base/memory/singleton.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/core/browser/signin_error_controller.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/signin/profile_oauth2_token_service_factory.h"
 
 namespace ios {
 
@@ -31,6 +33,7 @@
     : BrowserStateKeyedServiceFactory(
           "SigninErrorController",
           BrowserStateDependencyManager::GetInstance()) {
+  DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance());
 }
 
 SigninErrorControllerFactory::~SigninErrorControllerFactory() {
@@ -39,8 +42,12 @@
 std::unique_ptr<KeyedService>
 SigninErrorControllerFactory::BuildServiceInstanceFor(
     web::BrowserState* context) const {
+  ChromeBrowserState* chrome_browser_state =
+      ChromeBrowserState::FromBrowserState(context);
   return std::make_unique<SigninErrorController>(
-      SigninErrorController::AccountMode::ANY_ACCOUNT);
+      SigninErrorController::AccountMode::ANY_ACCOUNT,
+      ProfileOAuth2TokenServiceFactory::GetForBrowserState(
+          chrome_browser_state));
 }
 
 }  // namespace ios
diff --git a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller_unittest.mm b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller_unittest.mm
index eecc48f..d42e269 100644
--- a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller_unittest.mm
@@ -107,7 +107,7 @@
       : unified_consent_enabled_(GetParam()),
         scoped_unified_consent_(
             unified_consent_enabled_
-                ? unified_consent::UnifiedConsentFeatureState::kEnabledNoBump
+                ? unified_consent::UnifiedConsentFeatureState::kEnabled
                 : unified_consent::UnifiedConsentFeatureState::kDisabled) {}
 
  protected:
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/action_cell.mm b/ios/chrome/browser/ui/autofill/manual_fill/action_cell.mm
index f566533..c27a186c 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/action_cell.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/action_cell.mm
@@ -89,6 +89,7 @@
   [self.titleButton setTitleColor:UIColor.cr_manualFillTintColor
                          forState:UIControlStateNormal];
   self.titleButton.enabled = YES;
+  self.grayLine.hidden = YES;
 }
 
 - (void)setUpWithTitle:(NSString*)title
@@ -113,10 +114,7 @@
   [verticalLeadViews addObject:self.titleButton];
 
   if (showSeparator) {
-    [verticalLeadViews addObject:self.grayLine];
     self.grayLine.hidden = NO;
-  } else {
-    self.grayLine.hidden = YES;
   }
 
   self.verticalConstraints =
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
index 4087f90..96156564 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
@@ -104,7 +104,7 @@
   if (self.contentInsetsAlwaysEqualToSafeArea && !IsIPadIdiom()) {
     // Resets the table view content inssets to be equal to the safe area
     // insets.
-    self.tableView.contentInset = self.view.safeAreaInsets;
+    self.tableView.contentInset = UIEdgeInsetsZero;
   }
 }
 
@@ -117,9 +117,9 @@
         [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
     CGFloat keyboardHeight = keyboardFrame.size.height;
     UIEdgeInsets safeInsets = self.view.safeAreaInsets;
+    // |contentInset| already contemplates the safe area.
     self.tableView.contentInset =
-        UIEdgeInsetsMake(safeInsets.top, safeInsets.left,
-                         safeInsets.bottom - keyboardHeight, safeInsets.right);
+        UIEdgeInsetsMake(0, 0, safeInsets.bottom - keyboardHeight, 0);
   }
 }
 
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.mm
index cdc37b1..2377926f 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.mm
@@ -107,15 +107,23 @@
 
 - (void)prepareForReuse {
   [super prepareForReuse];
+  [NSLayoutConstraint deactivateConstraints:self.verticalConstraints];
+  self.verticalConstraints = @[];
+
   self.siteNameLabel.text = @"";
+
   [self.usernameButton setTitle:@"" forState:UIControlStateNormal];
   self.usernameButton.enabled = YES;
   [self.usernameButton setTitleColor:UIColor.cr_manualFillTintColor
                             forState:UIControlStateNormal];
+
   [self.passwordButton setTitle:@"" forState:UIControlStateNormal];
   self.passwordButton.accessibilityLabel = nil;
   self.passwordButton.hidden = NO;
+
   self.manualFillCredential = nil;
+
+  self.grayLine.hidden = NO;
 }
 
 - (void)setUpWithCredential:(ManualFillCredential*)credential
@@ -183,10 +191,7 @@
     self.passwordButton.hidden = YES;
   }
 
-  if (!isConnectedToNextCell) {
-    [verticalLeadViews addObject:self.grayLine];
-    self.grayLine.hidden = NO;
-  } else {
+  if (isConnectedToNextCell) {
     self.grayLine.hidden = YES;
   }
 
diff --git a/ios/chrome/browser/ui/download/BUILD.gn b/ios/chrome/browser/ui/download/BUILD.gn
index ad5b6c2..f2f0bbf 100644
--- a/ios/chrome/browser/ui/download/BUILD.gn
+++ b/ios/chrome/browser/ui/download/BUILD.gn
@@ -107,6 +107,7 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
+    "ar_quick_look_egtest.mm",
     "download_manager_egtest.mm",
     "pass_kit_egtest.mm",
   ]
@@ -118,6 +119,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser:browser",
     "//ios/chrome/browser/download",
+    "//ios/chrome/browser/download:features",
     "//ios/chrome/browser/download:test_support",
     "//ios/chrome/browser/ui:ui_internal",
     "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/download/ar_quick_look_coordinator_unittest.mm b/ios/chrome/browser/ui/download/ar_quick_look_coordinator_unittest.mm
index 5ff34f38..1830c625 100644
--- a/ios/chrome/browser/ui/download/ar_quick_look_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/download/ar_quick_look_coordinator_unittest.mm
@@ -12,6 +12,7 @@
 #include "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "ios/chrome/browser/download/download_test_util.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/test/scoped_key_window.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -28,11 +29,9 @@
 
 // Returns the absolute path for the test file in the test data directory.
 base::FilePath GetTestFilePath() {
-  const char kValidFilePath[] =
-      "ios/testing/data/http_server_files/retrotv.usdz";
   base::FilePath file_path;
   base::PathService::Get(base::DIR_MODULE, &file_path);
-  file_path = file_path.Append(FILE_PATH_LITERAL(kValidFilePath));
+  file_path = file_path.Append(FILE_PATH_LITERAL(testing::kUsdzFilePath));
   return file_path;
 }
 
diff --git a/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm b/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm
new file mode 100644
index 0000000..f102de1
--- /dev/null
+++ b/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm
@@ -0,0 +1,171 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <EarlGrey/EarlGrey.h>
+#import <QuickLook/QuickLook.h>
+
+#include <memory>
+
+#import "base/test/ios/wait_util.h"
+#import "ios/chrome/app/main_controller.h"
+#include "ios/chrome/browser/download/download_test_util.h"
+#include "ios/chrome/browser/download/features.h"
+#include "ios/chrome/browser/download/usdz_mime_type.h"
+#import "ios/chrome/browser/ui/browser_view_controller.h"
+#include "ios/chrome/browser/ui/util/ui_util.h"
+#import "ios/chrome/test/app/chrome_test_util.h"
+#import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#include "net/http/http_status_code.h"
+#include "net/test/embedded_test_server/http_request.h"
+#include "net/test/embedded_test_server/http_response.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using base::test::ios::WaitUntilConditionOrTimeout;
+using base::test::ios::kWaitForDownloadTimeout;
+using base::test::ios::kWaitForUIElementTimeout;
+using chrome_test_util::GetMainController;
+
+namespace {
+
+// USDZ landing page and download request handler.
+std::unique_ptr<net::test_server::HttpResponse> GetResponse(
+    const net::test_server::HttpRequest& request) {
+  auto result = std::make_unique<net::test_server::BasicHttpResponse>();
+  result->set_code(net::HTTP_OK);
+
+  if (request.GetURL().path() == "/") {
+    result->set_content(
+        "<a id='forbidden' href='/forbidden'>Forbidden</a>"
+        "<a id='unauthorized' href='/unauthorized'>Unauthorized</a>"
+        "<a id='changing-mime-type' href='/changing-mime-type'>Changing Mime "
+        "Type</a>"
+        "<a id='good' href='/good'>Good</a>");
+    return result;
+  }
+
+  result->AddCustomHeader("Content-Type", kUsdzMimeType);
+  result->set_content(testing::GetTestFileContents(testing::kUsdzFilePath));
+
+  if (request.GetURL().path() == "/forbidden") {
+    result->set_code(net::HTTP_FORBIDDEN);
+  } else if (request.GetURL().path() == "/unauthorized") {
+    result->set_code(net::HTTP_UNAUTHORIZED);
+  } else if (request.GetURL().path() == "/changing-mime-type") {
+    result->AddCustomHeader("Content-Type", "unkown");
+  }
+
+  return result;
+}
+
+}  // namespace
+
+// Tests previewing USDZ format files.
+@interface ARQuickLookEGTest : ChromeTestCase
+
+@end
+
+@implementation ARQuickLookEGTest
+
+- (void)setUp {
+  [super setUp];
+
+  self.testServer->RegisterRequestHandler(base::BindRepeating(&GetResponse));
+  GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
+}
+
+// Tests that QLPreviewController is shown for sucessfully downloaded USDZ file.
+- (void)testDownloadUsdz {
+  if (!download::IsUsdzPreviewEnabled()) {
+    EARL_GREY_TEST_SKIPPED(
+        @"Disabled if 'USDZPreview' feature is disabled or on iOS versions "
+         "below 12 because QLPreviewController is not available.");
+  }
+
+  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
+  [ChromeEarlGrey waitForWebViewContainingText:"Good"];
+  [ChromeEarlGrey tapWebViewElementWithID:@"good"];
+
+  // QLPreviewController UI is rendered out of host process so EarlGrey matcher
+  // can not find QLPreviewController UI. Instead this test relies on view
+  // controller presentation as the signal that QLPreviewController UI is shown.
+  UIViewController* BVC = GetMainController().browserViewInformation.mainBVC;
+  bool shown = WaitUntilConditionOrTimeout(kWaitForDownloadTimeout, ^{
+    UIViewController* presentedController = BVC.presentedViewController;
+    return [presentedController class] == [QLPreviewController class];
+  });
+  GREYAssert(shown, @"QLPreviewController was not shown.");
+}
+
+- (void)testDownloadUnauthorized {
+  if (!download::IsUsdzPreviewEnabled()) {
+    EARL_GREY_TEST_SKIPPED(
+        @"Disabled if 'USDZPreview' feature is disabled or on iOS versions "
+         "below 12 because QLPreviewController is not available.");
+  }
+
+  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
+  [ChromeEarlGrey waitForWebViewContainingText:"Unauthorized"];
+  [ChromeEarlGrey tapWebViewElementWithID:@"unauthorized"];
+
+  // QLPreviewController UI is rendered out of host process so EarlGrey matcher
+  // can not find QLPreviewController UI. Instead this test relies on view
+  // controller presentation as the signal that QLPreviewController UI is shown.
+  UIViewController* BVC = GetMainController().browserViewInformation.mainBVC;
+  bool shown = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    UIViewController* presentedController = BVC.presentedViewController;
+    return [presentedController class] == [QLPreviewController class];
+  });
+  GREYAssertFalse(shown, @"QLPreviewController should not have shown.");
+}
+
+- (void)testDownloadForbidden {
+  if (!download::IsUsdzPreviewEnabled()) {
+    EARL_GREY_TEST_SKIPPED(
+        @"Disabled if 'USDZPreview' feature is disabled or on iOS versions "
+         "below 12 because QLPreviewController is not available.");
+  }
+
+  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
+  [ChromeEarlGrey waitForWebViewContainingText:"Forbidden"];
+  [ChromeEarlGrey tapWebViewElementWithID:@"forbidden"];
+
+  // QLPreviewController UI is rendered out of host process so EarlGrey matcher
+  // can not find QLPreviewController UI. Instead this test relies on view
+  // controller presentation as the signal that QLPreviewController UI is shown.
+  UIViewController* BVC = GetMainController().browserViewInformation.mainBVC;
+  bool shown = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    UIViewController* presentedController = BVC.presentedViewController;
+    return [presentedController class] == [QLPreviewController class];
+  });
+  GREYAssertFalse(shown, @"QLPreviewController should not have shown.");
+}
+
+- (void)testDownloadChangingMimeType {
+  if (!download::IsUsdzPreviewEnabled()) {
+    EARL_GREY_TEST_SKIPPED(
+        @"Disabled if 'USDZPreview' feature is disabled or on iOS versions "
+         "below 12 because QLPreviewController is not available.");
+  }
+
+  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
+  [ChromeEarlGrey waitForWebViewContainingText:"Changing Mime Type"];
+  [ChromeEarlGrey tapWebViewElementWithID:@"changing-mime-type"];
+
+  // QLPreviewController UI is rendered out of host process so EarlGrey matcher
+  // can not find QLPreviewController UI. Instead this test relies on view
+  // controller presentation as the signal that QLPreviewController UI is shown.
+  UIViewController* BVC = GetMainController().browserViewInformation.mainBVC;
+  bool shown = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    UIViewController* presentedController = BVC.presentedViewController;
+    return [presentedController class] == [QLPreviewController class];
+  });
+  GREYAssertFalse(shown, @"QLPreviewController should not have shown.");
+}
+
+@end
diff --git a/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm b/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm
index 1538df4..35da26eb 100644
--- a/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/download/pass_kit_coordinator_unittest.mm
@@ -10,8 +10,8 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "components/infobars/core/confirm_infobar_delegate.h"
 #include "components/infobars/core/infobar.h"
+#include "ios/chrome/browser/download/download_test_util.h"
 #import "ios/chrome/browser/download/pass_kit_tab_helper.h"
-#include "ios/chrome/browser/download/pass_kit_test_util.h"
 #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -65,7 +65,7 @@
 // valid PKPass object.
 // TODO(crbug.com/804250): this test is flaky.
 TEST_F(PassKitCoordinatorTest, ValidPassKitObject) {
-  std::string data = testing::GetTestPass();
+  std::string data = testing::GetTestFileContents(testing::kPkPassFilePath);
   NSData* nsdata = [NSData dataWithBytes:data.c_str() length:data.size()];
   PKPass* pass = [[PKPass alloc] initWithData:nsdata error:nil];
   ASSERT_TRUE(pass);
@@ -107,7 +107,7 @@
     return;
   }
 
-  std::string data = testing::GetTestPass();
+  std::string data = testing::GetTestFileContents(testing::kPkPassFilePath);
   NSData* nsdata = [NSData dataWithBytes:data.c_str() length:data.size()];
   PKPass* pass = [[PKPass alloc] initWithData:nsdata error:nil];
   ASSERT_TRUE(pass);
@@ -173,7 +173,7 @@
       }));
 
   // Attempt to present "Add pkpass UI".
-  std::string data = testing::GetTestPass();
+  std::string data = testing::GetTestFileContents(testing::kPkPassFilePath);
   NSData* nsdata = [NSData dataWithBytes:data.c_str() length:data.size()];
   PKPass* pass = [[PKPass alloc] initWithData:nsdata error:nil];
   ASSERT_TRUE(pass);
diff --git a/ios/chrome/browser/ui/download/pass_kit_egtest.mm b/ios/chrome/browser/ui/download/pass_kit_egtest.mm
index 08a09be..178d4d8c 100644
--- a/ios/chrome/browser/ui/download/pass_kit_egtest.mm
+++ b/ios/chrome/browser/ui/download/pass_kit_egtest.mm
@@ -9,8 +9,8 @@
 
 #import "base/test/ios/wait_util.h"
 #import "ios/chrome/app/main_controller.h"
+#include "ios/chrome/browser/download/download_test_util.h"
 #include "ios/chrome/browser/download/pass_kit_mime_type.h"
-#include "ios/chrome/browser/download/pass_kit_test_util.h"
 #import "ios/chrome/browser/ui/browser_view_controller.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -53,7 +53,7 @@
     result->set_content("corrupted");
   } else if (request.GetURL().path() == "/good") {
     result->AddCustomHeader("Content-Type", kPkPassMimeType);
-    result->set_content(testing::GetTestPass());
+    result->set_content(testing::GetTestFileContents(testing::kPkPassFilePath));
   }
 
   return result;
diff --git a/ios/chrome/browser/ui/main/BUILD.gn b/ios/chrome/browser/ui/main/BUILD.gn
index 2ce78c6..bfbcde7 100644
--- a/ios/chrome/browser/ui/main/BUILD.gn
+++ b/ios/chrome/browser/ui/main/BUILD.gn
@@ -25,6 +25,7 @@
     "//ios/chrome/browser/crash_report:crash_report_internal",
     "//ios/chrome/browser/device_sharing",
     "//ios/chrome/browser/download",
+    "//ios/chrome/browser/download:features",
     "//ios/chrome/browser/sessions",
     "//ios/chrome/browser/sessions:serialisation",
     "//ios/chrome/browser/store_kit",
diff --git a/ios/chrome/browser/ui/main/browser_coordinator.mm b/ios/chrome/browser/ui/main/browser_coordinator.mm
index b240c5ab..5a71c16 100644
--- a/ios/chrome/browser/ui/main/browser_coordinator.mm
+++ b/ios/chrome/browser/ui/main/browser_coordinator.mm
@@ -10,6 +10,8 @@
 #import "ios/chrome/browser/app_launcher/app_launcher_abuse_detector.h"
 #import "ios/chrome/browser/app_launcher/app_launcher_tab_helper.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/download/ar_quick_look_tab_helper.h"
+#import "ios/chrome/browser/download/features.h"
 #import "ios/chrome/browser/download/pass_kit_tab_helper.h"
 #import "ios/chrome/browser/store_kit/store_kit_coordinator.h"
 #import "ios/chrome/browser/store_kit/store_kit_tab_helper.h"
@@ -23,6 +25,7 @@
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
+#import "ios/chrome/browser/ui/download/ar_quick_look_coordinator.h"
 #import "ios/chrome/browser/ui/download/pass_kit_coordinator.h"
 #import "ios/chrome/browser/ui/page_info/page_info_legacy_coordinator.h"
 #import "ios/chrome/browser/ui/print/print_controller.h"
@@ -62,6 +65,9 @@
 // Coordinator for Page Info UI.
 @property(nonatomic, strong) PageInfoLegacyCoordinator* pageInfoCoordinator;
 
+// Coordinator to present a QLPreviewController for AR models.
+@property(nonatomic, strong) ARQuickLookCoordinator* ARQuickLookCoordinator;
+
 // Coordinator for the PassKit UI presentation.
 @property(nonatomic, strong) PassKitCoordinator* passKitCoordinator;
 
@@ -182,6 +188,11 @@
   self.pageInfoCoordinator.presentationProvider = self.viewController;
   self.pageInfoCoordinator.tabModel = self.tabModel;
 
+  if (download::IsUsdzPreviewEnabled()) {
+    self.ARQuickLookCoordinator = [[ARQuickLookCoordinator alloc]
+        initWithBaseViewController:self.viewController];
+  }
+
   self.passKitCoordinator = [[PassKitCoordinator alloc]
       initWithBaseViewController:self.viewController];
 
@@ -389,6 +400,11 @@
       webState, [[AppLauncherAbuseDetector alloc] init],
       self.appLauncherCoordinator);
 
+  if (download::IsUsdzPreviewEnabled()) {
+    ARQuickLookTabHelper::CreateForWebState(webState,
+                                            self.ARQuickLookCoordinator);
+  }
+
   PassKitTabHelper::CreateForWebState(webState, self.passKitCoordinator);
 
   RepostFormTabHelper::CreateForWebState(webState, self);
diff --git a/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc b/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
index ac1e3a5..f38cc68 100644
--- a/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
+++ b/ios/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
@@ -245,7 +245,7 @@
     return;
   }
 
-  service->RequestStop(syncer::SyncService::CLEAR_DATA);
+  service->StopAndClear();
 }
 
 void SyncInternalsMessageHandler::HandleTriggerRefresh(
diff --git a/ios/testing/BUILD.gn b/ios/testing/BUILD.gn
index 25407534..ae228d1 100644
--- a/ios/testing/BUILD.gn
+++ b/ios/testing/BUILD.gn
@@ -86,8 +86,8 @@
     "data/http_server_files/onload_replacestate_reload.js",
     "data/http_server_files/opensearch.xml",
     "data/http_server_files/pony.html",
+    "data/http_server_files/redchair.usdz",
     "data/http_server_files/redirect_refresh.html",
-    "data/http_server_files/retrotv.usdz",
     "data/http_server_files/single_page_wide.pdf",
     "data/http_server_files/state_operations.html",
     "data/http_server_files/state_operations.js",
diff --git a/ios/testing/data/http_server_files/links.html b/ios/testing/data/http_server_files/links.html
index 8d2e668..1989c16 100644
--- a/ios/testing/data/http_server_files/links.html
+++ b/ios/testing/data/http_server_files/links.html
@@ -9,7 +9,9 @@
 
 <html>
   <body>
-    <a href="pony.html" id="normal-link">Normal Link</a>
-    <a href="#samePage" id="same-page-link">Same-page Link</a>
+    <center>
+      <a href="pony.html" id="normal-link">Normal Link</a>
+      <a href="#samePage" id="same-page-link">Same-page Link</a>
+    </center>
   </body>
 </html>
diff --git a/ios/testing/data/http_server_files/redchair.usdz b/ios/testing/data/http_server_files/redchair.usdz
new file mode 100644
index 0000000..9e2d552f
--- /dev/null
+++ b/ios/testing/data/http_server_files/redchair.usdz
Binary files differ
diff --git a/ios/testing/data/http_server_files/retrotv.usdz b/ios/testing/data/http_server_files/retrotv.usdz
deleted file mode 100644
index afc1224..0000000
--- a/ios/testing/data/http_server_files/retrotv.usdz
+++ /dev/null
Binary files differ
diff --git a/ios/web_view/internal/signin/web_view_oauth2_token_service_factory.mm b/ios/web_view/internal/signin/web_view_oauth2_token_service_factory.mm
index 4af229e..4021b617c 100644
--- a/ios/web_view/internal/signin/web_view_oauth2_token_service_factory.mm
+++ b/ios/web_view/internal/signin/web_view_oauth2_token_service_factory.mm
@@ -13,7 +13,6 @@
 #include "ios/web_view/internal/signin/web_view_account_tracker_service_factory.h"
 #include "ios/web_view/internal/signin/web_view_profile_oauth2_token_service_ios_provider_impl.h"
 #include "ios/web_view/internal/signin/web_view_signin_client_factory.h"
-#include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h"
 #include "ios/web_view/internal/web_view_browser_state.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -28,7 +27,6 @@
           BrowserStateDependencyManager::GetInstance()) {
   DependsOn(WebViewAccountTrackerServiceFactory::GetInstance());
   DependsOn(WebViewSigninClientFactory::GetInstance());
-  DependsOn(WebViewSigninErrorControllerFactory::GetInstance());
 }
 
 ProfileOAuth2TokenService* WebViewOAuth2TokenServiceFactory::GetForBrowserState(
@@ -60,8 +58,7 @@
           signin_client);
   auto delegate = std::make_unique<ProfileOAuth2TokenServiceIOSDelegate>(
       signin_client, std::move(token_service_provider),
-      WebViewAccountTrackerServiceFactory::GetForBrowserState(browser_state),
-      WebViewSigninErrorControllerFactory::GetForBrowserState(browser_state));
+      WebViewAccountTrackerServiceFactory::GetForBrowserState(browser_state));
   return std::make_unique<ProfileOAuth2TokenService>(browser_state->GetPrefs(),
                                                      std::move(delegate));
 }
diff --git a/ios/web_view/internal/signin/web_view_signin_error_controller_factory.mm b/ios/web_view/internal/signin/web_view_signin_error_controller_factory.mm
index a807a2ef..a541844f 100644
--- a/ios/web_view/internal/signin/web_view_signin_error_controller_factory.mm
+++ b/ios/web_view/internal/signin/web_view_signin_error_controller_factory.mm
@@ -9,7 +9,9 @@
 #include "base/memory/singleton.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/core/browser/signin_error_controller.h"
+#include "ios/web_view/internal/signin/web_view_oauth2_token_service_factory.h"
 #include "ios/web_view/internal/web_view_browser_state.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -34,13 +36,18 @@
 WebViewSigninErrorControllerFactory::WebViewSigninErrorControllerFactory()
     : BrowserStateKeyedServiceFactory(
           "SigninErrorController",
-          BrowserStateDependencyManager::GetInstance()) {}
+          BrowserStateDependencyManager::GetInstance()) {
+  DependsOn(WebViewOAuth2TokenServiceFactory::GetInstance());
+}
 
 std::unique_ptr<KeyedService>
 WebViewSigninErrorControllerFactory::BuildServiceInstanceFor(
     web::BrowserState* context) const {
+  WebViewBrowserState* browser_state =
+      WebViewBrowserState::FromBrowserState(context);
   return std::make_unique<SigninErrorController>(
-      SigninErrorController::AccountMode::ANY_ACCOUNT);
+      SigninErrorController::AccountMode::ANY_ACCOUNT,
+      WebViewOAuth2TokenServiceFactory::GetForBrowserState(browser_state));
 }
 
 }  // namespace ios_web_view
diff --git a/ios/web_view/internal/sync/cwv_sync_controller.mm b/ios/web_view/internal/sync/cwv_sync_controller.mm
index 771fee8..96491dba 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller.mm
@@ -12,6 +12,7 @@
 #include "components/signin/core/browser/account_info.h"
 #include "components/signin/core/browser/account_tracker_service.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
+#include "components/signin/core/browser/signin_error_controller.h"
 #include "components/signin/core/browser/signin_manager.h"
 #include "components/signin/ios/browser/profile_oauth2_token_service_ios_delegate.h"
 #include "ios/web/public/web_thread.h"
diff --git a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
index 9bf23e87..7dd881a 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
@@ -50,17 +50,17 @@
   CWVSyncControllerTest()
       : browser_state_(/*off_the_record=*/false),
         signin_client_(browser_state_.GetPrefs()),
-        signin_error_controller_(
-            SigninErrorController::AccountMode::ANY_ACCOUNT),
         token_service_delegate_(new ProfileOAuth2TokenServiceIOSDelegate(
             &signin_client_,
             std::make_unique<FakeProfileOAuth2TokenServiceIOSProvider>(),
-            &account_tracker_service_,
-            &signin_error_controller_)),
+            &account_tracker_service_)),
         token_service_(browser_state_.GetPrefs(),
                        std::unique_ptr<ProfileOAuth2TokenServiceIOSDelegate>(
                            token_service_delegate_)),
         gaia_cookie_manager_service_(&token_service_, &signin_client_),
+        signin_error_controller_(
+            SigninErrorController::AccountMode::ANY_ACCOUNT,
+            &token_service_),
         signin_manager_(&signin_client_,
                         &token_service_,
                         &account_tracker_service_,
@@ -110,13 +110,13 @@
   std::unique_ptr<browser_sync::ProfileSyncServiceMock> profile_sync_service_;
   AccountTrackerService account_tracker_service_;
   TestSigninClient signin_client_;
-  SigninErrorController signin_error_controller_;
 
   // Weak, owned by the token service.
   ProfileOAuth2TokenServiceIOSDelegate* token_service_delegate_;
 
   FakeProfileOAuth2TokenService token_service_;
   FakeGaiaCookieManagerService gaia_cookie_manager_service_;
+  SigninErrorController signin_error_controller_;
   FakeSigninManager signin_manager_;
   CWVSyncController* sync_controller_;
   syncer::SyncServiceObserver* sync_service_observer_;
diff --git a/mash/catalog_viewer/BUILD.gn b/mash/catalog_viewer/BUILD.gn
index f1fe1ede..6a74651 100644
--- a/mash/catalog_viewer/BUILD.gn
+++ b/mash/catalog_viewer/BUILD.gn
@@ -3,9 +3,9 @@
 # found in the LICENSE file.
 
 import("//build/config/ui.gni")
+import("//mojo/public/tools/bindings/mojom.gni")
 import("//services/service_manager/public/cpp/service.gni")
 import("//services/service_manager/public/service_manifest.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
 
 source_set("lib") {
   sources = [
@@ -27,6 +27,7 @@
 }
 
 service("catalog_viewer") {
+  use_cpp_main = true
   sources = [
     "main.cc",
   ]
diff --git a/mash/catalog_viewer/catalog_viewer.cc b/mash/catalog_viewer/catalog_viewer.cc
index c8f228d..d11b2f2 100644
--- a/mash/catalog_viewer/catalog_viewer.cc
+++ b/mash/catalog_viewer/catalog_viewer.cc
@@ -207,7 +207,8 @@
 
 }  // namespace
 
-CatalogViewer::CatalogViewer() {
+CatalogViewer::CatalogViewer(service_manager::mojom::ServiceRequest request)
+    : service_binding_(this, std::move(request)) {
   registry_.AddInterface<mojom::Launchable>(
       base::Bind(&CatalogViewer::Create, base::Unretained(this)));
 }
@@ -218,16 +219,16 @@
   DCHECK(it != windows_.end());
   windows_.erase(it);
   if (windows_.empty())
-    context()->QuitNow();
+    Terminate();
 }
 
 void CatalogViewer::OnStart() {
   views::AuraInit::InitParams params;
-  params.connector = context()->connector();
-  params.identity = context()->identity();
+  params.connector = service_binding_.GetConnector();
+  params.identity = service_binding_.identity();
   aura_init_ = views::AuraInit::Create(params);
   if (!aura_init_)
-    context()->QuitNow();
+    Terminate();
 }
 
 void CatalogViewer::OnBindInterface(
@@ -245,7 +246,8 @@
     return;
   }
   catalog::mojom::CatalogPtr catalog;
-  context()->connector()->BindInterface(catalog::mojom::kServiceName, &catalog);
+  service_binding_.GetConnector()->BindInterface(catalog::mojom::kServiceName,
+                                                 &catalog);
 
   views::Widget* window = views::Widget::CreateWindowWithContextAndBounds(
       new CatalogViewerContents(this, std::move(catalog)), nullptr,
diff --git a/mash/catalog_viewer/catalog_viewer.h b/mash/catalog_viewer/catalog_viewer.h
index e17099d..881afe1 100644
--- a/mash/catalog_viewer/catalog_viewer.h
+++ b/mash/catalog_viewer/catalog_viewer.h
@@ -14,6 +14,8 @@
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 
 namespace views {
 class AuraInit;
@@ -26,7 +28,7 @@
 class CatalogViewer : public service_manager::Service,
                       public mojom::Launchable {
  public:
-  CatalogViewer();
+  explicit CatalogViewer(service_manager::mojom::ServiceRequest request);
   ~CatalogViewer() override;
 
   void RemoveWindow(views::Widget* window);
@@ -43,6 +45,7 @@
 
   void Create(mojom::LaunchableRequest request);
 
+  service_manager::ServiceBinding service_binding_;
   mojo::BindingSet<mojom::Launchable> bindings_;
   std::vector<views::Widget*> windows_;
 
diff --git a/mash/catalog_viewer/main.cc b/mash/catalog_viewer/main.cc
index 620af24..65a916e 100644
--- a/mash/catalog_viewer/main.cc
+++ b/mash/catalog_viewer/main.cc
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/message_loop/message_loop.h"
 #include "mash/catalog_viewer/catalog_viewer.h"
-#include "services/service_manager/public/c/main.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/standalone_service/service_main.h"
 
-MojoResult ServiceMain(MojoHandle service_request_handle) {
-  service_manager::ServiceRunner runner(
-      new mash::catalog_viewer::CatalogViewer);
-  return runner.Run(service_request_handle);
+void ServiceMain(service_manager::mojom::ServiceRequest request) {
+  base::MessageLoop message_loop;
+  mash::catalog_viewer::CatalogViewer(std::move(request)).RunUntilTermination();
 }
diff --git a/mash/example/views_examples/BUILD.gn b/mash/example/views_examples/BUILD.gn
index 9ad44d2..01e97b0f 100644
--- a/mash/example/views_examples/BUILD.gn
+++ b/mash/example/views_examples/BUILD.gn
@@ -3,14 +3,14 @@
 # found in the LICENSE file.
 
 import("//build/config/ui.gni")
+import("//mojo/public/tools/bindings/mojom.gni")
 import("//services/service_manager/public/cpp/service.gni")
 import("//services/service_manager/public/service_manifest.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
 import("//tools/grit/repack.gni")
 
 service("views_examples") {
   testonly = true
-
+  use_cpp_main = true
   sources = [
     "views_examples.cc",
   ]
diff --git a/mash/example/views_examples/views_examples.cc b/mash/example/views_examples/views_examples.cc
index 958996e9..0ce813d 100644
--- a/mash/example/views_examples/views_examples.cc
+++ b/mash/example/views_examples/views_examples.cc
@@ -7,14 +7,15 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/message_loop/message_loop.h"
 #include "mash/public/mojom/launchable.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
-#include "services/service_manager/public/c/main.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_context.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/cpp/standalone_service/service_main.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "ui/views/examples/example_base.h"
 #include "ui/views/examples/examples_window.h"
 #include "ui/views/mus/aura_init.h"
@@ -22,7 +23,8 @@
 class ViewsExamples : public service_manager::Service,
                       public mash::mojom::Launchable {
  public:
-  ViewsExamples() {
+  explicit ViewsExamples(service_manager::mojom::ServiceRequest request)
+      : service_binding_(this, std::move(request)) {
     registry_.AddInterface<mash::mojom::Launchable>(
         base::Bind(&ViewsExamples::Create, base::Unretained(this)));
   }
@@ -32,11 +34,11 @@
   // service_manager::Service:
   void OnStart() override {
     views::AuraInit::InitParams params;
-    params.connector = context()->connector();
-    params.identity = context()->identity();
+    params.connector = service_binding_.GetConnector();
+    params.identity = service_binding_.identity();
     aura_init_ = views::AuraInit::Create(params);
     if (!aura_init_)
-      context()->QuitNow();
+      Terminate();
   }
   void OnBindInterface(const service_manager::BindSourceInfo& source_info,
                        const std::string& interface_name,
@@ -47,14 +49,14 @@
   // mash::mojom::Launchable:
   void Launch(uint32_t what, mash::mojom::LaunchMode how) override {
     views::examples::ShowExamplesWindow(
-        base::BindOnce(&service_manager::ServiceContext::QuitNow,
-                       base::Unretained(context())));
+        base::BindOnce(&ViewsExamples::Terminate, base::Unretained(this)));
   }
 
   void Create(mash::mojom::LaunchableRequest request) {
     bindings_.AddBinding(this, std::move(request));
   }
 
+  service_manager::ServiceBinding service_binding_;
   mojo::BindingSet<mash::mojom::Launchable> bindings_;
 
   service_manager::BinderRegistry registry_;
@@ -64,7 +66,7 @@
   DISALLOW_COPY_AND_ASSIGN(ViewsExamples);
 };
 
-MojoResult ServiceMain(MojoHandle service_request_handle) {
-  return service_manager::ServiceRunner(new ViewsExamples)
-      .Run(service_request_handle);
+void ServiceMain(service_manager::mojom::ServiceRequest request) {
+  base::MessageLoop message_loop;
+  ViewsExamples(std::move(request)).RunUntilTermination();
 }
diff --git a/mash/example/window_type_launcher/BUILD.gn b/mash/example/window_type_launcher/BUILD.gn
index 98a6dc7..4c75c82 100644
--- a/mash/example/window_type_launcher/BUILD.gn
+++ b/mash/example/window_type_launcher/BUILD.gn
@@ -3,14 +3,14 @@
 # found in the LICENSE file.
 
 import("//build/config/ui.gni")
+import("//mojo/public/tools/bindings/mojom.gni")
 import("//services/service_manager/public/cpp/service.gni")
 import("//services/service_manager/public/service_manifest.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
 import("//tools/grit/repack.gni")
 
 service("window_type_launcher") {
   testonly = true
-
+  use_cpp_main = true
   sources = [
     "window_type_launcher.cc",
     "window_type_launcher.h",
diff --git a/mash/example/window_type_launcher/window_type_launcher.cc b/mash/example/window_type_launcher/window_type_launcher.cc
index 089c327..55ddfa5 100644
--- a/mash/example/window_type_launcher/window_type_launcher.cc
+++ b/mash/example/window_type_launcher/window_type_launcher.cc
@@ -8,6 +8,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
@@ -15,8 +16,7 @@
 #include "services/service_manager/public/c/main.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_context.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/standalone_service/service_main.h"
 #include "services/ws/public/cpp/property_type_converters.h"
 #include "services/ws/public/mojom/window_manager.mojom.h"
 #include "ui/aura/window.h"
@@ -438,7 +438,9 @@
 
 }  // namespace
 
-WindowTypeLauncher::WindowTypeLauncher() {
+WindowTypeLauncher::WindowTypeLauncher(
+    service_manager::mojom::ServiceRequest request)
+    : service_binding_(this, std::move(request)) {
   registry_.AddInterface<mash::mojom::Launchable>(
       base::Bind(&WindowTypeLauncher::Create, base::Unretained(this)));
 }
@@ -449,16 +451,16 @@
   DCHECK(it != windows_.end());
   windows_.erase(it);
   if (windows_.empty())
-    context()->QuitNow();
+    Terminate();
 }
 
 void WindowTypeLauncher::OnStart() {
   views::AuraInit::InitParams params;
-  params.connector = context()->connector();
-  params.identity = context()->identity();
+  params.connector = service_binding_.GetConnector();
+  params.identity = service_binding_.identity();
   aura_init_ = views::AuraInit::Create(params);
   if (!aura_init_)
-    context()->QuitNow();
+    Terminate();
 }
 
 void WindowTypeLauncher::OnBindInterface(
@@ -477,7 +479,8 @@
   }
   views::Widget* window = new views::Widget;
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
-  params.delegate = new WindowTypeLauncherView(this, context()->connector());
+  params.delegate =
+      new WindowTypeLauncherView(this, service_binding_.GetConnector());
   window->Init(params);
   window->Show();
   windows_.push_back(window);
@@ -487,7 +490,7 @@
   bindings_.AddBinding(this, std::move(request));
 }
 
-MojoResult ServiceMain(MojoHandle service_request_handle) {
-  return service_manager::ServiceRunner(new WindowTypeLauncher)
-      .Run(service_request_handle);
+void ServiceMain(service_manager::mojom::ServiceRequest request) {
+  base::MessageLoop message_loop;
+  WindowTypeLauncher(std::move(request)).RunUntilTermination();
 }
diff --git a/mash/example/window_type_launcher/window_type_launcher.h b/mash/example/window_type_launcher/window_type_launcher.h
index 8f4b1b23..3b7094a 100644
--- a/mash/example/window_type_launcher/window_type_launcher.h
+++ b/mash/example/window_type_launcher/window_type_launcher.h
@@ -12,6 +12,8 @@
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 
 namespace views {
 class AuraInit;
@@ -21,7 +23,7 @@
 class WindowTypeLauncher : public service_manager::Service,
                            public mash::mojom::Launchable {
  public:
-  WindowTypeLauncher();
+  explicit WindowTypeLauncher(service_manager::mojom::ServiceRequest request);
   ~WindowTypeLauncher() override;
 
   void RemoveWindow(views::Widget* window);
@@ -38,6 +40,7 @@
 
   void Create(mash::mojom::LaunchableRequest request);
 
+  service_manager::ServiceBinding service_binding_;
   mojo::BindingSet<mash::mojom::Launchable> bindings_;
   std::vector<views::Widget*> windows_;
 
diff --git a/mash/session/BUILD.gn b/mash/session/BUILD.gn
index 42f408fd..998c709 100644
--- a/mash/session/BUILD.gn
+++ b/mash/session/BUILD.gn
@@ -3,9 +3,9 @@
 # found in the LICENSE file.
 
 import("//build/config/ui.gni")
+import("//mojo/public/tools/bindings/mojom.gni")
 import("//services/service_manager/public/cpp/service.gni")
 import("//services/service_manager/public/service_manifest.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
 import("//tools/grit/repack.gni")
 
 source_set("lib") {
@@ -33,7 +33,7 @@
 
 service("session") {
   output_name = "mash_session"
-
+  use_cpp_main = true
   sources = [
     "main.cc",
   ]
diff --git a/mash/session/main.cc b/mash/session/main.cc
index b6c8fdb..92aaeb7 100644
--- a/mash/session/main.cc
+++ b/mash/session/main.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/message_loop/message_loop.h"
 #include "mash/session/session.h"
-#include "services/service_manager/public/c/main.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/standalone_service/service_main.h"
 
-MojoResult ServiceMain(MojoHandle service_request_handle) {
-  service_manager::ServiceRunner runner(new mash::session::Session);
-  return runner.Run(service_request_handle);
+void ServiceMain(service_manager::mojom::ServiceRequest request) {
+  base::MessageLoop message_loop;
+  mash::session::Session(std::move(request)).RunUntilTermination();
 }
diff --git a/mash/session/session.cc b/mash/session/session.cc
index 598e10d..49f4499 100644
--- a/mash/session/session.cc
+++ b/mash/session/session.cc
@@ -8,7 +8,6 @@
 #include "base/command_line.h"
 #include "mash/common/config.h"
 #include "services/service_manager/public/cpp/connector.h"
-#include "services/service_manager/public/cpp/service_context.h"
 
 #if defined(OS_CHROMEOS)
 #include "ash/components/quick_launch/public/mojom/constants.mojom.h"  // nogncheck
@@ -17,7 +16,9 @@
 namespace mash {
 namespace session {
 
-Session::Session() = default;
+Session::Session(service_manager::mojom::ServiceRequest request)
+    : service_binding_(this, std::move(request)) {}
+
 Session::~Session() = default;
 
 void Session::OnStart() {
@@ -29,8 +30,9 @@
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           quick_launch::mojom::kServiceName)) {
     // TODO(https://crbug.com/904148): This should not use |WarmService()|.
-    context()->connector()->WarmService(service_manager::ServiceFilter::ByName(
-        quick_launch::mojom::kServiceName));
+    service_binding_.GetConnector()->WarmService(
+        service_manager::ServiceFilter::ByName(
+            quick_launch::mojom::kServiceName));
   }
 #endif  // defined(OS_CHROMEOS)
 }
@@ -38,8 +40,9 @@
 void Session::StartWindowManager() {
   // TODO(beng): monitor this service for death & bring down the whole system
   // if necessary.
-  context()->connector()->WarmService(service_manager::ServiceFilter::ByName(
-      common::GetWindowManagerServiceName()));
+  service_binding_.GetConnector()->WarmService(
+      service_manager::ServiceFilter::ByName(
+          common::GetWindowManagerServiceName()));
 }
 
 }  // namespace session
diff --git a/mash/session/session.h b/mash/session/session.h
index d8593507..dc5bedf 100644
--- a/mash/session/session.h
+++ b/mash/session/session.h
@@ -7,13 +7,15 @@
 
 #include "base/macros.h"
 #include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 
 namespace mash {
 namespace session {
 
 class Session : public service_manager::Service {
  public:
-  Session();
+  explicit Session(service_manager::mojom::ServiceRequest request);
   ~Session() override;
 
  private:
@@ -22,6 +24,8 @@
 
   void StartWindowManager();
 
+  service_manager::ServiceBinding service_binding_;
+
   DISALLOW_COPY_AND_ASSIGN(Session);
 };
 
diff --git a/mash/task_viewer/BUILD.gn b/mash/task_viewer/BUILD.gn
index 0d1b37b3..baa4cd0 100644
--- a/mash/task_viewer/BUILD.gn
+++ b/mash/task_viewer/BUILD.gn
@@ -3,9 +3,9 @@
 # found in the LICENSE file.
 
 import("//build/config/ui.gni")
+import("//mojo/public/tools/bindings/mojom.gni")
 import("//services/service_manager/public/cpp/service.gni")
 import("//services/service_manager/public/service_manifest.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
 
 source_set("lib") {
   sources = [
@@ -27,6 +27,7 @@
 }
 
 service("task_viewer") {
+  use_cpp_main = true
   sources = [
     "main.cc",
   ]
diff --git a/mash/task_viewer/main.cc b/mash/task_viewer/main.cc
index 5ec9e95..aea0c08 100644
--- a/mash/task_viewer/main.cc
+++ b/mash/task_viewer/main.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/message_loop/message_loop.h"
 #include "mash/task_viewer/task_viewer.h"
-#include "services/service_manager/public/c/main.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/standalone_service/service_main.h"
 
-MojoResult ServiceMain(MojoHandle service_request_handle) {
-  service_manager::ServiceRunner runner(new mash::task_viewer::TaskViewer);
-  return runner.Run(service_request_handle);
+void ServiceMain(service_manager::mojom::ServiceRequest request) {
+  base::MessageLoop message_loop;
+  mash::task_viewer::TaskViewer(std::move(request)).RunUntilTermination();
 }
diff --git a/mash/task_viewer/task_viewer.cc b/mash/task_viewer/task_viewer.cc
index 21aada6e..c9b5c1a6 100644
--- a/mash/task_viewer/task_viewer.cc
+++ b/mash/task_viewer/task_viewer.cc
@@ -20,7 +20,6 @@
 #include "services/catalog/public/mojom/catalog.mojom.h"
 #include "services/catalog/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
-#include "services/service_manager/public/cpp/service_context.h"
 #include "services/service_manager/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/mojom/service_manager.mojom.h"
 #include "ui/base/models/table_model.h"
@@ -282,10 +281,12 @@
 
 }  // namespace
 
-TaskViewer::TaskViewer() {
+TaskViewer::TaskViewer(service_manager::mojom::ServiceRequest request)
+    : service_binding_(this, std::move(request)) {
   registry_.AddInterface<::mash::mojom::Launchable>(
       base::Bind(&TaskViewer::Create, base::Unretained(this)));
 }
+
 TaskViewer::~TaskViewer() = default;
 
 void TaskViewer::RemoveWindow(views::Widget* widget) {
@@ -293,16 +294,16 @@
   DCHECK(it != windows_.end());
   windows_.erase(it);
   if (windows_.empty())
-    context()->QuitNow();
+    Terminate();
 }
 
 void TaskViewer::OnStart() {
   views::AuraInit::InitParams params;
-  params.connector = context()->connector();
-  params.identity = context()->identity();
+  params.connector = service_binding_.GetConnector();
+  params.identity = service_binding_.identity();
   aura_init_ = views::AuraInit::Create(params);
   if (!aura_init_)
-    context()->QuitNow();
+    Terminate();
 }
 
 void TaskViewer::OnBindInterface(
@@ -321,11 +322,12 @@
   }
 
   service_manager::mojom::ServiceManagerPtr service_manager;
-  context()->connector()->BindInterface(service_manager::mojom::kServiceName,
-                                        &service_manager);
+  service_binding_.GetConnector()->BindInterface(
+      service_manager::mojom::kServiceName, &service_manager);
 
   catalog::mojom::CatalogPtr catalog;
-  context()->connector()->BindInterface(catalog::mojom::kServiceName, &catalog);
+  service_binding_.GetConnector()->BindInterface(catalog::mojom::kServiceName,
+                                                 &catalog);
 
   service_manager::mojom::ServiceManagerListenerPtr listener;
   TaskViewerContents* task_viewer = new TaskViewerContents(
diff --git a/mash/task_viewer/task_viewer.h b/mash/task_viewer/task_viewer.h
index da9bec3..7c97517 100644
--- a/mash/task_viewer/task_viewer.h
+++ b/mash/task_viewer/task_viewer.h
@@ -14,6 +14,8 @@
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 
 namespace views {
 class AuraInit;
@@ -26,7 +28,7 @@
 class TaskViewer : public service_manager::Service,
                    public ::mash::mojom::Launchable {
  public:
-  TaskViewer();
+  explicit TaskViewer(service_manager::mojom::ServiceRequest request);
   ~TaskViewer() override;
 
   void RemoveWindow(views::Widget* widget);
@@ -43,6 +45,7 @@
 
   void Create(::mash::mojom::LaunchableRequest request);
 
+  service_manager::ServiceBinding service_binding_;
   mojo::BindingSet<::mash::mojom::Launchable> bindings_;
   std::vector<views::Widget*> windows_;
 
diff --git a/mojo/public/cpp/bindings/tests/BUILD.gn b/mojo/public/cpp/bindings/tests/BUILD.gn
index 82038a1..dd9db3e 100644
--- a/mojo/public/cpp/bindings/tests/BUILD.gn
+++ b/mojo/public/cpp/bindings/tests/BUILD.gn
@@ -68,7 +68,7 @@
   ]
 
   if (is_ios) {
-    assert_no_deps = [ "//third_party/WebKit/*" ]
+    assert_no_deps = [ "//third_party/blink/*" ]
   } else {
     sources += [
       "pickle_unittest.cc",
diff --git a/net/dns/dns_response.cc b/net/dns/dns_response.cc
index b5857ce2..d4704dd 100644
--- a/net/dns/dns_response.cc
+++ b/net/dns/dns_response.cc
@@ -11,6 +11,7 @@
 
 #include "base/big_endian.h"
 #include "base/logging.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/sys_byteorder.h"
@@ -211,6 +212,8 @@
       reader.ReadU16(&rdlen) &&
       reader.ReadPiece(&out->rdata, rdlen)) {
     cur_ = reader.ptr();
+    UMA_HISTOGRAM_COUNTS_10000("Net.DNS.RecordParser.DomainNameLength",
+                               out->name.length());
     return true;
   }
   return false;
diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h
index 98d9afd..e77ff5f0 100644
--- a/net/socket/client_socket_pool_base.h
+++ b/net/socket/client_socket_pool_base.h
@@ -145,7 +145,7 @@
  private:
   virtual int ConnectInternal() = 0;
 
-  virtual void ChangePriorityInternal(RequestPriority priority) {}
+  virtual void ChangePriorityInternal(RequestPriority priority) = 0;
 
   void LogConnectStart();
   void LogConnectCompletion(int net_error);
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index 9556658..2cb8747 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -422,6 +422,8 @@
     }
   }
 
+  void ChangePriorityInternal(RequestPriority priority) override {}
+
   int DoConnect(bool succeed, bool was_async, bool recoverable) {
     int result = OK;
     if (succeed) {
diff --git a/net/socket/websocket_transport_client_socket_pool.cc b/net/socket/websocket_transport_client_socket_pool.cc
index 5615da0..c28ed68e 100644
--- a/net/socket/websocket_transport_client_socket_pool.cc
+++ b/net/socket/websocket_transport_client_socket_pool.cc
@@ -283,6 +283,13 @@
   return DoLoop(OK);
 }
 
+// Nothing to do here because WebSocket priorities are not changed and
+// stalled_request_{queue, map} don't take priority into account anyway.
+// TODO(chlily): If that ever changes, make the host resolver request reflect
+// the new priority.
+void WebSocketTransportConnectJob::ChangePriorityInternal(
+    RequestPriority priority) {}
+
 WebSocketTransportClientSocketPool::WebSocketTransportClientSocketPool(
     int max_sockets,
     int max_sockets_per_group,
@@ -406,11 +413,11 @@
     RequestPriority priority) {
   // Since sockets requested by RequestSocket are bound early and
   // stalled_request_{queue,map} don't take priorities into account, there's
-  // nothing to do within the pool to change priority or the request.
+  // nothing to do within the pool to change priority of the request.
   // TODO(rdsmith, ricea): Make stalled_request_{queue,map} take priorities
   // into account.
-  // TODO(rdsmith): Investigate plumbing the reprioritization request to the
-  // connect job.
+  // TODO(rdsmith, chlily): Investigate plumbing the reprioritization request to
+  // the connect job.
 }
 
 void WebSocketTransportClientSocketPool::CancelRequest(
diff --git a/net/socket/websocket_transport_client_socket_pool.h b/net/socket/websocket_transport_client_socket_pool.h
index 7262aa0b..7ecb2aa 100644
--- a/net/socket/websocket_transport_client_socket_pool.h
+++ b/net/socket/websocket_transport_client_socket_pool.h
@@ -107,6 +107,8 @@
   // Otherwise, it returns a net error code.
   int ConnectInternal() override;
 
+  void ChangePriorityInternal(RequestPriority priority) override;
+
   scoped_refptr<TransportSocketParams> params_;
   HostResolver* resolver_;
   std::unique_ptr<HostResolver::Request> request_;
diff --git a/ppapi/native_client/BUILD.gn b/ppapi/native_client/BUILD.gn
index e06e4fa..c81744a5 100644
--- a/ppapi/native_client/BUILD.gn
+++ b/ppapi/native_client/BUILD.gn
@@ -37,7 +37,7 @@
       # Skia is one of the easiest dependencies to accidentally add since a
       # bunch of graphics and GPU code uses it.
       "//skia/*",
-      "//third_party/WebKit/*",
+      "//third_party/blink/*",
     ]
   }
 
diff --git a/services/identity/public/cpp/identity_manager.cc b/services/identity/public/cpp/identity_manager.cc
index 8f0f97b5..cecda76 100644
--- a/services/identity/public/cpp/identity_manager.cc
+++ b/services/identity/public/cpp/identity_manager.cc
@@ -303,20 +303,8 @@
   AccountInfo account_info =
       GetAccountInfoForAccountWithRefreshToken(account_id);
 
-  // Compute the validity of the new refresh token: PO2TS sets an account's
-  // refresh token to be invalid (error CREDENTIALS_REJECTED_BY_CLIENT) if the
-  // user signs out of that account on the web.
-  // TODO(blundell): Hide this logic inside PO2TS.
-  bool is_valid = true;
-  GoogleServiceAuthError token_error = token_service_->GetAuthError(account_id);
-  if (token_error == GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
-                         GoogleServiceAuthError::InvalidGaiaCredentialsReason::
-                             CREDENTIALS_REJECTED_BY_CLIENT)) {
-    is_valid = false;
-  }
-
   for (auto& observer : observer_list_) {
-    observer.OnRefreshTokenUpdatedForAccount(account_info, is_valid);
+    observer.OnRefreshTokenUpdatedForAccount(account_info);
   }
 }
 
diff --git a/services/identity/public/cpp/identity_manager.h b/services/identity/public/cpp/identity_manager.h
index d126526c..8f19a5a 100644
--- a/services/identity/public/cpp/identity_manager.h
+++ b/services/identity/public/cpp/identity_manager.h
@@ -87,15 +87,13 @@
         const GoogleServiceAuthError& error) {}
 
     // Called when a new refresh token is associated with |account_info|.
-    // |is_valid| indicates whether the new refresh token is valid.
     // NOTE: On a signin event, the ordering of this callback wrt the
     // OnPrimaryAccountSet() callback is undefined. If you as a client are
     // interested in both callbacks, PrimaryAccountAccessTokenFetcher will
     // likely meet your needs. Otherwise, if this lack of ordering is
     // problematic for your use case, please contact blundell@chromium.org.
     virtual void OnRefreshTokenUpdatedForAccount(
-        const AccountInfo& account_info,
-        bool is_valid) {}
+        const AccountInfo& account_info) {}
 
     // Called when the refresh token previously associated with |account_id|
     // has been removed. At the time that this callback is invoked, there is
@@ -304,7 +302,7 @@
                                            const std::string& account_id);
   friend void UpdateAccountInfoForAccount(IdentityManager* identity_manager,
                                           AccountInfo account_info);
-  friend void SetAccountWithRefreshTokenInPersistentErrorState(
+  friend void UpdatePersistentErrorOfRefreshTokenForAccount(
       IdentityManager* identity_manager,
       const std::string& account_id,
       const GoogleServiceAuthError& auth_error);
diff --git a/services/identity/public/cpp/identity_manager_unittest.cc b/services/identity/public/cpp/identity_manager_unittest.cc
index 3d9f75f..5521872 100644
--- a/services/identity/public/cpp/identity_manager_unittest.cc
+++ b/services/identity/public/cpp/identity_manager_unittest.cc
@@ -236,9 +236,6 @@
   const AccountInfo& account_from_refresh_token_updated_callback() {
     return account_from_refresh_token_updated_callback_;
   }
-  bool validity_from_refresh_token_updated_callback() {
-    return validity_from_refresh_token_updated_callback_;
-  }
   const std::string& account_from_refresh_token_removed_callback() {
     return account_from_refresh_token_removed_callback_;
   }
@@ -280,12 +277,11 @@
     if (on_primary_account_signin_failed_callback_)
       std::move(on_primary_account_signin_failed_callback_).Run();
   }
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override {
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override {
     EXPECT_TRUE(is_inside_batch_);
     batch_change_records_.rbegin()->emplace_back(account_info.account_id);
     account_from_refresh_token_updated_callback_ = account_info;
-    validity_from_refresh_token_updated_callback_ = is_valid;
     if (on_refresh_token_updated_callback_)
       std::move(on_refresh_token_updated_callback_).Run();
   }
@@ -330,7 +326,6 @@
   AccountInfo primary_account_from_set_callback_;
   AccountInfo primary_account_from_cleared_callback_;
   AccountInfo account_from_refresh_token_updated_callback_;
-  bool validity_from_refresh_token_updated_callback_;
   std::string account_from_refresh_token_removed_callback_;
   std::vector<AccountInfo> accounts_from_cookie_change_callback_;
   GoogleServiceAuthError google_signin_failed_error_;
@@ -1577,9 +1572,6 @@
           ->account_from_refresh_token_updated_callback();
   EXPECT_EQ(kTestGaiaId, account_info.gaia);
   EXPECT_EQ(kTestEmail, account_info.email);
-
-  EXPECT_TRUE(identity_manager_observer()
-                  ->validity_from_refresh_token_updated_callback());
 }
 
 TEST_F(IdentityManagerTest,
@@ -1593,9 +1585,6 @@
           ->account_from_refresh_token_updated_callback();
   EXPECT_EQ(kTestGaiaId, account_info.gaia);
   EXPECT_EQ(kTestEmail, account_info.email);
-
-  EXPECT_FALSE(identity_manager_observer()
-                   ->validity_from_refresh_token_updated_callback());
 }
 
 TEST_F(IdentityManagerTest, CallbackSentOnPrimaryAccountRefreshTokenRemoval) {
@@ -1621,9 +1610,6 @@
   EXPECT_EQ(expected_account_info.account_id, account_info.account_id);
   EXPECT_EQ(expected_account_info.gaia, account_info.gaia);
   EXPECT_EQ(expected_account_info.email, account_info.email);
-
-  EXPECT_TRUE(identity_manager_observer()
-                  ->validity_from_refresh_token_updated_callback());
 }
 
 TEST_F(IdentityManagerTest,
@@ -1641,9 +1627,6 @@
   EXPECT_EQ(expected_account_info.account_id, account_info.account_id);
   EXPECT_EQ(expected_account_info.gaia, account_info.gaia);
   EXPECT_EQ(expected_account_info.email, account_info.email);
-
-  EXPECT_FALSE(identity_manager_observer()
-                   ->validity_from_refresh_token_updated_callback());
 }
 
 TEST_F(IdentityManagerTest, CallbackSentOnSecondaryAccountRefreshTokenRemoval) {
@@ -1679,9 +1662,6 @@
   EXPECT_EQ(expected_account_info.account_id, account_info.account_id);
   EXPECT_EQ(expected_account_info.gaia, account_info.gaia);
   EXPECT_EQ(expected_account_info.email, account_info.email);
-
-  EXPECT_TRUE(identity_manager_observer()
-                  ->validity_from_refresh_token_updated_callback());
 }
 
 TEST_F(
@@ -1706,9 +1686,6 @@
   EXPECT_EQ(expected_account_info.account_id, account_info.account_id);
   EXPECT_EQ(expected_account_info.gaia, account_info.gaia);
   EXPECT_EQ(expected_account_info.email, account_info.email);
-
-  EXPECT_FALSE(identity_manager_observer()
-                   ->validity_from_refresh_token_updated_callback());
 }
 
 TEST_F(IdentityManagerTest,
diff --git a/services/identity/public/cpp/identity_test_utils.cc b/services/identity/public/cpp/identity_test_utils.cc
index 0c42fca..8f0cf0a 100644
--- a/services/identity/public/cpp/identity_test_utils.cc
+++ b/services/identity/public/cpp/identity_test_utils.cc
@@ -39,8 +39,8 @@
   void OnPrimaryAccountSet(const AccountInfo& primary_account_info) override;
   void OnPrimaryAccountCleared(
       const AccountInfo& previous_primary_account_info) override;
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
   void OnAccountsInCookieUpdated(
       const std::vector<AccountInfo>& accounts) override;
@@ -85,8 +85,7 @@
 }
 
 void OneShotIdentityManagerObserver::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   if (event_to_wait_on_ != IdentityManagerEvent::REFRESH_TOKEN_UPDATED)
     return;
 
@@ -353,10 +352,11 @@
   return gaia_id;
 }
 
-void SetAccountWithRefreshTokenInPersistentErrorState(
+void UpdatePersistentErrorOfRefreshTokenForAccount(
     IdentityManager* identity_manager,
     const std::string& account_id,
     const GoogleServiceAuthError& auth_error) {
+  DCHECK(identity_manager->HasAccountWithRefreshToken(account_id));
   identity_manager->GetTokenService()->GetDelegate()->UpdateAuthError(
       account_id, GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
                       GoogleServiceAuthError::InvalidGaiaCredentialsReason::
diff --git a/services/identity/public/cpp/identity_test_utils.h b/services/identity/public/cpp/identity_test_utils.h
index 0d2663a..8be8281 100644
--- a/services/identity/public/cpp/identity_test_utils.h
+++ b/services/identity/public/cpp/identity_test_utils.h
@@ -128,7 +128,9 @@
 
 std::string GetTestGaiaIdForEmail(const std::string& email);
 
-void SetAccountWithRefreshTokenInPersistentErrorState(
+// Updates the persistent auth error set on |account_id| which must be a known
+// account, i.e., an account with a refresh token.
+void UpdatePersistentErrorOfRefreshTokenForAccount(
     IdentityManager* identity_manager,
     const std::string& account_id,
     const GoogleServiceAuthError& auth_error);
diff --git a/services/identity/public/cpp/primary_account_access_token_fetcher.cc b/services/identity/public/cpp/primary_account_access_token_fetcher.cc
index 0cbc38a..e626bcb9 100644
--- a/services/identity/public/cpp/primary_account_access_token_fetcher.cc
+++ b/services/identity/public/cpp/primary_account_access_token_fetcher.cc
@@ -75,8 +75,7 @@
 }
 
 void PrimaryAccountAccessTokenFetcher::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
+    const AccountInfo& account_info) {
   ProcessSigninStateChange();
 }
 
diff --git a/services/identity/public/cpp/primary_account_access_token_fetcher.h b/services/identity/public/cpp/primary_account_access_token_fetcher.h
index 3428c5c..c403b83 100644
--- a/services/identity/public/cpp/primary_account_access_token_fetcher.h
+++ b/services/identity/public/cpp/primary_account_access_token_fetcher.h
@@ -63,8 +63,8 @@
 
   // IdentityManager::Observer implementation.
   void OnPrimaryAccountSet(const AccountInfo& primary_account_info) override;
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
 
   // Checks whether credentials are now available and starts an access token
   // request if so. Should only be called in mode |kWaitUntilAvailable|.
diff --git a/services/identity/public/objc/identity_manager_observer_bridge.h b/services/identity/public/objc/identity_manager_observer_bridge.h
index 262d6e5..875c787 100644
--- a/services/identity/public/objc/identity_manager_observer_bridge.h
+++ b/services/identity/public/objc/identity_manager_observer_bridge.h
@@ -27,8 +27,7 @@
                withPassword:(const std::string&)password;
 - (void)onPrimaryAccountCleared:(const AccountInfo&)previousPrimaryAccountInfo;
 - (void)onPrimaryAccountSigninFailed:(const GoogleServiceAuthError&)error;
-- (void)onRefreshTokenUpdatedForAccount:(const AccountInfo&)accountInfo
-                                  valid:(BOOL)isValid;
+- (void)onRefreshTokenUpdatedForAccount:(const AccountInfo&)accountInfo;
 - (void)onRefreshTokenRemovedForAccount:(const std::string&)accountId;
 - (void)onRefreshTokensLoaded;
 - (void)onAccountsInCookieUpdated:(const std::vector<AccountInfo>&)accounts;
@@ -56,8 +55,8 @@
       const AccountInfo& previous_primary_account_info) override;
   void OnPrimaryAccountSigninFailed(
       const GoogleServiceAuthError& error) override;
-  void OnRefreshTokenUpdatedForAccount(const AccountInfo& account_info,
-                                       bool is_valid) override;
+  void OnRefreshTokenUpdatedForAccount(
+      const AccountInfo& account_info) override;
   void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
   void OnRefreshTokensLoaded() override;
   void OnAccountsInCookieUpdated(
diff --git a/services/identity/public/objc/identity_manager_observer_bridge.mm b/services/identity/public/objc/identity_manager_observer_bridge.mm
index aaf0b6b..c8bd4e0 100644
--- a/services/identity/public/objc/identity_manager_observer_bridge.mm
+++ b/services/identity/public/objc/identity_manager_observer_bridge.mm
@@ -52,11 +52,10 @@
 }
 
 void IdentityManagerObserverBridge::OnRefreshTokenUpdatedForAccount(
-    const AccountInfo& account_info,
-    bool is_valid) {
-  if ([delegate_ respondsToSelector:@selector
-                 (onRefreshTokenUpdatedForAccount:valid:)]) {
-    [delegate_ onRefreshTokenUpdatedForAccount:account_info valid:is_valid];
+    const AccountInfo& account_info) {
+  if ([delegate_
+          respondsToSelector:@selector(onRefreshTokenUpdatedForAccount:)]) {
+    [delegate_ onRefreshTokenUpdatedForAccount:account_info];
   }
 }
 
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 3eef70c..00615f9 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -356,12 +356,24 @@
                                   GURL* new_url) override {
     if (!enable_referrers_)
       request->SetReferrer(std::string());
-    if (network_context_->network_service())
-      network_context_->network_service()->OnBeforeURLRequest();
+    NetworkService* network_service = network_context_->network_service();
+    if (network_service)
+      network_service->OnBeforeURLRequest();
 
     auto* loader = URLLoader::ForRequest(*request);
-    if (loader && loader->new_redirect_url())
+    if (!loader)
+      return;
+    const GURL* effective_url = nullptr;
+    if (loader->new_redirect_url()) {
       *new_url = loader->new_redirect_url().value();
+      effective_url = new_url;
+    } else {
+      effective_url = &request->url();
+    }
+    if (network_service) {
+      loader->SetAllowReportingRawHeaders(network_service->HasRawHeadersAccess(
+          loader->GetProcessId(), *effective_url));
+    }
   }
 
   void OnBeforeRedirectInternal(net::URLRequest* request,
@@ -526,6 +538,8 @@
       url_request_context_->net_log(), url_request_context_);
   resource_scheduler_ =
       std::make_unique<ResourceScheduler>(enable_resource_scheduler_);
+
+  InitializeCorsOriginAccessList();
 }
 
 // TODO(mmenke): Share URLRequestContextBulder configuration between two
@@ -553,6 +567,8 @@
       url_request_context_->net_log(), url_request_context_);
   resource_scheduler_ =
       std::make_unique<ResourceScheduler>(enable_resource_scheduler_);
+
+  InitializeCorsOriginAccessList();
 }
 
 NetworkContext::NetworkContext(NetworkService* network_service,
@@ -2172,4 +2188,14 @@
 }
 #endif
 
+void NetworkContext::InitializeCorsOriginAccessList() {
+  for (const auto& pattern : params_->cors_origin_access_list) {
+    url::Origin origin = url::Origin::Create(GURL(pattern->source_origin));
+    cors_origin_access_list_.SetAllowListForOrigin(origin,
+                                                   pattern->allow_patterns);
+    cors_origin_access_list_.SetBlockListForOrigin(origin,
+                                                   pattern->block_patterns);
+  }
+}
+
 }  // namespace network
diff --git a/services/network/network_context.h b/services/network/network_context.h
index 2eccbe0b..c08d5824 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -412,6 +412,8 @@
   void OnSetExpectCTTestReportFailure();
 #endif  // BUILDFLAG(IS_CT_SUPPORTED)
 
+  void InitializeCorsOriginAccessList();
+
   NetworkService* const network_service_;
 
   mojom::NetworkContextClientPtr client_;
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index dd50a53..57746b1 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -426,20 +426,27 @@
 #endif
 }
 
-void NetworkService::SetRawHeadersAccess(uint32_t process_id, bool allow) {
+void NetworkService::SetRawHeadersAccess(
+    uint32_t process_id,
+    const std::vector<url::Origin>& origins) {
   DCHECK(process_id);
-  if (allow)
-    processes_with_raw_headers_access_.insert(process_id);
-  else
-    processes_with_raw_headers_access_.erase(process_id);
+  if (!origins.size()) {
+    raw_headers_access_origins_by_pid_.erase(process_id);
+  } else {
+    raw_headers_access_origins_by_pid_[process_id] =
+        base::flat_set<url::Origin>(origins.begin(), origins.end());
+  }
 }
 
-bool NetworkService::HasRawHeadersAccess(uint32_t process_id) const {
+bool NetworkService::HasRawHeadersAccess(uint32_t process_id,
+                                         const GURL& resource_url) const {
   // Allow raw headers for browser-initiated requests.
   if (!process_id)
     return true;
-  return processes_with_raw_headers_access_.find(process_id) !=
-         processes_with_raw_headers_access_.end();
+  auto it = raw_headers_access_origins_by_pid_.find(process_id);
+  if (it == raw_headers_access_origins_by_pid_.end())
+    return false;
+  return it->second.find(url::Origin::Create(resource_url)) != it->second.end();
 }
 
 net::NetLog* NetworkService::net_log() const {
diff --git a/services/network/network_service.h b/services/network/network_service.h
index be4f3bd6..01e76ca 100644
--- a/services/network/network_service.h
+++ b/services/network/network_service.h
@@ -10,6 +10,7 @@
 #include <string>
 
 #include "base/component_export.h"
+#include "base/containers/flat_set.h"
 #include "base/containers/span.h"
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/macros.h"
@@ -158,7 +159,8 @@
       mojom::HttpAuthStaticParamsPtr http_auth_static_params) override;
   void ConfigureHttpAuthPrefs(
       mojom::HttpAuthDynamicParamsPtr http_auth_dynamic_params) override;
-  void SetRawHeadersAccess(uint32_t process_id, bool allow) override;
+  void SetRawHeadersAccess(uint32_t process_id,
+                           const std::vector<url::Origin>& origins) override;
   void GetNetworkChangeManager(
       mojom::NetworkChangeManagerRequest request) override;
   void GetNetworkQualityEstimatorManager(
@@ -192,7 +194,7 @@
   void OnBeforeURLRequest();
 
   bool quic_disabled() const { return quic_disabled_; }
-  bool HasRawHeadersAccess(uint32_t process_id) const;
+  bool HasRawHeadersAccess(uint32_t process_id, const GURL& resource_url) const;
 
   mojom::NetworkServiceClient* client() { return client_.get(); }
   net::NetworkQualityEstimator* network_quality_estimator() {
@@ -296,7 +298,10 @@
   // this with |owned_network_contexts_|.
   std::set<NetworkContext*> network_contexts_;
 
-  std::set<uint32_t> processes_with_raw_headers_access_;
+  // A per-process_id map of origins that are white-listed to allow
+  // them to request raw headers for resources they request.
+  std::map<uint32_t, base::flat_set<url::Origin>>
+      raw_headers_access_origins_by_pid_;
 
   bool quic_disabled_ = false;
 
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc
index 8da2228..4ef51b53 100644
--- a/services/network/network_service_unittest.cc
+++ b/services/network/network_service_unittest.cc
@@ -36,6 +36,7 @@
 #include "services/network/network_context.h"
 #include "services/network/network_service.h"
 #include "services/network/public/cpp/features.h"
+#include "services/network/public/cpp/network_switches.h"
 #include "services/network/public/mojom/net_log.mojom.h"
 #include "services/network/public/mojom/network_change_manager.mojom.h"
 #include "services/network/public/mojom/network_service.mojom.h"
@@ -817,7 +818,10 @@
   StartLoadingURL(request, process_id);
   client()->RunUntilComplete();
   EXPECT_FALSE(client()->response_head().raw_request_response_info);
-  service()->SetRawHeadersAccess(process_id, true);
+  service()->SetRawHeadersAccess(
+      process_id,
+      {url::Origin::CreateFromNormalizedTuple("http", "example.com", 80),
+       url::Origin::Create(request.url)});
   StartLoadingURL(request, process_id);
   client()->RunUntilComplete();
   {
@@ -828,10 +832,73 @@
     EXPECT_EQ("OK", request_response_info->http_status_text);
   }
 
-  service()->SetRawHeadersAccess(process_id, false);
+  service()->SetRawHeadersAccess(process_id, {});
   StartLoadingURL(request, process_id);
   client()->RunUntilComplete();
   EXPECT_FALSE(client()->response_head().raw_request_response_info.get());
+
+  service()->SetRawHeadersAccess(
+      process_id,
+      {url::Origin::CreateFromNormalizedTuple("http", "example.com", 80)});
+  StartLoadingURL(request, process_id);
+  client()->RunUntilComplete();
+  EXPECT_FALSE(client()->response_head().raw_request_response_info.get());
+}
+
+class NetworkServiceTestWithResolverMap : public NetworkServiceTestWithService {
+  void SetUp() override {
+    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+        network::switches::kHostResolverRules, "MAP *.test 127.0.0.1");
+    NetworkServiceTestWithService::SetUp();
+  }
+};
+
+TEST_F(NetworkServiceTestWithResolverMap, RawRequestAccessControlWithRedirect) {
+  CreateNetworkContext();
+
+  const uint32_t process_id = 42;
+  // initial_url in a.test redirects to b_url (in b.test) that then redirects to
+  // url_a in a.test.
+  GURL url_a = test_server()->GetURL("a.test", "/echo");
+  GURL url_b =
+      test_server()->GetURL("b.test", "/server-redirect?" + url_a.spec());
+  GURL initial_url =
+      test_server()->GetURL("a.test", "/server-redirect?" + url_b.spec());
+  ResourceRequest request;
+  request.url = initial_url;
+  request.method = "GET";
+  request.report_raw_headers = true;
+  request.request_initiator = url::Origin();
+
+  service()->SetRawHeadersAccess(process_id, {url::Origin::Create(url_a)});
+
+  StartLoadingURL(request, process_id);
+  client()->RunUntilRedirectReceived();  // from a.test to b.test
+  EXPECT_TRUE(client()->response_head().raw_request_response_info);
+
+  loader()->FollowRedirect(base::nullopt, base::nullopt, base::nullopt);
+  client()->ClearHasReceivedRedirect();
+  client()->RunUntilRedirectReceived();  // from b.test to a.test
+  EXPECT_FALSE(client()->response_head().raw_request_response_info);
+
+  loader()->FollowRedirect(base::nullopt, base::nullopt, base::nullopt);
+  client()->RunUntilComplete();  // Done loading a.test
+  EXPECT_TRUE(client()->response_head().raw_request_response_info.get());
+
+  service()->SetRawHeadersAccess(process_id, {url::Origin::Create(url_b)});
+
+  StartLoadingURL(request, process_id);
+  client()->RunUntilRedirectReceived();  // from a.test to b.test
+  EXPECT_FALSE(client()->response_head().raw_request_response_info);
+
+  loader()->FollowRedirect(base::nullopt, base::nullopt, base::nullopt);
+  client()->ClearHasReceivedRedirect();
+  client()->RunUntilRedirectReceived();  // from b.test to a.test
+  EXPECT_TRUE(client()->response_head().raw_request_response_info);
+
+  loader()->FollowRedirect(base::nullopt, base::nullopt, base::nullopt);
+  client()->RunUntilComplete();  // Done loading a.test
+  EXPECT_FALSE(client()->response_head().raw_request_response_info.get());
 }
 
 TEST_F(NetworkServiceTestWithService, SetNetworkConditions) {
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
index 350b446..0f431c33c 100644
--- a/services/network/public/mojom/network_context.mojom
+++ b/services/network/public/mojom/network_context.mojom
@@ -307,6 +307,10 @@
   // verification, we should consider using each URLRequestContext to do its own
   // validation.
   bool primary_network_context = false;
+
+  // Specifies the initial set of allowed and blocked origins for the
+  // URLLoaderFactory consumers to access beyond the same-origin-policy.
+  array<CorsOriginAccessPatterns> cors_origin_access_list;
 };
 
 struct NetworkConditions {
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom
index 0ac2053..11c4762 100644
--- a/services/network/public/mojom/network_service.mojom
+++ b/services/network/public/mojom/network_service.mojom
@@ -291,10 +291,15 @@
   ConfigureHttpAuthPrefs(HttpAuthDynamicParams http_auth_dynamic_params);
 
   // Specifies whether requests for raw headers coming through URLLoaderFactory
-  // associated with the specified process will be granted. Granting such a
-  // permission increases risks in case the child process becomes compromised,
-  // so this should be done only in specific cases (e.g. DevTools attached).
-  SetRawHeadersAccess(uint32 process_id, bool allow);
+  // associated with the specified process will be granted. Only raw headers
+  // for requests with URLs matching a listed origin will be reported (this
+  // permission has no effect on the network request itself).
+  // The list overwrites the list set for given process with a previous call
+  // to this method.
+  // Granting a permission increases risks in case the child process becomes
+  // compromised, so this should be done only in specific cases
+  // (e.g. DevTools attached).
+  SetRawHeadersAccess(uint32 process_id, array<url.mojom.Origin> origins);
 
   // Gets the NetworkChangeManager.
   GetNetworkChangeManager(
diff --git a/services/network/public/mojom/websocket.mojom b/services/network/public/mojom/websocket.mojom
index b007d38a..bc9bde7 100644
--- a/services/network/public/mojom/websocket.mojom
+++ b/services/network/public/mojom/websocket.mojom
@@ -52,8 +52,6 @@
   OnFailChannel(string reason);
 
   // Notify the renderer that the browser has started an opening handshake.
-  // This message is for showing the request in the inspector and
-  // can be omitted if the inspector is not active.
   OnStartOpeningHandshake(WebSocketHandshakeRequest request);
 
   // Notify the renderer that the browser has finished an opening handshake.
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 7b2c72c..3a16431 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -307,7 +307,6 @@
     mojom::URLLoaderRequest url_loader_request,
     int32_t options,
     const ResourceRequest& request,
-    bool report_raw_headers,
     mojom::URLLoaderClientPtr url_loader_client,
     const net::NetworkTrafficAnnotationTag& traffic_annotation,
     const mojom::URLLoaderFactoryParams* factory_params,
@@ -336,7 +335,8 @@
       peer_closed_handle_watcher_(FROM_HERE,
                                   mojo::SimpleWatcher::ArmingPolicy::MANUAL,
                                   base::SequencedTaskRunnerHandle::Get()),
-      report_raw_headers_(report_raw_headers),
+      want_raw_headers_(request.report_raw_headers),
+      report_raw_headers_(false),
       resource_scheduler_client_(std::move(resource_scheduler_client)),
       keepalive_statistics_recorder_(std::move(keepalive_statistics_recorder)),
       network_usage_accumulator_(std::move(network_usage_accumulator)),
@@ -358,13 +358,12 @@
         << "disabled, as that skips security checks in ResourceDispatcherHost. "
         << "The only acceptable usage is the browser using SimpleURLLoader.";
   }
-  if (report_raw_headers_) {
+  if (want_raw_headers_) {
     options_ |= mojom::kURLLoadOptionSendSSLInfoWithResponse |
                 mojom::kURLLoadOptionSendSSLInfoForCertificateError;
   }
   binding_.set_connection_error_handler(
       base::BindOnce(&URLLoader::OnConnectionError, base::Unretained(this)));
-
   url_request_ = url_request_context_->CreateRequest(
       GURL(request.url), request.priority, this, traffic_annotation);
   url_request_->set_method(request.method);
@@ -416,7 +415,7 @@
     url_request_->set_allow_credentials(false);
   }
 
-  if (report_raw_headers_) {
+  if (want_raw_headers_) {
     url_request_->SetRequestHeadersCallback(
         base::Bind(&net::HttpRawRequestHeaders::Assign,
                    base::Unretained(&raw_request_headers_)));
@@ -1023,6 +1022,10 @@
   return factory_params_->process_id;
 }
 
+void URLLoader::SetAllowReportingRawHeaders(bool allow) {
+  report_raw_headers_ = want_raw_headers_ && allow;
+}
+
 // static
 URLLoader* URLLoader::ForRequest(const net::URLRequest& request) {
   auto* pointer =
diff --git a/services/network/url_loader.h b/services/network/url_loader.h
index 25635750b..aedaec52 100644
--- a/services/network/url_loader.h
+++ b/services/network/url_loader.h
@@ -60,7 +60,6 @@
       mojom::URLLoaderRequest url_loader_request,
       int32_t options,
       const ResourceRequest& request,
-      bool report_raw_headers,
       mojom::URLLoaderClientPtr url_loader_client,
       const net::NetworkTrafficAnnotationTag& traffic_annotation,
       const mojom::URLLoaderFactoryParams* factory_params,
@@ -132,6 +131,8 @@
     return new_redirect_url_;
   }
 
+  void SetAllowReportingRawHeaders(bool allow);
+
   // Gets the URLLoader associated with this request.
   static URLLoader* ForRequest(const net::URLRequest& request);
 
@@ -253,6 +254,9 @@
   std::unique_ptr<ResourceScheduler::ScheduledResourceRequest>
       resource_scheduler_request_handle_;
 
+  // Whether client requested raw headers.
+  const bool want_raw_headers_;
+  // Whether we actually should report them.
   bool report_raw_headers_;
   net::HttpRawRequestHeaders raw_request_headers_;
   scoped_refptr<const net::HttpResponseHeaders> raw_response_headers_;
diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc
index c6b5ddd..0b93d46 100644
--- a/services/network/url_loader_factory.cc
+++ b/services/network/url_loader_factory.cc
@@ -83,16 +83,6 @@
         origin_head_same_as_request_origin);
   }
 
-  bool report_raw_headers = false;
-  if (url_request.report_raw_headers) {
-    const NetworkService* service = context_->network_service();
-    report_raw_headers =
-        service && service->HasRawHeadersAccess(params_->process_id);
-    if (!report_raw_headers)
-      DLOG(ERROR) << "Denying raw headers request by process "
-                  << params_->process_id;
-  }
-
   mojom::NetworkServiceClient* network_service_client = nullptr;
   base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder;
   base::WeakPtr<NetworkUsageAccumulator> network_usage_accumulator;
@@ -143,8 +133,7 @@
       context_->url_request_context(), network_service_client,
       base::BindOnce(&cors::CorsURLLoaderFactory::DestroyURLLoader,
                      base::Unretained(cors_url_loader_factory_)),
-      std::move(request), options, url_request, report_raw_headers,
-      std::move(client),
+      std::move(request), options, url_request, std::move(client),
       static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation),
       params_.get(), request_id, resource_scheduler_client_,
       std::move(keepalive_statistics_recorder),
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index b4b78cf..0112c57 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -434,7 +434,7 @@
     url_loader = std::make_unique<URLLoader>(
         context(), network_service_client.get(),
         DeleteLoaderCallback(&delete_run_loop, &url_loader),
-        mojo::MakeRequest(&loader), options, request, false,
+        mojo::MakeRequest(&loader), options, request,
         client_.CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
         0 /* request_id */, resource_scheduler_client(), nullptr,
         nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -962,9 +962,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   // Run until the response body pipe arrives, to make sure that a live body
@@ -1014,9 +1014,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   client()->RunUntilResponseBodyArrived();
@@ -1068,9 +1068,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   // Pausing reading response body from network stops future reads from the
@@ -1144,9 +1144,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   response_controller.WaitForRequest();
@@ -1209,9 +1209,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   loader->PauseReadingBodyFromNet();
@@ -1269,9 +1269,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   // It is okay to call ResumeReadingBodyFromNet() even if there is no prior
@@ -1451,9 +1451,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), network_service_client.get(),
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   mojom::NetworkServiceClient::OnFileUploadRequestedCallback callback;
@@ -1635,9 +1635,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false /* report_raw_headers */,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, nullptr /* resource_scheduler_client */,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      nullptr /* resource_scheduler_client */,
       nullptr /* keepalive_statistics_reporter */,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
@@ -1703,7 +1703,7 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, false,
+      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request,
       client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
       0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -1748,7 +1748,7 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, false,
+      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request,
       client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
       0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -1790,7 +1790,7 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, false,
+      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request,
       client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
       0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -1908,7 +1908,7 @@
     std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
         context(), nullptr /* network_service_client */,
         NeverInvokedDeleteLoaderCallback(),
-        mojo::MakeRequest(&loaderInterfacePtr), 0, request, false,
+        mojo::MakeRequest(&loaderInterfacePtr), 0, request,
         client.CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
         0 /* request_id */, resource_scheduler_client(), nullptr,
         nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -1929,7 +1929,7 @@
   std::unique_ptr<URLLoader> loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       NeverInvokedDeleteLoaderCallback(),
-      mojo::MakeRequest(&loader_interface_ptr), 0, request, false,
+      mojo::MakeRequest(&loader_interface_ptr), 0, request,
       client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
       0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -1964,7 +1964,7 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, false,
+      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request,
       client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
       0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -2018,7 +2018,7 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, false,
+      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request,
       client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
       0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -2066,8 +2066,8 @@
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
       mojo::MakeRequest(&loader), mojom::kURLLoadOptionSniffMimeType, request,
-      false, client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS,
-      &params, 0 /* request_id */, resource_scheduler_client(), nullptr,
+      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
+      0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   url_loader->PauseReadingBodyFromNet();
@@ -2109,7 +2109,7 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, false,
+      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request,
       client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
       0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -2378,9 +2378,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
   base::RunLoop().RunUntilIdle();
 
@@ -2419,9 +2419,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
   base::RunLoop().RunUntilIdle();
 
@@ -2461,9 +2461,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
   base::RunLoop().RunUntilIdle();
 
@@ -2504,9 +2504,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
   base::RunLoop().RunUntilIdle();
 
@@ -2546,9 +2546,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
   base::RunLoop().RunUntilIdle();
 
@@ -2586,9 +2586,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   client()->RunUntilResponseBodyArrived();
@@ -2624,9 +2624,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   client()->RunUntilResponseBodyArrived();
@@ -2665,9 +2665,9 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   client()->RunUntilResponseBodyArrived();
@@ -2698,7 +2698,7 @@
   url_loader = std::make_unique<URLLoader>(
       context(), nullptr /* network_service_client */,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request, false,
+      mojo::MakeRequest(&loader), mojom::kURLLoadOptionNone, request,
       client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
       0 /* request_id */, resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
@@ -2775,9 +2775,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
   network_service_client.set_url_loader_ptr(&loader);
 
@@ -2814,9 +2814,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   RunUntilIdle();
@@ -2862,9 +2862,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   RunUntilIdle();
@@ -2916,9 +2916,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   RunUntilIdle();
@@ -2972,9 +2972,9 @@
   std::unique_ptr<URLLoader> url_loader = std::make_unique<URLLoader>(
       context(), &network_service_client,
       DeleteLoaderCallback(&delete_run_loop, &url_loader),
-      mojo::MakeRequest(&loader), 0, request, false,
-      client()->CreateInterfacePtr(), TRAFFIC_ANNOTATION_FOR_TESTS, &params,
-      0 /* request_id */, resource_scheduler_client(), nullptr,
+      mojo::MakeRequest(&loader), 0, request, client()->CreateInterfacePtr(),
+      TRAFFIC_ANNOTATION_FOR_TESTS, &params, 0 /* request_id */,
+      resource_scheduler_client(), nullptr,
       nullptr /* network_usage_accumulator */, nullptr /* header_client */);
 
   RunUntilIdle();
diff --git a/services/network/websocket.cc b/services/network/websocket.cc
index 55e853a..feda865 100644
--- a/services/network/websocket.cc
+++ b/services/network/websocket.cc
@@ -204,37 +204,44 @@
 
 void WebSocket::WebSocketEventHandler::OnStartOpeningHandshake(
     std::unique_ptr<net::WebSocketHandshakeRequestInfo> request) {
-  bool should_send = impl_->delegate_->CanReadRawCookies();
+  bool can_read_raw_cookies = impl_->delegate_->CanReadRawCookies(request->url);
 
   DVLOG(3) << "WebSocketEventHandler::OnStartOpeningHandshake @"
-           << reinterpret_cast<void*>(this) << " should_send=" << should_send;
-
-  if (!should_send)
-    return;
+           << reinterpret_cast<void*>(this)
+           << " can_read_raw_cookies =" << can_read_raw_cookies;
 
   mojom::WebSocketHandshakeRequestPtr request_to_pass(
       mojom::WebSocketHandshakeRequest::New());
   request_to_pass->url.Swap(&request->url);
+  std::string headers_text = base::StringPrintf(
+      "GET %s HTTP/1.1\r\n", request_to_pass->url.spec().c_str());
   net::HttpRequestHeaders::Iterator it(request->headers);
   while (it.GetNext()) {
+    if (!can_read_raw_cookies &&
+        base::EqualsCaseInsensitiveASCII(it.name(),
+                                         net::HttpRequestHeaders::kCookie)) {
+      continue;
+    }
     mojom::HttpHeaderPtr header(mojom::HttpHeader::New());
     header->name = it.name();
     header->value = it.value();
     request_to_pass->headers.push_back(std::move(header));
+    headers_text.append(base::StringPrintf("%s: %s\r\n", it.name().c_str(),
+                                           it.value().c_str()));
   }
-  request_to_pass->headers_text =
-      base::StringPrintf("GET %s HTTP/1.1\r\n",
-                         request_to_pass->url.spec().c_str()) +
-      request->headers.ToString();
+  headers_text.append("\r\n");
+  request_to_pass->headers_text = std::move(headers_text);
 
   impl_->client_->OnStartOpeningHandshake(std::move(request_to_pass));
 }
 
 void WebSocket::WebSocketEventHandler::OnFinishOpeningHandshake(
     std::unique_ptr<net::WebSocketHandshakeResponseInfo> response) {
+  bool can_read_raw_cookies =
+      impl_->delegate_->CanReadRawCookies(response->url);
   DVLOG(3) << "WebSocketEventHandler::OnFinishOpeningHandshake "
            << reinterpret_cast<void*>(this)
-           << " CanReadRawCookies=" << impl_->delegate_->CanReadRawCookies();
+           << " CanReadRawCookies=" << can_read_raw_cookies;
 
   mojom::WebSocketHandshakeResponsePtr response_to_pass(
       mojom::WebSocketHandshakeResponse::New());
@@ -246,7 +253,7 @@
   size_t iter = 0;
   std::string name, value;
   while (response->headers->EnumerateHeaderLines(&iter, &name, &value)) {
-    if (impl_->delegate_->CanReadRawCookies() ||
+    if (can_read_raw_cookies ||
         !net::HttpResponseHeaders::IsCookieResponseHeader(name)) {
       // We drop cookie-related headers such as "set-cookie" when the
       // renderer doesn't have access.
diff --git a/services/network/websocket.h b/services/network/websocket.h
index c54b9b2..8b736249 100644
--- a/services/network/websocket.h
+++ b/services/network/websocket.h
@@ -55,7 +55,7 @@
         bool fatal) = 0;
     // This function may delete |impl|.
     virtual void ReportBadMessage(BadMessageReason reason, WebSocket* impl) = 0;
-    virtual bool CanReadRawCookies() = 0;
+    virtual bool CanReadRawCookies(const GURL& url) = 0;
     virtual void OnCreateURLRequest(int child_id,
                                     int frame_id,
                                     net::URLRequest* request) = 0;
diff --git a/services/network/websocket_factory.cc b/services/network/websocket_factory.cc
index 75e9516..fd21e41 100644
--- a/services/network/websocket_factory.cc
+++ b/services/network/websocket_factory.cc
@@ -59,9 +59,9 @@
     OnLostConnectionToClient(impl);
   }
 
-  bool CanReadRawCookies() override {
+  bool CanReadRawCookies(const GURL& url) override {
     return factory_->context_->network_service()->HasRawHeadersAccess(
-        process_id_);
+        process_id_, url);
   }
 
   void OnCreateURLRequest(int child_id,
diff --git a/services/tracing/public/cpp/perfetto/producer_client.cc b/services/tracing/public/cpp/perfetto/producer_client.cc
index 123fa12..b7b6ac33 100644
--- a/services/tracing/public/cpp/perfetto/producer_client.cc
+++ b/services/tracing/public/cpp/perfetto/producer_client.cc
@@ -302,4 +302,13 @@
   return shared_memory_arbiter_->CreateTraceWriter(target_buffer);
 }
 
+void ProducerClient::RegisterTraceWriter(uint32_t writer_id,
+                                         uint32_t target_buffer) {
+  // TODO(eseckler): implement.
+}
+
+void ProducerClient::UnregisterTraceWriter(uint32_t writer_id) {
+  // TODO(eseckler): implement.
+}
+
 }  // namespace tracing
diff --git a/services/tracing/public/cpp/perfetto/producer_client.h b/services/tracing/public/cpp/perfetto/producer_client.h
index 393ecdbf..82fba91 100644
--- a/services/tracing/public/cpp/perfetto/producer_client.h
+++ b/services/tracing/public/cpp/perfetto/producer_client.h
@@ -117,6 +117,8 @@
       perfetto::BufferID target_buffer) override;
   void NotifyFlushComplete(perfetto::FlushRequestID) override;
   perfetto::SharedMemory* shared_memory() const override;
+  void RegisterTraceWriter(uint32_t writer_id, uint32_t target_buffer) override;
+  void UnregisterTraceWriter(uint32_t writer_id) override;
 
   // These ProducerEndpoint functions are only used on the service
   // side and should not be called on the clients.
diff --git a/services/video_capture/service_impl.cc b/services/video_capture/service_impl.cc
index d96c336f..197fa0b 100644
--- a/services/video_capture/service_impl.cc
+++ b/services/video_capture/service_impl.cc
@@ -6,7 +6,6 @@
 
 #include "build/build_config.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
-#include "services/service_manager/public/cpp/service_context.h"
 #include "services/video_capture/device_factory_provider_impl.h"
 #include "services/video_capture/public/mojom/constants.mojom.h"
 #include "services/video_capture/public/uma/video_capture_service_event.h"
diff --git a/services/viz/BUILD.gn b/services/viz/BUILD.gn
index 045a310..ec11edc4 100644
--- a/services/viz/BUILD.gn
+++ b/services/viz/BUILD.gn
@@ -6,6 +6,7 @@
 import("//services/service_manager/public/service_manifest.gni")
 
 service("viz") {
+  use_cpp_main = true
   sources = [
     "main.cc",
   ]
diff --git a/services/viz/main.cc b/services/viz/main.cc
index 48b037e..5818269 100644
--- a/services/viz/main.cc
+++ b/services/viz/main.cc
@@ -2,14 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "services/service_manager/public/c/main.h"
 #include "base/message_loop/message_loop.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/standalone_service/service_main.h"
 #include "services/viz/service.h"
 
-MojoResult ServiceMain(MojoHandle service_request_handle) {
-  viz::Service* viz_service = new viz::Service();
-  service_manager::ServiceRunner runner(viz_service);
-  runner.set_message_loop_type(base::MessageLoop::TYPE_UI);
-  return runner.Run(service_request_handle);
+void ServiceMain(service_manager::mojom::ServiceRequest request) {
+  base::MessageLoop message_loop(base::MessageLoop::TYPE_UI);
+  viz::Service(std::move(request)).RunUntilTermination();
 }
diff --git a/services/viz/service.cc b/services/viz/service.cc
index b3e3d75..e35f894 100644
--- a/services/viz/service.cc
+++ b/services/viz/service.cc
@@ -5,12 +5,12 @@
 #include "services/viz/service.h"
 
 #include "components/viz/service/main/viz_main_impl.h"
-#include "services/service_manager/public/cpp/service_context.h"
 #include "services/viz/privileged/interfaces/viz_main.mojom.h"
 
 namespace viz {
 
-Service::Service() = default;
+Service::Service(service_manager::mojom::ServiceRequest request)
+    : service_binding_(this, std::move(request)) {}
 
 Service::~Service() = default;
 
@@ -21,7 +21,7 @@
 
   VizMainImpl::ExternalDependencies deps;
   deps.create_display_compositor = true;
-  deps.connector = context()->connector();
+  deps.connector = service_binding_.GetConnector();
   viz_main_ = std::make_unique<VizMainImpl>(nullptr, std::move(deps));
 }
 
diff --git a/services/viz/service.h b/services/viz/service.h
index ffcda4d..e2cbfba 100644
--- a/services/viz/service.h
+++ b/services/viz/service.h
@@ -7,6 +7,8 @@
 
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "services/viz/privileged/interfaces/viz_main.mojom.h"
 
 namespace viz {
@@ -15,7 +17,7 @@
 
 class Service : public service_manager::Service {
  public:
-  Service();
+  explicit Service(service_manager::mojom::ServiceRequest request);
   ~Service() override;
 
  private:
@@ -27,6 +29,7 @@
                        const std::string& interface_name,
                        mojo::ScopedMessagePipeHandle interface_pipe) override;
 
+  service_manager::ServiceBinding service_binding_;
   service_manager::BinderRegistry registry_;
 
   std::unique_ptr<VizMainImpl> viz_main_;
diff --git a/services/ws/screen_provider_unittest.cc b/services/ws/screen_provider_unittest.cc
index 2b2cd2d..5138ae1 100644
--- a/services/ws/screen_provider_unittest.cc
+++ b/services/ws/screen_provider_unittest.cc
@@ -140,18 +140,17 @@
 
   // Create another WindowService.
   TestWindowServiceDelegate test_window_service_delegate;
-  std::unique_ptr<WindowService> window_service_ptr =
-      std::make_unique<WindowService>(&test_window_service_delegate, nullptr,
-                                      test_setup.focus_controller());
-  std::unique_ptr<service_manager::TestConnectorFactory> factory =
-      service_manager::TestConnectorFactory::CreateForUniqueService(
-          std::move(window_service_ptr));
-  std::unique_ptr<service_manager::Connector> connector =
-      factory->CreateConnector();
+  WindowService window_service(&test_window_service_delegate, nullptr,
+                               test_setup.focus_controller());
+
+  service_manager::TestConnectorFactory factory;
+  window_service.BindServiceRequest(
+      factory.RegisterInstance(mojom::kServiceName));
 
   // Connect to |window_service| and ask for a new WindowTree.
   mojom::WindowTreeFactoryPtr window_tree_factory;
-  connector->BindInterface(mojom::kServiceName, &window_tree_factory);
+  factory.GetDefaultConnector()->BindInterface(mojom::kServiceName,
+                                               &window_tree_factory);
   mojom::WindowTreePtr window_tree;
   mojom::WindowTreeClientPtr client;
   mojom::WindowTreeClientRequest client_request = MakeRequest(&client);
diff --git a/services/ws/test_ws/BUILD.gn b/services/ws/test_ws/BUILD.gn
index f93a30a3..f8a461a4 100644
--- a/services/ws/test_ws/BUILD.gn
+++ b/services/ws/test_ws/BUILD.gn
@@ -8,7 +8,7 @@
 
 service("test_ws") {
   testonly = true
-
+  use_cpp_main = true
   sources = [
     "test_ws.cc",
   ]
diff --git a/services/ws/test_ws/test_window_service.cc b/services/ws/test_ws/test_window_service.cc
index aef84fbe..307df33 100644
--- a/services/ws/test_ws/test_window_service.cc
+++ b/services/ws/test_ws/test_window_service.cc
@@ -50,7 +50,9 @@
   DISALLOW_COPY_AND_ASSIGN(VisibilitySynchronizer);
 };
 
-TestWindowService::TestWindowService() = default;
+TestWindowService::TestWindowService(
+    service_manager::mojom::ServiceRequest request)
+    : service_binding_(this, std::move(request)) {}
 
 TestWindowService::~TestWindowService() {
   Shutdown(base::NullCallback());
@@ -176,16 +178,15 @@
   DCHECK(!ui_service_created_);
   ui_service_created_ = true;
 
-  auto window_service = std::make_unique<WindowService>(
+  window_service_ = std::make_unique<WindowService>(
       this, std::move(gpu_interface_provider_),
       aura_test_helper_->focus_client(), /*decrement_client_ids=*/false,
       aura_test_helper_->GetEnv());
   test_host_event_dispatcher_ =
       std::make_unique<TestHostEventDispatcher>(aura_test_helper_->host());
-  host_event_queue_ = window_service->RegisterHostEventDispatcher(
+  host_event_queue_ = window_service_->RegisterHostEventDispatcher(
       aura_test_helper_->host(), test_host_event_dispatcher_.get());
-  service_context_ = std::make_unique<service_manager::ServiceContext>(
-      std::move(window_service), std::move(request));
+  window_service_->BindServiceRequest(std::move(request));
   pid_receiver->SetPID(base::GetCurrentProcId());
 }
 
@@ -204,7 +205,7 @@
 void TestWindowService::Shutdown(
     test_ws::mojom::TestWs::ShutdownCallback callback) {
   // WindowService depends upon Screen, which is owned by AuraTestHelper.
-  service_context_.reset();
+  window_service_.reset();
 
   // |aura_test_helper_| could be null when exiting before fully initialized.
   if (aura_test_helper_) {
@@ -235,7 +236,8 @@
       std::make_unique<discardable_memory::DiscardableSharedMemoryManager>();
 
   gpu_host_ = std::make_unique<gpu_host::GpuHost>(
-      this, context()->connector(), discardable_shared_memory_manager_.get());
+      this, service_binding_.GetConnector(),
+      discardable_shared_memory_manager_.get());
 
   gpu_interface_provider_ = std::make_unique<TestGpuInterfaceProvider>(
       gpu_host_.get(), discardable_shared_memory_manager_.get());
diff --git a/services/ws/test_ws/test_window_service.h b/services/ws/test_ws/test_window_service.h
index b3cd302..5e7a436 100644
--- a/services/ws/test_ws/test_window_service.h
+++ b/services/ws/test_ws/test_window_service.h
@@ -13,7 +13,8 @@
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_context.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "services/ws/gpu_host/gpu_host.h"
 #include "services/ws/gpu_host/gpu_host_delegate.h"
@@ -35,6 +36,7 @@
 
 class HostEventQueue;
 class TestHostEventDispatcher;
+class WindowService;
 
 namespace test {
 
@@ -46,7 +48,7 @@
                           public WindowServiceDelegate,
                           public test_ws::mojom::TestWs {
  public:
-  TestWindowService();
+  explicit TestWindowService(service_manager::mojom::ServiceRequest request);
   ~TestWindowService() override;
 
   void InitForInProcess(
@@ -106,14 +108,14 @@
   void SetupAuraTestHelper(ui::ContextFactory* context_factory,
                            ui::ContextFactoryPrivate* context_factory_private);
 
+  service_manager::ServiceBinding service_binding_;
   service_manager::BinderRegistry registry_;
 
   mojo::BindingSet<service_manager::mojom::ServiceFactory>
       service_factory_bindings_;
   mojo::BindingSet<test_ws::mojom::TestWs> test_ws_bindings_;
 
-  // Handles the ServiceRequest. Owns the WindowService instance.
-  std::unique_ptr<service_manager::ServiceContext> service_context_;
+  std::unique_ptr<WindowService> window_service_;
 
   std::unique_ptr<aura::test::AuraTestHelper> aura_test_helper_;
 
diff --git a/services/ws/test_ws/test_window_service_factory.cc b/services/ws/test_ws/test_window_service_factory.cc
index 456f704..ddf9b37 100644
--- a/services/ws/test_ws/test_window_service_factory.cc
+++ b/services/ws/test_ws/test_window_service_factory.cc
@@ -16,16 +16,17 @@
 std::unique_ptr<service_manager::Service> CreateInProcessWindowService(
     ui::ContextFactory* context_factory,
     ui::ContextFactoryPrivate* context_factory_private,
-    std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider) {
-  auto window_service = std::make_unique<TestWindowService>();
+    std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider,
+    service_manager::mojom::ServiceRequest request) {
+  auto window_service = std::make_unique<TestWindowService>(std::move(request));
   window_service->InitForInProcess(context_factory, context_factory_private,
                                    std::move(gpu_interface_provider));
   return window_service;
 }
 
-std::unique_ptr<service_manager::Service> CreateOutOfProcessWindowService() {
-  auto window_service = std::make_unique<TestWindowService>();
-  return window_service;
+std::unique_ptr<service_manager::Service> CreateOutOfProcessWindowService(
+    service_manager::mojom::ServiceRequest request) {
+  return std::make_unique<TestWindowService>(std::move(request));
 }
 
 }  // namespace test
diff --git a/services/ws/test_ws/test_window_service_factory.h b/services/ws/test_ws/test_window_service_factory.h
index 553ce98..b3990e2 100644
--- a/services/ws/test_ws/test_window_service_factory.h
+++ b/services/ws/test_ws/test_window_service_factory.h
@@ -7,6 +7,8 @@
 
 #include <memory>
 
+#include "services/service_manager/public/mojom/service.mojom.h"
+
 namespace service_manager {
 class Service;
 }  // namespace service_manager
@@ -26,9 +28,11 @@
 std::unique_ptr<service_manager::Service> CreateInProcessWindowService(
     ui::ContextFactory* context_factory,
     ui::ContextFactoryPrivate* context_factory_private,
-    std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider);
+    std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider,
+    service_manager::mojom::ServiceRequest request);
 
-std::unique_ptr<service_manager::Service> CreateOutOfProcessWindowService();
+std::unique_ptr<service_manager::Service> CreateOutOfProcessWindowService(
+    service_manager::mojom::ServiceRequest request);
 
 }  // namespace test
 }  // namespace ws
diff --git a/services/ws/test_ws/test_ws.cc b/services/ws/test_ws/test_ws.cc
index fa7186b..5bd7ae3 100644
--- a/services/ws/test_ws/test_ws.cc
+++ b/services/ws/test_ws/test_ws.cc
@@ -3,18 +3,14 @@
 // found in the LICENSE file.
 
 #include "base/message_loop/message_loop.h"
-#include "services/service_manager/public/c/main.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/standalone_service/service_main.h"
 #include "services/ws/test_ws/test_window_service_factory.h"
 #include "ui/base/ui_base_paths.h"
 
-MojoResult ServiceMain(MojoHandle service_request_handle) {
+void ServiceMain(service_manager::mojom::ServiceRequest request) {
   ui::RegisterPathProvider();
-
-  // |runner| takes ownership of the created test_ws service.
-  service_manager::ServiceRunner runner(
-      ws::test::CreateOutOfProcessWindowService().release());
-  runner.set_message_loop_type(base::MessageLoop::TYPE_UI);
-  return runner.Run(service_request_handle);
+  base::MessageLoop message_loop(base::MessageLoop::TYPE_UI);
+  auto service = ws::test::CreateOutOfProcessWindowService(std::move(request));
+  service->RunUntilTermination();
 }
diff --git a/services/ws/window_service.cc b/services/ws/window_service.cc
index 9d295f96..cd036a85 100644
--- a/services/ws/window_service.cc
+++ b/services/ws/window_service.cc
@@ -79,6 +79,12 @@
   DCHECK(window_trees_.empty());
 }
 
+void WindowService::BindServiceRequest(
+    service_manager::mojom::ServiceRequest request) {
+  DCHECK(!service_binding_.is_bound());
+  service_binding_.Bind(std::move(request));
+}
+
 ServerWindow* WindowService::GetServerWindowForWindowCreateIfNecessary(
     aura::Window* window) {
   ServerWindow* server_window = ServerWindow::GetMayBeNull(window);
diff --git a/services/ws/window_service.h b/services/ws/window_service.h
index ee13bb5..c147b07 100644
--- a/services/ws/window_service.h
+++ b/services/ws/window_service.h
@@ -16,6 +16,8 @@
 #include "base/observer_list.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
+#include "services/service_manager/public/cpp/service_binding.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "services/ws/ids.h"
 #include "services/ws/ime/ime_driver_bridge.h"
 #include "services/ws/ime/ime_registrar_impl.h"
@@ -87,6 +89,10 @@
                 aura::Env* env = nullptr);
   ~WindowService() override;
 
+  // Binds this WindowService instance to a ServiceRequest from the Service
+  // Manger.
+  void BindServiceRequest(service_manager::mojom::ServiceRequest request);
+
   // Gets the ServerWindow for |window|, creating if necessary.
   ServerWindow* GetServerWindowForWindowCreateIfNecessary(aura::Window* window);
 
@@ -219,6 +225,8 @@
 
   aura::Env* env_;
 
+  service_manager::ServiceBinding service_binding_{this};
+
   // GpuInterfaceProvider may be null in tests.
   std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider_;
 
diff --git a/services/ws/window_service_unittest.cc b/services/ws/window_service_unittest.cc
index 84dde5b..619d2cf0 100644
--- a/services/ws/window_service_unittest.cc
+++ b/services/ws/window_service_unittest.cc
@@ -36,19 +36,16 @@
 
   // Create another WindowService.
   TestWindowServiceDelegate test_window_service_delegate;
-  std::unique_ptr<WindowService> window_service_ptr =
-      std::make_unique<WindowService>(&test_window_service_delegate, nullptr,
-                                      test_setup.focus_controller());
-  WindowService* window_service = window_service_ptr.get();
-  std::unique_ptr<service_manager::TestConnectorFactory> factory =
-      service_manager::TestConnectorFactory::CreateForUniqueService(
-          std::move(window_service_ptr));
-  std::unique_ptr<service_manager::Connector> connector =
-      factory->CreateConnector();
+  WindowService window_service(&test_window_service_delegate, nullptr,
+                               test_setup.focus_controller());
+  service_manager::TestConnectorFactory factory;
+  window_service.BindServiceRequest(
+      factory.RegisterInstance(mojom::kServiceName));
 
   // Connect to |window_service| and ask for a new WindowTree.
   mojom::WindowTreeFactoryPtr window_tree_factory;
-  connector->BindInterface(mojom::kServiceName, &window_tree_factory);
+  factory.GetDefaultConnector()->BindInterface(mojom::kServiceName,
+                                               &window_tree_factory);
   mojom::WindowTreePtr window_tree;
   mojom::WindowTreeClientPtr client;
   mojom::WindowTreeClientRequest client_request = MakeRequest(&client);
@@ -59,7 +56,7 @@
   window_tree_factory.FlushForTesting();
 
   // There should be at least one WindowTree.
-  EXPECT_FALSE(window_service->window_trees().empty());
+  EXPECT_FALSE(window_service.window_trees().empty());
 
   // Destroying the |window_service| should remove all the WindowTrees and
   // ensure a DCHECK isn't hit in ~WindowTree.
@@ -116,18 +113,16 @@
 
   // Create another WindowService.
   TestWindowServiceDelegateWithInterface test_window_service_delegate;
-  std::unique_ptr<WindowService> window_service_ptr =
-      std::make_unique<WindowService>(&test_window_service_delegate, nullptr,
-                                      test_setup.focus_controller());
-  std::unique_ptr<service_manager::TestConnectorFactory> factory =
-      service_manager::TestConnectorFactory::CreateForUniqueService(
-          std::move(window_service_ptr));
-  std::unique_ptr<service_manager::Connector> connector =
-      factory->CreateConnector();
+  WindowService window_service(&test_window_service_delegate, nullptr,
+                               test_setup.focus_controller());
+  service_manager::TestConnectorFactory factory;
+  window_service.BindServiceRequest(
+      factory.RegisterInstance(mojom::kServiceName));
 
   // Connect to |window_service| and ask for a new WindowTree.
   mojom::WindowTreeFactoryPtr window_tree_factory;
-  connector->BindInterface(mojom::kServiceName, &window_tree_factory);
+  factory.GetDefaultConnector()->BindInterface(mojom::kServiceName,
+                                               &window_tree_factory);
   mojom::WindowTreePtr window_tree;
   mojom::WindowTreeClientPtr client;
   mojom::WindowTreeClientRequest client_request = MakeRequest(&client);
diff --git a/styleguide/python/python.md b/styleguide/python/python.md
index 0f30b544..f6cde0e 100644
--- a/styleguide/python/python.md
+++ b/styleguide/python/python.md
@@ -33,18 +33,18 @@
 ### pylint
 [Depot tools](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools.html)
 contains a local copy of pylint, appropriately configured.
- * Directories need to opt into pylint presumbit checks via:
+* Directories need to opt into pylint presumbit checks via:
    `input_api.canned_checks.RunPylint()`.
 
 ### YAPF
-[YAPF](https://github.com/google/yapf) is a Python formatter that can be used via:
+[YAPF](https://github.com/google/yapf) is the Python formatter used by:
 
 ```sh
 git cl format --python
 ```
 
-Directories can opt into enforcing YAPF styling by adding `.style.yapf` file
-with the following contents:
+Directories can opt into enforcing auto-formatting by adding a `.style.yapf`
+file with the following contents:
 ```
 [style]
 based_on_style = chromium
@@ -53,4 +53,11 @@
 Entire files can be formatted (rather than just touched lines) via:
 ```sh
 git cl format --python --full
-```
\ No newline at end of file
+```
+
+#### Bugs
+* Are tracked here: https://github.com/google/yapf/issues.
+* For Chromium-specific bugs, please discuss on `python@chromium.org`.
+
+#### Editor Integration
+See: https://github.com/google/yapf/tree/master/plugins
\ No newline at end of file
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index c0a6ac0..a9e59e09 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -7455,10 +7455,6 @@
     ],
     "scripts": [
       {
-        "name": "check_static_initializers",
-        "script": "check_static_initializers.py"
-      },
-      {
         "name": "checkdeps",
         "script": "checkdeps.py"
       },
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index a48afaf..1ed49b4c 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -6839,6 +6839,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6821",
+              "os": "Mac-10.14",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "expiration": 21600,
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -7296,6 +7315,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:0a2e",
+              "os": "Mac-10.14",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "expiration": 21600,
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -7753,6 +7791,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:0fe9",
+              "os": "Mac-10.14",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "expiration": 21600,
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -8185,6 +8242,23 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:0a2e",
+              "os": "Mac-10.12.6"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -8580,6 +8654,24 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:0a2e",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -9007,6 +9099,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -9453,6 +9564,26 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:0fe9",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "expiration": 21600,
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -9924,6 +10055,29 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:0a2e",
+              "os": "Mac-10.12.6"
+            },
+            {
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -10414,6 +10568,23 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:0a2e",
+              "os": "Mac-10.12.6"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -10816,6 +10987,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -11225,6 +11415,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:0fe9",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -11655,6 +11864,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -12112,6 +12340,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:0fe9",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -12691,6 +12938,25 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:679e",
+              "os": "Mac-10.12",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "expiration": 21600,
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -13385,6 +13651,23 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:0a2e",
+              "os": "Mac-10.12.6"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -13516,6 +13799,25 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6821",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -13659,6 +13961,25 @@
       },
       {
         "args": [
+          "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:0fe9",
+              "hidpi": "1",
+              "os": "Mac-10.13.6",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -13829,6 +14150,24 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-24.20.100.6286",
+              "os": "Windows-10",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
         "name": "gl_tests_passthrough",
@@ -14232,6 +14571,33 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-23.21.13.8816",
+              "os": "Windows-10",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests",
+        "trigger_script": {
+          "args": [
+            "--multiple-trigger-configs",
+            "[{\"gpu\": \"10de:1cb3-23.21.13.8816\", \"os\": \"Windows-10\", \"pool\": \"Chrome-GPU\"}]",
+            "--multiple-dimension-script-verbose",
+            "True"
+          ],
+          "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py"
+        }
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=passthrough"
         ],
         "name": "gl_tests_passthrough",
@@ -14855,6 +15221,24 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-23.21.13.8816",
+              "os": "Windows-10",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -15535,6 +15919,24 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-24.20.100.6286",
+              "os": "Windows-10",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -16274,6 +16676,24 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-24.21.14.1195",
+              "os": "Windows-10",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -17090,6 +17510,24 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-24.20.100.6286",
+              "os": "Windows-10",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
@@ -17883,6 +18321,33 @@
       {
         "args": [
           "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:1cb3-23.21.13.8816",
+              "os": "Windows-10",
+              "pool": "Chrome-GPU"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "dawn_end2end_tests",
+        "trigger_script": {
+          "args": [
+            "--multiple-trigger-configs",
+            "[{\"gpu\": \"10de:1cb3-23.21.13.8816\", \"os\": \"Windows-10\", \"pool\": \"Chrome-GPU\"}]",
+            "--multiple-dimension-script-verbose",
+            "True"
+          ],
+          "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py"
+        }
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
         "swarming": {
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json
index a3663052..6e0d956 100644
--- a/testing/buildbot/chromium.gpu.json
+++ b/testing/buildbot/chromium.gpu.json
@@ -1542,18 +1542,6 @@
           "shards": 2
         }
       }
-    ],
-    "scripts": [
-      {
-        "name": "check_static_initializers",
-        "script": "check_static_initializers.py",
-        "swarming": {}
-      },
-      {
-        "name": "webkit_lint",
-        "script": "webkit_lint.py",
-        "swarming": {}
-      }
     ]
   },
   "Mac Retina Debug (AMD)": {
@@ -2229,18 +2217,6 @@
           "shards": 2
         }
       }
-    ],
-    "scripts": [
-      {
-        "name": "check_static_initializers",
-        "script": "check_static_initializers.py",
-        "swarming": {}
-      },
-      {
-        "name": "webkit_lint",
-        "script": "webkit_lint.py",
-        "swarming": {}
-      }
     ]
   },
   "Win10 Debug (NVIDIA)": {
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 0a04936..d6100c1b 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -1649,10 +1649,6 @@
     ],
     "scripts": [
       {
-        "name": "check_static_initializers",
-        "script": "check_static_initializers.py"
-      },
-      {
         "name": "checkdeps",
         "script": "checkdeps.py"
       },
@@ -4286,10 +4282,6 @@
     ],
     "scripts": [
       {
-        "name": "check_static_initializers",
-        "script": "check_static_initializers.py"
-      },
-      {
         "name": "checkdeps",
         "script": "checkdeps.py"
       },
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 1b71beac..92a5095 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -4532,11 +4532,6 @@
     ],
     "scripts": [
       {
-        "name": "check_static_initializers",
-        "script": "check_static_initializers.py",
-        "swarming": {}
-      },
-      {
         "name": "webkit_lint",
         "script": "webkit_lint.py",
         "swarming": {}
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter b/testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter
index b0f54f6a..6c2a419 100644
--- a/testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter
+++ b/testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter
@@ -37,9 +37,6 @@
 -TestAsNormalAndGuestUser/SpokenFeedbackTest.OverviewMode/0
 -TestAsNormalAndGuestUser/SpokenFeedbackTest.OverviewMode/1
 
-# TabDragging: crbug.com/890071
--TabDragging/DetachToBrowserTabDragControllerTest.DetachToOwnWindowWhileInImmersiveFullscreenMode/1
-
 # This test is flaky. https://crbug.com/897879
 -ExtensionApiTest.DisplayModeWindowIsInFullscreen
 
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index cfcc3be..7875773 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -67,9 +67,6 @@
 # The optional "script" field is used when "type" == "script", and
 # specifies the GN path to the corresponding python file, e.g.
 # "//testing/scripts/foo.py".
-#
-# The optional "skip_usage_check" field indicates that we should skip the check
-# that the target is used in at least one buildbot json file.
 
 {
   "All_syzygy": {
@@ -924,16 +921,6 @@
       "../../tools/metrics/metrics_python_tests.py"
     ]
   },
-  "nacl_helper": {
-    "label": "//components/nacl/loader:nacl_helper",
-    "type": "additional_compile_target",
-    "skip_usage_check": True,
-  },
-  "nacl_helper_bootstrap": {
-    "label": "//native_client/src/trusted/service_runtime/linux:bootstrap",
-    "type": "additional_compile_target",
-    "skip_usage_check": True,
-  },
   "nacl_helper_nonsfi_unittests": {
     "label": "//components/nacl/loader:nacl_helper_nonsfi_unittests",
     "type": "raw",
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py
index e22e539..a0a7e0b 100755
--- a/testing/buildbot/manage.py
+++ b/testing/buildbot/manage.py
@@ -450,10 +450,8 @@
                           ninja_targets, ninja_targets_seen):
         result = 1
 
-    skip_targets = [k for k, v in gn_isolate_map.items() if
-                    ('skip_usage_check' in v and v['skip_usage_check'])]
-    extra_targets = (set(ninja_targets) - set(skip_targets) -
-                     ninja_targets_seen - SKIP_GN_ISOLATE_MAP_TARGETS)
+    extra_targets = (set(ninja_targets) - ninja_targets_seen -
+                     SKIP_GN_ISOLATE_MAP_TARGETS)
     if extra_targets:
       if len(extra_targets) > 1:
         extra_targets_str = ', '.join(extra_targets) + ' are'
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 66407a4f..04d387f5 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -699,27 +699,15 @@
       'checkperms': {
         'script': 'checkperms.py',
       },
-      'check_static_initializers': {
-        'script': 'check_static_initializers.py',
-      },
       'webkit_lint': {
         'script': 'webkit_lint.py',
-      },
-    },
-
-    'chromium_mac_scripts': {
-      'check_static_initializers': {
-        'script': 'check_static_initializers.py',
-      },
-      'webkit_lint': {
-        'script': 'webkit_lint.py',
-      },
+      }
     },
 
     'chromium_scripts': {
       'webkit_lint': {
         'script': 'webkit_lint.py',
-      },
+      }
     },
 
     'chromium_swarm_android_gtests': {
@@ -2841,6 +2829,7 @@
       'gpu_angle_end2end_tests',
       'gpu_angle_unittests',
       'gpu_common_gtests',
+      'gpu_dawn_end2end_tests',
       'gpu_fyi_and_optional_non_linux_gtests',
       'gpu_fyi_desktop_specific_gtests',
       'gpu_fyi_mac_specific_gtests',
@@ -2848,6 +2837,7 @@
 
     'gpu_fyi_mac_optional_gtests': [
       'gpu_angle_end2end_tests',
+      'gpu_dawn_end2end_tests',
       'gpu_fyi_and_optional_non_linux_gtests',
       'gpu_fyi_desktop_specific_gtests',
       'gpu_fyi_mac_specific_gtests',
@@ -2857,6 +2847,7 @@
       'gpu_angle_end2end_tests',
       'gpu_angle_unittests',
       'gpu_common_gtests',
+      'gpu_dawn_end2end_tests',
       'gpu_desktop_specific_gtests',
       'gpu_fyi_and_optional_non_linux_gtests',
       'gpu_fyi_desktop_specific_gtests',
@@ -2936,6 +2927,7 @@
       'gpu_angle_unittests',
       'gpu_angle_white_box_tests',
       'gpu_common_gtests',
+      'gpu_dawn_end2end_tests',
       'gpu_default_and_optional_win_specific_gtests',
       'gpu_desktop_specific_gtests',
       'gpu_fyi_and_optional_non_linux_gtests',
@@ -2947,6 +2939,7 @@
     'gpu_fyi_win_optional_gtests': [
       'gpu_angle_end2end_tests',
       'gpu_angle_white_box_tests',
+      'gpu_dawn_end2end_tests',
       'gpu_default_and_optional_win_specific_gtests',
       'gpu_fyi_and_optional_non_linux_gtests',
       'gpu_fyi_and_optional_win_specific_gtests',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 09b5e3e..2ab590cd 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1801,7 +1801,6 @@
         'test_suites': {
           'gtest_tests': 'gpu_desktop_gtests',
           'gpu_telemetry_tests': 'gpu_common_telemetry_tests',
-          'scripts': 'chromium_mac_scripts',
         },
       },
       'Mac Retina Debug (AMD)': {
@@ -1824,7 +1823,6 @@
         'test_suites': {
           'gtest_tests': 'gpu_desktop_gtests',
           'gpu_telemetry_tests': 'gpu_common_telemetry_tests',
-          'scripts': 'chromium_mac_scripts',
         },
       },
       'Win10 Debug (NVIDIA)': {
@@ -2726,7 +2724,7 @@
           'win7_amd_r7_240',
         ],
         'test_suites': {
-          'gtest_tests': 'gpu_fyi_win_gtests',
+          'gtest_tests': 'gpu_fyi_win7_gtests',
           'gpu_telemetry_tests': 'gpu_fyi_win_debug_telemetry_tests',
         },
       },
@@ -2737,7 +2735,7 @@
           'win7_amd_r7_240',
         ],
         'test_suites': {
-          'gtest_tests': 'gpu_fyi_win_gtests',
+          'gtest_tests': 'gpu_fyi_win7_gtests',
           'gpu_telemetry_tests': 'gpu_fyi_win_amd_telemetry_tests',
         },
       },
@@ -3060,7 +3058,7 @@
         'test_suites': {
           'gtest_tests': 'chromium_mac_gtests',
           'isolated_scripts': 'chromium_rel_isolated_scripts',
-          'scripts': 'chromium_mac_scripts',
+          'scripts': 'chromium_scripts',
         },
       },
       'Mac10.13 Tests (dbg)': {
diff --git a/testing/scripts/check_static_initializers.py b/testing/scripts/check_static_initializers.py
deleted file mode 100755
index dad0364..0000000
--- a/testing/scripts/check_static_initializers.py
+++ /dev/null
@@ -1,192 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-import os
-import re
-import subprocess
-import sys
-
-import common
-
-# If something adds a static initializer, revert it, don't increase these
-# numbers. We don't accept regressions in static initializers.
-#
-# Note: Counts for chrome and nacl_helper are one higher in branded builds
-# compared to release builds.  This is due to a static initializer in
-# WelsThreadPool.cpp (https://crbug.com/893594).
-EXPECTED_LINUX_SI_COUNTS = {
-    'chrome': 5,
-    'nacl_helper': 5,
-    'nacl_helper_bootstrap': 0,
-}
-
-EXPECTED_MAC_SI_COUNT = 1  # https://crbug.com/893594
-
-
-def run_process(command):
-  p = subprocess.Popen(command, stdout=subprocess.PIPE)
-  stdout = p.communicate()[0]
-  if p.returncode != 0:
-    raise Exception(
-        'ERROR from command "%s": %d' % (' '.join(command), p.returncode))
-  return stdout
-
-
-def main_mac(src_dir):
-  base_names = ('Chromium', 'Google Chrome')
-  ret = 0
-  for base_name in base_names:
-    app_bundle = base_name + '.app'
-    framework_name = base_name + ' Framework'
-    framework_bundle = framework_name + '.framework'
-    framework_dsym_bundle = framework_bundle + '.dSYM'
-    framework_unstripped_name = framework_name + '.unstripped'
-    chromium_executable = os.path.join(app_bundle, 'Contents', 'MacOS',
-                                       base_name)
-    chromium_framework_executable = os.path.join(framework_bundle,
-                                                 framework_name)
-    chromium_framework_dsym = os.path.join(framework_dsym_bundle, 'Contents',
-                                           'Resources', 'DWARF', framework_name)
-    if os.path.exists(chromium_executable):
-      # Count the number of files with at least one static initializer.
-      si_count = 0
-      # Find the __DATA,__mod_init_func section.
-      stdout = run_process(['otool', '-l', chromium_framework_executable])
-      section_index = stdout.find('sectname __mod_init_func')
-      if section_index != -1:
-        # If the section exists, the "size" line must follow it.
-        initializers_s = re.search('size 0x([0-9a-f]+)',
-                                   stdout[section_index:]).group(1)
-        word_size = 8  # Assume 64 bit
-        si_count = int(initializers_s, 16) / word_size
-
-      # Print the list of static initializers.
-      if si_count > EXPECTED_MAC_SI_COUNT:
-        print('Expected <= %d static initializers in %s, but found %d' %
-              (EXPECTED_MAC_SI_COUNT, chromium_framework_executable, si_count))
-        ret = 1
-
-        # First look for a dSYM to get information about the initializers. If
-        # one is not present, check if there is an unstripped copy of the build
-        # output.
-        mac_tools_path = os.path.join(src_dir, 'tools', 'mac')
-        if os.path.exists(chromium_framework_dsym):
-          dump_static_initializers = os.path.join(
-              mac_tools_path, 'dump-static-initializers.py')
-          stdout = run_process(
-              [dump_static_initializers, chromium_framework_dsym])
-          print stdout
-        else:
-          show_mod_init_func = os.path.join(mac_tools_path,
-                                            'show_mod_init_func.py')
-          args = [show_mod_init_func]
-          if os.path.exists(framework_unstripped_name):
-            args.append(framework_unstripped_name)
-          else:
-            print '# Warning: Falling back to potentially stripped output.'
-            args.append(chromium_framework_executable)
-          stdout = run_process(args)
-          print stdout
-  return ret
-
-
-def main_linux(src_dir):
-
-  def get_elf_section_size(readelf_stdout, section_name):
-    # Matches: .ctors PROGBITS 000000000516add0 5169dd0 000010 00 WA 0 0 8
-    match = re.search(r'\.%s.*$' % re.escape(section_name), readelf_stdout,
-                      re.MULTILINE)
-    if not match:
-      return (False, -1)
-    size_str = re.split(r'\W+', match.group(0))[5]
-    return (True, int(size_str, 16))
-
-  def get_word_size(binary_name):
-    stdout = run_process(['readelf', '-h', binary_name])
-    elf_class_line = re.search('Class:.*$', stdout, re.MULTILINE).group(0)
-    elf_class = re.split(r'\W+', elf_class_line)[1]
-    if elf_class == 'ELF32':
-      return 4
-    elif elf_class == 'ELF64':
-      return 8
-    raise Exception('Unsupported architecture')
-
-  ret = 0
-  for binary_name in EXPECTED_LINUX_SI_COUNTS:
-    if not os.path.exists(binary_name):
-      continue
-    # NOTE: this is very implementation-specific and makes assumptions
-    # about how compiler and linker implement global static initializers.
-    si_count = 0
-    stdout = run_process(['readelf', '-SW', binary_name])
-    has_init_array, init_array_size = get_elf_section_size(stdout, 'init_array')
-    if has_init_array:
-      si_count = init_array_size / get_word_size(binary_name)
-      # In newer versions of gcc crtbegin.o inserts frame_dummy into .init_array
-      # but we don't want to count this entry, since its always present and not
-      # related to our code.
-      stdout = run_process(['objdump', '-t', binary_name, '-j' '.init_array'])
-      if '__frame_dummy_init_array_entry' in stdout:
-        si_count -= 1
-
-    # Print the list of static initializers.
-    if (binary_name in EXPECTED_LINUX_SI_COUNTS and
-        si_count > EXPECTED_LINUX_SI_COUNTS[binary_name]):
-      print('Expected <= %d static initializers in %s, but found %d' %
-            (EXPECTED_LINUX_SI_COUNTS[binary_name], binary_name, si_count))
-      ret = 1
-    if si_count > 0:
-      dump_static_initializers = os.path.join(src_dir, 'tools', 'linux',
-                                              'dump-static-initializers.py')
-      stdout = run_process([dump_static_initializers, '-d', binary_name])
-      print '\n# Static initializers in %s:' % binary_name
-      print stdout
-  return ret
-
-
-def main_run(args):
-  if args.build_config_fs != 'Release':
-    raise Exception('Only release builds are supported')
-
-  src_dir = args.paths['checkout']
-  build_dir = os.path.join(src_dir, 'out', args.build_config_fs)
-  os.chdir(build_dir)
-
-  if sys.platform.startswith('darwin'):
-    rc = main_mac(src_dir)
-  elif sys.platform == 'linux2':
-    rc = main_linux(src_dir)
-  else:
-    sys.stderr.write('Unsupported platform %s.\n' % repr(sys.platform))
-    return 2
-
-  json.dump({
-      'valid': rc == 0,
-      'failures': [],
-  }, args.output)
-
-  return rc
-
-
-def main_compile_targets(args):
-  if sys.platform.startswith('darwin'):
-    compile_targets = ['chrome']
-  elif sys.platform == 'linux2':
-    compile_targets = ['chrome', 'nacl_helper', 'nacl_helper_bootstrap']
-  else:
-    compile_targets = []
-
-  json.dump(compile_targets, args.output)
-
-  return 0
-
-
-if __name__ == '__main__':
-  funcs = {
-      'run': main_run,
-      'compile_targets': main_compile_targets,
-  }
-  sys.exit(common.run_script(sys.argv[1:], funcs))
diff --git a/testing/scripts/sizes.py b/testing/scripts/sizes.py
index 7e81602..04d264c 100755
--- a/testing/scripts/sizes.py
+++ b/testing/scripts/sizes.py
@@ -8,8 +8,10 @@
 import os
 import sys
 
+
 import common
 
+
 PERF_DASHBOARD_URL = 'https://chromeperf.appspot.com'
 
 
@@ -26,30 +28,33 @@
   parser.add_argument('prefix')
   args = parser.parse_args(script_args.args)
 
-  runtest_args = [
-      '--test-type',
-      'sizes',
+  with common.temporary_file() as tempfile_path:
+    runtest_args = [
+      '--test-type', 'sizes',
       '--run-python-script',
-  ]
-  if args.perf_id:
-    runtest_args.extend([
-        '--perf-id',
-        args.perf_id,
-        '--results-url=%s' % args.results_url,
-        '--perf-dashboard-id=sizes',
-        '--annotate=graphing',
-    ])
-  sizes_cmd = [
-      os.path.join(common.SRC_DIR, 'infra', 'scripts', 'legacy', 'scripts',
-                   'slave', 'chromium', 'sizes.py')
-  ]
-  if args.platform:
-    sizes_cmd.extend(['--platform', args.platform])
-  rc = common.run_runtest(script_args, runtest_args + sizes_cmd)
+    ]
+    if args.perf_id:
+      runtest_args.extend([
+          '--perf-id', args.perf_id,
+          '--results-url=%s' % args.results_url,
+          '--perf-dashboard-id=sizes',
+          '--annotate=graphing',
+      ])
+    sizes_cmd = [
+        os.path.join(
+            common.SRC_DIR, 'infra', 'scripts', 'legacy', 'scripts', 'slave',
+            'chromium', 'sizes.py'),
+        '--failures', tempfile_path
+    ]
+    if args.platform:
+      sizes_cmd.extend(['--platform', args.platform])
+    rc = common.run_runtest(script_args, runtest_args + sizes_cmd)
+    with open(tempfile_path) as f:
+      failures = json.load(f)
 
   json.dump({
-      'valid': rc == 0,
-      'failures': [],
+      'valid': (rc == 0 or rc == 125),
+      'failures': failures,
   }, script_args.output)
 
   return rc
@@ -60,16 +65,17 @@
   args = parser.parse_args(script_args.args)
 
   _COMPILE_TARGETS = {
-      'android-cronet': ['cronet'],
-      'android-webview': ['libwebviewchromium'],
+    'android-cronet': ['cronet'],
+    'android-webview': ['libwebviewchromium'],
   }
 
-  json.dump(_COMPILE_TARGETS.get(args.platform, ['chrome']), script_args.output)
+  json.dump(_COMPILE_TARGETS.get(args.platform, ['chrome']),
+            script_args.output)
 
 
 if __name__ == '__main__':
   funcs = {
-      'run': main_run,
-      'compile_targets': main_compile_targets,
+    'run': main_run,
+    'compile_targets': main_compile_targets,
   }
   sys.exit(common.run_script(sys.argv[1:], funcs))
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 66cef11..ad51f9a 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4341,6 +4341,7 @@
                 "android",
                 "chromeos",
                 "linux",
+                "mac",
                 "windows"
             ],
             "experiments": [
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 516058e0..7ec9519 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -655,9 +655,7 @@
     "platform/modules/background_sync/background_sync.mojom",
     "platform/modules/badging/badging.mojom",
     "platform/modules/bluetooth/web_bluetooth.mojom",
-    "platform/modules/cache_storage/cache_storage.mojom",
     "platform/modules/credentialmanager/credential_manager.mojom",
-    "platform/modules/fetch/fetch_api_request.mojom",
     "platform/modules/geolocation/geolocation_service.mojom",
     "platform/modules/hyphenation/hyphenation.mojom",
     "platform/modules/insecure_input/insecure_input_service.mojom",
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 6533549..f9bcb9de0 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -16,6 +16,7 @@
     "blob/blob_url_store.mojom",
     "blob/data_element.mojom",
     "blob/serialized_blob.mojom",
+    "cache_storage/cache_storage.mojom",
     "choosers/file_chooser.mojom",
     "clipboard/clipboard.mojom",
     "color_chooser/color_chooser.mojom",
@@ -25,6 +26,7 @@
     "dom_storage/storage_area.mojom",
     "dom_storage/storage_partition_service.mojom",
     "feature_policy/feature_policy.mojom",
+    "fetch/fetch_api_request.mojom",
     "fetch/fetch_api_response.mojom",
     "file/file_utilities.mojom",
     "filesystem/file_system.mojom",
@@ -126,9 +128,10 @@
 # typemapped to a type in renderer/core. This also means these interfaces are
 # not available from renderer/platform.
 # Note that service_worker_object.mojom and service_worker.mojom depend
-# on transferable_message.mojom, and service_worker_registration.mojom depends
-# on service_worker_object.mojom, so we put these three service worker
-# mojom files here rather than mojom_platform target.
+# on transferable_message.mojom, and controller_service_worker.mojom and
+# service_worker_registration.mojom depend on service_worker_object.mojom, so
+# we put these service worker mojom files here rather than mojom_platform
+# target.
 # In future we may have a separate mojom target for the things that may have
 # modules dependencies if it looks necessary, at that time we can put all of
 # those high-level service worker mojom files there.
@@ -138,6 +141,7 @@
     "messaging/transferable_message.mojom",
     "messaging/user_activation_snapshot.mojom",
     "portal/portal.mojom",
+    "service_worker/controller_service_worker.mojom",
     "service_worker/service_worker.mojom",
     "service_worker/service_worker_object.mojom",
     "service_worker/service_worker_registration.mojom",
diff --git a/third_party/blink/public/platform/modules/cache_storage/OWNERS b/third_party/blink/public/mojom/cache_storage/OWNERS
similarity index 100%
rename from third_party/blink/public/platform/modules/cache_storage/OWNERS
rename to third_party/blink/public/mojom/cache_storage/OWNERS
diff --git a/third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom b/third_party/blink/public/mojom/cache_storage/cache_storage.mojom
similarity index 97%
rename from third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom
rename to third_party/blink/public/mojom/cache_storage/cache_storage.mojom
index 1b439980..09b0d31 100644
--- a/third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom
+++ b/third_party/blink/public/mojom/cache_storage/cache_storage.mojom
@@ -5,7 +5,7 @@
 module blink.mojom;
 
 import "third_party/blink/public/mojom/fetch/fetch_api_response.mojom";
-import "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom";
+import "third_party/blink/public/mojom/fetch/fetch_api_request.mojom";
 import "mojo/public/mojom/base/string16.mojom";
 
 // This enum is used in histograms, so do not change the ordering and always
diff --git a/third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom b/third_party/blink/public/mojom/fetch/fetch_api_request.mojom
similarity index 100%
rename from third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom
rename to third_party/blink/public/mojom/fetch/fetch_api_request.mojom
diff --git a/content/common/service_worker/controller_service_worker.mojom b/third_party/blink/public/mojom/service_worker/controller_service_worker.mojom
similarity index 96%
rename from content/common/service_worker/controller_service_worker.mojom
rename to third_party/blink/public/mojom/service_worker/controller_service_worker.mojom
index 3c520d98..97f7d70 100644
--- a/content/common/service_worker/controller_service_worker.mojom
+++ b/third_party/blink/public/mojom/service_worker/controller_service_worker.mojom
@@ -2,9 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-module content.mojom;
+module blink.mojom;
 
-import "content/common/service_worker/service_worker.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "mojo/public/mojom/base/unguessable_token.mojom";
 import "services/network/public/mojom/url_loader.mojom";
@@ -12,7 +11,6 @@
 import "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom";
-import "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom";
 
 // S13nServiceWorker:
 // Represents a service worker that is a 'controller'.
diff --git a/third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom b/third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom
index 3e78d8b..90a4054 100644
--- a/third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom
+++ b/third_party/blink/public/platform/modules/background_fetch/background_fetch.mojom
@@ -5,8 +5,8 @@
 module blink.mojom;
 
 import "skia/public/interfaces/bitmap.mojom";
-import "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom";
-import "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom";
+import "third_party/blink/public/mojom/cache_storage/cache_storage.mojom";
+import "third_party/blink/public/mojom/fetch/fetch_api_request.mojom";
 import "third_party/blink/public/mojom/fetch/fetch_api_response.mojom";
 import "third_party/blink/public/mojom/manifest/manifest.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
diff --git a/third_party/blink/public/platform/modules/fetch/OWNERS b/third_party/blink/public/platform/modules/fetch/OWNERS
deleted file mode 100644
index 7a628a2..0000000
--- a/third_party/blink/public/platform/modules/fetch/OWNERS
+++ /dev/null
@@ -1,11 +0,0 @@
-hiroshige@chromium.org
-horo@chromium.org
-yhirano@chromium.org
-
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
-
-per-file *.typemap=set noparent
-per-file *.typemap=file://ipc/SECURITY_OWNERS
-
-# COMPONENT: Blink>Network>FetchAPI
diff --git a/third_party/blink/public/platform/modules/service_worker/web_service_worker_request.h b/third_party/blink/public/platform/modules/service_worker/web_service_worker_request.h
index dfa9130..e9723b4 100644
--- a/third_party/blink/public/platform/modules/service_worker/web_service_worker_request.h
+++ b/third_party/blink/public/platform/modules/service_worker/web_service_worker_request.h
@@ -8,7 +8,7 @@
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "services/network/public/mojom/referrer_policy.mojom-shared.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom-shared.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_private_ptr.h"
 #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/public/platform/modules/service_worker/web_service_worker_response.h b/third_party/blink/public/platform/modules/service_worker/web_service_worker_response.h
index 86575f2..094f6eb 100644
--- a/third_party/blink/public/platform/modules/service_worker/web_service_worker_response.h
+++ b/third_party/blink/public/platform/modules/service_worker/web_service_worker_response.h
@@ -8,8 +8,8 @@
 #include "base/time/time.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom-shared.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_private_ptr.h"
 #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/public/platform/web_document_subresource_filter.h b/third_party/blink/public/platform/web_document_subresource_filter.h
index 17d20f8..3d05f83 100644
--- a/third_party/blink/public/platform/web_document_subresource_filter.h
+++ b/third_party/blink/public/platform/web_document_subresource_filter.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_DOCUMENT_SUBRESOURCE_FILTER_H_
 #define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_DOCUMENT_SUBRESOURCE_FILTER_H_
 
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 
 namespace blink {
 
diff --git a/third_party/blink/public/platform/web_resource_timing_info.h b/third_party/blink/public/platform/web_resource_timing_info.h
index 84d7cd8..835372cb 100644
--- a/third_party/blink/public/platform/web_resource_timing_info.h
+++ b/third_party/blink/public/platform/web_resource_timing_info.h
@@ -17,7 +17,7 @@
 
 // The browser-side equivalent to this struct is content::ServerTimingInfo.
 // TODO(dcheng): Migrate this struct over to Mojo so it doesn't need to be
-// duplicated in //content and //third_party/WebKit.
+// duplicated in //content and //third_party/blink.
 struct WebServerTimingInfo {
   WebServerTimingInfo(const WebString& name,
                       double duration,
@@ -34,7 +34,7 @@
 // information about cross-process iframes for window.performance. The
 // browser-side equivalent to this struct is content::ResourceTimingInfo.
 // TODO(dcheng): Migrate this struct over to Mojo so it doesn't need to be
-// duplicated in //content and //third_party/WebKit.
+// duplicated in //content and //third_party/blink.
 struct WebResourceTimingInfo {
   // The name to associate with the performance entry. For iframes, this is
   // typically the initial URL of the iframe resource.
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index 4a0543d7..fb66156 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -155,10 +155,6 @@
   BLINK_PLATFORM_EXPORT static void EnableRemotePlaybackAPI(bool);
   BLINK_PLATFORM_EXPORT static void EnableRenderingPipelineThrottling(bool);
   BLINK_PLATFORM_EXPORT static void EnableResourceLoadScheduler(bool);
-  BLINK_PLATFORM_EXPORT static void EnableRestrictLazyFrameLoadingToDataSaver(
-      bool);
-  BLINK_PLATFORM_EXPORT static void EnableRestrictLazyImageLoadingToDataSaver(
-      bool);
   BLINK_PLATFORM_EXPORT static void EnableScriptedSpeechRecognition(bool);
   BLINK_PLATFORM_EXPORT static void EnableScriptedSpeechSynthesis(bool);
   BLINK_PLATFORM_EXPORT static void EnableScrollAnchorSerialization(bool);
diff --git a/third_party/blink/public/platform/web_url_load_timing.h b/third_party/blink/public/platform/web_url_load_timing.h
index 389a8c6f..5ac5a5d 100644
--- a/third_party/blink/public/platform/web_url_load_timing.h
+++ b/third_party/blink/public/platform/web_url_load_timing.h
@@ -45,7 +45,7 @@
 
 // The browser-side equivalent to this struct is content::ResourceLoadTiming.
 // TODO(dcheng): Migrate this struct over to Mojo so it doesn't need to be
-// duplicated in //content and //third_party/WebKit.
+// duplicated in //content and //third_party/blink.
 class WebURLLoadTiming {
  public:
   ~WebURLLoadTiming() { Reset(); }
diff --git a/third_party/blink/public/platform/web_url_request.h b/third_party/blink/public/platform/web_url_request.h
index c19a9450..9d9542d 100644
--- a/third_party/blink/public/platform/web_url_request.h
+++ b/third_party/blink/public/platform/web_url_request.h
@@ -36,7 +36,7 @@
 #include "base/time/time.h"
 #include "base/unguessable_token.h"
 #include "services/network/public/mojom/referrer_policy.mojom-shared.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_common.h"
 
 namespace network {
diff --git a/third_party/blink/public/platform/web_url_response.h b/third_party/blink/public/platform/web_url_response.h
index 7720863d..78fe0e5 100644
--- a/third_party/blink/public/platform/web_url_response.h
+++ b/third_party/blink/public/platform/web_url_response.h
@@ -37,7 +37,7 @@
 #include "net/cert/ct_policy_status.h"
 #include "net/http/http_response_info.h"
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_security_style.h"
 #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h
index 4b680e1b..b37009f 100644
--- a/third_party/blink/public/web/web_local_frame.h
+++ b/third_party/blink/public/web/web_local_frame.h
@@ -12,7 +12,7 @@
 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/public/platform/web_size.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding.cc b/third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding.cc
index f261dc2..a7907b1 100644
--- a/third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding.cc
+++ b/third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding.cc
@@ -44,14 +44,14 @@
 class CountUseForBindings : public ScriptFunction {
  public:
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) {
-    auto* self = new CountUseForBindings(script_state);
+    auto* self = MakeGarbageCollected<CountUseForBindings>(script_state);
     return self->BindToV8Function();
   }
 
- private:
   explicit CountUseForBindings(ScriptState* script_state)
       : ScriptFunction(script_state) {}
 
+ private:
   ScriptValue Call(ScriptValue value) override {
     String string_id;
     if (!value.ToString(string_id)) {
@@ -131,10 +131,12 @@
   };
 
   v8::Local<v8::Value> message_port = ObjectGet(global, "MessagePort");
+  v8::Local<v8::Value> dom_exception = ObjectGet(global, "DOMException");
 
-  // Some Worklets don't have MessagePort. In this case, serialization will
-  // be disabled.
-  if (message_port->IsUndefined())
+  // Most Worklets don't have MessagePort. In this case, serialization will
+  // fail. AudioWorklet has MessagePort but no DOMException, so it can't use
+  // serialization for now.
+  if (message_port->IsUndefined() || dom_exception->IsUndefined())
     return;
 
   v8::Local<v8::Value> event_target_prototype =
@@ -153,7 +155,6 @@
 
   Bind("MessageEvent_data_get", GetOwnPDGet(message_event_prototype, "data"));
 
-  v8::Local<v8::Value> dom_exception = ObjectGet(global, "DOMException");
   Bind("DOMException", dom_exception);
 
   v8::Local<v8::Value> dom_exception_prototype = GetPrototype(dom_exception);
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise.cc b/third_party/blink/renderer/bindings/core/v8/script_promise.cc
index f7ca42d..1182541 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise.cc
@@ -53,7 +53,18 @@
     if (promises.IsEmpty())
       return ScriptPromise::Cast(script_state,
                                  v8::Array::New(script_state->GetIsolate()));
-    return (new PromiseAllHandler(script_state, promises))->resolver_.Promise();
+    return (MakeGarbageCollected<PromiseAllHandler>(script_state, promises))
+        ->resolver_.Promise();
+  }
+
+  PromiseAllHandler(ScriptState* script_state, Vector<ScriptPromise> promises)
+      : number_of_pending_promises_(promises.size()), resolver_(script_state) {
+    DCHECK(!promises.IsEmpty());
+    values_.resize(promises.size());
+    for (wtf_size_t i = 0; i < promises.size(); ++i) {
+      promises[i].Then(CreateFulfillFunction(script_state, i),
+                       CreateRejectFunction(script_state));
+    }
   }
 
   virtual void Trace(blink::Visitor* visitor) {}
@@ -70,17 +81,11 @@
                                           ResolveType resolve_type,
                                           wtf_size_t index,
                                           PromiseAllHandler* handler) {
-      AdapterFunction* self =
-          new AdapterFunction(script_state, resolve_type, index, handler);
+      AdapterFunction* self = MakeGarbageCollected<AdapterFunction>(
+          script_state, resolve_type, index, handler);
       return self->BindToV8Function();
     }
 
-    void Trace(blink::Visitor* visitor) override {
-      visitor->Trace(handler_);
-      ScriptFunction::Trace(visitor);
-    }
-
-   private:
     AdapterFunction(ScriptState* script_state,
                     ResolveType resolve_type,
                     wtf_size_t index,
@@ -90,6 +95,12 @@
           index_(index),
           handler_(handler) {}
 
+    void Trace(blink::Visitor* visitor) override {
+      visitor->Trace(handler_);
+      ScriptFunction::Trace(visitor);
+    }
+
+   private:
     ScriptValue Call(ScriptValue value) override {
       if (resolve_type_ == kFulfilled)
         handler_->OnFulfilled(index_, value);
@@ -104,15 +115,6 @@
     Member<PromiseAllHandler> handler_;
   };
 
-  PromiseAllHandler(ScriptState* script_state, Vector<ScriptPromise> promises)
-      : number_of_pending_promises_(promises.size()), resolver_(script_state) {
-    DCHECK(!promises.IsEmpty());
-    values_.resize(promises.size());
-    for (wtf_size_t i = 0; i < promises.size(); ++i)
-      promises[i].Then(CreateFulfillFunction(script_state, i),
-                       CreateRejectFunction(script_state));
-  }
-
   v8::Local<v8::Function> CreateFulfillFunction(ScriptState* script_state,
                                                 wtf_size_t index) {
     return AdapterFunction::Create(script_state, AdapterFunction::kFulfilled,
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc
index 6081241..b1d7c67 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_property_test.cc
@@ -30,14 +30,14 @@
 class NotReached : public ScriptFunction {
  public:
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) {
-    NotReached* self = new NotReached(script_state);
+    NotReached* self = MakeGarbageCollected<NotReached>(script_state);
     return self->BindToV8Function();
   }
 
- private:
   explicit NotReached(ScriptState* script_state)
       : ScriptFunction(script_state) {}
 
+ private:
   ScriptValue Call(ScriptValue) override;
 };
 
@@ -51,16 +51,17 @@
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
                                                 ScriptValue& value,
                                                 size_t& call_count) {
-    StubFunction* self = new StubFunction(script_state, value, call_count);
+    StubFunction* self =
+        MakeGarbageCollected<StubFunction>(script_state, value, call_count);
     return self->BindToV8Function();
   }
 
- private:
   StubFunction(ScriptState* script_state,
                ScriptValue& value,
                size_t& call_count)
       : ScriptFunction(script_state), value_(value), call_count_(call_count) {}
 
+ private:
   ScriptValue Call(ScriptValue arg) override {
     value_ = arg;
     call_count_++;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc
index 2e5e2075..45a9cc0e 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver_test.cc
@@ -25,14 +25,15 @@
  public:
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
                                                 String* value) {
-    TestHelperFunction* self = new TestHelperFunction(script_state, value);
+    TestHelperFunction* self =
+        MakeGarbageCollected<TestHelperFunction>(script_state, value);
     return self->BindToV8Function();
   }
 
- private:
   TestHelperFunction(ScriptState* script_state, String* value)
       : ScriptFunction(script_state), value_(value) {}
 
+ private:
   ScriptValue Call(ScriptValue value) override {
     DCHECK(!value.IsEmpty());
     *value_ = ToCoreString(value.V8Value()
@@ -202,21 +203,19 @@
  public:
   static ScriptPromiseResolverKeepAlive* Create(ScriptState* script_state) {
     ScriptPromiseResolverKeepAlive* resolver =
-        new ScriptPromiseResolverKeepAlive(script_state);
+        MakeGarbageCollected<ScriptPromiseResolverKeepAlive>(script_state);
     resolver->PauseIfNeeded();
     return resolver;
   }
 
+  explicit ScriptPromiseResolverKeepAlive(ScriptState* script_state)
+      : ScriptPromiseResolver(script_state) {}
   ~ScriptPromiseResolverKeepAlive() override { destructor_calls_++; }
 
   static void Reset() { destructor_calls_ = 0; }
   static bool IsAlive() { return !destructor_calls_; }
 
   static int destructor_calls_;
-
- private:
-  explicit ScriptPromiseResolverKeepAlive(ScriptState* script_state)
-      : ScriptPromiseResolver(script_state) {}
 };
 
 int ScriptPromiseResolverKeepAlive::destructor_calls_ = 0;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
index 5192d0be..41cabd6 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_test.cc
@@ -52,14 +52,15 @@
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
                                                 ScriptValue* output) {
     FunctionForScriptPromiseTest* self =
-        new FunctionForScriptPromiseTest(script_state, output);
+        MakeGarbageCollected<FunctionForScriptPromiseTest>(script_state,
+                                                           output);
     return self->BindToV8Function();
   }
 
- private:
   FunctionForScriptPromiseTest(ScriptState* script_state, ScriptValue* output)
       : ScriptFunction(script_state), output_(output) {}
 
+ private:
   ScriptValue Call(ScriptValue value) override {
     DCHECK(!value.IsEmpty());
     *output_ = value;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
index dc00b6ab..e2bcccb 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
@@ -160,7 +160,8 @@
   // Test that we can successfully compile a streamed script.
   V8TestingScope scope;
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
 
   AppendData("function foo() {");
@@ -198,7 +199,8 @@
   // handle it gracefully.
   V8TestingScope scope;
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
   AppendData("function foo() {");
   AppendData("this is the part which will be a parse error");
@@ -237,7 +239,8 @@
   // while streaming is ongoing, and ScriptStreamer handles it gracefully.
   V8TestingScope scope;
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
   AppendData("function foo() {");
 
@@ -262,7 +265,8 @@
   // before streaming is started, and ScriptStreamer handles it gracefully.
   V8TestingScope scope;
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
 
   // In general, we cannot control what the background thread is doing
@@ -298,7 +302,8 @@
   // script is loaded.
   V8TestingScope scope;
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
   AppendData("function foo() {");
   AppendPadding();
@@ -327,7 +332,8 @@
   // loaded.
   V8TestingScope scope;
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
 
   // Finish the script without sending any data.
@@ -346,7 +352,8 @@
   ScriptStreamer::SetSmallScriptThresholdForTesting(100);
 
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
 
   AppendData("function foo() { }");
@@ -368,7 +375,8 @@
   ScriptStreamer::SetSmallScriptThresholdForTesting(100);
 
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
 
   // This is the first data chunk which is small.
@@ -405,7 +413,8 @@
   GetResource()->SetEncodingForTest("windows-1252");
 
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
 
   GetResource()->SetEncodingForTest("UTF-8");
@@ -444,7 +453,8 @@
   GetResource()->SetEncodingForTest("windows-1252");
 
   GetResource()->StartStreaming(loading_task_runner_);
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
 
   // \xef\xbb\xbf is the UTF-8 byte order mark. \xec\x92\x81 are the raw bytes
@@ -478,7 +488,8 @@
   V8TestingScope scope;
   GetResource()->StartStreaming(loading_task_runner_);
 
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
   EXPECT_FALSE(client->Finished());
 
@@ -492,7 +503,8 @@
   V8TestingScope scope;
   GetResource()->StartStreaming(loading_task_runner_);
 
-  TestPendingScriptClient* client = new TestPendingScriptClient;
+  TestPendingScriptClient* client =
+      MakeGarbageCollected<TestPendingScriptClient>();
   GetPendingScript()->WatchForLoad(client);
 
   // Kick the streaming off.
diff --git a/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc b/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc
index 15b9fe1..a2b65723 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc
@@ -226,7 +226,11 @@
 class HandleContainer
     : public blink::GarbageCollectedFinalized<HandleContainer> {
  public:
-  static HandleContainer* Create() { return new HandleContainer(); }
+  static HandleContainer* Create() {
+    return MakeGarbageCollected<HandleContainer>();
+  }
+
+  HandleContainer() = default;
   virtual ~HandleContainer() = default;
 
   void Trace(blink::Visitor* visitor) {
@@ -238,8 +242,6 @@
   }
 
  private:
-  HandleContainer() = default;
-
   TraceWrapperV8Reference<v8::String> handle_;
 };
 
@@ -413,7 +415,14 @@
  public:
   static Base* Create(DeathAwareScriptWrappable* wrapper_in_base,
                       DeathAwareScriptWrappable* wrapper_in_mixin) {
-    return new Base(wrapper_in_base, wrapper_in_mixin);
+    return MakeGarbageCollected<Base>(wrapper_in_base, wrapper_in_mixin);
+  }
+
+  Base(DeathAwareScriptWrappable* wrapper_in_base,
+       DeathAwareScriptWrappable* wrapper_in_mixin)
+      : Mixin(wrapper_in_mixin), wrapper_in_base_(wrapper_in_base) {
+    // Use field_;
+    field_ = 0;
   }
 
   void Trace(Visitor* visitor) override {
@@ -424,13 +433,6 @@
   const char* NameInHeapSnapshot() const override { return "HandleContainer"; }
 
  protected:
-  Base(DeathAwareScriptWrappable* wrapper_in_base,
-       DeathAwareScriptWrappable* wrapper_in_mixin)
-      : Mixin(wrapper_in_mixin), wrapper_in_base_(wrapper_in_base) {
-    // Use field_;
-    field_ = 0;
-  }
-
   DeathAwareScriptWrappable::Wrapper wrapper_in_base_;
 };
 
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h b/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h
index 3cbeb15..f65a8ad 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h
@@ -68,6 +68,7 @@
                                       // OffscreenCanvas. For OffscreenCanvas
                                       // transfer
   kReadableStreamTransferTag = 'r',   // index:uint32_t
+  kTransformStreamTransferTag = 'm',  // index:uint32_t
   kWritableStreamTransferTag = 'w',   // index:uint32_t
   kDOMPointTag = 'Q',                 // x:Double, y:Double, z:Double, w:Double
   kDOMPointReadOnlyTag = 'W',         // x:Double, y:Double, z:Double, w:Double
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc
index 0fbf601..78a579a 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc
@@ -49,11 +49,13 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_offscreen_canvas.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_shared_array_buffer.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_transform_stream.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_writable_stream.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
 #include "third_party/blink/renderer/core/messaging/message_port.h"
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
+#include "third_party/blink/renderer/core/streams/transform_stream.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_shared_array_buffer.h"
@@ -386,32 +388,76 @@
     ExceptionState& exception_state) {
   auto* execution_context = ExecutionContext::From(script_state);
   for (ReadableStream* readable_stream : readable_streams) {
-    mojo::MessagePipe pipe;
-    MessagePort* local_port = MessagePort::Create(*execution_context);
-    local_port->Entangle(std::move(pipe.handle0));
-    readable_stream->Serialize(script_state, local_port, exception_state);
+    TransferReadableStream(script_state, execution_context, readable_stream,
+                           exception_state);
     if (exception_state.HadException())
       return;
-    stream_channels_.push_back(MessagePortChannel(std::move(pipe.handle1)));
   }
 }
 
+void SerializedScriptValue::TransferReadableStream(
+    ScriptState* script_state,
+    ExecutionContext* execution_context,
+    ReadableStream* readable_stream,
+    ExceptionState& exception_state) {
+  MessagePort* local_port = AddStreamChannel(execution_context);
+  readable_stream->Serialize(script_state, local_port, exception_state);
+  if (exception_state.HadException())
+    return;
+}
+
 void SerializedScriptValue::TransferWritableStreams(
     ScriptState* script_state,
     const WritableStreamArray& writable_streams,
     ExceptionState& exception_state) {
   auto* execution_context = ExecutionContext::From(script_state);
   for (WritableStream* writable_stream : writable_streams) {
-    mojo::MessagePipe pipe;
-    MessagePort* local_port = MessagePort::Create(*execution_context);
-    local_port->Entangle(std::move(pipe.handle0));
-    writable_stream->Serialize(script_state, local_port, exception_state);
+    TransferWritableStream(script_state, execution_context, writable_stream,
+                           exception_state);
     if (exception_state.HadException())
       return;
-    stream_channels_.push_back(MessagePortChannel(std::move(pipe.handle1)));
   }
 }
 
+void SerializedScriptValue::TransferWritableStream(
+    ScriptState* script_state,
+    ExecutionContext* execution_context,
+    WritableStream* writable_stream,
+    ExceptionState& exception_state) {
+  MessagePort* local_port = AddStreamChannel(execution_context);
+  writable_stream->Serialize(script_state, local_port, exception_state);
+  if (exception_state.HadException())
+    return;
+}
+
+void SerializedScriptValue::TransferTransformStreams(
+    ScriptState* script_state,
+    const TransformStreamArray& transform_streams,
+    ExceptionState& exception_state) {
+  auto* execution_context = ExecutionContext::From(script_state);
+  for (TransformStream* transform_stream : transform_streams) {
+    TransferReadableStream(script_state, execution_context,
+                           transform_stream->Readable(), exception_state);
+    if (exception_state.HadException())
+      return;
+    TransferWritableStream(script_state, execution_context,
+                           transform_stream->Writable(), exception_state);
+    if (exception_state.HadException())
+      return;
+  }
+}
+
+// Creates an entangled pair of channels. Adds one end to |stream_channels_| as
+// a MessagePortChannel, and returns the other end as a MessagePort.
+MessagePort* SerializedScriptValue::AddStreamChannel(
+    ExecutionContext* execution_context) {
+  mojo::MessagePipe pipe;
+  MessagePort* local_port = MessagePort::Create(*execution_context);
+  local_port->Entangle(std::move(pipe.handle0));
+  stream_channels_.push_back(MessagePortChannel(std::move(pipe.handle1)));
+  return local_port;
+}
+
 void SerializedScriptValue::TransferArrayBuffers(
     v8::Isolate* isolate,
     const ArrayBufferArray& array_buffers,
@@ -592,6 +638,18 @@
         return false;
       }
       transferables.writable_streams.push_back(stream);
+    } else if (RuntimeEnabledFeatures::TransferableStreamsEnabled() &&
+               V8TransformStream::HasInstance(transferable_object, isolate)) {
+      TransformStream* stream = V8TransformStream::ToImpl(
+          v8::Local<v8::Object>::Cast(transferable_object));
+      if (transferables.transform_streams.Contains(stream)) {
+        exception_state.ThrowDOMException(
+            DOMExceptionCode::kDataCloneError,
+            "TransformStream at index " + String::Number(i) +
+                " is a duplicate of an earlier TransformStream.");
+        return false;
+      }
+      transferables.transform_streams.push_back(stream);
     } else {
       exception_state.ThrowTypeError("Value at index " + String::Number(i) +
                                      " does not have a transferable type.");
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
index eea42505..d9f7ca9 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
@@ -53,6 +53,8 @@
 class BlobDataHandle;
 class DOMSharedArrayBuffer;
 class ExceptionState;
+class ExecutionContext;
+class MessagePort;
 class ScriptValue;
 class SharedBuffer;
 class StaticBitmapImage;
@@ -295,9 +297,22 @@
   void TransferReadableStreams(ScriptState*,
                                const ReadableStreamArray&,
                                ExceptionState&);
+  void TransferReadableStream(ScriptState* script_state,
+                              ExecutionContext* execution_context,
+                              ReadableStream* readable_streams,
+                              ExceptionState& exception_state);
   void TransferWritableStreams(ScriptState*,
                                const WritableStreamArray&,
                                ExceptionState&);
+  void TransferWritableStream(ScriptState* script_state,
+                              ExecutionContext* execution_context,
+                              WritableStream* writable_streams,
+                              ExceptionState& exception_state);
+  void TransferTransformStreams(ScriptState*,
+                                const TransformStreamArray&,
+                                ExceptionState&);
+  MessagePort* AddStreamChannel(ExecutionContext*);
+
   void CloneSharedArrayBuffers(SharedArrayBufferArray&);
   DataBufferPtr data_buffer_;
   size_t data_buffer_size_ = 0;
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/transferables.h b/third_party/blink/renderer/bindings/core/v8/serialization/transferables.h
index 2408ccf..d1937e1 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/transferables.h
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/transferables.h
@@ -19,6 +19,7 @@
 class MojoHandle;
 class ReadableStream;
 class WritableStream;
+class TransformStream;
 
 using ArrayBufferArray = HeapVector<Member<DOMArrayBufferBase>>;
 using ImageBitmapArray = HeapVector<Member<ImageBitmap>>;
@@ -27,6 +28,7 @@
 using MojoHandleArray = HeapVector<Member<blink::MojoHandle>>;
 using ReadableStreamArray = HeapVector<Member<ReadableStream>>;
 using WritableStreamArray = HeapVector<Member<WritableStream>>;
+using TransformStreamArray = HeapVector<Member<TransformStream>>;
 
 class CORE_EXPORT Transferables final {
   STACK_ALLOCATED();
@@ -42,6 +44,7 @@
   MojoHandleArray mojo_handles;
   ReadableStreamArray readable_streams;
   WritableStreamArray writable_streams;
+  TransformStreamArray transform_streams;
 };
 
 // Along with extending |Transferables| to hold a new kind of transferable
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc
index bf2da93..6de2a68 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_deserializer.cc
@@ -26,6 +26,7 @@
 #include "third_party/blink/renderer/core/mojo/mojo_handle.h"
 #include "third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h"
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
+#include "third_party/blink/renderer/core/streams/transform_stream.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_shared_array_buffer.h"
@@ -536,6 +537,28 @@
           script_state_, (*transferred_stream_ports_)[index].Get(),
           exception_state);
     }
+    case kTransformStreamTransferTag: {
+      if (!RuntimeEnabledFeatures::TransferableStreamsEnabled())
+        return nullptr;
+      uint32_t index = 0;
+      if (!ReadUint32(&index) || !transferred_stream_ports_ ||
+          index + 1 >= transferred_stream_ports_->size()) {
+        return nullptr;
+      }
+      ReadableStream* readable = ReadableStream::Deserialize(
+          script_state_, (*transferred_stream_ports_)[index].Get(),
+          exception_state);
+      if (!readable)
+        return nullptr;
+
+      WritableStream* writable = WritableStream::Deserialize(
+          script_state_, (*transferred_stream_ports_)[index + 1].Get(),
+          exception_state);
+      if (!writable)
+        return nullptr;
+
+      return MakeGarbageCollected<TransformStream>(readable, writable);
+    }
     default:
       break;
   }
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc
index c37928d..7d54a41 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc
@@ -25,6 +25,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_shared_array_buffer.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_transform_stream.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_writable_stream.h"
 #include "third_party/blink/renderer/core/geometry/dom_matrix.h"
 #include "third_party/blink/renderer/core/geometry/dom_matrix_read_only.h"
@@ -36,6 +37,7 @@
 #include "third_party/blink/renderer/core/html/canvas/image_data.h"
 #include "third_party/blink/renderer/core/mojo/mojo_handle.h"
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
+#include "third_party/blink/renderer/core/streams/transform_stream.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer_base.h"
 #include "third_party/blink/renderer/platform/file_metadata.h"
@@ -170,6 +172,9 @@
       return;
 
     if (RuntimeEnabledFeatures::TransferableStreamsEnabled()) {
+      // Order matters here, because the order in which streams are added to the
+      // |stream_ports_| array must match the indexes which are calculated in
+      // WriteDOMObject().
       serialized_script_value_->TransferReadableStreams(
           script_state_, transferables_->readable_streams, exception_state);
       if (exception_state.HadException())
@@ -178,6 +183,10 @@
           script_state_, transferables_->writable_streams, exception_state);
       if (exception_state.HadException())
         return;
+      serialized_script_value_->TransferTransformStreams(
+          script_state_, transferables_->transform_streams, exception_state);
+      if (exception_state.HadException())
+        return;
     }
   }
 }
@@ -521,6 +530,41 @@
         static_cast<uint32_t>(index + transferables_->readable_streams.size()));
     return true;
   }
+  if (wrapper_type_info == &V8TransformStream::wrapper_type_info &&
+      RuntimeEnabledFeatures::TransferableStreamsEnabled()) {
+    TransformStream* stream = wrappable->ToImpl<TransformStream>();
+    size_t index = kNotFound;
+    if (transferables_)
+      index = transferables_->transform_streams.Find(stream);
+    if (index == kNotFound) {
+      exception_state.ThrowDOMException(DOMExceptionCode::kDataCloneError,
+                                        "A TransformStream could not be cloned "
+                                        "because it was not transferred.");
+      return false;
+    }
+    if (stream->Readable()
+            ->IsLocked(script_state_, exception_state)
+            .value_or(true) ||
+        stream->Writable()
+            ->IsLocked(script_state_, exception_state)
+            .value_or(true)) {
+      if (exception_state.HadException())
+        return false;
+      exception_state.ThrowDOMException(
+          DOMExceptionCode::kDataCloneError,
+          "A TransformStream could not be cloned because it was locked");
+      return false;
+    }
+    WriteTag(kTransformStreamTransferTag);
+    DCHECK(transferables_);
+    // TransformStreams use two ports each. The stored index is the index of the
+    // first one. The first TransformStream is stored in the array after all the
+    // ReadableStreams and WritableStreams.
+    WriteUint32(static_cast<uint32_t>(index * 2 +
+                                      transferables_->readable_streams.size() +
+                                      transferables_->writable_streams.size()));
+    return true;
+  }
   return false;
 }
 
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc
index e2df2fb..8060fde 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc
@@ -697,7 +697,7 @@
   }
   size_t length = buffer->ByteLength();
   buffer->CopyContents(storage, length);
-  result.SetSmall(storage, length);
+  result.SetSmall(storage, SafeCast<uint32_t>(length));
 }
 
 static ScriptState* ToScriptStateImpl(LocalFrame* frame,
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc b/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
index 0511190..7764514 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
@@ -222,9 +222,10 @@
   }
 
   FetchDataLoaderForWasmStreaming* loader =
-      new FetchDataLoaderForWasmStreaming(script_state, streaming);
-  response->BodyBuffer()->StartLoading(loader, new WasmDataLoaderClient(),
-                                       exception_state);
+      MakeGarbageCollected<FetchDataLoaderForWasmStreaming>(script_state,
+                                                            streaming);
+  response->BodyBuffer()->StartLoading(
+      loader, MakeGarbageCollected<WasmDataLoaderClient>(), exception_state);
 }
 
 }  // namespace
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
index 57d8c4a..4e984d0 100644
--- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
+++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules_test.cc
@@ -270,11 +270,12 @@
 
 template <typename T>
 class WebCryptoResultAdapter : public ScriptFunction {
- private:
+ public:
   WebCryptoResultAdapter(ScriptState* script_state,
                          base::RepeatingCallback<void(T)> function)
       : ScriptFunction(script_state), function_(std::move(function)) {}
 
+ private:
   ScriptValue Call(ScriptValue value) final {
     function_.Run(ConvertCryptoResult<T>(value));
     return ScriptValue::From(GetScriptState(), ToV8UndefinedGenerator());
@@ -291,9 +292,10 @@
                                   base::RepeatingCallback<void(T)> function) {
   CryptoResultImpl* result = CryptoResultImpl::Create(script_state);
   result->Promise().Then(
-      (new WebCryptoResultAdapter<T>(script_state, std::move(function)))
+      (MakeGarbageCollected<WebCryptoResultAdapter<T>>(script_state,
+                                                       std::move(function)))
           ->BindToV8Function(),
-      (new WebCryptoResultAdapter<DOMException*>(
+      (MakeGarbageCollected<WebCryptoResultAdapter<DOMException*>>(
            script_state, WTF::BindRepeating([](DOMException* exception) {
              CHECK(false) << "crypto operation failed";
            })))
diff --git a/third_party/blink/renderer/bindings/templates/callback_function.h.tmpl b/third_party/blink/renderer/bindings/templates/callback_function.h.tmpl
index bb739787b..0e27d98 100644
--- a/third_party/blink/renderer/bindings/templates/callback_function.h.tmpl
+++ b/third_party/blink/renderer/bindings/templates/callback_function.h.tmpl
@@ -72,6 +72,8 @@
   using V8CallbackFunction = {{cpp_class}};
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -83,9 +85,6 @@
 {% endif %}
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/templates/callback_interface.h.tmpl b/third_party/blink/renderer/bindings/templates/callback_interface.h.tmpl
index 2fdb7be87..4763cb1 100644
--- a/third_party/blink/renderer/bindings/templates/callback_interface.h.tmpl
+++ b/third_party/blink/renderer/bindings/templates/callback_interface.h.tmpl
@@ -79,6 +79,8 @@
   using V8CallbackInterface = {{v8_class}};
 
  public:
+  explicit V8PersistentCallbackInterface(V8CallbackInterface* callback_interface)
+      : V8PersistentCallbackInterfaceBase(callback_interface) {}
   ~V8PersistentCallbackInterface() override = default;
 
 {% for method in methods %}
@@ -89,9 +91,6 @@
 {% endif %}
 
  private:
-  explicit V8PersistentCallbackInterface(V8CallbackInterface* callback_interface)
-      : V8PersistentCallbackInterfaceBase(callback_interface) {}
-
   V8CallbackInterface* Proxy() {
     return As<V8CallbackInterface>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_any_callback_function_optional_any_arg.h b/third_party/blink/renderer/bindings/tests/results/core/v8_any_callback_function_optional_any_arg.h
index fbfcb20..0dfba63 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_any_callback_function_optional_any_arg.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_any_callback_function_optional_any_arg.h
@@ -46,6 +46,8 @@
   using V8CallbackFunction = V8AnyCallbackFunctionOptionalAnyArg;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -54,9 +56,6 @@
   v8::Maybe<ScriptValue> Invoke(ScriptWrappable* callback_this_value, ScriptValue optionalAnyArg) WARN_UNUSED_RESULT;
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_any_callback_function_variadic_any_args.h b/third_party/blink/renderer/bindings/tests/results/core/v8_any_callback_function_variadic_any_args.h
index 3a99bdef..0f24626 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_any_callback_function_variadic_any_args.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_any_callback_function_variadic_any_args.h
@@ -46,6 +46,8 @@
   using V8CallbackFunction = V8AnyCallbackFunctionVariadicAnyArgs;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -54,9 +56,6 @@
   v8::Maybe<ScriptValue> Invoke(ScriptWrappable* callback_this_value, const Vector<ScriptValue>& arguments) WARN_UNUSED_RESULT;
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_long_callback_function.h b/third_party/blink/renderer/bindings/tests/results/core/v8_long_callback_function.h
index 38bb95a8..25d5c4eff 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_long_callback_function.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_long_callback_function.h
@@ -42,6 +42,8 @@
   using V8CallbackFunction = V8LongCallbackFunction;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -50,9 +52,6 @@
   v8::Maybe<int32_t> Invoke(ScriptWrappable* callback_this_value, int32_t num1, int32_t num2) WARN_UNUSED_RESULT;
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_string_sequence_callback_function_long_sequence_arg.h b/third_party/blink/renderer/bindings/tests/results/core/v8_string_sequence_callback_function_long_sequence_arg.h
index 527a27c..de77151 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_string_sequence_callback_function_long_sequence_arg.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_string_sequence_callback_function_long_sequence_arg.h
@@ -42,6 +42,8 @@
   using V8CallbackFunction = V8StringSequenceCallbackFunctionLongSequenceArg;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -50,9 +52,6 @@
   v8::Maybe<Vector<String>> Invoke(ScriptWrappable* callback_this_value, const Vector<int32_t>& arg) WARN_UNUSED_RESULT;
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_callback_interface.h b/third_party/blink/renderer/bindings/tests/results/core/v8_test_callback_interface.h
index 1041271..8408b70 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_callback_interface.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_callback_interface.h
@@ -78,6 +78,8 @@
   using V8CallbackInterface = V8TestCallbackInterface;
 
  public:
+  explicit V8PersistentCallbackInterface(V8CallbackInterface* callback_interface)
+      : V8PersistentCallbackInterfaceBase(callback_interface) {}
   ~V8PersistentCallbackInterface() override = default;
 
   CORE_EXPORT v8::Maybe<void> voidMethod(ScriptWrappable* callback_this_value) WARN_UNUSED_RESULT;
@@ -91,9 +93,6 @@
   CORE_EXPORT v8::Maybe<void> customVoidMethodTestInterfaceEmptyArg(ScriptWrappable* callback_this_value, TestInterfaceEmpty* testInterfaceEmptyArg) WARN_UNUSED_RESULT;
 
  private:
-  explicit V8PersistentCallbackInterface(V8CallbackInterface* callback_interface)
-      : V8PersistentCallbackInterfaceBase(callback_interface) {}
-
   V8CallbackInterface* Proxy() {
     return As<V8CallbackInterface>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_legacy_callback_interface.h b/third_party/blink/renderer/bindings/tests/results/core/v8_test_legacy_callback_interface.h
index b9fdaf9..823ca2d 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_legacy_callback_interface.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_legacy_callback_interface.h
@@ -54,14 +54,13 @@
   using V8CallbackInterface = V8TestLegacyCallbackInterface;
 
  public:
+  explicit V8PersistentCallbackInterface(V8CallbackInterface* callback_interface)
+      : V8PersistentCallbackInterfaceBase(callback_interface) {}
   ~V8PersistentCallbackInterface() override = default;
 
   CORE_EXPORT v8::Maybe<uint16_t> acceptNode(ScriptWrappable* callback_this_value, Node* node) WARN_UNUSED_RESULT;
 
  private:
-  explicit V8PersistentCallbackInterface(V8CallbackInterface* callback_interface)
-      : V8PersistentCallbackInterfaceBase(callback_interface) {}
-
   V8CallbackInterface* Proxy() {
     return As<V8CallbackInterface>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_treat_non_object_as_null_boolean_function.h b/third_party/blink/renderer/bindings/tests/results/core/v8_treat_non_object_as_null_boolean_function.h
index 5069eb09e..b7447de 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_treat_non_object_as_null_boolean_function.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_treat_non_object_as_null_boolean_function.h
@@ -42,6 +42,8 @@
   using V8CallbackFunction = V8TreatNonObjectAsNullBooleanFunction;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -50,9 +52,6 @@
   v8::Maybe<bool> Invoke(ScriptWrappable* callback_this_value) WARN_UNUSED_RESULT;
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_treat_non_object_as_null_void_function.h b/third_party/blink/renderer/bindings/tests/results/core/v8_treat_non_object_as_null_void_function.h
index fd82204..6328ae7c 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_treat_non_object_as_null_void_function.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_treat_non_object_as_null_void_function.h
@@ -46,6 +46,8 @@
   using V8CallbackFunction = V8TreatNonObjectAsNullVoidFunction;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -55,9 +57,6 @@
   CORE_EXPORT void InvokeAndReportException(ScriptWrappable* callback_this_value);
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function.h b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function.h
index 1036bb1..c282f17 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function.h
@@ -46,6 +46,8 @@
   using V8CallbackFunction = V8VoidCallbackFunction;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -55,9 +57,6 @@
   CORE_EXPORT void InvokeAndReportException(ScriptWrappable* callback_this_value);
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_dictionary_arg.h b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_dictionary_arg.h
index fb00a8bc..cdfa2b6 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_dictionary_arg.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_dictionary_arg.h
@@ -47,6 +47,8 @@
   using V8CallbackFunction = V8VoidCallbackFunctionDictionaryArg;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -56,9 +58,6 @@
   CORE_EXPORT void InvokeAndReportException(ScriptWrappable* callback_this_value, const TestDictionary*& arg);
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_enum_arg.h b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_enum_arg.h
index 1732e1ac..af3de796 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_enum_arg.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_enum_arg.h
@@ -46,6 +46,8 @@
   using V8CallbackFunction = V8VoidCallbackFunctionEnumArg;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -55,9 +57,6 @@
   CORE_EXPORT void InvokeAndReportException(ScriptWrappable* callback_this_value, const String& arg);
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_interface_arg.h b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_interface_arg.h
index ad5a31e..40b989c 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_interface_arg.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_interface_arg.h
@@ -47,6 +47,8 @@
   using V8CallbackFunction = V8VoidCallbackFunctionInterfaceArg;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -56,9 +58,6 @@
   CORE_EXPORT void InvokeAndReportException(ScriptWrappable* callback_this_value, HTMLDivElement* divElement);
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_test_interface_sequence_arg.h b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_test_interface_sequence_arg.h
index b8067d7..2602cc3 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_test_interface_sequence_arg.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_test_interface_sequence_arg.h
@@ -47,6 +47,8 @@
   using V8CallbackFunction = V8VoidCallbackFunctionTestInterfaceSequenceArg;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -56,9 +58,6 @@
   CORE_EXPORT void InvokeAndReportException(ScriptWrappable* callback_this_value, const HeapVector<Member<TestInterfaceImplementation>>& arg);
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_typedef.h b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_typedef.h
index d287c69..8aeaf9af 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_typedef.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_void_callback_function_typedef.h
@@ -46,6 +46,8 @@
   using V8CallbackFunction = V8VoidCallbackFunctionTypedef;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -55,9 +57,6 @@
   CORE_EXPORT void InvokeAndReportException(ScriptWrappable* callback_this_value, const String& arg);
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/bindings/tests/results/modules/v8_void_callback_function_modules.h b/third_party/blink/renderer/bindings/tests/results/modules/v8_void_callback_function_modules.h
index 8f7a6b2..7171e49 100644
--- a/third_party/blink/renderer/bindings/tests/results/modules/v8_void_callback_function_modules.h
+++ b/third_party/blink/renderer/bindings/tests/results/modules/v8_void_callback_function_modules.h
@@ -46,6 +46,8 @@
   using V8CallbackFunction = V8VoidCallbackFunctionModules;
 
  public:
+  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
+      : V8PersistentCallbackFunctionBase(callback_function) {}
   ~V8PersistentCallbackFunction() override = default;
 
   // Returns a wrapper-tracing version of this callback function.
@@ -55,9 +57,6 @@
   MODULES_EXPORT void InvokeAndReportException(ScriptWrappable* callback_this_value);
 
  private:
-  explicit V8PersistentCallbackFunction(V8CallbackFunction* callback_function)
-      : V8PersistentCallbackFunctionBase(callback_function) {}
-
   V8CallbackFunction* Proxy() {
     return As<V8CallbackFunction>();
   }
diff --git a/third_party/blink/renderer/core/animation/animatable/animatable_double.h b/third_party/blink/renderer/core/animation/animatable/animatable_double.h
index aba5ff0..d9c3799 100644
--- a/third_party/blink/renderer/core/animation/animatable/animatable_double.h
+++ b/third_party/blink/renderer/core/animation/animatable/animatable_double.h
@@ -38,10 +38,11 @@
 
 class CORE_EXPORT AnimatableDouble final : public AnimatableValue {
  public:
+  AnimatableDouble(double number) : number_(number) {}
   ~AnimatableDouble() override = default;
 
   static AnimatableDouble* Create(double number) {
-    return new AnimatableDouble(number);
+    return MakeGarbageCollected<AnimatableDouble>(number);
   }
 
   double ToDouble() const { return number_; }
@@ -51,7 +52,6 @@
                                  double fraction) const override;
 
  private:
-  AnimatableDouble(double number) : number_(number) {}
   AnimatableType GetType() const override { return kTypeDouble; }
 
   double number_;
diff --git a/third_party/blink/renderer/core/animation/animatable/animatable_filter_operations.h b/third_party/blink/renderer/core/animation/animatable/animatable_filter_operations.h
index 10814622..cdb0ab7 100644
--- a/third_party/blink/renderer/core/animation/animatable/animatable_filter_operations.h
+++ b/third_party/blink/renderer/core/animation/animatable/animatable_filter_operations.h
@@ -41,9 +41,11 @@
  public:
   static AnimatableFilterOperations* Create(
       const FilterOperations& operations) {
-    return new AnimatableFilterOperations(operations);
+    return MakeGarbageCollected<AnimatableFilterOperations>(operations);
   }
 
+  AnimatableFilterOperations(const FilterOperations& operations)
+      : operation_wrapper_(FilterOperationsWrapper::Create(operations)) {}
   ~AnimatableFilterOperations() override = default;
 
   const FilterOperations& Operations() const {
@@ -57,9 +59,6 @@
                                  double fraction) const override;
 
  private:
-  AnimatableFilterOperations(const FilterOperations& operations)
-      : operation_wrapper_(FilterOperationsWrapper::Create(operations)) {}
-
   AnimatableType GetType() const override { return kTypeFilterOperations; }
 
   Member<FilterOperationsWrapper> operation_wrapper_;
diff --git a/third_party/blink/renderer/core/animation/animatable/animatable_transform.h b/third_party/blink/renderer/core/animation/animatable/animatable_transform.h
index 10842bf4..817c57a 100644
--- a/third_party/blink/renderer/core/animation/animatable/animatable_transform.h
+++ b/third_party/blink/renderer/core/animation/animatable/animatable_transform.h
@@ -39,10 +39,14 @@
 
 class CORE_EXPORT AnimatableTransform final : public AnimatableValue {
  public:
+  explicit AnimatableTransform(const TransformOperations& transform,
+                               double zoom)
+      : transform_(transform), zoom_(zoom) {}
   ~AnimatableTransform() override = default;
+
   static AnimatableTransform* Create(const TransformOperations& transform,
                                      double zoom) {
-    return new AnimatableTransform(transform, zoom);
+    return MakeGarbageCollected<AnimatableTransform>(transform, zoom);
   }
   const TransformOperations& GetTransformOperations() const {
     return transform_;
@@ -54,9 +58,6 @@
                                  double fraction) const override;
 
  private:
-  explicit AnimatableTransform(const TransformOperations& transform,
-                               double zoom)
-      : transform_(transform), zoom_(zoom) {}
   AnimatableType GetType() const override { return kTypeTransform; }
 
   const TransformOperations transform_;
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index bab13ca..fcd2f5f 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -80,7 +80,7 @@
 
   DocumentTimeline* subtimeline = ToDocumentTimeline(timeline);
 
-  Animation* animation = new Animation(
+  Animation* animation = MakeGarbageCollected<Animation>(
       subtimeline->GetDocument()->ContextDocument(), *subtimeline, effect);
 
   if (subtimeline) {
@@ -1318,7 +1318,7 @@
 
 Animation::CompositorAnimationHolder*
 Animation::CompositorAnimationHolder::Create(Animation* animation) {
-  return new CompositorAnimationHolder(animation);
+  return MakeGarbageCollected<CompositorAnimationHolder>(animation);
 }
 
 Animation::CompositorAnimationHolder::CompositorAnimationHolder(
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h
index de4b824..c4a6db7c 100644
--- a/third_party/blink/renderer/core/animation/animation.h
+++ b/third_party/blink/renderer/core/animation/animation.h
@@ -93,6 +93,7 @@
                            AnimationTimeline*,
                            ExceptionState&);
 
+  Animation(ExecutionContext*, DocumentTimeline&, AnimationEffect*);
   ~Animation() override;
   void Dispose();
 
@@ -233,8 +234,6 @@
                           RegisteredEventListener&) override;
 
  private:
-  Animation(ExecutionContext*, DocumentTimeline&, AnimationEffect*);
-
   void ClearOutdated();
   void ForceServiceOnNextFrame();
 
@@ -356,6 +355,8 @@
    public:
     static CompositorAnimationHolder* Create(Animation*);
 
+    explicit CompositorAnimationHolder(Animation*);
+
     void Detach();
 
     void Trace(blink::Visitor* visitor) { visitor->Trace(animation_); }
@@ -365,8 +366,6 @@
     }
 
    private:
-    explicit CompositorAnimationHolder(Animation*);
-
     void Dispose();
 
     std::unique_ptr<CompositorAnimation> compositor_animation_;
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
index a8154a6..4b3488d 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -287,8 +287,17 @@
   class AnimatableMockStringKeyframe : public StringKeyframe {
    public:
     static StringKeyframe* Create(double offset) {
-      return new AnimatableMockStringKeyframe(offset);
+      return MakeGarbageCollected<AnimatableMockStringKeyframe>(offset);
     }
+
+    AnimatableMockStringKeyframe(double offset)
+        : StringKeyframe(),
+          property_specific_(
+              MakeGarbageCollected<
+                  AnimatableMockPropertySpecificStringKeyframe>(offset)) {
+      SetOffset(offset);
+    }
+
     Keyframe::PropertySpecificKeyframe* CreatePropertySpecificKeyframe(
         const PropertyHandle&,
         EffectModel::CompositeOperation,
@@ -347,12 +356,6 @@
     };
 
     Member<PropertySpecificKeyframe> property_specific_;
-    AnimatableMockStringKeyframe(double offset)
-        : StringKeyframe(),
-          property_specific_(
-              new AnimatableMockPropertySpecificStringKeyframe(offset)) {
-      SetOffset(offset);
-    }
   };
 
   StringKeyframe* CreateAnimatableReplaceKeyframe(CSSPropertyID id,
diff --git a/third_party/blink/renderer/core/animation/interpolation_effect.h b/third_party/blink/renderer/core/animation/interpolation_effect.h
index 1b261ec0..78cfee5 100644
--- a/third_party/blink/renderer/core/animation/interpolation_effect.h
+++ b/third_party/blink/renderer/core/animation/interpolation_effect.h
@@ -39,7 +39,7 @@
                         double end,
                         double apply_from,
                         double apply_to) {
-    interpolations_.push_back(new InterpolationRecord(
+    interpolations_.push_back(MakeGarbageCollected<InterpolationRecord>(
         interpolation, std::move(easing), start, end, apply_from, apply_to));
   }
 
diff --git a/third_party/blink/renderer/core/animation/interpolation_effect_test.cc b/third_party/blink/renderer/core/animation/interpolation_effect_test.cc
index 2c978b2..b7808c0 100644
--- a/third_party/blink/renderer/core/animation/interpolation_effect_test.cc
+++ b/third_party/blink/renderer/core/animation/interpolation_effect_test.cc
@@ -40,7 +40,7 @@
 
 TEST(AnimationInterpolationEffectTest, SingleInterpolation) {
   Persistent<InterpolationEffect> interpolation_effect =
-      new InterpolationEffect;
+      MakeGarbageCollected<InterpolationEffect>();
   interpolation_effect->AddInterpolation(
       CreateInterpolation(0, 10), scoped_refptr<TimingFunction>(), 0, 1, -1, 2);
 
@@ -71,7 +71,7 @@
 
 TEST(AnimationInterpolationEffectTest, MultipleInterpolations) {
   Persistent<InterpolationEffect> interpolation_effect =
-      new InterpolationEffect;
+      MakeGarbageCollected<InterpolationEffect>();
   interpolation_effect->AddInterpolation(
       CreateInterpolation(10, 15), scoped_refptr<TimingFunction>(), 1, 2, 1, 3);
   interpolation_effect->AddInterpolation(
diff --git a/third_party/blink/renderer/core/animation/invalidatable_interpolation.h b/third_party/blink/renderer/core/animation/invalidatable_interpolation.h
index 5f7fdc5..5c602516 100644
--- a/third_party/blink/renderer/core/animation/invalidatable_interpolation.h
+++ b/third_party/blink/renderer/core/animation/invalidatable_interpolation.h
@@ -35,10 +35,22 @@
       const PropertyHandle& property,
       PropertySpecificKeyframe* start_keyframe,
       PropertySpecificKeyframe* end_keyframe) {
-    return new InvalidatableInterpolation(property, start_keyframe,
-                                          end_keyframe);
+    return MakeGarbageCollected<InvalidatableInterpolation>(
+        property, start_keyframe, end_keyframe);
   }
 
+  InvalidatableInterpolation(const PropertyHandle& property,
+                             PropertySpecificKeyframe* start_keyframe,
+                             PropertySpecificKeyframe* end_keyframe)
+      : Interpolation(),
+        property_(property),
+        interpolation_types_(nullptr),
+        interpolation_types_version_(0),
+        start_keyframe_(start_keyframe),
+        end_keyframe_(end_keyframe),
+        current_fraction_(std::numeric_limits<double>::quiet_NaN()),
+        is_conversion_cached_(false) {}
+
   const PropertyHandle& GetProperty() const final { return property_; }
   void Interpolate(int iteration, double fraction) override;
   bool DependsOnUnderlyingValue() const final;
@@ -58,18 +70,6 @@
   }
 
  private:
-  InvalidatableInterpolation(const PropertyHandle& property,
-                             PropertySpecificKeyframe* start_keyframe,
-                             PropertySpecificKeyframe* end_keyframe)
-      : Interpolation(),
-        property_(property),
-        interpolation_types_(nullptr),
-        interpolation_types_version_(0),
-        start_keyframe_(start_keyframe),
-        end_keyframe_(end_keyframe),
-        current_fraction_(std::numeric_limits<double>::quiet_NaN()),
-        is_conversion_cached_(false) {}
-
   using ConversionCheckers = InterpolationType::ConversionCheckers;
 
   std::unique_ptr<TypedInterpolationValue> MaybeConvertUnderlyingValue(
diff --git a/third_party/blink/renderer/core/animation/keyframe.h b/third_party/blink/renderer/core/animation/keyframe.h
index 909a4b6..ccf93f6 100644
--- a/third_party/blink/renderer/core/animation/keyframe.h
+++ b/third_party/blink/renderer/core/animation/keyframe.h
@@ -120,6 +120,9 @@
   class CORE_EXPORT PropertySpecificKeyframe
       : public GarbageCollectedFinalized<PropertySpecificKeyframe> {
    public:
+    PropertySpecificKeyframe(double offset,
+                             scoped_refptr<TimingFunction> easing,
+                             EffectModel::CompositeOperation);
     virtual ~PropertySpecificKeyframe() = default;
     double Offset() const { return offset_; }
     TimingFunction& Easing() const { return *easing_; }
@@ -159,10 +162,6 @@
     virtual void Trace(Visitor*){};
 
    protected:
-    PropertySpecificKeyframe(double offset,
-                             scoped_refptr<TimingFunction> easing,
-                             EffectModel::CompositeOperation);
-
     double offset_;
     scoped_refptr<TimingFunction> easing_;
     EffectModel::CompositeOperation composite_;
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_model.cc b/third_party/blink/renderer/core/animation/keyframe_effect_model.cc
index 2c4e8d3..b291cf9 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect_model.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect_model.cc
@@ -325,9 +325,11 @@
       KeyframeGroupMap::iterator group_iter = keyframe_groups_->find(property);
       PropertySpecificKeyframeGroup* group;
       if (group_iter == keyframe_groups_->end()) {
-        group = keyframe_groups_
-                    ->insert(property, new PropertySpecificKeyframeGroup)
-                    .stored_value->value.Get();
+        group =
+            keyframe_groups_
+                ->insert(property,
+                         MakeGarbageCollected<PropertySpecificKeyframeGroup>())
+                .stored_value->value.Get();
       } else {
         group = group_iter->value.Get();
       }
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_model.h b/third_party/blink/renderer/core/animation/keyframe_effect_model.h
index 3fe078e..1d02dbd 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect_model.h
+++ b/third_party/blink/renderer/core/animation/keyframe_effect_model.h
@@ -153,7 +153,7 @@
  protected:
   KeyframeEffectModelBase(CompositeOperation composite,
                           scoped_refptr<TimingFunction> default_keyframe_easing)
-      : interpolation_effect_(new InterpolationEffect),
+      : interpolation_effect_(MakeGarbageCollected<InterpolationEffect>()),
         last_iteration_(0),
         last_fraction_(std::numeric_limits<double>::quiet_NaN()),
         last_iteration_duration_(AnimationTimeDelta()),
diff --git a/third_party/blink/renderer/core/animation/string_keyframe.cc b/third_party/blink/renderer/core/animation/string_keyframe.cc
index ff3c9c1..d696d00 100644
--- a/third_party/blink/renderer/core/animation/string_keyframe.cc
+++ b/third_party/blink/renderer/core/animation/string_keyframe.cc
@@ -141,7 +141,7 @@
 }
 
 Keyframe* StringKeyframe::Clone() const {
-  return new StringKeyframe(*this);
+  return MakeGarbageCollected<StringKeyframe>(*this);
 }
 
 Keyframe::PropertySpecificKeyframe*
diff --git a/third_party/blink/renderer/core/animation/string_keyframe.h b/third_party/blink/renderer/core/animation/string_keyframe.h
index d2b824f..b8847abae 100644
--- a/third_party/blink/renderer/core/animation/string_keyframe.h
+++ b/third_party/blink/renderer/core/animation/string_keyframe.h
@@ -27,7 +27,16 @@
 // expand shorthand properties; that is done for computed keyframes.
 class CORE_EXPORT StringKeyframe : public Keyframe {
  public:
-  static StringKeyframe* Create() { return new StringKeyframe; }
+  static StringKeyframe* Create() {
+    return MakeGarbageCollected<StringKeyframe>();
+  }
+
+  StringKeyframe()
+      : css_property_map_(
+            MutableCSSPropertyValueSet::Create(kHTMLStandardMode)),
+        presentation_attribute_map_(
+            MutableCSSPropertyValueSet::Create(kHTMLStandardMode)) {}
+  StringKeyframe(const StringKeyframe& copy_from);
 
   MutableCSSPropertyValueSet::SetResult SetCSSPropertyValue(
       const AtomicString& property_name,
@@ -88,10 +97,19 @@
         scoped_refptr<TimingFunction> easing,
         const CSSValue* value,
         EffectModel::CompositeOperation composite) {
-      return new CSSPropertySpecificKeyframe(offset, std::move(easing), value,
-                                             composite);
+      return MakeGarbageCollected<CSSPropertySpecificKeyframe>(
+          offset, std::move(easing), value, composite);
     }
 
+    CSSPropertySpecificKeyframe(double offset,
+                                scoped_refptr<TimingFunction> easing,
+                                const CSSValue* value,
+                                EffectModel::CompositeOperation composite)
+        : Keyframe::PropertySpecificKeyframe(offset,
+                                             std::move(easing),
+                                             composite),
+          value_(value) {}
+
     const CSSValue* Value() const { return value_.Get(); }
 
     bool PopulateAnimatableValue(const PropertyHandle&,
@@ -110,15 +128,6 @@
     void Trace(Visitor*) override;
 
    private:
-    CSSPropertySpecificKeyframe(double offset,
-                                scoped_refptr<TimingFunction> easing,
-                                const CSSValue* value,
-                                EffectModel::CompositeOperation composite)
-        : Keyframe::PropertySpecificKeyframe(offset,
-                                             std::move(easing),
-                                             composite),
-          value_(value) {}
-
     Keyframe::PropertySpecificKeyframe* CloneWithOffset(
         double offset) const override;
     bool IsCSSPropertySpecificKeyframe() const override { return true; }
@@ -135,10 +144,19 @@
         scoped_refptr<TimingFunction> easing,
         const String& value,
         EffectModel::CompositeOperation composite) {
-      return new SVGPropertySpecificKeyframe(offset, std::move(easing), value,
-                                             composite);
+      return MakeGarbageCollected<SVGPropertySpecificKeyframe>(
+          offset, std::move(easing), value, composite);
     }
 
+    SVGPropertySpecificKeyframe(double offset,
+                                scoped_refptr<TimingFunction> easing,
+                                const String& value,
+                                EffectModel::CompositeOperation composite)
+        : Keyframe::PropertySpecificKeyframe(offset,
+                                             std::move(easing),
+                                             composite),
+          value_(value) {}
+
     const String& Value() const { return value_; }
 
     PropertySpecificKeyframe* CloneWithOffset(double offset) const final;
@@ -151,30 +169,12 @@
         scoped_refptr<TimingFunction> easing) const final;
 
    private:
-    SVGPropertySpecificKeyframe(double offset,
-                                scoped_refptr<TimingFunction> easing,
-                                const String& value,
-                                EffectModel::CompositeOperation composite)
-        : Keyframe::PropertySpecificKeyframe(offset,
-                                             std::move(easing),
-                                             composite),
-          value_(value) {}
-
     bool IsSVGPropertySpecificKeyframe() const override { return true; }
 
     String value_;
   };
 
- protected:
-  StringKeyframe()
-      : css_property_map_(
-            MutableCSSPropertyValueSet::Create(kHTMLStandardMode)),
-        presentation_attribute_map_(
-            MutableCSSPropertyValueSet::Create(kHTMLStandardMode)) {}
-
  private:
-  StringKeyframe(const StringKeyframe& copy_from);
-
   Keyframe* Clone() const override;
   Keyframe::PropertySpecificKeyframe* CreatePropertySpecificKeyframe(
       const PropertyHandle&,
diff --git a/third_party/blink/renderer/core/animation/transition_interpolation.h b/third_party/blink/renderer/core/animation/transition_interpolation.h
index 2eba87a..2ebada4f 100644
--- a/third_party/blink/renderer/core/animation/transition_interpolation.h
+++ b/third_party/blink/renderer/core/animation/transition_interpolation.h
@@ -45,30 +45,11 @@
                                          InterpolationValue&& end,
                                          AnimatableValue* compositor_start,
                                          AnimatableValue* compositor_end) {
-    return new TransitionInterpolation(property, type, std::move(start),
-                                       std::move(end), compositor_start,
-                                       compositor_end);
+    return MakeGarbageCollected<TransitionInterpolation>(
+        property, type, std::move(start), std::move(end), compositor_start,
+        compositor_end);
   }
 
-  void Apply(StyleResolverState&) const;
-
-  bool IsTransitionInterpolation() const final { return true; }
-
-  const PropertyHandle& GetProperty() const final { return property_; }
-
-  std::unique_ptr<TypedInterpolationValue> GetInterpolatedValue() const;
-
-  AnimatableValue* GetInterpolatedCompositorValue() const;
-
-  void Interpolate(int iteration, double fraction) final;
-
-  void Trace(Visitor* visitor) override {
-    visitor->Trace(compositor_start_);
-    visitor->Trace(compositor_end_);
-    Interpolation::Trace(visitor);
-  }
-
- protected:
   TransitionInterpolation(const PropertyHandle& property,
                           const InterpolationType& type,
                           InterpolationValue&& start,
@@ -95,6 +76,24 @@
               property_.GetCSSProperty().IsCompositableProperty());
   }
 
+  void Apply(StyleResolverState&) const;
+
+  bool IsTransitionInterpolation() const final { return true; }
+
+  const PropertyHandle& GetProperty() const final { return property_; }
+
+  std::unique_ptr<TypedInterpolationValue> GetInterpolatedValue() const;
+
+  AnimatableValue* GetInterpolatedCompositorValue() const;
+
+  void Interpolate(int iteration, double fraction) final;
+
+  void Trace(Visitor* visitor) override {
+    visitor->Trace(compositor_start_);
+    visitor->Trace(compositor_end_);
+    Interpolation::Trace(visitor);
+  }
+
  private:
   const InterpolableValue& CurrentInterpolableValue() const;
   NonInterpolableValue* CurrentNonInterpolableValue() const;
diff --git a/third_party/blink/renderer/core/animation/transition_keyframe.h b/third_party/blink/renderer/core/animation/transition_keyframe.h
index 768bdf8..768f9a73 100644
--- a/third_party/blink/renderer/core/animation/transition_keyframe.h
+++ b/third_party/blink/renderer/core/animation/transition_keyframe.h
@@ -22,8 +22,16 @@
  public:
   static TransitionKeyframe* Create(const PropertyHandle& property) {
     DCHECK(!property.IsSVGAttribute());
-    return new TransitionKeyframe(property);
+    return MakeGarbageCollected<TransitionKeyframe>(property);
   }
+
+  TransitionKeyframe(const PropertyHandle& property) : property_(property) {}
+  TransitionKeyframe(const TransitionKeyframe& copy_from)
+      : Keyframe(copy_from.offset_, copy_from.composite_, copy_from.easing_),
+        property_(copy_from.property_),
+        value_(copy_from.value_->Clone()),
+        compositor_value_(copy_from.compositor_value_) {}
+
   void SetValue(std::unique_ptr<TypedInterpolationValue> value) {
     // Speculative CHECK to help investigate crbug.com/826627. The theory is
     // that |SetValue| is being called with a |value| that has no underlying
@@ -48,10 +56,22 @@
         EffectModel::CompositeOperation composite,
         std::unique_ptr<TypedInterpolationValue> value,
         AnimatableValue* compositor_value) {
-      return new PropertySpecificKeyframe(offset, std::move(easing), composite,
-                                          std::move(value), compositor_value);
+      return MakeGarbageCollected<PropertySpecificKeyframe>(
+          offset, std::move(easing), composite, std::move(value),
+          compositor_value);
     }
 
+    PropertySpecificKeyframe(double offset,
+                             scoped_refptr<TimingFunction> easing,
+                             EffectModel::CompositeOperation composite,
+                             std::unique_ptr<TypedInterpolationValue> value,
+                             AnimatableValue* compositor_value)
+        : Keyframe::PropertySpecificKeyframe(offset,
+                                             std::move(easing),
+                                             composite),
+          value_(std::move(value)),
+          compositor_value_(compositor_value) {}
+
     const AnimatableValue* GetAnimatableValue() const final {
       return compositor_value_;
     }
@@ -72,17 +92,6 @@
     void Trace(Visitor*) override;
 
    private:
-    PropertySpecificKeyframe(double offset,
-                             scoped_refptr<TimingFunction> easing,
-                             EffectModel::CompositeOperation composite,
-                             std::unique_ptr<TypedInterpolationValue> value,
-                             AnimatableValue* compositor_value)
-        : Keyframe::PropertySpecificKeyframe(offset,
-                                             std::move(easing),
-                                             composite),
-          value_(std::move(value)),
-          compositor_value_(compositor_value) {}
-
     Keyframe::PropertySpecificKeyframe* CloneWithOffset(
         double offset) const final {
       return Create(offset, easing_, composite_, value_->Clone(),
@@ -94,17 +103,11 @@
   };
 
  private:
-  TransitionKeyframe(const PropertyHandle& property) : property_(property) {}
-
-  TransitionKeyframe(const TransitionKeyframe& copy_from)
-      : Keyframe(copy_from.offset_, copy_from.composite_, copy_from.easing_),
-        property_(copy_from.property_),
-        value_(copy_from.value_->Clone()),
-        compositor_value_(copy_from.compositor_value_) {}
-
   bool IsTransitionKeyframe() const final { return true; }
 
-  Keyframe* Clone() const final { return new TransitionKeyframe(*this); }
+  Keyframe* Clone() const final {
+    return MakeGarbageCollected<TransitionKeyframe>(*this);
+  }
 
   Keyframe::PropertySpecificKeyframe* CreatePropertySpecificKeyframe(
       const PropertyHandle&,
diff --git a/third_party/blink/renderer/core/aom/accessible_node.cc b/third_party/blink/renderer/core/aom/accessible_node.cc
index b90ae77..d4b6f8a0 100644
--- a/third_party/blink/renderer/core/aom/accessible_node.cc
+++ b/third_party/blink/renderer/core/aom/accessible_node.cc
@@ -218,7 +218,7 @@
 
 // static
 AccessibleNode* AccessibleNode::Create(Document& document) {
-  return new AccessibleNode(document);
+  return MakeGarbageCollected<AccessibleNode>(document);
 }
 
 Document* AccessibleNode::GetDocument() const {
diff --git a/third_party/blink/renderer/core/aom/accessible_node_list.cc b/third_party/blink/renderer/core/aom/accessible_node_list.cc
index 87e0c61..602afc4 100644
--- a/third_party/blink/renderer/core/aom/accessible_node_list.cc
+++ b/third_party/blink/renderer/core/aom/accessible_node_list.cc
@@ -16,7 +16,7 @@
 // static
 AccessibleNodeList* AccessibleNodeList::Create(
     const HeapVector<Member<AccessibleNode>>& nodes) {
-  AccessibleNodeList* result = new AccessibleNodeList();
+  AccessibleNodeList* result = MakeGarbageCollected<AccessibleNodeList>();
   result->nodes_ = nodes;
   return result;
 }
diff --git a/third_party/blink/renderer/core/aom/computed_accessible_node.cc b/third_party/blink/renderer/core/aom/computed_accessible_node.cc
index fa71c7e..a2ece93 100644
--- a/third_party/blink/renderer/core/aom/computed_accessible_node.cc
+++ b/third_party/blink/renderer/core/aom/computed_accessible_node.cc
@@ -46,7 +46,8 @@
 ComputedAccessibleNodePromiseResolver*
 ComputedAccessibleNodePromiseResolver::Create(ScriptState* script_state,
                                               Element& element) {
-  return new ComputedAccessibleNodePromiseResolver(script_state, element);
+  return MakeGarbageCollected<ComputedAccessibleNodePromiseResolver>(
+      script_state, element);
 }
 
 ComputedAccessibleNodePromiseResolver::ComputedAccessibleNodePromiseResolver(
@@ -109,7 +110,7 @@
 ComputedAccessibleNode* ComputedAccessibleNode::Create(AXID ax_id,
                                                        WebComputedAXTree* tree,
                                                        LocalFrame* frame) {
-  return new ComputedAccessibleNode(ax_id, tree, frame);
+  return MakeGarbageCollected<ComputedAccessibleNode>(ax_id, tree, frame);
 }
 
 ComputedAccessibleNode::ComputedAccessibleNode(AXID ax_id,
diff --git a/third_party/blink/renderer/core/aom/computed_accessible_node.h b/third_party/blink/renderer/core/aom/computed_accessible_node.h
index d56b6725..bb415a1f 100644
--- a/third_party/blink/renderer/core/aom/computed_accessible_node.h
+++ b/third_party/blink/renderer/core/aom/computed_accessible_node.h
@@ -24,6 +24,8 @@
     : public GarbageCollectedFinalized<ComputedAccessibleNodePromiseResolver> {
  public:
   static ComputedAccessibleNodePromiseResolver* Create(ScriptState*, Element&);
+
+  ComputedAccessibleNodePromiseResolver(ScriptState*, Element&);
   ~ComputedAccessibleNodePromiseResolver() {}
 
   ScriptPromise Promise();
@@ -32,7 +34,6 @@
   void Trace(blink::Visitor*);
 
  private:
-  ComputedAccessibleNodePromiseResolver(ScriptState*, Element&);
   void UpdateTreeAndResolve();
   class RequestAnimationFrameCallback;
 
@@ -48,6 +49,8 @@
 
  public:
   static ComputedAccessibleNode* Create(AXID, WebComputedAXTree*, LocalFrame*);
+
+  ComputedAccessibleNode(AXID, WebComputedAXTree*, LocalFrame*);
   ~ComputedAccessibleNode() override;
 
   void Trace(Visitor*) override;
@@ -96,7 +99,6 @@
   ScriptPromise ensureUpToDate(ScriptState*);
 
  private:
-  ComputedAccessibleNode(AXID, WebComputedAXTree*, LocalFrame*);
   bool GetBoolAttribute(WebAOMBoolAttribute, bool& is_null) const;
   int32_t GetIntAttribute(WebAOMIntAttribute, bool& is_null) const;
   float GetFloatAttribute(WebAOMFloatAttribute, bool& is_null) const;
diff --git a/third_party/blink/renderer/core/context_features/context_feature_settings.cc b/third_party/blink/renderer/core/context_features/context_feature_settings.cc
index f4cb02012..48533e9 100644
--- a/third_party/blink/renderer/core/context_features/context_feature_settings.cc
+++ b/third_party/blink/renderer/core/context_features/context_feature_settings.cc
@@ -22,7 +22,7 @@
   ContextFeatureSettings* settings =
       Supplement<ExecutionContext>::From<ContextFeatureSettings>(context);
   if (!settings && creation_mode == CreationMode::kCreateIfNotExists) {
-    settings = new ContextFeatureSettings(*context);
+    settings = MakeGarbageCollected<ContextFeatureSettings>(*context);
     Supplement<ExecutionContext>::ProvideTo(*context, settings);
   }
   return settings;
diff --git a/third_party/blink/renderer/core/css/css_default_style_sheets.cc b/third_party/blink/renderer/core/css/css_default_style_sheets.cc
index 07a7419..2e12489 100644
--- a/third_party/blink/renderer/core/css/css_default_style_sheets.cc
+++ b/third_party/blink/renderer/core/css/css_default_style_sheets.cc
@@ -45,7 +45,8 @@
 
 CSSDefaultStyleSheets& CSSDefaultStyleSheets::Instance() {
   DEFINE_STATIC_LOCAL(Persistent<CSSDefaultStyleSheets>,
-                      css_default_style_sheets, (new CSSDefaultStyleSheets));
+                      css_default_style_sheets,
+                      (MakeGarbageCollected<CSSDefaultStyleSheets>()));
   return *css_default_style_sheets;
 }
 
diff --git a/third_party/blink/renderer/core/css/css_default_style_sheets.h b/third_party/blink/renderer/core/css/css_default_style_sheets.h
index 9bc119b..bc67b93 100644
--- a/third_party/blink/renderer/core/css/css_default_style_sheets.h
+++ b/third_party/blink/renderer/core/css/css_default_style_sheets.h
@@ -42,6 +42,8 @@
  public:
   CORE_EXPORT static CSSDefaultStyleSheets& Instance();
 
+  CSSDefaultStyleSheets();
+
   bool EnsureDefaultStyleSheetsForElement(const Element&);
   void EnsureDefaultStyleSheetForFullscreen();
 
@@ -86,7 +88,6 @@
   void Trace(blink::Visitor*);
 
  private:
-  CSSDefaultStyleSheets();
   void InitializeDefaultStyles();
 
   Member<RuleSet> default_style_;
diff --git a/third_party/blink/renderer/core/css/css_font_feature_values_rule.h b/third_party/blink/renderer/core/css/css_font_feature_values_rule.h
index a70caec..679fa25 100644
--- a/third_party/blink/renderer/core/css/css_font_feature_values_rule.h
+++ b/third_party/blink/renderer/core/css/css_font_feature_values_rule.h
@@ -18,9 +18,10 @@
  public:
   static CSSFontFeatureValuesRule* Create(StyleRuleFontFeatureValues* rule,
                                           CSSStyleSheet* sheet) {
-    return new CSSFontFeatureValuesRule(rule, sheet);
+    return MakeGarbageCollected<CSSFontFeatureValuesRule>(rule, sheet);
   }
 
+  CSSFontFeatureValuesRule(StyleRuleFontFeatureValues*, CSSStyleSheet* parent);
   ~CSSFontFeatureValuesRule() override;
 
   void setFontFamily(const String& font_family);
@@ -38,8 +39,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  CSSFontFeatureValuesRule(StyleRuleFontFeatureValues*, CSSStyleSheet* parent);
-
   CSSRule::Type type() const override { return kFontFeatureValuesRule; }
 
   Member<StyleRuleFontFeatureValues> font_feature_values_rule_;
diff --git a/third_party/blink/renderer/core/css/cssom/computed_style_property_map.h b/third_party/blink/renderer/core/css/cssom/computed_style_property_map.h
index 9fa239b..4c4a4cd1 100644
--- a/third_party/blink/renderer/core/css/cssom/computed_style_property_map.h
+++ b/third_party/blink/renderer/core/css/cssom/computed_style_property_map.h
@@ -26,9 +26,14 @@
     : public StylePropertyMapReadOnlyMainThread {
  public:
   static ComputedStylePropertyMap* Create(Node* node) {
-    return new ComputedStylePropertyMap(node);
+    return MakeGarbageCollected<ComputedStylePropertyMap>(node);
   }
 
+  ComputedStylePropertyMap(Node* node, const String& pseudo_element = String())
+      : StylePropertyMapReadOnlyMainThread(),
+        pseudo_id_(CSSSelector::ParsePseudoId(pseudo_element)),
+        node_(node) {}
+
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(node_);
     StylePropertyMapReadOnlyMainThread::Trace(visitor);
@@ -42,11 +47,6 @@
   static bool ComparePropertyNames(const String&, const String&);
 
  protected:
-  ComputedStylePropertyMap(Node* node, const String& pseudo_element = String())
-      : StylePropertyMapReadOnlyMainThread(),
-        pseudo_id_(CSSSelector::ParsePseudoId(pseudo_element)),
-        node_(node) {}
-
   const CSSValue* GetProperty(CSSPropertyID) override;
   const CSSValue* GetCustomProperty(AtomicString) override;
   void ForEachProperty(const IterationCallback&) override;
diff --git a/third_party/blink/renderer/core/css/cssom/css_resource_value_test.cc b/third_party/blink/renderer/core/css/cssom/css_resource_value_test.cc
index 8b0b935..d5decca 100644
--- a/third_party/blink/renderer/core/css/cssom/css_resource_value_test.cc
+++ b/third_party/blink/renderer/core/css/cssom/css_resource_value_test.cc
@@ -25,16 +25,26 @@
 }  // namespace
 
 TEST(CSSResourceValueTest, TestStatus) {
-  EXPECT_EQ((new FakeCSSResourceValue(ResourceStatus::kNotStarted))->state(),
-            "unloaded");
-  EXPECT_EQ((new FakeCSSResourceValue(ResourceStatus::kPending))->state(),
-            "loading");
-  EXPECT_EQ((new FakeCSSResourceValue(ResourceStatus::kCached))->state(),
-            "loaded");
-  EXPECT_EQ((new FakeCSSResourceValue(ResourceStatus::kLoadError))->state(),
-            "error");
-  EXPECT_EQ((new FakeCSSResourceValue(ResourceStatus::kDecodeError))->state(),
-            "error");
+  EXPECT_EQ(
+      (MakeGarbageCollected<FakeCSSResourceValue>(ResourceStatus::kNotStarted))
+          ->state(),
+      "unloaded");
+  EXPECT_EQ(
+      (MakeGarbageCollected<FakeCSSResourceValue>(ResourceStatus::kPending))
+          ->state(),
+      "loading");
+  EXPECT_EQ(
+      (MakeGarbageCollected<FakeCSSResourceValue>(ResourceStatus::kCached))
+          ->state(),
+      "loaded");
+  EXPECT_EQ(
+      (MakeGarbageCollected<FakeCSSResourceValue>(ResourceStatus::kLoadError))
+          ->state(),
+      "error");
+  EXPECT_EQ(
+      (MakeGarbageCollected<FakeCSSResourceValue>(ResourceStatus::kDecodeError))
+          ->state(),
+      "error");
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only_main_thread.cc b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only_main_thread.cc
index 3adb7f9..912b0c4 100644
--- a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only_main_thread.cc
+++ b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only_main_thread.cc
@@ -178,7 +178,7 @@
     result.emplace_back(property_name, std::move(values));
   });
 
-  return new StylePropertyMapIterationSource(result);
+  return MakeGarbageCollected<StylePropertyMapIterationSource>(result);
 }
 
 CSSStyleValue* StylePropertyMapReadOnlyMainThread::GetShorthandProperty(
diff --git a/third_party/blink/renderer/core/css/font_face.cc b/third_party/blink/renderer/core/css/font_face.cc
index 85cb342a..e51a1de 100644
--- a/third_party/blink/renderer/core/css/font_face.cc
+++ b/third_party/blink/renderer/core/css/font_face.cc
@@ -741,7 +741,8 @@
 
   scoped_refptr<SharedBuffer> buffer = SharedBuffer::Create(data, size);
   BinaryDataFontFaceSource* source =
-      new BinaryDataFontFaceSource(buffer.get(), ots_parse_message_);
+      MakeGarbageCollected<BinaryDataFontFaceSource>(buffer.get(),
+                                                     ots_parse_message_);
   if (source->IsValid())
     SetLoadStatus(kLoaded);
   else
diff --git a/third_party/blink/renderer/core/css/media_query_list_test.cc b/third_party/blink/renderer/core/css/media_query_list_test.cc
index 17c1226..a42e634 100644
--- a/third_party/blink/renderer/core/css/media_query_list_test.cc
+++ b/third_party/blink/renderer/core/css/media_query_list_test.cc
@@ -25,7 +25,7 @@
   Document* document = Document::CreateForTest();
   MediaQueryList* list = MediaQueryList::Create(
       document, MediaQueryMatcher::Create(*document), MediaQuerySet::Create());
-  list->AddListener(new TestListener());
+  list->AddListener(MakeGarbageCollected<TestListener>());
   list->ContextDestroyed(document);
   // This test passes if it's not crashed.
 }
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.cc b/third_party/blink/renderer/core/css/parser/css_parser.cc
index 9f354dd..35d92911 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser.cc
@@ -186,6 +186,14 @@
   return CSSParserImpl::ParseInlineStyleDeclaration(style_string, element);
 }
 
+ImmutableCSSPropertyValueSet* CSSParser::ParseInlineStyleDeclaration(
+    const String& style_string,
+    CSSParserMode parser_mode,
+    SecureContextMode secure_context_mode) {
+  return CSSParserImpl::ParseInlineStyleDeclaration(style_string, parser_mode,
+                                                    secure_context_mode);
+}
+
 std::unique_ptr<Vector<double>> CSSParser::ParseKeyframeKeyList(
     const String& key_list) {
   return CSSParserImpl::ParseKeyframeKeyList(key_list);
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.h b/third_party/blink/renderer/core/css/parser/css_parser.h
index 09c63756..e13bb6c 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser.h
+++ b/third_party/blink/renderer/core/css/parser/css_parser.h
@@ -88,6 +88,8 @@
   static ImmutableCSSPropertyValueSet* ParseInlineStyleDeclaration(
       const String&,
       Element*);
+  static ImmutableCSSPropertyValueSet*
+  ParseInlineStyleDeclaration(const String&, CSSParserMode, SecureContextMode);
 
   static std::unique_ptr<Vector<double>> ParseKeyframeKeyList(const String&);
   static StyleRuleKeyframe* ParseKeyframeRule(const CSSParserContext*,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
index 757017a..1f1d7f8 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -193,6 +193,19 @@
   return CreateCSSPropertyValueSet(parser.parsed_properties_, mode);
 }
 
+ImmutableCSSPropertyValueSet* CSSParserImpl::ParseInlineStyleDeclaration(
+    const String& string,
+    CSSParserMode parser_mode,
+    SecureContextMode secure_context_mode) {
+  CSSParserContext* context =
+      CSSParserContext::Create(parser_mode, secure_context_mode);
+  CSSParserImpl parser(context);
+  CSSTokenizer tokenizer(string);
+  CSSParserTokenStream stream(tokenizer);
+  parser.ConsumeDeclarationList(stream, StyleRule::kStyle);
+  return CreateCSSPropertyValueSet(parser.parsed_properties_, parser_mode);
+}
+
 bool CSSParserImpl::ParseDeclarationList(
     MutableCSSPropertyValueSet* declaration,
     const String& string,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.h b/third_party/blink/renderer/core/css/parser/css_parser_impl.h
index 26bcda0..58c53ab 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl.h
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.h
@@ -95,6 +95,8 @@
   static ImmutableCSSPropertyValueSet* ParseInlineStyleDeclaration(
       const String&,
       Element*);
+  static ImmutableCSSPropertyValueSet*
+  ParseInlineStyleDeclaration(const String&, CSSParserMode, SecureContextMode);
   static bool ParseDeclarationList(MutableCSSPropertyValueSet*,
                                    const String&,
                                    const CSSParserContext*);
diff --git a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc
index d314ef3..09cba01 100644
--- a/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc
+++ b/third_party/blink/renderer/core/css/resolver/matched_properties_cache.cc
@@ -88,8 +88,10 @@
                                  const MatchedPropertiesVector& properties) {
   DCHECK(hash);
   Cache::AddResult add_result = cache_.insert(hash, nullptr);
-  if (add_result.is_new_entry || !add_result.stored_value->value)
-    add_result.stored_value->value = new CachedMatchedProperties;
+  if (add_result.is_new_entry || !add_result.stored_value->value) {
+    add_result.stored_value->value =
+        MakeGarbageCollected<CachedMatchedProperties>();
+  }
 
   CachedMatchedProperties* cache_item = add_result.stored_value->value.Get();
   if (!add_result.is_new_entry)
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc
index 5dd7812..a07887f 100644
--- a/third_party/blink/renderer/core/css/rule_set.cc
+++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -71,7 +71,8 @@
     return nullptr;
   if (position >= (1 << RuleData::kPositionBits))
     return nullptr;
-  return new RuleData(rule, selector_index, position, add_rule_flags);
+  return MakeGarbageCollected<RuleData>(rule, selector_index, position,
+                                        add_rule_flags);
 }
 
 RuleData::RuleData(StyleRule* rule,
@@ -99,7 +100,7 @@
   Member<HeapLinkedStack<Member<const RuleData>>>& rules =
       map.insert(key, nullptr).stored_value->value;
   if (!rules)
-    rules = new HeapLinkedStack<Member<const RuleData>>;
+    rules = MakeGarbageCollected<HeapLinkedStack<Member<const RuleData>>>();
   rules->Push(rule_data);
 }
 
diff --git a/third_party/blink/renderer/core/css/rule_set.h b/third_party/blink/renderer/core/css/rule_set.h
index 6f57a02..41c0281 100644
--- a/third_party/blink/renderer/core/css/rule_set.h
+++ b/third_party/blink/renderer/core/css/rule_set.h
@@ -84,6 +84,11 @@
                                unsigned position,
                                AddRuleFlags);
 
+  RuleData(StyleRule*,
+           unsigned selector_index,
+           unsigned position,
+           AddRuleFlags);
+
   unsigned GetPosition() const { return position_; }
   StyleRule* Rule() const { return rule_; }
   const CSSSelector& Selector() const {
@@ -125,11 +130,6 @@
   static constexpr size_t kPositionBits = 18;
 
  private:
-  RuleData(StyleRule*,
-           unsigned selector_index,
-           unsigned position,
-           AddRuleFlags);
-
   Member<StyleRule> rule_;
   unsigned selector_index_ : kSelectorIndexBits;
   unsigned position_ : kPositionBits;
diff --git a/third_party/blink/renderer/core/css/style_rule.h b/third_party/blink/renderer/core/css/style_rule.h
index a648835..8a9596d8 100644
--- a/third_party/blink/renderer/core/css/style_rule.h
+++ b/third_party/blink/renderer/core/css/style_rule.h
@@ -345,11 +345,16 @@
   static StyleRuleFontFeatureValues* Create(
       const CSSValueList* font_family,
       const CSSIdentifierValue* font_display) {
-    return new StyleRuleFontFeatureValues(font_family, font_display);
+    return MakeGarbageCollected<StyleRuleFontFeatureValues>(font_family,
+                                                            font_display);
   }
 
+  StyleRuleFontFeatureValues(const CSSValueList* font_family,
+                             const CSSIdentifierValue* font_display);
+  StyleRuleFontFeatureValues(const StyleRuleFontFeatureValues&) = default;
+
   StyleRuleFontFeatureValues* Copy() const {
-    return new StyleRuleFontFeatureValues(*this);
+    return MakeGarbageCollected<StyleRuleFontFeatureValues>(*this);
   }
 
   const CSSValueList& FontFamily() const {
@@ -361,10 +366,6 @@
   void TraceAfterDispatch(blink::Visitor*);
 
  private:
-  StyleRuleFontFeatureValues(const CSSValueList* font_family,
-                             const CSSIdentifierValue* font_display);
-  StyleRuleFontFeatureValues(const StyleRuleFontFeatureValues&) = default;
-
   Member<const CSSValueList> font_family_;
   Member<const CSSIdentifierValue> font_display_;
 };
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
index 386b85b..266b8f27 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -166,7 +166,7 @@
   SCOPED_LOGGER(__PRETTY_FUNCTION__);
   ++suspended_count_;
   state_ = kSuspended;
-  return new DisplayLockSuspendedHandle(this);
+  return MakeGarbageCollected<DisplayLockSuspendedHandle>(this);
 }
 
 Element* DisplayLockContext::lockedElement() const {
diff --git a/third_party/blink/renderer/core/dom/abort_controller.cc b/third_party/blink/renderer/core/dom/abort_controller.cc
index f912925..3ffb73a 100644
--- a/third_party/blink/renderer/core/dom/abort_controller.cc
+++ b/third_party/blink/renderer/core/dom/abort_controller.cc
@@ -10,11 +10,11 @@
 namespace blink {
 
 AbortController* AbortController::Create(ExecutionContext* context) {
-  return new AbortController(context);
+  return MakeGarbageCollected<AbortController>(context);
 }
 
 AbortController::AbortController(ExecutionContext* execution_context)
-    : signal_(new AbortSignal(execution_context)) {}
+    : signal_(MakeGarbageCollected<AbortSignal>(execution_context)) {}
 
 AbortController::~AbortController() = default;
 
diff --git a/third_party/blink/renderer/core/dom/abort_controller.h b/third_party/blink/renderer/core/dom/abort_controller.h
index 1cbd684..7381dec 100644
--- a/third_party/blink/renderer/core/dom/abort_controller.h
+++ b/third_party/blink/renderer/core/dom/abort_controller.h
@@ -21,6 +21,8 @@
 
  public:
   static AbortController* Create(ExecutionContext*);
+
+  explicit AbortController(ExecutionContext*);
   ~AbortController() override;
 
   // abort_controller.idl
@@ -34,8 +36,6 @@
   void Trace(Visitor*) override;
 
  private:
-  explicit AbortController(ExecutionContext*);
-
   Member<AbortSignal> signal_;
 };
 
diff --git a/third_party/blink/renderer/core/dom/attr.cc b/third_party/blink/renderer/core/dom/attr.cc
index 392a07f..13814ee 100644
--- a/third_party/blink/renderer/core/dom/attr.cc
+++ b/third_party/blink/renderer/core/dom/attr.cc
@@ -47,13 +47,13 @@
       standalone_value_or_attached_local_name_(standalone_value) {}
 
 Attr* Attr::Create(Element& element, const QualifiedName& name) {
-  return new Attr(element, name);
+  return MakeGarbageCollected<Attr>(element, name);
 }
 
 Attr* Attr::Create(Document& document,
                    const QualifiedName& name,
                    const AtomicString& value) {
-  return new Attr(document, name, value);
+  return MakeGarbageCollected<Attr>(document, name, value);
 }
 
 Attr::~Attr() = default;
@@ -94,7 +94,7 @@
 }
 
 Node* Attr::Clone(Document& factory, CloneChildrenFlag) const {
-  return new Attr(factory, name_, value());
+  return MakeGarbageCollected<Attr>(factory, name_, value());
 }
 
 void Attr::DetachFromElementWithValue(const AtomicString& value) {
diff --git a/third_party/blink/renderer/core/dom/attr.h b/third_party/blink/renderer/core/dom/attr.h
index cf12ab1b..cdd530e9 100644
--- a/third_party/blink/renderer/core/dom/attr.h
+++ b/third_party/blink/renderer/core/dom/attr.h
@@ -41,6 +41,9 @@
   static Attr* Create(Document&,
                       const QualifiedName&,
                       const AtomicString& value);
+
+  Attr(Element&, const QualifiedName&);
+  Attr(Document&, const QualifiedName&, const AtomicString& value);
   ~Attr() override;
 
   String name() const { return name_.ToString(); }
@@ -62,9 +65,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  Attr(Element&, const QualifiedName&);
-  Attr(Document&, const QualifiedName&, const AtomicString& value);
-
   bool IsElementNode() const =
       delete;  // This will catch anyone doing an unnecessary check.
 
diff --git a/third_party/blink/renderer/core/dom/cdata_section.cc b/third_party/blink/renderer/core/dom/cdata_section.cc
index fd0982d..200272af 100644
--- a/third_party/blink/renderer/core/dom/cdata_section.cc
+++ b/third_party/blink/renderer/core/dom/cdata_section.cc
@@ -29,7 +29,7 @@
     : Text(document, data, kCreateText) {}
 
 CDATASection* CDATASection::Create(Document& document, const String& data) {
-  return new CDATASection(document, data);
+  return MakeGarbageCollected<CDATASection>(document, data);
 }
 
 String CDATASection::nodeName() const {
diff --git a/third_party/blink/renderer/core/dom/cdata_section.h b/third_party/blink/renderer/core/dom/cdata_section.h
index c665e30..2ed11b2 100644
--- a/third_party/blink/renderer/core/dom/cdata_section.h
+++ b/third_party/blink/renderer/core/dom/cdata_section.h
@@ -33,9 +33,9 @@
  public:
   static CDATASection* Create(Document&, const String&);
 
- private:
   CDATASection(Document&, const String&);
 
+ private:
   String nodeName() const override;
   NodeType getNodeType() const override;
   Text* CloneWithData(Document&, const String&) const override;
diff --git a/third_party/blink/renderer/core/dom/child_list_mutation_scope.cc b/third_party/blink/renderer/core/dom/child_list_mutation_scope.cc
index f377fc4..3679895 100644
--- a/third_party/blink/renderer/core/dom/child_list_mutation_scope.cc
+++ b/third_party/blink/renderer/core/dom/child_list_mutation_scope.cc
@@ -76,7 +76,7 @@
   if (!result.is_new_entry) {
     accumulator = result.stored_value->value;
   } else {
-    accumulator = new ChildListMutationAccumulator(
+    accumulator = MakeGarbageCollected<ChildListMutationAccumulator>(
         &target,
         MutationObserverInterestGroup::CreateForChildListMutation(target));
     result.stored_value->value = accumulator;
diff --git a/third_party/blink/renderer/core/dom/child_list_mutation_scope.h b/third_party/blink/renderer/core/dom/child_list_mutation_scope.h
index 2cc10f3..a8b1a34 100644
--- a/third_party/blink/renderer/core/dom/child_list_mutation_scope.h
+++ b/third_party/blink/renderer/core/dom/child_list_mutation_scope.h
@@ -54,6 +54,8 @@
  public:
   static ChildListMutationAccumulator* GetOrCreate(Node&);
 
+  ChildListMutationAccumulator(Node*, MutationObserverInterestGroup*);
+
   void ChildAdded(Node*);
   void WillRemoveChild(Node*);
 
@@ -67,8 +69,6 @@
   void Trace(blink::Visitor*);
 
  private:
-  ChildListMutationAccumulator(Node*, MutationObserverInterestGroup*);
-
   void EnqueueMutationRecord();
   bool IsEmpty();
   bool IsAddedNodeInOrder(Node*);
diff --git a/third_party/blink/renderer/core/dom/child_node_list.h b/third_party/blink/renderer/core/dom/child_node_list.h
index 6c9ebb9..baad97dc 100644
--- a/third_party/blink/renderer/core/dom/child_node_list.h
+++ b/third_party/blink/renderer/core/dom/child_node_list.h
@@ -34,9 +34,10 @@
 class ChildNodeList final : public NodeList {
  public:
   static ChildNodeList* Create(ContainerNode& root_node) {
-    return new ChildNodeList(root_node);
+    return MakeGarbageCollected<ChildNodeList>(root_node);
   }
 
+  explicit ChildNodeList(ContainerNode& root_node);
   ~ChildNodeList() override;
 
   // DOM API.
@@ -66,8 +67,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  explicit ChildNodeList(ContainerNode& root_node);
-
   bool IsChildNodeList() const override { return true; }
   Node* VirtualOwnerNode() const override;
 
diff --git a/third_party/blink/renderer/core/dom/class_collection.h b/third_party/blink/renderer/core/dom/class_collection.h
index b4c7d6b..b0b27e2 100644
--- a/third_party/blink/renderer/core/dom/class_collection.h
+++ b/third_party/blink/renderer/core/dom/class_collection.h
@@ -46,16 +46,15 @@
                                  CollectionType type,
                                  const AtomicString& class_names) {
     DCHECK_EQ(type, kClassCollectionType);
-    return new ClassCollection(root_node, class_names);
+    return MakeGarbageCollected<ClassCollection>(root_node, class_names);
   }
 
+  ClassCollection(ContainerNode& root_node, const AtomicString& class_names);
   ~ClassCollection() override;
 
   bool ElementMatches(const Element&) const;
 
  private:
-  ClassCollection(ContainerNode& root_node, const AtomicString& class_names);
-
   SpaceSplitString class_names_;
 };
 
diff --git a/third_party/blink/renderer/core/dom/comment.cc b/third_party/blink/renderer/core/dom/comment.cc
index 79b474233..d7476d19 100644
--- a/third_party/blink/renderer/core/dom/comment.cc
+++ b/third_party/blink/renderer/core/dom/comment.cc
@@ -29,7 +29,7 @@
     : CharacterData(document, text, kCreateOther) {}
 
 Comment* Comment::Create(Document& document, const String& text) {
-  return new Comment(document, text);
+  return MakeGarbageCollected<Comment>(document, text);
 }
 
 String Comment::nodeName() const {
diff --git a/third_party/blink/renderer/core/dom/comment.h b/third_party/blink/renderer/core/dom/comment.h
index 5b1579b..b8d1d7b 100644
--- a/third_party/blink/renderer/core/dom/comment.h
+++ b/third_party/blink/renderer/core/dom/comment.h
@@ -33,9 +33,9 @@
  public:
   static Comment* Create(Document&, const String&);
 
- private:
   Comment(Document&, const String&);
 
+ private:
   String nodeName() const override;
   NodeType getNodeType() const override;
   Node* Clone(Document&, CloneChildrenFlag) const override;
diff --git a/third_party/blink/renderer/core/dom/context_features.h b/third_party/blink/renderer/core/dom/context_features.h
index bf995fb..b9a534b 100644
--- a/third_party/blink/renderer/core/dom/context_features.h
+++ b/third_party/blink/renderer/core/dom/context_features.h
@@ -57,13 +57,13 @@
   static bool PagePopupEnabled(Document*);
   static bool MutationEventsEnabled(Document*);
 
+  explicit ContextFeatures(std::unique_ptr<ContextFeaturesClient> client)
+      : client_(std::move(client)) {}
+
   bool IsEnabled(Document*, FeatureType, bool) const;
   void UrlDidChange(Document*);
 
  private:
-  explicit ContextFeatures(std::unique_ptr<ContextFeaturesClient> client)
-      : client_(std::move(client)) {}
-
   std::unique_ptr<ContextFeaturesClient> client_;
 };
 
@@ -89,7 +89,7 @@
 
 inline ContextFeatures* ContextFeatures::Create(
     std::unique_ptr<ContextFeaturesClient> client) {
-  return new ContextFeatures(std::move(client));
+  return MakeGarbageCollected<ContextFeatures>(std::move(client));
 }
 
 inline bool ContextFeatures::IsEnabled(Document* document,
diff --git a/third_party/blink/renderer/core/dom/context_features_client_impl.cc b/third_party/blink/renderer/core/dom/context_features_client_impl.cc
index 69f26b60..09ed844 100644
--- a/third_party/blink/renderer/core/dom/context_features_client_impl.cc
+++ b/third_party/blink/renderer/core/dom/context_features_client_impl.cc
@@ -73,6 +73,9 @@
 
   static ContextFeaturesCache& From(Document&);
 
+  explicit ContextFeaturesCache(Document& document)
+      : Supplement<Document>(document) {}
+
   Entry& EntryFor(ContextFeatures::FeatureType type) {
     size_t index = static_cast<size_t>(type);
     SECURITY_DCHECK(index < ContextFeatures::kFeatureTypeSize);
@@ -86,9 +89,6 @@
   }
 
  private:
-  explicit ContextFeaturesCache(Document& document)
-      : Supplement<Document>(document) {}
-
   String domain_;
   Entry entries_[ContextFeatures::kFeatureTypeSize];
 };
@@ -99,7 +99,7 @@
   ContextFeaturesCache* cache =
       Supplement<Document>::From<ContextFeaturesCache>(document);
   if (!cache) {
-    cache = new ContextFeaturesCache(document);
+    cache = MakeGarbageCollected<ContextFeaturesCache>(document);
     ProvideTo(document, cache);
   }
 
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index ca5e41d..f83a528 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -3938,7 +3938,9 @@
   DCHECK(parser_);
   PerformanceMonitor::ReportGenericViolation(
       this, PerformanceMonitor::kDiscouragedAPIUse,
-      "Avoid using document.write(). https://developers.google.com/web/updates/2016/08/removing-document-write",
+      "Avoid using document.write(). "
+      "https://developers.google.com/web/updates/2016/08/"
+      "removing-document-write",
       base::TimeDelta(), nullptr);
   probe::breakableLocation(this, "Document.write");
   parser_->insert(text);
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 18de74e..24bd9d18 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -272,9 +272,9 @@
 
   void MediaQueryAffectingValueChanged();
 
-  using SecurityContext::GetSecurityOrigin;
-  using SecurityContext::GetMutableSecurityOrigin;
   using SecurityContext::GetContentSecurityPolicy;
+  using SecurityContext::GetMutableSecurityOrigin;
+  using SecurityContext::GetSecurityOrigin;
   using TreeScope::getElementById;
 
   // ExecutionContext overrides:
@@ -511,8 +511,8 @@
   // document's frame_, if any.  Can be null.
   // TODO(kochi): Audit usage of this interface (crbug.com/746150).
   LocalFrame* GetFrameOfMasterDocument() const;
-  Page* GetPage() const;                           // can be null
-  Settings* GetSettings() const;                   // can be null
+  Page* GetPage() const;          // can be null
+  Settings* GetSettings() const;  // can be null
 
   float DevicePixelRatio() const;
 
diff --git a/third_party/blink/renderer/core/dom/document_test.cc b/third_party/blink/renderer/core/dom/document_test.cc
index f20a13b..b2caec5 100644
--- a/third_party/blink/renderer/core/dom/document_test.cc
+++ b/third_party/blink/renderer/core/dom/document_test.cc
@@ -206,7 +206,8 @@
     const NodeWithIndex& node_with_index,
     unsigned offset) {
   merge_text_nodes_records_.push_back(
-      new MergeTextNodesRecord(&node, node_with_index, offset));
+      MakeGarbageCollected<MergeTextNodesRecord>(&node, node_with_index,
+                                                 offset));
 }
 
 void TestSynchronousMutationObserver::DidMoveTreeToNewDocument(
@@ -223,8 +224,9 @@
     unsigned offset,
     unsigned old_length,
     unsigned new_length) {
-  updated_character_data_records_.push_back(new UpdateCharacterDataRecord(
-      character_data, offset, old_length, new_length));
+  updated_character_data_records_.push_back(
+      MakeGarbageCollected<UpdateCharacterDataRecord>(character_data, offset,
+                                                      old_length, new_length));
 }
 
 void TestSynchronousMutationObserver::NodeChildrenWillBeRemoved(
@@ -626,7 +628,8 @@
 }
 
 TEST_F(DocumentTest, SynchronousMutationNotifier) {
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
 
   EXPECT_EQ(GetDocument(), observer.LifecycleContext());
   EXPECT_EQ(0, observer.CountContextDestroyedCalled());
@@ -660,14 +663,16 @@
 }
 
 TEST_F(DocumentTest, SynchronousMutationNotifieAppendChild) {
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
   GetDocument().body()->AppendChild(GetDocument().createTextNode("a123456789"));
   ASSERT_EQ(1u, observer.ChildrenChangedNodes().size());
   EXPECT_EQ(GetDocument().body(), observer.ChildrenChangedNodes()[0]);
 }
 
 TEST_F(DocumentTest, SynchronousMutationNotifieInsertBefore) {
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
   GetDocument().documentElement()->InsertBefore(
       GetDocument().createTextNode("a123456789"), GetDocument().body());
   ASSERT_EQ(1u, observer.ChildrenChangedNodes().size());
@@ -676,7 +681,8 @@
 }
 
 TEST_F(DocumentTest, SynchronousMutationNotifierMergeTextNodes) {
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
 
   Text* merge_sample_a = GetDocument().createTextNode("a123456789");
   GetDocument().body()->AppendChild(merge_sample_a);
@@ -695,7 +701,8 @@
 }
 
 TEST_F(DocumentTest, SynchronousMutationNotifierMoveTreeToNewDocument) {
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
 
   Node* move_sample = GetDocument().CreateRawElement(html_names::kDivTag);
   move_sample->appendChild(GetDocument().createTextNode("a123"));
@@ -710,7 +717,8 @@
 }
 
 TEST_F(DocumentTest, SynchronousMutationNotifieRemoveChild) {
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
   GetDocument().documentElement()->RemoveChild(GetDocument().body());
   ASSERT_EQ(1u, observer.ChildrenChangedNodes().size());
   EXPECT_EQ(GetDocument().documentElement(),
@@ -718,7 +726,8 @@
 }
 
 TEST_F(DocumentTest, SynchronousMutationNotifieReplaceChild) {
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
   Element* const replaced_node = GetDocument().body();
   GetDocument().documentElement()->ReplaceChild(
       GetDocument().CreateRawElement(html_names::kDivTag),
@@ -735,7 +744,8 @@
 
 TEST_F(DocumentTest, SynchronousMutationNotifierSplitTextNode) {
   V8TestingScope scope;
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
 
   Text* split_sample = GetDocument().createTextNode("0123456789");
   GetDocument().body()->AppendChild(split_sample);
@@ -746,7 +756,8 @@
 }
 
 TEST_F(DocumentTest, SynchronousMutationNotifierUpdateCharacterData) {
-  auto& observer = *new TestSynchronousMutationObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestSynchronousMutationObserver>(GetDocument());
 
   Text* append_sample = GetDocument().createTextNode("a123456789");
   GetDocument().body()->AppendChild(append_sample);
@@ -792,7 +803,8 @@
 }
 
 TEST_F(DocumentTest, DocumentShutdownNotifier) {
-  auto& observer = *new TestDocumentShutdownObserver(GetDocument());
+  auto& observer =
+      *MakeGarbageCollected<TestDocumentShutdownObserver>(GetDocument());
 
   EXPECT_EQ(GetDocument(), observer.LifecycleContext());
   EXPECT_EQ(0, observer.CountContextDestroyedCalled());
@@ -825,7 +837,7 @@
   ValidationMessageClient* original_client =
       &GetPage().GetValidationMessageClient();
   MockDocumentValidationMessageClient* mock_client =
-      new MockDocumentValidationMessageClient();
+      MakeGarbageCollected<MockDocumentValidationMessageClient>();
   GetDocument().GetSettings()->SetScriptEnabled(true);
   GetPage().SetValidationMessageClientForTesting(mock_client);
   // ImplicitOpen()-CancelParsing() makes Document.loadEventFinished()
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h
index 6f8d1db..3e7017e 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data.h
+++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -161,7 +161,7 @@
   AccessibleNode* GetAccessibleNode() const { return accessible_node_.Get(); }
   AccessibleNode* EnsureAccessibleNode(Element* owner_element) {
     if (!accessible_node_) {
-      accessible_node_ = new AccessibleNode(owner_element);
+      accessible_node_ = MakeGarbageCollected<AccessibleNode>(owner_element);
     }
     return accessible_node_;
   }
diff --git a/third_party/blink/renderer/core/dom/events/add_event_listener_options_resolved.h b/third_party/blink/renderer/core/dom/events/add_event_listener_options_resolved.h
index fcb23b68..b2e5753 100644
--- a/third_party/blink/renderer/core/dom/events/add_event_listener_options_resolved.h
+++ b/third_party/blink/renderer/core/dom/events/add_event_listener_options_resolved.h
@@ -17,12 +17,15 @@
     : public AddEventListenerOptions {
  public:
   static AddEventListenerOptionsResolved* Create() {
-    return new AddEventListenerOptionsResolved();
+    return MakeGarbageCollected<AddEventListenerOptionsResolved>();
   }
   static AddEventListenerOptionsResolved* Create(
       const AddEventListenerOptions* options) {
-    return new AddEventListenerOptionsResolved(options);
+    return MakeGarbageCollected<AddEventListenerOptionsResolved>(options);
   }
+
+  AddEventListenerOptionsResolved();
+  AddEventListenerOptionsResolved(const AddEventListenerOptions*);
   ~AddEventListenerOptionsResolved() override;
 
   void SetPassiveForcedForDocumentTarget(bool forced) {
@@ -40,9 +43,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AddEventListenerOptionsResolved();
-  AddEventListenerOptionsResolved(const AddEventListenerOptions*);
-
   bool passive_forced_for_document_target_;
   bool passive_specified_;
 };
diff --git a/third_party/blink/renderer/core/dom/events/custom_event.h b/third_party/blink/renderer/core/dom/events/custom_event.h
index 9d2f33f..a65cda7 100644
--- a/third_party/blink/renderer/core/dom/events/custom_event.h
+++ b/third_party/blink/renderer/core/dom/events/custom_event.h
@@ -40,14 +40,19 @@
  public:
   ~CustomEvent() override;
 
-  static CustomEvent* Create() { return new CustomEvent; }
+  static CustomEvent* Create() { return MakeGarbageCollected<CustomEvent>(); }
 
   static CustomEvent* Create(ScriptState* script_state,
                              const AtomicString& type,
                              const CustomEventInit* initializer) {
-    return new CustomEvent(script_state, type, initializer);
+    return MakeGarbageCollected<CustomEvent>(script_state, type, initializer);
   }
 
+  CustomEvent();
+  CustomEvent(ScriptState*,
+              const AtomicString& type,
+              const CustomEventInit* initializer);
+
   void initCustomEvent(ScriptState*,
                        const AtomicString& type,
                        bool bubbles,
@@ -61,11 +66,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  CustomEvent();
-  CustomEvent(ScriptState*,
-              const AtomicString& type,
-              const CustomEventInit* initializer);
-
   scoped_refptr<DOMWrapperWorld> world_;
   TraceWrapperV8Reference<v8::Value> detail_;
 };
diff --git a/third_party/blink/renderer/core/dom/live_node_list_registry_test.cc b/third_party/blink/renderer/core/dom/live_node_list_registry_test.cc
index 48b0416..6b38ef7 100644
--- a/third_party/blink/renderer/core/dom/live_node_list_registry_test.cc
+++ b/third_party/blink/renderer/core/dom/live_node_list_registry_test.cc
@@ -108,7 +108,8 @@
 // the garbage collected. Similar to the previous case, except all references to
 // |a| are removed together by the GC.
 TEST_F(LiveNodeListRegistryTest, ImplicitRemove) {
-  auto wrapper = WrapPersistent(new LiveNodeListRegistryWrapper);
+  auto wrapper =
+      WrapPersistent(MakeGarbageCollected<LiveNodeListRegistryWrapper>());
   auto& registry = wrapper->registry;
   auto a = WrapPersistent(CreateNodeList());
   auto b = WrapPersistent(CreateNodeList());
diff --git a/third_party/blink/renderer/core/dom/mutation_observer_test.cc b/third_party/blink/renderer/core/dom/mutation_observer_test.cc
index 4f8b0290..2018836 100644
--- a/third_party/blink/renderer/core/dom/mutation_observer_test.cc
+++ b/third_party/blink/renderer/core/dom/mutation_observer_test.cc
@@ -40,8 +40,8 @@
   root->SetInnerHTMLFromString("<head><title>\n</title></head><body></body>");
   Node* head = root->firstChild()->firstChild();
   DCHECK(head);
-  Persistent<MutationObserver> observer =
-      MutationObserver::Create(new EmptyMutationCallback(*document));
+  Persistent<MutationObserver> observer = MutationObserver::Create(
+      MakeGarbageCollected<EmptyMutationCallback>(*document));
   MutationObserverInit* init = MutationObserverInit::Create();
   init->setCharacterDataOldValue(false);
   observer->observe(head, init, ASSERT_NO_EXCEPTION);
diff --git a/third_party/blink/renderer/core/dom/mutation_record.cc b/third_party/blink/renderer/core/dom/mutation_record.cc
index a8fe80c..e8096d2 100644
--- a/third_party/blink/renderer/core/dom/mutation_record.cc
+++ b/third_party/blink/renderer/core/dom/mutation_record.cc
@@ -191,24 +191,24 @@
                                                 StaticNodeList* removed,
                                                 Node* previous_sibling,
                                                 Node* next_sibling) {
-  return new ChildListRecord(target, added, removed, previous_sibling,
-                             next_sibling);
+  return MakeGarbageCollected<ChildListRecord>(target, added, removed,
+                                               previous_sibling, next_sibling);
 }
 
 MutationRecord* MutationRecord::CreateAttributes(
     Node* target,
     const QualifiedName& name,
     const AtomicString& old_value) {
-  return new AttributesRecord(target, name, old_value);
+  return MakeGarbageCollected<AttributesRecord>(target, name, old_value);
 }
 
 MutationRecord* MutationRecord::CreateCharacterData(Node* target,
                                                     const String& old_value) {
-  return new CharacterDataRecord(target, old_value);
+  return MakeGarbageCollected<CharacterDataRecord>(target, old_value);
 }
 
 MutationRecord* MutationRecord::CreateWithNullOldValue(MutationRecord* record) {
-  return new MutationRecordWithNullOldValue(record);
+  return MakeGarbageCollected<MutationRecordWithNullOldValue>(record);
 }
 
 MutationRecord::~MutationRecord() = default;
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 89e4681..f2e6a203 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -140,7 +140,7 @@
 ScrollCustomizationCallbacks& GetScrollCustomizationCallbacks() {
   DEFINE_STATIC_LOCAL(Persistent<ScrollCustomizationCallbacks>,
                       scroll_customization_callbacks,
-                      (new ScrollCustomizationCallbacks));
+                      (MakeGarbageCollected<ScrollCustomizationCallbacks>()));
   return *scroll_customization_callbacks;
 }
 
diff --git a/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc b/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc
index 8be82236..cb5a9fc 100644
--- a/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc
+++ b/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc
@@ -139,7 +139,8 @@
 
   Controller().EnqueueTask(observer.CreateTask(1));
   GetDocument().addEventListener(
-      "test", new RunTaskEventListener(observer.CreateTask(2)));
+      "test",
+      MakeGarbageCollected<RunTaskEventListener>(observer.CreateTask(2)));
   Event* event = Event::Create("test");
   event->SetTarget(&GetDocument());
   Controller().EnqueueEvent(event);
@@ -173,7 +174,8 @@
   Event* event = Event::Create("test");
   event->SetTarget(&GetDocument());
 
-  Controller().RegisterCallback(new RunTaskCallback(observer.CreateTask(1)));
+  Controller().RegisterCallback(
+      MakeGarbageCollected<RunTaskCallback>(observer.CreateTask(1)));
   Controller().EnqueueTask(observer.CreateTask(2));
   EXPECT_EQ(0u, observer.Order().size());
 
@@ -186,14 +188,17 @@
 TEST_F(ScriptedAnimationControllerTest, TestHasCallback) {
   TaskOrderObserver observer;
 
-  Controller().RegisterCallback(new RunTaskCallback(observer.CreateTask(1)));
+  Controller().RegisterCallback(
+      MakeGarbageCollected<RunTaskCallback>(observer.CreateTask(1)));
   EXPECT_TRUE(Controller().HasCallback());
 
   Controller().CancelCallback(1);
   EXPECT_FALSE(Controller().HasCallback());
 
-  Controller().RegisterCallback(new RunTaskCallback(observer.CreateTask(1)));
-  Controller().RegisterCallback(new RunTaskCallback(observer.CreateTask(2)));
+  Controller().RegisterCallback(
+      MakeGarbageCollected<RunTaskCallback>(observer.CreateTask(1)));
+  Controller().RegisterCallback(
+      MakeGarbageCollected<RunTaskCallback>(observer.CreateTask(2)));
   EXPECT_TRUE(Controller().HasCallback());
 
   Controller().CancelCallback(1);
diff --git a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
index b17a00e9b..ad2fff9 100644
--- a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
+++ b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
@@ -99,7 +99,7 @@
   ScriptedIdleTaskController* controller =
       ScriptedIdleTaskController::Create(execution_context_);
 
-  Persistent<MockIdleTask> idle_task(new MockIdleTask());
+  Persistent<MockIdleTask> idle_task(MakeGarbageCollected<MockIdleTask>());
   IdleRequestOptions* options = IdleRequestOptions::Create();
   EXPECT_FALSE(scheduler.HasIdleTask());
   int id = controller->RegisterCallback(idle_task, options);
@@ -120,7 +120,7 @@
   ScriptedIdleTaskController* controller =
       ScriptedIdleTaskController::Create(execution_context_);
 
-  Persistent<MockIdleTask> idle_task(new MockIdleTask());
+  Persistent<MockIdleTask> idle_task(MakeGarbageCollected<MockIdleTask>());
   IdleRequestOptions* options = IdleRequestOptions::Create();
   int id = controller->RegisterCallback(idle_task, options);
   EXPECT_NE(0, id);
diff --git a/third_party/blink/renderer/core/dom/scripted_task_queue.cc b/third_party/blink/renderer/core/dom/scripted_task_queue.cc
index 0b3319f9..be1b3222 100644
--- a/third_party/blink/renderer/core/dom/scripted_task_queue.cc
+++ b/third_party/blink/renderer/core/dom/scripted_task_queue.cc
@@ -97,7 +97,8 @@
         WTF::Bind(&ScriptedTaskQueue::AbortTask, WrapPersistent(this), id));
   }
 
-  pending_tasks_.Set(id, new WrappedCallback(callback, resolver));
+  pending_tasks_.Set(id,
+                     MakeGarbageCollected<WrappedCallback>(callback, resolver));
 
   auto callback_wrapper = TaskQueuePostCallbackWrapper::Create(id, this);
   task_runner_->PostTask(FROM_HERE,
diff --git a/third_party/blink/renderer/core/dom/static_node_list.h b/third_party/blink/renderer/core/dom/static_node_list.h
index 9e911b1..805581b 100644
--- a/third_party/blink/renderer/core/dom/static_node_list.h
+++ b/third_party/blink/renderer/core/dom/static_node_list.h
@@ -64,7 +64,8 @@
 template <typename NodeType>
 StaticNodeTypeList<NodeType>* StaticNodeTypeList<NodeType>::Adopt(
     HeapVector<Member<NodeType>>& nodes) {
-  StaticNodeTypeList<NodeType>* node_list = new StaticNodeTypeList<NodeType>;
+  StaticNodeTypeList<NodeType>* node_list =
+      MakeGarbageCollected<StaticNodeTypeList<NodeType>>();
   swap(node_list->nodes_, nodes);
   return node_list;
 }
diff --git a/third_party/blink/renderer/core/dom/weak_identifier_map.h b/third_party/blink/renderer/core/dom/weak_identifier_map.h
index 07b2d9a..4f70063 100644
--- a/third_party/blink/renderer/core/dom/weak_identifier_map.h
+++ b/third_party/blink/renderer/core/dom/weak_identifier_map.h
@@ -59,6 +59,8 @@
     return result;
   }
 
+  WeakIdentifierMap() = default;
+
   static T* Lookup(IdentifierType identifier) {
     return Instance().identifier_to_object_.at(identifier);
   }
@@ -70,8 +72,6 @@
  private:
   static WeakIdentifierMap<T, IdentifierType>& Instance();
 
-  WeakIdentifierMap() = default;
-
   static IdentifierType Next() {
     static IdentifierType last_id = 0;
     return ++last_id;
@@ -96,15 +96,16 @@
   WeakIdentifierMap<T, ##__VA_ARGS__>::Instance(); \
   extern template class WeakIdentifierMap<T, ##__VA_ARGS__>;
 
-#define DEFINE_WEAK_IDENTIFIER_MAP(T, ...)                            \
-  template class WeakIdentifierMap<T, ##__VA_ARGS__>;                 \
-  template <>                                                         \
-  WeakIdentifierMap<T, ##__VA_ARGS__>&                                \
-  WeakIdentifierMap<T, ##__VA_ARGS__>::Instance() {                   \
-    using RefType = WeakIdentifierMap<T, ##__VA_ARGS__>;              \
-    DEFINE_STATIC_LOCAL(Persistent<RefType>, map_instance,            \
-                        (new WeakIdentifierMap<T, ##__VA_ARGS__>())); \
-    return *map_instance;                                             \
+#define DEFINE_WEAK_IDENTIFIER_MAP(T, ...)                              \
+  template class WeakIdentifierMap<T, ##__VA_ARGS__>;                   \
+  template <>                                                           \
+  WeakIdentifierMap<T, ##__VA_ARGS__>&                                  \
+  WeakIdentifierMap<T, ##__VA_ARGS__>::Instance() {                     \
+    using RefType = WeakIdentifierMap<T, ##__VA_ARGS__>;                \
+    DEFINE_STATIC_LOCAL(                                                \
+        Persistent<RefType>, map_instance,                              \
+        (MakeGarbageCollected<WeakIdentifierMap<T, ##__VA_ARGS__>>())); \
+    return *map_instance;                                               \
   }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client.cc b/third_party/blink/renderer/core/editing/caret_display_item_client.cc
index dfa851f..eb0d5c20 100644
--- a/third_party/blink/renderer/core/editing/caret_display_item_client.cc
+++ b/third_party/blink/renderer/core/editing/caret_display_item_client.cc
@@ -100,7 +100,8 @@
   if (caret_position.IsNull())
     return LayoutRect();
 
-  DCHECK(caret_position.AnchorNode()->GetLayoutObject());
+  if (!caret_position.AnchorNode()->GetLayoutObject())
+    return LayoutRect();
 
   // First compute a rect local to the layoutObject at the selection start.
   const LocalCaretRect& caret_rect = LocalCaretRectOfPosition(caret_position);
diff --git a/third_party/blink/renderer/core/editing/commands/append_node_command.h b/third_party/blink/renderer/core/editing/commands/append_node_command.h
index fc15800..3887fac 100644
--- a/third_party/blink/renderer/core/editing/commands/append_node_command.h
+++ b/third_party/blink/renderer/core/editing/commands/append_node_command.h
@@ -33,14 +33,14 @@
 class AppendNodeCommand final : public SimpleEditCommand {
  public:
   static AppendNodeCommand* Create(ContainerNode* parent, Node* node) {
-    return new AppendNodeCommand(parent, node);
+    return MakeGarbageCollected<AppendNodeCommand>(parent, node);
   }
 
+  AppendNodeCommand(ContainerNode* parent, Node*);
+
   void Trace(blink::Visitor*) override;
 
  private:
-  AppendNodeCommand(ContainerNode* parent, Node*);
-
   void DoApply(EditingState*) override;
   void DoUnapply() override;
 
diff --git a/third_party/blink/renderer/core/editing/commands/apply_style_command.h b/third_party/blink/renderer/core/editing/commands/apply_style_command.h
index 0e2c87f..da39655 100644
--- a/third_party/blink/renderer/core/editing/commands/apply_style_command.h
+++ b/third_party/blink/renderer/core/editing/commands/apply_style_command.h
@@ -50,29 +50,27 @@
                                    const EditingStyle* style,
                                    InputEvent::InputType input_type,
                                    EPropertyLevel level = kPropertyDefault) {
-    return new ApplyStyleCommand(document, style, input_type, level);
+    return MakeGarbageCollected<ApplyStyleCommand>(document, style, input_type,
+                                                   level);
   }
   static ApplyStyleCommand* Create(Document& document,
                                    const EditingStyle* style,
                                    const Position& start,
                                    const Position& end) {
-    return new ApplyStyleCommand(document, style, start, end);
+    return MakeGarbageCollected<ApplyStyleCommand>(document, style, start, end);
   }
   static ApplyStyleCommand* Create(Element* element, bool remove_only) {
-    return new ApplyStyleCommand(element, remove_only);
+    return MakeGarbageCollected<ApplyStyleCommand>(element, remove_only);
   }
   static ApplyStyleCommand* Create(
       Document& document,
       const EditingStyle* style,
       IsInlineElementToRemoveFunction is_inline_element_to_remove_function,
       InputEvent::InputType input_type) {
-    return new ApplyStyleCommand(
+    return MakeGarbageCollected<ApplyStyleCommand>(
         document, style, is_inline_element_to_remove_function, input_type);
   }
 
-  void Trace(blink::Visitor*) override;
-
- private:
   ApplyStyleCommand(Document&,
                     const EditingStyle*,
                     InputEvent::InputType,
@@ -87,6 +85,9 @@
                     bool (*is_inline_element_to_remove)(const Element*),
                     InputEvent::InputType);
 
+  void Trace(blink::Visitor*) override;
+
+ private:
   void DoApply(EditingState*) override;
   InputEvent::InputType GetInputType() const override;
 
diff --git a/third_party/blink/renderer/core/editing/commands/break_blockquote_command.h b/third_party/blink/renderer/core/editing/commands/break_blockquote_command.h
index 5836767..eff91d54 100644
--- a/third_party/blink/renderer/core/editing/commands/break_blockquote_command.h
+++ b/third_party/blink/renderer/core/editing/commands/break_blockquote_command.h
@@ -33,11 +33,12 @@
 class BreakBlockquoteCommand final : public CompositeEditCommand {
  public:
   static BreakBlockquoteCommand* Create(Document& document) {
-    return new BreakBlockquoteCommand(document);
+    return MakeGarbageCollected<BreakBlockquoteCommand>(document);
   }
 
- private:
   explicit BreakBlockquoteCommand(Document&);
+
+ private:
   void DoApply(EditingState*) override;
 };
 
diff --git a/third_party/blink/renderer/core/editing/commands/composite_edit_command_test.cc b/third_party/blink/renderer/core/editing/commands/composite_edit_command_test.cc
index 1e898ab..3cf0ee6 100644
--- a/third_party/blink/renderer/core/editing/commands/composite_edit_command_test.cc
+++ b/third_party/blink/renderer/core/editing/commands/composite_edit_command_test.cc
@@ -69,7 +69,7 @@
 
 TEST_F(CompositeEditCommandTest, insertNodeBefore) {
   SetBodyContent("<div contenteditable><b></b></div>");
-  SampleCommand& sample = *new SampleCommand(GetDocument());
+  SampleCommand& sample = *MakeGarbageCollected<SampleCommand>(GetDocument());
   Node* insert_child = GetDocument().createTextNode("foo");
   Element* ref_child = GetDocument().QuerySelector("b");
   Element* div = GetDocument().QuerySelector("div");
@@ -82,7 +82,7 @@
 
 TEST_F(CompositeEditCommandTest, insertNodeBeforeInUneditable) {
   SetBodyContent("<div><b></b></div>");
-  SampleCommand& sample = *new SampleCommand(GetDocument());
+  SampleCommand& sample = *MakeGarbageCollected<SampleCommand>(GetDocument());
   Node* insert_child = GetDocument().createTextNode("foo");
   Element* ref_child = GetDocument().QuerySelector("b");
 
@@ -93,7 +93,7 @@
 
 TEST_F(CompositeEditCommandTest, insertNodeBeforeDisconnectedNode) {
   SetBodyContent("<div><b></b></div>");
-  SampleCommand& sample = *new SampleCommand(GetDocument());
+  SampleCommand& sample = *MakeGarbageCollected<SampleCommand>(GetDocument());
   Node* insert_child = GetDocument().createTextNode("foo");
   Element* ref_child = GetDocument().QuerySelector("b");
   Element* div = GetDocument().QuerySelector("div");
@@ -108,7 +108,7 @@
 
 TEST_F(CompositeEditCommandTest, insertNodeBeforeWithDirtyLayoutTree) {
   SetBodyContent("<div><b></b></div>");
-  SampleCommand& sample = *new SampleCommand(GetDocument());
+  SampleCommand& sample = *MakeGarbageCollected<SampleCommand>(GetDocument());
   Node* insert_child = GetDocument().createTextNode("foo");
   Element* ref_child = GetDocument().QuerySelector("b");
   Element* div = GetDocument().QuerySelector("div");
@@ -125,7 +125,7 @@
   SetBodyContent(
       "<style>div{-webkit-user-modify:read-only;user-select:none;}</style>"
       "foo");
-  SampleCommand& sample = *new SampleCommand(GetDocument());
+  SampleCommand& sample = *MakeGarbageCollected<SampleCommand>(GetDocument());
   Element* body = GetDocument().body();
   Node* text = body->lastChild();
   body->setAttribute(html_names::kContenteditableAttr, "true");
@@ -144,7 +144,7 @@
 
 TEST_F(CompositeEditCommandTest, InsertNodeOnDisconnectedParent) {
   SetBodyContent("<p><b></b></p>");
-  SampleCommand& sample = *new SampleCommand(GetDocument());
+  SampleCommand& sample = *MakeGarbageCollected<SampleCommand>(GetDocument());
   Node* insert_child = GetDocument().QuerySelector("b");
   Element* ref_child = GetDocument().QuerySelector("p");
   ref_child->remove();
diff --git a/third_party/blink/renderer/core/editing/commands/create_link_command.h b/third_party/blink/renderer/core/editing/commands/create_link_command.h
index 27c695f0..04ec24261 100644
--- a/third_party/blink/renderer/core/editing/commands/create_link_command.h
+++ b/third_party/blink/renderer/core/editing/commands/create_link_command.h
@@ -33,12 +33,12 @@
 class CreateLinkCommand final : public CompositeEditCommand {
  public:
   static CreateLinkCommand* Create(Document& document, const String& link_url) {
-    return new CreateLinkCommand(document, link_url);
+    return MakeGarbageCollected<CreateLinkCommand>(document, link_url);
   }
 
- private:
   CreateLinkCommand(Document&, const String& link_url);
 
+ private:
   void DoApply(EditingState*) override;
 
   String url_;
diff --git a/third_party/blink/renderer/core/editing/finder/find_task_controller.cc b/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
index b78d4974..5df794ea 100644
--- a/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
+++ b/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
@@ -32,27 +32,10 @@
                               int identifier,
                               const WebString& search_text,
                               const mojom::blink::FindOptions& options) {
-    return new IdleFindTask(controller, document, identifier, search_text,
-                            options);
+    return MakeGarbageCollected<IdleFindTask>(controller, document, identifier,
+                                              search_text, options);
   }
 
-  void Dispose() {
-    DCHECK_GT(callback_handle_, 0);
-    document_->CancelIdleCallback(callback_handle_);
-  }
-
-  void ForceInvocationForTesting() {
-    invoke(IdleDeadline::Create(CurrentTimeTicks() + kFindTaskTestTimeout,
-                                IdleDeadline::CallbackType::kCalledWhenIdle));
-  }
-
-  void Trace(Visitor* visitor) override {
-    visitor->Trace(controller_);
-    visitor->Trace(document_);
-    ScriptedIdleTaskController::IdleTask::Trace(visitor);
-  }
-
- private:
   IdleFindTask(FindTaskController* controller,
                Document* document,
                int identifier,
@@ -73,6 +56,23 @@
     callback_handle_ = document_->RequestIdleCallback(this, request_options);
   }
 
+  void Dispose() {
+    DCHECK_GT(callback_handle_, 0);
+    document_->CancelIdleCallback(callback_handle_);
+  }
+
+  void ForceInvocationForTesting() {
+    invoke(IdleDeadline::Create(CurrentTimeTicks() + kFindTaskTestTimeout,
+                                IdleDeadline::CallbackType::kCalledWhenIdle));
+  }
+
+  void Trace(Visitor* visitor) override {
+    visitor->Trace(controller_);
+    visitor->Trace(document_);
+    ScriptedIdleTaskController::IdleTask::Trace(visitor);
+  }
+
+ private:
   void invoke(IdleDeadline* deadline) override {
     if (!controller_->ShouldFindMatches(search_text_, *options_)) {
       controller_->DidFinishTask(identifier_, search_text_, *options_,
diff --git a/third_party/blink/renderer/core/editing/finder/find_task_controller.h b/third_party/blink/renderer/core/editing/finder/find_task_controller.h
index 99f0b3c..1b99f852 100644
--- a/third_party/blink/renderer/core/editing/finder/find_task_controller.h
+++ b/third_party/blink/renderer/core/editing/finder/find_task_controller.h
@@ -24,9 +24,11 @@
  public:
   static FindTaskController* Create(WebLocalFrameImpl& owner_frame,
                                     TextFinder& text_finder) {
-    return new FindTaskController(owner_frame, text_finder);
+    return MakeGarbageCollected<FindTaskController>(owner_frame, text_finder);
   }
 
+  FindTaskController(WebLocalFrameImpl& owner_frame, TextFinder& text_finder);
+
   // Starts an effort of finding |search_text| in |owner_frame|,
   // which will be done asynchronously with idle tasks.
   void StartRequest(int identifier,
@@ -75,8 +77,6 @@
   void Trace(Visitor* visitor);
 
  private:
-  FindTaskController(WebLocalFrameImpl& owner_frame, TextFinder& text_finder);
-
   void RequestIdleFindTask(int identifier,
                            const WebString& search_text,
                            const mojom::blink::FindOptions& options);
diff --git a/third_party/blink/renderer/core/editing/layout_selection.cc b/third_party/blink/renderer/core/editing/layout_selection.cc
index a93e9e1..4c381d95d 100644
--- a/third_party/blink/renderer/core/editing/layout_selection.cc
+++ b/third_party/blink/renderer/core/editing/layout_selection.cc
@@ -110,7 +110,7 @@
 LayoutSelection::LayoutSelection(FrameSelection& frame_selection)
     : frame_selection_(&frame_selection),
       has_pending_selection_(false),
-      paint_range_(new SelectionPaintRange) {}
+      paint_range_(MakeGarbageCollected<SelectionPaintRange>()) {}
 
 enum class SelectionMode {
   kNone,
@@ -176,7 +176,8 @@
   STACK_ALLOCATED();
 
  public:
-  OldSelectedNodes() : paint_range(new SelectionPaintRange) {}
+  OldSelectedNodes()
+      : paint_range(MakeGarbageCollected<SelectionPaintRange>()) {}
   OldSelectedNodes(OldSelectedNodes&& other) {
     paint_range = other.paint_range;
     selected_map = std::move(other.selected_map);
@@ -197,7 +198,8 @@
   STACK_ALLOCATED();
 
  public:
-  NewPaintRangeAndSelectedNodes() : paint_range(new SelectionPaintRange) {}
+  NewPaintRangeAndSelectedNodes()
+      : paint_range(MakeGarbageCollected<SelectionPaintRange>()) {}
   NewPaintRangeAndSelectedNodes(
       SelectionPaintRange* passed_paint_range,
       HeapHashSet<Member<const Node>>&& passed_selected_objects)
@@ -297,9 +299,10 @@
 static void SetShouldInvalidateSelection(
     const NewPaintRangeAndSelectedNodes& new_range,
     const OldSelectedNodes& old_selected_objects) {
-  // We invalidate each LayoutObject in new SelectionPaintRange which
-  // has SelectionState of kStart, kEnd, kStartAndEnd, or kInside
-  // and is not in old SelectionPaintRange.
+  // We invalidate each LayoutObject in
+  // MakeGarbageCollected<SelectionPaintRange> which has SelectionState of
+  // kStart, kEnd, kStartAndEnd, or kInside and is not in old
+  // SelectionPaintRange.
   for (const Node* node : new_range.selected_objects) {
     if (old_selected_objects.selected_map.Contains(node))
       continue;
@@ -541,8 +544,8 @@
           ? GetTextContentOffsetEnd(end_node, paint_range.end_offset)
           : paint_range.end_offset;
 
-  return new SelectionPaintRange(*paint_range.start_node, start_offset,
-                                 *paint_range.end_node, end_offset);
+  return MakeGarbageCollected<SelectionPaintRange>(
+      *paint_range.start_node, start_offset, *paint_range.end_node, end_offset);
 }
 
 // ClampOffset modifies |offset| fixed in a range of |text_fragment| start/end
@@ -789,8 +792,8 @@
     selected_objects.insert(end_node);
   }
 
-  SelectionPaintRange* new_range =
-      new SelectionPaintRange(*start_node, start_offset, *end_node, end_offset);
+  SelectionPaintRange* new_range = MakeGarbageCollected<SelectionPaintRange>(
+      *start_node, start_offset, *end_node, end_offset);
   if (!RuntimeEnabledFeatures::LayoutNGEnabled())
     return {new_range, std::move(selected_objects)};
   return {ComputeNewPaintRange(*new_range), std::move(selected_objects)};
diff --git a/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_list_impl_test.cc b/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_list_impl_test.cc
index 5ea2177b..fa085a4 100644
--- a/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_list_impl_test.cc
+++ b/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_list_impl_test.cc
@@ -12,10 +12,10 @@
 class ActiveSuggestionMarkerListImplTest : public EditingTestBase {
  protected:
   ActiveSuggestionMarkerListImplTest()
-      : marker_list_(new ActiveSuggestionMarkerListImpl()) {}
+      : marker_list_(MakeGarbageCollected<ActiveSuggestionMarkerListImpl>()) {}
 
   DocumentMarker* CreateMarker(unsigned start_offset, unsigned end_offset) {
-    return new ActiveSuggestionMarker(
+    return MakeGarbageCollected<ActiveSuggestionMarker>(
         start_offset, end_offset, Color::kTransparent,
         ws::mojom::ImeTextSpanThickness::kThin, Color::kBlack);
   }
diff --git a/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_test.cc b/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_test.cc
index c73d81df7..d4921c6 100644
--- a/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_test.cc
+++ b/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_test.cc
@@ -13,28 +13,29 @@
 class ActiveSuggestionMarkerTest : public testing::Test {};
 
 TEST_F(ActiveSuggestionMarkerTest, MarkerType) {
-  DocumentMarker* marker = new ActiveSuggestionMarker(
+  DocumentMarker* marker = MakeGarbageCollected<ActiveSuggestionMarker>(
       0, 1, Color::kTransparent, ImeTextSpanThickness::kNone,
       Color::kTransparent);
   EXPECT_EQ(DocumentMarker::kActiveSuggestion, marker->GetType());
 }
 
 TEST_F(ActiveSuggestionMarkerTest, IsStyleableMarker) {
-  DocumentMarker* marker = new ActiveSuggestionMarker(
+  DocumentMarker* marker = MakeGarbageCollected<ActiveSuggestionMarker>(
       0, 1, Color::kTransparent, ImeTextSpanThickness::kNone,
       Color::kTransparent);
   EXPECT_TRUE(IsStyleableMarker(*marker));
 }
 
 TEST_F(ActiveSuggestionMarkerTest, ConstructorAndGetters) {
-  ActiveSuggestionMarker* marker = new ActiveSuggestionMarker(
+  ActiveSuggestionMarker* marker = MakeGarbageCollected<ActiveSuggestionMarker>(
       0, 1, Color::kDarkGray, ImeTextSpanThickness::kThin, Color::kGray);
   EXPECT_EQ(Color::kDarkGray, marker->UnderlineColor());
   EXPECT_FALSE(marker->HasThicknessThick());
   EXPECT_EQ(Color::kGray, marker->BackgroundColor());
 
-  ActiveSuggestionMarker* thick_marker = new ActiveSuggestionMarker(
-      0, 1, Color::kDarkGray, ImeTextSpanThickness::kThick, Color::kGray);
+  ActiveSuggestionMarker* thick_marker =
+      MakeGarbageCollected<ActiveSuggestionMarker>(
+          0, 1, Color::kDarkGray, ImeTextSpanThickness::kThick, Color::kGray);
   EXPECT_EQ(true, thick_marker->HasThicknessThick());
 }
 
diff --git a/third_party/blink/renderer/core/editing/markers/composition_marker_list_impl_test.cc b/third_party/blink/renderer/core/editing/markers/composition_marker_list_impl_test.cc
index c979e2857..fc7fd27 100644
--- a/third_party/blink/renderer/core/editing/markers/composition_marker_list_impl_test.cc
+++ b/third_party/blink/renderer/core/editing/markers/composition_marker_list_impl_test.cc
@@ -13,12 +13,12 @@
 class CompositionMarkerListImplTest : public EditingTestBase {
  protected:
   CompositionMarkerListImplTest()
-      : marker_list_(new CompositionMarkerListImpl()) {}
+      : marker_list_(MakeGarbageCollected<CompositionMarkerListImpl>()) {}
 
   DocumentMarker* CreateMarker(unsigned start_offset, unsigned end_offset) {
-    return new CompositionMarker(start_offset, end_offset, Color::kTransparent,
-                                 ws::mojom::ImeTextSpanThickness::kThin,
-                                 Color::kBlack);
+    return MakeGarbageCollected<CompositionMarker>(
+        start_offset, end_offset, Color::kTransparent,
+        ws::mojom::ImeTextSpanThickness::kThin, Color::kBlack);
   }
 
   Persistent<CompositionMarkerListImpl> marker_list_;
diff --git a/third_party/blink/renderer/core/editing/markers/composition_marker_test.cc b/third_party/blink/renderer/core/editing/markers/composition_marker_test.cc
index c088ffc..7414cfa6 100644
--- a/third_party/blink/renderer/core/editing/markers/composition_marker_test.cc
+++ b/third_party/blink/renderer/core/editing/markers/composition_marker_test.cc
@@ -13,27 +13,27 @@
 class CompositionMarkerTest : public testing::Test {};
 
 TEST_F(CompositionMarkerTest, MarkerType) {
-  DocumentMarker* marker =
-      new CompositionMarker(0, 1, Color::kTransparent,
-                            ImeTextSpanThickness::kNone, Color::kTransparent);
+  DocumentMarker* marker = MakeGarbageCollected<CompositionMarker>(
+      0, 1, Color::kTransparent, ImeTextSpanThickness::kNone,
+      Color::kTransparent);
   EXPECT_EQ(DocumentMarker::kComposition, marker->GetType());
 }
 
 TEST_F(CompositionMarkerTest, IsStyleableMarker) {
-  DocumentMarker* marker =
-      new CompositionMarker(0, 1, Color::kTransparent,
-                            ImeTextSpanThickness::kNone, Color::kTransparent);
+  DocumentMarker* marker = MakeGarbageCollected<CompositionMarker>(
+      0, 1, Color::kTransparent, ImeTextSpanThickness::kNone,
+      Color::kTransparent);
   EXPECT_TRUE(IsStyleableMarker(*marker));
 }
 
 TEST_F(CompositionMarkerTest, ConstructorAndGetters) {
-  CompositionMarker* marker = new CompositionMarker(
+  CompositionMarker* marker = MakeGarbageCollected<CompositionMarker>(
       0, 1, Color::kDarkGray, ImeTextSpanThickness::kThin, Color::kGray);
   EXPECT_EQ(Color::kDarkGray, marker->UnderlineColor());
   EXPECT_TRUE(marker->HasThicknessThin());
   EXPECT_EQ(Color::kGray, marker->BackgroundColor());
 
-  CompositionMarker* thick_marker = new CompositionMarker(
+  CompositionMarker* thick_marker = MakeGarbageCollected<CompositionMarker>(
       0, 1, Color::kDarkGray, ImeTextSpanThickness::kThick, Color::kGray);
   EXPECT_TRUE(thick_marker->HasThicknessThick());
 }
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
index ed4dbdf0..e5dbc2c2 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -87,9 +87,9 @@
 DocumentMarkerList* CreateListForType(DocumentMarker::MarkerType type) {
   switch (type) {
     case DocumentMarker::kActiveSuggestion:
-      return new ActiveSuggestionMarkerListImpl();
+      return MakeGarbageCollected<ActiveSuggestionMarkerListImpl>();
     case DocumentMarker::kComposition:
-      return new CompositionMarkerListImpl();
+      return MakeGarbageCollected<CompositionMarkerListImpl>();
     case DocumentMarker::kSpelling:
       return MakeGarbageCollected<SpellingMarkerListImpl>();
     case DocumentMarker::kGrammar:
@@ -187,8 +187,8 @@
   DCHECK(!document_->NeedsLayoutTreeUpdate());
   AddMarkerInternal(range, [underline_color, thickness, background_color](
                                int start_offset, int end_offset) {
-    return new CompositionMarker(start_offset, end_offset, underline_color,
-                                 thickness, background_color);
+    return MakeGarbageCollected<CompositionMarker>(
+        start_offset, end_offset, underline_color, thickness, background_color);
   });
 }
 
@@ -200,8 +200,8 @@
   DCHECK(!document_->NeedsLayoutTreeUpdate());
   AddMarkerInternal(range, [underline_color, thickness, background_color](
                                int start_offset, int end_offset) {
-    return new ActiveSuggestionMarker(start_offset, end_offset, underline_color,
-                                      thickness, background_color);
+    return MakeGarbageCollected<ActiveSuggestionMarker>(
+        start_offset, end_offset, underline_color, thickness, background_color);
   });
 }
 
diff --git a/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.cc b/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.cc
index d1f45225..e4d6b57 100644
--- a/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.cc
+++ b/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.cc
@@ -30,7 +30,7 @@
 // static
 ColdModeSpellCheckRequester* ColdModeSpellCheckRequester::Create(
     LocalFrame& frame) {
-  return new ColdModeSpellCheckRequester(frame);
+  return MakeGarbageCollected<ColdModeSpellCheckRequester>(frame);
 }
 
 void ColdModeSpellCheckRequester::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.h b/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.h
index 12fe2e3..cf73d780 100644
--- a/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.h
+++ b/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.h
@@ -25,6 +25,8 @@
  public:
   static ColdModeSpellCheckRequester* Create(LocalFrame&);
 
+  explicit ColdModeSpellCheckRequester(LocalFrame&);
+
   void SetNeedsMoreInvocationForTesting() {
     needs_more_invocation_for_testing_ = true;
   }
@@ -37,8 +39,6 @@
   void Trace(blink::Visitor*);
 
  private:
-  explicit ColdModeSpellCheckRequester(LocalFrame&);
-
   LocalFrame& GetFrame() const { return *frame_; }
   SpellCheckRequester& GetSpellCheckRequester() const;
 
diff --git a/third_party/blink/renderer/core/events/animation_event.h b/third_party/blink/renderer/core/events/animation_event.h
index 199d47f..9f468ca 100644
--- a/third_party/blink/renderer/core/events/animation_event.h
+++ b/third_party/blink/renderer/core/events/animation_event.h
@@ -35,19 +35,27 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static AnimationEvent* Create() { return new AnimationEvent; }
+  static AnimationEvent* Create() {
+    return (MakeGarbageCollected<AnimationEvent>());
+  }
   static AnimationEvent* Create(const AtomicString& type,
                                 const String& animation_name,
                                 double elapsed_time,
                                 const String& pseudo_element) {
-    return new AnimationEvent(type, animation_name, elapsed_time,
-                              pseudo_element);
+    return MakeGarbageCollected<AnimationEvent>(type, animation_name,
+                                                elapsed_time, pseudo_element);
   }
   static AnimationEvent* Create(const AtomicString& type,
                                 const AnimationEventInit* initializer) {
-    return new AnimationEvent(type, initializer);
+    return MakeGarbageCollected<AnimationEvent>(type, initializer);
   }
 
+  AnimationEvent();
+  AnimationEvent(const AtomicString& type,
+                 const String& animation_name,
+                 double elapsed_time,
+                 const String& pseudo_element);
+  AnimationEvent(const AtomicString&, const AnimationEventInit*);
   ~AnimationEvent() override;
 
   const String& animationName() const;
@@ -59,13 +67,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AnimationEvent();
-  AnimationEvent(const AtomicString& type,
-                 const String& animation_name,
-                 double elapsed_time,
-                 const String& pseudo_element);
-  AnimationEvent(const AtomicString&, const AnimationEventInit*);
-
   String animation_name_;
   double elapsed_time_;
   String pseudo_element_;
diff --git a/third_party/blink/renderer/core/events/animation_playback_event.h b/third_party/blink/renderer/core/events/animation_playback_event.h
index ed953d6..c69886e 100644
--- a/third_party/blink/renderer/core/events/animation_playback_event.h
+++ b/third_party/blink/renderer/core/events/animation_playback_event.h
@@ -18,14 +18,20 @@
   static AnimationPlaybackEvent* Create(const AtomicString& type,
                                         double current_time,
                                         double timeline_time) {
-    return new AnimationPlaybackEvent(type, current_time, timeline_time);
+    return MakeGarbageCollected<AnimationPlaybackEvent>(type, current_time,
+                                                        timeline_time);
   }
   static AnimationPlaybackEvent* Create(
       const AtomicString& type,
       const AnimationPlaybackEventInit* initializer) {
-    return new AnimationPlaybackEvent(type, initializer);
+    return MakeGarbageCollected<AnimationPlaybackEvent>(type, initializer);
   }
 
+  AnimationPlaybackEvent(const AtomicString& type,
+                         double current_time,
+                         double timeline_time);
+  AnimationPlaybackEvent(const AtomicString&,
+                         const AnimationPlaybackEventInit*);
   ~AnimationPlaybackEvent() override;
 
   double currentTime(bool& is_null) const;
@@ -36,12 +42,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AnimationPlaybackEvent(const AtomicString& type,
-                         double current_time,
-                         double timeline_time);
-  AnimationPlaybackEvent(const AtomicString&,
-                         const AnimationPlaybackEventInit*);
-
   base::Optional<double> current_time_;
   base::Optional<double> timeline_time_;
 };
diff --git a/third_party/blink/renderer/core/events/application_cache_error_event.h b/third_party/blink/renderer/core/events/application_cache_error_event.h
index c4822d2..0cd60cb2 100644
--- a/third_party/blink/renderer/core/events/application_cache_error_event.h
+++ b/third_party/blink/renderer/core/events/application_cache_error_event.h
@@ -17,6 +17,12 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
+  ApplicationCacheErrorEvent(WebApplicationCacheHost::ErrorReason,
+                             const String& url,
+                             int status,
+                             const String& message);
+  ApplicationCacheErrorEvent(const AtomicString& event_type,
+                             const ApplicationCacheErrorEventInit* initializer);
   ~ApplicationCacheErrorEvent() override;
 
   static ApplicationCacheErrorEvent* Create(
@@ -24,13 +30,15 @@
       const String& url,
       int status,
       const String& message) {
-    return new ApplicationCacheErrorEvent(reason, url, status, message);
+    return MakeGarbageCollected<ApplicationCacheErrorEvent>(reason, url, status,
+                                                            message);
   }
 
   static ApplicationCacheErrorEvent* Create(
       const AtomicString& event_type,
       const ApplicationCacheErrorEventInit* initializer) {
-    return new ApplicationCacheErrorEvent(event_type, initializer);
+    return MakeGarbageCollected<ApplicationCacheErrorEvent>(event_type,
+                                                            initializer);
   }
 
   const String& reason() const { return reason_; }
@@ -45,13 +53,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  ApplicationCacheErrorEvent(WebApplicationCacheHost::ErrorReason,
-                             const String& url,
-                             int status,
-                             const String& message);
-  ApplicationCacheErrorEvent(const AtomicString& event_type,
-                             const ApplicationCacheErrorEventInit* initializer);
-
   String reason_;
   String url_;
   int status_;
diff --git a/third_party/blink/renderer/core/events/before_text_inserted_event.h b/third_party/blink/renderer/core/events/before_text_inserted_event.h
index 13a5d26..d593f9e 100644
--- a/third_party/blink/renderer/core/events/before_text_inserted_event.h
+++ b/third_party/blink/renderer/core/events/before_text_inserted_event.h
@@ -32,10 +32,11 @@
 
 class BeforeTextInsertedEvent final : public Event {
  public:
+  explicit BeforeTextInsertedEvent(const String&);
   ~BeforeTextInsertedEvent() override;
 
   static BeforeTextInsertedEvent* Create(const String& text) {
-    return new BeforeTextInsertedEvent(text);
+    return MakeGarbageCollected<BeforeTextInsertedEvent>(text);
   }
 
   const AtomicString& InterfaceName() const override;
@@ -47,8 +48,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  explicit BeforeTextInsertedEvent(const String&);
-
   String text_;
 };
 
diff --git a/third_party/blink/renderer/core/events/before_unload_event.h b/third_party/blink/renderer/core/events/before_unload_event.h
index 6d73541..39d9fb8 100644
--- a/third_party/blink/renderer/core/events/before_unload_event.h
+++ b/third_party/blink/renderer/core/events/before_unload_event.h
@@ -34,9 +34,12 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
+  BeforeUnloadEvent();
   ~BeforeUnloadEvent() override;
 
-  static BeforeUnloadEvent* Create() { return new BeforeUnloadEvent; }
+  static BeforeUnloadEvent* Create() {
+    return MakeGarbageCollected<BeforeUnloadEvent>();
+  }
 
   bool IsBeforeUnloadEvent() const override;
 
@@ -52,8 +55,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  BeforeUnloadEvent();
-
   String return_value_;
 };
 
diff --git a/third_party/blink/renderer/core/events/clipboard_event.h b/third_party/blink/renderer/core/events/clipboard_event.h
index a0a8afb..a0f55a6 100644
--- a/third_party/blink/renderer/core/events/clipboard_event.h
+++ b/third_party/blink/renderer/core/events/clipboard_event.h
@@ -35,16 +35,18 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
+  ClipboardEvent(const AtomicString& type, DataTransfer* clipboard_data);
+  ClipboardEvent(const AtomicString& type, const ClipboardEventInit*);
   ~ClipboardEvent() override;
 
   static ClipboardEvent* Create(const AtomicString& type,
                                 DataTransfer* data_transfer) {
-    return new ClipboardEvent(type, data_transfer);
+    return MakeGarbageCollected<ClipboardEvent>(type, data_transfer);
   }
 
   static ClipboardEvent* Create(const AtomicString& type,
                                 const ClipboardEventInit* initializer) {
-    return new ClipboardEvent(type, initializer);
+    return MakeGarbageCollected<ClipboardEvent>(type, initializer);
   }
 
   DataTransfer* clipboardData() const { return clipboard_data_.Get(); }
@@ -52,10 +54,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  ClipboardEvent(const AtomicString& type,
-                 DataTransfer* clipboard_data);
-  ClipboardEvent(const AtomicString& type, const ClipboardEventInit*);
-
   const AtomicString& InterfaceName() const override;
   bool IsClipboardEvent() const override;
 
diff --git a/third_party/blink/renderer/core/events/composition_event.h b/third_party/blink/renderer/core/events/composition_event.h
index 6588fe28..ec3bc42 100644
--- a/third_party/blink/renderer/core/events/composition_event.h
+++ b/third_party/blink/renderer/core/events/composition_event.h
@@ -36,19 +36,24 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static CompositionEvent* Create() { return new CompositionEvent; }
+  static CompositionEvent* Create() {
+    return MakeGarbageCollected<CompositionEvent>();
+  }
 
   static CompositionEvent* Create(const AtomicString& type,
                                   AbstractView* view,
                                   const String& data) {
-    return new CompositionEvent(type, view, data);
+    return MakeGarbageCollected<CompositionEvent>(type, view, data);
   }
 
   static CompositionEvent* Create(const AtomicString& type,
                                   const CompositionEventInit* initializer) {
-    return new CompositionEvent(type, initializer);
+    return MakeGarbageCollected<CompositionEvent>(type, initializer);
   }
 
+  CompositionEvent();
+  CompositionEvent(const AtomicString& type, AbstractView*, const String&);
+  CompositionEvent(const AtomicString& type, const CompositionEventInit*);
   ~CompositionEvent() override;
 
   void initCompositionEvent(const AtomicString& type,
@@ -66,10 +71,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  CompositionEvent();
-  CompositionEvent(const AtomicString& type, AbstractView*, const String&);
-  CompositionEvent(const AtomicString& type, const CompositionEventInit*);
-
   String data_;
 };
 
diff --git a/third_party/blink/renderer/core/events/touch_event_test.cc b/third_party/blink/renderer/core/events/touch_event_test.cc
index 652db73..b987a51 100644
--- a/third_party/blink/renderer/core/events/touch_event_test.cc
+++ b/third_party/blink/renderer/core/events/touch_event_test.cc
@@ -47,7 +47,7 @@
 class TouchEventTest : public PageTestBase {
  public:
   void SetUp() override {
-    chrome_client_ = new ConsoleCapturingChromeClient();
+    chrome_client_ = MakeGarbageCollected<ConsoleCapturingChromeClient>();
     Page::PageClients clients;
     FillWithEmptyClients(clients);
     clients.chrome_client = chrome_client_.Get();
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
index 7520cb4..1f32b5e 100644
--- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
@@ -258,7 +258,8 @@
   session->Append(MakeGarbageCollected<InspectorEmulationAgent>(
       web_local_frame_impl_.Get()));
 
-  session->Append(new InspectorTestingAgent(inspected_frames));
+  session->Append(
+      MakeGarbageCollected<InspectorTestingAgent>(inspected_frames));
 
   // Call session init callbacks registered from higher layers.
   CoreInitializer::GetInstance().InitInspectorAgentSession(
@@ -307,7 +308,7 @@
           MakeGarbageCollected<InspectorResourceContainer>(inspected_frames_)),
       include_view_agents_(include_view_agents) {
   DCHECK(IsMainThread());
-  agent_ = new DevToolsAgent(
+  agent_ = MakeGarbageCollected<DevToolsAgent>(
       this, inspected_frames_.Get(), probe_sink_.Get(),
       web_local_frame_impl_->GetFrame()->GetInspectorTaskRunner(),
       Platform::Current()->GetIOTaskRunner());
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc
index 6a958b1..a024e06 100644
--- a/third_party/blink/renderer/core/exported/web_frame_test.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -44,8 +44,8 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/frame/frame_owner_element_type.h"
 #include "third_party/blink/public/common/page/launching_process_state.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/frame/find_in_page.mojom-shared.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_cache.h"
 #include "third_party/blink/public/platform/web_coalesced_input_event.h"
diff --git a/third_party/blink/renderer/core/exported/web_label_element.cc b/third_party/blink/renderer/core/exported/web_label_element.cc
index b889beb..2c4f8c3 100644
--- a/third_party/blink/renderer/core/exported/web_label_element.cc
+++ b/third_party/blink/renderer/core/exported/web_label_element.cc
@@ -32,7 +32,6 @@
 
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/renderer/core/html/forms/html_label_element.h"
-#include "third_party/blink/renderer/core/html/forms/labelable_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index 9246cf1..20e6131 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -242,15 +242,17 @@
 
 class EmptyEventListener final : public EventListener {
  public:
-  static EmptyEventListener* Create() { return new EmptyEventListener(); }
+  static EmptyEventListener* Create() {
+    return MakeGarbageCollected<EmptyEventListener>();
+  }
+
+  EmptyEventListener() : EventListener(kCPPEventListenerType) {}
 
   bool operator==(const EventListener& other) const override {
     return this == &other;
   }
 
  private:
-  EmptyEventListener() : EventListener(kCPPEventListenerType) {}
-
   void Invoke(ExecutionContext* execution_context, Event*) override {}
 };
 
diff --git a/third_party/blink/renderer/core/feature_policy/feature_policy_test.cc b/third_party/blink/renderer/core/feature_policy/feature_policy_test.cc
index 54d36ab..67012579 100644
--- a/third_party/blink/renderer/core/feature_policy/feature_policy_test.cc
+++ b/third_party/blink/renderer/core/feature_policy/feature_policy_test.cc
@@ -68,7 +68,7 @@
   ~FeaturePolicyParserTest() override = default;
 
   /*void SetUp() override {
-    chrome_client_ = new ConsoleCapturingChromeClient();
+    chrome_client_ = MakeGarbageCollected<ConsoleCapturingChromeClient>();
     Page::PageClients clients;
     FillWithEmptyClients(clients);
     clients.chrome_client = chrome_client_.Get();
diff --git a/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc b/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc
index 8a2581ef..fccd9f8 100644
--- a/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc
+++ b/third_party/blink/renderer/core/fetch/blob_bytes_consumer_test.cc
@@ -68,7 +68,7 @@
   scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob(body);
 
   BlobBytesConsumer* consumer =
-      new BlobBytesConsumer(&GetDocument(), blob_data_handle);
+      MakeGarbageCollected<BlobBytesConsumer>(&GetDocument(), blob_data_handle);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
   EXPECT_FALSE(DidStartLoading());
@@ -82,7 +82,9 @@
   EXPECT_FALSE(consumer->DrainAsFormData());
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
 
-  auto result = (new BytesConsumerTestUtil::TwoPhaseReader(consumer))->Run();
+  auto result =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(consumer))
+          ->Run();
   EXPECT_EQ(Result::kDone, result.first);
   EXPECT_EQ("hello, world",
             BytesConsumerTestUtil::CharVectorToString(result.second));
@@ -91,8 +93,9 @@
 TEST_F(BlobBytesConsumerTest, CancelBeforeStarting) {
   scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob("foo bar");
   BlobBytesConsumer* consumer =
-      new BlobBytesConsumer(&GetDocument(), blob_data_handle);
-  BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
+      MakeGarbageCollected<BlobBytesConsumer>(&GetDocument(), blob_data_handle);
+  BlobBytesConsumerTestClient* client =
+      MakeGarbageCollected<BlobBytesConsumerTestClient>();
   consumer->SetClient(client);
 
   consumer->Cancel();
@@ -108,8 +111,9 @@
 TEST_F(BlobBytesConsumerTest, CancelAfterStarting) {
   scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob("foo bar");
   BlobBytesConsumer* consumer =
-      new BlobBytesConsumer(&GetDocument(), blob_data_handle);
-  BlobBytesConsumerTestClient* client = new BlobBytesConsumerTestClient();
+      MakeGarbageCollected<BlobBytesConsumer>(&GetDocument(), blob_data_handle);
+  BlobBytesConsumerTestClient* client =
+      MakeGarbageCollected<BlobBytesConsumerTestClient>();
   consumer->SetClient(client);
 
   const char* buffer = nullptr;
@@ -129,7 +133,7 @@
   String body = "hello, world";
   scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob(body);
   BlobBytesConsumer* consumer =
-      new BlobBytesConsumer(&GetDocument(), blob_data_handle);
+      MakeGarbageCollected<BlobBytesConsumer>(&GetDocument(), blob_data_handle);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
   EXPECT_FALSE(DidStartLoading());
@@ -149,7 +153,7 @@
       "uuid", "", -1, CreateBlob("foo bar")->CloneBlobPtr().PassInterface());
   ;
   BlobBytesConsumer* consumer =
-      new BlobBytesConsumer(&GetDocument(), blob_data_handle);
+      MakeGarbageCollected<BlobBytesConsumer>(&GetDocument(), blob_data_handle);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
   EXPECT_FALSE(DidStartLoading());
@@ -169,7 +173,7 @@
       "uuid", "", -1, CreateBlob("foo bar")->CloneBlobPtr().PassInterface());
   ;
   BlobBytesConsumer* consumer =
-      new BlobBytesConsumer(&GetDocument(), blob_data_handle);
+      MakeGarbageCollected<BlobBytesConsumer>(&GetDocument(), blob_data_handle);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
   EXPECT_FALSE(DidStartLoading());
@@ -184,7 +188,7 @@
   String body = "hello, world";
   scoped_refptr<BlobDataHandle> blob_data_handle = CreateBlob(body);
   BlobBytesConsumer* consumer =
-      new BlobBytesConsumer(&GetDocument(), blob_data_handle);
+      MakeGarbageCollected<BlobBytesConsumer>(&GetDocument(), blob_data_handle);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
   EXPECT_FALSE(DidStartLoading());
@@ -202,7 +206,8 @@
 }
 
 TEST_F(BlobBytesConsumerTest, ConstructedFromNullHandle) {
-  BlobBytesConsumer* consumer = new BlobBytesConsumer(&GetDocument(), nullptr);
+  BlobBytesConsumer* consumer =
+      MakeGarbageCollected<BlobBytesConsumer>(&GetDocument(), nullptr);
   const char* buffer = nullptr;
   size_t available;
   EXPECT_EQ(BytesConsumer::PublicState::kClosed, consumer->GetPublicState());
diff --git a/third_party/blink/renderer/core/fetch/body.cc b/third_party/blink/renderer/core/fetch/body.cc
index ded0169..d4e91de 100644
--- a/third_party/blink/renderer/core/fetch/body.cc
+++ b/third_party/blink/renderer/core/fetch/body.cc
@@ -151,9 +151,10 @@
   ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
   ScriptPromise promise = resolver->Promise();
   if (BodyBuffer()) {
-    BodyBuffer()->StartLoading(FetchDataLoader::CreateLoaderAsArrayBuffer(),
-                               new BodyArrayBufferConsumer(resolver),
-                               exception_state);
+    BodyBuffer()->StartLoading(
+        FetchDataLoader::CreateLoaderAsArrayBuffer(),
+        MakeGarbageCollected<BodyArrayBufferConsumer>(resolver),
+        exception_state);
     if (exception_state.HadException()) {
       // Need to resolve the ScriptPromiseResolver to avoid a DCHECK().
       resolver->Resolve();
@@ -180,7 +181,7 @@
   if (BodyBuffer()) {
     BodyBuffer()->StartLoading(
         FetchDataLoader::CreateLoaderAsBlobHandle(MimeType()),
-        new BodyBlobConsumer(resolver), exception_state);
+        MakeGarbageCollected<BodyBlobConsumer>(resolver), exception_state);
     if (exception_state.HadException()) {
       // Need to resolve the ScriptPromiseResolver to avoid a DCHECK().
       resolver->Resolve();
@@ -216,7 +217,8 @@
     if (body_buffer && !boundary.IsEmpty()) {
       body_buffer->StartLoading(
           FetchDataLoader::CreateLoaderAsFormData(boundary),
-          new BodyFormDataConsumer(resolver), exception_state);
+          MakeGarbageCollected<BodyFormDataConsumer>(resolver),
+          exception_state);
       if (exception_state.HadException()) {
         // Need to resolve the ScriptPromiseResolver to avoid a DCHECK().
         resolver->Resolve();
@@ -226,9 +228,10 @@
     }
   } else if (parsedType == "application/x-www-form-urlencoded") {
     if (BodyBuffer()) {
-      BodyBuffer()->StartLoading(FetchDataLoader::CreateLoaderAsString(),
-                                 new BodyFormDataConsumer(resolver),
-                                 exception_state);
+      BodyBuffer()->StartLoading(
+          FetchDataLoader::CreateLoaderAsString(),
+          MakeGarbageCollected<BodyFormDataConsumer>(resolver),
+          exception_state);
       if (exception_state.HadException()) {
         // Need to resolve the ScriptPromiseResolver to avoid a DCHECK().
         resolver->Resolve();
@@ -240,9 +243,10 @@
     return promise;
   } else {
     if (BodyBuffer()) {
-      BodyBuffer()->StartLoading(FetchDataLoader::CreateLoaderAsFailure(),
-                                 new BodyFormDataConsumer(resolver),
-                                 exception_state);
+      BodyBuffer()->StartLoading(
+          FetchDataLoader::CreateLoaderAsFailure(),
+          MakeGarbageCollected<BodyFormDataConsumer>(resolver),
+          exception_state);
       if (exception_state.HadException()) {
         // Need to resolve the ScriptPromiseResolver to avoid a DCHECK().
         resolver->Resolve();
@@ -271,7 +275,8 @@
   ScriptPromise promise = resolver->Promise();
   if (BodyBuffer()) {
     BodyBuffer()->StartLoading(FetchDataLoader::CreateLoaderAsString(),
-                               new BodyJsonConsumer(resolver), exception_state);
+                               MakeGarbageCollected<BodyJsonConsumer>(resolver),
+                               exception_state);
     if (exception_state.HadException()) {
       // Need to resolve the ScriptPromiseResolver to avoid a DCHECK().
       resolver->Resolve();
@@ -298,7 +303,8 @@
   ScriptPromise promise = resolver->Promise();
   if (BodyBuffer()) {
     BodyBuffer()->StartLoading(FetchDataLoader::CreateLoaderAsString(),
-                               new BodyTextConsumer(resolver), exception_state);
+                               MakeGarbageCollected<BodyTextConsumer>(resolver),
+                               exception_state);
     if (exception_state.HadException()) {
       // Need to resolve the ScriptPromiseResolver to avoid a DCHECK().
       resolver->Resolve();
diff --git a/third_party/blink/renderer/core/fetch/body_stream_buffer.cc b/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
index d35b65a..69622f3 100644
--- a/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
+++ b/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
@@ -198,8 +198,9 @@
   auto* handle = ReleaseHandle(exception_state);
   if (exception_state.HadException())
     return;
-  loader->Start(handle, new LoaderClient(ExecutionContext::From(script_state_),
-                                         this, client));
+  loader->Start(handle,
+                MakeGarbageCollected<LoaderClient>(
+                    ExecutionContext::From(script_state_), this, client));
 }
 
 void BodyStreamBuffer::Tee(BodyStreamBuffer** branch1,
@@ -228,8 +229,8 @@
       return;
     }
 
-    *branch1 = new BodyStreamBuffer(script_state_, stream1);
-    *branch2 = new BodyStreamBuffer(script_state_, stream2);
+    *branch1 = MakeGarbageCollected<BodyStreamBuffer>(script_state_, stream1);
+    *branch2 = MakeGarbageCollected<BodyStreamBuffer>(script_state_, stream2);
     return;
   }
   BytesConsumer* dest1 = nullptr;
@@ -241,8 +242,10 @@
   }
   BytesConsumer::Tee(ExecutionContext::From(script_state_), handle, &dest1,
                      &dest2);
-  *branch1 = new BodyStreamBuffer(script_state_, dest1, signal_);
-  *branch2 = new BodyStreamBuffer(script_state_, dest2, signal_);
+  *branch1 =
+      MakeGarbageCollected<BodyStreamBuffer>(script_state_, dest1, signal_);
+  *branch2 =
+      MakeGarbageCollected<BodyStreamBuffer>(script_state_, dest2, signal_);
 }
 
 ScriptPromise BodyStreamBuffer::pull(ScriptState* script_state) {
diff --git a/third_party/blink/renderer/core/fetch/body_stream_buffer_test.cc b/third_party/blink/renderer/core/fetch/body_stream_buffer_test.cc
index 02464ac..66559e70 100644
--- a/third_party/blink/renderer/core/fetch/body_stream_buffer_test.cc
+++ b/third_party/blink/renderer/core/fetch/body_stream_buffer_test.cc
@@ -80,7 +80,7 @@
   // finished. Since most tests don't care about this, use NiceMock so that the
   // calls to Cancel() are ignored.
   static testing::NiceMock<MockFetchDataLoader>* Create() {
-    return new testing::NiceMock<MockFetchDataLoader>();
+    return MakeGarbageCollected<testing::NiceMock<MockFetchDataLoader>>();
   }
 
   MOCK_METHOD2(Start, void(BytesConsumer*, FetchDataLoader::Client*));
@@ -107,12 +107,12 @@
   EXPECT_CALL(checkpoint, Call(4));
 
   ReplayingBytesConsumer* src =
-      new ReplayingBytesConsumer(&scope.GetDocument());
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello, "));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "world"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
 
   BodyStreamBuffer* new1;
   BodyStreamBuffer* new2;
@@ -172,7 +172,7 @@
   EXPECT_CALL(checkpoint, Call(4));
 
   BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), stream);
+      MakeGarbageCollected<BodyStreamBuffer>(scope.GetScriptState(), stream);
 
   BodyStreamBuffer* new1;
   BodyStreamBuffer* new2;
@@ -212,9 +212,10 @@
   auto size = data->length();
   scoped_refptr<BlobDataHandle> blob_data_handle =
       BlobDataHandle::Create(std::move(data), size);
-  BodyStreamBuffer* buffer = new BodyStreamBuffer(
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
       scope.GetScriptState(),
-      new BlobBytesConsumer(scope.GetExecutionContext(), blob_data_handle),
+      MakeGarbageCollected<BlobBytesConsumer>(scope.GetExecutionContext(),
+                                              blob_data_handle),
       nullptr);
 
   EXPECT_FALSE(buffer->IsStreamLocked(ASSERT_NO_EXCEPTION).value_or(true));
@@ -234,9 +235,10 @@
 TEST_F(BodyStreamBufferTest, DrainAsBlobDataHandleReturnsNull) {
   V8TestingScope scope;
   // This BytesConsumer is not drainable.
-  BytesConsumer* src = new ReplayingBytesConsumer(&scope.GetDocument());
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  BytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
 
   EXPECT_FALSE(buffer->IsStreamLocked(ASSERT_NO_EXCEPTION).value_or(true));
   EXPECT_FALSE(buffer->IsStreamDisturbed(ASSERT_NO_EXCEPTION).value_or(true));
@@ -259,7 +261,7 @@
       ReadableStream::Create(scope.GetScriptState(), exception_state);
   ASSERT_TRUE(stream);
   BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), stream);
+      MakeGarbageCollected<BodyStreamBuffer>(scope.GetScriptState(), stream);
 
   EXPECT_FALSE(buffer->HasPendingActivity());
   EXPECT_FALSE(buffer->IsStreamLocked(exception_state).value_or(true));
@@ -284,11 +286,11 @@
   scoped_refptr<EncodedFormData> input_form_data =
       data->EncodeMultiPartFormData();
 
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(),
-                           MakeGarbageCollected<FormDataBytesConsumer>(
-                               scope.GetExecutionContext(), input_form_data),
-                           nullptr);
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(),
+      MakeGarbageCollected<FormDataBytesConsumer>(scope.GetExecutionContext(),
+                                                  input_form_data),
+      nullptr);
 
   EXPECT_FALSE(buffer->IsStreamLocked(ASSERT_NO_EXCEPTION).value_or(true));
   EXPECT_FALSE(buffer->IsStreamDisturbed(ASSERT_NO_EXCEPTION).value_or(true));
@@ -306,9 +308,10 @@
 TEST_F(BodyStreamBufferTest, DrainAsFormDataReturnsNull) {
   V8TestingScope scope;
   // This BytesConsumer is not drainable.
-  BytesConsumer* src = new ReplayingBytesConsumer(&scope.GetDocument());
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  BytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
 
   EXPECT_FALSE(buffer->IsStreamLocked(ASSERT_NO_EXCEPTION).value_or(true));
   EXPECT_FALSE(buffer->IsStreamDisturbed(ASSERT_NO_EXCEPTION).value_or(true));
@@ -328,7 +331,7 @@
   auto* stream =
       ReadableStream::Create(scope.GetScriptState(), exception_state);
   BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), stream);
+      MakeGarbageCollected<BodyStreamBuffer>(scope.GetScriptState(), stream);
 
   EXPECT_FALSE(buffer->HasPendingActivity());
   EXPECT_FALSE(buffer->IsStreamLocked(exception_state).value_or(true));
@@ -356,12 +359,12 @@
   EXPECT_CALL(checkpoint, Call(2));
 
   ReplayingBytesConsumer* src =
-      new ReplayingBytesConsumer(&scope.GetDocument());
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
   buffer->StartLoading(FetchDataLoader::CreateLoaderAsArrayBuffer(), client,
                        ASSERT_NO_EXCEPTION);
 
@@ -394,12 +397,12 @@
   EXPECT_CALL(checkpoint, Call(2));
 
   ReplayingBytesConsumer* src =
-      new ReplayingBytesConsumer(&scope.GetDocument());
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
   buffer->StartLoading(FetchDataLoader::CreateLoaderAsBlobHandle("text/plain"),
                        client, ASSERT_NO_EXCEPTION);
 
@@ -428,12 +431,12 @@
   EXPECT_CALL(checkpoint, Call(2));
 
   ReplayingBytesConsumer* src =
-      new ReplayingBytesConsumer(&scope.GetDocument());
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
   buffer->StartLoading(FetchDataLoader::CreateLoaderAsString(), client,
                        ASSERT_NO_EXCEPTION);
 
@@ -460,7 +463,7 @@
   EXPECT_CALL(*client, DidFetchDataLoadedString(String("")));
   EXPECT_CALL(checkpoint, Call(2));
 
-  BodyStreamBuffer* buffer = new BodyStreamBuffer(
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
       scope.GetScriptState(), BytesConsumer::CreateClosed(), nullptr);
 
   EXPECT_TRUE(buffer->IsStreamClosed(ASSERT_NO_EXCEPTION).value_or(false));
@@ -489,7 +492,7 @@
   EXPECT_CALL(*client, DidFetchDataLoadFailed());
   EXPECT_CALL(checkpoint, Call(2));
 
-  BodyStreamBuffer* buffer = new BodyStreamBuffer(
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
       scope.GetScriptState(),
       BytesConsumer::CreateErrored(BytesConsumer::Error()), nullptr);
 
@@ -520,12 +523,12 @@
   EXPECT_CALL(checkpoint, Call(2));
 
   ReplayingBytesConsumer* src =
-      new ReplayingBytesConsumer(&scope.GetDocument());
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
-  Persistent<BodyStreamBuffer> buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  Persistent<BodyStreamBuffer> buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
   buffer->StartLoading(FetchDataLoader::CreateLoaderAsString(), client,
                        ASSERT_NO_EXCEPTION);
 
@@ -538,11 +541,11 @@
 TEST_F(BodyStreamBufferTest, SourceShouldBeCanceledWhenCanceled) {
   V8TestingScope scope;
   ReplayingBytesConsumer* consumer =
-      new BytesConsumerTestUtil::ReplayingBytesConsumer(
+      MakeGarbageCollected<BytesConsumerTestUtil::ReplayingBytesConsumer>(
           scope.GetExecutionContext());
 
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), consumer, nullptr);
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), consumer, nullptr);
   ScriptValue reason(scope.GetScriptState(),
                      V8String(scope.GetScriptState()->GetIsolate(), "reason"));
   EXPECT_FALSE(consumer->IsCancelled());
@@ -553,12 +556,12 @@
 TEST_F(BodyStreamBufferTest, NestedPull) {
   V8TestingScope scope;
   ReplayingBytesConsumer* src =
-      new ReplayingBytesConsumer(&scope.GetDocument());
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kError));
-  Persistent<BodyStreamBuffer> buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  Persistent<BodyStreamBuffer> buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
 
   auto result =
       scope.GetScriptState()->GetContext()->Global()->CreateDataProperty(
@@ -583,9 +586,10 @@
 TEST_F(BodyStreamBufferTest, NullAbortSignalIsNotAborted) {
   V8TestingScope scope;
   // This BytesConsumer is not drainable.
-  BytesConsumer* src = new ReplayingBytesConsumer(&scope.GetDocument());
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, nullptr);
+  BytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, nullptr);
 
   EXPECT_FALSE(buffer->IsAborted());
 }
@@ -593,10 +597,11 @@
 TEST_F(BodyStreamBufferTest, AbortSignalMakesAborted) {
   V8TestingScope scope;
   // This BytesConsumer is not drainable.
-  BytesConsumer* src = new ReplayingBytesConsumer(&scope.GetDocument());
-  auto* signal = new AbortSignal(scope.GetExecutionContext());
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, signal);
+  BytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&scope.GetDocument());
+  auto* signal = MakeGarbageCollected<AbortSignal>(scope.GetExecutionContext());
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, signal);
 
   EXPECT_FALSE(buffer->IsAborted());
   signal->SignalAbort();
@@ -626,9 +631,9 @@
 
   EXPECT_CALL(checkpoint, Call(3));
 
-  auto* signal = new AbortSignal(scope.GetExecutionContext());
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, signal);
+  auto* signal = MakeGarbageCollected<AbortSignal>(scope.GetExecutionContext());
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, signal);
 
   checkpoint.Call(1);
   signal->SignalAbort();
@@ -660,9 +665,9 @@
 
   EXPECT_CALL(checkpoint, Call(3));
 
-  auto* signal = new AbortSignal(scope.GetExecutionContext());
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, signal);
+  auto* signal = MakeGarbageCollected<AbortSignal>(scope.GetExecutionContext());
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, signal);
 
   checkpoint.Call(1);
   buffer->StartLoading(loader, client, ASSERT_NO_EXCEPTION);
@@ -695,9 +700,9 @@
 
   EXPECT_CALL(checkpoint, Call(3));
 
-  auto* signal = new AbortSignal(scope.GetExecutionContext());
-  BodyStreamBuffer* buffer =
-      new BodyStreamBuffer(scope.GetScriptState(), src, signal);
+  auto* signal = MakeGarbageCollected<AbortSignal>(scope.GetExecutionContext());
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
+      scope.GetScriptState(), src, signal);
 
   checkpoint.Call(1);
   buffer->StartLoading(loader, client, ASSERT_NO_EXCEPTION);
diff --git a/third_party/blink/renderer/core/fetch/bytes_consumer.cc b/third_party/blink/renderer/core/fetch/bytes_consumer.cc
index 55c3821..ab36aedb 100644
--- a/third_party/blink/renderer/core/fetch/bytes_consumer.cc
+++ b/third_party/blink/renderer/core/fetch/bytes_consumer.cc
@@ -37,8 +37,10 @@
  public:
   TeeHelper(ExecutionContext* execution_context, BytesConsumer* consumer)
       : src_(consumer),
-        destination1_(new Destination(execution_context, this)),
-        destination2_(new Destination(execution_context, this)) {
+        destination1_(
+            MakeGarbageCollected<Destination>(execution_context, this)),
+        destination2_(
+            MakeGarbageCollected<Destination>(execution_context, this)) {
     consumer->SetClient(this);
     // As no client is set to either destinations, Destination::notify() is
     // no-op in this function.
@@ -63,7 +65,8 @@
       }
       Chunk* chunk = nullptr;
       if (result == Result::kOk) {
-        chunk = new Chunk(buffer, SafeCast<wtf_size_t>(available));
+        chunk = MakeGarbageCollected<Chunk>(buffer,
+                                            SafeCast<wtf_size_t>(available));
         result = src_->EndRead(available);
       }
       switch (result) {
@@ -367,22 +370,24 @@
   if (blob_data_handle) {
     // Register a client in order to be consistent.
     src->SetClient(new NoopClient);
-    *dest1 = new BlobBytesConsumer(execution_context, blob_data_handle);
-    *dest2 = new BlobBytesConsumer(execution_context, blob_data_handle);
+    *dest1 = MakeGarbageCollected<BlobBytesConsumer>(execution_context,
+                                                     blob_data_handle);
+    *dest2 = MakeGarbageCollected<BlobBytesConsumer>(execution_context,
+                                                     blob_data_handle);
     return;
   }
 
-  TeeHelper* tee = new TeeHelper(execution_context, src);
+  TeeHelper* tee = MakeGarbageCollected<TeeHelper>(execution_context, src);
   *dest1 = tee->Destination1();
   *dest2 = tee->Destination2();
 }
 
 BytesConsumer* BytesConsumer::CreateErrored(const BytesConsumer::Error& error) {
-  return new ErroredBytesConsumer(error);
+  return MakeGarbageCollected<ErroredBytesConsumer>(error);
 }
 
 BytesConsumer* BytesConsumer::CreateClosed() {
-  return new ClosedBytesConsumer();
+  return MakeGarbageCollected<ClosedBytesConsumer>();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/bytes_consumer_for_data_consumer_handle_test.cc b/third_party/blink/renderer/core/fetch/bytes_consumer_for_data_consumer_handle_test.cc
index ef9b5ef1..51bff88 100644
--- a/third_party/blink/renderer/core/fetch/bytes_consumer_for_data_consumer_handle_test.cc
+++ b/third_party/blink/renderer/core/fetch/bytes_consumer_for_data_consumer_handle_test.cc
@@ -40,7 +40,7 @@
 
  public:
   static MockBytesConsumerClient* Create() {
-    return new testing::StrictMock<MockBytesConsumerClient>();
+    return MakeGarbageCollected<testing::StrictMock<MockBytesConsumerClient>>();
   }
   MOCK_METHOD0(OnStateChange, void());
   String DebugName() const override { return "MockBytesConsumerClient"; }
@@ -62,7 +62,7 @@
     void Trace(blink::Visitor* visitor) {}
   };
 
-  MockDataConsumerHandle() : proxy_(new MockReaderProxy) {}
+  MockDataConsumerHandle() : proxy_(MakeGarbageCollected<MockReaderProxy>()) {}
   MockReaderProxy* Proxy() { return proxy_; }
   const char* DebugName() const override { return "MockDataConsumerHandle"; }
 
@@ -96,7 +96,8 @@
   handle->Add(DataConsumerCommand(DataConsumerCommand::kData, "hello"));
   handle->Add(DataConsumerCommand(DataConsumerCommand::kDone));
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
 }
 
 TEST_F(BytesConsumerForDataConsumerHandleTest, BecomeReadable) {
@@ -112,7 +113,8 @@
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   handle->Add(DataConsumerCommand(DataConsumerCommand::kData, "hello"));
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(client);
   EXPECT_EQ(BytesConsumer::PublicState::kReadableOrWaiting,
             consumer->GetPublicState());
@@ -137,7 +139,8 @@
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   handle->Add(DataConsumerCommand(DataConsumerCommand::kDone));
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(client);
   EXPECT_EQ(BytesConsumer::PublicState::kReadableOrWaiting,
             consumer->GetPublicState());
@@ -161,7 +164,8 @@
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   handle->Add(DataConsumerCommand(DataConsumerCommand::kError));
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(client);
   EXPECT_EQ(BytesConsumer::PublicState::kReadableOrWaiting,
             consumer->GetPublicState());
@@ -184,7 +188,8 @@
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   handle->Add(DataConsumerCommand(DataConsumerCommand::kError));
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(client);
   consumer->ClearClient();
 
@@ -197,7 +202,8 @@
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   handle->Add(DataConsumerCommand(DataConsumerCommand::kData, "hello"));
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(MockBytesConsumerClient::Create());
 
   const char* buffer = nullptr;
@@ -216,7 +222,8 @@
 TEST_F(BytesConsumerForDataConsumerHandleTest, TwoPhaseReadWhenWaiting) {
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(MockBytesConsumerClient::Create());
   const char* buffer = nullptr;
   size_t available = 0;
@@ -227,7 +234,8 @@
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   handle->Add(DataConsumerCommand(DataConsumerCommand::kDone));
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(MockBytesConsumerClient::Create());
   const char* buffer = nullptr;
   size_t available = 0;
@@ -238,7 +246,8 @@
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   handle->Add(DataConsumerCommand(DataConsumerCommand::kError));
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(MockBytesConsumerClient::Create());
   const char* buffer = nullptr;
   size_t available = 0;
@@ -249,7 +258,8 @@
 TEST_F(BytesConsumerForDataConsumerHandleTest, Cancel) {
   std::unique_ptr<ReplayingHandle> handle = ReplayingHandle::Create();
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(MockBytesConsumerClient::Create());
   consumer->Cancel();
   const char* buffer = nullptr;
@@ -264,7 +274,8 @@
       std::make_unique<MockDataConsumerHandle>();
   Persistent<MockDataConsumerHandle::MockReaderProxy> proxy = handle->Proxy();
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(MockBytesConsumerClient::Create());
 
   Checkpoint checkpoint;
@@ -283,7 +294,8 @@
       std::make_unique<MockDataConsumerHandle>();
   Persistent<MockDataConsumerHandle::MockReaderProxy> proxy = handle->Proxy();
   Persistent<BytesConsumer> consumer =
-      new BytesConsumerForDataConsumerHandle(&GetDocument(), std::move(handle));
+      MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+          &GetDocument(), std::move(handle));
   consumer->SetClient(MockBytesConsumerClient::Create());
 
   Checkpoint checkpoint;
diff --git a/third_party/blink/renderer/core/fetch/bytes_consumer_test.cc b/third_party/blink/renderer/core/fetch/bytes_consumer_test.cc
index e709975..8723d38 100644
--- a/third_party/blink/renderer/core/fetch/bytes_consumer_test.cc
+++ b/third_party/blink/renderer/core/fetch/bytes_consumer_test.cc
@@ -83,7 +83,8 @@
 };
 
 TEST_F(BytesConsumerTeeTest, CreateDone) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
   EXPECT_FALSE(src->IsCancelled());
 
@@ -91,8 +92,12 @@
   BytesConsumer* dest2 = nullptr;
   BytesConsumer::Tee(&GetDocument(), src, &dest1, &dest2);
 
-  auto result1 = (new BytesConsumerTestUtil::TwoPhaseReader(dest1))->Run();
-  auto result2 = (new BytesConsumerTestUtil::TwoPhaseReader(dest2))->Run();
+  auto result1 =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest1))
+          ->Run();
+  auto result2 =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest2))
+          ->Run();
 
   EXPECT_EQ(Result::kDone, result1.first);
   EXPECT_TRUE(result1.second.IsEmpty());
@@ -111,7 +116,8 @@
 }
 
 TEST_F(BytesConsumerTeeTest, TwoPhaseRead) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
 
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello, "));
@@ -130,8 +136,12 @@
   EXPECT_EQ(BytesConsumer::PublicState::kReadableOrWaiting,
             dest2->GetPublicState());
 
-  auto result1 = (new BytesConsumerTestUtil::TwoPhaseReader(dest1))->Run();
-  auto result2 = (new BytesConsumerTestUtil::TwoPhaseReader(dest2))->Run();
+  auto result1 =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest1))
+          ->Run();
+  auto result2 =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest2))
+          ->Run();
 
   EXPECT_EQ(Result::kDone, result1.first);
   EXPECT_EQ("hello, world",
@@ -145,7 +155,8 @@
 }
 
 TEST_F(BytesConsumerTeeTest, Error) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
 
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello, "));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "world"));
@@ -158,8 +169,12 @@
   EXPECT_EQ(BytesConsumer::PublicState::kErrored, dest1->GetPublicState());
   EXPECT_EQ(BytesConsumer::PublicState::kErrored, dest2->GetPublicState());
 
-  auto result1 = (new BytesConsumerTestUtil::TwoPhaseReader(dest1))->Run();
-  auto result2 = (new BytesConsumerTestUtil::TwoPhaseReader(dest2))->Run();
+  auto result1 =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest1))
+          ->Run();
+  auto result2 =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest2))
+          ->Run();
 
   EXPECT_EQ(Result::kError, result1.first);
   EXPECT_TRUE(result1.second.IsEmpty());
@@ -178,7 +193,8 @@
 }
 
 TEST_F(BytesConsumerTeeTest, Cancel) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
 
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello, "));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
@@ -205,7 +221,8 @@
 }
 
 TEST_F(BytesConsumerTeeTest, CancelShouldNotAffectTheOtherDestination) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
 
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello, "));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
@@ -228,7 +245,9 @@
             dest2->GetPublicState());
   EXPECT_FALSE(src->IsCancelled());
 
-  auto result2 = (new BytesConsumerTestUtil::TwoPhaseReader(dest2))->Run();
+  auto result2 =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest2))
+          ->Run();
 
   EXPECT_EQ(BytesConsumer::PublicState::kClosed, dest1->GetPublicState());
   EXPECT_EQ(BytesConsumer::PublicState::kClosed, dest2->GetPublicState());
@@ -239,7 +258,8 @@
 }
 
 TEST_F(BytesConsumerTeeTest, CancelShouldNotAffectTheOtherDestination2) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
 
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "hello, "));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
@@ -262,7 +282,9 @@
             dest2->GetPublicState());
   EXPECT_FALSE(src->IsCancelled());
 
-  auto result2 = (new BytesConsumerTestUtil::TwoPhaseReader(dest2))->Run();
+  auto result2 =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest2))
+          ->Run();
 
   EXPECT_EQ(BytesConsumer::PublicState::kClosed, dest1->GetPublicState());
   EXPECT_EQ(BytesConsumer::PublicState::kErrored, dest2->GetPublicState());
@@ -273,7 +295,8 @@
 TEST_F(BytesConsumerTeeTest, BlobHandle) {
   scoped_refptr<BlobDataHandle> blob_data_handle =
       BlobDataHandle::Create(BlobData::Create(), 12345);
-  BytesConsumer* src = new FakeBlobBytesConsumer(blob_data_handle);
+  BytesConsumer* src =
+      MakeGarbageCollected<FakeBlobBytesConsumer>(blob_data_handle);
 
   BytesConsumer* dest1 = nullptr;
   BytesConsumer* dest2 = nullptr;
@@ -294,7 +317,8 @@
 TEST_F(BytesConsumerTeeTest, BlobHandleWithInvalidSize) {
   scoped_refptr<BlobDataHandle> blob_data_handle =
       BlobDataHandle::Create(BlobData::Create(), -1);
-  BytesConsumer* src = new FakeBlobBytesConsumer(blob_data_handle);
+  BytesConsumer* src =
+      MakeGarbageCollected<FakeBlobBytesConsumer>(blob_data_handle);
 
   BytesConsumer* dest1 = nullptr;
   BytesConsumer* dest2 = nullptr;
@@ -312,7 +336,8 @@
 }
 
 TEST_F(BytesConsumerTeeTest, ConsumerCanBeErroredInTwoPhaseRead) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "a"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kError));
@@ -320,7 +345,8 @@
   BytesConsumer* dest1 = nullptr;
   BytesConsumer* dest2 = nullptr;
   BytesConsumer::Tee(&GetDocument(), src, &dest1, &dest2);
-  BytesConsumerTestClient* client = new BytesConsumerTestClient();
+  BytesConsumerTestClient* client =
+      MakeGarbageCollected<BytesConsumerTestClient>();
   dest1->SetClient(client);
 
   const char* buffer = nullptr;
@@ -332,7 +358,9 @@
             dest1->GetPublicState());
   int num_on_state_change_called = client->NumOnStateChangeCalled();
   EXPECT_EQ(Result::kError,
-            (new BytesConsumerTestUtil::TwoPhaseReader(dest2))->Run().first);
+            (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(dest2))
+                ->Run()
+                .first);
   EXPECT_EQ(BytesConsumer::PublicState::kErrored, dest1->GetPublicState());
   EXPECT_EQ(num_on_state_change_called + 1, client->NumOnStateChangeCalled());
   EXPECT_EQ('a', buffer[0]);
@@ -341,11 +369,13 @@
 
 TEST_F(BytesConsumerTeeTest,
        AsyncNotificationShouldBeDispatchedWhenAllDataIsConsumed) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "a"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kWait));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
-  BytesConsumerTestClient* client = new BytesConsumerTestClient();
+  BytesConsumerTestClient* client =
+      MakeGarbageCollected<BytesConsumerTestClient>();
 
   BytesConsumer* dest1 = nullptr;
   BytesConsumer* dest2 = nullptr;
@@ -377,10 +407,12 @@
 
 TEST_F(BytesConsumerTeeTest,
        AsyncCloseNotificationShouldBeCancelledBySubsequentReadCall) {
-  ReplayingBytesConsumer* src = new ReplayingBytesConsumer(&GetDocument());
+  ReplayingBytesConsumer* src =
+      MakeGarbageCollected<ReplayingBytesConsumer>(&GetDocument());
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "a"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
-  BytesConsumerTestClient* client = new BytesConsumerTestClient();
+  BytesConsumerTestClient* client =
+      MakeGarbageCollected<BytesConsumerTestClient>();
 
   BytesConsumer* dest1 = nullptr;
   BytesConsumer* dest2 = nullptr;
diff --git a/third_party/blink/renderer/core/fetch/bytes_consumer_test_util.h b/third_party/blink/renderer/core/fetch/bytes_consumer_test_util.h
index 17acda4e..bada1c0 100644
--- a/third_party/blink/renderer/core/fetch/bytes_consumer_test_util.h
+++ b/third_party/blink/renderer/core/fetch/bytes_consumer_test_util.h
@@ -24,7 +24,7 @@
   class MockBytesConsumer : public BytesConsumer {
    public:
     static MockBytesConsumer* Create() {
-      return new testing::StrictMock<MockBytesConsumer>();
+      return MakeGarbageCollected<testing::StrictMock<MockBytesConsumer>>();
     }
 
     MOCK_METHOD2(BeginRead, Result(const char**, size_t*));
@@ -51,7 +51,8 @@
 
    public:
     static testing::StrictMock<MockFetchDataLoaderClient>* Create() {
-      return new testing::StrictMock<MockFetchDataLoaderClient>;
+      return MakeGarbageCollected<
+          testing::StrictMock<MockFetchDataLoaderClient>>();
     }
 
     void Trace(blink::Visitor* visitor) override {
diff --git a/third_party/blink/renderer/core/fetch/data_pipe_bytes_consumer.cc b/third_party/blink/renderer/core/fetch/data_pipe_bytes_consumer.cc
index fb3eaf8..4ae5f2d 100644
--- a/third_party/blink/renderer/core/fetch/data_pipe_bytes_consumer.cc
+++ b/third_party/blink/renderer/core/fetch/data_pipe_bytes_consumer.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
 namespace blink {
 
@@ -39,7 +40,7 @@
                mojo::SimpleWatcher::ArmingPolicy::MANUAL,
                execution_context->GetTaskRunner(TaskType::kNetworking)) {
   DCHECK(data_pipe_.is_valid());
-  *notifier = new CompletionNotifier(this);
+  *notifier = MakeGarbageCollected<CompletionNotifier>(this);
   watcher_.Watch(
       data_pipe_.get(),
       MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
@@ -96,7 +97,7 @@
   DCHECK(is_in_two_phase_read_);
   is_in_two_phase_read_ = false;
   DCHECK(IsReadableOrWaiting());
-  MojoResult rv = data_pipe_->EndReadData(read);
+  MojoResult rv = data_pipe_->EndReadData(SafeCast<uint32_t>(read));
   if (rv != MOJO_RESULT_OK) {
     SetError(Error("error"));
     return Result::kError;
diff --git a/third_party/blink/renderer/core/fetch/data_pipe_bytes_consumer_test.cc b/third_party/blink/renderer/core/fetch/data_pipe_bytes_consumer_test.cc
index 843a98e6..ac21f5dc 100644
--- a/third_party/blink/renderer/core/fetch/data_pipe_bytes_consumer_test.cc
+++ b/third_party/blink/renderer/core/fetch/data_pipe_bytes_consumer_test.cc
@@ -33,10 +33,12 @@
   pipe.producer_handle.reset();
 
   DataPipeBytesConsumer::CompletionNotifier* notifier = nullptr;
-  DataPipeBytesConsumer* consumer = new DataPipeBytesConsumer(
+  DataPipeBytesConsumer* consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
       &GetDocument(), std::move(pipe.consumer_handle), &notifier);
   notifier->SignalComplete();
-  auto result = (new BytesConsumerTestUtil::TwoPhaseReader(consumer))->Run();
+  auto result =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(consumer))
+          ->Run();
   EXPECT_EQ(Result::kDone, result.first);
   EXPECT_EQ(
       kData,
@@ -58,14 +60,16 @@
   pipe.producer_handle.reset();
 
   DataPipeBytesConsumer::CompletionNotifier* notifier = nullptr;
-  DataPipeBytesConsumer* consumer = new DataPipeBytesConsumer(
+  DataPipeBytesConsumer* consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
       &GetDocument(), std::move(pipe.consumer_handle), &notifier);
 
   // Then explicitly signal an error.  This should override the pipe completion
   // and result in kError.
   notifier->SignalError(BytesConsumer::Error());
 
-  auto result = (new BytesConsumerTestUtil::TwoPhaseReader(consumer))->Run();
+  auto result =
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(consumer))
+          ->Run();
   EXPECT_EQ(Result::kError, result.first);
   EXPECT_TRUE(result.second.IsEmpty());
 }
@@ -78,7 +82,7 @@
   ASSERT_TRUE(pipe.producer_handle.is_valid());
 
   DataPipeBytesConsumer::CompletionNotifier* notifier = nullptr;
-  DataPipeBytesConsumer* consumer = new DataPipeBytesConsumer(
+  DataPipeBytesConsumer* consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
       &GetDocument(), std::move(pipe.consumer_handle), &notifier);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
@@ -106,7 +110,7 @@
   ASSERT_TRUE(pipe.producer_handle.is_valid());
 
   DataPipeBytesConsumer::CompletionNotifier* notifier = nullptr;
-  DataPipeBytesConsumer* consumer = new DataPipeBytesConsumer(
+  DataPipeBytesConsumer* consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
       &GetDocument(), std::move(pipe.consumer_handle), &notifier);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
@@ -137,7 +141,7 @@
   ASSERT_TRUE(pipe.producer_handle.is_valid());
 
   DataPipeBytesConsumer::CompletionNotifier* notifier = nullptr;
-  DataPipeBytesConsumer* consumer = new DataPipeBytesConsumer(
+  DataPipeBytesConsumer* consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
       &GetDocument(), std::move(pipe.consumer_handle), &notifier);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
@@ -165,7 +169,7 @@
   ASSERT_TRUE(pipe.producer_handle.is_valid());
 
   DataPipeBytesConsumer::CompletionNotifier* notifier = nullptr;
-  DataPipeBytesConsumer* consumer = new DataPipeBytesConsumer(
+  DataPipeBytesConsumer* consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
       &GetDocument(), std::move(pipe.consumer_handle), &notifier);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
@@ -195,7 +199,7 @@
   ASSERT_TRUE(pipe.producer_handle.is_valid());
 
   DataPipeBytesConsumer::CompletionNotifier* notifier = nullptr;
-  DataPipeBytesConsumer* consumer = new DataPipeBytesConsumer(
+  DataPipeBytesConsumer* consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
       &GetDocument(), std::move(pipe.consumer_handle), &notifier);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
@@ -225,7 +229,7 @@
   ASSERT_TRUE(pipe.producer_handle.is_valid());
 
   DataPipeBytesConsumer::CompletionNotifier* notifier = nullptr;
-  DataPipeBytesConsumer* consumer = new DataPipeBytesConsumer(
+  DataPipeBytesConsumer* consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
       &GetDocument(), std::move(pipe.consumer_handle), &notifier);
 
   EXPECT_EQ(PublicState::kReadableOrWaiting, consumer->GetPublicState());
diff --git a/third_party/blink/renderer/core/fetch/fetch_data_loader.cc b/third_party/blink/renderer/core/fetch/fetch_data_loader.cc
index 8a5f6e0..f36cf01 100644
--- a/third_party/blink/renderer/core/fetch/fetch_data_loader.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_data_loader.cc
@@ -627,29 +627,30 @@
 
 FetchDataLoader* FetchDataLoader::CreateLoaderAsBlobHandle(
     const String& mime_type) {
-  return new FetchDataLoaderAsBlobHandle(mime_type);
+  return MakeGarbageCollected<FetchDataLoaderAsBlobHandle>(mime_type);
 }
 
 FetchDataLoader* FetchDataLoader::CreateLoaderAsArrayBuffer() {
-  return new FetchDataLoaderAsArrayBuffer();
+  return MakeGarbageCollected<FetchDataLoaderAsArrayBuffer>();
 }
 
 FetchDataLoader* FetchDataLoader::CreateLoaderAsFailure() {
-  return new FetchDataLoaderAsFailure();
+  return MakeGarbageCollected<FetchDataLoaderAsFailure>();
 }
 
 FetchDataLoader* FetchDataLoader::CreateLoaderAsFormData(
     const String& multipartBoundary) {
-  return new FetchDataLoaderAsFormData(multipartBoundary);
+  return MakeGarbageCollected<FetchDataLoaderAsFormData>(multipartBoundary);
 }
 
 FetchDataLoader* FetchDataLoader::CreateLoaderAsString() {
-  return new FetchDataLoaderAsString();
+  return MakeGarbageCollected<FetchDataLoaderAsString>();
 }
 
 FetchDataLoader* FetchDataLoader::CreateLoaderAsDataPipe(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  return new FetchDataLoaderAsDataPipe(std::move(task_runner));
+  return MakeGarbageCollected<FetchDataLoaderAsDataPipe>(
+      std::move(task_runner));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/fetch_manager.cc b/third_party/blink/renderer/core/fetch/fetch_manager.cc
index c14847a..aed3d00 100644
--- a/third_party/blink/renderer/core/fetch/fetch_manager.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_manager.cc
@@ -534,15 +534,17 @@
   FetchResponseData* response_data = nullptr;
   SRIBytesConsumer* sri_consumer = nullptr;
   if (fetch_request_data_->Integrity().IsEmpty()) {
-    response_data = FetchResponseData::CreateWithBuffer(new BodyStreamBuffer(
-        script_state,
-        new BytesConsumerForDataConsumerHandle(
-            ExecutionContext::From(script_state), std::move(handle)),
-        signal_));
-  } else {
-    sri_consumer = new SRIBytesConsumer();
     response_data = FetchResponseData::CreateWithBuffer(
-        new BodyStreamBuffer(script_state, sri_consumer, signal_));
+        MakeGarbageCollected<BodyStreamBuffer>(
+            script_state,
+            MakeGarbageCollected<BytesConsumerForDataConsumerHandle>(
+                ExecutionContext::From(script_state), std::move(handle)),
+            signal_));
+  } else {
+    sri_consumer = MakeGarbageCollected<SRIBytesConsumer>();
+    response_data = FetchResponseData::CreateWithBuffer(
+        MakeGarbageCollected<BodyStreamBuffer>(script_state, sri_consumer,
+                                               signal_));
   }
   response_data->SetStatus(response.HttpStatusCode());
   if (response.Url().ProtocolIsAbout() || response.Url().ProtocolIsData() ||
diff --git a/third_party/blink/renderer/core/fetch/fetch_request_data.cc b/third_party/blink/renderer/core/fetch/fetch_request_data.cc
index 28ef8e1..5e4eb3d5 100644
--- a/third_party/blink/renderer/core/fetch/fetch_request_data.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_request_data.cc
@@ -35,16 +35,17 @@
        it != web_request.Headers().end(); ++it)
     request->header_list_->Append(it->key, it->value);
   if (scoped_refptr<EncodedFormData> body = web_request.Body()) {
-    request->SetBuffer(new BodyStreamBuffer(
+    request->SetBuffer(MakeGarbageCollected<BodyStreamBuffer>(
         script_state,
         MakeGarbageCollected<FormDataBytesConsumer>(
             ExecutionContext::From(script_state), std::move(body)),
         nullptr /* AbortSignal */));
   } else if (web_request.GetBlobDataHandle()) {
-    request->SetBuffer(new BodyStreamBuffer(
+    request->SetBuffer(MakeGarbageCollected<BodyStreamBuffer>(
         script_state,
-        new BlobBytesConsumer(ExecutionContext::From(script_state),
-                              web_request.GetBlobDataHandle()),
+        MakeGarbageCollected<BlobBytesConsumer>(
+            ExecutionContext::From(script_state),
+            web_request.GetBlobDataHandle()),
         nullptr /* AbortSignal */));
   }
   request->SetContext(web_request.GetRequestContext());
@@ -78,10 +79,10 @@
     request->header_list_->Append(pair.key, pair.value);
   }
   if (fetch_api_request.blob) {
-    request->SetBuffer(new BodyStreamBuffer(
+    request->SetBuffer(MakeGarbageCollected<BodyStreamBuffer>(
         script_state,
-        new BlobBytesConsumer(ExecutionContext::From(script_state),
-                              fetch_api_request.blob),
+        MakeGarbageCollected<BlobBytesConsumer>(
+            ExecutionContext::From(script_state), fetch_api_request.blob),
         nullptr /* AbortSignal */));
   }
   request->SetContext(fetch_api_request.request_context_type);
@@ -150,8 +151,8 @@
   FetchRequestData* request = FetchRequestData::CloneExceptBody();
   if (buffer_) {
     request->buffer_ = buffer_;
-    buffer_ = new BodyStreamBuffer(script_state, BytesConsumer::CreateClosed(),
-                                   nullptr /* AbortSignal */);
+    buffer_ = MakeGarbageCollected<BodyStreamBuffer>(
+        script_state, BytesConsumer::CreateClosed(), nullptr /* AbortSignal */);
     buffer_->CloseAndLockAndDisturb(exception_state);
     if (exception_state.HadException())
       return nullptr;
diff --git a/third_party/blink/renderer/core/fetch/fetch_request_data.h b/third_party/blink/renderer/core/fetch/fetch_request_data.h
index 1db691f..52cb6ff 100644
--- a/third_party/blink/renderer/core/fetch/fetch_request_data.h
+++ b/third_party/blink/renderer/core/fetch/fetch_request_data.h
@@ -11,7 +11,7 @@
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
 #include "services/network/public/mojom/referrer_policy.mojom-shared.h"
 #include "services/network/public/mojom/url_loader_factory.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-blink.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_request.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/core/fetch/body_stream_buffer.h"
diff --git a/third_party/blink/renderer/core/fetch/fetch_response_data.h b/third_party/blink/renderer/core/fetch/fetch_response_data.h
index d111677..6f8c6f8ce 100644
--- a/third_party/blink/renderer/core/fetch/fetch_response_data.h
+++ b/third_party/blink/renderer/core/fetch/fetch_response_data.h
@@ -10,8 +10,8 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_request.h"
 #include "third_party/blink/public/platform/web_http_header_set.h"
 #include "third_party/blink/renderer/core/core_export.h"
diff --git a/third_party/blink/renderer/core/fetch/form_data_bytes_consumer.cc b/third_party/blink/renderer/core/fetch/form_data_bytes_consumer.cc
index 6561f1c..418f916 100644
--- a/third_party/blink/renderer/core/fetch/form_data_bytes_consumer.cc
+++ b/third_party/blink/renderer/core/fetch/form_data_bytes_consumer.cc
@@ -159,8 +159,8 @@
       if (!simple_consumer_) {
         scoped_refptr<EncodedFormData> simple_data =
             EncodedFormData::Create(iter_->data_);
-        simple_consumer_ =
-            new SimpleFormDataBytesConsumer(std::move(simple_data));
+        simple_consumer_ = MakeGarbageCollected<SimpleFormDataBytesConsumer>(
+            std::move(simple_data));
         if (client_)
           simple_consumer_->SetClient(client_);
       }
@@ -201,7 +201,7 @@
                           WrapWeakPersistent(this)));
         DataPipeBytesConsumer::CompletionNotifier* completion_notifier =
             nullptr;
-        data_pipe_consumer_ = new DataPipeBytesConsumer(
+        data_pipe_consumer_ = MakeGarbageCollected<DataPipeBytesConsumer>(
             execution_context_, std::move(pipe_consumer_handle),
             &completion_notifier);
         completion_notifier_ = completion_notifier;
@@ -435,7 +435,7 @@
     blob_data->SetContentType(AtomicString("multipart/form-data; boundary=") +
                               form_data_->Boundary().data());
     auto size = blob_data->length();
-    blob_bytes_consumer_ = new BlobBytesConsumer(
+    blob_bytes_consumer_ = MakeGarbageCollected<BlobBytesConsumer>(
         execution_context, BlobDataHandle::Create(std::move(blob_data), size));
   }
 
@@ -491,8 +491,9 @@
 }  // namespace
 
 FormDataBytesConsumer::FormDataBytesConsumer(const String& string)
-    : impl_(new SimpleFormDataBytesConsumer(EncodedFormData::Create(
-          UTF8Encoding().Encode(string, WTF::kNoUnencodables)))) {}
+    : impl_(MakeGarbageCollected<SimpleFormDataBytesConsumer>(
+          EncodedFormData::Create(
+              UTF8Encoding().Encode(string, WTF::kNoUnencodables)))) {}
 
 FormDataBytesConsumer::FormDataBytesConsumer(DOMArrayBuffer* buffer)
     : FormDataBytesConsumer(buffer->Data(), buffer->ByteLength()) {}
@@ -501,7 +502,7 @@
     : FormDataBytesConsumer(view->BaseAddress(), view->byteLength()) {}
 
 FormDataBytesConsumer::FormDataBytesConsumer(const void* data, wtf_size_t size)
-    : impl_(new SimpleFormDataBytesConsumer(
+    : impl_(MakeGarbageCollected<SimpleFormDataBytesConsumer>(
           EncodedFormData::Create(data, size))) {}
 
 FormDataBytesConsumer::FormDataBytesConsumer(
@@ -525,13 +526,14 @@
   DCHECK(form_data);
   switch (GetType(form_data.get())) {
     case FormDataType::kSimple:
-      return new SimpleFormDataBytesConsumer(std::move(form_data));
+      return MakeGarbageCollected<SimpleFormDataBytesConsumer>(
+          std::move(form_data));
     case FormDataType::kComplex:
-      return new ComplexFormDataBytesConsumer(
+      return MakeGarbageCollected<ComplexFormDataBytesConsumer>(
           execution_context, std::move(form_data), consumer_for_testing);
     case FormDataType::kDataPipeAndDataOnly:
-      return new DataPipeAndDataBytesConsumer(execution_context,
-                                              form_data.get());
+      return MakeGarbageCollected<DataPipeAndDataBytesConsumer>(
+          execution_context, form_data.get());
   }
   return nullptr;
 }
diff --git a/third_party/blink/renderer/core/fetch/form_data_bytes_consumer_test.cc b/third_party/blink/renderer/core/fetch/form_data_bytes_consumer_test.cc
index 0fa2fc1..805c763 100644
--- a/third_party/blink/renderer/core/fetch/form_data_bytes_consumer_test.cc
+++ b/third_party/blink/renderer/core/fetch/form_data_bytes_consumer_test.cc
@@ -127,7 +127,7 @@
 
 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromString) {
   auto result =
-      (new BytesConsumerTestUtil::TwoPhaseReader(
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(
            MakeGarbageCollected<FormDataBytesConsumer>("hello, world")))
           ->Run();
   EXPECT_EQ(Result::kDone, result.first);
@@ -137,7 +137,7 @@
 
 TEST_F(FormDataBytesConsumerTest, TwoPhaseReadFromStringNonLatin) {
   constexpr UChar kCs[] = {0x3042, 0};
-  auto result = (new BytesConsumerTestUtil::TwoPhaseReader(
+  auto result = (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(
                      MakeGarbageCollected<FormDataBytesConsumer>(String(kCs))))
                     ->Run();
   EXPECT_EQ(Result::kDone, result.first);
@@ -149,7 +149,7 @@
   constexpr unsigned char kData[] = {0x21, 0xfe, 0x00, 0x00, 0xff, 0xa3,
                                      0x42, 0x30, 0x42, 0x99, 0x88};
   DOMArrayBuffer* buffer = DOMArrayBuffer::Create(kData, arraysize(kData));
-  auto result = (new BytesConsumerTestUtil::TwoPhaseReader(
+  auto result = (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(
                      MakeGarbageCollected<FormDataBytesConsumer>(buffer)))
                     ->Run();
   Vector<char> expected;
@@ -164,7 +164,7 @@
                                      0x42, 0x30, 0x42, 0x99, 0x88};
   constexpr size_t kOffset = 1, kSize = 4;
   DOMArrayBuffer* buffer = DOMArrayBuffer::Create(kData, arraysize(kData));
-  auto result = (new BytesConsumerTestUtil::TwoPhaseReader(
+  auto result = (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(
                      MakeGarbageCollected<FormDataBytesConsumer>(
                          DOMUint8Array::Create(buffer, kOffset, kSize))))
                     ->Run();
@@ -181,7 +181,7 @@
   data->AppendData("hoge", 4);
 
   auto result =
-      (new BytesConsumerTestUtil::TwoPhaseReader(
+      (MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(
            MakeGarbageCollected<FormDataBytesConsumer>(&GetDocument(), data)))
           ->Run();
   EXPECT_EQ(Result::kDone, result.first);
@@ -426,7 +426,7 @@
   EXPECT_CALL(checkpoint, Call(3));
 
   checkpoint.Call(1);
-  consumer->SetClient(new NoopClient());
+  consumer->SetClient(MakeGarbageCollected<NoopClient>());
   checkpoint.Call(2);
   consumer->ClearClient();
   checkpoint.Call(3);
@@ -455,7 +455,8 @@
   scoped_refptr<EncodedFormData> input_form_data = DataPipeFormData();
   auto* consumer = MakeGarbageCollected<FormDataBytesConsumer>(&GetDocument(),
                                                                input_form_data);
-  auto* reader = new BytesConsumerTestUtil::TwoPhaseReader(consumer);
+  auto* reader =
+      MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(consumer);
   std::pair<BytesConsumer::Result, Vector<char>> result = reader->Run();
   EXPECT_EQ(Result::kDone, result.first);
   EXPECT_EQ("foo hello world here's another data pipe bar baz",
@@ -496,7 +497,8 @@
   EXPECT_EQ(BytesConsumer::Result::kOk, consumer->EndRead(available));
 
   // The consumer should still be readable. Finish reading.
-  auto* reader = new BytesConsumerTestUtil::TwoPhaseReader(consumer);
+  auto* reader =
+      MakeGarbageCollected<BytesConsumerTestUtil::TwoPhaseReader>(consumer);
   std::pair<BytesConsumer::Result, Vector<char>> result = reader->Run();
   EXPECT_EQ(Result::kDone, result.first);
   EXPECT_EQ(" hello world here's another data pipe bar baz",
diff --git a/third_party/blink/renderer/core/fetch/global_fetch.cc b/third_party/blink/renderer/core/fetch/global_fetch.cc
index c152c1d..0d474ed 100644
--- a/third_party/blink/renderer/core/fetch/global_fetch.cc
+++ b/third_party/blink/renderer/core/fetch/global_fetch.cc
@@ -34,12 +34,15 @@
     GlobalFetchImpl* supplement =
         Supplement<T>::template From<GlobalFetchImpl>(supplementable);
     if (!supplement) {
-      supplement = new GlobalFetchImpl(execution_context);
+      supplement = MakeGarbageCollected<GlobalFetchImpl>(execution_context);
       Supplement<T>::ProvideTo(supplementable, supplement);
     }
     return supplement;
   }
 
+  explicit GlobalFetchImpl(ExecutionContext* execution_context)
+      : fetch_manager_(FetchManager::Create(execution_context)) {}
+
   ScriptPromise Fetch(ScriptState* script_state,
                       const RequestInfo& input,
                       const RequestInit* init,
@@ -78,9 +81,6 @@
   }
 
  private:
-  explicit GlobalFetchImpl(ExecutionContext* execution_context)
-      : fetch_manager_(FetchManager::Create(execution_context)) {}
-
   Member<FetchManager> fetch_manager_;
 };
 
diff --git a/third_party/blink/renderer/core/fetch/headers.cc b/third_party/blink/renderer/core/fetch/headers.cc
index 1dd5e6a6..787d148 100644
--- a/third_party/blink/renderer/core/fetch/headers.cc
+++ b/third_party/blink/renderer/core/fetch/headers.cc
@@ -282,7 +282,7 @@
 PairIterable<String, String>::IterationSource* Headers::StartIteration(
     ScriptState*,
     ExceptionState&) {
-  return new HeadersIterationSource(header_list_);
+  return MakeGarbageCollected<HeadersIterationSource>(header_list_);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/multipart_parser_test.cc b/third_party/blink/renderer/core/fetch/multipart_parser_test.cc
index e1ad8a9..ec7d5e73 100644
--- a/third_party/blink/renderer/core/fetch/multipart_parser_test.cc
+++ b/third_party/blink/renderer/core/fetch/multipart_parser_test.cc
@@ -72,7 +72,8 @@
   Vector<char> boundary;
   boundary.Append("boundary", 8u);
   for (const size_t size : sizes) {
-    MockMultipartParserClient* client = new MockMultipartParserClient;
+    MockMultipartParserClient* client =
+        MakeGarbageCollected<MockMultipartParserClient>();
     MultipartParser* parser =
         MakeGarbageCollected<MultipartParser>(boundary, client);
 
@@ -117,7 +118,8 @@
   Vector<char> boundary;
   boundary.Append("boundary", 8u);
   for (size_t end : ends) {
-    MockMultipartParserClient* client = new MockMultipartParserClient;
+    MockMultipartParserClient* client =
+        MakeGarbageCollected<MockMultipartParserClient>();
     MultipartParser* parser =
         MakeGarbageCollected<MultipartParser>(boundary, client);
 
@@ -160,7 +162,8 @@
 
   Vector<char> boundary;
   boundary.Append("boundary", 8u);
-  MockMultipartParserClient* client = new MockMultipartParserClient;
+  MockMultipartParserClient* client =
+      MakeGarbageCollected<MockMultipartParserClient>();
   MultipartParser* parser =
       MakeGarbageCollected<MultipartParser>(boundary, client);
 
@@ -180,7 +183,8 @@
 
   Vector<char> boundary;
   boundary.Append("boundary", 8u);
-  MockMultipartParserClient* client = new MockMultipartParserClient;
+  MockMultipartParserClient* client =
+      MakeGarbageCollected<MockMultipartParserClient>();
   MultipartParser* parser =
       MakeGarbageCollected<MultipartParser>(boundary, client);
 
@@ -194,7 +198,8 @@
 
   Vector<char> boundary;
   boundary.Append("boundary", 8u);
-  MockMultipartParserClient* client = new MockMultipartParserClient;
+  MockMultipartParserClient* client =
+      MakeGarbageCollected<MockMultipartParserClient>();
   MultipartParser* parser =
       MakeGarbageCollected<MultipartParser>(boundary, client);
 
@@ -215,7 +220,8 @@
   Vector<char> boundary;
   boundary.Append("boundary", 8u);
   for (const size_t start : kStarts) {
-    MockMultipartParserClient* client = new MockMultipartParserClient;
+    MockMultipartParserClient* client =
+        MakeGarbageCollected<MockMultipartParserClient>();
     MultipartParser* parser =
         MakeGarbageCollected<MultipartParser>(boundary, client);
 
@@ -274,7 +280,8 @@
   Vector<char> boundary;
   boundary.Append("--boundary", 10u);
   for (const size_t start : kStarts) {
-    MockMultipartParserClient* client = new MockMultipartParserClient;
+    MockMultipartParserClient* client =
+        MakeGarbageCollected<MockMultipartParserClient>();
     MultipartParser* parser =
         MakeGarbageCollected<MultipartParser>(boundary, client);
 
diff --git a/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer_test.cc b/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer_test.cc
index 8e7a529..e37072b 100644
--- a/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer_test.cc
+++ b/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer_test.cc
@@ -35,11 +35,12 @@
 
  public:
   static MockClient* Create() { return new StrictMock<MockClient>(); }
-  MOCK_METHOD0(OnStateChange, void());
-  String DebugName() const override { return "MockClient"; }
 
   MockClient() = default;
 
+  MOCK_METHOD0(OnStateChange, void());
+  String DebugName() const override { return "MockClient"; }
+
   void Trace(blink::Visitor* visitor) override {}
 };
 
diff --git a/third_party/blink/renderer/core/fetch/request.cc b/third_party/blink/renderer/core/fetch/request.cc
index e420f2d..01ed44e3 100644
--- a/third_party/blink/renderer/core/fetch/request.cc
+++ b/third_party/blink/renderer/core/fetch/request.cc
@@ -101,16 +101,17 @@
 
   if (V8Blob::HasInstance(body, isolate)) {
     Blob* blob = V8Blob::ToImpl(body.As<v8::Object>());
-    return_buffer = new BodyStreamBuffer(
+    return_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state,
-        new BlobBytesConsumer(execution_context, blob->GetBlobDataHandle()),
+        MakeGarbageCollected<BlobBytesConsumer>(execution_context,
+                                                blob->GetBlobDataHandle()),
         nullptr /* AbortSignal */);
     content_type = blob->type();
   } else if (body->IsArrayBuffer()) {
     // Avoid calling into V8 from the following constructor parameters, which
     // is potentially unsafe.
     DOMArrayBuffer* array_buffer = V8ArrayBuffer::ToImpl(body.As<v8::Object>());
-    return_buffer = new BodyStreamBuffer(
+    return_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state, MakeGarbageCollected<FormDataBytesConsumer>(array_buffer),
         nullptr /* AbortSignal */);
   } else if (body->IsArrayBufferView()) {
@@ -118,7 +119,7 @@
     // is potentially unsafe.
     DOMArrayBufferView* array_buffer_view =
         V8ArrayBufferView::ToImpl(body.As<v8::Object>());
-    return_buffer = new BodyStreamBuffer(
+    return_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state,
         MakeGarbageCollected<FormDataBytesConsumer>(array_buffer_view),
         nullptr /* AbortSignal */);
@@ -129,19 +130,19 @@
     // FormDataEncoder::generateUniqueBoundaryString.
     content_type = AtomicString("multipart/form-data; boundary=") +
                    form_data->Boundary().data();
-    return_buffer =
-        new BodyStreamBuffer(script_state,
-                             MakeGarbageCollected<FormDataBytesConsumer>(
-                                 execution_context, std::move(form_data)),
-                             nullptr /* AbortSignal */);
+    return_buffer = MakeGarbageCollected<BodyStreamBuffer>(
+        script_state,
+        MakeGarbageCollected<FormDataBytesConsumer>(execution_context,
+                                                    std::move(form_data)),
+        nullptr /* AbortSignal */);
   } else if (V8URLSearchParams::HasInstance(body, isolate)) {
     scoped_refptr<EncodedFormData> form_data =
         V8URLSearchParams::ToImpl(body.As<v8::Object>())->ToEncodedFormData();
-    return_buffer =
-        new BodyStreamBuffer(script_state,
-                             MakeGarbageCollected<FormDataBytesConsumer>(
-                                 execution_context, std::move(form_data)),
-                             nullptr /* AbortSignal */);
+    return_buffer = MakeGarbageCollected<BodyStreamBuffer>(
+        script_state,
+        MakeGarbageCollected<FormDataBytesConsumer>(execution_context,
+                                                    std::move(form_data)),
+        nullptr /* AbortSignal */);
     content_type = "application/x-www-form-urlencoded;charset=UTF-8";
   } else {
     String string = NativeValueTraits<IDLUSVString>::NativeValue(
@@ -149,7 +150,7 @@
     if (exception_state.HadException())
       return nullptr;
 
-    return_buffer = new BodyStreamBuffer(
+    return_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state, MakeGarbageCollected<FormDataBytesConsumer>(string),
         nullptr /* AbortSignal */);
     content_type = "text/plain;charset=UTF-8";
@@ -562,7 +563,7 @@
   // non-null, run these substeps:"
   if (input_request && input_request->BodyBuffer()) {
     // "Let |dummyStream| be an empty ReadableStream object."
-    auto* dummy_stream = new BodyStreamBuffer(
+    auto* dummy_stream = MakeGarbageCollected<BodyStreamBuffer>(
         script_state, BytesConsumer::CreateClosed(), nullptr);
     // "Set |input|'s request's body to a new body whose stream is
     // |dummyStream|."
@@ -666,7 +667,8 @@
     : Request(script_state,
               request,
               Headers::Create(request->HeaderList()),
-              new AbortSignal(ExecutionContext::From(script_state))) {
+              MakeGarbageCollected<AbortSignal>(
+                  ExecutionContext::From(script_state))) {
   headers_->SetGuard(Headers::kRequestGuard);
 }
 
@@ -873,7 +875,8 @@
     return nullptr;
   Headers* headers = Headers::Create(request->HeaderList());
   headers->SetGuard(headers_->GetGuard());
-  auto* signal = new AbortSignal(ExecutionContext::From(script_state));
+  auto* signal =
+      MakeGarbageCollected<AbortSignal>(ExecutionContext::From(script_state));
   signal->Follow(signal_);
   return MakeGarbageCollected<Request>(script_state, request, headers, signal);
 }
diff --git a/third_party/blink/renderer/core/fetch/request.h b/third_party/blink/renderer/core/fetch/request.h
index e51937d..0885cac0 100644
--- a/third_party/blink/renderer/core/fetch/request.h
+++ b/third_party/blink/renderer/core/fetch/request.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_REQUEST_H_
 
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-blink.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/bindings/core/v8/dictionary.h"
 #include "third_party/blink/renderer/bindings/core/v8/request_or_usv_string.h"
diff --git a/third_party/blink/renderer/core/fetch/response.cc b/third_party/blink/renderer/core/fetch/response.cc
index 8816b18..1a88505 100644
--- a/third_party/blink/renderer/core/fetch/response.cc
+++ b/third_party/blink/renderer/core/fetch/response.cc
@@ -97,10 +97,10 @@
     response->HeaderList()->Append(header.key, header.value);
 
   if (fetch_api_response.blob) {
-    response->ReplaceBodyStreamBuffer(new BodyStreamBuffer(
+    response->ReplaceBodyStreamBuffer(MakeGarbageCollected<BodyStreamBuffer>(
         script_state,
-        new BlobBytesConsumer(ExecutionContext::From(script_state),
-                              fetch_api_response.blob),
+        MakeGarbageCollected<BlobBytesConsumer>(
+            ExecutionContext::From(script_state), fetch_api_response.blob),
         nullptr /* AbortSignal */));
   }
 
@@ -159,16 +159,17 @@
     // https://crbug.com/335871.
   } else if (V8Blob::HasInstance(body, isolate)) {
     Blob* blob = V8Blob::ToImpl(body.As<v8::Object>());
-    body_buffer = new BodyStreamBuffer(
+    body_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state,
-        new BlobBytesConsumer(execution_context, blob->GetBlobDataHandle()),
+        MakeGarbageCollected<BlobBytesConsumer>(execution_context,
+                                                blob->GetBlobDataHandle()),
         nullptr /* AbortSignal */);
     content_type = blob->type();
   } else if (body->IsArrayBuffer()) {
     // Avoid calling into V8 from the following constructor parameters, which
     // is potentially unsafe.
     DOMArrayBuffer* array_buffer = V8ArrayBuffer::ToImpl(body.As<v8::Object>());
-    body_buffer = new BodyStreamBuffer(
+    body_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state, MakeGarbageCollected<FormDataBytesConsumer>(array_buffer),
         nullptr /* AbortSignal */);
   } else if (body->IsArrayBufferView()) {
@@ -176,7 +177,7 @@
     // is potentially unsafe.
     DOMArrayBufferView* array_buffer_view =
         V8ArrayBufferView::ToImpl(body.As<v8::Object>());
-    body_buffer = new BodyStreamBuffer(
+    body_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state,
         MakeGarbageCollected<FormDataBytesConsumer>(array_buffer_view),
         nullptr /* AbortSignal */);
@@ -187,31 +188,31 @@
     // FormDataEncoder::generateUniqueBoundaryString.
     content_type = AtomicString("multipart/form-data; boundary=") +
                    form_data->Boundary().data();
-    body_buffer =
-        new BodyStreamBuffer(script_state,
-                             MakeGarbageCollected<FormDataBytesConsumer>(
-                                 execution_context, std::move(form_data)),
-                             nullptr /* AbortSignal */);
+    body_buffer = MakeGarbageCollected<BodyStreamBuffer>(
+        script_state,
+        MakeGarbageCollected<FormDataBytesConsumer>(execution_context,
+                                                    std::move(form_data)),
+        nullptr /* AbortSignal */);
   } else if (V8URLSearchParams::HasInstance(body, isolate)) {
     scoped_refptr<EncodedFormData> form_data =
         V8URLSearchParams::ToImpl(body.As<v8::Object>())->ToEncodedFormData();
-    body_buffer =
-        new BodyStreamBuffer(script_state,
-                             MakeGarbageCollected<FormDataBytesConsumer>(
-                                 execution_context, std::move(form_data)),
-                             nullptr /* AbortSignal */);
+    body_buffer = MakeGarbageCollected<BodyStreamBuffer>(
+        script_state,
+        MakeGarbageCollected<FormDataBytesConsumer>(execution_context,
+                                                    std::move(form_data)),
+        nullptr /* AbortSignal */);
     content_type = "application/x-www-form-urlencoded;charset=UTF-8";
   } else if (V8ReadableStream::HasInstance(body, isolate)) {
     UseCounter::Count(execution_context,
                       WebFeature::kFetchResponseConstructionWithStream);
-    body_buffer = new BodyStreamBuffer(
+    body_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state, V8ReadableStream::ToImpl(body.As<v8::Object>()));
   } else {
     String string = NativeValueTraits<IDLUSVString>::NativeValue(
         isolate, body, exception_state);
     if (exception_state.HadException())
       return nullptr;
-    body_buffer = new BodyStreamBuffer(
+    body_buffer = MakeGarbageCollected<BodyStreamBuffer>(
         script_state, MakeGarbageCollected<FormDataBytesConsumer>(string),
         nullptr /* AbortSignal */);
     content_type = "text/plain;charset=UTF-8";
diff --git a/third_party/blink/renderer/core/fetch/response_init.idl b/third_party/blink/renderer/core/fetch/response_init.idl
index 8dc8e0d..ca291cb 100644
--- a/third_party/blink/renderer/core/fetch/response_init.idl
+++ b/third_party/blink/renderer/core/fetch/response_init.idl
@@ -6,6 +6,6 @@
 
 dictionary ResponseInit {
     unsigned short status = 200;
-    ByteString statusText = "OK";
+    ByteString statusText = "";
     HeadersInit headers;
 };
diff --git a/third_party/blink/renderer/core/fetch/response_test.cc b/third_party/blink/renderer/core/fetch/response_test.cc
index 4bca9a8..64b9618 100644
--- a/third_party/blink/renderer/core/fetch/response_test.cc
+++ b/third_party/blink/renderer/core/fetch/response_test.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-blink.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_response.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
@@ -76,9 +76,9 @@
     EXPECT_FALSE(cloned_response->BodyBuffer());
   }
   BytesConsumerTestUtil::MockFetchDataLoaderClient* client1 =
-      new BytesConsumerTestUtil::MockFetchDataLoaderClient();
+      MakeGarbageCollected<BytesConsumerTestUtil::MockFetchDataLoaderClient>();
   BytesConsumerTestUtil::MockFetchDataLoaderClient* client2 =
-      new BytesConsumerTestUtil::MockFetchDataLoaderClient();
+      MakeGarbageCollected<BytesConsumerTestUtil::MockFetchDataLoaderClient>();
   EXPECT_CALL(*client1, DidFetchDataLoadedString(String("Hello, world")));
   EXPECT_CALL(*client2, DidFetchDataLoadedString(String("Hello, world")));
 
@@ -92,12 +92,12 @@
 BodyStreamBuffer* CreateHelloWorldBuffer(ScriptState* script_state) {
   using BytesConsumerCommand = BytesConsumerTestUtil::Command;
   BytesConsumerTestUtil::ReplayingBytesConsumer* src =
-      new BytesConsumerTestUtil::ReplayingBytesConsumer(
+      MakeGarbageCollected<BytesConsumerTestUtil::ReplayingBytesConsumer>(
           ExecutionContext::From(script_state));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "Hello, "));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kData, "world"));
   src->Add(BytesConsumerCommand(BytesConsumerCommand::kDone));
-  return new BodyStreamBuffer(script_state, src, nullptr);
+  return MakeGarbageCollected<BodyStreamBuffer>(script_state, src, nullptr);
 }
 
 TEST(ServiceWorkerResponseTest, BodyStreamBufferCloneDefault) {
@@ -161,7 +161,7 @@
 
 TEST(ServiceWorkerResponseTest, BodyStreamBufferCloneError) {
   V8TestingScope scope;
-  BodyStreamBuffer* buffer = new BodyStreamBuffer(
+  BodyStreamBuffer* buffer = MakeGarbageCollected<BodyStreamBuffer>(
       scope.GetScriptState(),
       BytesConsumer::CreateErrored(BytesConsumer::Error()), nullptr);
   FetchResponseData* fetch_response_data =
@@ -177,9 +177,9 @@
   EXPECT_FALSE(exception_state.HadException());
 
   BytesConsumerTestUtil::MockFetchDataLoaderClient* client1 =
-      new BytesConsumerTestUtil::MockFetchDataLoaderClient();
+      MakeGarbageCollected<BytesConsumerTestUtil::MockFetchDataLoaderClient>();
   BytesConsumerTestUtil::MockFetchDataLoaderClient* client2 =
-      new BytesConsumerTestUtil::MockFetchDataLoaderClient();
+      MakeGarbageCollected<BytesConsumerTestUtil::MockFetchDataLoaderClient>();
   EXPECT_CALL(*client1, DidFetchDataLoadFailed());
   EXPECT_CALL(*client2, DidFetchDataLoadFailed());
 
diff --git a/third_party/blink/renderer/core/fileapi/blob.cc b/third_party/blink/renderer/core/fileapi/blob.cc
index 494a2b3..7658bb6 100644
--- a/third_party/blink/renderer/core/fileapi/blob.cc
+++ b/third_party/blink/renderer/core/fileapi/blob.cc
@@ -100,7 +100,8 @@
                    normalize_line_endings_to_native);
 
   long long blob_size = blob_data->length();
-  return new Blob(BlobDataHandle::Create(std::move(blob_data), blob_size));
+  return MakeGarbageCollected<Blob>(
+      BlobDataHandle::Create(std::move(blob_data), blob_size));
 }
 
 Blob* Blob::Create(const unsigned char* data,
@@ -113,7 +114,8 @@
   blob_data->AppendBytes(data, bytes);
   long long blob_size = blob_data->length();
 
-  return new Blob(BlobDataHandle::Create(std::move(blob_data), blob_size));
+  return MakeGarbageCollected<Blob>(
+      BlobDataHandle::Create(std::move(blob_data), blob_size));
 }
 
 // static
diff --git a/third_party/blink/renderer/core/fileapi/blob.h b/third_party/blink/renderer/core/fileapi/blob.h
index e02daba..dbe1e22 100644
--- a/third_party/blink/renderer/core/fileapi/blob.h
+++ b/third_party/blink/renderer/core/fileapi/blob.h
@@ -56,7 +56,7 @@
 
  public:
   static Blob* Create(ExecutionContext*, ExceptionState&) {
-    return new Blob(BlobDataHandle::Create());
+    return MakeGarbageCollected<Blob>(BlobDataHandle::Create());
   }
 
   static Blob* Create(
@@ -66,13 +66,14 @@
       ExceptionState&);
 
   static Blob* Create(scoped_refptr<BlobDataHandle> blob_data_handle) {
-    return new Blob(std::move(blob_data_handle));
+    return MakeGarbageCollected<Blob>(std::move(blob_data_handle));
   }
 
   static Blob* Create(const unsigned char* data,
                       size_t bytes,
                       const String& content_type);
 
+  explicit Blob(scoped_refptr<BlobDataHandle>);
   ~Blob() override;
 
   virtual unsigned long long size() const { return blob_data_handle_->size(); }
@@ -118,8 +119,6 @@
   bool IsBlob() const override { return true; }
 
  protected:
-  explicit Blob(scoped_refptr<BlobDataHandle>);
-
   static void PopulateBlobData(
       BlobData*,
       const HeapVector<ArrayBufferOrArrayBufferViewOrBlobOrUSVString>& parts,
diff --git a/third_party/blink/renderer/core/frame/ad_tracker_test.cc b/third_party/blink/renderer/core/frame/ad_tracker_test.cc
index 128a79f..baeb1734d 100644
--- a/third_party/blink/renderer/core/frame/ad_tracker_test.cc
+++ b/third_party/blink/renderer/core/frame/ad_tracker_test.cc
@@ -111,7 +111,7 @@
 void AdTrackerTest::SetUp() {
   page_holder_ = DummyPageHolder::Create(IntSize(800, 600));
   page_holder_->GetDocument().SetURL(KURL("https://example.com/foo"));
-  ad_tracker_ = new TestAdTracker(GetFrame());
+  ad_tracker_ = MakeGarbageCollected<TestAdTracker>(GetFrame());
   ad_tracker_->SetExecutionContext(&page_holder_->GetDocument());
 }
 
@@ -205,7 +205,7 @@
 
     LoadURL("https://example.com/test.html");
     main_resource_->Start();
-    ad_tracker_ = new TestAdTracker(GetDocument().GetFrame());
+    ad_tracker_ = MakeGarbageCollected<TestAdTracker>(GetDocument().GetFrame());
     GetDocument().GetFrame()->SetAdTrackerForTesting(ad_tracker_);
   }
 
diff --git a/third_party/blink/renderer/core/frame/bar_prop.h b/third_party/blink/renderer/core/frame/bar_prop.h
index 2155ede..5d73c76 100644
--- a/third_party/blink/renderer/core/frame/bar_prop.h
+++ b/third_party/blink/renderer/core/frame/bar_prop.h
@@ -52,15 +52,16 @@
   };
 
   static BarProp* Create(LocalFrame* frame, Type type) {
-    return new BarProp(frame, type);
+    return MakeGarbageCollected<BarProp>(frame, type);
   }
 
+  BarProp(LocalFrame*, Type);
+
   bool visible() const;
 
   void Trace(blink::Visitor*) override;
 
  private:
-  BarProp(LocalFrame*, Type);
   Type type_;
 };
 
diff --git a/third_party/blink/renderer/core/frame/browser_controls.h b/third_party/blink/renderer/core/frame/browser_controls.h
index 9391a899..5545e44 100644
--- a/third_party/blink/renderer/core/frame/browser_controls.h
+++ b/third_party/blink/renderer/core/frame/browser_controls.h
@@ -25,9 +25,11 @@
     : public GarbageCollected<BrowserControls> {
  public:
   static BrowserControls* Create(const Page& page) {
-    return new BrowserControls(page);
+    return MakeGarbageCollected<BrowserControls>(page);
   }
 
+  explicit BrowserControls(const Page&);
+
   void Trace(blink::Visitor*);
 
   // The height the top controls are hidden; used for viewport adjustments
@@ -58,7 +60,6 @@
   cc::BrowserControlsState PermittedState() const { return permitted_state_; }
 
  private:
-  explicit BrowserControls(const Page&);
   void ResetBaseline();
   float BottomContentOffset();
 
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
index 18113741..6cc8402 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
@@ -171,9 +171,9 @@
 void ContentSecurityPolicy::SetupSelf(const SecurityOrigin& security_origin) {
   // Ensure that 'self' processes correctly.
   self_protocol_ = security_origin.Protocol();
-  self_source_ = new CSPSource(this, self_protocol_, security_origin.Host(),
-                               security_origin.Port(), String(),
-                               CSPSource::kNoWildcard, CSPSource::kNoWildcard);
+  self_source_ = MakeGarbageCollected<CSPSource>(
+      this, self_protocol_, security_origin.Host(), security_origin.Port(),
+      String(), CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 }
 
 void ContentSecurityPolicy::ApplyPolicySideEffectsToExecutionContext() {
@@ -426,9 +426,9 @@
   // to an execution context.
   scoped_refptr<const SecurityOrigin> origin = SecurityOrigin::Create(url);
   self_protocol_ = origin->Protocol();
-  self_source_ =
-      new CSPSource(this, self_protocol_, origin->Host(), origin->Port(),
-                    String(), CSPSource::kNoWildcard, CSPSource::kNoWildcard);
+  self_source_ = MakeGarbageCollected<CSPSource>(
+      this, self_protocol_, origin->Host(), origin->Port(), String(),
+      CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 }
 
 Vector<CSPHeaderAndType> ContentSecurityPolicy::Headers() const {
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.h b/third_party/blink/renderer/core/frame/csp/content_security_policy.h
index 6d795e6..c95a463 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy.h
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.h
@@ -139,7 +139,11 @@
 
   static const size_t kMaxSampleLength = 40;
 
-  static ContentSecurityPolicy* Create() { return new ContentSecurityPolicy(); }
+  static ContentSecurityPolicy* Create() {
+    return MakeGarbageCollected<ContentSecurityPolicy>();
+  }
+
+  ContentSecurityPolicy();
   ~ContentSecurityPolicy();
   void Trace(blink::Visitor*);
 
@@ -498,8 +502,6 @@
   FRIEND_TEST_ALL_PREFIXES(FrameFetchContextTest,
                            PopulateResourceRequestChecksReportOnlyCSP);
 
-  ContentSecurityPolicy();
-
   void ApplyPolicySideEffectsToExecutionContext();
 
   void LogToConsole(const String& message, MessageLevel = kErrorMessageLevel);
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
index 51884a1..cb5d76d 100644
--- a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
+++ b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
@@ -96,7 +96,8 @@
     ContentSecurityPolicyHeaderType type,
     ContentSecurityPolicyHeaderSource source,
     bool should_parse_wasm_eval) {
-  CSPDirectiveList* directives = new CSPDirectiveList(policy, type, source);
+  CSPDirectiveList* directives =
+      MakeGarbageCollected<CSPDirectiveList>(policy, type, source);
   directives->Parse(begin, end, should_parse_wasm_eval);
 
   if (!directives->CheckEval(directives->OperativeDirective(
@@ -1304,7 +1305,7 @@
     return;
   }
 
-  directive = new CSPDirectiveType(name, value, policy_);
+  directive = MakeGarbageCollected<CSPDirectiveType>(name, value, policy_);
 }
 
 void CSPDirectiveList::ApplySandboxPolicy(const String& name,
@@ -1360,7 +1361,8 @@
     return;
   }
   policy_->RequireTrustedTypes();
-  trusted_types_ = new StringListDirective(name, value, policy_);
+  trusted_types_ =
+      MakeGarbageCollected<StringListDirective>(name, value, policy_);
 }
 
 void CSPDirectiveList::EnforceStrictMixedContentChecking(const String& name,
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive_list.h b/third_party/blink/renderer/core/frame/csp/csp_directive_list.h
index 9996771..dc32911 100644
--- a/third_party/blink/renderer/core/frame/csp/csp_directive_list.h
+++ b/third_party/blink/renderer/core/frame/csp/csp_directive_list.h
@@ -38,6 +38,10 @@
                                   ContentSecurityPolicyHeaderSource,
                                   bool should_parse_wasm_eval = false);
 
+  CSPDirectiveList(ContentSecurityPolicy*,
+                   ContentSecurityPolicyHeaderType,
+                   ContentSecurityPolicyHeaderSource);
+
   void Parse(const UChar* begin,
              const UChar* end,
              bool should_parse_wasm_eval = false);
@@ -207,10 +211,6 @@
 
   enum RequireSRIForToken { kNone = 0, kScript = 1 << 0, kStyle = 1 << 1 };
 
-  CSPDirectiveList(ContentSecurityPolicy*,
-                   ContentSecurityPolicyHeaderType,
-                   ContentSecurityPolicyHeaderSource);
-
   bool ParseDirective(const UChar* begin,
                       const UChar* end,
                       String* name,
diff --git a/third_party/blink/renderer/core/frame/csp/csp_source.cc b/third_party/blink/renderer/core/frame/csp/csp_source.cc
index e458082..5b4e313 100644
--- a/third_party/blink/renderer/core/frame/csp/csp_source.cc
+++ b/third_party/blink/renderer/core/frame/csp/csp_source.cc
@@ -234,9 +234,9 @@
           : other->scheme_;
   if (IsSchemeOnly() || other->IsSchemeOnly()) {
     const CSPSource* stricter = IsSchemeOnly() ? other : this;
-    return new CSPSource(policy_, scheme, stricter->host_, stricter->port_,
-                         stricter->path_, stricter->host_wildcard_,
-                         stricter->port_wildcard_);
+    return MakeGarbageCollected<CSPSource>(
+        policy_, scheme, stricter->host_, stricter->port_, stricter->path_,
+        stricter->host_wildcard_, stricter->port_wildcard_);
   }
 
   String host = host_wildcard_ == kNoWildcard ? host_ : other->host_;
@@ -253,8 +253,8 @@
       (host_wildcard_ == kHasWildcard) ? other->host_wildcard_ : host_wildcard_;
   WildcardDisposition port_wildcard =
       (port_wildcard_ == kHasWildcard) ? other->port_wildcard_ : port_wildcard_;
-  return new CSPSource(policy_, scheme, host, port, path, host_wildcard,
-                       port_wildcard);
+  return MakeGarbageCollected<CSPSource>(policy_, scheme, host, port, path,
+                                         host_wildcard, port_wildcard);
 }
 
 bool CSPSource::IsSchemeOnly() const {
diff --git a/third_party/blink/renderer/core/frame/csp/csp_source_test.cc b/third_party/blink/renderer/core/frame/csp/csp_source_test.cc
index 76f2180..529f86d1 100644
--- a/third_party/blink/renderer/core/frame/csp/csp_source_test.cc
+++ b/third_party/blink/renderer/core/frame/csp/csp_source_test.cc
@@ -306,11 +306,11 @@
       {{"http", "example.com", "/", 443}, {"about", "example.com", "/", 800}},
   };
   for (const auto& test : cases) {
-    CSPSource* returned = new CSPSource(
+    CSPSource* returned = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.a.scheme, test.a.host, test.a.port, test.a.path,
         CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 
-    CSPSource* required = new CSPSource(
+    CSPSource* required = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.b.scheme, test.b.host, test.b.port, test.b.path,
         CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 
@@ -362,11 +362,11 @@
   };
 
   for (const auto& test : cases) {
-    CSPSource* returned = new CSPSource(
+    CSPSource* returned = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.a.scheme, "example.com", test.a.port, test.a.path,
         CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 
-    CSPSource* required = new CSPSource(
+    CSPSource* required = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.b.scheme, "example.com", test.b.port, test.b.path,
         CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 
@@ -378,10 +378,10 @@
   // When returned CSP has a wildcard but the required csp doesn't, then it is
   // not subsumed.
   for (const auto& test : cases) {
-    CSPSource* returned = new CSPSource(
+    CSPSource* returned = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.a.scheme, "example.com", test.a.port, test.a.path,
         CSPSource::kHasWildcard, CSPSource::kNoWildcard);
-    CSPSource* required = new CSPSource(
+    CSPSource* required = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.b.scheme, "example.com", test.b.port, test.b.path,
         CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 
@@ -389,7 +389,7 @@
 
     // If required csp also allows a wildcard in host, then the answer should be
     // as expected.
-    CSPSource* required2 = new CSPSource(
+    CSPSource* required2 = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.b.scheme, "example.com", test.b.port, test.b.path,
         CSPSource::kHasWildcard, CSPSource::kNoWildcard);
     EXPECT_EQ(required2->Subsumes(returned), test.expected);
@@ -460,19 +460,19 @@
   // There are different cases for wildcards but now also the second CSPSource
   // has a more specific path.
   for (const auto& test : cases) {
-    CSPSource* returned =
-        new CSPSource(csp.Get(), "http", "example.com", 0, "/",
-                      test.a.host_dispotion, test.a.port_dispotion);
-    CSPSource* required =
-        new CSPSource(csp.Get(), "http", "example.com", 0, "/",
-                      test.b.host_dispotion, test.b.port_dispotion);
+    CSPSource* returned = MakeGarbageCollected<CSPSource>(
+        csp.Get(), "http", "example.com", 0, "/", test.a.host_dispotion,
+        test.a.port_dispotion);
+    CSPSource* required = MakeGarbageCollected<CSPSource>(
+        csp.Get(), "http", "example.com", 0, "/", test.b.host_dispotion,
+        test.b.port_dispotion);
     EXPECT_EQ(required->Subsumes(returned), test.expected);
 
     // Wildcards should not matter when required csp is stricter than returned
     // csp.
-    CSPSource* required2 =
-        new CSPSource(csp.Get(), "https", "example.com", 0, "/",
-                      test.b.host_dispotion, test.b.port_dispotion);
+    CSPSource* required2 = MakeGarbageCollected<CSPSource>(
+        csp.Get(), "https", "example.com", 0, "/", test.b.host_dispotion,
+        test.b.port_dispotion);
     EXPECT_FALSE(required2->Subsumes(returned));
   }
 }
@@ -500,12 +500,12 @@
   };
 
   for (const auto& test : cases) {
-    CSPSource* returned =
-        new CSPSource(csp.Get(), test.a_scheme, "example.com", 0, "/",
-                      CSPSource::kNoWildcard, CSPSource::kNoWildcard);
-    CSPSource* required =
-        new CSPSource(csp.Get(), test.b_scheme, "example.com", 0, "/",
-                      CSPSource::kNoWildcard, CSPSource::kNoWildcard);
+    CSPSource* returned = MakeGarbageCollected<CSPSource>(
+        csp.Get(), test.a_scheme, "example.com", 0, "/", CSPSource::kNoWildcard,
+        CSPSource::kNoWildcard);
+    CSPSource* required = MakeGarbageCollected<CSPSource>(
+        csp.Get(), test.b_scheme, "example.com", 0, "/", CSPSource::kNoWildcard,
+        CSPSource::kNoWildcard);
     EXPECT_EQ(required->Subsumes(returned), test.expected);
   }
 }
@@ -603,11 +603,11 @@
   };
 
   for (const auto& test : cases) {
-    CSPSource* returned = new CSPSource(
+    CSPSource* returned = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.a.scheme, test.a.host, test.a.port, test.a.path,
         CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 
-    CSPSource* required = new CSPSource(
+    CSPSource* required = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.b.scheme, test.b.host, test.b.port, test.b.path,
         CSPSource::kNoWildcard, CSPSource::kNoWildcard);
 
@@ -645,24 +645,24 @@
       {{"http", "second-example.com", 0, "/"}, "https", false},
   };
 
-  CSPSource* no_wildcards =
-      new CSPSource(csp.Get(), "http", "example.com", 0, "/",
-                    CSPSource::kNoWildcard, CSPSource::kNoWildcard);
-  CSPSource* host_wildcard =
-      new CSPSource(csp.Get(), "http", "third-example.com", 0, "/",
-                    CSPSource::kHasWildcard, CSPSource::kNoWildcard);
-  CSPSource* port_wildcard =
-      new CSPSource(csp.Get(), "http", "third-example.com", 0, "/",
-                    CSPSource::kNoWildcard, CSPSource::kHasWildcard);
-  CSPSource* both_wildcards =
-      new CSPSource(csp.Get(), "http", "third-example.com", 0, "/",
-                    CSPSource::kHasWildcard, CSPSource::kHasWildcard);
-  CSPSource* http_only =
-      new CSPSource(csp.Get(), "http", "", 0, "", CSPSource::kNoWildcard,
-                    CSPSource::kNoWildcard);
-  CSPSource* https_only =
-      new CSPSource(csp.Get(), "https", "", 0, "", CSPSource::kNoWildcard,
-                    CSPSource::kNoWildcard);
+  CSPSource* no_wildcards = MakeGarbageCollected<CSPSource>(
+      csp.Get(), "http", "example.com", 0, "/", CSPSource::kNoWildcard,
+      CSPSource::kNoWildcard);
+  CSPSource* host_wildcard = MakeGarbageCollected<CSPSource>(
+      csp.Get(), "http", "third-example.com", 0, "/", CSPSource::kHasWildcard,
+      CSPSource::kNoWildcard);
+  CSPSource* port_wildcard = MakeGarbageCollected<CSPSource>(
+      csp.Get(), "http", "third-example.com", 0, "/", CSPSource::kNoWildcard,
+      CSPSource::kHasWildcard);
+  CSPSource* both_wildcards = MakeGarbageCollected<CSPSource>(
+      csp.Get(), "http", "third-example.com", 0, "/", CSPSource::kHasWildcard,
+      CSPSource::kHasWildcard);
+  CSPSource* http_only = MakeGarbageCollected<CSPSource>(
+      csp.Get(), "http", "", 0, "", CSPSource::kNoWildcard,
+      CSPSource::kNoWildcard);
+  CSPSource* https_only = MakeGarbageCollected<CSPSource>(
+      csp.Get(), "https", "", 0, "", CSPSource::kNoWildcard,
+      CSPSource::kNoWildcard);
 
   for (const auto& test : cases) {
     // Setup default vectors.
@@ -674,12 +674,12 @@
 
     list_a.push_back(no_wildcards);
     // Add CSPSources based on the current test.
-    list_b.push_back(new CSPSource(
+    list_b.push_back(MakeGarbageCollected<CSPSource>(
         csp.Get(), test.source_b.scheme, test.source_b.host, 0,
         test.source_b.path, CSPSource::kNoWildcard, CSPSource::kNoWildcard));
-    list_a.push_back(
-        new CSPSource(csp.Get(), test.scheme_a, "second-example.com", 0, "/",
-                      CSPSource::kNoWildcard, CSPSource::kNoWildcard));
+    list_a.push_back(MakeGarbageCollected<CSPSource>(
+        csp.Get(), test.scheme_a, "second-example.com", 0, "/",
+        CSPSource::kNoWildcard, CSPSource::kNoWildcard));
     // listB contains: ["http://example.com/", test.listB]
     // listA contains: ["http://example.com/",
     // test.schemeA + "://second-example.com/"]
@@ -809,12 +809,12 @@
   };
 
   for (const auto& test : cases) {
-    CSPSource* a =
-        new CSPSource(csp.Get(), test.a.scheme, test.a.host, test.a.port,
-                      test.a.path, test.a.host_wildcard, test.a.port_wildcard);
-    CSPSource* b =
-        new CSPSource(csp.Get(), test.b.scheme, test.b.host, test.b.port,
-                      test.b.path, test.b.host_wildcard, test.b.port_wildcard);
+    CSPSource* a = MakeGarbageCollected<CSPSource>(
+        csp.Get(), test.a.scheme, test.a.host, test.a.port, test.a.path,
+        test.a.host_wildcard, test.a.port_wildcard);
+    CSPSource* b = MakeGarbageCollected<CSPSource>(
+        csp.Get(), test.b.scheme, test.b.host, test.b.port, test.b.path,
+        test.b.host_wildcard, test.b.port_wildcard);
 
     CSPSource* normalized = a->Intersect(b);
     Source intersect_ab = {
@@ -885,13 +885,13 @@
   };
 
   for (const auto& test : cases) {
-    CSPSource* a =
-        new CSPSource(csp.Get(), test.a.scheme, test.a.host, test.a.port,
-                      test.a.path, test.a.host_wildcard, test.a.port_wildcard);
+    CSPSource* a = MakeGarbageCollected<CSPSource>(
+        csp.Get(), test.a.scheme, test.a.host, test.a.port, test.a.path,
+        test.a.host_wildcard, test.a.port_wildcard);
 
-    CSPSource* b =
-        new CSPSource(csp.Get(), test.b.scheme, test.b.host, test.b.port,
-                      test.b.path, test.b.host_wildcard, test.b.port_wildcard);
+    CSPSource* b = MakeGarbageCollected<CSPSource>(
+        csp.Get(), test.b.scheme, test.b.host, test.b.port, test.b.path,
+        test.b.host_wildcard, test.b.port_wildcard);
 
     CSPSource* normalized = a->Intersect(b);
     Source intersect_ab = {
@@ -1020,7 +1020,7 @@
 
   KURL base;
   for (const auto& test : cases) {
-    CSPSource* self_source = new CSPSource(
+    CSPSource* self_source = MakeGarbageCollected<CSPSource>(
         csp.Get(), test.self_source.scheme, test.self_source.host,
         test.self_source.port, test.self_source.path,
         test.self_source.host_wildcard, test.self_source.port_wildcard);
diff --git a/third_party/blink/renderer/core/frame/csp/source_list_directive.cc b/third_party/blink/renderer/core/frame/csp/source_list_directive.cc
index cc8dd0e..b2c776b 100644
--- a/third_party/blink/renderer/core/frame/csp/source_list_directive.cc
+++ b/third_party/blink/renderer/core/frame/csp/source_list_directive.cc
@@ -165,8 +165,8 @@
       if (ContentSecurityPolicy::GetDirectiveType(host) !=
           ContentSecurityPolicy::DirectiveType::kUndefined)
         policy_->ReportDirectiveAsSourceExpression(directive_name_, host);
-      list_.push_back(new CSPSource(policy_, scheme, host, port, path,
-                                    host_wildcard, port_wildcard));
+      list_.push_back(MakeGarbageCollected<CSPSource>(
+          policy_, scheme, host, port, path, host_wildcard, port_wildcard));
     } else {
       policy_->ReportInvalidSourceExpression(
           directive_name_, String(begin_source, static_cast<wtf_size_t>(
@@ -695,19 +695,19 @@
     Member<CSPSource> self) const {
   HeapVector<Member<CSPSource>> sources = list_;
   if (allow_star_) {
-    sources.push_back(new CSPSource(policy_, "ftp", String(), 0, String(),
-                                    CSPSource::kNoWildcard,
-                                    CSPSource::kNoWildcard));
-    sources.push_back(new CSPSource(policy_, "ws", String(), 0, String(),
-                                    CSPSource::kNoWildcard,
-                                    CSPSource::kNoWildcard));
-    sources.push_back(new CSPSource(policy_, "http", String(), 0, String(),
-                                    CSPSource::kNoWildcard,
-                                    CSPSource::kNoWildcard));
+    sources.push_back(MakeGarbageCollected<CSPSource>(
+        policy_, "ftp", String(), 0, String(), CSPSource::kNoWildcard,
+        CSPSource::kNoWildcard));
+    sources.push_back(MakeGarbageCollected<CSPSource>(
+        policy_, "ws", String(), 0, String(), CSPSource::kNoWildcard,
+        CSPSource::kNoWildcard));
+    sources.push_back(MakeGarbageCollected<CSPSource>(
+        policy_, "http", String(), 0, String(), CSPSource::kNoWildcard,
+        CSPSource::kNoWildcard));
     if (self) {
-      sources.push_back(new CSPSource(policy_, self->GetScheme(), String(), 0,
-                                      String(), CSPSource::kNoWildcard,
-                                      CSPSource::kNoWildcard));
+      sources.push_back(MakeGarbageCollected<CSPSource>(
+          policy_, self->GetScheme(), String(), 0, String(),
+          CSPSource::kNoWildcard, CSPSource::kNoWildcard));
     }
   } else if (allow_self_ && self) {
     sources.push_back(self);
diff --git a/third_party/blink/renderer/core/frame/document_loading_rendering_test.cc b/third_party/blink/renderer/core/frame/document_loading_rendering_test.cc
index 632f550..f6de947 100644
--- a/third_party/blink/renderer/core/frame/document_loading_rendering_test.cc
+++ b/third_party/blink/renderer/core/frame/document_loading_rendering_test.cc
@@ -335,7 +335,7 @@
       ToHTMLIFrameElement(GetDocument().getElementById("frame"));
 
   // Frame while the child frame still has pending sheets.
-  auto* frame1_callback = new CheckRafCallback();
+  auto* frame1_callback = MakeGarbageCollected<CheckRafCallback>();
   child_frame->contentDocument()->RequestAnimationFrame(frame1_callback);
   auto frame1 = Compositor().BeginFrame();
   EXPECT_FALSE(frame1_callback->WasCalled());
@@ -347,7 +347,7 @@
   css_resource.Complete();
 
   // Frame with all lifecycle updates enabled.
-  auto* frame2_callback = new CheckRafCallback();
+  auto* frame2_callback = MakeGarbageCollected<CheckRafCallback>();
   child_frame->contentDocument()->RequestAnimationFrame(frame2_callback);
   auto frame2 = Compositor().BeginFrame();
   EXPECT_TRUE(frame1_callback->WasCalled());
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h
index ccfbc32..6dfc63b 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.h
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -42,7 +42,7 @@
 #include "content/test/stub_layer_tree_view_delegate.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/common/frame/frame_owner_element_type.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h"
 #include "third_party/blink/public/platform/web_mouse_event.h"
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 72df350..d248f04 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -108,7 +108,6 @@
 #include "third_party/blink/renderer/platform/json/json_values.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
-#include "third_party/blink/renderer/platform/network/network_state_notifier.h"
 #include "third_party/blink/renderer/platform/network/network_utils.h"
 #include "third_party/blink/renderer/platform/plugins/plugin_data.h"
 #include "third_party/blink/renderer/platform/plugins/plugin_script_forbidden_scope.h"
@@ -965,17 +964,14 @@
       in_view_source_mode_(false),
       inspector_task_runner_(InspectorTaskRunner::Create(
           GetTaskRunner(TaskType::kInternalInspector))),
-      interface_registry_(interface_registry),
-      is_save_data_enabled_(
-          !(GetSettings() && GetSettings()->GetDataSaverHoldbackWebApi()) &&
-          GetNetworkStateNotifier().SaveDataEnabled()) {
+      interface_registry_(interface_registry) {
   if (IsLocalRoot()) {
-    probe_sink_ = new CoreProbeSink();
+    probe_sink_ = MakeGarbageCollected<CoreProbeSink>();
     performance_monitor_ = MakeGarbageCollected<PerformanceMonitor>(this);
     inspector_trace_events_ = MakeGarbageCollected<InspectorTraceEvents>();
     probe_sink_->addInspectorTraceEvents(inspector_trace_events_);
     if (RuntimeEnabledFeatures::AdTaggingEnabled()) {
-      ad_tracker_ = new AdTracker(this);
+      ad_tracker_ = MakeGarbageCollected<AdTracker>(this);
     }
   } else {
     // Inertness only needs to be updated if this frame might inherit the
@@ -1372,10 +1368,6 @@
     return false;
   if (Owner() && !Owner()->ShouldLazyLoadChildren())
     return false;
-  if (RuntimeEnabledFeatures::RestrictLazyImageLoadingToDataSaverEnabled() &&
-      !is_save_data_enabled_) {
-    return false;
-  }
   return true;
 }
 
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index 2c4d2eaf..193c363 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -526,16 +526,6 @@
       previews_resource_loading_hints_receiver_;
 
   ClientHintsPreferences client_hints_preferences_;
-
-  // The value of |is_save_data_enabled_| is read once per frame from
-  // NetworkStateNotifier, which is guarded by a mutex lock, and cached locally
-  // here for performance.
-  // TODO(sclittle): This field doesn't really belong here - we should find some
-  // way to make the state of NetworkStateNotifier accessible without needing to
-  // acquire a mutex, such as by adding thread-local objects to hold the network
-  // state that get updated whenever the network state changes. That way, this
-  // field would be no longer necessary.
-  const bool is_save_data_enabled_;
 };
 
 inline FrameLoader& LocalFrame::Loader() const {
diff --git a/third_party/blink/renderer/core/frame/local_frame_test.cc b/third_party/blink/renderer/core/frame/local_frame_test.cc
index c1aafd6..09b2dfb 100644
--- a/third_party/blink/renderer/core/frame/local_frame_test.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_test.cc
@@ -5,13 +5,10 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/loader/empty_clients.h"
 #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
 #include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
-#include "third_party/blink/renderer/platform/network/network_state_notifier.h"
-#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 
 namespace blink {
 
@@ -23,14 +20,6 @@
     params.SetClientLoFiPlaceholder();
 }
 
-void DisableDataSaverHoldbackInSettings(Settings& settings) {
-  settings.SetDataSaverHoldbackWebApi(false);
-}
-
-void EnableDataSaverHoldbackInSettings(Settings& settings) {
-  settings.SetDataSaverHoldbackWebApi(true);
-}
-
 }  // namespace
 
 class TestLocalFrameClient : public EmptyLocalFrameClient {
@@ -48,15 +37,7 @@
   const WebURLRequest::PreviewsState frame_previews_state_;
 };
 
-class LocalFrameTest : public testing::Test {
- public:
-  void TearDown() override {
-    // Reset the global data saver setting to false at the end of the test.
-    GetNetworkStateNotifier().SetSaveDataEnabled(false);
-  }
-};
-
-TEST_F(LocalFrameTest, MaybeAllowPlaceholderImageUsesSpecifiedRequestValue) {
+TEST(LocalFrameTest, MaybeAllowPlaceholderImageUsesSpecifiedRequestValue) {
   ResourceRequest request1;
   request1.SetURL(KURL("http://insecure.com"));
   request1.SetPreviewsState(WebURLRequest::kClientLoFiOn);
@@ -79,7 +60,7 @@
   EXPECT_EQ(FetchParameters::kNone, params2.GetImageRequestOptimization());
 }
 
-TEST_F(LocalFrameTest, MaybeAllowPlaceholderImageUsesFramePreviewsState) {
+TEST(LocalFrameTest, MaybeAllowPlaceholderImageUsesFramePreviewsState) {
   ResourceRequest request1;
   request1.SetURL(KURL("http://insecure.com"));
   request1.SetPreviewsState(WebURLRequest::kPreviewsUnspecified);
@@ -105,8 +86,8 @@
   EXPECT_FALSE(page_holder2->GetFrame().IsUsingDataSavingPreview());
 }
 
-TEST_F(LocalFrameTest,
-       MaybeAllowPlaceholderImageConditionalOnSchemeForServerLoFi) {
+TEST(LocalFrameTest,
+     MaybeAllowPlaceholderImageConditionalOnSchemeForServerLoFi) {
   ResourceRequest request1;
   request1.SetURL(KURL("https://secure.com"));
   request1.SetPreviewsState(WebURLRequest::kPreviewsUnspecified);
@@ -131,7 +112,7 @@
   EXPECT_EQ(FetchParameters::kNone, params2.GetImageRequestOptimization());
 }
 
-TEST_F(LocalFrameTest, IsUsingDataSavingPreview) {
+TEST(LocalFrameTest, IsUsingDataSavingPreview) {
   EXPECT_TRUE(
       DummyPageHolder::Create(IntSize(800, 600), nullptr,
                               MakeGarbageCollected<TestLocalFrameClient>(
@@ -177,53 +158,4 @@
           .IsUsingDataSavingPreview());
 }
 
-TEST_F(LocalFrameTest, IsLazyLoadingImageAllowedWithFeatureDisabled) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(false);
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(800, 600), nullptr, nullptr, &DisableDataSaverHoldbackInSettings);
-  EXPECT_FALSE(page_holder->GetFrame().IsLazyLoadingImageAllowed());
-}
-
-TEST_F(LocalFrameTest, IsLazyLoadingImageAllowedWhenNotRestricted) {
-  ScopedLazyImageLoadingForTest scoped_lazy_image_loading_for_test(true);
-  ScopedRestrictLazyImageLoadingToDataSaverForTest
-      scoped_restrict_lazy_image_loading_to_data_saver_for_test_(false);
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(800, 600), nullptr, nullptr, &DisableDataSaverHoldbackInSettings);
-  EXPECT_TRUE(page_holder->GetFrame().IsLazyLoadingImageAllowed());
-}
-
-TEST_F(LocalFrameTest,
-       IsLazyLoadingImageAllowedWhenRestrictedWithDataSaverDisabled) {
-  ScopedLazyImageLoadingForTest scoped_lazy_image_loading_for_test(true);
-  ScopedRestrictLazyImageLoadingToDataSaverForTest
-      scoped_restrict_lazy_image_loading_to_data_saver_for_test_(true);
-  GetNetworkStateNotifier().SetSaveDataEnabled(false);
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(800, 600), nullptr, nullptr, &DisableDataSaverHoldbackInSettings);
-  EXPECT_FALSE(page_holder->GetFrame().IsLazyLoadingImageAllowed());
-}
-
-TEST_F(LocalFrameTest,
-       IsLazyLoadingImageAllowedWhenRestrictedWithDataSaverEnabledHoldback) {
-  ScopedLazyImageLoadingForTest scoped_lazy_image_loading_for_test(true);
-  ScopedRestrictLazyImageLoadingToDataSaverForTest
-      scoped_restrict_lazy_image_loading_to_data_saver_for_test_(true);
-  GetNetworkStateNotifier().SetSaveDataEnabled(true);
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(800, 600), nullptr, nullptr, &EnableDataSaverHoldbackInSettings);
-  EXPECT_FALSE(page_holder->GetFrame().IsLazyLoadingImageAllowed());
-}
-
-TEST_F(LocalFrameTest,
-       IsLazyLoadingImageAllowedWhenRestrictedWithDataSaverEnabled) {
-  ScopedLazyImageLoadingForTest scoped_lazy_image_loading_for_test(true);
-  ScopedRestrictLazyImageLoadingToDataSaverForTest
-      scoped_restrict_lazy_image_loading_to_data_saver_for_test_(true);
-  GetNetworkStateNotifier().SetSaveDataEnabled(true);
-  std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
-      IntSize(800, 600), nullptr, nullptr, &DisableDataSaverHoldbackInSettings);
-  EXPECT_TRUE(page_holder->GetFrame().IsLazyLoadingImageAllowed());
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index ede080e..a4c416cc 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -267,7 +267,7 @@
       paint_frame_count_(0),
       unique_id_(NewUniqueObjectId()),
       jank_tracker_(std::make_unique<JankTracker>(this)),
-      paint_timing_detector_(new PaintTimingDetector(this)) {
+      paint_timing_detector_(MakeGarbageCollected<PaintTimingDetector>(this)) {
   // Propagate the marginwidth/height and scrolling modes to the view.
   if (frame_->Owner() &&
       frame_->Owner()->ScrollingMode() == kScrollbarAlwaysOff)
diff --git a/third_party/blink/renderer/core/frame/local_frame_view_test.cc b/third_party/blink/renderer/core/frame/local_frame_view_test.cc
index 058ac94..014270e 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view_test.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view_test.cc
@@ -52,7 +52,7 @@
  protected:
   LocalFrameViewTest()
       : RenderingTest(SingleChildLocalFrameClient::Create()),
-        chrome_client_(new AnimationMockChromeClient) {
+        chrome_client_(MakeGarbageCollected<AnimationMockChromeClient>()) {
     EXPECT_CALL(GetAnimationMockChromeClient(), AttachRootGraphicsLayer(_, _))
         .Times(AnyNumber());
   }
diff --git a/third_party/blink/renderer/core/frame/page_scale_constraints_set.h b/third_party/blink/renderer/core/frame/page_scale_constraints_set.h
index 3571f7b..5a666d2 100644
--- a/third_party/blink/renderer/core/frame/page_scale_constraints_set.h
+++ b/third_party/blink/renderer/core/frame/page_scale_constraints_set.h
@@ -52,9 +52,11 @@
     : public GarbageCollected<PageScaleConstraintsSet> {
  public:
   static PageScaleConstraintsSet* Create(Page* page) {
-    return new PageScaleConstraintsSet(page);
+    return MakeGarbageCollected<PageScaleConstraintsSet>(page);
   }
 
+  PageScaleConstraintsSet(Page* page);
+
   void Trace(blink::Visitor*);
 
   void SetDefaultConstraints(const PageScaleConstraints&);
@@ -113,8 +115,6 @@
   IntSize InitialViewportSize() const { return icb_size_; }
 
  private:
-  PageScaleConstraintsSet(Page* page);
-
   PageScaleConstraints ComputeConstraintsStack() const;
 
   void AdjustFinalConstraintsToContentsSize();
diff --git a/third_party/blink/renderer/core/frame/pausable_script_executor.cc b/third_party/blink/renderer/core/frame/pausable_script_executor.cc
index 322cb06..d057673 100644
--- a/third_party/blink/renderer/core/frame/pausable_script_executor.cc
+++ b/third_party/blink/renderer/core/frame/pausable_script_executor.cc
@@ -142,7 +142,8 @@
   ScriptState* script_state = ToScriptState(frame, *world);
   return MakeGarbageCollected<PausableScriptExecutor>(
       frame, script_state, callback,
-      new WebScriptExecutor(sources, world->GetWorldId(), user_gesture));
+      MakeGarbageCollected<WebScriptExecutor>(sources, world->GetWorldId(),
+                                              user_gesture));
 }
 
 void PausableScriptExecutor::CreateAndRun(
@@ -163,7 +164,8 @@
   PausableScriptExecutor* executor =
       MakeGarbageCollected<PausableScriptExecutor>(
           frame, script_state, callback,
-          new V8FunctionExecutor(isolate, function, receiver, argc, argv));
+          MakeGarbageCollected<V8FunctionExecutor>(isolate, function, receiver,
+                                                   argc, argv));
   executor->Run();
 }
 
diff --git a/third_party/blink/renderer/core/frame/visual_viewport_test.cc b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
index 9af2fe5..92085cc6 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport_test.cc
+++ b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
@@ -9,7 +9,7 @@
 #include "cc/layers/picture_layer.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_coalesced_input_event.h"
 #include "third_party/blink/public/platform/web_input_event.h"
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 6f286a3..da22f45 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -1520,11 +1520,11 @@
   }
 
   if (plugin_container && plugin_container->SupportsPaginatedPrint()) {
-    print_context_ = new ChromePluginPrintContext(GetFrame(), plugin_container,
-                                                  print_params);
+    print_context_ = MakeGarbageCollected<ChromePluginPrintContext>(
+        GetFrame(), plugin_container, print_params);
   } else {
-    print_context_ =
-        new ChromePrintContext(GetFrame(), print_params.use_printing_layout);
+    print_context_ = MakeGarbageCollected<ChromePrintContext>(
+        GetFrame(), print_params.use_printing_layout);
   }
 
   FloatSize size(static_cast<float>(print_params.print_content_area.width),
diff --git a/third_party/blink/renderer/core/html/BUILD.gn b/third_party/blink/renderer/core/html/BUILD.gn
index 483f737a..5c981ed 100644
--- a/third_party/blink/renderer/core/html/BUILD.gn
+++ b/third_party/blink/renderer/core/html/BUILD.gn
@@ -227,8 +227,6 @@
     "forms/internal_popup_menu.h",
     "forms/keyboard_clickable_input_type_view.cc",
     "forms/keyboard_clickable_input_type_view.h",
-    "forms/labelable_element.cc",
-    "forms/labelable_element.h",
     "forms/labels_node_list.cc",
     "forms/labels_node_list.h",
     "forms/listed_element.cc",
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.cc b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.cc
index 78cd5f0a..55d61a5f 100644
--- a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.cc
+++ b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.cc
@@ -41,7 +41,7 @@
   AnchorElementMetricsSender* sender =
       Supplement<Document>::From<AnchorElementMetricsSender>(document);
   if (!sender) {
-    sender = new AnchorElementMetricsSender(document);
+    sender = MakeGarbageCollected<AnchorElementMetricsSender>(document);
     ProvideTo(document, sender);
   }
   return sender;
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h
index 17a34d1..d050dad 100644
--- a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h
+++ b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h
@@ -28,6 +28,7 @@
  public:
   static const char kSupplementName[];
 
+  explicit AnchorElementMetricsSender(Document&);
   virtual ~AnchorElementMetricsSender();
 
   // Returns the anchor element metrics sender of the root document of
@@ -55,8 +56,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  explicit AnchorElementMetricsSender(Document&);
-
   // Associates |metrics_host_| with the IPC interface if not already, so it can
   // be used to send messages. Returns true if associated, false otherwise.
   bool AssociateInterface();
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition.cc b/third_party/blink/renderer/core/html/custom/custom_element_definition.cc
index 30979be..cfb9ff48 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_definition.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_definition.cc
@@ -256,25 +256,29 @@
 void CustomElementDefinition::EnqueueUpgradeReaction(
     Element* element,
     bool upgrade_invisible_elements) {
-  CustomElement::Enqueue(element, new CustomElementUpgradeReaction(
-                                      this, upgrade_invisible_elements));
+  CustomElement::Enqueue(element,
+                         MakeGarbageCollected<CustomElementUpgradeReaction>(
+                             this, upgrade_invisible_elements));
 }
 
 void CustomElementDefinition::EnqueueConnectedCallback(Element* element) {
-  CustomElement::Enqueue(element,
-                         new CustomElementConnectedCallbackReaction(this));
+  CustomElement::Enqueue(
+      element,
+      MakeGarbageCollected<CustomElementConnectedCallbackReaction>(this));
 }
 
 void CustomElementDefinition::EnqueueDisconnectedCallback(Element* element) {
-  CustomElement::Enqueue(element,
-                         new CustomElementDisconnectedCallbackReaction(this));
+  CustomElement::Enqueue(
+      element,
+      MakeGarbageCollected<CustomElementDisconnectedCallbackReaction>(this));
 }
 
 void CustomElementDefinition::EnqueueAdoptedCallback(Element* element,
                                                      Document* old_document,
                                                      Document* new_document) {
-  CustomElementReaction* reaction = new CustomElementAdoptedCallbackReaction(
-      this, old_document, new_document);
+  CustomElementReaction* reaction =
+      MakeGarbageCollected<CustomElementAdoptedCallbackReaction>(
+          this, old_document, new_document);
   CustomElement::Enqueue(element, reaction);
 }
 
@@ -283,9 +287,10 @@
     const QualifiedName& name,
     const AtomicString& old_value,
     const AtomicString& new_value) {
-  CustomElement::Enqueue(element,
-                         new CustomElementAttributeChangedCallbackReaction(
-                             this, name, old_value, new_value));
+  CustomElement::Enqueue(
+      element,
+      MakeGarbageCollected<CustomElementAttributeChangedCallbackReaction>(
+          this, name, old_value, new_value));
 }
 
 void CustomElementDefinition::EnqueueAttributeChangedCallbackForAllAttributes(
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_queue_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_reaction_queue_test.cc
index 651efd1e..6c3047f 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_queue_test.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_queue_test.cc
@@ -16,7 +16,8 @@
 
 TEST(CustomElementReactionQueueTest, invokeReactions_one) {
   std::vector<char> log;
-  CustomElementReactionQueue* queue = new CustomElementReactionQueue();
+  CustomElementReactionQueue* queue =
+      MakeGarbageCollected<CustomElementReactionQueue>();
   HeapVector<Member<Command>>* commands =
       MakeGarbageCollected<HeapVector<Member<Command>>>();
   commands->push_back(MakeGarbageCollected<Log>('a', log));
@@ -28,7 +29,8 @@
 
 TEST(CustomElementReactionQueueTest, invokeReactions_many) {
   std::vector<char> log;
-  CustomElementReactionQueue* queue = new CustomElementReactionQueue();
+  CustomElementReactionQueue* queue =
+      MakeGarbageCollected<CustomElementReactionQueue>();
   {
     HeapVector<Member<Command>>* commands =
         MakeGarbageCollected<HeapVector<Member<Command>>>();
@@ -54,7 +56,8 @@
 
 TEST(CustomElementReactionQueueTest, invokeReactions_recursive) {
   std::vector<char> log;
-  CustomElementReactionQueue* queue = new CustomElementReactionQueue();
+  CustomElementReactionQueue* queue =
+      MakeGarbageCollected<CustomElementReactionQueue>();
 
   HeapVector<Member<Command>>* third_commands =
       MakeGarbageCollected<HeapVector<Member<Command>>>();
@@ -86,7 +89,8 @@
 
 TEST(CustomElementReactionQueueTest, clear_duringInvoke) {
   std::vector<char> log;
-  CustomElementReactionQueue* queue = new CustomElementReactionQueue();
+  CustomElementReactionQueue* queue =
+      MakeGarbageCollected<CustomElementReactionQueue>();
 
   {
     HeapVector<Member<Command>>* commands =
@@ -97,7 +101,7 @@
   {
     HeapVector<Member<Command>>* commands =
         MakeGarbageCollected<HeapVector<Member<Command>>>();
-    commands->push_back(new Call(WTF::Bind(
+    commands->push_back(MakeGarbageCollected<Call>(WTF::Bind(
         [](CustomElementReactionQueue* queue, Element*) { queue->Clear(); },
         WrapPersistent(queue))));
     queue->Add(MakeGarbageCollected<TestReaction>(commands));
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.cc b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.cc
index 48b65d6..ee327edb 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.cc
@@ -17,7 +17,7 @@
 Persistent<CustomElementReactionStack>& GetCustomElementReactionStack() {
   DEFINE_STATIC_LOCAL(Persistent<CustomElementReactionStack>,
                       custom_element_reaction_stack,
-                      (new CustomElementReactionStack));
+                      (MakeGarbageCollected<CustomElementReactionStack>()));
   return custom_element_reaction_stack;
 }
 
@@ -71,7 +71,7 @@
 
   CustomElementReactionQueue* reactions = map_.at(element);
   if (!reactions) {
-    reactions = new CustomElementReactionQueue();
+    reactions = MakeGarbageCollected<CustomElementReactionQueue>();
     map_.insert(element, reactions);
   }
 
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack_test.cc
index 49ec44d..9c9b66a 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack_test.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack_test.cc
@@ -19,7 +19,8 @@
 TEST(CustomElementReactionStackTest, one) {
   std::vector<char> log;
 
-  CustomElementReactionStack* stack = new CustomElementReactionStack();
+  CustomElementReactionStack* stack =
+      MakeGarbageCollected<CustomElementReactionStack>();
   stack->Push();
   HeapVector<Member<Command>>* commands =
       MakeGarbageCollected<HeapVector<Member<Command>>>();
@@ -35,7 +36,8 @@
 TEST(CustomElementReactionStackTest, multipleElements) {
   std::vector<char> log;
 
-  CustomElementReactionStack* stack = new CustomElementReactionStack();
+  CustomElementReactionStack* stack =
+      MakeGarbageCollected<CustomElementReactionStack>();
   stack->Push();
   {
     HeapVector<Member<Command>>* commands =
@@ -60,7 +62,8 @@
 TEST(CustomElementReactionStackTest, popTopEmpty) {
   std::vector<char> log;
 
-  CustomElementReactionStack* stack = new CustomElementReactionStack();
+  CustomElementReactionStack* stack =
+      MakeGarbageCollected<CustomElementReactionStack>();
   stack->Push();
   HeapVector<Member<Command>>* commands =
       MakeGarbageCollected<HeapVector<Member<Command>>>();
@@ -77,7 +80,8 @@
 TEST(CustomElementReactionStackTest, popTop) {
   std::vector<char> log;
 
-  CustomElementReactionStack* stack = new CustomElementReactionStack();
+  CustomElementReactionStack* stack =
+      MakeGarbageCollected<CustomElementReactionStack>();
   stack->Push();
   {
     HeapVector<Member<Command>>* commands =
@@ -105,7 +109,8 @@
 
   Element* element = CreateElement("a");
 
-  CustomElementReactionStack* stack = new CustomElementReactionStack();
+  CustomElementReactionStack* stack =
+      MakeGarbageCollected<CustomElementReactionStack>();
   stack->Push();
   {
     HeapVector<Member<Command>>* commands =
@@ -139,7 +144,8 @@
 
   Element* element = CreateElement("a");
 
-  CustomElementReactionStack* stack = new CustomElementReactionStack();
+  CustomElementReactionStack* stack =
+      MakeGarbageCollected<CustomElementReactionStack>();
   stack->Push();
   {
     HeapVector<Member<Command>>* commands =
@@ -210,7 +216,8 @@
 
   Element* element = CreateElement("a");
 
-  CustomElementReactionStack* stack = new CustomElementReactionStack();
+  CustomElementReactionStack* stack =
+      MakeGarbageCollected<CustomElementReactionStack>();
   stack->Push();
   {
     HeapVector<Member<Command>>* subcommands =
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h b/third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h
index 396d89d6..3e9d5886 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h
@@ -129,7 +129,7 @@
   STACK_ALLOCATED();
  public:
   ResetCustomElementReactionStackForTest()
-      : stack_(new CustomElementReactionStack),
+      : stack_(MakeGarbageCollected<CustomElementReactionStack>()),
         old_stack_(
             CustomElementReactionStackTestSupport::SetCurrentForTest(stack_)) {}
 
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry.cc b/third_party/blink/renderer/core/html/custom/custom_element_registry.cc
index 866bdc2..1afb1a2 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_registry.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_registry.cc
@@ -78,7 +78,8 @@
 
 CustomElementRegistry* CustomElementRegistry::Create(
     const LocalDOMWindow* owner) {
-  CustomElementRegistry* registry = new CustomElementRegistry(owner);
+  CustomElementRegistry* registry =
+      MakeGarbageCollected<CustomElementRegistry>(owner);
   Document* document = owner->document();
   if (V0CustomElementRegistrationContext* v0 =
           document ? document->RegistrationContext() : nullptr)
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry.h b/third_party/blink/renderer/core/html/custom/custom_element_registry.h
index 5b3f448..5c6f14d0 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_registry.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_registry.h
@@ -37,6 +37,7 @@
  public:
   static CustomElementRegistry* Create(const LocalDOMWindow*);
 
+  CustomElementRegistry(const LocalDOMWindow*);
   ~CustomElementRegistry() override = default;
 
   CustomElementDefinition* define(ScriptState*,
@@ -67,8 +68,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  CustomElementRegistry(const LocalDOMWindow*);
-
   CustomElementDefinition* DefineInternal(ScriptState*,
                                           const AtomicString& name,
                                           CustomElementDefinitionBuilder&,
diff --git a/third_party/blink/renderer/core/html/custom/v0_custom_element_callback_invocation.cc b/third_party/blink/renderer/core/html/custom/v0_custom_element_callback_invocation.cc
index d34f4a8b..1924c23 100644
--- a/third_party/blink/renderer/core/html/custom/v0_custom_element_callback_invocation.cc
+++ b/third_party/blink/renderer/core/html/custom/v0_custom_element_callback_invocation.cc
@@ -124,11 +124,11 @@
     V0CustomElementLifecycleCallbacks::CallbackType which) {
   switch (which) {
     case V0CustomElementLifecycleCallbacks::kCreatedCallback:
-      return new CreatedInvocation(callbacks);
+      return MakeGarbageCollected<CreatedInvocation>(callbacks);
 
     case V0CustomElementLifecycleCallbacks::kAttachedCallback:
     case V0CustomElementLifecycleCallbacks::kDetachedCallback:
-      return new AttachedDetachedInvocation(callbacks, which);
+      return MakeGarbageCollected<AttachedDetachedInvocation>(callbacks, which);
     default:
       NOTREACHED();
       return nullptr;
@@ -141,7 +141,8 @@
     const AtomicString& name,
     const AtomicString& old_value,
     const AtomicString& new_value) {
-  return new AttributeChangedInvocation(callbacks, name, old_value, new_value);
+  return MakeGarbageCollected<AttributeChangedInvocation>(callbacks, name,
+                                                          old_value, new_value);
 }
 
 void V0CustomElementCallbackInvocation::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/html/custom/v0_custom_element_microtask_dispatcher.cc b/third_party/blink/renderer/core/html/custom/v0_custom_element_microtask_dispatcher.cc
index cd2b1f7..81aa12e 100644
--- a/third_party/blink/renderer/core/html/custom/v0_custom_element_microtask_dispatcher.cc
+++ b/third_party/blink/renderer/core/html/custom/v0_custom_element_microtask_dispatcher.cc
@@ -20,8 +20,9 @@
 
 V0CustomElementMicrotaskDispatcher&
 V0CustomElementMicrotaskDispatcher::Instance() {
-  DEFINE_STATIC_LOCAL(Persistent<V0CustomElementMicrotaskDispatcher>, instance,
-                      (new V0CustomElementMicrotaskDispatcher));
+  DEFINE_STATIC_LOCAL(
+      Persistent<V0CustomElementMicrotaskDispatcher>, instance,
+      (MakeGarbageCollected<V0CustomElementMicrotaskDispatcher>()));
   return *instance;
 }
 
diff --git a/third_party/blink/renderer/core/html/custom/v0_custom_element_microtask_dispatcher.h b/third_party/blink/renderer/core/html/custom/v0_custom_element_microtask_dispatcher.h
index f621b95..482fe54 100644
--- a/third_party/blink/renderer/core/html/custom/v0_custom_element_microtask_dispatcher.h
+++ b/third_party/blink/renderer/core/html/custom/v0_custom_element_microtask_dispatcher.h
@@ -18,6 +18,8 @@
  public:
   static V0CustomElementMicrotaskDispatcher& Instance();
 
+  V0CustomElementMicrotaskDispatcher();
+
   void Enqueue(V0CustomElementCallbackQueue*);
 
   bool ElementQueueIsEmpty() { return elements_.IsEmpty(); }
@@ -25,8 +27,6 @@
   void Trace(blink::Visitor*);
 
  private:
-  V0CustomElementMicrotaskDispatcher();
-
   void EnsureMicrotaskScheduledForElementQueue();
   void EnsureMicrotaskScheduled();
 
diff --git a/third_party/blink/renderer/core/html/custom/v0_custom_element_processing_stack.cc b/third_party/blink/renderer/core/html/custom/v0_custom_element_processing_stack.cc
index ea9b988..1669ee0 100644
--- a/third_party/blink/renderer/core/html/custom/v0_custom_element_processing_stack.cc
+++ b/third_party/blink/renderer/core/html/custom/v0_custom_element_processing_stack.cc
@@ -43,7 +43,7 @@
 
 V0CustomElementProcessingStack& V0CustomElementProcessingStack::Instance() {
   DEFINE_STATIC_LOCAL(Persistent<V0CustomElementProcessingStack>, instance,
-                      (new V0CustomElementProcessingStack));
+                      (MakeGarbageCollected<V0CustomElementProcessingStack>()));
   return *instance;
 }
 
diff --git a/third_party/blink/renderer/core/html/custom/v0_custom_element_processing_stack.h b/third_party/blink/renderer/core/html/custom/v0_custom_element_processing_stack.h
index a2a799e..f03db16 100644
--- a/third_party/blink/renderer/core/html/custom/v0_custom_element_processing_stack.h
+++ b/third_party/blink/renderer/core/html/custom/v0_custom_element_processing_stack.h
@@ -62,12 +62,6 @@
 
   static bool InCallbackDeliveryScope() { return element_queue_start_; }
 
-  static V0CustomElementProcessingStack& Instance();
-  void Enqueue(V0CustomElementCallbackQueue*);
-
-  void Trace(blink::Visitor*);
-
- private:
   V0CustomElementProcessingStack() {
     // Add a null element as a sentinel. This makes it possible to
     // identify elements queued when there is no
@@ -80,6 +74,12 @@
     DCHECK_EQ(element_queue_end_, flattened_processing_stack_.size());
   }
 
+  static V0CustomElementProcessingStack& Instance();
+  void Enqueue(V0CustomElementCallbackQueue*);
+
+  void Trace(blink::Visitor*);
+
+ private:
   // The start of the element queue on the top of the processing
   // stack. An offset into Instance().flattened_processing_stack_.
   static wtf_size_t element_queue_start_;
diff --git a/third_party/blink/renderer/core/html/forms/button_input_type.cc b/third_party/blink/renderer/core/html/forms/button_input_type.cc
index f9a3738..b4e301b3 100644
--- a/third_party/blink/renderer/core/html/forms/button_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/button_input_type.cc
@@ -35,7 +35,7 @@
 namespace blink {
 
 InputType* ButtonInputType::Create(HTMLInputElement& element) {
-  return new ButtonInputType(element);
+  return MakeGarbageCollected<ButtonInputType>(element);
 }
 
 const AtomicString& ButtonInputType::FormControlType() const {
diff --git a/third_party/blink/renderer/core/html/forms/button_input_type.h b/third_party/blink/renderer/core/html/forms/button_input_type.h
index 479bd80..85dae08 100644
--- a/third_party/blink/renderer/core/html/forms/button_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/button_input_type.h
@@ -39,8 +39,9 @@
  public:
   static InputType* Create(HTMLInputElement&);
 
- private:
   ButtonInputType(HTMLInputElement& element) : BaseButtonInputType(element) {}
+
+ private:
   const AtomicString& FormControlType() const override;
   bool SupportsValidation() const override;
   bool IsTextButton() const override;
diff --git a/third_party/blink/renderer/core/html/forms/checkbox_input_type.cc b/third_party/blink/renderer/core/html/forms/checkbox_input_type.cc
index 26a4522f..3951c51 100644
--- a/third_party/blink/renderer/core/html/forms/checkbox_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/checkbox_input_type.cc
@@ -39,7 +39,7 @@
 namespace blink {
 
 InputType* CheckboxInputType::Create(HTMLInputElement& element) {
-  return new CheckboxInputType(element);
+  return MakeGarbageCollected<CheckboxInputType>(element);
 }
 
 const AtomicString& CheckboxInputType::FormControlType() const {
@@ -66,7 +66,7 @@
   // checking we do here.  The ClickHandlingState object contains what we need
   // to undo what we did here in didDispatchClick.
 
-  ClickHandlingState* state = new ClickHandlingState;
+  ClickHandlingState* state = MakeGarbageCollected<ClickHandlingState>();
 
   state->checked = GetElement().checked();
   state->indeterminate = GetElement().indeterminate();
diff --git a/third_party/blink/renderer/core/html/forms/checkbox_input_type.h b/third_party/blink/renderer/core/html/forms/checkbox_input_type.h
index 425616c..57a55e7 100644
--- a/third_party/blink/renderer/core/html/forms/checkbox_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/checkbox_input_type.h
@@ -39,9 +39,10 @@
  public:
   static InputType* Create(HTMLInputElement&);
 
- private:
   CheckboxInputType(HTMLInputElement& element)
       : BaseCheckableInputType(element) {}
+
+ private:
   const AtomicString& FormControlType() const override;
   bool ValueMissing(const String&) const override;
   String ValueMissingText() const override;
diff --git a/third_party/blink/renderer/core/html/forms/chooser_only_temporal_input_type_view.cc b/third_party/blink/renderer/core/html/forms/chooser_only_temporal_input_type_view.cc
index a20f301..653a14d 100644
--- a/third_party/blink/renderer/core/html/forms/chooser_only_temporal_input_type_view.cc
+++ b/third_party/blink/renderer/core/html/forms/chooser_only_temporal_input_type_view.cc
@@ -45,7 +45,8 @@
 ChooserOnlyTemporalInputTypeView* ChooserOnlyTemporalInputTypeView::Create(
     HTMLInputElement& element,
     BaseTemporalInputType& input_type) {
-  return new ChooserOnlyTemporalInputTypeView(element, input_type);
+  return MakeGarbageCollected<ChooserOnlyTemporalInputTypeView>(element,
+                                                                input_type);
 }
 
 ChooserOnlyTemporalInputTypeView::~ChooserOnlyTemporalInputTypeView() {
diff --git a/third_party/blink/renderer/core/html/forms/chooser_only_temporal_input_type_view.h b/third_party/blink/renderer/core/html/forms/chooser_only_temporal_input_type_view.h
index 93888314..8bb8f7f 100644
--- a/third_party/blink/renderer/core/html/forms/chooser_only_temporal_input_type_view.h
+++ b/third_party/blink/renderer/core/html/forms/chooser_only_temporal_input_type_view.h
@@ -44,11 +44,11 @@
  public:
   static ChooserOnlyTemporalInputTypeView* Create(HTMLInputElement&,
                                                   BaseTemporalInputType&);
+  ChooserOnlyTemporalInputTypeView(HTMLInputElement&, BaseTemporalInputType&);
   ~ChooserOnlyTemporalInputTypeView() override;
   void Trace(blink::Visitor*) override;
 
  private:
-  ChooserOnlyTemporalInputTypeView(HTMLInputElement&, BaseTemporalInputType&);
   void CloseDateTimeChooser();
 
   // InputTypeView functions:
diff --git a/third_party/blink/renderer/core/html/forms/clear_button_element.cc b/third_party/blink/renderer/core/html/forms/clear_button_element.cc
index 2efb31cf..ee59cc8 100644
--- a/third_party/blink/renderer/core/html/forms/clear_button_element.cc
+++ b/third_party/blink/renderer/core/html/forms/clear_button_element.cc
@@ -44,7 +44,7 @@
     Document& document,
     ClearButtonOwner& clear_button_owner) {
   ClearButtonElement* element =
-      new ClearButtonElement(document, clear_button_owner);
+      MakeGarbageCollected<ClearButtonElement>(document, clear_button_owner);
   element->SetShadowPseudoId(AtomicString("-webkit-clear-button"));
   element->setAttribute(kIdAttr, shadow_element_names::ClearButton());
   return element;
diff --git a/third_party/blink/renderer/core/html/forms/clear_button_element.h b/third_party/blink/renderer/core/html/forms/clear_button_element.h
index 6666122..6fd8d0b 100644
--- a/third_party/blink/renderer/core/html/forms/clear_button_element.h
+++ b/third_party/blink/renderer/core/html/forms/clear_button_element.h
@@ -42,12 +42,14 @@
   };
 
   static ClearButtonElement* Create(Document&, ClearButtonOwner&);
+
+  ClearButtonElement(Document&, ClearButtonOwner&);
+
   void RemoveClearButtonOwner() { clear_button_owner_ = nullptr; }
 
   void Trace(blink::Visitor*) override;
 
  private:
-  ClearButtonElement(Document&, ClearButtonOwner&);
   void DetachLayoutTree(const AttachContext& = AttachContext()) override;
   bool IsMouseFocusable() const override { return false; }
   void DefaultEventHandler(Event&) override;
diff --git a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.h b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.h
index 53d750e..9d820d4 100644
--- a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.h
+++ b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.h
@@ -46,9 +46,13 @@
       LocalFrame* frame,
       ChromeClient* chrome_client,
       blink::ColorChooserClient* client) {
-    return new ColorChooserPopupUIController(frame, chrome_client, client);
+    return MakeGarbageCollected<ColorChooserPopupUIController>(
+        frame, chrome_client, client);
   }
 
+  ColorChooserPopupUIController(LocalFrame*,
+                                ChromeClient*,
+                                blink::ColorChooserClient*);
   ~ColorChooserPopupUIController() override;
   void Trace(blink::Visitor*) override;
 
@@ -70,10 +74,6 @@
   void DidClosePopup() override;
 
  private:
-  ColorChooserPopupUIController(LocalFrame*,
-                                ChromeClient*,
-                                blink::ColorChooserClient*);
-
   void OpenPopup();
   void Dispose();
 
diff --git a/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.h b/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.h
index 311c2a2..509c08d 100644
--- a/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.h
+++ b/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.h
@@ -49,9 +49,10 @@
  public:
   static ColorChooserUIController* Create(LocalFrame* frame,
                                           blink::ColorChooserClient* client) {
-    return new ColorChooserUIController(frame, client);
+    return MakeGarbageCollected<ColorChooserUIController>(frame, client);
   }
 
+  ColorChooserUIController(LocalFrame*, blink::ColorChooserClient*);
   ~ColorChooserUIController() override;
   void Trace(blink::Visitor*) override;
 
@@ -68,8 +69,6 @@
   void DidChooseColor(uint32_t color) final;
 
  protected:
-  ColorChooserUIController(LocalFrame*, blink::ColorChooserClient*);
-
   void OpenColorChooser();
   mojom::blink::ColorChooserPtr chooser_;
   Member<blink::ColorChooserClient> client_;
diff --git a/third_party/blink/renderer/core/html/forms/color_input_type.cc b/third_party/blink/renderer/core/html/forms/color_input_type.cc
index 88a556c..1dc2430 100644
--- a/third_party/blink/renderer/core/html/forms/color_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/color_input_type.cc
@@ -77,7 +77,7 @@
     : InputType(element), KeyboardClickableInputTypeView(element) {}
 
 InputType* ColorInputType::Create(HTMLInputElement& element) {
-  return new ColorInputType(element);
+  return MakeGarbageCollected<ColorInputType>(element);
 }
 
 ColorInputType::~ColorInputType() = default;
diff --git a/third_party/blink/renderer/core/html/forms/color_input_type.h b/third_party/blink/renderer/core/html/forms/color_input_type.h
index 904ada1..086e2f7f 100644
--- a/third_party/blink/renderer/core/html/forms/color_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/color_input_type.h
@@ -46,6 +46,7 @@
 
  public:
   static InputType* Create(HTMLInputElement&);
+  explicit ColorInputType(HTMLInputElement&);
   ~ColorInputType() override;
   void Trace(blink::Visitor*) override;
   using InputType::GetElement;
@@ -61,7 +62,6 @@
   ColorChooserClient* GetColorChooserClient() override;
 
  private:
-  explicit ColorInputType(HTMLInputElement&);
   InputTypeView* CreateView() override;
   ValueMode GetValueMode() const override;
   void ValueAttributeChanged() override;
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type_test.cc b/third_party/blink/renderer/core/html/forms/file_input_type_test.cc
index 47afb404..04c54f3 100644
--- a/third_party/blink/renderer/core/html/forms/file_input_type_test.cc
+++ b/third_party/blink/renderer/core/html/forms/file_input_type_test.cc
@@ -127,7 +127,7 @@
 TEST(FileInputTypeTest, DropTouchesNoPopupOpeningObserver) {
   Page::PageClients page_clients;
   FillWithEmptyClients(page_clients);
-  auto* chrome_client = new WebKitDirectoryChromeClient;
+  auto* chrome_client = MakeGarbageCollected<WebKitDirectoryChromeClient>();
   page_clients.chrome_client = chrome_client;
   auto page_holder = DummyPageHolder::Create(IntSize(), &page_clients);
   Document& doc = page_holder->GetDocument();
diff --git a/third_party/blink/renderer/core/html/forms/form_data.cc b/third_party/blink/renderer/core/html/forms/form_data.cc
index f3dd566a..f302173 100644
--- a/third_party/blink/renderer/core/html/forms/form_data.cc
+++ b/third_party/blink/renderer/core/html/forms/form_data.cc
@@ -322,7 +322,7 @@
 
 PairIterable<String, FormDataEntryValue>::IterationSource*
 FormData::StartIteration(ScriptState*, ExceptionState&) {
-  return new FormDataIterationSource(this);
+  return MakeGarbageCollected<FormDataIterationSource>(this);
 }
 
 // ----------------------------------------------------------------
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.h b/third_party/blink/renderer/core/html/forms/html_button_element.h
index 9347255..b281a09 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.h
@@ -61,7 +61,7 @@
   void AppendToFormData(FormData&) override;
 
   bool IsEnumeratable() const override { return true; }
-  bool SupportLabels() const override { return true; }
+  bool IsLabelable() const override { return true; }
   bool ShouldForceLegacyLayout() const final { return true; }
   bool IsInteractiveContent() const override;
   bool SupportsAutofocus() const override;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index eab7f27..f8ad596 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -50,7 +50,7 @@
 
 HTMLFormControlElement::HTMLFormControlElement(const QualifiedName& tag_name,
                                                Document& document)
-    : LabelableElement(tag_name, document),
+    : HTMLElement(tag_name, document),
       autofill_state_(WebAutofillState::kNotFilled),
       data_list_ancestor_state_(kUnknown),
       has_validation_message_(false),
@@ -68,7 +68,7 @@
 
 void HTMLFormControlElement::Trace(blink::Visitor* visitor) {
   ListedElement::Trace(visitor);
-  LabelableElement::Trace(visitor);
+  HTMLElement::Trace(visitor);
 }
 
 String HTMLFormControlElement::formAction() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
index 42397ca..abe6e88 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -29,8 +29,8 @@
 #include "third_party/blink/public/web/web_autofill_state.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/html/forms/form_associated.h"
-#include "third_party/blink/renderer/core/html/forms/labelable_element.h"
 #include "third_party/blink/renderer/core/html/forms/listed_element.h"
+#include "third_party/blink/renderer/core/html/html_element.h"
 
 namespace blink {
 
@@ -45,7 +45,7 @@
 // HTMLFormControlElement is the default implementation of
 // ListedElement, and listed element implementations should use
 // HTMLFormControlElement unless there is a special reason.
-class CORE_EXPORT HTMLFormControlElement : public LabelableElement,
+class CORE_EXPORT HTMLFormControlElement : public HTMLElement,
                                            public ListedElement,
                                            public FormAssociated {
   USING_GARBAGE_COLLECTED_MIXIN(HTMLFormControlElement);
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_test.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element_test.cc
index a152ce28..cdb3337 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_test.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_test.cc
@@ -117,7 +117,7 @@
 TEST_F(HTMLFormControlElementTest, UpdateValidationMessageSkippedIfPrinting) {
   SetHtmlInnerHTML("<body><input required id=input></body>");
   ValidationMessageClient* validation_message_client =
-      new MockFormValidationMessageClient();
+      MakeGarbageCollected<MockFormValidationMessageClient>();
   GetPage().SetValidationMessageClientForTesting(validation_message_client);
   Page::OrdinaryPages().insert(&GetPage());
 
@@ -137,7 +137,8 @@
       ToHTMLFormControlElement(GetDocument().QuerySelector("select"));
   auto* const optgroup =
       GetDocument().CreateRawElement(html_names::kOptgroupTag);
-  auto* validation_client = new MockFormValidationMessageClient();
+  auto* validation_client =
+      MakeGarbageCollected<MockFormValidationMessageClient>();
   GetDocument().GetPage()->SetValidationMessageClientForTesting(
       validation_client);
 
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc
index 9922ca55..52d56d24f8 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -1701,7 +1701,7 @@
   return input_type_->IsEnumeratable();
 }
 
-bool HTMLInputElement::SupportLabels() const {
+bool HTMLInputElement::IsLabelable() const {
   return input_type_->IsInteractiveContent();
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.h b/third_party/blink/renderer/core/html/forms/html_input_element.h
index 75f9122..e48c4882 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.h
@@ -327,7 +327,7 @@
   bool MayTriggerVirtualKeyboard() const final;
   bool IsEnumeratable() const final;
   bool IsInteractiveContent() const final;
-  bool SupportLabels() const final;
+  bool IsLabelable() const final;
   bool MatchesDefaultPseudoClass() const override;
 
   bool IsTextControl() const final { return IsTextField(); }
diff --git a/third_party/blink/renderer/core/html/forms/html_label_element.cc b/third_party/blink/renderer/core/html/forms/html_label_element.cc
index 3fea461..d7543a0 100644
--- a/third_party/blink/renderer/core/html/forms/html_label_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_label_element.cc
@@ -50,16 +50,15 @@
   return MakeGarbageCollected<HTMLLabelElement>(document);
 }
 
-LabelableElement* HTMLLabelElement::control() const {
+HTMLElement* HTMLLabelElement::control() const {
+  // https://html.spec.whatwg.org/multipage/forms.html#labeled-control
   const AtomicString& control_id = getAttribute(kForAttr);
   if (control_id.IsNull()) {
-    // Search the children and descendants of the label element for a form
-    // element.
-    // per http://dev.w3.org/html5/spec/Overview.html#the-label-element
-    // the form element must be "labelable form-associated element".
-    for (LabelableElement& element :
-         Traversal<LabelableElement>::DescendantsOf(*this)) {
-      if (element.SupportLabels()) {
+    // "If the for attribute is not specified, but the label element has a
+    // labelable element descendant, then the first such descendant in tree
+    // order is the label element's labeled control."
+    for (HTMLElement& element : Traversal<HTMLElement>::DescendantsOf(*this)) {
+      if (element.IsLabelable()) {
         if (!element.IsFormControlElement()) {
           UseCounter::Count(
               GetDocument(),
@@ -75,14 +74,15 @@
     return nullptr;
 
   if (Element* element = GetTreeScope().getElementById(control_id)) {
-    if (IsLabelableElement(*element) &&
-        ToLabelableElement(*element).SupportLabels()) {
-      if (!element->IsFormControlElement()) {
-        UseCounter::Count(
-            GetDocument(),
-            WebFeature::kHTMLLabelElementControlForNonFormAssociatedElement);
+    if (auto* html_element = ToHTMLElementOrNull(*element)) {
+      if (html_element->IsLabelable()) {
+        if (!html_element->IsFormControlElement()) {
+          UseCounter::Count(
+              GetDocument(),
+              WebFeature::kHTMLLabelElementControlForNonFormAssociatedElement);
+        }
+        return html_element;
       }
-      return ToLabelableElement(element);
     }
   }
 
@@ -90,7 +90,7 @@
 }
 
 HTMLFormElement* HTMLLabelElement::form() const {
-  if (LabelableElement* control = this->control()) {
+  if (HTMLElement* control = this->control()) {
     return control->IsFormControlElement()
                ? ToHTMLFormControlElement(control)->Form()
                : nullptr;
diff --git a/third_party/blink/renderer/core/html/forms/html_label_element.h b/third_party/blink/renderer/core/html/forms/html_label_element.h
index 0f396c3..ce3c0c4 100644
--- a/third_party/blink/renderer/core/html/forms/html_label_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_label_element.h
@@ -29,8 +29,6 @@
 
 namespace blink {
 
-class LabelableElement;
-
 class CORE_EXPORT HTMLLabelElement final : public HTMLElement {
   DEFINE_WRAPPERTYPEINFO();
 
@@ -39,7 +37,7 @@
 
   explicit HTMLLabelElement(Document&);
 
-  LabelableElement* control() const;
+  HTMLElement* control() const;
   HTMLFormElement* form() const;
 
   bool WillRespondToMouseClickEvents() override;
diff --git a/third_party/blink/renderer/core/html/forms/html_output_element.h b/third_party/blink/renderer/core/html/forms/html_output_element.h
index 521e6762..6ec6cc9 100644
--- a/third_party/blink/renderer/core/html/forms/html_output_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_output_element.h
@@ -65,7 +65,7 @@
   bool IsDisabledFormControl() const override;
   bool MatchesEnabledPseudoClass() const override;
   bool IsEnumeratable() const override { return true; }
-  bool SupportLabels() const override { return true; }
+  bool IsLabelable() const override { return true; }
   bool SupportsFocus() const override;
   void ChildrenChanged(const ChildrenChange&) override;
   void ResetImpl() override;
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.h b/third_party/blink/renderer/core/html/forms/html_select_element.h
index b3d7f77f..c84e55e 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.h
@@ -196,7 +196,7 @@
   bool IsEnumeratable() const override { return true; }
   bool IsInteractiveContent() const override;
   bool SupportsAutofocus() const override;
-  bool SupportLabels() const override { return true; }
+  bool IsLabelable() const override { return true; }
 
   FormControlState SaveFormControlState() const override;
   void RestoreFormControlState(const FormControlState&) override;
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.h b/third_party/blink/renderer/core/html/forms/html_text_area_element.h
index 8af71e6..9ae4e6f8 100644
--- a/third_party/blink/renderer/core/html/forms/html_text_area_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.h
@@ -103,7 +103,7 @@
   bool IsEnumeratable() const override { return true; }
   bool IsInteractiveContent() const override;
   bool SupportsAutofocus() const override;
-  bool SupportLabels() const override { return true; }
+  bool IsLabelable() const override { return true; }
 
   const AtomicString& FormControlType() const override;
 
diff --git a/third_party/blink/renderer/core/html/forms/labelable_element.cc b/third_party/blink/renderer/core/html/forms/labelable_element.cc
deleted file mode 100644
index a864132..0000000
--- a/third_party/blink/renderer/core/html/forms/labelable_element.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- *           (C) 1999 Antti Koivisto (koivisto@kde.org)
- *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
- *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#include "third_party/blink/renderer/core/html/forms/labelable_element.h"
-
-#include "third_party/blink/renderer/core/dom/node_lists_node_data.h"
-#include "third_party/blink/renderer/core/dom/node_rare_data.h"
-#include "third_party/blink/renderer/core/html/forms/labels_node_list.h"
-
-namespace blink {
-
-LabelableElement::LabelableElement(const QualifiedName& tag_name,
-                                   Document& document)
-    : HTMLElement(tag_name, document) {}
-
-LabelableElement::~LabelableElement() = default;
-
-LabelsNodeList* LabelableElement::labels() {
-  if (!SupportLabels())
-    return nullptr;
-
-  return EnsureCachedCollection<LabelsNodeList>(kLabelsNodeListType);
-}
-
-void LabelableElement::Trace(blink::Visitor* visitor) {
-  HTMLElement::Trace(visitor);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/labelable_element.h b/third_party/blink/renderer/core/html/forms/labelable_element.h
deleted file mode 100644
index 71fb17d..0000000
--- a/third_party/blink/renderer/core/html/forms/labelable_element.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_LABELABLE_ELEMENT_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_LABELABLE_ELEMENT_H_
-
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/html/html_element.h"
-
-namespace blink {
-
-class LabelsNodeList;
-
-// LabelableElement represents "labelable element" defined in the HTML
-// specification, and provides the implementation of the "labels" attribute.
-class CORE_EXPORT LabelableElement : public HTMLElement {
- public:
-  ~LabelableElement() override;
-  LabelsNodeList* labels();
-  virtual bool SupportLabels() const { return false; }
-
-  void Trace(blink::Visitor*) override;
-
- protected:
-  LabelableElement(const QualifiedName& tag_name, Document&);
-
- private:
-  bool IsLabelable() const final { return true; }
-};
-
-inline bool IsLabelableElement(const HTMLElement& element) {
-  return element.IsLabelable();
-}
-
-DEFINE_HTMLELEMENT_TYPE_CASTS_WITH_FUNCTION(LabelableElement);
-
-}  // namespace blink
-
-#endif
diff --git a/third_party/blink/renderer/core/html/forms/labels_node_list.cc b/third_party/blink/renderer/core/html/forms/labels_node_list.cc
index e7d1538a..6af3a07 100644
--- a/third_party/blink/renderer/core/html/forms/labels_node_list.cc
+++ b/third_party/blink/renderer/core/html/forms/labels_node_list.cc
@@ -26,7 +26,6 @@
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/node_rare_data.h"
 #include "third_party/blink/renderer/core/html/forms/html_label_element.h"
-#include "third_party/blink/renderer/core/html/forms/labelable_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/html/forms/listed_element.h b/third_party/blink/renderer/core/html/forms/listed_element.h
index 557ae82..d236dd9 100644
--- a/third_party/blink/renderer/core/html/forms/listed_element.h
+++ b/third_party/blink/renderer/core/html/forms/listed_element.h
@@ -89,12 +89,19 @@
   bool Valid() const;
   virtual void setCustomValidity(const String&);
 
+  // This should be called when |disabled| content attribute is changed.
   virtual void DisabledAttributeChanged();
-
+  // This should be called when |form| content attribute is changed.
+  void FormAttributeChanged();
+  // This is for FormAttributeTargteObserver class.
   void FormAttributeTargetChanged();
+  // This should be called in Node::InsertedInto().
   void InsertedInto(ContainerNode&);
+  // This should be called in Node::RemovedFrom().
   void RemovedFrom(ContainerNode&);
+  // This should be called in Node::DidMoveToDocument().
   void DidMoveToNewDocument(Document& old_document);
+  // This is for HTMLFieldSetElement class.
   void AncestorDisabledStateWasChanged();
 
   // https://html.spec.whatwg.org/multipage/semantics-other.html#concept-element-disabled
@@ -111,7 +118,6 @@
   // setForm is confusing.
   void SetForm(HTMLFormElement*);
   void AssociateByParser(HTMLFormElement*);
-  void FormAttributeChanged();
 
   // If you add an override of willChangeForm() or didChangeForm() to a class
   // derived from this one, you will need to add a call to setForm(0) to the
diff --git a/third_party/blink/renderer/core/html/forms/radio_input_type.cc b/third_party/blink/renderer/core/html/forms/radio_input_type.cc
index f12a9a1..b9577f9 100644
--- a/third_party/blink/renderer/core/html/forms/radio_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/radio_input_type.cc
@@ -187,7 +187,7 @@
   // upcoming action to be "undone", since we want some object in the radio
   // group to actually get selected.
 
-  ClickHandlingState* state = new ClickHandlingState;
+  ClickHandlingState* state = MakeGarbageCollected<ClickHandlingState>();
 
   state->checked = GetElement().checked();
   state->checked_radio_button = GetElement().CheckedRadioButtonForGroup();
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc
index 0167fe18..07aca33 100644
--- a/third_party/blink/renderer/core/html/html_element.cc
+++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -41,6 +41,7 @@
 #include "third_party/blink/renderer/core/dom/events/event_listener.h"
 #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
+#include "third_party/blink/renderer/core/dom/node_lists_node_data.h"
 #include "third_party/blink/renderer/core/dom/node_traversal.h"
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/dom/text.h"
@@ -57,6 +58,7 @@
 #include "third_party/blink/renderer/core/html/custom/element_internals.h"
 #include "third_party/blink/renderer/core/html/forms/html_form_element.h"
 #include "third_party/blink/renderer/core/html/forms/html_input_element.h"
+#include "third_party/blink/renderer/core/html/forms/labels_node_list.h"
 #include "third_party/blink/renderer/core/html/html_br_element.h"
 #include "third_party/blink/renderer/core/html/html_dimension.h"
 #include "third_party/blink/renderer/core/html/html_frame_owner_element.h"
@@ -337,6 +339,7 @@
   const AtomicString& kNoEvent = g_null_atom;
   static AttributeTriggers attribute_triggers[] = {
       {kDirAttr, kNoWebFeature, kNoEvent, &HTMLElement::OnDirAttrChanged},
+      {kFormAttr, kNoWebFeature, kNoEvent, &HTMLElement::OnFormAttrChanged},
       {kInertAttr, WebFeature::kInertAttribute, kNoEvent,
        &HTMLElement::OnInertAttrChanged},
       {kLangAttr, kNoWebFeature, kNoEvent, &HTMLElement::OnLangAttrChanged},
@@ -1283,6 +1286,12 @@
   style->SetProperty(property_id, *CSSColorValue::Create(parsed_color.Rgb()));
 }
 
+LabelsNodeList* HTMLElement::labels() {
+  if (!IsLabelable())
+    return nullptr;
+  return EnsureCachedCollection<LabelsNodeList>(kLabelsNodeListType);
+}
+
 bool HTMLElement::IsInteractiveContent() const {
   return false;
 }
@@ -1407,6 +1416,11 @@
     CalculateAndAdjustDirectionality();
 }
 
+void HTMLElement::OnFormAttrChanged(const AttributeModificationParams& params) {
+  if (IsFormAssociatedCustomElement())
+    EnsureElementInternals().FormAttributeChanged();
+}
+
 void HTMLElement::OnInertAttrChanged(
     const AttributeModificationParams& params) {
   UpdateDistributionForUnknownReasons();
diff --git a/third_party/blink/renderer/core/html/html_element.h b/third_party/blink/renderer/core/html/html_element.h
index 4d5326d..ab1605e 100644
--- a/third_party/blink/renderer/core/html/html_element.h
+++ b/third_party/blink/renderer/core/html/html_element.h
@@ -37,6 +37,7 @@
 class FormAssociated;
 class HTMLFormElement;
 class KeyboardEvent;
+class LabelsNodeList;
 class StringOrTrustedScript;
 class StringTreatNullAsEmptyStringOrTrustedScript;
 
@@ -108,7 +109,11 @@
   virtual bool IsHTMLUnknownElement() const { return false; }
   virtual bool IsPluginElement() const { return false; }
 
+  // https://html.spec.whatwg.org/multipage/forms.html#category-label
   virtual bool IsLabelable() const { return false; }
+  // |labels| IDL attribute implementation for IsLabelable()==true elements.
+  LabelsNodeList* labels();
+
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#interactive-content
   virtual bool IsInteractiveContent() const;
   void DefaultEventHandler(Event&) override;
@@ -200,6 +205,7 @@
       const QualifiedName& attr_name);
 
   void OnDirAttrChanged(const AttributeModificationParams&);
+  void OnFormAttrChanged(const AttributeModificationParams&);
   void OnInertAttrChanged(const AttributeModificationParams&);
   void OnLangAttrChanged(const AttributeModificationParams&);
   void OnNonceAttrChanged(const AttributeModificationParams&);
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
index ddfe3ce..6331ef8 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -20,7 +20,7 @@
 
 #include "third_party/blink/renderer/core/html/html_frame_owner_element.h"
 
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
@@ -46,7 +46,6 @@
 #include "third_party/blink/renderer/core/timing/window_performance.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
-#include "third_party/blink/renderer/platform/network/network_state_notifier.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 
@@ -419,14 +418,6 @@
       (EqualIgnoringASCIICase(FastGetAttribute(html_names::kLazyloadAttr),
                               "on") ||
        (should_lazy_load_children_ &&
-        // If lazy loading is restricted to only Data Saver users, then avoid
-        // lazy loading unless Data Saver is enabled, taking the Data Saver
-        // holdback into consideration.
-        (!RuntimeEnabledFeatures::
-             RestrictLazyFrameLoadingToDataSaverEnabled() ||
-         (!(GetDocument().GetSettings() &&
-            GetDocument().GetSettings()->GetDataSaverHoldbackWebApi()) &&
-          GetNetworkStateNotifier().SaveDataEnabled())) &&
         // Disallow lazy loading by default if javascript in the embedding
         // document would be able to access the contents of the frame, since in
         // those cases deferring the frame could break the page. Note that this
diff --git a/third_party/blink/renderer/core/html/html_meter_element.cc b/third_party/blink/renderer/core/html/html_meter_element.cc
index f643e77..20bb256 100644
--- a/third_party/blink/renderer/core/html/html_meter_element.cc
+++ b/third_party/blink/renderer/core/html/html_meter_element.cc
@@ -35,7 +35,7 @@
 using namespace html_names;
 
 HTMLMeterElement::HTMLMeterElement(Document& document)
-    : LabelableElement(kMeterTag, document) {
+    : HTMLElement(kMeterTag, document) {
   UseCounter::Count(document, WebFeature::kMeterElement);
 }
 
@@ -60,7 +60,7 @@
     default:
       break;
   }
-  return LabelableElement::CreateLayoutObject(style);
+  return HTMLElement::CreateLayoutObject(style);
 }
 
 void HTMLMeterElement::ParseAttribute(
@@ -70,7 +70,7 @@
       name == kLowAttr || name == kHighAttr || name == kOptimumAttr)
     DidElementStateChange();
   else
-    LabelableElement::ParseAttribute(params);
+    HTMLElement::ParseAttribute(params);
 }
 
 double HTMLMeterElement::value() const {
@@ -225,7 +225,7 @@
 
 void HTMLMeterElement::Trace(blink::Visitor* visitor) {
   visitor->Trace(value_);
-  LabelableElement::Trace(visitor);
+  HTMLElement::Trace(visitor);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_meter_element.h b/third_party/blink/renderer/core/html/html_meter_element.h
index e1917fa..63ae4b6 100644
--- a/third_party/blink/renderer/core/html/html_meter_element.h
+++ b/third_party/blink/renderer/core/html/html_meter_element.h
@@ -22,13 +22,13 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_METER_ELEMENT_H_
 
 #include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/html/forms/labelable_element.h"
+#include "third_party/blink/renderer/core/html/html_element.h"
 
 namespace blink {
 
 class HTMLDivElement;
 
-class CORE_EXPORT HTMLMeterElement final : public LabelableElement {
+class CORE_EXPORT HTMLMeterElement final : public HTMLElement {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
@@ -72,7 +72,7 @@
 
   bool AreAuthorShadowsAllowed() const override { return false; }
 
-  bool SupportLabels() const override { return true; }
+  bool IsLabelable() const override { return true; }
   bool ShouldForceLegacyLayout() const final { return true; }
 
   LayoutObject* CreateLayoutObject(const ComputedStyle&) override;
diff --git a/third_party/blink/renderer/core/html/html_progress_element.cc b/third_party/blink/renderer/core/html/html_progress_element.cc
index ce39f8a..9f92455 100644
--- a/third_party/blink/renderer/core/html/html_progress_element.cc
+++ b/third_party/blink/renderer/core/html/html_progress_element.cc
@@ -36,7 +36,7 @@
 const double HTMLProgressElement::kInvalidPosition = -2;
 
 HTMLProgressElement::HTMLProgressElement(Document& document)
-    : LabelableElement(kProgressTag, document), value_(nullptr) {
+    : HTMLElement(kProgressTag, document), value_(nullptr) {
   UseCounter::Count(document, WebFeature::kProgressElement);
 }
 
@@ -76,12 +76,12 @@
   } else if (params.name == kMaxAttr) {
     DidElementStateChange();
   } else {
-    LabelableElement::ParseAttribute(params);
+    HTMLElement::ParseAttribute(params);
   }
 }
 
 void HTMLProgressElement::AttachLayoutTree(AttachContext& context) {
-  LabelableElement::AttachLayoutTree(context);
+  HTMLElement::AttachLayoutTree(context);
   if (LayoutProgress* layout_progress = GetLayoutProgress())
     layout_progress->UpdateFromElement();
 }
@@ -153,7 +153,7 @@
 
 void HTMLProgressElement::Trace(blink::Visitor* visitor) {
   visitor->Trace(value_);
-  LabelableElement::Trace(visitor);
+  HTMLElement::Trace(visitor);
 }
 
 void HTMLProgressElement::SetValueWidthPercentage(double width) const {
diff --git a/third_party/blink/renderer/core/html/html_progress_element.h b/third_party/blink/renderer/core/html/html_progress_element.h
index cf75eea..f80f6be0 100644
--- a/third_party/blink/renderer/core/html/html_progress_element.h
+++ b/third_party/blink/renderer/core/html/html_progress_element.h
@@ -22,13 +22,13 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_PROGRESS_ELEMENT_H_
 
 #include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/html/forms/labelable_element.h"
+#include "third_party/blink/renderer/core/html/html_element.h"
 
 namespace blink {
 
 class LayoutProgress;
 
-class CORE_EXPORT HTMLProgressElement final : public LabelableElement {
+class CORE_EXPORT HTMLProgressElement final : public HTMLElement {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
@@ -56,7 +56,7 @@
 
   bool AreAuthorShadowsAllowed() const override { return false; }
   bool ShouldAppearIndeterminate() const override;
-  bool SupportLabels() const override { return true; }
+  bool IsLabelable() const override { return true; }
   bool ShouldForceLegacyLayout() const final { return true; }
 
   LayoutObject* CreateLayoutObject(const ComputedStyle&) override;
diff --git a/third_party/blink/renderer/core/html/lazy_load_frame_observer_test.cc b/third_party/blink/renderer/core/html/lazy_load_frame_observer_test.cc
index 8c7befa..e831f8d9 100644
--- a/third_party/blink/renderer/core/html/lazy_load_frame_observer_test.cc
+++ b/third_party/blink/renderer/core/html/lazy_load_frame_observer_test.cc
@@ -20,7 +20,6 @@
 #include "third_party/blink/renderer/core/testing/sim/sim_request.h"
 #include "third_party/blink/renderer/core/testing/sim/sim_test.h"
 #include "third_party/blink/renderer/platform/geometry/float_rect.h"
-#include "third_party/blink/renderer/platform/network/network_state_notifier.h"
 #include "third_party/blink/renderer/platform/testing/histogram_tester.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
@@ -78,24 +77,22 @@
 enum class LazyFrameLoadingFeatureStatus { kDisabled, kEnabled };
 enum class LazyFrameVisibleLoadTimeFeatureStatus { kDisabled, kEnabled };
 
-class LazyLoadFramesParamsTest
-    : public SimTest,
-      public ::testing::WithParamInterface<
-          std::tuple<LazyFrameLoadingFeatureStatus,
-                     LazyFrameVisibleLoadTimeFeatureStatus,
-                     WebEffectiveConnectionType>> {
+class LazyLoadFramesTest : public SimTest,
+                           public ::testing::WithParamInterface<
+                               std::tuple<LazyFrameLoadingFeatureStatus,
+                                          LazyFrameVisibleLoadTimeFeatureStatus,
+                                          WebEffectiveConnectionType>> {
  public:
   static constexpr int kViewportWidth = 800;
   static constexpr int kViewportHeight = 600;
 
-  LazyLoadFramesParamsTest()
+  LazyLoadFramesTest()
       : scoped_lazy_frame_loading_for_test_(
             std::get<LazyFrameLoadingFeatureStatus>(GetParam()) ==
             LazyFrameLoadingFeatureStatus::kEnabled),
         scoped_lazy_frame_visible_load_time_metrics_for_test_(
             std::get<LazyFrameVisibleLoadTimeFeatureStatus>(GetParam()) ==
-            LazyFrameVisibleLoadTimeFeatureStatus::kEnabled),
-        scoped_restrict_lazy_frame_loading_to_data_saver_for_test_(false) {}
+            LazyFrameVisibleLoadTimeFeatureStatus::kEnabled) {}
 
   void SetUp() override {
     SetEffectiveConnectionTypeForTesting(
@@ -247,13 +244,11 @@
   ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test_;
   ScopedLazyFrameVisibleLoadTimeMetricsForTest
       scoped_lazy_frame_visible_load_time_metrics_for_test_;
-  ScopedRestrictLazyFrameLoadingToDataSaverForTest
-      scoped_restrict_lazy_frame_loading_to_data_saver_for_test_;
 
   HistogramTester histogram_tester_;
 };
 
-TEST_P(LazyLoadFramesParamsTest, SameOriginFrame) {
+TEST_P(LazyLoadFramesTest, SameOriginFrame) {
   SimRequest main_resource("https://example.com/", "text/html");
   SimRequest child_frame_resource("https://example.com/subframe.html",
                                   "text/html");
@@ -293,7 +288,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest, AboveTheFoldFrame) {
+TEST_P(LazyLoadFramesTest, AboveTheFoldFrame) {
   SimRequest main_resource("https://example.com/", "text/html");
   SimRequest child_frame_resource("https://crossorigin.com/subframe.html",
                                   "text/html");
@@ -338,7 +333,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest, BelowTheFoldButNearViewportFrame) {
+TEST_P(LazyLoadFramesTest, BelowTheFoldButNearViewportFrame) {
   SimRequest main_resource("https://example.com/", "text/html");
   SimRequest child_frame_resource("https://crossorigin.com/subframe.html",
                                   "text/html");
@@ -395,7 +390,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest, HiddenAndTinyFrames) {
+TEST_P(LazyLoadFramesTest, HiddenAndTinyFrames) {
   SimRequest main_resource("https://example.com/", "text/html");
 
   SimRequest display_none_frame_resource(
@@ -498,7 +493,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest, LoadCrossOriginFrameFarFromViewport) {
+TEST_P(LazyLoadFramesTest, LoadCrossOriginFrameFarFromViewport) {
   std::unique_ptr<SimRequest> child_frame_resource =
       LoadPageWithCrossOriginFrameFarFromViewport();
 
@@ -551,7 +546,7 @@
   ExpectVisibleAfterDeferredSamplesIfApplicable(1);
 }
 
-TEST_P(LazyLoadFramesParamsTest,
+TEST_P(LazyLoadFramesTest,
        CrossOriginFrameFarFromViewportBecomesVisibleBeforeFinishedLoading) {
   std::unique_ptr<SimRequest> child_frame_resource =
       LoadPageWithCrossOriginFrameFarFromViewport();
@@ -603,7 +598,7 @@
   ExpectVisibleAfterDeferredSamplesIfApplicable(1);
 }
 
-TEST_P(LazyLoadFramesParamsTest, NestedFrameInCrossOriginFrameFarFromViewport) {
+TEST_P(LazyLoadFramesTest, NestedFrameInCrossOriginFrameFarFromViewport) {
   std::unique_ptr<SimRequest> child_frame_resource =
       LoadPageWithCrossOriginFrameFarFromViewport();
 
@@ -649,7 +644,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest, AboutBlankChildFrameNavigation) {
+TEST_P(LazyLoadFramesTest, AboutBlankChildFrameNavigation) {
   SimRequest main_resource("https://example.com/", "text/html");
   SimRequest child_frame_resource("https://crossorigin.com/subframe.html",
                                   "text/html");
@@ -703,7 +698,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest, JavascriptStringFrameUrl) {
+TEST_P(LazyLoadFramesTest, JavascriptStringFrameUrl) {
   SimRequest main_resource("https://example.com/", "text/html");
   LoadURL("https://example.com/");
 
@@ -735,8 +730,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest,
-       CrossOriginFrameFarFromViewportWithLazyLoadAttrOff) {
+TEST_P(LazyLoadFramesTest, CrossOriginFrameFarFromViewportWithLazyLoadAttrOff) {
   SimRequest main_resource("https://example.com/", "text/html");
   SimRequest child_frame_resource("https://crossorigin.com/subframe.html",
                                   "text/html");
@@ -776,7 +770,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest,
+TEST_P(LazyLoadFramesTest,
        LoadSameOriginFrameFarFromViewportWithLazyLoadAttributeOn) {
   SimRequest main_resource("https://example.com/", "text/html");
   base::Optional<SimRequest> child_frame_resource;
@@ -873,7 +867,7 @@
   ExpectVisibleAfterDeferredSamplesIfApplicable(1);
 }
 
-TEST_P(LazyLoadFramesParamsTest,
+TEST_P(LazyLoadFramesTest,
        LoadCrossOriginFrameFarFromViewportThenSetLazyLoadAttributeOff) {
   SimRequest main_resource("https://example.com/", "text/html");
   base::Optional<SimRequest> child_frame_resource;
@@ -942,7 +936,7 @@
       "Blink.LazyLoad.CrossOriginFrames.VisibleAfterBeingDeferred", 0);
 }
 
-TEST_P(LazyLoadFramesParamsTest,
+TEST_P(LazyLoadFramesTest,
        NestedFrameWithLazyLoadAttributeOnInFrameWithNoLazyLoadAttribute) {
   std::unique_ptr<SimRequest> child_frame_resource =
       LoadPageWithCrossOriginFrameFarFromViewport();
@@ -986,7 +980,7 @@
   EXPECT_TRUE(ConsoleMessages().Contains("child frame element onload"));
 }
 
-TEST_P(LazyLoadFramesParamsTest,
+TEST_P(LazyLoadFramesTest,
        NestedFrameWithLazyLoadAttributeOnInFrameWithLazyLoadAttributeOff) {
   SimRequest main_resource("https://example.com/", "text/html");
   SimRequest child_frame_resource("https://crossorigin.com/subframe.html",
@@ -1036,7 +1030,7 @@
   EXPECT_TRUE(ConsoleMessages().Contains("child frame element onload"));
 }
 
-TEST_P(LazyLoadFramesParamsTest,
+TEST_P(LazyLoadFramesTest,
        NestedFrameWithLazyLoadAttributeOffInFrameWithLazyLoadAttributeOff) {
   SimRequest main_resource("https://example.com/", "text/html");
   SimRequest child_frame_resource("https://crossorigin.com/subframe.html",
@@ -1085,7 +1079,7 @@
 
 INSTANTIATE_TEST_CASE_P(
     LazyFrameLoading,
-    LazyLoadFramesParamsTest,
+    LazyLoadFramesTest,
     ::testing::Combine(
         ::testing::Values(LazyFrameLoadingFeatureStatus::kDisabled,
                           LazyFrameLoadingFeatureStatus::kEnabled),
@@ -1098,160 +1092,6 @@
                           WebEffectiveConnectionType::kType3G,
                           WebEffectiveConnectionType::kType4G)));
 
-class LazyLoadFramesTest : public SimTest {
- public:
-  static constexpr int kViewportWidth = 800;
-  static constexpr int kViewportHeight = 600;
-  static constexpr int kLoadingDistanceThresholdPx = 1000;
-
-  void SetUp() override {
-    SetEffectiveConnectionTypeForTesting(
-        WebEffectiveConnectionType::kTypeUnknown);
-
-    SimTest::SetUp();
-    WebView().Resize(WebSize(kViewportWidth, kViewportHeight));
-
-    WebView()
-        .GetPage()
-        ->GetSettings()
-        .SetLazyFrameLoadingDistanceThresholdPxUnknown(
-            kLoadingDistanceThresholdPx);
-  }
-
-  void TearDown() override {
-    GetNetworkStateNotifier().SetSaveDataEnabled(false);
-    SimTest::TearDown();
-  }
-
-  void TestCrossOriginFrameIsImmediatelyLoaded(const char* iframe_attributes) {
-    SimRequest main_resource("https://example.com/", "text/html");
-    SimRequest child_frame_resource("https://crossorigin.com/subframe.html",
-                                    "text/html");
-    LoadURL("https://example.com/");
-
-    main_resource.Complete(String::Format(
-        R"HTML(
-          <body onload='console.log("main body onload");'>
-          <div style='height: %dpx;'></div>
-          <iframe src='https://crossorigin.com/subframe.html'
-               style='width: 200px; height: 200px;' %s
-               onload='console.log("child frame element onload");'></iframe>
-          </body>)HTML",
-        kViewportHeight + kLoadingDistanceThresholdPx + 100,
-        iframe_attributes));
-
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-
-    child_frame_resource.Complete("");
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-
-    EXPECT_TRUE(ConsoleMessages().Contains("main body onload"));
-    EXPECT_TRUE(ConsoleMessages().Contains("child frame element onload"));
-  }
-
-  void TestCrossOriginFrameIsLazilyLoaded(const char* iframe_attributes) {
-    SimRequest main_resource("https://example.com/", "text/html");
-    LoadURL("https://example.com/");
-
-    main_resource.Complete(String::Format(
-        R"HTML(
-          <body onload='console.log("main body onload");'>
-          <div style='height: %dpx;'></div>
-          <iframe src='https://crossorigin.com/subframe.html'
-               style='width: 200px; height: 200px;' %s
-               onload='console.log("child frame element onload");'></iframe>
-          </body>)HTML",
-        kViewportHeight + kLoadingDistanceThresholdPx + 100,
-        iframe_attributes));
-
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-
-    // The body's load event should have already fired.
-    EXPECT_TRUE(ConsoleMessages().Contains("main body onload"));
-    EXPECT_FALSE(ConsoleMessages().Contains("child frame element onload"));
-
-    SimRequest child_frame_resource("https://crossorigin.com/subframe.html",
-                                    "text/html");
-
-    // Scroll down near the child frame to cause the child frame to start
-    // loading.
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(
-        ScrollOffset(0, 150), kProgrammaticScroll);
-
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-
-    EXPECT_FALSE(ConsoleMessages().Contains("child frame element onload"));
-
-    child_frame_resource.Complete("");
-
-    Compositor().BeginFrame();
-    test::RunPendingTasks();
-
-    EXPECT_TRUE(ConsoleMessages().Contains("child frame element onload"));
-  }
-};
-
-TEST_F(LazyLoadFramesTest, LazyLoadWhenNotRestricted) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-  ScopedRestrictLazyFrameLoadingToDataSaverForTest
-      scoped_restrict_lazy_frame_loading_to_data_saver_for_test_(false);
-
-  TestCrossOriginFrameIsLazilyLoaded("");
-}
-
-TEST_F(LazyLoadFramesTest,
-       LazyLoadWhenDataSaverDisabledAndNotRestrictedAttrOff) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-  ScopedRestrictLazyFrameLoadingToDataSaverForTest
-      scoped_restrict_lazy_frame_loading_to_data_saver_for_test_(false);
-
-  TestCrossOriginFrameIsImmediatelyLoaded("lazyload='off'");
-}
-
-TEST_F(LazyLoadFramesTest, LazyLoadWhenDataSaverDisabledAndRestricted) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-  ScopedRestrictLazyFrameLoadingToDataSaverForTest
-      scoped_restrict_lazy_frame_loading_to_data_saver_for_test_(true);
-
-  GetNetworkStateNotifier().SetSaveDataEnabled(false);
-  WebView().GetPage()->GetSettings().SetDataSaverHoldbackWebApi(false);
-  TestCrossOriginFrameIsImmediatelyLoaded("");
-}
-
-TEST_F(LazyLoadFramesTest, LazyLoadWhenDataSaverEnabledHoldbackAndRestricted) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-  ScopedRestrictLazyFrameLoadingToDataSaverForTest
-      scoped_restrict_lazy_frame_loading_to_data_saver_for_test_(true);
-
-  GetNetworkStateNotifier().SetSaveDataEnabled(true);
-  WebView().GetPage()->GetSettings().SetDataSaverHoldbackWebApi(true);
-  TestCrossOriginFrameIsImmediatelyLoaded("");
-}
-
-TEST_F(LazyLoadFramesTest, LazyLoadWhenDataSaverEnabledAndRestricted) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-  ScopedRestrictLazyFrameLoadingToDataSaverForTest
-      scoped_restrict_lazy_frame_loading_to_data_saver_for_test_(true);
-
-  GetNetworkStateNotifier().SetSaveDataEnabled(true);
-  WebView().GetPage()->GetSettings().SetDataSaverHoldbackWebApi(false);
-  TestCrossOriginFrameIsLazilyLoaded("");
-}
-
-TEST_F(LazyLoadFramesTest, LazyLoadWhenDataSaverDisabledAndRestrictedAttrOn) {
-  ScopedLazyFrameLoadingForTest scoped_lazy_frame_loading_for_test(true);
-  ScopedRestrictLazyFrameLoadingToDataSaverForTest
-      scoped_restrict_lazy_frame_loading_to_data_saver_for_test_(true);
-
-  GetNetworkStateNotifier().SetSaveDataEnabled(false);
-  WebView().GetPage()->GetSettings().SetDataSaverHoldbackWebApi(false);
-  TestCrossOriginFrameIsLazilyLoaded("lazyload='on'");
-}
-
 }  // namespace
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
index 4fa1e11..5dfc696 100644
--- a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
+++ b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
@@ -52,7 +52,7 @@
 }  // namespace
 
 AutoplayUmaHelper* AutoplayUmaHelper::Create(HTMLMediaElement* element) {
-  return new AutoplayUmaHelper(element);
+  return MakeGarbageCollected<AutoplayUmaHelper>(element);
 }
 
 AutoplayUmaHelper::AutoplayUmaHelper(HTMLMediaElement* element)
diff --git a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h
index 0b2991d..002e545 100644
--- a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h
+++ b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h
@@ -66,6 +66,7 @@
  public:
   static AutoplayUmaHelper* Create(HTMLMediaElement*);
 
+  explicit AutoplayUmaHelper(HTMLMediaElement*);
   ~AutoplayUmaHelper() override;
 
   bool operator==(const EventListener&) const override;
@@ -92,7 +93,6 @@
   // Called when source is initialized and loading starts.
   void OnLoadStarted();
 
-  explicit AutoplayUmaHelper(HTMLMediaElement*);
   void Invoke(ExecutionContext*, Event*) override;
   void HandlePlayingEvent();
   void HandlePauseEvent();
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index 9ff352c2..5cb60c4 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -516,7 +516,7 @@
       audio_tracks_(AudioTrackList::Create(*this)),
       video_tracks_(VideoTrackList::Create(*this)),
       audio_source_node_(nullptr),
-      autoplay_policy_(new AutoplayPolicy(this)),
+      autoplay_policy_(MakeGarbageCollected<AutoplayPolicy>(this)),
       remote_playback_client_(nullptr),
       media_controls_(nullptr),
       controls_list_(HTMLMediaElementControlsList::Create(this)),
@@ -3885,7 +3885,7 @@
 
 CueTimeline& HTMLMediaElement::GetCueTimeline() {
   if (!cue_timeline_)
-    cue_timeline_ = new CueTimeline(*this);
+    cue_timeline_ = MakeGarbageCollected<CueTimeline>(*this);
   return *cue_timeline_;
 }
 
diff --git a/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc b/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
index e09c9282..3673b5b 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
@@ -80,7 +80,7 @@
 class MediaStubLocalFrameClient : public EmptyLocalFrameClient {
  public:
   static MediaStubLocalFrameClient* Create() {
-    return new MediaStubLocalFrameClient;
+    return MakeGarbageCollected<MediaStubLocalFrameClient>();
   }
 
   std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
diff --git a/third_party/blink/renderer/core/html/media/html_video_element_persistent_test.cc b/third_party/blink/renderer/core/html/media/html_video_element_persistent_test.cc
index 5cc4de3..a62627c5 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element_persistent_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_video_element_persistent_test.cc
@@ -34,7 +34,7 @@
 class HTMLVideoElementPersistentTest : public PageTestBase {
  protected:
   void SetUp() override {
-    chrome_client_ = new FullscreenMockChromeClient();
+    chrome_client_ = MakeGarbageCollected<FullscreenMockChromeClient>();
 
     Page::PageClients clients;
     FillWithEmptyClients(clients);
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc b/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc
index 1229423..325fbbd 100644
--- a/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc
+++ b/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc
@@ -74,7 +74,7 @@
   HTMLDocument& document = ToHTMLDocument(GetDocument());
   ProvidePrerendererClientTo(
       *document.GetPage(),
-      new MockPrerendererClient(*document.GetPage(), true));
+      MakeGarbageCollected<MockPrerendererClient>(*document.GetPage(), true));
   EXPECT_TRUE(document.IsPrefetchOnly());
   HTMLDocumentParser* parser = CreateParser(document);
 
diff --git a/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc b/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
index 6e29a2c..66727b3 100644
--- a/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
+++ b/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
@@ -29,11 +29,14 @@
 
 #include <memory>
 #include "base/optional.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/renderer/core/css/css_primitive_value.h"
+#include "third_party/blink/renderer/core/css/css_property_name.h"
 #include "third_party/blink/renderer/core/css/media_list.h"
 #include "third_party/blink/renderer/core/css/media_query_evaluator.h"
 #include "third_party/blink/renderer/core/css/media_values_cached.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser.h"
 #include "third_party/blink/renderer/core/css/parser/sizes_attribute_parser.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -126,6 +129,28 @@
          dimension.IsAbsolute() && dimension.Value() <= kMinDimensionToLazyLoad;
 }
 
+static bool IsInlineStyleDimensionsSmall(const String& style_value,
+                                         bool strict_mode) {
+  // Minimum height or width of the image to start lazyloading.
+  const unsigned kMinDimensionToLazyLoad = 10;
+  CSSParserMode mode = strict_mode ? kHTMLStandardMode : kHTMLQuirksMode;
+  const ImmutableCSSPropertyValueSet* property_set =
+      CSSParser::ParseInlineStyleDeclaration(
+          style_value, mode, SecureContextMode::kInsecureContext);
+  const CSSValue* height = property_set->GetPropertyCSSValue(CSSPropertyHeight);
+  const CSSValue* width = property_set->GetPropertyCSSValue(CSSPropertyWidth);
+
+  if (!height || !height->IsPrimitiveValue() || !width ||
+      !width->IsPrimitiveValue())
+    return false;
+  const CSSPrimitiveValue* width_prim = ToCSSPrimitiveValue(width);
+  const CSSPrimitiveValue* height_prim = ToCSSPrimitiveValue(height);
+  return height_prim->IsPx() &&
+         (height_prim->GetDoubleValue() <= kMinDimensionToLazyLoad) &&
+         width_prim->IsPx() &&
+         (width_prim->GetDoubleValue() <= kMinDimensionToLazyLoad);
+}
+
 class TokenPreloadScanner::StartTagScanner {
   STACK_ALLOCATED();
 
@@ -157,6 +182,7 @@
         lazyload_attr_set_to_off_(false),
         width_attr_small_absolute_(false),
         height_attr_small_absolute_(false),
+        inline_style_dimensions_small_(false),
         scanner_type_(scanner_type) {
     if (Match(tag_impl_, kImgTag) || Match(tag_impl_, kSourceTag)) {
       source_size_ = SizesAttributeParser(media_values_, String()).length();
@@ -293,7 +319,8 @@
     // for the 'lazyload' attribute is considered as 'auto'.
     if ((lazyload_attr_set_to_off_ &&
          !document_parameters.lazyload_policy_enforced) ||
-        (width_attr_small_absolute_ && height_attr_small_absolute_)) {
+        (width_attr_small_absolute_ && height_attr_small_absolute_) ||
+        inline_style_dimensions_small_) {
       request->SetIsLazyloadImageDisabled(true);
     }
 
@@ -376,6 +403,11 @@
                RuntimeEnabledFeatures::LazyImageLoadingEnabled()) {
       height_attr_small_absolute_ =
           IsDimensionSmallAndAbsoluteForLazyLoad(attribute_value);
+    } else if (!inline_style_dimensions_small_ &&
+               Match(attribute_name, kStyleAttr) &&
+               RuntimeEnabledFeatures::LazyImageLoadingEnabled()) {
+      inline_style_dimensions_small_ = IsInlineStyleDimensionsSmall(
+          attribute_value, media_values_->StrictMode());
     }
   }
 
@@ -672,6 +704,7 @@
   bool lazyload_attr_set_to_off_;
   bool width_attr_small_absolute_;
   bool height_attr_small_absolute_;
+  bool inline_style_dimensions_small_;
   TokenPreloadScanner::ScannerType scanner_type_;
 };
 
diff --git a/third_party/blink/renderer/core/html/parser/html_preload_scanner_test.cc b/third_party/blink/renderer/core/html/parser/html_preload_scanner_test.cc
index a794316..018eab6 100644
--- a/third_party/blink/renderer/core/html/parser/html_preload_scanner_test.cc
+++ b/third_party/blink/renderer/core/html/parser/html_preload_scanner_test.cc
@@ -20,6 +20,7 @@
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 #include "third_party/blink/renderer/platform/exported/wrapped_resource_response.h"
 #include "third_party/blink/renderer/platform/loader/fetch/client_hints_preferences.h"
+#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 
 namespace blink {
@@ -85,6 +86,11 @@
   const char* input_html;
 };
 
+struct LazyImageLoadTestCase {
+  const char* input_html;
+  bool is_lazyload_image_disabled;
+};
+
 class HTMLMockHTMLResourcePreloader : public ResourcePreloader {
  public:
   void PreloadRequestVerification(ResourceType type,
@@ -187,6 +193,12 @@
     }
   }
 
+  void LazyImageLoadDisableVerification(bool is_lazyload_image_disabled) {
+    ASSERT_TRUE(preload_request_.get());
+    EXPECT_EQ(preload_request_->IsLazyloadImageDisabledForTesting(),
+              is_lazyload_image_disabled);
+  }
+
  protected:
   void Preload(std::unique_ptr<PreloadRequest> preload_request,
                const NetworkHintsInterface&) override {
@@ -355,6 +367,18 @@
         test_case.number_of_integrity_metadata_found);
   }
 
+  void Test(LazyImageLoadTestCase test_case) {
+    SCOPED_TRACE(test_case.input_html);
+    HTMLMockHTMLResourcePreloader preloader;
+    KURL base_url("http://example.test/");
+    scanner_->AppendToEnd(String(test_case.input_html));
+    PreloadRequestStream requests =
+        scanner_->Scan(base_url, nullptr, seen_csp_meta_tag_);
+    preloader.TakeAndPreload(requests);
+    preloader.LazyImageLoadDisableVerification(
+        test_case.is_lazyload_image_disabled);
+  }
+
  private:
   std::unique_ptr<HTMLPreloadScanner> scanner_;
   bool seen_csp_meta_tag_ = false;
@@ -1184,4 +1208,19 @@
     Test(test_case);
 }
 
+TEST_F(HTMLPreloadScannerTest, LazyImageLoadDisabledForSmallImages) {
+  ScopedLazyImageLoadingForTest scoped_lazy_image_loading_for_test(true);
+  LazyImageLoadTestCase test_cases[] = {
+      {"<img src='foo.jpg'>", false},
+      {"<img src='foo.jpg' style='height: 1px; width: 1px'>", true},
+      {"<img src='foo.jpg' style='height: 10px; width: 10px'>", true},
+      {"<img src='foo.jpg' style='height: 20px; width: 20px'>", false},
+      {"<img src='foo.jpg' style='height: 1px;'>", false},
+      {"<img src='foo.jpg' style='width: 1px;'>", false},
+  };
+
+  for (const auto& test_case : test_cases)
+    Test(test_case);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/html_tokenizer_fuzzer.cc b/third_party/blink/renderer/core/html/parser/html_tokenizer_fuzzer.cc
index e927e6b..64364a8 100644
--- a/third_party/blink/renderer/core/html/parser/html_tokenizer_fuzzer.cc
+++ b/third_party/blink/renderer/core/html/parser/html_tokenizer_fuzzer.cc
@@ -30,9 +30,8 @@
     // The tokenizer deals with incremental strings as they are received.
     // Split the input into a bunch of small chunks to throw partial tokens
     // at the tokenizer and exercise the state machine and resumption.
-    CString chunk = fuzzed_data_provider.ConsumeBytesInRange(1, 32);
-    SegmentedString segment(String(chunk.data(), chunk.length()));
-    input.Append(segment);
+    String chunk = fuzzed_data_provider.ConsumeRandomLengthString(32);
+    input.Append(SegmentedString(chunk));
     // If a token was generated from the input then the next call
     // needs to use a fresh token for output. If a token is not generated
     // then the same token instance needs to be reused in the next calls
@@ -48,7 +47,8 @@
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   // Need at least 2 bytes for the options flags and one byte of test data.
-  if (size >= 3)
+  // Avoid huge inputs which can cause non-actionable timeout crashes.
+  if (size >= 3 && size <= 16384)
     blink::FuzzTokenizer(data, size);
 
   return 0;
diff --git a/third_party/blink/renderer/core/html/parser/preload_request.h b/third_party/blink/renderer/core/html/parser/preload_request.h
index 7e0acb6f..82bf24a 100644
--- a/third_party/blink/renderer/core/html/parser/preload_request.h
+++ b/third_party/blink/renderer/core/html/parser/preload_request.h
@@ -8,8 +8,8 @@
 #include <memory>
 
 #include "base/memory/ptr_util.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/script/script.h"
 #include "third_party/blink/renderer/platform/cross_origin_attribute_value.h"
@@ -129,6 +129,9 @@
   void SetIsLazyloadImageDisabled(bool is_lazyload_image_disable) {
     is_lazyload_image_disabled_ = is_lazyload_image_disable;
   }
+  bool IsLazyloadImageDisabledForTesting() {
+    return is_lazyload_image_disabled_;
+  }
 
  private:
   PreloadRequest(const String& initiator_name,
diff --git a/third_party/blink/renderer/core/html/parser/text_resource_decoder_for_fuzzing.h b/third_party/blink/renderer/core/html/parser/text_resource_decoder_for_fuzzing.h
index d71506c..02487b8 100644
--- a/third_party/blink/renderer/core/html/parser/text_resource_decoder_for_fuzzing.h
+++ b/third_party/blink/renderer/core/html/parser/text_resource_decoder_for_fuzzing.h
@@ -51,8 +51,7 @@
     // Note: Charsets can be long (see the various encodings in
     // wtf/text). For instance: "unicode-1-1-utf-8". To ensure good coverage,
     // set a generous max limit for these sizes (32 bytes should be good).
-    return WTF::TextEncoding(
-        String::FromUTF8(fuzzed_data.ConsumeBytesInRange(0, 32)));
+    return WTF::TextEncoding(fuzzed_data.ConsumeRandomLengthString(32));
   }
 };
 
diff --git a/third_party/blink/renderer/core/html/track/audio_track.h b/third_party/blink/renderer/core/html/track/audio_track.h
index 27de0f48..683e3570 100644
--- a/third_party/blink/renderer/core/html/track/audio_track.h
+++ b/third_party/blink/renderer/core/html/track/audio_track.h
@@ -21,10 +21,16 @@
                             const AtomicString& label,
                             const AtomicString& language,
                             bool enabled) {
-    return new AudioTrack(id, IsValidKindKeyword(kind) ? kind : g_empty_atom,
-                          label, language, enabled);
+    return MakeGarbageCollected<AudioTrack>(
+        id, IsValidKindKeyword(kind) ? kind : g_empty_atom, label, language,
+        enabled);
   }
 
+  AudioTrack(const String& id,
+             const AtomicString& kind,
+             const AtomicString& label,
+             const AtomicString& language,
+             bool enabled);
   ~AudioTrack() override;
   void Trace(blink::Visitor*) override;
 
@@ -42,12 +48,6 @@
   static bool IsValidKindKeyword(const String&);
 
  private:
-  AudioTrack(const String& id,
-             const AtomicString& kind,
-             const AtomicString& label,
-             const AtomicString& language,
-             bool enabled);
-
   bool enabled_;
 };
 
diff --git a/third_party/blink/renderer/core/html/track/audio_track_list.cc b/third_party/blink/renderer/core/html/track/audio_track_list.cc
index 0b9cb73b..e9374a9a 100644
--- a/third_party/blink/renderer/core/html/track/audio_track_list.cc
+++ b/third_party/blink/renderer/core/html/track/audio_track_list.cc
@@ -7,7 +7,7 @@
 namespace blink {
 
 AudioTrackList* AudioTrackList::Create(HTMLMediaElement& media_element) {
-  return new AudioTrackList(media_element);
+  return MakeGarbageCollected<AudioTrackList>(media_element);
 }
 
 AudioTrackList::~AudioTrackList() = default;
diff --git a/third_party/blink/renderer/core/html/track/audio_track_list.h b/third_party/blink/renderer/core/html/track/audio_track_list.h
index 7d0f9ee..c211d82 100644
--- a/third_party/blink/renderer/core/html/track/audio_track_list.h
+++ b/third_party/blink/renderer/core/html/track/audio_track_list.h
@@ -16,6 +16,7 @@
  public:
   static AudioTrackList* Create(HTMLMediaElement&);
 
+  explicit AudioTrackList(HTMLMediaElement&);
   ~AudioTrackList() override;
 
   bool HasEnabledTrack() const;
@@ -26,9 +27,6 @@
   void Trace(blink::Visitor* visitor) override {
     TrackListBase<AudioTrack>::Trace(visitor);
   }
-
- private:
-  explicit AudioTrackList(HTMLMediaElement&);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/track/text_track_container.cc b/third_party/blink/renderer/core/html/track/text_track_container.cc
index 8a571082..2b7b442f 100644
--- a/third_party/blink/renderer/core/html/track/text_track_container.cc
+++ b/third_party/blink/renderer/core/html/track/text_track_container.cc
@@ -96,7 +96,7 @@
 
 void TextTrackContainer::ObserveSizeChanges(Element& element) {
   video_size_observer_ = ResizeObserver::Create(
-      GetDocument(), new VideoElementResizeDelegate(*this));
+      GetDocument(), MakeGarbageCollected<VideoElementResizeDelegate>(*this));
   video_size_observer_->observe(&element);
 }
 
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager_test.cc b/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
index 99456b3..f5618bb5 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
@@ -17,9 +17,12 @@
 class CheckPointerEventListenerCallback final : public EventListener {
  public:
   static CheckPointerEventListenerCallback* Create() {
-    return new CheckPointerEventListenerCallback();
+    return MakeGarbageCollected<CheckPointerEventListenerCallback>();
   }
 
+  CheckPointerEventListenerCallback()
+      : EventListener(EventListener::kCPPEventListenerType) {}
+
   bool operator==(const EventListener& other) const override {
     return this == &other;
   }
@@ -39,8 +42,6 @@
   int penEventCount() const { return pen_event_received_count_; }
 
  private:
-  CheckPointerEventListenerCallback()
-      : EventListener(EventListener::kCPPEventListenerType) {}
   int mouse_event_received_count_ = 0;
   int touch_event_received_count_ = 0;
   int pen_event_received_count_ = 0;
@@ -49,9 +50,12 @@
 class PointerEventCoordinateListenerCallback final : public EventListener {
  public:
   static PointerEventCoordinateListenerCallback* Create() {
-    return new PointerEventCoordinateListenerCallback();
+    return MakeGarbageCollected<PointerEventCoordinateListenerCallback>();
   }
 
+  PointerEventCoordinateListenerCallback()
+      : EventListener(EventListener::kCPPEventListenerType) {}
+
   bool operator==(const EventListener& other) const override {
     return this == &other;
   }
@@ -80,10 +84,6 @@
   double last_height_ = 0;
   double last_movement_x_ = 0;
   double last_movement_y_ = 0;
-
- private:
-  PointerEventCoordinateListenerCallback()
-      : EventListener(EventListener::kCPPEventListenerType) {}
 };
 
 }  // namespace
diff --git a/third_party/blink/renderer/core/input/touch_event_manager_test.cc b/third_party/blink/renderer/core/input/touch_event_manager_test.cc
index 82f8ae6..2760a137 100644
--- a/third_party/blink/renderer/core/input/touch_event_manager_test.cc
+++ b/third_party/blink/renderer/core/input/touch_event_manager_test.cc
@@ -35,8 +35,14 @@
 class CheckEventListenerCallback final : public EventListener {
  public:
   static CheckEventListenerCallback* Create() {
-    return new CheckEventListenerCallback();
+    return MakeGarbageCollected<CheckEventListenerCallback>();
   }
+
+  CheckEventListenerCallback()
+      : EventListener(EventListener::kCPPEventListenerType) {
+    event_received_ = false;
+  }
+
   bool operator==(const EventListener& other) const override {
     return this == &other;
   }
@@ -48,10 +54,6 @@
   bool HasReceivedEvent() const { return event_received_; }
 
  private:
-  CheckEventListenerCallback()
-      : EventListener(EventListener::kCPPEventListenerType) {
-    event_received_ = false;
-  }
   bool event_received_;
 };
 
diff --git a/third_party/blink/renderer/core/inspector/console_message.cc b/third_party/blink/renderer/core/inspector/console_message.cc
index c5aba6d..3d7ef604 100644
--- a/third_party/blink/renderer/core/inspector/console_message.cc
+++ b/third_party/blink/renderer/core/inspector/console_message.cc
@@ -36,7 +36,8 @@
     MessageLevel level,
     const String& message,
     std::unique_ptr<SourceLocation> location) {
-  return new ConsoleMessage(source, level, message, std::move(location));
+  return MakeGarbageCollected<ConsoleMessage>(source, level, message,
+                                              std::move(location));
 }
 
 // static
diff --git a/third_party/blink/renderer/core/inspector/console_message.h b/third_party/blink/renderer/core/inspector/console_message.h
index 536b9fb..5105e9ca 100644
--- a/third_party/blink/renderer/core/inspector/console_message.h
+++ b/third_party/blink/renderer/core/inspector/console_message.h
@@ -47,6 +47,10 @@
                                           std::unique_ptr<SourceLocation>,
                                           WorkerThread*);
 
+  ConsoleMessage(MessageSource,
+                 MessageLevel,
+                 const String& message,
+                 std::unique_ptr<SourceLocation>);
   ~ConsoleMessage();
 
   SourceLocation* Location() const;
@@ -63,11 +67,6 @@
   void Trace(blink::Visitor*);
 
  private:
-  ConsoleMessage(MessageSource,
-                 MessageLevel,
-                 const String& message,
-                 std::unique_ptr<SourceLocation>);
-
   MessageSource source_;
   MessageLevel level_;
   String message_;
diff --git a/third_party/blink/renderer/core/inspector/devtools_agent.cc b/third_party/blink/renderer/core/inspector/devtools_agent.cc
index ce60e4b..416291a 100644
--- a/third_party/blink/renderer/core/inspector/devtools_agent.cc
+++ b/third_party/blink/renderer/core/inspector/devtools_agent.cc
@@ -108,7 +108,7 @@
     mojom::blink::DevToolsSessionRequest io_session_request,
     mojom::blink::DevToolsSessionStatePtr reattach_session_state) {
   client_->DebuggerTaskStarted();
-  DevToolsSession* session = new DevToolsSession(
+  DevToolsSession* session = MakeGarbageCollected<DevToolsSession>(
       this, std::move(host), std::move(session_request),
       std::move(io_session_request), std::move(reattach_session_state));
   sessions_.insert(session);
diff --git a/third_party/blink/renderer/core/inspector/inspector_history.cc b/third_party/blink/renderer/core/inspector/inspector_history.cc
index 9209443..e83d305 100644
--- a/third_party/blink/renderer/core/inspector/inspector_history.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_history.cc
@@ -97,7 +97,8 @@
 }
 
 void InspectorHistory::MarkUndoableState() {
-  Perform(new UndoableStateMark(), IGNORE_EXCEPTION_FOR_TESTING);
+  Perform(MakeGarbageCollected<UndoableStateMark>(),
+          IGNORE_EXCEPTION_FOR_TESTING);
 }
 
 bool InspectorHistory::Undo(ExceptionState& exception_state) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
index 04bb17d..c778c92 100644
--- a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
@@ -1339,7 +1339,7 @@
   Document* document = inspected_frames_->Root()->GetDocument();
 
   // Construct the test report.
-  TestReportBody* body = new TestReportBody(message);
+  TestReportBody* body = MakeGarbageCollected<TestReportBody>(message);
   Report* report =
       MakeGarbageCollected<Report>("test", document->Url().GetString(), body);
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.cc b/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.cc
index c1c5979..057e35e 100644
--- a/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h"
 
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/core/css/css_style_sheet.h"
 #include "third_party/blink/renderer/core/css/style_sheet_contents.h"
diff --git a/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc b/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc
index 486bb38..0086828a 100644
--- a/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc
+++ b/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc
@@ -71,7 +71,7 @@
     : debugger_(debugger),
       thread_(thread),
       inspected_frames_(nullptr),
-      probe_sink_(new CoreProbeSink()) {
+      probe_sink_(MakeGarbageCollected<CoreProbeSink>()) {
   probe_sink_->addInspectorTraceEvents(
       MakeGarbageCollected<InspectorTraceEvents>());
   if (auto* scope = DynamicTo<WorkerGlobalScope>(thread->GlobalScope())) {
@@ -85,9 +85,9 @@
   if (!parent_devtools_token_.is_empty() && io_task_runner) {
     // There may be no io task runner in unit tests.
     wait_for_debugger_ = devtools_params->wait_for_debugger;
-    agent_ = new DevToolsAgent(this, inspected_frames_.Get(), probe_sink_.Get(),
-                               std::move(inspector_task_runner),
-                               std::move(io_task_runner));
+    agent_ = MakeGarbageCollected<DevToolsAgent>(
+        this, inspected_frames_.Get(), probe_sink_.Get(),
+        std::move(inspector_task_runner), std::move(io_task_runner));
     agent_->BindRequest(std::move(devtools_params->agent_host_ptr_info),
                         std::move(devtools_params->agent_request),
                         thread->GetTaskRunner(TaskType::kInternalInspector));
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
index f9dbc80..44d25d3b 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
@@ -199,7 +199,8 @@
     bool track_visibility,
     ExceptionState& exception_state) {
   IntersectionObserverDelegateImpl* intersection_observer_delegate =
-      new IntersectionObserverDelegateImpl(document, std::move(callback));
+      MakeGarbageCollected<IntersectionObserverDelegateImpl>(
+          document, std::move(callback));
   return MakeGarbageCollected<IntersectionObserver>(
       *intersection_observer_delegate, nullptr, root_margin, thresholds, delay,
       track_visibility);
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc
index 2acc953..b003ea3b 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc
@@ -83,7 +83,7 @@
   IntersectionObserverInit* observer_init = IntersectionObserverInit::Create();
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -120,7 +120,7 @@
   observer_init->setRoot(root);
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -157,7 +157,7 @@
   IntersectionObserverInit* observer_init = IntersectionObserverInit::Create();
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -217,7 +217,7 @@
   IntersectionObserverInit* observer_init = IntersectionObserverInit::Create();
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -264,7 +264,7 @@
   IntersectionObserverInit* observer_init = IntersectionObserverInit::Create();
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -314,7 +314,7 @@
   IntersectionObserverInit* observer_init = IntersectionObserverInit::Create();
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -349,7 +349,7 @@
   IntersectionObserverInit* observer_init = IntersectionObserverInit::Create();
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -399,7 +399,7 @@
   observer_init->setDelay(100);
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -457,7 +457,7 @@
   observer_init->setDelay(100);
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
@@ -506,7 +506,7 @@
   observer_init->setDelay(100);
   DummyExceptionStateForTesting exception_state;
   TestIntersectionObserverDelegate* observer_delegate =
-      new TestIntersectionObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
   IntersectionObserver* observer = IntersectionObserver::Create(
       observer_init, *observer_delegate, exception_state);
   ASSERT_FALSE(exception_state.HadException());
diff --git a/third_party/blink/renderer/core/invisible_dom/activate_invisible_event.h b/third_party/blink/renderer/core/invisible_dom/activate_invisible_event.h
index 050e2663..6a978db 100644
--- a/third_party/blink/renderer/core/invisible_dom/activate_invisible_event.h
+++ b/third_party/blink/renderer/core/invisible_dom/activate_invisible_event.h
@@ -16,9 +16,11 @@
 
  public:
   static ActivateInvisibleEvent* Create(Element* activated_element) {
-    return new ActivateInvisibleEvent(activated_element);
+    return MakeGarbageCollected<ActivateInvisibleEvent>(activated_element);
   }
 
+  explicit ActivateInvisibleEvent(Element* activated_element);
+
   Element* activatedElement() const { return activated_element_.Get(); }
 
   void SetActivatedElement(Element* activated_element) {
@@ -31,8 +33,6 @@
   void Trace(Visitor*) override;
 
  private:
-  explicit ActivateInvisibleEvent(Element* activated_element);
-
   Member<Element> activated_element_;
 };
 
diff --git a/third_party/blink/renderer/core/layout/custom/css_layout_definition.cc b/third_party/blink/renderer/core/layout/custom/css_layout_definition.cc
index d591ee5..ffc0d0c 100644
--- a/third_party/blink/renderer/core/layout/custom/css_layout_definition.cc
+++ b/third_party/blink/renderer/core/layout/custom/css_layout_definition.cc
@@ -120,9 +120,10 @@
     fixed_block_size = computed_values.extent_;
   }
 
-  CustomLayoutConstraints* constraints = new CustomLayoutConstraints(
-      layout_custom.LogicalWidth(), fixed_block_size,
-      layout_custom.GetConstraintData(), isolate);
+  CustomLayoutConstraints* constraints =
+      MakeGarbageCollected<CustomLayoutConstraints>(
+          layout_custom.LogicalWidth(), fixed_block_size,
+          layout_custom.GetConstraintData(), isolate);
 
   // TODO(ikilpatrick): Instead of creating a new style_map each time here,
   // store on LayoutCustom, and update when the style changes.
diff --git a/third_party/blink/renderer/core/layout/custom/custom_layout_child.cc b/third_party/blink/renderer/core/layout/custom/custom_layout_child.cc
index a992eaa..b34bd33d 100644
--- a/third_party/blink/renderer/core/layout/custom/custom_layout_child.cc
+++ b/third_party/blink/renderer/core/layout/custom/custom_layout_child.cc
@@ -41,8 +41,8 @@
       return nullptr;
   }
 
-  return new CustomLayoutFragmentRequest(this, options,
-                                         std::move(constraint_data));
+  return MakeGarbageCollected<CustomLayoutFragmentRequest>(
+      this, options, std::move(constraint_data));
 }
 
 void CustomLayoutChild::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/layout/custom/custom_layout_fragment_request.cc b/third_party/blink/renderer/core/layout/custom/custom_layout_fragment_request.cc
index fd45906..d7b2e85 100644
--- a/third_party/blink/renderer/core/layout/custom/custom_layout_fragment_request.cc
+++ b/third_party/blink/renderer/core/layout/custom/custom_layout_fragment_request.cc
@@ -118,8 +118,8 @@
   LayoutUnit fragment_block_size =
       is_parallel_writing_mode ? box->LogicalHeight() : box->LogicalWidth();
 
-  return new CustomLayoutFragment(this, fragment_inline_size,
-                                  fragment_block_size, isolate);
+  return MakeGarbageCollected<CustomLayoutFragment>(
+      this, fragment_inline_size, fragment_block_size, isolate);
 }
 
 LayoutBox* CustomLayoutFragmentRequest::GetLayoutBox() const {
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 8afce7c..481019f1 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -5980,7 +5980,8 @@
   if (!definition)
     return;
 
-  EnsureRareData().layout_child_ = new CustomLayoutChild(*definition, this);
+  EnsureRareData().layout_child_ =
+      MakeGarbageCollected<CustomLayoutChild>(*definition, this);
 }
 
 void LayoutBox::ClearCustomLayoutChild() {
diff --git a/third_party/blink/renderer/core/loader/appcache/application_cache.h b/third_party/blink/renderer/core/loader/appcache/application_cache.h
index 0112a5a..31802b9 100644
--- a/third_party/blink/renderer/core/loader/appcache/application_cache.h
+++ b/third_party/blink/renderer/core/loader/appcache/application_cache.h
@@ -44,8 +44,10 @@
 
  public:
   static ApplicationCache* Create(LocalFrame* frame) {
-    return new ApplicationCache(frame);
+    return MakeGarbageCollected<ApplicationCache>(frame);
   }
+
+  explicit ApplicationCache(LocalFrame*);
   ~ApplicationCache() override = default;
 
   unsigned short status() const;
@@ -72,8 +74,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  explicit ApplicationCache(LocalFrame*);
-
   void RecordAPIUseType() const;
 
   ApplicationCacheHost* GetApplicationCacheHost() const;
diff --git a/third_party/blink/renderer/core/loader/appcache/application_cache_host.h b/third_party/blink/renderer/core/loader/appcache/application_cache_host.h
index ca00e85..cddf5be 100644
--- a/third_party/blink/renderer/core/loader/appcache/application_cache_host.h
+++ b/third_party/blink/renderer/core/loader/appcache/application_cache_host.h
@@ -53,9 +53,10 @@
       public WebApplicationCacheHostClient {
  public:
   static ApplicationCacheHost* Create(DocumentLoader* loader) {
-    return new ApplicationCacheHost(loader);
+    return MakeGarbageCollected<ApplicationCacheHost>(loader);
   }
 
+  explicit ApplicationCacheHost(DocumentLoader*);
   ~ApplicationCacheHost() override;
   void DetachFromDocumentLoader();
 
@@ -162,8 +163,6 @@
   void Trace(blink::Visitor*);
 
  private:
-  explicit ApplicationCacheHost(DocumentLoader*);
-
   void WillStartLoadingMainResource(const KURL&, const String&);
 
   // WebApplicationCacheHostClient implementation
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index 58bb8b7..2f7053f 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -40,7 +40,7 @@
 #include "third_party/blink/public/common/blob/blob_utils.h"
 #include "third_party/blink/public/common/client_hints/client_hints.h"
 #include "third_party/blink/public/common/device_memory/approximated_device_memory.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_application_cache_host.h"
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
index 3703b8e444..33873fd 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
@@ -39,8 +39,8 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/device_memory/approximated_device_memory.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/net/ip_address_space.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_client_hints_type.h"
 #include "third_party/blink/public/platform/web_document_subresource_filter.h"
 #include "third_party/blink/public/platform/web_insecure_request_policy.h"
@@ -280,7 +280,8 @@
     http_url = KURL("http://example.test/foo");
     main_resource_url = KURL("https://example.test");
     different_host_url = KURL("https://different.example.test/foo");
-    client = new testing::NiceMock<FrameFetchContextMockLocalFrameClient>();
+    client = MakeGarbageCollected<
+        testing::NiceMock<FrameFetchContextMockLocalFrameClient>>();
     dummy_page_holder =
         DummyPageHolder::Create(IntSize(500, 500), nullptr, client);
     dummy_page_holder->GetPage().SetDeviceScaleFactorDeprecated(1.0);
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index a737fd7e..9d409be 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -42,8 +42,8 @@
 #include "base/unguessable_token.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom-blink.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/frame/navigation_initiator.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc
index d8fb9a7..e3fb26b 100644
--- a/third_party/blink/renderer/core/loader/image_loader.cc
+++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -25,11 +25,14 @@
 #include <memory>
 #include <utility>
 
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_client_hints_type.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
+#include "third_party/blink/renderer/core/css/css_primitive_value.h"
+#include "third_party/blink/renderer/core/css/css_property_name.h"
+#include "third_party/blink/renderer/core/css/css_property_value_set.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
@@ -100,6 +103,24 @@
       width <= kMinDimensionToLazyLoad && height <= kMinDimensionToLazyLoad) {
     return false;
   }
+  // Avoid lazyloading if width or height is specified in inline style and is
+  // small enough. This heuristic helps avoid double fetching tracking pixels.
+  if (const auto* property_set = html_image->InlineStyle()) {
+    const CSSValue* width = property_set->GetPropertyCSSValue(CSSPropertyWidth);
+    const CSSValue* height =
+        property_set->GetPropertyCSSValue(CSSPropertyHeight);
+    if (width && width->IsPrimitiveValue() && height &&
+        height->IsPrimitiveValue()) {
+      const CSSPrimitiveValue* width_prim = ToCSSPrimitiveValue(width);
+      const CSSPrimitiveValue* height_prim = ToCSSPrimitiveValue(height);
+      if (height_prim->IsPx() &&
+          (height_prim->GetDoubleValue() <= kMinDimensionToLazyLoad) &&
+          width_prim->IsPx() &&
+          (width_prim->GetDoubleValue() <= kMinDimensionToLazyLoad)) {
+        return false;
+      }
+    }
+  }
   return frame->GetDocument()->GetSettings() &&
          frame->GetDocument()->GetSettings()->GetLazyLoadEnabled() &&
          frame->IsLazyLoadingImageAllowed();
diff --git a/third_party/blink/renderer/core/loader/importance_attribute.h b/third_party/blink/renderer/core/loader/importance_attribute.h
index ccb1f9c..859102e 100644
--- a/third_party/blink/renderer/core/loader/importance_attribute.h
+++ b/third_party/blink/renderer/core/loader/importance_attribute.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_IMPORTANCE_ATTRIBUTE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_IMPORTANCE_ATTRIBUTE_H_
 
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/loader/link_loader_test.cc b/third_party/blink/renderer/core/loader/link_loader_test.cc
index 6d777dd..fd768177 100644
--- a/third_party/blink/renderer/core/loader/link_loader_test.cc
+++ b/third_party/blink/renderer/core/loader/link_loader_test.cc
@@ -35,9 +35,11 @@
 
  public:
   static MockLinkLoaderClient* Create(bool should_load) {
-    return new MockLinkLoaderClient(should_load);
+    return MakeGarbageCollected<MockLinkLoaderClient>(should_load);
   }
 
+  explicit MockLinkLoaderClient(bool should_load) : should_load_(should_load) {}
+
   void Trace(blink::Visitor* visitor) override {
     LinkLoaderClient::Trace(visitor);
   }
@@ -57,8 +59,6 @@
   }
 
  private:
-  explicit MockLinkLoaderClient(bool should_load) : should_load_(should_load) {}
-
   const bool should_load_;
 };
 
@@ -500,7 +500,7 @@
   std::unique_ptr<DummyPageHolder> dummy_page_holder =
       DummyPageHolder::Create();
   ModulePreloadTestModulator* modulator =
-      new ModulePreloadTestModulator(&test_case);
+      MakeGarbageCollected<ModulePreloadTestModulator>(&test_case);
   Modulator::SetModulator(
       ToScriptStateForMainWorld(dummy_page_holder->GetDocument().GetFrame()),
       modulator);
diff --git a/third_party/blink/renderer/core/loader/long_task_detector.cc b/third_party/blink/renderer/core/loader/long_task_detector.cc
index dc9f2876..a78063e 100644
--- a/third_party/blink/renderer/core/loader/long_task_detector.cc
+++ b/third_party/blink/renderer/core/loader/long_task_detector.cc
@@ -14,7 +14,7 @@
 // static
 LongTaskDetector& LongTaskDetector::Instance() {
   DEFINE_STATIC_LOCAL(Persistent<LongTaskDetector>, long_task_detector,
-                      (new LongTaskDetector));
+                      (MakeGarbageCollected<LongTaskDetector>()));
   DCHECK(IsMainThread());
   return *long_task_detector;
 }
diff --git a/third_party/blink/renderer/core/loader/long_task_detector.h b/third_party/blink/renderer/core/loader/long_task_detector.h
index acdff42..f98bc1d43 100644
--- a/third_party/blink/renderer/core/loader/long_task_detector.h
+++ b/third_party/blink/renderer/core/loader/long_task_detector.h
@@ -32,6 +32,8 @@
  public:
   static LongTaskDetector& Instance();
 
+  LongTaskDetector();
+
   void RegisterObserver(LongTaskObserver*);
   void UnregisterObserver(LongTaskObserver*);
 
@@ -41,8 +43,6 @@
       base::TimeDelta::FromMilliseconds(50);
 
  private:
-  LongTaskDetector();
-
   // scheduler::TaskTimeObserver implementation
   void WillProcessTask(base::TimeTicks start_time) override {}
   void DidProcessTask(base::TimeTicks start_time,
diff --git a/third_party/blink/renderer/core/loader/long_task_detector_test.cc b/third_party/blink/renderer/core/loader/long_task_detector_test.cc
index 453bf7c9..ce980c07 100644
--- a/third_party/blink/renderer/core/loader/long_task_detector_test.cc
+++ b/third_party/blink/renderer/core/loader/long_task_detector_test.cc
@@ -69,7 +69,8 @@
 };
 
 TEST_F(LongTaskDetectorTest, DeliversLongTaskNotificationOnlyWhenRegistered) {
-  TestLongTaskObserver* long_task_observer = new TestLongTaskObserver();
+  TestLongTaskObserver* long_task_observer =
+      MakeGarbageCollected<TestLongTaskObserver>();
   SimulateTask(LongTaskDetector::kLongTaskThreshold +
                base::TimeDelta::FromMilliseconds(10));
   EXPECT_EQ(long_task_observer->last_long_task_end, TimeTicks());
@@ -92,7 +93,8 @@
 }
 
 TEST_F(LongTaskDetectorTest, DoesNotGetNotifiedOfShortTasks) {
-  TestLongTaskObserver* long_task_observer = new TestLongTaskObserver();
+  TestLongTaskObserver* long_task_observer =
+      MakeGarbageCollected<TestLongTaskObserver>();
   LongTaskDetector::Instance().RegisterObserver(long_task_observer);
   SimulateTask(LongTaskDetector::kLongTaskThreshold -
                base::TimeDelta::FromMilliseconds(10));
@@ -105,7 +107,8 @@
 }
 
 TEST_F(LongTaskDetectorTest, RegisterSameObserverTwice) {
-  TestLongTaskObserver* long_task_observer = new TestLongTaskObserver();
+  TestLongTaskObserver* long_task_observer =
+      MakeGarbageCollected<TestLongTaskObserver>();
   LongTaskDetector::Instance().RegisterObserver(long_task_observer);
   LongTaskDetector::Instance().RegisterObserver(long_task_observer);
 
diff --git a/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc b/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc
index 8000502b..2a15a0e 100644
--- a/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc
+++ b/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc
@@ -121,7 +121,7 @@
 
 TEST(MixedContentCheckerTest, HandleCertificateError) {
   MixedContentCheckerMockLocalFrameClient* client =
-      new MixedContentCheckerMockLocalFrameClient;
+      MakeGarbageCollected<MixedContentCheckerMockLocalFrameClient>();
   std::unique_ptr<DummyPageHolder> dummy_page_holder =
       DummyPageHolder::Create(IntSize(1, 1), nullptr, client);
 
@@ -153,7 +153,7 @@
 
 TEST(MixedContentCheckerTest, DetectMixedForm) {
   MixedContentCheckerMockLocalFrameClient* client =
-      new MixedContentCheckerMockLocalFrameClient;
+      MakeGarbageCollected<MixedContentCheckerMockLocalFrameClient>();
   std::unique_ptr<DummyPageHolder> dummy_page_holder =
       DummyPageHolder::Create(IntSize(1, 1), nullptr, client);
 
@@ -186,7 +186,7 @@
 
 TEST(MixedContentCheckerTest, DetectMixedFavicon) {
   MixedContentCheckerMockLocalFrameClient* client =
-      new MixedContentCheckerMockLocalFrameClient;
+      MakeGarbageCollected<MixedContentCheckerMockLocalFrameClient>();
   std::unique_ptr<DummyPageHolder> dummy_page_holder =
       DummyPageHolder::Create(IntSize(1, 1), nullptr, client);
   dummy_page_holder->GetFrame().GetSettings()->SetAllowRunningOfInsecureContent(
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_loader_test.cc b/third_party/blink/renderer/core/loader/modulescript/module_script_loader_test.cc
index 5f169e7..324217c 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_script_loader_test.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/module_script_loader_test.cc
@@ -170,7 +170,7 @@
   auto* fetch_context =
       MockFetchContext::Create(MockFetchContext::kShouldLoadNewResource);
   auto* fetcher = ResourceFetcher::Create(fetch_context);
-  modulator_ = new ModuleScriptLoaderTestModulator(
+  modulator_ = MakeGarbageCollected<ModuleScriptLoaderTestModulator>(
       ToScriptStateForMainWorld(&GetFrame()), GetDocument().GetSecurityOrigin(),
       fetcher);
 }
@@ -190,12 +190,13 @@
       GetDocument().AddressSpace(),
       OriginTrialContext::GetTokens(&GetDocument()).get(),
       base::UnguessableToken::Create(), nullptr /* worker_settings */,
-      kV8CacheOptionsDefault, new WorkletModuleResponsesMap);
+      kV8CacheOptionsDefault,
+      MakeGarbageCollected<WorkletModuleResponsesMap>());
   global_scope_ = MakeGarbageCollected<WorkletGlobalScope>(
       std::move(creation_params), *reporting_proxy_, &GetFrame());
   global_scope_->ScriptController()->InitializeContextIfNeeded("Dummy Context",
                                                                NullURL());
-  modulator_ = new ModuleScriptLoaderTestModulator(
+  modulator_ = MakeGarbageCollected<ModuleScriptLoaderTestModulator>(
       global_scope_->ScriptController()->GetScriptState(),
       GetDocument().GetSecurityOrigin(), fetcher);
 }
@@ -215,7 +216,8 @@
 
 TEST_F(ModuleScriptLoaderTest, FetchDataURL) {
   InitializeForDocument();
-  TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestFetchDataURL(ModuleScriptCustomFetchType::kNone, client);
 
   // TODO(leszeks): This should finish synchronously, but currently due
@@ -229,7 +231,8 @@
 
 TEST_F(ModuleScriptLoaderTest, FetchDataURL_OnWorklet) {
   InitializeForWorklet();
-  TestModuleScriptLoaderClient* client1 = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client1 =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestFetchDataURL(ModuleScriptCustomFetchType::kWorkletAddModule, client1);
 
   EXPECT_FALSE(client1->WasNotifyFinished())
@@ -243,7 +246,8 @@
 
   // Try to fetch the same URL again in order to verify the case where
   // WorkletModuleResponsesMap serves a cache.
-  TestModuleScriptLoaderClient* client2 = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client2 =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestFetchDataURL(ModuleScriptCustomFetchType::kWorkletAddModule, client2);
 
   EXPECT_FALSE(client2->WasNotifyFinished())
@@ -272,7 +276,8 @@
 
 TEST_F(ModuleScriptLoaderTest, InvalidSpecifier) {
   InitializeForDocument();
-  TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestInvalidSpecifier(ModuleScriptCustomFetchType::kNone, client);
 
   // TODO(leszeks): This should finish synchronously, but currently due
@@ -287,7 +292,8 @@
 
 TEST_F(ModuleScriptLoaderTest, InvalidSpecifier_OnWorklet) {
   InitializeForWorklet();
-  TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestInvalidSpecifier(ModuleScriptCustomFetchType::kWorkletAddModule, client);
 
   EXPECT_FALSE(client->WasNotifyFinished())
@@ -316,7 +322,8 @@
 
 TEST_F(ModuleScriptLoaderTest, FetchInvalidURL) {
   InitializeForDocument();
-  TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestFetchInvalidURL(ModuleScriptCustomFetchType::kNone, client);
 
   // TODO(leszeks): This should finish synchronously, but currently due
@@ -328,7 +335,8 @@
 
 TEST_F(ModuleScriptLoaderTest, FetchInvalidURL_OnWorklet) {
   InitializeForWorklet();
-  TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestFetchInvalidURL(ModuleScriptCustomFetchType::kWorkletAddModule, client);
 
   EXPECT_FALSE(client->WasNotifyFinished())
@@ -357,7 +365,8 @@
 
 TEST_F(ModuleScriptLoaderTest, FetchURL) {
   InitializeForDocument();
-  TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestFetchURL(ModuleScriptCustomFetchType::kNone, client);
 
   EXPECT_FALSE(client->WasNotifyFinished())
@@ -373,7 +382,8 @@
 
 TEST_F(ModuleScriptLoaderTest, FetchURL_OnWorklet) {
   InitializeForWorklet();
-  TestModuleScriptLoaderClient* client = new TestModuleScriptLoaderClient;
+  TestModuleScriptLoaderClient* client =
+      MakeGarbageCollected<TestModuleScriptLoaderClient>();
   TestFetchURL(ModuleScriptCustomFetchType::kWorkletAddModule, client);
 
   EXPECT_FALSE(client->WasNotifyFinished())
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_tree_linker_test.cc b/third_party/blink/renderer/core/loader/modulescript/module_tree_linker_test.cc
index 36a5704..f848335f 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_tree_linker_test.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/module_tree_linker_test.cc
@@ -209,7 +209,7 @@
   ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
 
   KURL url("http://example.com/root.js");
-  TestModuleTreeClient* client = new TestModuleTreeClient;
+  TestModuleTreeClient* client = MakeGarbageCollected<TestModuleTreeClient>();
   ModuleTreeLinker::Fetch(
       url, GetDocument().CreateFetchClientSettingsObjectSnapshot(),
       mojom::RequestContextType::SCRIPT, ScriptFetchOptions(), GetModulator(),
@@ -231,7 +231,7 @@
   ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
 
   KURL url("http://example.com/root.js");
-  TestModuleTreeClient* client = new TestModuleTreeClient;
+  TestModuleTreeClient* client = MakeGarbageCollected<TestModuleTreeClient>();
   ModuleTreeLinker::Fetch(
       url, GetDocument().CreateFetchClientSettingsObjectSnapshot(),
       mojom::RequestContextType::SCRIPT, ScriptFetchOptions(), GetModulator(),
@@ -257,7 +257,7 @@
   ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
 
   KURL url("http://example.com/root.js");
-  TestModuleTreeClient* client = new TestModuleTreeClient;
+  TestModuleTreeClient* client = MakeGarbageCollected<TestModuleTreeClient>();
   ModuleTreeLinker::Fetch(
       url, GetDocument().CreateFetchClientSettingsObjectSnapshot(),
       mojom::RequestContextType::SCRIPT, ScriptFetchOptions(), GetModulator(),
@@ -284,7 +284,7 @@
   ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
 
   KURL url("http://example.com/root.js");
-  TestModuleTreeClient* client = new TestModuleTreeClient;
+  TestModuleTreeClient* client = MakeGarbageCollected<TestModuleTreeClient>();
   ModuleTreeLinker::Fetch(
       url, GetDocument().CreateFetchClientSettingsObjectSnapshot(),
       mojom::RequestContextType::SCRIPT, ScriptFetchOptions(), GetModulator(),
@@ -324,7 +324,7 @@
   ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
 
   KURL url("http://example.com/root.js");
-  TestModuleTreeClient* client = new TestModuleTreeClient;
+  TestModuleTreeClient* client = MakeGarbageCollected<TestModuleTreeClient>();
   ModuleTreeLinker::Fetch(
       url, GetDocument().CreateFetchClientSettingsObjectSnapshot(),
       mojom::RequestContextType::SCRIPT, ScriptFetchOptions(), GetModulator(),
@@ -383,7 +383,7 @@
   ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
 
   KURL url("http://example.com/depth1.js");
-  TestModuleTreeClient* client = new TestModuleTreeClient;
+  TestModuleTreeClient* client = MakeGarbageCollected<TestModuleTreeClient>();
   ModuleTreeLinker::Fetch(
       url, GetDocument().CreateFetchClientSettingsObjectSnapshot(),
       mojom::RequestContextType::SCRIPT, ScriptFetchOptions(), GetModulator(),
@@ -409,7 +409,7 @@
   ModuleTreeLinkerRegistry* registry = ModuleTreeLinkerRegistry::Create();
 
   KURL url("http://example.com/a.js");
-  TestModuleTreeClient* client = new TestModuleTreeClient;
+  TestModuleTreeClient* client = MakeGarbageCollected<TestModuleTreeClient>();
   ModuleTreeLinker::Fetch(
       url, GetDocument().CreateFetchClientSettingsObjectSnapshot(),
       mojom::RequestContextType::SCRIPT, ScriptFetchOptions(), GetModulator(),
diff --git a/third_party/blink/renderer/core/loader/navigation_scheduler.cc b/third_party/blink/renderer/core/loader/navigation_scheduler.cc
index 2f9ed71..5f0e14d 100644
--- a/third_party/blink/renderer/core/loader/navigation_scheduler.cc
+++ b/third_party/blink/renderer/core/loader/navigation_scheduler.cc
@@ -34,7 +34,7 @@
 
 #include <memory>
 #include "third_party/blink/public/common/blob/blob_utils.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
diff --git a/third_party/blink/renderer/core/loader/ping_loader_test.cc b/third_party/blink/renderer/core/loader/ping_loader_test.cc
index d1528a99..af694d7 100644
--- a/third_party/blink/renderer/core/loader/ping_loader_test.cc
+++ b/third_party/blink/renderer/core/loader/ping_loader_test.cc
@@ -37,7 +37,7 @@
 class PingLoaderTest : public PageTestBase {
  public:
   void SetUp() override {
-    client_ = new PingLocalFrameClient;
+    client_ = MakeGarbageCollected<PingLocalFrameClient>();
     PageTestBase::SetupPageWithClients(nullptr, client_);
   }
 
diff --git a/third_party/blink/renderer/core/loader/resource/font_resource_test.cc b/third_party/blink/renderer/core/loader/resource/font_resource_test.cc
index 89c8c16..403f176f 100644
--- a/third_party/blink/renderer/core/loader/resource/font_resource_test.cc
+++ b/third_party/blink/renderer/core/loader/resource/font_resource_test.cc
@@ -5,7 +5,7 @@
 #include "third_party/blink/renderer/core/loader/resource/font_resource.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_url_loader_mock_factory.h"
 #include "third_party/blink/renderer/core/css/css_font_face_src_value.h"
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
index eb538b4..b4453d4 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_content.cc
@@ -104,7 +104,7 @@
       has_device_pixel_ratio_header_value_(false),
       image_(std::move(image)) {
   DEFINE_STATIC_LOCAL(Persistent<NullImageResourceInfo>, null_info,
-                      (new NullImageResourceInfo()));
+                      (MakeGarbageCollected<NullImageResourceInfo>()));
   info_ = null_info;
 }
 
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
index ca251db..8ce0e04 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
@@ -33,7 +33,7 @@
 #include <memory>
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/platform/web_url_loader_mock_factory.h"
@@ -521,7 +521,7 @@
   static MockFinishObserver* Create() {
     return
 
-        new testing::StrictMock<MockFinishObserver>;
+        MakeGarbageCollected<testing::StrictMock<MockFinishObserver>>();
   }
   MOCK_METHOD0(NotifyFinished, void());
   String DebugName() const override { return "MockFinishObserver"; }
diff --git a/third_party/blink/renderer/core/page/autoscroll_controller.cc b/third_party/blink/renderer/core/page/autoscroll_controller.cc
index 5a78858..944df4f5 100644
--- a/third_party/blink/renderer/core/page/autoscroll_controller.cc
+++ b/third_party/blink/renderer/core/page/autoscroll_controller.cc
@@ -78,7 +78,7 @@
 }
 
 AutoscrollController* AutoscrollController::Create(Page& page) {
-  return new AutoscrollController(page);
+  return MakeGarbageCollected<AutoscrollController>(page);
 }
 
 AutoscrollController::AutoscrollController(Page& page) : page_(&page) {}
diff --git a/third_party/blink/renderer/core/page/autoscroll_controller.h b/third_party/blink/renderer/core/page/autoscroll_controller.h
index d41461ae..356bb8e 100644
--- a/third_party/blink/renderer/core/page/autoscroll_controller.h
+++ b/third_party/blink/renderer/core/page/autoscroll_controller.h
@@ -67,6 +67,9 @@
     : public GarbageCollected<AutoscrollController> {
  public:
   static AutoscrollController* Create(Page&);
+
+  explicit AutoscrollController(Page&);
+
   void Trace(blink::Visitor*);
 
   // Selection and drag-and-drop autoscroll.
@@ -96,8 +99,6 @@
   bool MiddleClickAutoscrollInProgress() const;
 
  private:
-  explicit AutoscrollController(Page&);
-
   // For test.
   bool IsAutoscrolling() const;
 
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index c7b9280c..8dcb14c 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -157,7 +157,7 @@
 }
 
 ChromeClientImpl* ChromeClientImpl::Create(WebViewImpl* web_view) {
-  return new ChromeClientImpl(web_view);
+  return MakeGarbageCollected<ChromeClientImpl>(web_view);
 }
 
 void ChromeClientImpl::Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.h b/third_party/blink/renderer/core/page/chrome_client_impl.h
index 56efb15..3260c37 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.h
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.h
@@ -51,6 +51,7 @@
 class CORE_EXPORT ChromeClientImpl final : public ChromeClient {
  public:
   static ChromeClientImpl* Create(WebViewImpl*);
+  explicit ChromeClientImpl(WebViewImpl*);
   ~ChromeClientImpl() override;
   void Trace(Visitor* visitor) override;
 
@@ -237,8 +238,6 @@
                      base::OnceCallback<void(bool)>) override;
 
  private:
-  explicit ChromeClientImpl(WebViewImpl*);
-
   bool IsChromeClientImpl() const override { return true; }
 
   void SetCursor(const WebCursorInfo&, LocalFrame*);
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc
index 62b59a9..d3b2766 100644
--- a/third_party/blink/renderer/core/page/context_menu_controller.cc
+++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
@@ -73,7 +73,7 @@
 ContextMenuController::~ContextMenuController() = default;
 
 ContextMenuController* ContextMenuController::Create(Page* page) {
-  return new ContextMenuController(page);
+  return MakeGarbageCollected<ContextMenuController>(page);
 }
 
 void ContextMenuController::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.h b/third_party/blink/renderer/core/page/context_menu_controller.h
index 9e46df98..702167d 100644
--- a/third_party/blink/renderer/core/page/context_menu_controller.h
+++ b/third_party/blink/renderer/core/page/context_menu_controller.h
@@ -47,6 +47,8 @@
     : public GarbageCollectedFinalized<ContextMenuController> {
  public:
   static ContextMenuController* Create(Page*);
+
+  explicit ContextMenuController(Page*);
   ~ContextMenuController();
   void Trace(blink::Visitor*);
 
@@ -67,8 +69,6 @@
  private:
   friend class ContextMenuControllerTest;
 
-  explicit ContextMenuController(Page*);
-
   // Returns whether a Context Menu was actually shown.
   bool ShowContextMenu(LocalFrame*, const LayoutPoint&, WebMenuSourceType);
   bool ShouldShowContextMenuFromTouch(const WebContextMenuData&);
diff --git a/third_party/blink/renderer/core/page/drag_controller_test.cc b/third_party/blink/renderer/core/page/drag_controller_test.cc
index 9f2215d..0d717e2 100644
--- a/third_party/blink/renderer/core/page/drag_controller_test.cc
+++ b/third_party/blink/renderer/core/page/drag_controller_test.cc
@@ -46,7 +46,7 @@
   DragControllerTest()
       : RenderingTest(SingleChildLocalFrameClient::Create()),
 
-        chrome_client_(new DragMockChromeClient) {}
+        chrome_client_(MakeGarbageCollected<DragMockChromeClient>()) {}
   LocalFrame& GetFrame() const { return *GetDocument().GetFrame(); }
   DragMockChromeClient& GetChromeClient() const override {
     return *chrome_client_;
diff --git a/third_party/blink/renderer/core/page/focus_controller.cc b/third_party/blink/renderer/core/page/focus_controller.cc
index 94b7a200..d325516b 100644
--- a/third_party/blink/renderer/core/page/focus_controller.cc
+++ b/third_party/blink/renderer/core/page/focus_controller.cc
@@ -232,17 +232,19 @@
     : current_(current) {
   if (HTMLSlotElement* slot = ToHTMLSlotElementOrNull(scoping_root_node)) {
     if (slot->AssignedNodes().IsEmpty()) {
-      navigation_ = new FocusNavigation(scoping_root_node, *slot, owner_map);
+      navigation_ = MakeGarbageCollected<FocusNavigation>(scoping_root_node,
+                                                          *slot, owner_map);
     } else {
       // Here, slot->AssignedNodes() are non null, so the slot must be inside
       // the shadow tree.
       DCHECK(scoping_root_node.ContainingShadowRoot());
-      navigation_ =
-          new FocusNavigation(scoping_root_node.ContainingShadowRoot()->host(),
-                              ToHTMLSlotElement(scoping_root_node), owner_map);
+      navigation_ = MakeGarbageCollected<FocusNavigation>(
+          scoping_root_node.ContainingShadowRoot()->host(),
+          ToHTMLSlotElement(scoping_root_node), owner_map);
     }
   } else {
-    navigation_ = new FocusNavigation(scoping_root_node, owner_map);
+    navigation_ =
+        MakeGarbageCollected<FocusNavigation>(scoping_root_node, owner_map);
   }
   DCHECK(navigation_);
 }
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc
index bee3dcd..ea1c898 100644
--- a/third_party/blink/renderer/core/page/page.cc
+++ b/third_party/blink/renderer/core/page/page.cc
@@ -161,7 +161,7 @@
       page_scale_constraints_set_(PageScaleConstraintsSet::Create(this)),
       pointer_lock_controller_(PointerLockController::Create(this)),
       browser_controls_(BrowserControls::Create(*this)),
-      console_message_storage_(new ConsoleMessageStorage()),
+      console_message_storage_(MakeGarbageCollected<ConsoleMessageStorage>()),
       global_root_scroller_controller_(
           TopDocumentRootScrollerController::Create(*this)),
       visual_viewport_(VisualViewport::Create(*this)),
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_test.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_test.cc
index 7e7b3bb..4483e294 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_test.cc
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_test.cc
@@ -1090,7 +1090,8 @@
   EXPECT_TRUE(region.IsEmpty());
 
   // Adding a blocking window event handler should create a touch action region.
-  auto* listener = new ScrollingCoordinatorMockEventListener();
+  auto* listener =
+      MakeGarbageCollected<ScrollingCoordinatorMockEventListener>();
   AddEventListenerOptionsResolved* resolved_options =
       AddEventListenerOptionsResolved::Create();
   resolved_options->setPassive(false);
diff --git a/third_party/blink/renderer/core/page/touch_adjustment_test.cc b/third_party/blink/renderer/core/page/touch_adjustment_test.cc
index e7bf601..c12c96c5 100644
--- a/third_party/blink/renderer/core/page/touch_adjustment_test.cc
+++ b/third_party/blink/renderer/core/page/touch_adjustment_test.cc
@@ -32,7 +32,7 @@
  protected:
   TouchAdjustmentTest()
       : RenderingTest(SingleChildLocalFrameClient::Create()),
-        chrome_client_(new MockChromeClient) {}
+        chrome_client_(MakeGarbageCollected<MockChromeClient>()) {}
 
   LocalFrame& GetFrame() const { return *GetDocument().GetFrame(); }
 
diff --git a/third_party/blink/renderer/core/paint/block_painter_test.cc b/third_party/blink/renderer/core/paint/block_painter_test.cc
index 180c207..125e96e 100644
--- a/third_party/blink/renderer/core/paint/block_painter_test.cc
+++ b/third_party/blink/renderer/core/paint/block_painter_test.cc
@@ -511,7 +511,8 @@
 
   // Add an event listener to parent and ensure that hit test display items are
   // created for both the parent and child.
-  BlockPainterMockEventListener* callback = new BlockPainterMockEventListener();
+  BlockPainterMockEventListener* callback =
+      MakeGarbageCollected<BlockPainterMockEventListener>();
   auto* parent_element = GetElementById("parent");
   parent_element->addEventListener(event_type_names::kTouchstart, callback);
   UpdateAllLifecyclePhasesForTest();
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
index 40dbf39..bc5808d 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
@@ -94,9 +94,6 @@
       !style.SubtreeWillChangeContents())
     reasons |= CompositingReason::kWillChangeCompositingHint;
 
-  if (style.HasInlineTransform())
-    reasons |= CompositingReason::kInlineTransform;
-
   if (style.UsedTransformStyle3D() == ETransformStyle3D::kPreserve3d)
     reasons |= CompositingReason::kPreserve3DWith3DDescendants;
 
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater.cc b/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater.cc
index 09ebf35..1fa0a14 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater.cc
@@ -608,11 +608,6 @@
       will_be_composited_or_squashed = true;
     }
 
-    if (will_be_composited_or_squashed) {
-      reasons_to_composite |= layer->PotentialCompositingReasonsFromStyle() &
-                              CompositingReason::kInlineTransform;
-    }
-
     if (will_be_composited_or_squashed &&
         layer->GetLayoutObject().StyleRef().HasBlendMode()) {
       current_recursion_data.has_unisolated_composited_blending_descendant_ =
@@ -631,12 +626,9 @@
     bool is_composited_clipping_layer =
         can_be_composited && (reasons_to_composite &
                               CompositingReason::kClipsCompositingDescendants);
-    bool is_composited_with_inline_transform =
-        reasons_to_composite & CompositingReason::kInlineTransform;
     if ((!child_recursion_data.testing_overlap_ &&
          !is_composited_clipping_layer) ||
-        layer->GetLayoutObject().StyleRef().HasCurrentTransformAnimation() ||
-        is_composited_with_inline_transform)
+        layer->GetLayoutObject().StyleRef().HasCurrentTransformAnimation())
       current_recursion_data.testing_overlap_ = false;
 
     if (child_recursion_data.compositing_ancestor_ == layer)
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater_test.cc b/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater_test.cc
index 9c1a539..5d3bedb3 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater_test.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_requirements_updater_test.cc
@@ -77,33 +77,6 @@
 }
 
 TEST_F(CompositingRequirementsUpdaterTest,
-       NoAssumedOverlapReasonForNonSelfPaintingLayer) {
-  SetBodyInnerHTML(R"HTML(
-    <style>
-      #target {
-       overflow: auto;
-       width: 100px;
-       height: 100px;
-     }
-    </style>
-    <div style="position: relative; width: 500px; height: 300px;
-        transform: translateZ(0)"></div>
-    <div id=target></div>
-  )HTML");
-
-  PaintLayer* target =
-      ToLayoutBoxModelObject(GetLayoutObjectByElementId("target"))->Layer();
-  EXPECT_FALSE(target->GetCompositingReasons());
-
-  // Now make |target| self-painting.
-  GetDocument().getElementById("target")->setAttribute(html_names::kStyleAttr,
-                                                       "position: relative");
-  UpdateAllLifecyclePhasesForTest();
-  EXPECT_EQ(CompositingReason::kAssumedOverlap,
-            target->GetCompositingReasons());
-}
-
-TEST_F(CompositingRequirementsUpdaterTest,
        NoDescendantReasonForNonSelfPaintingLayer) {
   SetBodyInnerHTML(R"HTML(
     <style>
diff --git a/third_party/blink/renderer/core/paint/html_canvas_painter_test.cc b/third_party/blink/renderer/core/paint/html_canvas_painter_test.cc
index 0e4681d..d114c05 100644
--- a/third_party/blink/renderer/core/paint/html_canvas_painter_test.cc
+++ b/third_party/blink/renderer/core/paint/html_canvas_painter_test.cc
@@ -31,7 +31,7 @@
 class HTMLCanvasPainterTestForSPv2 : public PaintControllerPaintTest {
  public:
   HTMLCanvasPainterTestForSPv2()
-      : chrome_client_(new StubChromeClientForSPv2) {}
+      : chrome_client_(MakeGarbageCollected<StubChromeClientForSPv2>()) {}
 
  protected:
   void SetUp() override {
diff --git a/third_party/blink/renderer/core/paint/paint_and_raster_invalidation_test.cc b/third_party/blink/renderer/core/paint/paint_and_raster_invalidation_test.cc
index 96048ab..a45c697 100644
--- a/third_party/blink/renderer/core/paint/paint_and_raster_invalidation_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_and_raster_invalidation_test.cc
@@ -1055,7 +1055,7 @@
  public:
   PaintInvalidatorCustomClientTest()
       : RenderingTest(EmptyLocalFrameClient::Create()),
-        chrome_client_(new PaintInvalidatorTestClient) {}
+        chrome_client_(MakeGarbageCollected<PaintInvalidatorTestClient>()) {}
 
   PaintInvalidatorTestClient& GetChromeClient() const override {
     return *chrome_client_;
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index 972ea3d7..90810d0 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -3064,15 +3064,8 @@
   if (!rare_data_ || !rare_data_->composited_layer_mapping)
     return false;
 
-  // To cut off almost all the work in the compositing update for
-  // this case, we treat inline transforms has having assumed overlap
-  // (similar to how we treat animated transforms). Notice that we read
-  // CompositingReasonInlineTransform from the m_compositingReasons, which
-  // means that the inline transform actually triggered assumed overlap in
-  // the overlap map.
-  if (diff.TransformChanged() &&
-      (!rare_data_ || !(rare_data_->compositing_reasons &
-                        CompositingReason::kInlineTransform)))
+  // If a transform changed, we can't use the fast path.
+  if (diff.TransformChanged())
     return false;
 
   // We composite transparent Layers differently from non-transparent
diff --git a/third_party/blink/renderer/core/paint/paint_layer_clipper.cc b/third_party/blink/renderer/core/paint/paint_layer_clipper.cc
index 42311bd..5c2b826 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_clipper.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_clipper.cc
@@ -281,12 +281,16 @@
     layer_bounds.SetLocation(*offset_from_root);
   } else {
     layer_bounds.SetLocation(LayoutPoint(context.sub_pixel_accumulation));
-    layer_bounds.MoveBy(fragment_data.PaintOffset());
-    GeometryMapper::SourceToDestinationRect(
-        fragment_data.PreTransform(),
-        context.root_fragment->LocalBorderBoxProperties().Transform(),
-        layer_bounds);
-    layer_bounds.MoveBy(-context.root_fragment->PaintOffset());
+    if (&layer_ == context.root_layer) {
+      DCHECK_EQ(&fragment_data, context.root_fragment);
+    } else {
+      layer_bounds.MoveBy(fragment_data.PaintOffset());
+      GeometryMapper::SourceToDestinationRect(
+          fragment_data.PreTransform(),
+          context.root_fragment->LocalBorderBoxProperties().Transform(),
+          layer_bounds);
+      layer_bounds.MoveBy(-context.root_fragment->PaintOffset());
+    }
   }
 
   CalculateBackgroundClipRectWithGeometryMapper(
diff --git a/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc b/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc
index 341763c..31723b0 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc
@@ -877,10 +877,6 @@
   PaintLayer* parent_paint_layer =
       ToLayoutBoxModelObject(parent->GetLayoutObject())->Layer();
 
-  Element* child = GetDocument().getElementById("child");
-  PaintLayer* child_paint_layer =
-      ToLayoutBoxModelObject(child->GetLayoutObject())->Layer();
-
   ClipRectsContext context(
       parent_paint_layer,
       &parent_paint_layer->GetLayoutObject().FirstFragment(),
@@ -890,7 +886,7 @@
   ClipRect background_rect, foreground_rect;
   parent_paint_layer->Clipper(PaintLayer::kUseGeometryMapper)
       .CalculateRects(context,
-                      &child_paint_layer->GetLayoutObject().FirstFragment(),
+                      &parent_paint_layer->GetLayoutObject().FirstFragment(),
                       nullptr, layer_bounds, background_rect, foreground_rect);
 
   // Only the foreground is clipped by the scrollbar size, because we
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
index 5a3f1d6..20526ef 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
@@ -35,7 +35,8 @@
  public:
   PaintLayerScrollableAreaTestBase()
       : RenderingTest(EmptyLocalFrameClient::Create()),
-        chrome_client_(new ScrollableAreaMockChromeClient) {}
+        chrome_client_(MakeGarbageCollected<ScrollableAreaMockChromeClient>()) {
+  }
 
   ~PaintLayerScrollableAreaTestBase() override {
     testing::Mock::VerifyAndClearExpectations(&GetChromeClient());
diff --git a/third_party/blink/renderer/core/paint/paint_timing_detector.cc b/third_party/blink/renderer/core/paint/paint_timing_detector.cc
index 7b07edf..c5c6608 100644
--- a/third_party/blink/renderer/core/paint/paint_timing_detector.cc
+++ b/third_party/blink/renderer/core/paint/paint_timing_detector.cc
@@ -17,8 +17,10 @@
 
 PaintTimingDetector::PaintTimingDetector(LocalFrameView* frame_view)
     : frame_view_(frame_view),
-      text_paint_timing_detector_(new TextPaintTimingDetector(frame_view)),
-      image_paint_timing_detector_(new ImagePaintTimingDetector(frame_view)){};
+      text_paint_timing_detector_(
+          MakeGarbageCollected<TextPaintTimingDetector>(frame_view)),
+      image_paint_timing_detector_(
+          MakeGarbageCollected<ImagePaintTimingDetector>(frame_view)){};
 
 void PaintTimingDetector::NotifyPrePaintFinished() {
   text_paint_timing_detector_->OnPrePaintFinished();
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk_test.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk_test.cc
index 9e7fd97..c61fd6d 100644
--- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk_test.cc
+++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk_test.cc
@@ -344,7 +344,7 @@
   EXPECT_FALSE(descendant.InsideBlockingTouchEventHandler());
 
   PrePaintTreeWalkMockEventListener* callback =
-      new PrePaintTreeWalkMockEventListener();
+      MakeGarbageCollected<PrePaintTreeWalkMockEventListener>();
   auto* handler_element = GetDocument().getElementById("handler");
   handler_element->addEventListener(event_type_names::kTouchstart, callback);
 
diff --git a/third_party/blink/renderer/core/paint/video_painter_test.cc b/third_party/blink/renderer/core/paint/video_painter_test.cc
index 7a44540..6bb401f 100644
--- a/third_party/blink/renderer/core/paint/video_painter_test.cc
+++ b/third_party/blink/renderer/core/paint/video_painter_test.cc
@@ -63,8 +63,9 @@
  public:
   VideoPainterTestForSPv2()
       : ScopedSlimmingPaintV2ForTest(true),
-        PaintControllerPaintTestBase(new VideoStubLocalFrameClient),
-        chrome_client_(new StubChromeClientForSPv2) {}
+        PaintControllerPaintTestBase(
+            MakeGarbageCollected<VideoStubLocalFrameClient>()),
+        chrome_client_(MakeGarbageCollected<StubChromeClientForSPv2>()) {}
 
   void SetUp() override {
     PaintControllerPaintTestBase::SetUp();
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer_test.cc b/third_party/blink/renderer/core/resize_observer/resize_observer_test.cc
index 1c02202..74d5ac3 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observer_test.cc
+++ b/third_party/blink/renderer/core/resize_observer/resize_observer_test.cc
@@ -69,7 +69,7 @@
   main_resource.Finish();
 
   ResizeObserver::Delegate* delegate =
-      new TestResizeObserverDelegate(GetDocument());
+      MakeGarbageCollected<TestResizeObserverDelegate>(GetDocument());
   ResizeObserver* observer = ResizeObserver::Create(GetDocument(), delegate);
   Element* dom_target = GetDocument().getElementById("domTarget");
   Element* svg_target = GetDocument().getElementById("svgTarget");
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.cc b/third_party/blink/renderer/core/script/classic_pending_script.cc
index 8a92a60..5666783 100644
--- a/third_party/blink/renderer/core/script/classic_pending_script.cc
+++ b/third_party/blink/renderer/core/script/classic_pending_script.cc
@@ -41,9 +41,10 @@
   FetchParameters params = options.CreateFetchParameters(
       url, element_document.GetSecurityOrigin(), cross_origin, encoding, defer);
 
-  ClassicPendingScript* pending_script = new ClassicPendingScript(
-      element, TextPosition(), ScriptSourceLocationType::kExternalFile, options,
-      true /* is_external */);
+  ClassicPendingScript* pending_script =
+      MakeGarbageCollected<ClassicPendingScript>(
+          element, TextPosition(), ScriptSourceLocationType::kExternalFile,
+          options, true /* is_external */);
 
   // [Intervention]
   // For users on slow connections, we want to avoid blocking the parser in
@@ -72,8 +73,9 @@
     ScriptSourceLocationType source_location_type,
     const ScriptFetchOptions& options) {
   ClassicPendingScript* pending_script =
-      new ClassicPendingScript(element, starting_position, source_location_type,
-                               options, false /* is_external */);
+      MakeGarbageCollected<ClassicPendingScript>(element, starting_position,
+                                                 source_location_type, options,
+                                                 false /* is_external */);
   pending_script->CheckState();
   return pending_script;
 }
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.h b/third_party/blink/renderer/core/script/classic_pending_script.h
index 45faa0a0..95f30a10 100644
--- a/third_party/blink/renderer/core/script/classic_pending_script.h
+++ b/third_party/blink/renderer/core/script/classic_pending_script.h
@@ -47,6 +47,11 @@
                                             ScriptSourceLocationType,
                                             const ScriptFetchOptions&);
 
+  ClassicPendingScript(ScriptElementBase*,
+                       const TextPosition&,
+                       ScriptSourceLocationType,
+                       const ScriptFetchOptions&,
+                       bool is_external);
   ~ClassicPendingScript() override;
 
   // ScriptStreamer callbacks.
@@ -84,11 +89,6 @@
     kErrorOccurred,
   };
 
-  ClassicPendingScript(ScriptElementBase*,
-                       const TextPosition&,
-                       ScriptSourceLocationType,
-                       const ScriptFetchOptions&,
-                       bool is_external);
   ClassicPendingScript() = delete;
 
   // Advances the current state of the script, reporting to the client if
diff --git a/third_party/blink/renderer/core/script/classic_script.h b/third_party/blink/renderer/core/script/classic_script.h
index b645f6bf..25e5e43 100644
--- a/third_party/blink/renderer/core/script/classic_script.h
+++ b/third_party/blink/renderer/core/script/classic_script.h
@@ -20,17 +20,10 @@
                                const KURL& base_url,
                                const ScriptFetchOptions& fetch_options,
                                SanitizeScriptErrors sanitize_script_errors) {
-    return new ClassicScript(script_source_code, base_url, fetch_options,
-                             sanitize_script_errors);
+    return MakeGarbageCollected<ClassicScript>(
+        script_source_code, base_url, fetch_options, sanitize_script_errors);
   }
 
-  void Trace(blink::Visitor*) override;
-
-  const ScriptSourceCode& GetScriptSourceCode() const {
-    return script_source_code_;
-  }
-
- private:
   ClassicScript(const ScriptSourceCode& script_source_code,
                 const KURL& base_url,
                 const ScriptFetchOptions& fetch_options,
@@ -39,6 +32,13 @@
         script_source_code_(script_source_code),
         sanitize_script_errors_(sanitize_script_errors) {}
 
+  void Trace(blink::Visitor*) override;
+
+  const ScriptSourceCode& GetScriptSourceCode() const {
+    return script_source_code_;
+  }
+
+ private:
   mojom::ScriptType GetScriptType() const override {
     return mojom::ScriptType::kClassic;
   }
diff --git a/third_party/blink/renderer/core/script/document_write_intervention.cc b/third_party/blink/renderer/core/script/document_write_intervention.cc
index ed287c4..2889697 100644
--- a/third_party/blink/renderer/core/script/document_write_intervention.cc
+++ b/third_party/blink/renderer/core/script/document_write_intervention.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/renderer/core/script/document_write_intervention.h"
 
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_effective_connection_type.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver.cc b/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
index f7353d1..b7cbc9e9 100644
--- a/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
+++ b/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
@@ -25,17 +25,18 @@
       const KURL& url,
       Modulator* modulator,
       ScriptPromiseResolver* promise_resolver) {
-    return new DynamicImportTreeClient(url, modulator, promise_resolver);
+    return MakeGarbageCollected<DynamicImportTreeClient>(url, modulator,
+                                                         promise_resolver);
   }
 
-  void Trace(blink::Visitor*) override;
-
- private:
   DynamicImportTreeClient(const KURL& url,
                           Modulator* modulator,
                           ScriptPromiseResolver* promise_resolver)
       : url_(url), modulator_(modulator), promise_resolver_(promise_resolver) {}
 
+  void Trace(blink::Visitor*) override;
+
+ private:
   // Implements ModuleTreeClient:
   void NotifyModuleTreeLoadFinished(ModuleScript*) final;
 
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc b/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
index 46f8641..a2cea08c 100644
--- a/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
+++ b/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
@@ -182,14 +182,15 @@
 class DynamicModuleResolverTestNotReached final : public ScriptFunction {
  public:
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) {
-    auto* not_reached = new DynamicModuleResolverTestNotReached(script_state);
+    auto* not_reached =
+        MakeGarbageCollected<DynamicModuleResolverTestNotReached>(script_state);
     return not_reached->BindToV8Function();
   }
 
- private:
   explicit DynamicModuleResolverTestNotReached(ScriptState* script_state)
       : ScriptFunction(script_state) {}
 
+ private:
   ScriptValue Call(ScriptValue) override {
     ADD_FAILURE();
     return ScriptValue();
@@ -200,16 +201,16 @@
 
 TEST(DynamicModuleResolverTest, ResolveSuccess) {
   V8TestingScope scope;
-  auto* modulator =
-      new DynamicModuleResolverTestModulator(scope.GetScriptState());
+  auto* modulator = MakeGarbageCollected<DynamicModuleResolverTestModulator>(
+      scope.GetScriptState());
   modulator->SetExpectedFetchTreeURL(TestDependencyURL());
 
   auto* promise_resolver =
       ScriptPromiseResolver::Create(scope.GetScriptState());
   ScriptPromise promise = promise_resolver->Promise();
 
-  auto* capture =
-      new CaptureExportedStringFunction(scope.GetScriptState(), "foo");
+  auto* capture = MakeGarbageCollected<CaptureExportedStringFunction>(
+      scope.GetScriptState(), "foo");
   promise.Then(capture->Bind(),
                DynamicModuleResolverTestNotReached::CreateFunction(
                    scope.GetScriptState()));
@@ -237,15 +238,16 @@
 
 TEST(DynamicModuleResolverTest, ResolveSpecifierFailure) {
   V8TestingScope scope;
-  auto* modulator =
-      new DynamicModuleResolverTestModulator(scope.GetScriptState());
+  auto* modulator = MakeGarbageCollected<DynamicModuleResolverTestModulator>(
+      scope.GetScriptState());
   modulator->SetExpectedFetchTreeURL(TestDependencyURL());
 
   auto* promise_resolver =
       ScriptPromiseResolver::Create(scope.GetScriptState());
   ScriptPromise promise = promise_resolver->Promise();
 
-  auto* capture = new CaptureErrorFunction(scope.GetScriptState());
+  auto* capture =
+      MakeGarbageCollected<CaptureErrorFunction>(scope.GetScriptState());
   promise.Then(DynamicModuleResolverTestNotReached::CreateFunction(
                    scope.GetScriptState()),
                capture->Bind());
@@ -262,15 +264,16 @@
 
 TEST(DynamicModuleResolverTest, FetchFailure) {
   V8TestingScope scope;
-  auto* modulator =
-      new DynamicModuleResolverTestModulator(scope.GetScriptState());
+  auto* modulator = MakeGarbageCollected<DynamicModuleResolverTestModulator>(
+      scope.GetScriptState());
   modulator->SetExpectedFetchTreeURL(TestDependencyURL());
 
   auto* promise_resolver =
       ScriptPromiseResolver::Create(scope.GetScriptState());
   ScriptPromise promise = promise_resolver->Promise();
 
-  auto* capture = new CaptureErrorFunction(scope.GetScriptState());
+  auto* capture =
+      MakeGarbageCollected<CaptureErrorFunction>(scope.GetScriptState());
   promise.Then(DynamicModuleResolverTestNotReached::CreateFunction(
                    scope.GetScriptState()),
                capture->Bind());
@@ -291,15 +294,16 @@
 
 TEST(DynamicModuleResolverTest, ExceptionThrown) {
   V8TestingScope scope;
-  auto* modulator =
-      new DynamicModuleResolverTestModulator(scope.GetScriptState());
+  auto* modulator = MakeGarbageCollected<DynamicModuleResolverTestModulator>(
+      scope.GetScriptState());
   modulator->SetExpectedFetchTreeURL(TestDependencyURL());
 
   auto* promise_resolver =
       ScriptPromiseResolver::Create(scope.GetScriptState());
   ScriptPromise promise = promise_resolver->Promise();
 
-  auto* capture = new CaptureErrorFunction(scope.GetScriptState());
+  auto* capture =
+      MakeGarbageCollected<CaptureErrorFunction>(scope.GetScriptState());
   promise.Then(DynamicModuleResolverTestNotReached::CreateFunction(
                    scope.GetScriptState()),
                capture->Bind());
@@ -329,16 +333,16 @@
   V8TestingScope scope;
   scope.GetDocument().SetURL(KURL("https://example.com"));
 
-  auto* modulator =
-      new DynamicModuleResolverTestModulator(scope.GetScriptState());
+  auto* modulator = MakeGarbageCollected<DynamicModuleResolverTestModulator>(
+      scope.GetScriptState());
   modulator->SetExpectedFetchTreeURL(TestDependencyURL());
 
   auto* promise_resolver =
       ScriptPromiseResolver::Create(scope.GetScriptState());
   ScriptPromise promise = promise_resolver->Promise();
 
-  auto* capture =
-      new CaptureExportedStringFunction(scope.GetScriptState(), "foo");
+  auto* capture = MakeGarbageCollected<CaptureExportedStringFunction>(
+      scope.GetScriptState(), "foo");
   promise.Then(capture->Bind(),
                DynamicModuleResolverTestNotReached::CreateFunction(
                    scope.GetScriptState()));
@@ -368,8 +372,8 @@
   V8TestingScope scope;
   scope.GetDocument().SetURL(KURL("https://example.com"));
 
-  auto* modulator =
-      new DynamicModuleResolverTestModulator(scope.GetScriptState());
+  auto* modulator = MakeGarbageCollected<DynamicModuleResolverTestModulator>(
+      scope.GetScriptState());
   modulator->SetExpectedFetchTreeURL(
       KURL("https://example.com/correct/dependency.js"));
 
diff --git a/third_party/blink/renderer/core/script/mock_script_element_base.h b/third_party/blink/renderer/core/script/mock_script_element_base.h
index 27a94b1..8259bc4 100644
--- a/third_party/blink/renderer/core/script/mock_script_element_base.h
+++ b/third_party/blink/renderer/core/script/mock_script_element_base.h
@@ -19,7 +19,7 @@
 
  public:
   static MockScriptElementBase* Create() {
-    return new testing::StrictMock<MockScriptElementBase>();
+    return MakeGarbageCollected<testing::StrictMock<MockScriptElementBase>>();
   }
   virtual ~MockScriptElementBase() {}
 
diff --git a/third_party/blink/renderer/core/script/module_map_test.cc b/third_party/blink/renderer/core/script/module_map_test.cc
index 6b5f005..c4423be8 100644
--- a/third_party/blink/renderer/core/script/module_map_test.cc
+++ b/third_party/blink/renderer/core/script/module_map_test.cc
@@ -163,7 +163,8 @@
 };
 
 ModuleMapTestModulator::ModuleMapTestModulator(ScriptState* script_state)
-    : script_state_(script_state), resolver_(new TestScriptModuleResolver) {}
+    : script_state_(script_state),
+      resolver_(MakeGarbageCollected<TestScriptModuleResolver>()) {}
 
 void ModuleMapTestModulator::Trace(blink::Visitor* visitor) {
   visitor->Trace(test_requests_);
@@ -212,7 +213,8 @@
       GetDocument().CreateFetchClientSettingsObjectSnapshot();
 
   // First request
-  TestSingleModuleClient* client = new TestSingleModuleClient;
+  TestSingleModuleClient* client =
+      MakeGarbageCollected<TestSingleModuleClient>();
   Map()->FetchSingleModuleScript(ModuleScriptFetchRequest::CreateForTest(url),
                                  settings_object,
                                  ModuleGraphLevel::kTopLevelModuleFetch,
@@ -230,7 +232,8 @@
   EXPECT_TRUE(client->GetModuleScript());
 
   // Secondary request
-  TestSingleModuleClient* client2 = new TestSingleModuleClient;
+  TestSingleModuleClient* client2 =
+      MakeGarbageCollected<TestSingleModuleClient>();
   Map()->FetchSingleModuleScript(ModuleScriptFetchRequest::CreateForTest(url),
                                  settings_object,
                                  ModuleGraphLevel::kTopLevelModuleFetch,
@@ -259,14 +262,16 @@
       GetDocument().CreateFetchClientSettingsObjectSnapshot();
 
   // First request
-  TestSingleModuleClient* client = new TestSingleModuleClient;
+  TestSingleModuleClient* client =
+      MakeGarbageCollected<TestSingleModuleClient>();
   Map()->FetchSingleModuleScript(ModuleScriptFetchRequest::CreateForTest(url),
                                  settings_object,
                                  ModuleGraphLevel::kTopLevelModuleFetch,
                                  ModuleScriptCustomFetchType::kNone, client);
 
   // Secondary request (which should join the first request)
-  TestSingleModuleClient* client2 = new TestSingleModuleClient;
+  TestSingleModuleClient* client2 =
+      MakeGarbageCollected<TestSingleModuleClient>();
   Map()->FetchSingleModuleScript(ModuleScriptFetchRequest::CreateForTest(url),
                                  settings_object,
                                  ModuleGraphLevel::kTopLevelModuleFetch,
diff --git a/third_party/blink/renderer/core/script/script_module_resolver_impl_test.cc b/third_party/blink/renderer/core/script/script_module_resolver_impl_test.cc
index 9fbfae7..5cc43ce7 100644
--- a/third_party/blink/renderer/core/script/script_module_resolver_impl_test.cc
+++ b/third_party/blink/renderer/core/script/script_module_resolver_impl_test.cc
@@ -120,7 +120,7 @@
 
 void ScriptModuleResolverImplTest::SetUp() {
   platform_->AdvanceClockSeconds(1.);  // For non-zero DocumentParserTimings
-  modulator_ = new ScriptModuleResolverImplTestModulator();
+  modulator_ = MakeGarbageCollected<ScriptModuleResolverImplTestModulator>();
 }
 
 TEST_F(ScriptModuleResolverImplTest, RegisterResolveSuccess) {
diff --git a/third_party/blink/renderer/core/scroll/scroll_animator.cc b/third_party/blink/renderer/core/scroll/scroll_animator.cc
index 45f9cff..fb8b13a 100644
--- a/third_party/blink/renderer/core/scroll/scroll_animator.cc
+++ b/third_party/blink/renderer/core/scroll/scroll_animator.cc
@@ -56,7 +56,7 @@
 ScrollAnimatorBase* ScrollAnimatorBase::Create(
     ScrollableArea* scrollable_area) {
   if (scrollable_area && scrollable_area->ScrollAnimatorEnabled())
-    return new ScrollAnimator(scrollable_area);
+    return MakeGarbageCollected<ScrollAnimator>(scrollable_area);
   return MakeGarbageCollected<ScrollAnimatorBase>(scrollable_area);
 }
 
diff --git a/third_party/blink/renderer/core/scroll/scroll_animator_mac.mm b/third_party/blink/renderer/core/scroll/scroll_animator_mac.mm
index d330dd85..5a349fe2 100644
--- a/third_party/blink/renderer/core/scroll/scroll_animator_mac.mm
+++ b/third_party/blink/renderer/core/scroll/scroll_animator_mac.mm
@@ -685,7 +685,7 @@
 
 ScrollAnimatorBase* ScrollAnimatorBase::Create(
     blink::ScrollableArea* scrollable_area) {
-  return new ScrollAnimatorMac(scrollable_area);
+  return MakeGarbageCollected<ScrollAnimatorMac>(scrollable_area);
 }
 
 ScrollAnimatorMac::ScrollAnimatorMac(blink::ScrollableArea* scrollable_area)
diff --git a/third_party/blink/renderer/core/scroll/scroll_animator_test.cc b/third_party/blink/renderer/core/scroll/scroll_animator_test.cc
index cf548b4..fd53856 100644
--- a/third_party/blink/renderer/core/scroll/scroll_animator_test.cc
+++ b/third_party/blink/renderer/core/scroll/scroll_animator_test.cc
@@ -195,7 +195,7 @@
       MockScrollableAreaForAnimatorTest::Create(true, ScrollOffset(),
                                                 ScrollOffset(1000, 1000));
   ScrollAnimator* scroll_animator =
-      new ScrollAnimator(scrollable_area, GetMockedTime);
+      MakeGarbageCollected<ScrollAnimator>(scrollable_area, GetMockedTime);
 
   EXPECT_CALL(*scrollable_area, UpdateScrollOffset(_, _)).Times(2);
   // Once from userScroll, once from updateCompositorAnimations.
@@ -249,7 +249,7 @@
       MockScrollableAreaForAnimatorTest::Create(true, ScrollOffset(),
                                                 ScrollOffset(1000, 1000));
   ScrollAnimator* scroll_animator =
-      new ScrollAnimator(scrollable_area, GetMockedTime);
+      MakeGarbageCollected<ScrollAnimator>(scrollable_area, GetMockedTime);
 
   EXPECT_CALL(*scrollable_area, UpdateScrollOffset(_, _)).Times(9);
   EXPECT_CALL(*scrollable_area, RegisterForAnimation()).Times(6);
@@ -329,7 +329,7 @@
       MockScrollableAreaForAnimatorTest::Create(true, ScrollOffset(),
                                                 ScrollOffset(1000, 1000));
   ScrollAnimator* scroll_animator =
-      new ScrollAnimator(scrollable_area, GetMockedTime);
+      MakeGarbageCollected<ScrollAnimator>(scrollable_area, GetMockedTime);
 
   EXPECT_CALL(*scrollable_area, UpdateScrollOffset(_, _)).Times(3);
   EXPECT_CALL(*scrollable_area, RegisterForAnimation()).Times(2);
@@ -429,7 +429,7 @@
       MockScrollableAreaForAnimatorTest::Create(false, ScrollOffset(),
                                                 ScrollOffset(1000, 1000));
   ScrollAnimator* scroll_animator =
-      new ScrollAnimator(scrollable_area, GetMockedTime);
+      MakeGarbageCollected<ScrollAnimator>(scrollable_area, GetMockedTime);
 
   EXPECT_CALL(*scrollable_area, UpdateScrollOffset(_, _)).Times(8);
   EXPECT_CALL(*scrollable_area, RegisterForAnimation()).Times(0);
@@ -462,7 +462,7 @@
       MockScrollableAreaForAnimatorTest::Create(true, ScrollOffset(),
                                                 ScrollOffset(1000, 1000));
   ScrollAnimator* scroll_animator =
-      new ScrollAnimator(scrollable_area, GetMockedTime);
+      MakeGarbageCollected<ScrollAnimator>(scrollable_area, GetMockedTime);
 
   // Called from first userScroll, setCurrentOffset, and second userScroll.
   EXPECT_CALL(*scrollable_area, UpdateScrollOffset(_, _)).Times(3);
@@ -645,7 +645,8 @@
   MockScrollableAreaForAnimatorTest* scrollable_area =
       MockScrollableAreaForAnimatorTest::Create(true, ScrollOffset(-100, -100),
                                                 ScrollOffset(1000, 1000));
-  ScrollAnimator* animator = new ScrollAnimator(scrollable_area, GetMockedTime);
+  ScrollAnimator* animator =
+      MakeGarbageCollected<ScrollAnimator>(scrollable_area, GetMockedTime);
   scrollable_area->SetScrollAnimator(animator);
 
   // Twice from tickAnimation, once from reset, and twice from
diff --git a/third_party/blink/renderer/core/streams/readable_stream_operations_test.cc b/third_party/blink/renderer/core/streams/readable_stream_operations_test.cc
index 8ad8e81b..df270612 100644
--- a/third_party/blink/renderer/core/streams/readable_stream_operations_test.cc
+++ b/third_party/blink/renderer/core/streams/readable_stream_operations_test.cc
@@ -34,14 +34,15 @@
  public:
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) {
     ReadableStreamOperationsTestNotReached* self =
-        new ReadableStreamOperationsTestNotReached(script_state);
+        MakeGarbageCollected<ReadableStreamOperationsTestNotReached>(
+            script_state);
     return self->BindToV8Function();
   }
 
- private:
   explicit ReadableStreamOperationsTestNotReached(ScriptState* script_state)
       : ScriptFunction(script_state) {}
 
+ private:
   ScriptValue Call(ScriptValue) override;
 };
 
@@ -88,19 +89,20 @@
  public:
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
                                                 Iteration* iteration) {
-    ReaderFunction* self = new ReaderFunction(script_state, iteration);
+    ReaderFunction* self =
+        MakeGarbageCollected<ReaderFunction>(script_state, iteration);
     return self->BindToV8Function();
   }
 
+  ReaderFunction(ScriptState* script_state, Iteration* iteration)
+      : ScriptFunction(script_state), iteration_(iteration) {}
+
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(iteration_);
     ScriptFunction::Trace(visitor);
   }
 
  private:
-  ReaderFunction(ScriptState* script_state, Iteration* iteration)
-      : ScriptFunction(script_state), iteration_(iteration) {}
-
   ScriptValue Call(ScriptValue value) override {
     iteration_->Set(value);
     return value;
@@ -244,8 +246,8 @@
                   scope.GetScriptState(), reader, ASSERT_NO_EXCEPTION)
                   .value_or(false));
 
-  Iteration* it1 = new Iteration();
-  Iteration* it2 = new Iteration();
+  Iteration* it1 = MakeGarbageCollected<Iteration>();
+  Iteration* it2 = MakeGarbageCollected<Iteration>();
   ReadableStreamOperations::DefaultReaderRead(scope.GetScriptState(), reader)
       .Then(ReaderFunction::CreateFunction(scope.GetScriptState(), it1),
             ReadableStreamOperationsTestNotReached::CreateFunction(
@@ -283,7 +285,8 @@
      CreateReadableStreamWithCustomUnderlyingSourceAndStrategy) {
   V8TestingScope scope;
   TryCatchScope try_catch_scope(scope.GetIsolate());
-  auto* underlying_source = new TestUnderlyingSource(scope.GetScriptState());
+  auto* underlying_source =
+      MakeGarbageCollected<TestUnderlyingSource>(scope.GetScriptState());
 
   ScriptValue strategy = ReadableStreamOperations::CreateCountQueuingStrategy(
       scope.GetScriptState(), 10);
@@ -306,9 +309,9 @@
                                                ASSERT_NO_EXCEPTION);
   ASSERT_FALSE(reader.IsEmpty());
 
-  Iteration* it1 = new Iteration();
-  Iteration* it2 = new Iteration();
-  Iteration* it3 = new Iteration();
+  Iteration* it1 = MakeGarbageCollected<Iteration>();
+  Iteration* it2 = MakeGarbageCollected<Iteration>();
+  Iteration* it3 = MakeGarbageCollected<Iteration>();
   ReadableStreamOperations::DefaultReaderRead(scope.GetScriptState(), reader)
       .Then(ReaderFunction::CreateFunction(scope.GetScriptState(), it1),
             ReadableStreamOperationsTestNotReached::CreateFunction(
@@ -350,7 +353,8 @@
      UnderlyingSourceShouldHavePendingActivityWhenLockedAndControllerIsActive) {
   V8TestingScope scope;
   TryCatchScope try_catch_scope(scope.GetIsolate());
-  auto* underlying_source = new TestUnderlyingSource(scope.GetScriptState());
+  auto* underlying_source =
+      MakeGarbageCollected<TestUnderlyingSource>(scope.GetScriptState());
 
   ScriptValue strategy = ReadableStreamOperations::CreateCountQueuingStrategy(
       scope.GetScriptState(), 10);
@@ -545,8 +549,8 @@
   ASSERT_FALSE(reader1.IsEmpty());
   ASSERT_FALSE(reader2.IsEmpty());
 
-  Iteration* it1 = new Iteration();
-  Iteration* it2 = new Iteration();
+  Iteration* it1 = MakeGarbageCollected<Iteration>();
+  Iteration* it2 = MakeGarbageCollected<Iteration>();
   ReadableStreamOperations::DefaultReaderRead(scope.GetScriptState(), reader1)
       .Then(ReaderFunction::CreateFunction(scope.GetScriptState(), it1),
             ReadableStreamOperationsTestNotReached::CreateFunction(
@@ -600,7 +604,7 @@
   ScriptValue reader = ReadableStreamOperations::GetReader(
       scope.GetScriptState(), transferred, ASSERT_NO_EXCEPTION);
   ASSERT_FALSE(reader.IsEmpty());
-  Iteration* it = new Iteration();
+  Iteration* it = MakeGarbageCollected<Iteration>();
   ReadableStreamOperations::DefaultReaderRead(scope.GetScriptState(), reader)
       .Then(ReaderFunction::CreateFunction(scope.GetScriptState(), it),
             ReadableStreamOperationsTestNotReached::CreateFunction(
diff --git a/third_party/blink/renderer/core/streams/transform_stream.cc b/third_party/blink/renderer/core/streams/transform_stream.cc
index 0668211..848310d 100644
--- a/third_party/blink/renderer/core/streams/transform_stream.cc
+++ b/third_party/blink/renderer/core/streams/transform_stream.cc
@@ -30,16 +30,11 @@
   static v8::Local<v8::Function> Create(TransformStreamTransformer* transformer,
                                         ScriptState* script_state,
                                         ExceptionState& exception_state) {
-    auto* algorithm = new T(transformer, script_state, exception_state);
+    auto* algorithm =
+        MakeGarbageCollected<T>(transformer, script_state, exception_state);
     return algorithm->BindToV8Function();
   }
 
-  void Trace(Visitor* visitor) override {
-    visitor->Trace(transformer_);
-    ScriptFunction::Trace(visitor);
-  }
-
- protected:
   Algorithm(TransformStreamTransformer* transformer,
             ScriptState* script_state,
             ExceptionState& exception_state)
@@ -48,6 +43,12 @@
         interface_name_(exception_state.InterfaceName()),
         property_name_(exception_state.PropertyName()) {}
 
+  void Trace(Visitor* visitor) override {
+    visitor->Trace(transformer_);
+    ScriptFunction::Trace(visitor);
+  }
+
+ protected:
   // AlgorithmScope holds the stack-allocated objects used by the CallRaw()
   // methods for FlushAlgorithm and TransformAlgorithm.
   class AlgorithmScope {
@@ -122,6 +123,9 @@
 };
 
 TransformStream::TransformStream() = default;
+TransformStream::TransformStream(ReadableStream* readable,
+                                 WritableStream* writable)
+    : readable_(readable), writable_(writable) {}
 
 TransformStream::~TransformStream() = default;
 
@@ -174,8 +178,10 @@
     }
   }
   DCHECK(stream->IsObject());
-  ts->InitInternal(script_state, stream.As<v8::Object>(), exception_state);
-  return ts->stream_.IsEmpty() ? nullptr : ts;
+  if (!ts->InitInternal(script_state, stream.As<v8::Object>(), exception_state))
+    return nullptr;
+
+  return ts;
 }
 
 void TransformStream::Init(TransformStreamTransformer* transformer,
@@ -202,13 +208,12 @@
 }
 
 void TransformStream::Trace(Visitor* visitor) {
-  visitor->Trace(stream_);
   visitor->Trace(readable_);
   visitor->Trace(writable_);
   ScriptWrappable::Trace(visitor);
 }
 
-void TransformStream::InitInternal(ScriptState* script_state,
+bool TransformStream::InitInternal(ScriptState* script_state,
                                    v8::Local<v8::Object> stream,
                                    ExceptionState& exception_state) {
   v8::Local<v8::Value> readable, writable;
@@ -218,13 +223,13 @@
                                  args)
            .ToLocal(&readable)) {
     exception_state.RethrowV8Exception(block.Exception());
-    return;
+    return false;
   }
   if (!V8ScriptRunner::CallExtra(script_state, "getTransformStreamWritable",
                                  args)
            .ToLocal(&writable)) {
     exception_state.RethrowV8Exception(block.Exception());
-    return;
+    return false;
   }
 
   DCHECK(readable->IsObject());
@@ -232,16 +237,16 @@
       script_state, readable.As<v8::Object>(), exception_state);
 
   if (!readable_)
-    return;
+    return false;
 
   DCHECK(writable->IsObject());
   writable_ = WritableStream::CreateFromInternalStream(
       script_state, writable.As<v8::Object>(), exception_state);
 
   if (!writable_)
-    return;
+    return false;
 
-  stream_.Set(script_state->GetIsolate(), stream);
+  return true;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/streams/transform_stream.h b/third_party/blink/renderer/core/streams/transform_stream.h
index 4514903..602a383 100644
--- a/third_party/blink/renderer/core/streams/transform_stream.h
+++ b/third_party/blink/renderer/core/streams/transform_stream.h
@@ -29,7 +29,8 @@
 // defined in C++. Provides access to the readable and writable streams.
 //
 // On-heap references to this class must always be via a TraceWrapperMember, and
-// must always have an ancestor in the V8 heap, or |stream_| will be lost.
+// must always have an ancestor in the V8 heap, or the internal JavaScript
+// objects owned by |readable_| and |writable_| will be lost.
 //
 // To ensure that the JS TransformStream is always referenced, this class uses
 // two-stage construction. After calling the constructor, store the reference
@@ -40,6 +41,11 @@
 
  public:
   TransformStream();
+
+  // This constructor produces a TransformStream from an existing {readable,
+  // writable} pair. It cannot fail and does not require calling Init().
+  TransformStream(ReadableStream*, WritableStream*);
+
   ~TransformStream() override;
 
   // |Create| functions internally call Init().
@@ -76,11 +82,10 @@
   class FlushAlgorithm;
   class TransformAlgorithm;
 
-  void InitInternal(ScriptState*,
+  bool InitInternal(ScriptState*,
                     v8::Local<v8::Object> stream,
                     ExceptionState&);
 
-  TraceWrapperV8Reference<v8::Value> stream_;
   TraceWrapperMember<ReadableStream> readable_;
   TraceWrapperMember<WritableStream> writable_;
 
diff --git a/third_party/blink/renderer/core/streams/transform_stream_test.cc b/third_party/blink/renderer/core/streams/transform_stream_test.cc
index 26d78b9..abeaa2f 100644
--- a/third_party/blink/renderer/core/streams/transform_stream_test.cc
+++ b/third_party/blink/renderer/core/streams/transform_stream_test.cc
@@ -45,7 +45,7 @@
   void Init(TransformStreamTransformer* transformer,
             ScriptState* script_state,
             ExceptionState& exception_state) {
-    holder_ = new Holder(script_state);
+    holder_ = MakeGarbageCollected<Holder>(script_state);
     holder_->Stream()->Init(transformer, script_state, exception_state);
   }
 
@@ -135,13 +135,15 @@
 // If this doesn't work then nothing else will.
 TEST_F(TransformStreamTest, Construct) {
   V8TestingScope scope;
-  Init(new IdentityTransformer(), scope.GetScriptState(), ASSERT_NO_EXCEPTION);
+  Init(MakeGarbageCollected<IdentityTransformer>(), scope.GetScriptState(),
+       ASSERT_NO_EXCEPTION);
   EXPECT_TRUE(Stream());
 }
 
 TEST_F(TransformStreamTest, Accessors) {
   V8TestingScope scope;
-  Init(new IdentityTransformer(), scope.GetScriptState(), ASSERT_NO_EXCEPTION);
+  Init(MakeGarbageCollected<IdentityTransformer>(), scope.GetScriptState(),
+       ASSERT_NO_EXCEPTION);
   ReadableStream* readable = Stream()->Readable();
   WritableStream* writable = Stream()->Writable();
   EXPECT_TRUE(readable);
@@ -150,7 +152,7 @@
 
 TEST_F(TransformStreamTest, TransformIsCalled) {
   V8TestingScope scope;
-  auto* mock = new ::testing::StrictMock<MockTransformStreamTransformer>();
+  auto* mock = MakeGarbageCollected<MockTransformStreamTransformer>();
   Init(mock, scope.GetScriptState(), ASSERT_NO_EXCEPTION);
   // Need to run microtasks so the startAlgorithm promise resolves.
   v8::MicrotasksScope::PerformCheckpoint(scope.GetIsolate());
@@ -170,7 +172,7 @@
 
 TEST_F(TransformStreamTest, FlushIsCalled) {
   V8TestingScope scope;
-  auto* mock = new ::testing::StrictMock<MockTransformStreamTransformer>();
+  auto* mock = MakeGarbageCollected<MockTransformStreamTransformer>();
   Init(mock, scope.GetScriptState(), ASSERT_NO_EXCEPTION);
   // Need to run microtasks so the startAlgorithm promise resolves.
   v8::MicrotasksScope::PerformCheckpoint(scope.GetIsolate());
@@ -189,14 +191,14 @@
 class ExpectNotReached : public ScriptFunction {
  public:
   static v8::Local<v8::Function> Create(ScriptState* script_state) {
-    auto* self = new ExpectNotReached(script_state);
+    auto* self = MakeGarbageCollected<ExpectNotReached>(script_state);
     return self->BindToV8Function();
   }
 
- private:
   explicit ExpectNotReached(ScriptState* script_state)
       : ScriptFunction(script_state) {}
 
+ private:
   ScriptValue Call(ScriptValue) override {
     ADD_FAILURE() << "ExpectNotReached was reached";
     return ScriptValue();
@@ -210,16 +212,17 @@
   static v8::Local<v8::Function> Create(ScriptState* script_state,
                                         const String& expected,
                                         bool* called) {
-    auto* self = new ExpectChunkIsString(script_state, expected, called);
+    auto* self = MakeGarbageCollected<ExpectChunkIsString>(script_state,
+                                                           expected, called);
     return self->BindToV8Function();
   }
 
- private:
   ExpectChunkIsString(ScriptState* script_state,
                       const String& expected,
                       bool* called)
       : ScriptFunction(script_state), expected_(expected), called_(called) {}
 
+ private:
   ScriptValue Call(ScriptValue value) override {
     *called_ = true;
     if (!value.IsObject()) {
@@ -248,16 +251,17 @@
   static v8::Local<v8::Function> Create(ScriptState* script_state,
                                         const String& message,
                                         bool* called) {
-    auto* self = new ExpectTypeError(script_state, message, called);
+    auto* self =
+        MakeGarbageCollected<ExpectTypeError>(script_state, message, called);
     return self->BindToV8Function();
   }
 
- private:
   ExpectTypeError(ScriptState* script_state,
                   const String& message,
                   bool* called)
       : ScriptFunction(script_state), message_(message), called_(called) {}
 
+ private:
   ScriptValue Call(ScriptValue value) override {
     *called_ = true;
     EXPECT_TRUE(IsTypeError(GetScriptState(), value, message_));
@@ -298,7 +302,8 @@
 TEST_F(TransformStreamTest, EnqueueFromTransform) {
   V8TestingScope scope;
   auto* script_state = scope.GetScriptState();
-  Init(new IdentityTransformer(), script_state, ASSERT_NO_EXCEPTION);
+  Init(MakeGarbageCollected<IdentityTransformer>(), script_state,
+       ASSERT_NO_EXCEPTION);
 
   CopyReadableAndWritableToGlobal(scope);
 
@@ -337,8 +342,8 @@
   };
   V8TestingScope scope;
   auto* script_state = scope.GetScriptState();
-  Init(new EnqueueFromFlushTransformer(scope.GetContext()->Global(),
-                                       scope.GetIsolate()),
+  Init(MakeGarbageCollected<EnqueueFromFlushTransformer>(
+           scope.GetContext()->Global(), scope.GetIsolate()),
        script_state, ASSERT_NO_EXCEPTION);
 
   CopyReadableAndWritableToGlobal(scope);
@@ -370,7 +375,8 @@
   };
   V8TestingScope scope;
   auto* script_state = scope.GetScriptState();
-  Init(new ThrowFromTransformTransformer(), script_state, ASSERT_NO_EXCEPTION);
+  Init(MakeGarbageCollected<ThrowFromTransformTransformer>(), script_state,
+       ASSERT_NO_EXCEPTION);
 
   CopyReadableAndWritableToGlobal(scope);
 
@@ -410,7 +416,8 @@
   };
   V8TestingScope scope;
   auto* script_state = scope.GetScriptState();
-  Init(new ThrowFromFlushTransformer(), script_state, ASSERT_NO_EXCEPTION);
+  Init(MakeGarbageCollected<ThrowFromFlushTransformer>(), script_state,
+       ASSERT_NO_EXCEPTION);
 
   CopyReadableAndWritableToGlobal(scope);
 
@@ -436,5 +443,16 @@
   EXPECT_TRUE(writableTypeErrorThrown);
 }
 
+TEST_F(TransformStreamTest, CreateFromReadableWritablePair) {
+  V8TestingScope scope;
+  ReadableStream* readable =
+      ReadableStream::Create(scope.GetScriptState(), ASSERT_NO_EXCEPTION);
+  WritableStream* writable =
+      WritableStream::Create(scope.GetScriptState(), ASSERT_NO_EXCEPTION);
+  TransformStream transform(readable, writable);
+  EXPECT_EQ(readable, transform.Readable());
+  EXPECT_EQ(writable, transform.Writable());
+}
+
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/style/content_data.cc b/third_party/blink/renderer/core/style/content_data.cc
index 71af0bca..c9b3362 100644
--- a/third_party/blink/renderer/core/style/content_data.cc
+++ b/third_party/blink/renderer/core/style/content_data.cc
@@ -43,7 +43,7 @@
 }
 
 ContentData* ContentData::Create(std::unique_ptr<CounterContent> counter) {
-  return new CounterContentData(std::move(counter));
+  return MakeGarbageCollected<CounterContentData>(std::move(counter));
 }
 
 ContentData* ContentData::Create(QuoteType quote) {
diff --git a/third_party/blink/renderer/core/style/content_data.h b/third_party/blink/renderer/core/style/content_data.h
index 9dfcb0e9..b4e8924 100644
--- a/third_party/blink/renderer/core/style/content_data.h
+++ b/third_party/blink/renderer/core/style/content_data.h
@@ -147,14 +147,14 @@
     counter_ = std::move(counter);
   }
 
+  CounterContentData(std::unique_ptr<CounterContent> counter)
+      : counter_(std::move(counter)) {}
+
   bool IsCounter() const override { return true; }
   LayoutObject* CreateLayoutObject(PseudoElement&,
                                    ComputedStyle&) const override;
 
  private:
-  CounterContentData(std::unique_ptr<CounterContent> counter)
-      : counter_(std::move(counter)) {}
-
   ContentData* CloneInternal() const override {
     std::unique_ptr<CounterContent> counter_data =
         std::make_unique<CounterContent>(*Counter());
diff --git a/third_party/blink/renderer/core/style/filter_operation.h b/third_party/blink/renderer/core/style/filter_operation.h
index bd8ae57..568aeb48 100644
--- a/third_party/blink/renderer/core/style/filter_operation.h
+++ b/third_party/blink/renderer/core/style/filter_operation.h
@@ -175,9 +175,12 @@
  public:
   static BasicColorMatrixFilterOperation* Create(double amount,
                                                  OperationType type) {
-    return new BasicColorMatrixFilterOperation(amount, type);
+    return MakeGarbageCollected<BasicColorMatrixFilterOperation>(amount, type);
   }
 
+  BasicColorMatrixFilterOperation(double amount, OperationType type)
+      : FilterOperation(type), amount_(amount) {}
+
   double Amount() const { return amount_; }
 
  private:
@@ -191,9 +194,6 @@
     return amount_ == other->amount_;
   }
 
-  BasicColorMatrixFilterOperation(double amount, OperationType type)
-      : FilterOperation(type), amount_(amount) {}
-
   double amount_;
 };
 
@@ -218,9 +218,13 @@
  public:
   static BasicComponentTransferFilterOperation* Create(double amount,
                                                        OperationType type) {
-    return new BasicComponentTransferFilterOperation(amount, type);
+    return MakeGarbageCollected<BasicComponentTransferFilterOperation>(amount,
+                                                                       type);
   }
 
+  BasicComponentTransferFilterOperation(double amount, OperationType type)
+      : FilterOperation(type), amount_(amount) {}
+
   double Amount() const { return amount_; }
 
   bool AffectsOpacity() const override { return type_ == OPACITY; }
@@ -236,9 +240,6 @@
     return amount_ == other->amount_;
   }
 
-  BasicComponentTransferFilterOperation(double amount, OperationType type)
-      : FilterOperation(type), amount_(amount) {}
-
   double amount_;
 };
 
@@ -259,9 +260,12 @@
 class CORE_EXPORT BlurFilterOperation : public FilterOperation {
  public:
   static BlurFilterOperation* Create(const Length& std_deviation) {
-    return new BlurFilterOperation(std_deviation);
+    return MakeGarbageCollected<BlurFilterOperation>(std_deviation);
   }
 
+  BlurFilterOperation(const Length& std_deviation)
+      : FilterOperation(BLUR), std_deviation_(std_deviation) {}
+
   const Length& StdDeviation() const { return std_deviation_; }
 
   bool AffectsOpacity() const override { return true; }
@@ -279,9 +283,6 @@
     return std_deviation_ == other->std_deviation_;
   }
 
-  BlurFilterOperation(const Length& std_deviation)
-      : FilterOperation(BLUR), std_deviation_(std_deviation) {}
-
   Length std_deviation_;
 };
 
@@ -321,9 +322,12 @@
 class CORE_EXPORT BoxReflectFilterOperation : public FilterOperation {
  public:
   static BoxReflectFilterOperation* Create(const BoxReflection& reflection) {
-    return new BoxReflectFilterOperation(reflection);
+    return MakeGarbageCollected<BoxReflectFilterOperation>(reflection);
   }
 
+  BoxReflectFilterOperation(const BoxReflection& reflection)
+      : FilterOperation(BOX_REFLECT), reflection_(reflection) {}
+
   const BoxReflection& Reflection() const { return reflection_; }
 
   bool AffectsOpacity() const override { return true; }
@@ -335,9 +339,6 @@
                          double progress) const override;
   bool operator==(const FilterOperation&) const override;
 
-  BoxReflectFilterOperation(const BoxReflection& reflection)
-      : FilterOperation(BOX_REFLECT), reflection_(reflection) {}
-
   BoxReflection reflection_;
 };
 DEFINE_FILTER_OPERATION_TYPE_CASTS(BoxReflectFilterOperation, BOX_REFLECT);
diff --git a/third_party/blink/renderer/core/style/grid_area.h b/third_party/blink/renderer/core/style/grid_area.h
index 8c9bb424..a7be2490 100644
--- a/third_party/blink/renderer/core/style/grid_area.h
+++ b/third_party/blink/renderer/core/style/grid_area.h
@@ -138,12 +138,13 @@
  private:
   enum GridSpanType { kUntranslatedDefinite, kTranslatedDefinite, kIndefinite };
 
-  GridSpan(int start_line, int end_line, GridSpanType type) : type_(type) {
+  template <typename T>
+  GridSpan(T start_line, T end_line, GridSpanType type) : type_(type) {
 #if DCHECK_IS_ON()
     DCHECK_LT(start_line, end_line);
     if (type == kTranslatedDefinite) {
-      DCHECK_GE(start_line, 0);
-      DCHECK_GT(end_line, 0);
+      DCHECK_GE(start_line, static_cast<T>(0));
+      DCHECK_GT(end_line, static_cast<T>(0));
     }
 #endif
 
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
index 4325e7cc..64cfe58 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
@@ -79,7 +79,7 @@
  public:
   static ConditionEventListener* Create(SVGSMILElement* animation,
                                         SVGSMILElement::Condition* condition) {
-    return new ConditionEventListener(animation, condition);
+    return MakeGarbageCollected<ConditionEventListener>(animation, condition);
   }
 
   static const ConditionEventListener* Cast(const EventListener* listener) {
@@ -88,6 +88,12 @@
                : nullptr;
   }
 
+  ConditionEventListener(SVGSMILElement* animation,
+                         SVGSMILElement::Condition* condition)
+      : EventListener(kConditionEventListenerType),
+        animation_(animation),
+        condition_(condition) {}
+
   bool operator==(const EventListener& other) const override;
 
   void DisconnectAnimation() { animation_ = nullptr; }
@@ -99,12 +105,6 @@
   }
 
  private:
-  ConditionEventListener(SVGSMILElement* animation,
-                         SVGSMILElement::Condition* condition)
-      : EventListener(kConditionEventListenerType),
-        animation_(animation),
-        condition_(condition) {}
-
   void Invoke(ExecutionContext*, Event*) override;
 
   Member<SVGSMILElement> animation_;
diff --git a/third_party/blink/renderer/core/svg/svg_enumeration.h b/third_party/blink/renderer/core/svg/svg_enumeration.h
index 9e70421..069c8b7 100644
--- a/third_party/blink/renderer/core/svg/svg_enumeration.h
+++ b/third_party/blink/renderer/core/svg/svg_enumeration.h
@@ -106,9 +106,11 @@
 class SVGEnumeration : public SVGEnumerationBase {
  public:
   static SVGEnumeration<Enum>* Create(Enum new_value) {
-    return new SVGEnumeration<Enum>(new_value);
+    return MakeGarbageCollected<SVGEnumeration<Enum>>(new_value);
   }
 
+  explicit SVGEnumeration(Enum new_value)
+      : SVGEnumerationBase(new_value, GetEnumerationMap<Enum>()) {}
   ~SVGEnumeration() override = default;
 
   SVGEnumerationBase* Clone() const override { return Create(EnumValue()); }
@@ -122,10 +124,6 @@
     value_ = value;
     NotifyChange();
   }
-
- protected:
-  explicit SVGEnumeration(Enum new_value)
-      : SVGEnumerationBase(new_value, GetEnumerationMap<Enum>()) {}
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_string_list.h b/third_party/blink/renderer/core/svg/svg_string_list.h
index 82178789..ec8f192f 100644
--- a/third_party/blink/renderer/core/svg/svg_string_list.h
+++ b/third_party/blink/renderer/core/svg/svg_string_list.h
@@ -113,8 +113,10 @@
 class SVGStringList final : public SVGStringListBase {
  public:
   static SVGStringList<list_delimiter>* Create() {
-    return new SVGStringList<list_delimiter>();
+    return MakeGarbageCollected<SVGStringList<list_delimiter>>();
   }
+
+  SVGStringList() = default;
   ~SVGStringList() override = default;
 
   SVGParsingError SetValueAsString(const String& data) override {
@@ -125,9 +127,6 @@
   String ValueAsString() const override {
     return SVGStringListBase::ValueAsStringWithDelimiter(list_delimiter);
   }
-
- private:
-  SVGStringList() = default;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_uri_reference.cc b/third_party/blink/renderer/core/svg/svg_uri_reference.cc
index bce67926..83d6e05 100644
--- a/third_party/blink/renderer/core/svg/svg_uri_reference.cc
+++ b/third_party/blink/renderer/core/svg/svg_uri_reference.cc
@@ -138,8 +138,8 @@
   DCHECK(!observer);
   if (id.IsEmpty())
     return nullptr;
-  observer =
-      new SVGElementReferenceObserver(tree_scope, id, std::move(closure));
+  observer = MakeGarbageCollected<SVGElementReferenceObserver>(
+      tree_scope, id, std::move(closure));
   return tree_scope.getElementById(id);
 }
 
diff --git a/third_party/blink/renderer/core/testing/callback_function_test.h b/third_party/blink/renderer/core/testing/callback_function_test.h
index 035b0d29..a20bc0f 100644
--- a/third_party/blink/renderer/core/testing/callback_function_test.h
+++ b/third_party/blink/renderer/core/testing/callback_function_test.h
@@ -24,7 +24,9 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static CallbackFunctionTest* Create() { return new CallbackFunctionTest(); }
+  static CallbackFunctionTest* Create() {
+    return MakeGarbageCollected<CallbackFunctionTest>();
+  }
 
   String testCallback(V8TestCallback*,
                       const String&,
diff --git a/third_party/blink/renderer/core/testing/dummy_modulator.cc b/third_party/blink/renderer/core/testing/dummy_modulator.cc
index 7c2d206..a2b04991 100644
--- a/third_party/blink/renderer/core/testing/dummy_modulator.cc
+++ b/third_party/blink/renderer/core/testing/dummy_modulator.cc
@@ -35,7 +35,8 @@
 
 }  // namespace
 
-DummyModulator::DummyModulator() : resolver_(new EmptyScriptModuleResolver()) {}
+DummyModulator::DummyModulator()
+    : resolver_(MakeGarbageCollected<EmptyScriptModuleResolver>()) {}
 
 DummyModulator::~DummyModulator() = default;
 
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc
index 2e5b068..cf43a00 100644
--- a/third_party/blink/renderer/core/testing/internals.cc
+++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -3067,14 +3067,14 @@
 class AddOneFunction : public ScriptFunction {
  public:
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) {
-    AddOneFunction* self = new AddOneFunction(script_state);
+    AddOneFunction* self = MakeGarbageCollected<AddOneFunction>(script_state);
     return self->BindToV8Function();
   }
 
- private:
   explicit AddOneFunction(ScriptState* script_state)
       : ScriptFunction(script_state) {}
 
+ private:
   ScriptValue Call(ScriptValue value) override {
     v8::Local<v8::Value> v8_value = value.V8Value();
     DCHECK(v8_value->IsNumber());
@@ -3389,8 +3389,9 @@
     return promise;
   }
 
-  loader->GetUseCounter().AddObserver(new UseCounterObserverImpl(
-      resolver, static_cast<WebFeature>(use_counter_feature)));
+  loader->GetUseCounter().AddObserver(
+      MakeGarbageCollected<UseCounterObserverImpl>(
+          resolver, static_cast<WebFeature>(use_counter_feature)));
   return promise;
 }
 
diff --git a/third_party/blink/renderer/core/timing/performance_element_timing.cc b/third_party/blink/renderer/core/timing/performance_element_timing.cc
index a2917af..0d74d8ef 100644
--- a/third_party/blink/renderer/core/timing/performance_element_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_element_timing.cc
@@ -14,7 +14,8 @@
     const AtomicString& name,
     const IntRect& intersection_rect,
     DOMHighResTimeStamp start_time) {
-  return new PerformanceElementTiming(name, intersection_rect, start_time);
+  return MakeGarbageCollected<PerformanceElementTiming>(name, intersection_rect,
+                                                        start_time);
 }
 
 PerformanceElementTiming::PerformanceElementTiming(
diff --git a/third_party/blink/renderer/core/timing/performance_element_timing.h b/third_party/blink/renderer/core/timing/performance_element_timing.h
index ca497b0..35c0c913 100644
--- a/third_party/blink/renderer/core/timing/performance_element_timing.h
+++ b/third_party/blink/renderer/core/timing/performance_element_timing.h
@@ -24,6 +24,9 @@
                                           const IntRect& intersection_rect,
                                           DOMHighResTimeStamp start_time);
 
+  PerformanceElementTiming(const AtomicString& name,
+                           const IntRect& intersection_rect,
+                           DOMHighResTimeStamp start_time);
   ~PerformanceElementTiming() override;
 
   AtomicString entryType() const override;
@@ -34,10 +37,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  PerformanceElementTiming(const AtomicString& name,
-                           const IntRect& intersection_rect,
-                           DOMHighResTimeStamp start_time);
-
   void BuildJSONValue(V8ObjectBuilder&) const override;
 
   Member<DOMRectReadOnly> intersection_rect_;
diff --git a/third_party/blink/renderer/core/timing/performance_layout_jank.cc b/third_party/blink/renderer/core/timing/performance_layout_jank.cc
index 4634426..1dce523 100644
--- a/third_party/blink/renderer/core/timing/performance_layout_jank.cc
+++ b/third_party/blink/renderer/core/timing/performance_layout_jank.cc
@@ -12,7 +12,7 @@
 
 // static
 PerformanceLayoutJank* PerformanceLayoutJank::Create(double fraction) {
-  return new PerformanceLayoutJank(fraction);
+  return MakeGarbageCollected<PerformanceLayoutJank>(fraction);
 }
 
 PerformanceLayoutJank::PerformanceLayoutJank(double fraction)
diff --git a/third_party/blink/renderer/core/timing/performance_layout_jank.h b/third_party/blink/renderer/core/timing/performance_layout_jank.h
index 09751fb0..4ff9927 100644
--- a/third_party/blink/renderer/core/timing/performance_layout_jank.h
+++ b/third_party/blink/renderer/core/timing/performance_layout_jank.h
@@ -21,6 +21,7 @@
  public:
   static PerformanceLayoutJank* Create(double fraction);
 
+  PerformanceLayoutJank(double fraction);
   ~PerformanceLayoutJank() override;
 
   AtomicString entryType() const override;
@@ -31,8 +32,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  PerformanceLayoutJank(double fraction);
-
   void BuildJSONValue(V8ObjectBuilder&) const override;
 
   double fraction_;
diff --git a/third_party/blink/renderer/core/typed_arrays/dom_typed_array.h b/third_party/blink/renderer/core/typed_arrays/dom_typed_array.h
index 8b72040..750d1a5 100644
--- a/third_party/blink/renderer/core/typed_arrays/dom_typed_array.h
+++ b/third_party/blink/renderer/core/typed_arrays/dom_typed_array.h
@@ -33,7 +33,7 @@
   typedef typename WTFTypedArray::ValueType ValueType;
 
   static ThisType* Create(scoped_refptr<WTFTypedArray> buffer_view) {
-    return new ThisType(std::move(buffer_view));
+    return MakeGarbageCollected<ThisType>(std::move(buffer_view));
   }
   static ThisType* Create(unsigned length) {
     return Create(WTFTypedArray::Create(length));
@@ -52,7 +52,7 @@
                           unsigned length) {
     scoped_refptr<WTFTypedArray> buffer_view =
         WTFTypedArray::Create(buffer->Buffer(), byte_offset, length);
-    return new ThisType(std::move(buffer_view), buffer);
+    return MakeGarbageCollected<ThisType>(std::move(buffer_view), buffer);
   }
 
   static ThisType* CreateOrNull(unsigned length) {
@@ -61,6 +61,12 @@
     return buffer ? Create(std::move(buffer), 0, length) : nullptr;
   }
 
+  explicit DOMTypedArray(scoped_refptr<WTFTypedArray> buffer_view)
+      : DOMArrayBufferView(std::move(buffer_view)) {}
+  DOMTypedArray(scoped_refptr<WTFTypedArray> buffer_view,
+                DOMArrayBufferBase* dom_array_buffer)
+      : DOMArrayBufferView(std::move(buffer_view), dom_array_buffer) {}
+
   const WTFTypedArray* View() const {
     return static_cast<const WTFTypedArray*>(DOMArrayBufferView::View());
   }
@@ -77,13 +83,6 @@
 
   v8::Local<v8::Object> Wrap(v8::Isolate*,
                              v8::Local<v8::Object> creation_context) override;
-
- private:
-  explicit DOMTypedArray(scoped_refptr<WTFTypedArray> buffer_view)
-      : DOMArrayBufferView(std::move(buffer_view)) {}
-  DOMTypedArray(scoped_refptr<WTFTypedArray> buffer_view,
-                DOMArrayBufferBase* dom_array_buffer)
-      : DOMArrayBufferView(std::move(buffer_view), dom_array_buffer) {}
 };
 
 extern template class CORE_EXTERN_TEMPLATE_EXPORT
diff --git a/third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h b/third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h
index ae28282..2bdf887 100644
--- a/third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h
+++ b/third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h
@@ -19,7 +19,7 @@
   FlexibleArrayBufferView() : small_data_(nullptr), small_length_(0) {}
 
   void SetFull(DOMArrayBufferView* full) { full_ = full; }
-  void SetSmall(void* data, size_t length) {
+  void SetSmall(void* data, uint32_t length) {
     small_data_ = data;
     small_length_ = length;
   }
@@ -62,7 +62,7 @@
   Member<DOMArrayBufferView> full_;
 
   void* small_data_;
-  size_t small_length_;
+  uint32_t small_length_;
   DISALLOW_COPY_AND_ASSIGN(FlexibleArrayBufferView);
 };
 
diff --git a/third_party/blink/renderer/core/url/url_search_params.cc b/third_party/blink/renderer/core/url/url_search_params.cc
index e29f88a..034bbe3 100644
--- a/third_party/blink/renderer/core/url/url_search_params.cc
+++ b/third_party/blink/renderer/core/url/url_search_params.cc
@@ -260,7 +260,7 @@
 PairIterable<String, String>::IterationSource* URLSearchParams::StartIteration(
     ScriptState*,
     ExceptionState&) {
-  return new URLSearchParamsIterationSource(this);
+  return MakeGarbageCollected<URLSearchParamsIterationSource>(this);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/workers/abstract_worker.h b/third_party/blink/renderer/core/workers/abstract_worker.h
index 0806f82..81e64fa 100644
--- a/third_party/blink/renderer/core/workers/abstract_worker.h
+++ b/third_party/blink/renderer/core/workers/abstract_worker.h
@@ -31,7 +31,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_ABSTRACT_WORKER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_ABSTRACT_WORKER_H_
 
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-blink.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
 #include "third_party/blink/renderer/core/dom/events/event_listener.h"
diff --git a/third_party/blink/renderer/core/workers/experimental/task.cc b/third_party/blink/renderer/core/workers/experimental/task.cc
index 45d8384..4626c59 100644
--- a/third_party/blink/renderer/core/workers/experimental/task.cc
+++ b/third_party/blink/renderer/core/workers/experimental/task.cc
@@ -23,18 +23,20 @@
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
                                                 TaskBase* task,
                                                 State state) {
-    return (new AsyncFunctionCompleted(script_state, task, state))
+    return (MakeGarbageCollected<AsyncFunctionCompleted>(script_state, task,
+                                                         state))
         ->BindToV8Function();
   }
 
+  AsyncFunctionCompleted(ScriptState* script_state, TaskBase* task, State state)
+      : ScriptFunction(script_state), task_(task), state_(state) {}
+
   ScriptValue Call(ScriptValue v) override {
     task_->TaskCompletedOnWorkerThread(v.V8Value(), state_);
     return ScriptValue();
   }
 
  private:
-  AsyncFunctionCompleted(ScriptState* script_state, TaskBase* task, State state)
-      : ScriptFunction(script_state), task_(task), state_(state) {}
   CrossThreadPersistent<TaskBase> task_;
   const State state_;
 };
@@ -247,8 +249,8 @@
 void TaskBase::TaskCompletedOnWorkerThread(v8::Local<v8::Value> v8_result,
                                            State state) {
   DCHECK(worker_thread_->IsCurrentThread());
-  v8_result_ =
-      new V8ResultHolder(ToIsolate(worker_thread_->GlobalScope()), v8_result);
+  v8_result_ = MakeGarbageCollected<V8ResultHolder>(
+      ToIsolate(worker_thread_->GlobalScope()), v8_result);
   function_ = nullptr;
   arguments_.clear();
 
diff --git a/third_party/blink/renderer/core/workers/experimental/task_worklet_global_scope.cc b/third_party/blink/renderer/core/workers/experimental/task_worklet_global_scope.cc
index efec929..5e77e6e 100644
--- a/third_party/blink/renderer/core/workers/experimental/task_worklet_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/experimental/task_worklet_global_scope.cc
@@ -92,7 +92,8 @@
     return;
   }
 
-  TaskDefinition* definition = new TaskDefinition(isolate, instance, process);
+  TaskDefinition* definition =
+      MakeGarbageCollected<TaskDefinition>(isolate, instance, process);
   task_definitions_.Set(name, definition);
 }
 
diff --git a/third_party/blink/renderer/core/workers/experimental/thread_pool.cc b/third_party/blink/renderer/core/workers/experimental/thread_pool.cc
index bf4e433..47056b7 100644
--- a/third_party/blink/renderer/core/workers/experimental/thread_pool.cc
+++ b/third_party/blink/renderer/core/workers/experimental/thread_pool.cc
@@ -104,7 +104,8 @@
                  : base::UnguessableToken::Create();
   ExecutionContext* context = GetExecutionContext();
 
-  ThreadPoolMessagingProxy* proxy = new ThreadPoolMessagingProxy(context);
+  ThreadPoolMessagingProxy* proxy =
+      MakeGarbageCollected<ThreadPoolMessagingProxy>(context);
   std::unique_ptr<WorkerSettings> settings =
       std::make_unique<WorkerSettings>(GetFrame()->GetSettings());
 
diff --git a/third_party/blink/renderer/core/workers/experimental/worker_task_queue.cc b/third_party/blink/renderer/core/workers/experimental/worker_task_queue.cc
index 45c4228..ea307316 100644
--- a/third_party/blink/renderer/core/workers/experimental/worker_task_queue.cc
+++ b/third_party/blink/renderer/core/workers/experimental/worker_task_queue.cc
@@ -31,7 +31,7 @@
   DCHECK(type == "user-interaction" || type == "background");
   TaskType task_type = type == "user-interaction" ? TaskType::kUserInteraction
                                                   : TaskType::kIdleTask;
-  return new WorkerTaskQueue(document, task_type);
+  return MakeGarbageCollected<WorkerTaskQueue>(document, task_type);
 }
 
 WorkerTaskQueue::WorkerTaskQueue(Document* document, TaskType task_type)
diff --git a/third_party/blink/renderer/core/workers/experimental/worker_task_queue.h b/third_party/blink/renderer/core/workers/experimental/worker_task_queue.h
index 0872c73a..8608af1 100644
--- a/third_party/blink/renderer/core/workers/experimental/worker_task_queue.h
+++ b/third_party/blink/renderer/core/workers/experimental/worker_task_queue.h
@@ -27,6 +27,8 @@
   static WorkerTaskQueue* Create(ExecutionContext*,
                                  const String&,
                                  ExceptionState&);
+
+  WorkerTaskQueue(Document*, TaskType);
   ~WorkerTaskQueue() override = default;
 
   ScriptPromise postFunction(ScriptState*,
@@ -41,8 +43,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  WorkerTaskQueue(Document*, TaskType);
-
   Member<Document> document_;
   const TaskType task_type_;
 };
diff --git a/third_party/blink/renderer/core/workers/main_thread_worklet_test.cc b/third_party/blink/renderer/core/workers/main_thread_worklet_test.cc
index 4df15f6..d07a313 100644
--- a/third_party/blink/renderer/core/workers/main_thread_worklet_test.cc
+++ b/third_party/blink/renderer/core/workers/main_thread_worklet_test.cc
@@ -72,7 +72,8 @@
         nullptr /* worker_clients */, document->AddressSpace(),
         OriginTrialContext::GetTokens(document).get(),
         base::UnguessableToken::Create(), nullptr /* worker_settings */,
-        kV8CacheOptionsDefault, new WorkletModuleResponsesMap);
+        kV8CacheOptionsDefault,
+        MakeGarbageCollected<WorkletModuleResponsesMap>());
     global_scope_ = MakeGarbageCollected<WorkletGlobalScope>(
         std::move(creation_params), *reporting_proxy_, &GetFrame());
     EXPECT_TRUE(global_scope_->IsMainThreadWorkletGlobalScope());
diff --git a/third_party/blink/renderer/core/workers/threaded_worklet_test.cc b/third_party/blink/renderer/core/workers/threaded_worklet_test.cc
index 052cdb7..79c2172 100644
--- a/third_party/blink/renderer/core/workers/threaded_worklet_test.cc
+++ b/third_party/blink/renderer/core/workers/threaded_worklet_test.cc
@@ -211,7 +211,8 @@
             worker_clients, document->AddressSpace(),
             OriginTrialContext::GetTokens(document).get(),
             base::UnguessableToken::Create(), std::move(worker_settings),
-            kV8CacheOptionsDefault, new WorkletModuleResponsesMap),
+            kV8CacheOptionsDefault,
+            MakeGarbageCollected<WorkletModuleResponsesMap>()),
         base::nullopt);
   }
 
diff --git a/third_party/blink/renderer/core/workers/worker_thread.cc b/third_party/blink/renderer/core/workers/worker_thread.cc
index dfe382c..cde92a7 100644
--- a/third_party/blink/renderer/core/workers/worker_thread.cc
+++ b/third_party/blink/renderer/core/workers/worker_thread.cc
@@ -449,7 +449,7 @@
 
     const KURL url_for_debugger = global_scope_creation_params->script_url;
 
-    console_message_storage_ = new ConsoleMessageStorage();
+    console_message_storage_ = MakeGarbageCollected<ConsoleMessageStorage>();
     global_scope_ =
         CreateWorkerGlobalScope(std::move(global_scope_creation_params));
     worker_reporting_proxy_.DidCreateWorkerGlobalScope(GlobalScope());
diff --git a/third_party/blink/renderer/core/workers/worklet.cc b/third_party/blink/renderer/core/workers/worklet.cc
index 0739eea7..04a2b35 100644
--- a/third_party/blink/renderer/core/workers/worklet.cc
+++ b/third_party/blink/renderer/core/workers/worklet.cc
@@ -22,7 +22,7 @@
 
 Worklet::Worklet(Document* document)
     : ContextLifecycleObserver(document),
-      module_responses_map_(new WorkletModuleResponsesMap) {
+      module_responses_map_(MakeGarbageCollected<WorkletModuleResponsesMap>()) {
   DCHECK(IsMainThread());
 }
 
diff --git a/third_party/blink/renderer/core/workers/worklet_module_responses_map_test.cc b/third_party/blink/renderer/core/workers/worklet_module_responses_map_test.cc
index 880426c..2ecad9b 100644
--- a/third_party/blink/renderer/core/workers/worklet_module_responses_map_test.cc
+++ b/third_party/blink/renderer/core/workers/worklet_module_responses_map_test.cc
@@ -169,7 +169,7 @@
 TEST_F(WorkletModuleResponsesMapTest, InvalidURL) {
   const KURL kEmptyURL;
   ASSERT_TRUE(kEmptyURL.IsEmpty());
-  ClientImpl* client1 = new ClientImpl;
+  ClientImpl* client1 = MakeGarbageCollected<ClientImpl>();
   Fetch(kEmptyURL, client1);
   RunUntilIdle();
   EXPECT_EQ(ClientImpl::Result::kFailed, client1->GetResult());
@@ -177,7 +177,7 @@
 
   const KURL kNullURL = NullURL();
   ASSERT_TRUE(kNullURL.IsNull());
-  ClientImpl* client2 = new ClientImpl;
+  ClientImpl* client2 = MakeGarbageCollected<ClientImpl>();
   Fetch(kNullURL, client2);
   RunUntilIdle();
   EXPECT_EQ(ClientImpl::Result::kFailed, client2->GetResult());
@@ -185,7 +185,7 @@
 
   const KURL kInvalidURL;
   ASSERT_FALSE(kInvalidURL.IsValid());
-  ClientImpl* client3 = new ClientImpl;
+  ClientImpl* client3 = MakeGarbageCollected<ClientImpl>();
   Fetch(kInvalidURL, client3);
   RunUntilIdle();
   EXPECT_EQ(ClientImpl::Result::kFailed, client3->GetResult());
diff --git a/third_party/blink/renderer/core/xml/xpath_functions.cc b/third_party/blink/renderer/core/xml/xpath_functions.cc
index 833388c..b59c7c2 100644
--- a/third_party/blink/renderer/core/xml/xpath_functions.cc
+++ b/third_party/blink/renderer/core/xml/xpath_functions.cc
@@ -48,7 +48,7 @@
 }
 
 #define DEFINE_FUNCTION_CREATOR(Class) \
-  static Function* Create##Class() { return new Class; }
+  static Function* Create##Class() { return MakeGarbageCollected<Class>(); }
 
 class Interval {
  public:
diff --git a/third_party/blink/renderer/core/xml/xpath_functions_test.cc b/third_party/blink/renderer/core/xml/xpath_functions_test.cc
index e89e4db..1ba9e00f 100644
--- a/third_party/blink/renderer/core/xml/xpath_functions_test.cc
+++ b/third_party/blink/renderer/core/xml/xpath_functions_test.cc
@@ -44,16 +44,16 @@
 
 static String Substring(const char* string, double pos) {
   XPathArguments args;
-  args.push_back(new xpath::StringExpression(string));
-  args.push_back(new xpath::Number(pos));
+  args.push_back(MakeGarbageCollected<xpath::StringExpression>(string));
+  args.push_back(MakeGarbageCollected<xpath::Number>(pos));
   return Substring(args);
 }
 
 static String Substring(const char* string, double pos, double len) {
   XPathArguments args;
-  args.push_back(new xpath::StringExpression(string));
-  args.push_back(new xpath::Number(pos));
-  args.push_back(new xpath::Number(len));
+  args.push_back(MakeGarbageCollected<xpath::StringExpression>(string));
+  args.push_back(MakeGarbageCollected<xpath::Number>(pos));
+  args.push_back(MakeGarbageCollected<xpath::Number>(len));
   return Substring(args);
 }
 
diff --git a/third_party/blink/renderer/core/xml/xpath_grammar.y b/third_party/blink/renderer/core/xml/xpath_grammar.y
index fcd33e5..17d0b89 100644
--- a/third_party/blink/renderer/core/xml/xpath_grammar.y
+++ b/third_party/blink/renderer/core/xml/xpath_grammar.y
@@ -138,7 +138,7 @@
 AbsoluteLocationPath:
     '/'
     {
-      $$ = new blink::xpath::LocationPath;
+      $$ = blink::MakeGarbageCollected<blink::xpath::LocationPath>();
     }
     |
     '/' RelativeLocationPath
@@ -156,7 +156,7 @@
 RelativeLocationPath:
     Step
     {
-      $$ = new blink::xpath::LocationPath;
+      $$ = blink::MakeGarbageCollected<blink::xpath::LocationPath>();
       $$->AppendStep($1);
     }
     |
@@ -176,9 +176,9 @@
     NodeTest OptionalPredicateList
     {
       if ($2)
-        $$ = new Step(Step::kChildAxis, *$1, *$2);
+        $$ = blink::MakeGarbageCollected<Step>(Step::kChildAxis, *$1, *$2);
       else
-        $$ = new Step(Step::kChildAxis, *$1);
+        $$ = blink::MakeGarbageCollected<Step>(Step::kChildAxis, *$1);
     }
     |
     NAMETEST OptionalPredicateList
@@ -191,18 +191,18 @@
       }
 
       if ($2)
-        $$ = new Step(Step::kChildAxis, Step::NodeTest(Step::NodeTest::kNameTest, local_name, namespace_uri), *$2);
+        $$ = blink::MakeGarbageCollected<Step>(Step::kChildAxis, Step::NodeTest(Step::NodeTest::kNameTest, local_name, namespace_uri), *$2);
       else
-        $$ = new Step(Step::kChildAxis, Step::NodeTest(Step::NodeTest::kNameTest, local_name, namespace_uri));
+        $$ = blink::MakeGarbageCollected<Step>(Step::kChildAxis, Step::NodeTest(Step::NodeTest::kNameTest, local_name, namespace_uri));
        parser->DeleteString($1);
     }
     |
     AxisSpecifier NodeTest OptionalPredicateList
     {
       if ($3)
-        $$ = new Step($1, *$2, *$3);
+        $$ = blink::MakeGarbageCollected<Step>($1, *$2, *$3);
       else
-        $$ = new Step($1, *$2);
+        $$ = blink::MakeGarbageCollected<Step>($1, *$2);
     }
     |
     AxisSpecifier NAMETEST OptionalPredicateList
@@ -215,9 +215,9 @@
       }
 
       if ($3)
-        $$ = new Step($1, Step::NodeTest(Step::NodeTest::kNameTest, local_name, namespace_uri), *$3);
+        $$ = blink::MakeGarbageCollected<Step>($1, Step::NodeTest(Step::NodeTest::kNameTest, local_name, namespace_uri), *$3);
       else
-        $$ = new Step($1, Step::NodeTest(Step::NodeTest::kNameTest, local_name, namespace_uri));
+        $$ = blink::MakeGarbageCollected<Step>($1, Step::NodeTest(Step::NodeTest::kNameTest, local_name, namespace_uri));
       parser->DeleteString($2);
     }
     |
@@ -237,24 +237,24 @@
     NODETYPE '(' ')'
     {
       if (*$1 == "node")
-        $$ = new Step::NodeTest(Step::NodeTest::kAnyNodeTest);
+        $$ = blink::MakeGarbageCollected<Step::NodeTest>(Step::NodeTest::kAnyNodeTest);
       else if (*$1 == "text")
-        $$ = new Step::NodeTest(Step::NodeTest::kTextNodeTest);
+        $$ = blink::MakeGarbageCollected<Step::NodeTest>(Step::NodeTest::kTextNodeTest);
       else if (*$1 == "comment")
-        $$ = new Step::NodeTest(Step::NodeTest::kCommentNodeTest);
+        $$ = blink::MakeGarbageCollected<Step::NodeTest>(Step::NodeTest::kCommentNodeTest);
 
       parser->DeleteString($1);
     }
     |
     PI '(' ')'
     {
-      $$ = new Step::NodeTest(Step::NodeTest::kProcessingInstructionNodeTest);
+      $$ = blink::MakeGarbageCollected<Step::NodeTest>(Step::NodeTest::kProcessingInstructionNodeTest);
       parser->DeleteString($1);
     }
     |
     PI '(' LITERAL ')'
     {
-      $$ = new Step::NodeTest(Step::NodeTest::kProcessingInstructionNodeTest, $3->StripWhiteSpace());
+      $$ = blink::MakeGarbageCollected<Step::NodeTest>(Step::NodeTest::kProcessingInstructionNodeTest, $3->StripWhiteSpace());
       parser->DeleteString($1);
       parser->DeleteString($3);
     }
@@ -273,12 +273,12 @@
     Predicate
     {
       $$ = blink::MakeGarbageCollected<blink::HeapVector<blink::Member<blink::xpath::Predicate>>>();
-      $$->push_back(new blink::xpath::Predicate($1));
+      $$->push_back(blink::MakeGarbageCollected<blink::xpath::Predicate>($1));
     }
     |
     PredicateList Predicate
     {
-      $$->push_back(new blink::xpath::Predicate($2));
+      $$->push_back(blink::MakeGarbageCollected<blink::xpath::Predicate>($2));
     }
     ;
 
@@ -292,26 +292,26 @@
 DescendantOrSelf:
     SLASHSLASH
     {
-      $$ = new Step(Step::kDescendantOrSelfAxis, Step::NodeTest(Step::NodeTest::kAnyNodeTest));
+      $$ = blink::MakeGarbageCollected<Step>(Step::kDescendantOrSelfAxis, Step::NodeTest(Step::NodeTest::kAnyNodeTest));
     }
     ;
 
 AbbreviatedStep:
     '.'
     {
-      $$ = new Step(Step::kSelfAxis, Step::NodeTest(Step::NodeTest::kAnyNodeTest));
+      $$ = blink::MakeGarbageCollected<Step>(Step::kSelfAxis, Step::NodeTest(Step::NodeTest::kAnyNodeTest));
     }
     |
     DOTDOT
     {
-      $$ = new Step(Step::kParentAxis, Step::NodeTest(Step::NodeTest::kAnyNodeTest));
+      $$ = blink::MakeGarbageCollected<Step>(Step::kParentAxis, Step::NodeTest(Step::NodeTest::kAnyNodeTest));
     }
     ;
 
 PrimaryExpr:
     VARIABLEREFERENCE
     {
-      $$ = new blink::xpath::VariableReference(*$1);
+      $$ = blink::MakeGarbageCollected<blink::xpath::VariableReference>(*$1);
       parser->DeleteString($1);
     }
     |
@@ -322,13 +322,13 @@
     |
     LITERAL
     {
-      $$ = new blink::xpath::StringExpression(*$1);
+      $$ = blink::MakeGarbageCollected<blink::xpath::StringExpression>(*$1);
       parser->DeleteString($1);
     }
     |
     NUMBER
     {
-      $$ = new blink::xpath::Number($1->ToDouble());
+      $$ = blink::MakeGarbageCollected<blink::xpath::Number>($1->ToDouble());
       parser->DeleteString($1);
     }
     |
@@ -375,7 +375,7 @@
     |
     UnionExpr '|' PathExpr
     {
-      $$ = new blink::xpath::Union;
+      $$ = blink::MakeGarbageCollected<blink::xpath::Union>();
       $$->AddSubExpression($1);
       $$->AddSubExpression($3);
     }
@@ -392,14 +392,14 @@
     FilterExpr '/' RelativeLocationPath
     {
       $3->SetAbsolute(true);
-      $$ = new blink::xpath::Path($1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::Path>($1, $3);
     }
     |
     FilterExpr DescendantOrSelf RelativeLocationPath
     {
       $3->InsertFirstStep($2);
       $3->SetAbsolute(true);
-      $$ = new blink::xpath::Path($1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::Path>($1, $3);
     }
     ;
 
@@ -408,7 +408,7 @@
     |
     PrimaryExpr PredicateList
     {
-      $$ = new blink::xpath::Filter($1, *$2);
+      $$ = blink::MakeGarbageCollected<blink::xpath::Filter>($1, *$2);
     }
     ;
 
@@ -417,7 +417,7 @@
     |
     OrExpr OR AndExpr
     {
-      $$ = new blink::xpath::LogicalOp(blink::xpath::LogicalOp::kOP_Or, $1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::LogicalOp>(blink::xpath::LogicalOp::kOP_Or, $1, $3);
     }
     ;
 
@@ -426,7 +426,7 @@
     |
     AndExpr AND EqualityExpr
     {
-      $$ = new blink::xpath::LogicalOp(blink::xpath::LogicalOp::kOP_And, $1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::LogicalOp>(blink::xpath::LogicalOp::kOP_And, $1, $3);
     }
     ;
 
@@ -435,7 +435,7 @@
     |
     EqualityExpr EQOP RelationalExpr
     {
-      $$ = new blink::xpath::EqTestOp($2, $1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::EqTestOp>($2, $1, $3);
     }
     ;
 
@@ -444,7 +444,7 @@
     |
     RelationalExpr RELOP AdditiveExpr
     {
-      $$ = new blink::xpath::EqTestOp($2, $1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::EqTestOp>($2, $1, $3);
     }
     ;
 
@@ -453,12 +453,12 @@
     |
     AdditiveExpr PLUS MultiplicativeExpr
     {
-      $$ = new blink::xpath::NumericOp(blink::xpath::NumericOp::kOP_Add, $1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::NumericOp>(blink::xpath::NumericOp::kOP_Add, $1, $3);
     }
     |
     AdditiveExpr MINUS MultiplicativeExpr
     {
-      $$ = new blink::xpath::NumericOp(blink::xpath::NumericOp::kOP_Sub, $1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::NumericOp>(blink::xpath::NumericOp::kOP_Sub, $1, $3);
     }
     ;
 
@@ -467,7 +467,7 @@
     |
     MultiplicativeExpr MULOP UnaryExpr
     {
-      $$ = new blink::xpath::NumericOp($2, $1, $3);
+      $$ = blink::MakeGarbageCollected<blink::xpath::NumericOp>($2, $1, $3);
     }
     ;
 
@@ -476,7 +476,7 @@
     |
     MINUS UnaryExpr
     {
-      $$ = new blink::xpath::Negative;
+      $$ = blink::MakeGarbageCollected<blink::xpath::Negative>();
       $$->AddSubExpression($2);
     }
     ;
diff --git a/third_party/blink/renderer/modules/accessibility/accessibility_object_model_test.cc b/third_party/blink/renderer/modules/accessibility/accessibility_object_model_test.cc
index 99cd441..27f4931a 100644
--- a/third_party/blink/renderer/modules/accessibility/accessibility_object_model_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/accessibility_object_model_test.cc
@@ -388,7 +388,7 @@
   AccessibleNodeList* node_list = target->accessibleNode()->labeledBy();
   ASSERT_EQ(nullptr, node_list);
 
-  node_list = new AccessibleNodeList();
+  node_list = MakeGarbageCollected<AccessibleNodeList>();
   node_list->add(l3->accessibleNode());
   target->accessibleNode()->setLabeledBy(node_list);
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_media_controls.cc b/third_party/blink/renderer/modules/accessibility/ax_media_controls.cc
index 3f80947..e5f5f9a 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_media_controls.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_media_controls.cc
@@ -96,11 +96,13 @@
     case kMediaExitPictureInPictureButton:
     case kMediaDisplayCutoutFullscreenButton:
     case kMediaAnimatedArrowContainer:
-      return new AccessibilityMediaControl(layout_object, ax_object_cache);
+      return MakeGarbageCollected<AccessibilityMediaControl>(layout_object,
+                                                             ax_object_cache);
   }
 
   NOTREACHED();
-  return new AccessibilityMediaControl(layout_object, ax_object_cache);
+  return MakeGarbageCollected<AccessibilityMediaControl>(layout_object,
+                                                         ax_object_cache);
 }
 
 MediaControlElementType AccessibilityMediaControl::ControlType() const {
@@ -356,7 +358,8 @@
 AXObject* AccessibilityMediaTimeline::Create(
     LayoutObject* layout_object,
     AXObjectCacheImpl& ax_object_cache) {
-  return new AccessibilityMediaTimeline(layout_object, ax_object_cache);
+  return MakeGarbageCollected<AccessibilityMediaTimeline>(layout_object,
+                                                          ax_object_cache);
 }
 
 String AccessibilityMediaTimeline::Description(
@@ -379,7 +382,8 @@
 AXObject* AccessibilityMediaVolumeSlider::Create(
     LayoutObject* layout_object,
     AXObjectCacheImpl& ax_object_cache) {
-  return new AccessibilityMediaVolumeSlider(layout_object, ax_object_cache);
+  return MakeGarbageCollected<AccessibilityMediaVolumeSlider>(layout_object,
+                                                              ax_object_cache);
 }
 
 String AccessibilityMediaVolumeSlider::Description(
@@ -410,7 +414,8 @@
 AXObject* AccessibilityMediaTimeDisplay::Create(
     LayoutObject* layout_object,
     AXObjectCacheImpl& ax_object_cache) {
-  return new AccessibilityMediaTimeDisplay(layout_object, ax_object_cache);
+  return MakeGarbageCollected<AccessibilityMediaTimeDisplay>(layout_object,
+                                                             ax_object_cache);
 }
 
 bool AccessibilityMediaTimeDisplay::ComputeAccessibilityIsIgnored(
diff --git a/third_party/blink/renderer/modules/accessibility/ax_media_controls.h b/third_party/blink/renderer/modules/accessibility/ax_media_controls.h
index 17f5f96..5299069 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_media_controls.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_media_controls.h
@@ -40,6 +40,8 @@
 class AccessibilityMediaControl : public AXLayoutObject {
  public:
   static AXObject* Create(LayoutObject*, AXObjectCacheImpl&);
+
+  AccessibilityMediaControl(LayoutObject*, AXObjectCacheImpl&);
   ~AccessibilityMediaControl() override = default;
 
   ax::mojom::Role RoleValue() const override;
@@ -58,7 +60,6 @@
   bool InternalClearAccessibilityFocusAction() override;
 
  protected:
-  AccessibilityMediaControl(LayoutObject*, AXObjectCacheImpl&);
   MediaControlElementType ControlType() const;
   bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const override;
 
@@ -68,6 +69,8 @@
 class AccessibilityMediaTimeline final : public AXSlider {
  public:
   static AXObject* Create(LayoutObject*, AXObjectCacheImpl&);
+
+  AccessibilityMediaTimeline(LayoutObject*, AXObjectCacheImpl&);
   ~AccessibilityMediaTimeline() override = default;
 
   String Description(ax::mojom::NameFrom,
@@ -75,14 +78,14 @@
                      AXObjectVector* description_objects) const override;
 
  private:
-  AccessibilityMediaTimeline(LayoutObject*, AXObjectCacheImpl&);
-
   DISALLOW_COPY_AND_ASSIGN(AccessibilityMediaTimeline);
 };
 
 class AccessibilityMediaVolumeSlider final : public AXSlider {
  public:
   static AXObject* Create(LayoutObject*, AXObjectCacheImpl&);
+
+  AccessibilityMediaVolumeSlider(LayoutObject*, AXObjectCacheImpl&);
   ~AccessibilityMediaVolumeSlider() override = default;
 
   String Description(ax::mojom::NameFrom,
@@ -93,8 +96,6 @@
   bool InternalClearAccessibilityFocusAction() override;
 
  private:
-  AccessibilityMediaVolumeSlider(LayoutObject*, AXObjectCacheImpl&);
-
   DISALLOW_COPY_AND_ASSIGN(AccessibilityMediaVolumeSlider);
 };
 
@@ -128,6 +129,8 @@
 class AccessibilityMediaTimeDisplay final : public AccessibilityMediaControl {
  public:
   static AXObject* Create(LayoutObject*, AXObjectCacheImpl&);
+
+  AccessibilityMediaTimeDisplay(LayoutObject*, AXObjectCacheImpl&);
   ~AccessibilityMediaTimeDisplay() override = default;
 
   ax::mojom::Role RoleValue() const override {
@@ -143,7 +146,6 @@
                          NameSources*) const override;
 
  private:
-  AccessibilityMediaTimeDisplay(LayoutObject*, AXObjectCacheImpl&);
   bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const override;
 
   DISALLOW_COPY_AND_ASSIGN(AccessibilityMediaTimeDisplay);
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 8db0b0c..9088532 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -2061,9 +2061,8 @@
   HTMLElement* html_element = nullptr;
   if (GetNode()->IsHTMLElement())
     html_element = ToHTMLElement(GetNode());
-  if (html_element && IsLabelableElement(html_element)) {
-    if (ToLabelableElement(html_element)->labels() &&
-        ToLabelableElement(html_element)->labels()->length() > 0)
+  if (html_element && html_element->IsLabelable()) {
+    if (html_element->labels() && html_element->labels()->length() > 0)
       return true;
   }
 
@@ -2693,7 +2692,7 @@
       name_sources->back().native_source = kAXTextFromNativeHTMLLabel;
     }
 
-    LabelsNodeList* labels = ToLabelableElement(html_element)->labels();
+    LabelsNodeList* labels = html_element->labels();
     if (labels && labels->length() > 0) {
       HeapVector<Member<Element>> label_elements;
       for (unsigned label_index = 0; label_index < labels->length();
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position_test.cc b/third_party/blink/renderer/modules/accessibility/ax_position_test.cc
index 2ebc65a..a0fb32e3 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_position_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_position_test.cc
@@ -70,7 +70,7 @@
     <p id="after">After virtual AOM node.</p>
     <script>
       let parent = document.getElementById("aomParent");
-      let node = new AccessibleNode();
+      let node = MakeGarbageCollected<AccessibleNode>();
       node.role = "button";
       node.label = "Button";
       parent.accessibleNode.appendChild(node);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
index 9a01cb2..c5877784 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
@@ -6,7 +6,6 @@
 
 #include "base/memory/ptr_util.h"
 #include "third_party/blink/renderer/core/html/forms/html_label_element.h"
-#include "third_party/blink/renderer/core/html/forms/labelable_element.h"
 
 namespace blink {
 
@@ -258,7 +257,7 @@
 }
 
 void AXRelationCache::LabelChanged(Node* node) {
-  if (LabelableElement* control = ToHTMLLabelElement(node)->control())
+  if (HTMLElement* control = ToHTMLLabelElement(node)->control())
     TextChanged(Get(control));
 }
 
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet.cc
index d6e0a46..dc930dc1 100644
--- a/third_party/blink/renderer/modules/animationworklet/animation_worklet.cc
+++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet.cc
@@ -44,7 +44,8 @@
   ProvideAnimationWorkletProxyClientTo(worker_clients, proxy_client);
 
   AnimationWorkletMessagingProxy* proxy =
-      new AnimationWorkletMessagingProxy(GetExecutionContext());
+      MakeGarbageCollected<AnimationWorkletMessagingProxy>(
+          GetExecutionContext());
   proxy->Initialize(worker_clients, ModuleResponsesMap());
   return proxy;
 }
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.cc
index b20356e..3067bd2 100644
--- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.cc
+++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.cc
@@ -39,7 +39,8 @@
 AnimationWorkletGlobalScope* AnimationWorkletGlobalScope::Create(
     std::unique_ptr<GlobalScopeCreationParams> creation_params,
     WorkerThread* thread) {
-  return new AnimationWorkletGlobalScope(std::move(creation_params), thread);
+  return MakeGarbageCollected<AnimationWorkletGlobalScope>(
+      std::move(creation_params), thread);
 }
 
 AnimationWorkletGlobalScope::AnimationWorkletGlobalScope(
@@ -191,7 +192,7 @@
     return;
 
   AnimatorDefinition* definition =
-      new AnimatorDefinition(isolate, constructor, animate);
+      MakeGarbageCollected<AnimatorDefinition>(isolate, constructor, animate);
 
   animator_definitions_.Set(name, definition);
 }
@@ -220,7 +221,8 @@
            .ToLocal(&instance))
     return nullptr;
 
-  return new Animator(isolate, definition, instance, num_effects);
+  return MakeGarbageCollected<Animator>(isolate, definition, instance,
+                                        num_effects);
 }
 
 AnimatorDefinition* AnimationWorkletGlobalScope::FindDefinitionForTest(
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.h b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.h
index 395ce9a..90c7d00 100644
--- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.h
+++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope.h
@@ -35,7 +35,11 @@
   static AnimationWorkletGlobalScope* Create(
       std::unique_ptr<GlobalScopeCreationParams>,
       WorkerThread*);
+
+  AnimationWorkletGlobalScope(std::unique_ptr<GlobalScopeCreationParams>,
+                              WorkerThread*);
   ~AnimationWorkletGlobalScope() override;
+
   void Trace(blink::Visitor*) override;
   void Dispose() override;
   bool IsAnimationWorkletGlobalScope() const final { return true; }
@@ -52,9 +56,6 @@
   unsigned GetAnimatorsSizeForTest() { return animators_.size(); }
 
  private:
-  AnimationWorkletGlobalScope(std::unique_ptr<GlobalScopeCreationParams>,
-                              WorkerThread*);
-
   void RegisterWithProxyClientIfNeeded();
   Animator* CreateInstance(const String& name,
                            WorkletAnimationOptions* options,
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc
index b168b93..d55db5a 100644
--- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc
+++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc
@@ -85,7 +85,8 @@
             document->AddressSpace(),
             OriginTrialContext::GetTokens(document).get(),
             base::UnguessableToken::Create(), nullptr /* worker_settings */,
-            kV8CacheOptionsDefault, new WorkletModuleResponsesMap),
+            kV8CacheOptionsDefault,
+            MakeGarbageCollected<WorkletModuleResponsesMap>()),
         base::nullopt, std::make_unique<WorkerDevToolsParams>(),
         ParentExecutionContextTaskRunners::Create());
     return thread;
@@ -439,7 +440,7 @@
 TEST_F(AnimationWorkletGlobalScopeTest,
        ShouldRegisterItselfAfterFirstAnimatorRegistration) {
   MockAnimationWorkletProxyClient* proxy_client =
-      new MockAnimationWorkletProxyClient();
+      MakeGarbageCollected<MockAnimationWorkletProxyClient>();
   std::unique_ptr<WorkerThread> worklet =
       CreateAnimationAndPaintWorkletThread(proxy_client);
   // Animation worklet global scope (AWGS) should not register itself upon
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.cc
index 2c9082e..8599532 100644
--- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.cc
+++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.cc
@@ -129,7 +129,7 @@
           document->GetWorkletAnimationController()
               .EnsureMainThreadMutatorDispatcher(&main_thread_host_queue);
 
-  return new AnimationWorkletProxyClient(
+  return MakeGarbageCollected<AnimationWorkletProxyClient>(
       scope_id, std::move(compositor_mutator_dispatcher),
       std::move(compositor_host_queue),
       std::move(main_thread_mutator_dispatcher),
diff --git a/third_party/blink/renderer/modules/animationworklet/animator.cc b/third_party/blink/renderer/modules/animationworklet/animator.cc
index a8c3fe61..a60ce96 100644
--- a/third_party/blink/renderer/modules/animationworklet/animator.cc
+++ b/third_party/blink/renderer/modules/animationworklet/animator.cc
@@ -19,7 +19,8 @@
                    int num_effects)
     : definition_(definition),
       instance_(isolate, instance),
-      group_effect_(new WorkletGroupEffectProxy(num_effects)) {
+      group_effect_(
+          MakeGarbageCollected<WorkletGroupEffectProxy>(num_effects)) {
   DCHECK_GE(num_effects, 1);
 }
 
diff --git a/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc b/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc
index 21c49031..c86f763 100644
--- a/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc
+++ b/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc
@@ -54,7 +54,7 @@
 
 CSSAnimationWorklet::CSSAnimationWorklet(Document* document)
     : ContextLifecycleObserver(document),
-      animation_worklet_(new AnimationWorklet(document)) {
+      animation_worklet_(MakeGarbageCollected<AnimationWorklet>(document)) {
   DCHECK(GetExecutionContext());
 }
 
diff --git a/third_party/blink/renderer/modules/app_banner/before_install_prompt_event.h b/third_party/blink/renderer/modules/app_banner/before_install_prompt_event.h
index 0d1a7ea..b0d2a217 100644
--- a/third_party/blink/renderer/modules/app_banner/before_install_prompt_event.h
+++ b/third_party/blink/renderer/modules/app_banner/before_install_prompt_event.h
@@ -36,6 +36,15 @@
   USING_GARBAGE_COLLECTED_MIXIN(BeforeInstallPromptEvent);
 
  public:
+  BeforeInstallPromptEvent(const AtomicString& name,
+                           LocalFrame&,
+                           mojom::blink::AppBannerServicePtr,
+                           mojom::blink::AppBannerEventRequest,
+                           const Vector<String>& platforms,
+                           bool require_gesture);
+  BeforeInstallPromptEvent(ExecutionContext*,
+                           const AtomicString& name,
+                           const BeforeInstallPromptEventInit*);
   ~BeforeInstallPromptEvent() override;
 
   static BeforeInstallPromptEvent* Create(
@@ -45,16 +54,17 @@
       mojom::blink::AppBannerEventRequest event_request,
       const Vector<String>& platforms,
       bool require_gesture) {
-    return new BeforeInstallPromptEvent(name, frame, std::move(service_ptr),
-                                        std::move(event_request), platforms,
-                                        require_gesture);
+    return MakeGarbageCollected<BeforeInstallPromptEvent>(
+        name, frame, std::move(service_ptr), std::move(event_request),
+        platforms, require_gesture);
   }
 
   static BeforeInstallPromptEvent* Create(
       ExecutionContext* execution_context,
       const AtomicString& name,
       const BeforeInstallPromptEventInit* init) {
-    return new BeforeInstallPromptEvent(execution_context, name, init);
+    return MakeGarbageCollected<BeforeInstallPromptEvent>(execution_context,
+                                                          name, init);
   }
 
   void Dispose();
@@ -72,16 +82,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  BeforeInstallPromptEvent(const AtomicString& name,
-                           LocalFrame&,
-                           mojom::blink::AppBannerServicePtr,
-                           mojom::blink::AppBannerEventRequest,
-                           const Vector<String>& platforms,
-                           bool require_gesture);
-  BeforeInstallPromptEvent(ExecutionContext*,
-                           const AtomicString& name,
-                           const BeforeInstallPromptEventInit*);
-
   // mojom::blink::AppBannerEvent methods:
   void BannerAccepted(const String& platform) override;
   void BannerDismissed() override;
diff --git a/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc b/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc
index 369c124..0b5f42a 100644
--- a/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc
+++ b/third_party/blink/renderer/modules/audio_output_devices/html_media_element_audio_output_device.cc
@@ -28,13 +28,13 @@
   static SetSinkIdResolver* Create(ScriptState*,
                                    HTMLMediaElement&,
                                    const String& sink_id);
+  SetSinkIdResolver(ScriptState*, HTMLMediaElement&, const String& sink_id);
   ~SetSinkIdResolver() override = default;
   void StartAsync();
 
   void Trace(blink::Visitor*) override;
 
  private:
-  SetSinkIdResolver(ScriptState*, HTMLMediaElement&, const String& sink_id);
   void TimerFired(TimerBase*);
 
   Member<HTMLMediaElement> element_;
@@ -46,7 +46,7 @@
                                              HTMLMediaElement& element,
                                              const String& sink_id) {
   SetSinkIdResolver* resolver =
-      new SetSinkIdResolver(script_state, element, sink_id);
+      MakeGarbageCollected<SetSinkIdResolver>(script_state, element, sink_id);
   resolver->PauseIfNeeded();
   resolver->KeepAliveWhilePending();
   return resolver;
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_bridge.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_bridge.cc
index fba9ac8..580b87f2 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_bridge.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_bridge.cc
@@ -23,7 +23,8 @@
           service_worker_registration);
 
   if (!bridge) {
-    bridge = new BackgroundFetchBridge(*service_worker_registration);
+    bridge = MakeGarbageCollected<BackgroundFetchBridge>(
+        *service_worker_registration);
     ProvideTo(*service_worker_registration, bridge);
   }
 
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_bridge.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_bridge.h
index 1ca427ab..eec4a73 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_bridge.h
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_bridge.h
@@ -44,6 +44,7 @@
 
   static BackgroundFetchBridge* From(ServiceWorkerRegistration* registration);
 
+  explicit BackgroundFetchBridge(ServiceWorkerRegistration& registration);
   virtual ~BackgroundFetchBridge();
 
   // Creates a new Background Fetch registration identified by |developer_id|
@@ -108,8 +109,6 @@
       mojom::blink::BackgroundFetchRegistrationObserverPtr observer);
 
  private:
-  explicit BackgroundFetchBridge(ServiceWorkerRegistration& registration);
-
   // Returns an initialized BackgroundFetchService*. A connection will be
   // established after the first call to this method.
   mojom::blink::BackgroundFetchService* GetService();
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h
index 5712e9f..abd6e52 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h
@@ -24,16 +24,21 @@
   static BackgroundFetchEvent* Create(
       const AtomicString& type,
       const BackgroundFetchEventInit* initializer) {
-    return new BackgroundFetchEvent(type, initializer, nullptr /* observer */);
+    return MakeGarbageCollected<BackgroundFetchEvent>(type, initializer,
+                                                      nullptr /* observer */);
   }
 
   static BackgroundFetchEvent* Create(
       const AtomicString& type,
       const BackgroundFetchEventInit* initializer,
       WaitUntilObserver* observer) {
-    return new BackgroundFetchEvent(type, initializer, observer);
+    return MakeGarbageCollected<BackgroundFetchEvent>(type, initializer,
+                                                      observer);
   }
 
+  BackgroundFetchEvent(const AtomicString& type,
+                       const BackgroundFetchEventInit* initializer,
+                       WaitUntilObserver* observer);
   ~BackgroundFetchEvent() override;
 
   // Web Exposed attribute defined in the IDL file.
@@ -45,10 +50,6 @@
   void Trace(blink::Visitor* visitor) override;
 
  protected:
-  BackgroundFetchEvent(const AtomicString& type,
-                       const BackgroundFetchEventInit* initializer,
-                       WaitUntilObserver* observer);
-
   // Corresponds to the 'registration' attribute in the idl.
   Member<BackgroundFetchRegistration> registration_;
 };
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader_test.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader_test.cc
index 13acb07..d521526 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader_test.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader_test.cc
@@ -38,7 +38,8 @@
 
 class BackgroundFetchIconLoaderTest : public PageTestBase {
  public:
-  BackgroundFetchIconLoaderTest() : loader_(new BackgroundFetchIconLoader()) {}
+  BackgroundFetchIconLoaderTest()
+      : loader_(MakeGarbageCollected<BackgroundFetchIconLoader>()) {}
   ~BackgroundFetchIconLoaderTest() override {
     loader_->Stop();
     platform_->GetURLLoaderMockFactory()
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
index bb8c162..5bcf096 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.cc
@@ -284,7 +284,8 @@
   mojom::blink::BackgroundFetchOptionsPtr options_ptr =
       mojom::blink::BackgroundFetchOptions::From(options);
   if (options->icons().size()) {
-    BackgroundFetchIconLoader* loader = new BackgroundFetchIconLoader();
+    BackgroundFetchIconLoader* loader =
+        MakeGarbageCollected<BackgroundFetchIconLoader>();
     loaders_.push_back(loader);
     loader->Start(
         bridge_.Get(), execution_context, options->icons(),
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.h
index 7001f931..bb52a78 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.h
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_manager.h
@@ -38,10 +38,12 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
+  explicit BackgroundFetchManager(ServiceWorkerRegistration* registration);
   ~BackgroundFetchManager() override = default;
+
   static BackgroundFetchManager* Create(
       ServiceWorkerRegistration* registration) {
-    return new BackgroundFetchManager(registration);
+    return MakeGarbageCollected<BackgroundFetchManager>(registration);
   }
 
   // Web Exposed methods defined in the IDL file.
@@ -62,8 +64,6 @@
  private:
   friend class BackgroundFetchManagerTest;
 
-  explicit BackgroundFetchManager(ServiceWorkerRegistration* registration);
-
   // Creates a vector of mojom::blink::FetchAPIRequestPtr objects for the given
   // set of |requests|, which can be either Request objects or URL strings.
   // |has_requests_with_body| will be set if any of the |requests| has a body.
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
index 282e58c..94619fb 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
@@ -5,8 +5,8 @@
 #include "third_party/blink/renderer/modules/background_fetch/background_fetch_registration.h"
 
 #include "base/optional.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/background_fetch/web_background_fetch_registration.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/fetch/request.h"
@@ -248,7 +248,8 @@
     BackgroundFetchRecord* record = nullptr;
     if (iter == records_.end()) {
       Request* request = Request::Create(script_state, *(fetch->request));
-      auto* new_record = new BackgroundFetchRecord(request, script_state);
+      auto* new_record =
+          MakeGarbageCollected<BackgroundFetchRecord>(request, script_state);
       DCHECK(new_record);
       records_.Set(request->url(), new_record);
 
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_type_converters.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_type_converters.cc
index ccde3bb8..410e8ce 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_type_converters.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_type_converters.cc
@@ -19,7 +19,7 @@
   if (!mojo_registration)
     return nullptr;
 
-  return new blink::BackgroundFetchRegistration(
+  return blink::MakeGarbageCollected<blink::BackgroundFetchRegistration>(
       mojo_registration->developer_id, mojo_registration->unique_id,
       mojo_registration->upload_total, mojo_registration->uploaded,
       mojo_registration->download_total, mojo_registration->downloaded,
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.cc
index 0ba5648..285f99ca 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.cc
@@ -83,7 +83,7 @@
                -1 /* ideal_to_chosen_icon_size */);
   } else {
     DCHECK(!loader_);
-    loader_ = new BackgroundFetchIconLoader();
+    loader_ = MakeGarbageCollected<BackgroundFetchIconLoader>();
     DCHECK(loader_);
     loader_->Start(BackgroundFetchBridge::From(service_worker_registration_),
                    ExecutionContext::From(script_state), ui_options->icons(),
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h
index c6baa7f..466aca5 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h
@@ -30,7 +30,8 @@
   static BackgroundFetchUpdateUIEvent* Create(
       const AtomicString& type,
       const BackgroundFetchEventInit* initializer) {
-    return new BackgroundFetchUpdateUIEvent(type, initializer);
+    return MakeGarbageCollected<BackgroundFetchUpdateUIEvent>(type,
+                                                              initializer);
   }
 
   static BackgroundFetchUpdateUIEvent* Create(
@@ -38,10 +39,16 @@
       const BackgroundFetchEventInit* initializer,
       WaitUntilObserver* observer,
       ServiceWorkerRegistration* registration) {
-    return new BackgroundFetchUpdateUIEvent(type, initializer, observer,
-                                            registration);
+    return MakeGarbageCollected<BackgroundFetchUpdateUIEvent>(
+        type, initializer, observer, registration);
   }
 
+  BackgroundFetchUpdateUIEvent(const AtomicString& type,
+                               const BackgroundFetchEventInit* initializer);
+  BackgroundFetchUpdateUIEvent(const AtomicString& type,
+                               const BackgroundFetchEventInit* init,
+                               WaitUntilObserver* observer,
+                               ServiceWorkerRegistration* registration);
   ~BackgroundFetchUpdateUIEvent() override;
 
   // Web Exposed method defined in the IDL file.
@@ -51,14 +58,6 @@
   void Trace(blink::Visitor* visitor) override;
 
  private:
-  BackgroundFetchUpdateUIEvent(const AtomicString& type,
-                               const BackgroundFetchEventInit* initializer);
-
-  BackgroundFetchUpdateUIEvent(const AtomicString& type,
-                               const BackgroundFetchEventInit* init,
-                               WaitUntilObserver* observer,
-                               ServiceWorkerRegistration* registration);
-
   void DidGetIcon(ScriptPromiseResolver* resolver,
                   const String& title,
                   const SkBitmap& icon,
diff --git a/third_party/blink/renderer/modules/battery/battery_manager.cc b/third_party/blink/renderer/modules/battery/battery_manager.cc
index b47d0a6..571abc4 100644
--- a/third_party/blink/renderer/modules/battery/battery_manager.cc
+++ b/third_party/blink/renderer/modules/battery/battery_manager.cc
@@ -14,7 +14,8 @@
 namespace blink {
 
 BatteryManager* BatteryManager::Create(ExecutionContext* context) {
-  BatteryManager* battery_manager = new BatteryManager(context);
+  BatteryManager* battery_manager =
+      MakeGarbageCollected<BatteryManager>(context);
   battery_manager->PauseIfNeeded();
   return battery_manager;
 }
diff --git a/third_party/blink/renderer/modules/battery/battery_manager.h b/third_party/blink/renderer/modules/battery/battery_manager.h
index 93b1acf..9330820 100644
--- a/third_party/blink/renderer/modules/battery/battery_manager.h
+++ b/third_party/blink/renderer/modules/battery/battery_manager.h
@@ -26,6 +26,8 @@
 
  public:
   static BatteryManager* Create(ExecutionContext*);
+
+  explicit BatteryManager(ExecutionContext*);
   ~BatteryManager() override;
 
   // Returns a promise object that will be resolved with this BatteryManager.
@@ -67,8 +69,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  explicit BatteryManager(ExecutionContext*);
-
   using BatteryProperty = ScriptPromiseProperty<Member<BatteryManager>,
                                                 Member<BatteryManager>,
                                                 Member<DOMException>>;
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth.h b/third_party/blink/renderer/modules/bluetooth/bluetooth.h
index 835ba811..0eb0092 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth.h
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth.h
@@ -22,7 +22,9 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static Bluetooth* Create() { return new Bluetooth(); }
+  static Bluetooth* Create() { return MakeGarbageCollected<Bluetooth>(); }
+
+  Bluetooth();
 
   // IDL exposed interface:
   ScriptPromise requestDevice(ScriptState*,
@@ -35,8 +37,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  Bluetooth();
-
   BluetoothDevice* GetBluetoothDeviceRepresentingDevice(
       mojom::blink::WebBluetoothDevicePtr,
       ScriptPromiseResolver*);
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_attribute_instance_map.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_attribute_instance_map.cc
index de0aa05..76c96872 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_attribute_instance_map.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_attribute_instance_map.cc
@@ -25,9 +25,9 @@
       service_id_to_object_.at(service_instance_id);
 
   if (!service) {
-    service =
-        new BluetoothRemoteGATTService(std::move(remote_gatt_service),
-                                       is_primary, device_instance_id, device_);
+    service = MakeGarbageCollected<BluetoothRemoteGATTService>(
+        std::move(remote_gatt_service), is_primary, device_instance_id,
+        device_);
     service_id_to_object_.insert(service_instance_id, service);
   }
 
@@ -74,8 +74,8 @@
   if (result)
     return result;
 
-  result =
-      new BluetoothRemoteGATTDescriptor(std::move(descriptor), characteristic);
+  result = MakeGarbageCollected<BluetoothRemoteGATTDescriptor>(
+      std::move(descriptor), characteristic);
   descriptor_id_to_object_.insert(instance_id, result);
   return result;
 }
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.cc
index 98b50684..041806dc 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.cc
@@ -8,7 +8,7 @@
 
 BluetoothCharacteristicProperties* BluetoothCharacteristicProperties::Create(
     uint32_t properties) {
-  return new BluetoothCharacteristicProperties(properties);
+  return MakeGarbageCollected<BluetoothCharacteristicProperties>(properties);
 }
 
 bool BluetoothCharacteristicProperties::broadcast() const {
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.h
index 43ccaba4..2159e69 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.h
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.h
@@ -18,6 +18,8 @@
  public:
   static BluetoothCharacteristicProperties* Create(uint32_t properties);
 
+  explicit BluetoothCharacteristicProperties(uint32_t properties);
+
   // IDL exposed interface:
   bool broadcast() const;
   bool read() const;
@@ -30,8 +32,6 @@
   bool writableAuxiliaries() const;
 
  private:
-  explicit BluetoothCharacteristicProperties(uint32_t properties);
-
   enum Property {
     kNone = 0,
     kBroadcast = 1 << 0,
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc
index dbc5644..0788622 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc
@@ -24,7 +24,8 @@
                                  mojom::blink::WebBluetoothDevicePtr device,
                                  Bluetooth* bluetooth)
     : ContextLifecycleObserver(context),
-      attribute_instance_map_(new BluetoothAttributeInstanceMap(this)),
+      attribute_instance_map_(
+          MakeGarbageCollected<BluetoothAttributeInstanceMap>(this)),
       device_(std::move(device)),
       gatt_(BluetoothRemoteGATTServer::Create(context, this)),
       bluetooth_(bluetooth) {}
@@ -34,8 +35,8 @@
     ScriptPromiseResolver* resolver,
     mojom::blink::WebBluetoothDevicePtr device,
     Bluetooth* bluetooth) {
-  return new BluetoothDevice(resolver->GetExecutionContext(), std::move(device),
-                             bluetooth);
+  return MakeGarbageCollected<BluetoothDevice>(resolver->GetExecutionContext(),
+                                               std::move(device), bluetooth);
 }
 
 BluetoothRemoteGATTService* BluetoothDevice::GetOrCreateRemoteGATTService(
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
index 5a77111..4c4363b 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
@@ -43,7 +43,7 @@
     mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr characteristic,
     BluetoothRemoteGATTService* service,
     BluetoothDevice* device) {
-  return new BluetoothRemoteGATTCharacteristic(
+  return MakeGarbageCollected<BluetoothRemoteGATTCharacteristic>(
       context, std::move(characteristic), service, device);
 }
 
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.cc
index 6e37ea0..af956437 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.cc
@@ -25,7 +25,8 @@
 
     BluetoothRemoteGATTCharacteristic* characteristic) {
   BluetoothRemoteGATTDescriptor* result =
-      new BluetoothRemoteGATTDescriptor(std::move(descriptor), characteristic);
+      MakeGarbageCollected<BluetoothRemoteGATTDescriptor>(std::move(descriptor),
+                                                          characteristic);
   return result;
 }
 
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.cc
index e371e82..b0a92505 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.cc
@@ -27,7 +27,7 @@
 BluetoothRemoteGATTServer* BluetoothRemoteGATTServer::Create(
     ExecutionContext* context,
     BluetoothDevice* device) {
-  return new BluetoothRemoteGATTServer(context, device);
+  return MakeGarbageCollected<BluetoothRemoteGATTServer>(context, device);
 }
 
 void BluetoothRemoteGATTServer::ContextDestroyed(ExecutionContext*) {
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
index 6c66628..582a091f 100644
--- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
+++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
@@ -44,7 +44,7 @@
         "Can't create BroadcastChannel in an opaque origin");
     return nullptr;
   }
-  return new BroadcastChannel(execution_context, name);
+  return MakeGarbageCollected<BroadcastChannel>(execution_context, name);
 }
 
 BroadcastChannel::~BroadcastChannel() = default;
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h
index 052a1f06..e399256 100644
--- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h
+++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h
@@ -29,6 +29,8 @@
   static BroadcastChannel* Create(ExecutionContext*,
                                   const String& name,
                                   ExceptionState&);
+
+  BroadcastChannel(ExecutionContext*, const String& name);
   ~BroadcastChannel() override;
   void Dispose();
 
@@ -54,8 +56,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  BroadcastChannel(ExecutionContext*, const String& name);
-
   // mojom::blink::BroadcastChannelClient:
   void OnMessage(BlinkCloneableMessage) override;
 
diff --git a/third_party/blink/renderer/modules/cache_storage/cache.cc b/third_party/blink/renderer/modules/cache_storage/cache.cc
index 9854d56..164593f 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache.cc
@@ -9,7 +9,7 @@
 #include "base/optional.h"
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
 #include "third_party/blink/public/common/cache_storage/cache_storage_utils.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/callback_promise_adapter.h"
 #include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
 #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h"
@@ -93,11 +93,24 @@
       const String& method_name,
       const HeapVector<Member<Request>>& requests,
       const ExceptionState& exception_state) {
-    FetchResolvedForAdd* self = new FetchResolvedForAdd(
+    FetchResolvedForAdd* self = MakeGarbageCollected<FetchResolvedForAdd>(
         script_state, cache, method_name, requests, exception_state);
     return self->BindToV8Function();
   }
 
+  FetchResolvedForAdd(ScriptState* script_state,
+                      Cache* cache,
+                      const String& method_name,
+                      const HeapVector<Member<Request>>& requests,
+                      const ExceptionState& exception_state)
+      : ScriptFunction(script_state),
+        cache_(cache),
+        method_name_(method_name),
+        requests_(requests),
+        context_type_(exception_state.Context()),
+        property_name_(exception_state.PropertyName()),
+        interface_name_(exception_state.InterfaceName()) {}
+
   ScriptValue Call(ScriptValue value) override {
     ExceptionState exception_state(GetScriptState()->GetIsolate(),
                                    context_type_, property_name_,
@@ -143,19 +156,6 @@
   }
 
  private:
-  FetchResolvedForAdd(ScriptState* script_state,
-                      Cache* cache,
-                      const String& method_name,
-                      const HeapVector<Member<Request>>& requests,
-                      const ExceptionState& exception_state)
-      : ScriptFunction(script_state),
-        cache_(cache),
-        method_name_(method_name),
-        requests_(requests),
-        context_type_(exception_state.Context()),
-        property_name_(exception_state.PropertyName()),
-        interface_name_(exception_state.InterfaceName()) {}
-
   Member<Cache> cache_;
   const String method_name_;
   HeapVector<Member<Request>> requests_;
@@ -440,7 +440,7 @@
 Cache* Cache::Create(
     GlobalFetch::ScopedFetcher* fetcher,
     mojom::blink::CacheStorageCacheAssociatedPtrInfo cache_ptr_info) {
-  return new Cache(fetcher, std::move(cache_ptr_info));
+  return MakeGarbageCollected<Cache>(fetcher, std::move(cache_ptr_info));
 }
 
 ScriptPromise Cache::match(ScriptState* script_state,
@@ -805,7 +805,8 @@
   ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
   const ScriptPromise promise = resolver->Promise();
   BarrierCallbackForPut* barrier_callback =
-      new BarrierCallbackForPut(requests.size(), this, method_name, resolver);
+      MakeGarbageCollected<BarrierCallbackForPut>(requests.size(), this,
+                                                  method_name, resolver);
 
   for (wtf_size_t i = 0; i < requests.size(); ++i) {
     KURL url(NullURL(), requests[i]->url());
@@ -849,8 +850,8 @@
       FetchDataLoader* loader = FetchDataLoader::CreateLoaderAsArrayBuffer();
       buffer->StartLoading(
           loader,
-          new CodeCacheHandleCallbackForPut(script_state, i, barrier_callback,
-                                            requests[i], responses[i]),
+          MakeGarbageCollected<CodeCacheHandleCallbackForPut>(
+              script_state, i, barrier_callback, requests[i], responses[i]),
           exception_state);
       if (exception_state.HadException()) {
         barrier_callback->OnError("Could not inspect response body state");
@@ -865,7 +866,7 @@
       FetchDataLoader* loader = FetchDataLoader::CreateLoaderAsBlobHandle(
           responses[i]->InternalMIMEType());
       buffer->StartLoading(loader,
-                           new BlobHandleCallbackForPut(
+                           MakeGarbageCollected<BlobHandleCallbackForPut>(
                                i, barrier_callback, requests[i], responses[i]),
                            exception_state);
       if (exception_state.HadException()) {
diff --git a/third_party/blink/renderer/modules/cache_storage/cache.h b/third_party/blink/renderer/modules/cache_storage/cache.h
index 935145f..a1d5b8b 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache.h
+++ b/third_party/blink/renderer/modules/cache_storage/cache.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include "base/macros.h"
 
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/fetch/global_fetch.h"
 #include "third_party/blink/renderer/modules/cache_storage/cache_query_options.h"
@@ -34,6 +34,9 @@
   static Cache* Create(GlobalFetch::ScopedFetcher*,
                        mojom::blink::CacheStorageCacheAssociatedPtrInfo);
 
+  Cache(GlobalFetch::ScopedFetcher*,
+        mojom::blink::CacheStorageCacheAssociatedPtrInfo);
+
   // From Cache.idl:
   ScriptPromise match(ScriptState*,
                       const RequestInfo&,
@@ -72,8 +75,6 @@
   class CodeCacheHandleCallbackForPut;
   class FetchResolvedForAdd;
   friend class FetchResolvedForAdd;
-  Cache(GlobalFetch::ScopedFetcher*,
-        mojom::blink::CacheStorageCacheAssociatedPtrInfo);
 
   ScriptPromise MatchImpl(ScriptState*,
                           const Request*,
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage.cc b/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
index 7277c56..f7838c5 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
@@ -25,7 +25,7 @@
 
 CacheStorage* CacheStorage::Create(ExecutionContext* context,
                                    GlobalFetch::ScopedFetcher* fetcher) {
-  return new CacheStorage(context, fetcher);
+  return MakeGarbageCollected<CacheStorage>(context, fetcher);
 }
 
 ScriptPromise CacheStorage::open(ScriptState* script_state,
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage.h b/third_party/blink/renderer/modules/cache_storage/cache_storage.h
index 86c9623..38bf54e 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage.h
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 #include "base/macros.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/fetch/global_fetch.h"
 #include "third_party/blink/renderer/modules/cache_storage/cache.h"
@@ -25,6 +25,8 @@
 
  public:
   static CacheStorage* Create(ExecutionContext*, GlobalFetch::ScopedFetcher*);
+
+  CacheStorage(ExecutionContext*, GlobalFetch::ScopedFetcher*);
   ~CacheStorage() override;
 
   ScriptPromise open(ScriptState*, const String& cache_name);
@@ -39,7 +41,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  CacheStorage(ExecutionContext*, GlobalFetch::ScopedFetcher*);
   ScriptPromise MatchImpl(ScriptState*,
                           const Request*,
                           const CacheQueryOptions*);
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
index 7ecd2d0..31e8413 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/renderer/modules/cache_storage/cache_storage_error.h"
 
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/cache_storage/cache.h"
 
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.h b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.h
index 515fe9de..a2befd1 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.h
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_CACHE_STORAGE_CACHE_STORAGE_ERROR_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_CACHE_STORAGE_CACHE_STORAGE_ERROR_H_
 
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_test.cc b/third_party/blink/renderer/modules/cache_storage/cache_test.cc
index 349032c..45d4dc6 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_test.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache_test.cc
@@ -13,7 +13,7 @@
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/public/platform/web_url_response.h"
 #include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
 #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h"
@@ -54,7 +54,11 @@
   USING_GARBAGE_COLLECTED_MIXIN(ScopedFetcherForTests);
 
  public:
-  static ScopedFetcherForTests* Create() { return new ScopedFetcherForTests(); }
+  static ScopedFetcherForTests* Create() {
+    return MakeGarbageCollected<ScopedFetcherForTests>();
+  }
+
+  ScopedFetcherForTests() : fetch_count_(0), expected_url_(nullptr) {}
 
   ScriptPromise Fetch(ScriptState* script_state,
                       const RequestInfo& request_info,
@@ -98,8 +102,6 @@
   }
 
  private:
-  ScopedFetcherForTests() : fetch_count_(0), expected_url_(nullptr) {}
-
   int fetch_count_;
   const String* expected_url_;
   Member<Response> response_;
@@ -328,18 +330,18 @@
   class UnreachableFunction : public ScriptFunction {
    public:
     static v8::Local<v8::Function> Create(ScriptState* script_state) {
-      UnreachableFunction* self = new UnreachableFunction(script_state);
+      UnreachableFunction* self =
+          MakeGarbageCollected<UnreachableFunction>(script_state);
       return self->BindToV8Function();
     }
 
+    UnreachableFunction(ScriptState* script_state)
+        : ScriptFunction(script_state) {}
+
     ScriptValue Call(ScriptValue value) override {
       ADD_FAILURE() << "Unexpected call to a null ScriptFunction.";
       return value;
     }
-
-   private:
-    UnreachableFunction(ScriptState* script_state)
-        : ScriptFunction(script_state) {}
   };
 
   // A ScriptFunction that saves its parameter; used by tests to assert on
@@ -348,10 +350,14 @@
    public:
     static v8::Local<v8::Function> Create(ScriptState* script_state,
                                           ScriptValue* out_value) {
-      TestFunction* self = new TestFunction(script_state, out_value);
+      TestFunction* self =
+          MakeGarbageCollected<TestFunction>(script_state, out_value);
       return self->BindToV8Function();
     }
 
+    TestFunction(ScriptState* script_state, ScriptValue* out_value)
+        : ScriptFunction(script_state), value_(out_value) {}
+
     ScriptValue Call(ScriptValue value) override {
       DCHECK(!value.IsEmpty());
       *value_ = value;
@@ -359,9 +365,6 @@
     }
 
    private:
-    TestFunction(ScriptState* script_state, ScriptValue* out_value)
-        : ScriptFunction(script_state), value_(out_value) {}
-
     ScriptValue* value_;
   };
 
@@ -767,9 +770,9 @@
   Request* request = NewRequestFromUrl(url);
   Response* response = Response::Create(
       GetScriptState(),
-      new BodyStreamBuffer(GetScriptState(),
-                           MakeGarbageCollected<FormDataBytesConsumer>(content),
-                           nullptr),
+      MakeGarbageCollected<BodyStreamBuffer>(
+          GetScriptState(),
+          MakeGarbageCollected<FormDataBytesConsumer>(content), nullptr),
       content_type, ResponseInit::Create(), exception_state);
   fetcher->SetResponse(response);
 
diff --git a/third_party/blink/renderer/modules/cache_storage/global_cache_storage.cc b/third_party/blink/renderer/modules/cache_storage/global_cache_storage.cc
index 25d412d..8862b88 100644
--- a/third_party/blink/renderer/modules/cache_storage/global_cache_storage.cc
+++ b/third_party/blink/renderer/modules/cache_storage/global_cache_storage.cc
@@ -31,12 +31,13 @@
     GlobalCacheStorageImpl* supplement =
         Supplement<T>::template From<GlobalCacheStorageImpl>(supplementable);
     if (!supplement) {
-      supplement = new GlobalCacheStorageImpl;
+      supplement = MakeGarbageCollected<GlobalCacheStorageImpl>();
       Supplement<T>::ProvideTo(supplementable, supplement);
     }
     return *supplement;
   }
 
+  GlobalCacheStorageImpl() = default;
   ~GlobalCacheStorageImpl() {}
 
   CacheStorage* Caches(T& fetching_scope, ExceptionState& exception_state) {
@@ -81,8 +82,6 @@
   }
 
  private:
-  GlobalCacheStorageImpl() = default;
-
   Member<CacheStorage> caches_;
 };
 
diff --git a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
index ce51f53..3d51676 100644
--- a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
+++ b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
@@ -11,7 +11,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
 #include "third_party/blink/public/platform/web_string.h"
diff --git a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.h b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.h
index e0bba93..0abe47b 100644
--- a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.h
+++ b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h"
 #include "third_party/blink/renderer/core/inspector/protocol/CacheStorage.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h
index 0a69b63..06e5d27 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_state.h
@@ -52,7 +52,7 @@
   static CanvasRenderingContext2DState* Create(
       const CanvasRenderingContext2DState& other,
       ClipListCopyMode mode) {
-    return new CanvasRenderingContext2DState(other, mode);
+    return MakeGarbageCollected<CanvasRenderingContext2DState>(other, mode);
   }
 
   // FontSelectorClient implementation
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc
index 8ef0837..cdc8740 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.cc
@@ -100,12 +100,12 @@
 
 CanvasStyle* CanvasStyle::CreateFromGradient(CanvasGradient* gradient) {
   DCHECK(gradient);
-  return new CanvasStyle(gradient);
+  return MakeGarbageCollected<CanvasStyle>(gradient);
 }
 
 CanvasStyle* CanvasStyle::CreateFromPattern(CanvasPattern* pattern) {
   DCHECK(pattern);
-  return new CanvasStyle(pattern);
+  return MakeGarbageCollected<CanvasStyle>(pattern);
 }
 
 void CanvasStyle::ApplyToFlags(PaintFlags& flags) const {
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.h b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.h
index 504d0ba..c5c55670 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.h
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_style.h
@@ -42,11 +42,15 @@
 class CanvasStyle final : public GarbageCollected<CanvasStyle> {
  public:
   static CanvasStyle* CreateFromRGBA(RGBA32 rgba) {
-    return new CanvasStyle(rgba);
+    return MakeGarbageCollected<CanvasStyle>(rgba);
   }
   static CanvasStyle* CreateFromGradient(CanvasGradient*);
   static CanvasStyle* CreateFromPattern(CanvasPattern*);
 
+  CanvasStyle(RGBA32);
+  CanvasStyle(CanvasGradient*);
+  CanvasStyle(CanvasPattern*);
+
   String GetColor() const {
     DCHECK_EQ(type_, kColorRGBA);
     return Color(rgba_).Serialized();
@@ -66,10 +70,6 @@
  private:
   enum Type { kColorRGBA, kGradient, kImagePattern };
 
-  CanvasStyle(RGBA32);
-  CanvasStyle(CanvasGradient*);
-  CanvasStyle(CanvasPattern*);
-
   Type type_;
   RGBA32 rgba_;
 
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
index 1378ca9..f7a72d6 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
@@ -42,7 +42,8 @@
 using mojom::PageVisibilityState;
 
 ScriptPromise ClipboardPromise::CreateForRead(ScriptState* script_state) {
-  ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+  ClipboardPromise* clipboard_promise =
+      MakeGarbageCollected<ClipboardPromise>(script_state);
   clipboard_promise->GetTaskRunner()->PostTask(
       FROM_HERE, WTF::Bind(&ClipboardPromise::HandleRead,
                            WrapPersistent(clipboard_promise)));
@@ -50,7 +51,8 @@
 }
 
 ScriptPromise ClipboardPromise::CreateForReadText(ScriptState* script_state) {
-  ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+  ClipboardPromise* clipboard_promise =
+      MakeGarbageCollected<ClipboardPromise>(script_state);
   clipboard_promise->GetTaskRunner()->PostTask(
       FROM_HERE, WTF::Bind(&ClipboardPromise::HandleReadText,
                            WrapPersistent(clipboard_promise)));
@@ -59,7 +61,8 @@
 
 ScriptPromise ClipboardPromise::CreateForWrite(ScriptState* script_state,
                                                DataTransfer* data) {
-  ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+  ClipboardPromise* clipboard_promise =
+      MakeGarbageCollected<ClipboardPromise>(script_state);
   clipboard_promise->GetTaskRunner()->PostTask(
       FROM_HERE,
       WTF::Bind(&ClipboardPromise::HandleWrite,
@@ -69,7 +72,8 @@
 
 ScriptPromise ClipboardPromise::CreateForWriteText(ScriptState* script_state,
                                                    const String& data) {
-  ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+  ClipboardPromise* clipboard_promise =
+      MakeGarbageCollected<ClipboardPromise>(script_state);
   clipboard_promise->GetTaskRunner()->PostTask(
       FROM_HERE, WTF::Bind(&ClipboardPromise::HandleWriteText,
                            WrapPersistent(clipboard_promise), data));
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_promise.h b/third_party/blink/renderer/modules/clipboard/clipboard_promise.h
index e009bf4e..3c22e82 100644
--- a/third_party/blink/renderer/modules/clipboard/clipboard_promise.h
+++ b/third_party/blink/renderer/modules/clipboard/clipboard_promise.h
@@ -23,6 +23,7 @@
   WTF_MAKE_NONCOPYABLE(ClipboardPromise);
 
  public:
+  ClipboardPromise(ScriptState*);
   virtual ~ClipboardPromise() = default;
 
   static ScriptPromise CreateForRead(ScriptState*);
@@ -33,8 +34,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  ClipboardPromise(ScriptState*);
-
   scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner();
   mojom::blink::PermissionService* GetPermissionService();
 
diff --git a/third_party/blink/renderer/modules/clipboard/navigator_clipboard.cc b/third_party/blink/renderer/modules/clipboard/navigator_clipboard.cc
index dd69cee..6042a93 100644
--- a/third_party/blink/renderer/modules/clipboard/navigator_clipboard.cc
+++ b/third_party/blink/renderer/modules/clipboard/navigator_clipboard.cc
@@ -32,10 +32,10 @@
 
 NavigatorClipboard::NavigatorClipboard(Navigator& navigator)
     : Supplement<Navigator>(navigator) {
-  clipboard_ =
-      new Clipboard(GetSupplementable()->GetFrame()
-                        ? GetSupplementable()->GetFrame()->GetDocument()
-                        : nullptr);
+  clipboard_ = MakeGarbageCollected<Clipboard>(
+      GetSupplementable()->GetFrame()
+          ? GetSupplementable()->GetFrame()->GetDocument()
+          : nullptr);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/contacts_picker/navigator_contacts.cc b/third_party/blink/renderer/modules/contacts_picker/navigator_contacts.cc
index 006c354a..d8e04c3c 100644
--- a/third_party/blink/renderer/modules/contacts_picker/navigator_contacts.cc
+++ b/third_party/blink/renderer/modules/contacts_picker/navigator_contacts.cc
@@ -31,7 +31,7 @@
 
 ContactsManager* NavigatorContacts::contacts() {
   if (!contacts_manager_)
-    contacts_manager_ = new ContactsManager();
+    contacts_manager_ = MakeGarbageCollected<ContactsManager>();
   return contacts_manager_;
 }
 
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h b/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h
index 910e49a7..c473dfbe7 100644
--- a/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h
+++ b/third_party/blink/renderer/modules/cookie_store/cookie_change_event.h
@@ -20,7 +20,9 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static CookieChangeEvent* Create() { return new CookieChangeEvent(); }
+  static CookieChangeEvent* Create() {
+    return MakeGarbageCollected<CookieChangeEvent>();
+  }
 
   // Used by Blink.
   //
@@ -29,15 +31,22 @@
   static CookieChangeEvent* Create(const AtomicString& type,
                                    HeapVector<Member<CookieListItem>> changed,
                                    HeapVector<Member<CookieListItem>> deleted) {
-    return new CookieChangeEvent(type, std::move(changed), std::move(deleted));
+    return MakeGarbageCollected<CookieChangeEvent>(type, std::move(changed),
+                                                   std::move(deleted));
   }
 
   // Used by JavaScript, via the V8 bindings.
   static CookieChangeEvent* Create(const AtomicString& type,
                                    const CookieChangeEventInit* initializer) {
-    return new CookieChangeEvent(type, initializer);
+    return MakeGarbageCollected<CookieChangeEvent>(type, initializer);
   }
 
+  CookieChangeEvent();
+  CookieChangeEvent(const AtomicString& type,
+                    HeapVector<Member<CookieListItem>> changed,
+                    HeapVector<Member<CookieListItem>> deleted);
+  CookieChangeEvent(const AtomicString& type,
+                    const CookieChangeEventInit* initializer);
   ~CookieChangeEvent() override;
 
   const HeapVector<Member<CookieListItem>>& changed() const { return changed_; }
@@ -60,13 +69,6 @@
                           HeapVector<Member<CookieListItem>>& deleted);
 
  private:
-  CookieChangeEvent();
-  CookieChangeEvent(const AtomicString& type,
-                    HeapVector<Member<CookieListItem>> changed,
-                    HeapVector<Member<CookieListItem>> deleted);
-  CookieChangeEvent(const AtomicString& type,
-                    const CookieChangeEventInit* initializer);
-
   HeapVector<Member<CookieListItem>> changed_;
   HeapVector<Member<CookieListItem>> deleted_;
 };
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_store.h b/third_party/blink/renderer/modules/cookie_store/cookie_store.h
index 3eb76bf..26f28a5b9 100644
--- a/third_party/blink/renderer/modules/cookie_store/cookie_store.h
+++ b/third_party/blink/renderer/modules/cookie_store/cookie_store.h
@@ -34,6 +34,9 @@
   USING_GARBAGE_COLLECTED_MIXIN(CookieStore);
 
  public:
+  CookieStore(ExecutionContext*,
+              network::mojom::blink::RestrictedCookieManagerPtr backend,
+              blink::mojom::blink::CookieStorePtr subscription_backend);
   // Needed because of the network::mojom::blink::RestrictedCookieManagerPtr
   ~CookieStore() override;
 
@@ -41,8 +44,8 @@
       ExecutionContext* execution_context,
       network::mojom::blink::RestrictedCookieManagerPtr backend,
       blink::mojom::blink::CookieStorePtr subscription_backend) {
-    return new CookieStore(execution_context, std::move(backend),
-                           std::move(subscription_backend));
+    return MakeGarbageCollected<CookieStore>(
+        execution_context, std::move(backend), std::move(subscription_backend));
   }
 
   ScriptPromise getAll(ScriptState*, const String& name, ExceptionState&);
@@ -102,10 +105,6 @@
   using DoReadBackendResultConverter =
       void (*)(ScriptPromiseResolver*, const Vector<WebCanonicalCookie>&);
 
-  CookieStore(ExecutionContext*,
-              network::mojom::blink::RestrictedCookieManagerPtr backend,
-              blink::mojom::blink::CookieStorePtr subscription_backend);
-
   // Common code in CookieStore::{get,getAll}.
   //
   // All cookie-reading methods use the same RestrictedCookieManager API, and
diff --git a/third_party/blink/renderer/modules/credentialmanager/authenticator_assertion_response.cc b/third_party/blink/renderer/modules/credentialmanager/authenticator_assertion_response.cc
index 75a3817..d0439a8e 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authenticator_assertion_response.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/authenticator_assertion_response.cc
@@ -11,7 +11,7 @@
     DOMArrayBuffer* authenticator_data,
     DOMArrayBuffer* signature,
     DOMArrayBuffer* user_handle) {
-  return new AuthenticatorAssertionResponse(
+  return MakeGarbageCollected<AuthenticatorAssertionResponse>(
       client_data_json, authenticator_data, signature, user_handle);
 }
 
diff --git a/third_party/blink/renderer/modules/credentialmanager/authenticator_assertion_response.h b/third_party/blink/renderer/modules/credentialmanager/authenticator_assertion_response.h
index be369cd..358816ef 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authenticator_assertion_response.h
+++ b/third_party/blink/renderer/modules/credentialmanager/authenticator_assertion_response.h
@@ -23,6 +23,10 @@
       DOMArrayBuffer* signature,
       DOMArrayBuffer* user_handle);
 
+  explicit AuthenticatorAssertionResponse(DOMArrayBuffer* client_data_json,
+                                          DOMArrayBuffer* authenticator_data,
+                                          DOMArrayBuffer* signature,
+                                          DOMArrayBuffer* user_handle);
   ~AuthenticatorAssertionResponse() override;
 
   DOMArrayBuffer* authenticatorData() const {
@@ -36,10 +40,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  explicit AuthenticatorAssertionResponse(DOMArrayBuffer* client_data_json,
-                                          DOMArrayBuffer* authenticator_data,
-                                          DOMArrayBuffer* signature,
-                                          DOMArrayBuffer* user_handle);
   const Member<DOMArrayBuffer> authenticator_data_;
   const Member<DOMArrayBuffer> signature_;
   const Member<DOMArrayBuffer> user_handle_;
diff --git a/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.cc b/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.cc
index e7b9e67b..0d8e967 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.cc
@@ -12,7 +12,7 @@
     DOMArrayBuffer* client_data_json,
     DOMArrayBuffer* attestation_object,
     Vector<mojom::AuthenticatorTransport> transports) {
-  return new AuthenticatorAttestationResponse(
+  return MakeGarbageCollected<AuthenticatorAttestationResponse>(
       client_data_json, attestation_object, std::move(transports));
 }
 
diff --git a/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.h b/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.h
index c0ffb0c..98309d2 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.h
+++ b/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.h
@@ -25,6 +25,10 @@
       DOMArrayBuffer* attestation_object,
       Vector<mojom::AuthenticatorTransport> transports);
 
+  AuthenticatorAttestationResponse(
+      DOMArrayBuffer* client_data_json,
+      DOMArrayBuffer* attestation_object,
+      Vector<mojom::AuthenticatorTransport> transports);
   ~AuthenticatorAttestationResponse() override;
 
   DOMArrayBuffer* attestationObject() const {
@@ -36,11 +40,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AuthenticatorAttestationResponse(
-      DOMArrayBuffer* client_data_json,
-      DOMArrayBuffer* attestation_object,
-      Vector<mojom::AuthenticatorTransport> transports);
-
   const Member<DOMArrayBuffer> attestation_object_;
   const Vector<mojom::AuthenticatorTransport> transports_;
 };
diff --git a/third_party/blink/renderer/modules/credentialmanager/authenticator_response.cc b/third_party/blink/renderer/modules/credentialmanager/authenticator_response.cc
index d874e2a..014ae32 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authenticator_response.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/authenticator_response.cc
@@ -8,7 +8,7 @@
 
 AuthenticatorResponse* AuthenticatorResponse::Create(
     DOMArrayBuffer* client_data_json) {
-  return new AuthenticatorResponse(client_data_json);
+  return MakeGarbageCollected<AuthenticatorResponse>(client_data_json);
 }
 
 AuthenticatorResponse::AuthenticatorResponse(DOMArrayBuffer* client_data_json)
diff --git a/third_party/blink/renderer/modules/credentialmanager/authenticator_response.h b/third_party/blink/renderer/modules/credentialmanager/authenticator_response.h
index 8a99424f..2fb89f7 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authenticator_response.h
+++ b/third_party/blink/renderer/modules/credentialmanager/authenticator_response.h
@@ -18,15 +18,13 @@
  public:
   static AuthenticatorResponse* Create(DOMArrayBuffer* client_data_json);
 
+  explicit AuthenticatorResponse(DOMArrayBuffer* client_data_json);
   ~AuthenticatorResponse() override;
 
   DOMArrayBuffer* clientDataJSON() const { return client_data_json_.Get(); }
 
   void Trace(blink::Visitor*) override;
 
- protected:
-  explicit AuthenticatorResponse(DOMArrayBuffer* client_data_json);
-
  private:
   const Member<DOMArrayBuffer> client_data_json_;
 };
diff --git a/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.cc b/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.cc
index aa6950e..0245d2c 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.cc
@@ -27,7 +27,7 @@
   auto* supplement =
       Supplement<Document>::From<CredentialManagerProxy>(document);
   if (!supplement) {
-    supplement = new CredentialManagerProxy(document);
+    supplement = MakeGarbageCollected<CredentialManagerProxy>(document);
     ProvideTo(document, supplement);
   }
   return supplement;
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
index a2e73b67..19fa7db 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
@@ -417,7 +417,7 @@
 }  // namespace
 
 CredentialsContainer* CredentialsContainer::Create() {
-  return new CredentialsContainer();
+  return MakeGarbageCollected<CredentialsContainer>();
 }
 
 CredentialsContainer::CredentialsContainer() = default;
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container.h b/third_party/blink/renderer/modules/credentialmanager/credentials_container.h
index 0c82cc6..78eae04 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credentials_container.h
+++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container.h
@@ -24,6 +24,8 @@
  public:
   static CredentialsContainer* Create();
 
+  CredentialsContainer();
+
   // CredentialsContainer.idl
   ScriptPromise get(ScriptState*, const CredentialRequestOptions*);
   ScriptPromise store(ScriptState*, Credential* = nullptr);
@@ -31,9 +33,6 @@
                        const CredentialCreationOptions*,
                        ExceptionState&);
   ScriptPromise preventSilentAccess(ScriptState*);
-
- private:
-  CredentialsContainer();
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/crypto/crypto.h b/third_party/blink/renderer/modules/crypto/crypto.h
index 8d9affb..e65387d 100644
--- a/third_party/blink/renderer/modules/crypto/crypto.h
+++ b/third_party/blink/renderer/modules/crypto/crypto.h
@@ -42,7 +42,9 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static Crypto* Create() { return new Crypto(); }
+  static Crypto* Create() { return MakeGarbageCollected<Crypto>(); }
+
+  Crypto() = default;
 
   NotShared<DOMArrayBufferView> getRandomValues(NotShared<DOMArrayBufferView>,
                                                 ExceptionState&);
@@ -52,8 +54,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  Crypto() = default;
-
   Member<SubtleCrypto> subtle_crypto_;
 };
 
diff --git a/third_party/blink/renderer/modules/crypto/crypto_key.h b/third_party/blink/renderer/modules/crypto/crypto_key.h
index 2595637..5ad7246 100644
--- a/third_party/blink/renderer/modules/crypto/crypto_key.h
+++ b/third_party/blink/renderer/modules/crypto/crypto_key.h
@@ -48,9 +48,10 @@
 
  public:
   static CryptoKey* Create(const WebCryptoKey& key) {
-    return new CryptoKey(key);
+    return MakeGarbageCollected<CryptoKey>(key);
   }
 
+  explicit CryptoKey(const WebCryptoKey&);
   ~CryptoKey() override;
 
   String type() const;
@@ -73,8 +74,6 @@
                              CryptoResult*);
 
  protected:
-  explicit CryptoKey(const WebCryptoKey&);
-
   const WebCryptoKey key_;
 };
 
diff --git a/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc b/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
index 91e9cb5..42055a9 100644
--- a/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
+++ b/third_party/blink/renderer/modules/crypto/crypto_result_impl.cc
@@ -65,12 +65,15 @@
  public:
   static Resolver* Create(ScriptState* script_state, CryptoResultImpl* result) {
     DCHECK(script_state->ContextIsValid());
-    Resolver* resolver = new Resolver(script_state, result);
+    Resolver* resolver = MakeGarbageCollected<Resolver>(script_state, result);
     resolver->PauseIfNeeded();
     resolver->KeepAliveWhilePending();
     return resolver;
   }
 
+  Resolver(ScriptState* script_state, CryptoResultImpl* result)
+      : ScriptPromiseResolver(script_state), result_(result) {}
+
   void ContextDestroyed(ExecutionContext* destroyed_context) override {
     result_->Cancel();
     result_ = nullptr;
@@ -83,9 +86,6 @@
   }
 
  private:
-  Resolver(ScriptState* script_state, CryptoResultImpl* result)
-      : ScriptPromiseResolver(script_state), result_(result) {}
-
   Member<CryptoResultImpl> result_;
 };
 
@@ -141,7 +141,7 @@
 }
 
 CryptoResultImpl* CryptoResultImpl::Create(ScriptState* script_state) {
-  return new CryptoResultImpl(script_state);
+  return MakeGarbageCollected<CryptoResultImpl>(script_state);
 }
 
 void CryptoResultImpl::CompleteWithError(WebCryptoErrorType error_type,
diff --git a/third_party/blink/renderer/modules/crypto/crypto_result_impl.h b/third_party/blink/renderer/modules/crypto/crypto_result_impl.h
index f404121..4c08467 100644
--- a/third_party/blink/renderer/modules/crypto/crypto_result_impl.h
+++ b/third_party/blink/renderer/modules/crypto/crypto_result_impl.h
@@ -57,6 +57,7 @@
  public:
   static CryptoResultImpl* Create(ScriptState*);
 
+  explicit CryptoResultImpl(ScriptState*);
   ~CryptoResultImpl() override;
 
   void CompleteWithError(WebCryptoErrorType, const WebString&) override;
@@ -93,8 +94,6 @@
     int cancelled_;
   };
 
-  explicit CryptoResultImpl(ScriptState*);
-
   void Cancel();
   void ClearResolver();
 
diff --git a/third_party/blink/renderer/modules/csspaint/paint_worklet.cc b/third_party/blink/renderer/modules/csspaint/paint_worklet.cc
index 62ef724e..47a1691 100644
--- a/third_party/blink/renderer/modules/csspaint/paint_worklet.cc
+++ b/third_party/blink/renderer/modules/csspaint/paint_worklet.cc
@@ -40,7 +40,8 @@
 PaintWorklet::PaintWorklet(LocalFrame* frame)
     : Worklet(frame->GetDocument()),
       Supplement<LocalDOMWindow>(*frame->DomWindow()),
-      pending_generator_registry_(new PaintWorkletPendingGeneratorRegistry) {}
+      pending_generator_registry_(
+          MakeGarbageCollected<PaintWorkletPendingGeneratorRegistry>()) {}
 
 PaintWorklet::~PaintWorklet() = default;
 
diff --git a/third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope_test.cc b/third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope_test.cc
index 8efc318..60b4911a 100644
--- a/third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope_test.cc
+++ b/third_party/blink/renderer/modules/csspaint/paint_worklet_global_scope_test.cc
@@ -68,7 +68,8 @@
             document->AddressSpace(),
             OriginTrialContext::GetTokens(document).get(),
             base::UnguessableToken::Create(), nullptr /* worker_settings */,
-            kV8CacheOptionsDefault, new WorkletModuleResponsesMap),
+            kV8CacheOptionsDefault,
+            MakeGarbageCollected<WorkletModuleResponsesMap>()),
         base::nullopt, std::make_unique<WorkerDevToolsParams>(),
         ParentExecutionContextTaskRunners::Create());
     return thread;
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc b/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
index 62e5dba..ab5734d3 100644
--- a/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
+++ b/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
@@ -157,8 +157,8 @@
     return nullptr;
   }
 
-  return new TextDecoderStream(script_state, encoding, options,
-                               exception_state);
+  return MakeGarbageCollected<TextDecoderStream>(script_state, encoding,
+                                                 options, exception_state);
 }
 
 TextDecoderStream::~TextDecoderStream() = default;
@@ -193,7 +193,8 @@
                                       "Cannot queue task to retain wrapper");
     return;
   }
-  transform_->Init(new Transformer(script_state, encoding, fatal_, ignore_bom_),
+  transform_->Init(MakeGarbageCollected<Transformer>(script_state, encoding,
+                                                     fatal_, ignore_bom_),
                    script_state, exception_state);
 }
 
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder_stream.h b/third_party/blink/renderer/modules/encoding/text_decoder_stream.h
index bbfa4d4..59941cc 100644
--- a/third_party/blink/renderer/modules/encoding/text_decoder_stream.h
+++ b/third_party/blink/renderer/modules/encoding/text_decoder_stream.h
@@ -34,6 +34,11 @@
                                    const String& label,
                                    const TextDecoderOptions*,
                                    ExceptionState&);
+
+  TextDecoderStream(ScriptState*,
+                    const WTF::TextEncoding&,
+                    const TextDecoderOptions*,
+                    ExceptionState&);
   ~TextDecoderStream() override;
 
   // From text_decoder_stream.idl
@@ -48,11 +53,6 @@
  private:
   class Transformer;
 
-  TextDecoderStream(ScriptState*,
-                    const WTF::TextEncoding&,
-                    const TextDecoderOptions*,
-                    ExceptionState&);
-
   const TraceWrapperMember<TransformStream> transform_;
   const WTF::TextEncoding encoding_;
   const bool fatal_;
diff --git a/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc b/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc
index cedf987b..5d827fc 100644
--- a/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc
+++ b/third_party/blink/renderer/modules/encoding/text_encoder_stream.cc
@@ -161,7 +161,7 @@
 
 TextEncoderStream* TextEncoderStream::Create(ScriptState* script_state,
                                              ExceptionState& exception_state) {
-  return new TextEncoderStream(script_state, exception_state);
+  return MakeGarbageCollected<TextEncoderStream>(script_state, exception_state);
 }
 
 TextEncoderStream::~TextEncoderStream() = default;
@@ -191,8 +191,8 @@
                                       "Cannot queue task to retain wrapper");
     return;
   }
-  transform_->Init(new Transformer(script_state), script_state,
-                   exception_state);
+  transform_->Init(MakeGarbageCollected<Transformer>(script_state),
+                   script_state, exception_state);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/encoding/text_encoder_stream.h b/third_party/blink/renderer/modules/encoding/text_encoder_stream.h
index 1e344002..561f25c 100644
--- a/third_party/blink/renderer/modules/encoding/text_encoder_stream.h
+++ b/third_party/blink/renderer/modules/encoding/text_encoder_stream.h
@@ -29,6 +29,8 @@
 
  public:
   static TextEncoderStream* Create(ScriptState*, ExceptionState&);
+
+  TextEncoderStream(ScriptState*, ExceptionState&);
   ~TextEncoderStream() override;
 
   // From text_encoder_stream.idl
@@ -41,8 +43,6 @@
  private:
   class Transformer;
 
-  TextEncoderStream(ScriptState*, ExceptionState&);
-
   const TraceWrapperMember<TransformStream> transform_;
 
   DISALLOW_COPY_AND_ASSIGN(TextEncoderStream);
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.cc b/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.cc
index 2f518b1a..2c6ab31 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_system_access.cc
@@ -160,9 +160,9 @@
   WebMediaKeySystemConfiguration configuration = access_->GetConfiguration();
 
   // 1. Let promise be a new promise.
-  NewCdmResultPromise* helper =
-      new NewCdmResultPromise(script_state, configuration.session_types,
-                              "MediaKeySystemAccess", "createMediaKeys");
+  NewCdmResultPromise* helper = MakeGarbageCollected<NewCdmResultPromise>(
+      script_state, configuration.session_types, "MediaKeySystemAccess",
+      "createMediaKeys");
   ScriptPromise promise = helper->Promise();
 
   // 2. Asynchronously create and initialize the MediaKeys object.
diff --git a/third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.cc b/third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.cc
index 9ac6db76..a9b3915 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.cc
@@ -346,8 +346,8 @@
 
   // 5. Let promise be a new promise.
   MediaKeySystemAccessInitializer* initializer =
-      new MediaKeySystemAccessInitializer(script_state, key_system,
-                                          supported_configurations);
+      MakeGarbageCollected<MediaKeySystemAccessInitializer>(
+          script_state, key_system, supported_configurations);
   ScriptPromise promise = initializer->Promise();
 
   // 6. Asynchronously determine support, and if allowed, create and
diff --git a/third_party/blink/renderer/modules/eventsource/event_source_parser_test.cc b/third_party/blink/renderer/modules/eventsource/event_source_parser_test.cc
index ab1db0f..bc5f78e 100644
--- a/third_party/blink/renderer/modules/eventsource/event_source_parser_test.cc
+++ b/third_party/blink/renderer/modules/eventsource/event_source_parser_test.cc
@@ -376,7 +376,7 @@
 }
 
 TEST(EventSourceParserStoppingTest, StopWhileParsing) {
-  StoppingClient* client = new StoppingClient();
+  StoppingClient* client = MakeGarbageCollected<StoppingClient>();
   EventSourceParser* parser =
       MakeGarbageCollected<EventSourceParser>(AtomicString(), client);
   client->SetParser(parser);
diff --git a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.h b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.h
index 4c6dee1..342b79c 100644
--- a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.h
+++ b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.h
@@ -34,7 +34,7 @@
 #include <memory>
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "services/service_manager/public/mojom/interface_provider.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/public/web/web_embedded_worker.h"
 #include "third_party/blink/public/web/web_embedded_worker_start_data.h"
 #include "third_party/blink/renderer/core/exported/worker_shadow_page.h"
diff --git a/third_party/blink/renderer/modules/filesystem/dom_file_system_sync.cc b/third_party/blink/renderer/modules/filesystem/dom_file_system_sync.cc
index ef664f7d..014c2e1 100644
--- a/third_party/blink/renderer/modules/filesystem/dom_file_system_sync.cc
+++ b/third_party/blink/renderer/modules/filesystem/dom_file_system_sync.cc
@@ -79,16 +79,17 @@
  public:
   class CreateFileResult : public GarbageCollected<CreateFileResult> {
    public:
-    static CreateFileResult* Create() { return new CreateFileResult(); }
+    static CreateFileResult* Create() {
+      return MakeGarbageCollected<CreateFileResult>();
+    }
+
+    CreateFileResult() : failed_(false), error_(base::File::FILE_OK) {}
 
     bool failed_;
     base::File::Error error_;
     Member<File> file_;
 
     void Trace(blink::Visitor* visitor) { visitor->Trace(file_); }
-
-   private:
-    CreateFileResult() : failed_(false), error_(base::File::FILE_OK) {}
   };
 
   static std::unique_ptr<AsyncFileSystemCallbacks> Create(
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_base_handle.cc b/third_party/blink/renderer/modules/filesystem/file_system_base_handle.cc
index c6c2d052..985793b 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_base_handle.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_base_handle.cc
@@ -52,9 +52,10 @@
 ScriptPromise FileSystemBaseHandle::remove(ScriptState* script_state) {
   auto* resolver = ScriptPromiseResolver::Create(script_state);
   ScriptPromise result = resolver->Promise();
-  filesystem()->Remove(this,
-                       new VoidCallbacks::OnDidSucceedPromiseImpl(resolver),
-                       MakeGarbageCollected<PromiseErrorCallback>(resolver));
+  filesystem()->Remove(
+      this,
+      MakeGarbageCollected<VoidCallbacks::OnDidSucceedPromiseImpl>(resolver),
+      MakeGarbageCollected<PromiseErrorCallback>(resolver));
   return result;
 }
 
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc b/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc
index 2afc8215..0be01e92 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc
@@ -59,7 +59,8 @@
   LocalFileSystem::From(*context)->RequestFileSystem(
       context, mojom::blink::FileSystemType::kTemporary, /*size=*/0,
       FileSystemCallbacks::Create(
-          new FileSystemCallbacks::OnDidOpenFileSystemPromiseImpl(resolver),
+          MakeGarbageCollected<
+              FileSystemCallbacks::OnDidOpenFileSystemPromiseImpl>(resolver),
           MakeGarbageCollected<PromiseErrorCallback>(resolver), context,
           mojom::blink::FileSystemType::kTemporary),
       LocalFileSystem::kAsynchronous);
@@ -75,7 +76,8 @@
 }  // namespace
 
 ScriptValue FileSystemDirectoryHandle::getEntries(ScriptState* script_state) {
-  auto* iterator = new FileSystemDirectoryIterator(filesystem(), fullPath());
+  auto* iterator = MakeGarbageCollected<FileSystemDirectoryIterator>(
+      filesystem(), fullPath());
   auto* isolate = script_state->GetIsolate();
   auto context = script_state->GetContext();
   v8::Local<v8::Object> result = v8::Object::New(isolate);
@@ -95,7 +97,8 @@
   auto* resolver = ScriptPromiseResolver::Create(script_state);
   ScriptPromise result = resolver->Promise();
   filesystem()->RemoveRecursively(
-      this, new VoidCallbacks::OnDidSucceedPromiseImpl(resolver),
+      this,
+      MakeGarbageCollected<VoidCallbacks::OnDidSucceedPromiseImpl>(resolver),
       MakeGarbageCollected<PromiseErrorCallback>(resolver));
   return result;
 }
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_file_handle.cc b/third_party/blink/renderer/modules/filesystem/file_system_file_handle.cc
index 95e9823..7a7b14082 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_file_handle.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_file_handle.cc
@@ -70,7 +70,7 @@
           file_system_url,
           SnapshotFileCallback::Create(
               filesystem(), name(), file_system_url,
-              new OnDidCreateSnapshotFilePromise(resolver),
+              MakeGarbageCollected<OnDidCreateSnapshotFilePromise>(resolver),
               MakeGarbageCollected<PromiseErrorCallback>(resolver),
               ExecutionContext::From(script_state)));
   return result;
diff --git a/third_party/blink/renderer/modules/filesystem/local_file_system.cc b/third_party/blink/renderer/modules/filesystem/local_file_system.cc
index b08ad89..2c90374 100644
--- a/third_party/blink/renderer/modules/filesystem/local_file_system.cc
+++ b/third_party/blink/renderer/modules/filesystem/local_file_system.cc
@@ -85,7 +85,8 @@
     const KURL& file_system_url,
     std::unique_ptr<AsyncFileSystemCallbacks> callbacks,
     SynchronousType type) {
-  CallbackWrapper* wrapper = new CallbackWrapper(std::move(callbacks));
+  CallbackWrapper* wrapper =
+      MakeGarbageCollected<CallbackWrapper>(std::move(callbacks));
   RequestFileSystemAccessInternal(
       context,
       WTF::Bind(&LocalFileSystem::ResolveURLInternal,
@@ -102,7 +103,8 @@
     long long size,
     std::unique_ptr<AsyncFileSystemCallbacks> callbacks,
     SynchronousType sync_type) {
-  CallbackWrapper* wrapper = new CallbackWrapper(std::move(callbacks));
+  CallbackWrapper* wrapper =
+      MakeGarbageCollected<CallbackWrapper>(std::move(callbacks));
   RequestFileSystemAccessInternal(
       context,
       WTF::Bind(&LocalFileSystem::FileSystemAllowedInternal,
diff --git a/third_party/blink/renderer/modules/filesystem/sync_callback_helper.h b/third_party/blink/renderer/modules/filesystem/sync_callback_helper.h
index 805ce4c2..89aa7d3 100644
--- a/third_party/blink/renderer/modules/filesystem/sync_callback_helper.h
+++ b/third_party/blink/renderer/modules/filesystem/sync_callback_helper.h
@@ -53,7 +53,7 @@
   void Trace(blink::Visitor* visitor) { visitor->Trace(result_); }
 
   SuccessCallback* GetSuccessCallback() {
-    return new SuccessCallbackImpl(this);
+    return MakeGarbageCollected<SuccessCallbackImpl>(this);
   }
   ErrorCallbackBase* GetErrorCallback() {
     return MakeGarbageCollected<ErrorCallbackImpl>(this);
@@ -71,6 +71,9 @@
  private:
   class SuccessCallbackImpl final : public SuccessCallback {
    public:
+    explicit SuccessCallbackImpl(DOMFileSystemCallbacksSyncHelper* helper)
+        : helper_(helper) {}
+
     void Trace(blink::Visitor* visitor) override {
       visitor->Trace(helper_);
       SuccessCallback::Trace(visitor);
@@ -81,8 +84,6 @@
     }
 
    private:
-    explicit SuccessCallbackImpl(DOMFileSystemCallbacksSyncHelper* helper)
-        : helper_(helper) {}
     Member<DOMFileSystemCallbacksSyncHelper> helper_;
 
     friend class DOMFileSystemCallbacksSyncHelper;
diff --git a/third_party/blink/renderer/modules/gamepad/gamepad_axis_event.h b/third_party/blink/renderer/modules/gamepad/gamepad_axis_event.h
index 09edeea..d97b0aa 100644
--- a/third_party/blink/renderer/modules/gamepad/gamepad_axis_event.h
+++ b/third_party/blink/renderer/modules/gamepad/gamepad_axis_event.h
@@ -21,13 +21,21 @@
                                   Gamepad* gamepad,
                                   uint32_t axis,
                                   double value) {
-    return new GamepadAxisEvent(type, bubbles, cancelable, gamepad, axis,
-                                value);
+    return MakeGarbageCollected<GamepadAxisEvent>(type, bubbles, cancelable,
+                                                  gamepad, axis, value);
   }
   static GamepadAxisEvent* Create(const AtomicString& type,
                                   const GamepadAxisEventInit* initializer) {
-    return new GamepadAxisEvent(type, initializer);
+    return MakeGarbageCollected<GamepadAxisEvent>(type, initializer);
   }
+
+  GamepadAxisEvent(const AtomicString& type,
+                   Bubbles,
+                   Cancelable,
+                   Gamepad*,
+                   uint32_t axis,
+                   double value);
+  GamepadAxisEvent(const AtomicString&, const GamepadAxisEventInit*);
   ~GamepadAxisEvent() override;
 
   uint32_t getAxis() const { return axis_; }
@@ -36,14 +44,6 @@
   const AtomicString& InterfaceName() const override;
 
  private:
-  GamepadAxisEvent(const AtomicString& type,
-                   Bubbles,
-                   Cancelable,
-                   Gamepad*,
-                   uint32_t axis,
-                   double value);
-  GamepadAxisEvent(const AtomicString&, const GamepadAxisEventInit*);
-
   uint32_t axis_ = 0;
   double value_ = 0.0;
 };
diff --git a/third_party/blink/renderer/modules/gamepad/gamepad_button_event.h b/third_party/blink/renderer/modules/gamepad/gamepad_button_event.h
index 0ad4ac9..60efaf6 100644
--- a/third_party/blink/renderer/modules/gamepad/gamepad_button_event.h
+++ b/third_party/blink/renderer/modules/gamepad/gamepad_button_event.h
@@ -22,13 +22,21 @@
                                     Gamepad* gamepad,
                                     uint32_t button,
                                     double value) {
-    return new GamepadButtonEvent(type, bubbles, cancelable, gamepad, button,
-                                  value);
+    return MakeGarbageCollected<GamepadButtonEvent>(type, bubbles, cancelable,
+                                                    gamepad, button, value);
   }
   static GamepadButtonEvent* Create(const AtomicString& type,
                                     const GamepadButtonEventInit* initializer) {
-    return new GamepadButtonEvent(type, initializer);
+    return MakeGarbageCollected<GamepadButtonEvent>(type, initializer);
   }
+
+  GamepadButtonEvent(const AtomicString& type,
+                     Bubbles,
+                     Cancelable,
+                     Gamepad*,
+                     uint32_t button,
+                     double value);
+  GamepadButtonEvent(const AtomicString&, const GamepadButtonEventInit*);
   ~GamepadButtonEvent() override;
 
   uint32_t getButton() const { return button_; }
@@ -37,14 +45,6 @@
   const AtomicString& InterfaceName() const override;
 
  private:
-  GamepadButtonEvent(const AtomicString& type,
-                     Bubbles,
-                     Cancelable,
-                     Gamepad*,
-                     uint32_t button,
-                     double value);
-  GamepadButtonEvent(const AtomicString&, const GamepadButtonEventInit*);
-
   uint32_t button_ = 0;
   double value_ = 0.0;
 };
diff --git a/third_party/blink/renderer/modules/geolocation/coordinates.h b/third_party/blink/renderer/modules/geolocation/coordinates.h
index 216c348..6a5281a 100644
--- a/third_party/blink/renderer/modules/geolocation/coordinates.h
+++ b/third_party/blink/renderer/modules/geolocation/coordinates.h
@@ -47,21 +47,12 @@
                              double heading,
                              bool provides_speed,
                              double speed) {
-    return new Coordinates(latitude, longitude, provides_altitude, altitude,
-                           accuracy, provides_altitude_accuracy,
-                           altitude_accuracy, provides_heading, heading,
-                           provides_speed, speed);
+    return MakeGarbageCollected<Coordinates>(
+        latitude, longitude, provides_altitude, altitude, accuracy,
+        provides_altitude_accuracy, altitude_accuracy, provides_heading,
+        heading, provides_speed, speed);
   }
 
-  double latitude() const { return latitude_; }
-  double longitude() const { return longitude_; }
-  double altitude(bool& is_null) const;
-  double accuracy() const { return accuracy_; }
-  double altitudeAccuracy(bool& is_null) const;
-  double heading(bool& is_null) const;
-  double speed(bool& is_null) const;
-
- private:
   Coordinates(double latitude,
               double longitude,
               bool provides_altitude,
@@ -85,6 +76,15 @@
         can_provide_heading_(provides_heading),
         can_provide_speed_(provides_speed) {}
 
+  double latitude() const { return latitude_; }
+  double longitude() const { return longitude_; }
+  double altitude(bool& is_null) const;
+  double accuracy() const { return accuracy_; }
+  double altitudeAccuracy(bool& is_null) const;
+  double heading(bool& is_null) const;
+  double speed(bool& is_null) const;
+
+ private:
   double latitude_;
   double longitude_;
   double altitude_;
diff --git a/third_party/blink/renderer/modules/indexeddb/global_indexed_db.cc b/third_party/blink/renderer/modules/indexeddb/global_indexed_db.cc
index c967e423..ea3e68c 100644
--- a/third_party/blink/renderer/modules/indexeddb/global_indexed_db.cc
+++ b/third_party/blink/renderer/modules/indexeddb/global_indexed_db.cc
@@ -27,12 +27,14 @@
     GlobalIndexedDBImpl* supplement =
         Supplement<T>::template From<GlobalIndexedDBImpl>(supplementable);
     if (!supplement) {
-      supplement = new GlobalIndexedDBImpl;
+      supplement = MakeGarbageCollected<GlobalIndexedDBImpl>();
       Supplement<T>::ProvideTo(supplementable, supplement);
     }
     return *supplement;
   }
 
+  GlobalIndexedDBImpl() = default;
+
   IDBFactory* IdbFactory(T& fetching_scope) {
     if (!idb_factory_)
       idb_factory_ = IDBFactory::Create();
@@ -45,8 +47,6 @@
   }
 
  private:
-  GlobalIndexedDBImpl() = default;
-
   Member<IDBFactory> idb_factory_;
 };
 
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory_test.cc b/third_party/blink/renderer/modules/indexeddb/idb_factory_test.cc
index 7cdb287..e85a4d4f 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_factory_test.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_factory_test.cc
@@ -29,14 +29,15 @@
  public:
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
                                                 bool* called_flag) {
-    auto* self = new TestHelperFunction(script_state, called_flag);
+    auto* self =
+        MakeGarbageCollected<TestHelperFunction>(script_state, called_flag);
     return self->BindToV8Function();
   }
 
- private:
   TestHelperFunction(ScriptState* script_state, bool* called_flag)
       : ScriptFunction(script_state), called_flag_(called_flag) {}
 
+ private:
   ScriptValue Call(ScriptValue value) override {
     *called_flag_ = true;
     return value;
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
index 7f2f23d..6ca28fb 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_object_store.cc
@@ -695,21 +695,11 @@
       int64_t transaction_id,
       int64_t object_store_id,
       scoped_refptr<const IDBIndexMetadata> index_metadata) {
-    return new IndexPopulator(script_state, database, transaction_id,
-                              object_store_id, std::move(index_metadata));
+    return MakeGarbageCollected<IndexPopulator>(script_state, database,
+                                                transaction_id, object_store_id,
+                                                std::move(index_metadata));
   }
 
-  bool operator==(const EventListener& other) const override {
-    return this == &other;
-  }
-
-  void Trace(blink::Visitor* visitor) override {
-    visitor->Trace(script_state_);
-    visitor->Trace(database_);
-    EventListener::Trace(visitor);
-  }
-
- private:
   IndexPopulator(ScriptState* script_state,
                  IDBDatabase* database,
                  int64_t transaction_id,
@@ -724,6 +714,17 @@
     DCHECK(index_metadata_.get());
   }
 
+  bool operator==(const EventListener& other) const override {
+    return this == &other;
+  }
+
+  void Trace(blink::Visitor* visitor) override {
+    visitor->Trace(script_state_);
+    visitor->Trace(database_);
+    EventListener::Trace(visitor);
+  }
+
+ private:
   const IDBIndexMetadata& IndexMetadata() const { return *index_metadata_; }
 
   void Invoke(ExecutionContext* execution_context, Event* event) override {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc b/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc
index 07539781..369ba1d3 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction_test.cc
@@ -64,15 +64,13 @@
 class FakeIDBDatabaseCallbacks final : public IDBDatabaseCallbacks {
  public:
   static FakeIDBDatabaseCallbacks* Create() {
-    return new FakeIDBDatabaseCallbacks();
+    return MakeGarbageCollected<FakeIDBDatabaseCallbacks>();
   }
+  FakeIDBDatabaseCallbacks() = default;
   void OnVersionChange(int64_t old_version, int64_t new_version) override {}
   void OnForcedClose() override {}
   void OnAbort(int64_t transaction_id, DOMException* error) override {}
   void OnComplete(int64_t transaction_id) override {}
-
- private:
-  FakeIDBDatabaseCallbacks() = default;
 };
 
 class IDBTransactionTest : public testing::Test {
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
index 5cf1906..9e7af3a 100644
--- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
+++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
@@ -114,10 +114,16 @@
   static GetDatabaseNamesCallback* Create(
       std::unique_ptr<RequestDatabaseNamesCallback> request_callback,
       const String& security_origin) {
-    return new GetDatabaseNamesCallback(std::move(request_callback),
-                                        security_origin);
+    return MakeGarbageCollected<GetDatabaseNamesCallback>(
+        std::move(request_callback), security_origin);
   }
 
+  GetDatabaseNamesCallback(
+      std::unique_ptr<RequestDatabaseNamesCallback> request_callback,
+      const String& security_origin)
+      : EventListener(EventListener::kCPPEventListenerType),
+        request_callback_(std::move(request_callback)),
+        security_origin_(security_origin) {}
   ~GetDatabaseNamesCallback() override = default;
 
   bool operator==(const EventListener& other) const override {
@@ -147,12 +153,6 @@
   }
 
  private:
-  GetDatabaseNamesCallback(
-      std::unique_ptr<RequestDatabaseNamesCallback> request_callback,
-      const String& security_origin)
-      : EventListener(EventListener::kCPPEventListenerType),
-        request_callback_(std::move(request_callback)),
-        security_origin_(security_origin) {}
   std::unique_ptr<RequestDatabaseNamesCallback> request_callback_;
   String security_origin_;
 };
@@ -164,9 +164,15 @@
   static DeleteCallback* Create(
       std::unique_ptr<DeleteDatabaseCallback> request_callback,
       const String& security_origin) {
-    return new DeleteCallback(std::move(request_callback), security_origin);
+    return MakeGarbageCollected<DeleteCallback>(std::move(request_callback),
+                                                security_origin);
   }
 
+  DeleteCallback(std::unique_ptr<DeleteDatabaseCallback> request_callback,
+                 const String& security_origin)
+      : EventListener(EventListener::kCPPEventListenerType),
+        request_callback_(std::move(request_callback)),
+        security_origin_(security_origin) {}
   ~DeleteCallback() override = default;
 
   bool operator==(const EventListener& other) const override {
@@ -183,11 +189,6 @@
   }
 
  private:
-  DeleteCallback(std::unique_ptr<DeleteDatabaseCallback> request_callback,
-                 const String& security_origin)
-      : EventListener(EventListener::kCPPEventListenerType),
-        request_callback_(std::move(request_callback)),
-        security_origin_(security_origin) {}
   std::unique_ptr<DeleteDatabaseCallback> request_callback_;
   String security_origin_;
 };
@@ -261,9 +262,16 @@
   static OpenDatabaseCallback* Create(
       ExecutableWithDatabase<RequestCallback>* executable_with_database,
       ScriptState* script_state) {
-    return new OpenDatabaseCallback(executable_with_database, script_state);
+    return MakeGarbageCollected<OpenDatabaseCallback>(executable_with_database,
+                                                      script_state);
   }
 
+  OpenDatabaseCallback(
+      ExecutableWithDatabase<RequestCallback>* executable_with_database,
+      ScriptState* script_state)
+      : EventListener(EventListener::kCPPEventListenerType),
+        executable_with_database_(executable_with_database),
+        script_state_(script_state) {}
   ~OpenDatabaseCallback() override = default;
 
   bool operator==(const EventListener& other) const override {
@@ -298,12 +306,6 @@
   }
 
  private:
-  OpenDatabaseCallback(
-      ExecutableWithDatabase<RequestCallback>* executable_with_database,
-      ScriptState* script_state)
-      : EventListener(EventListener::kCPPEventListenerType),
-        executable_with_database_(executable_with_database),
-        script_state_(script_state) {}
   scoped_refptr<ExecutableWithDatabase<RequestCallback>>
       executable_with_database_;
   Member<ScriptState> script_state_;
@@ -314,9 +316,14 @@
  public:
   static UpgradeDatabaseCallback* Create(
       ExecutableWithDatabase<RequestCallback>* executable_with_database) {
-    return new UpgradeDatabaseCallback(executable_with_database);
+    return MakeGarbageCollected<UpgradeDatabaseCallback>(
+        executable_with_database);
   }
 
+  UpgradeDatabaseCallback(
+      ExecutableWithDatabase<RequestCallback>* executable_with_database)
+      : EventListener(EventListener::kCPPEventListenerType),
+        executable_with_database_(executable_with_database) {}
   ~UpgradeDatabaseCallback() override = default;
 
   bool operator==(const EventListener& other) const override {
@@ -342,10 +349,6 @@
   }
 
  private:
-  UpgradeDatabaseCallback(
-      ExecutableWithDatabase<RequestCallback>* executable_with_database)
-      : EventListener(EventListener::kCPPEventListenerType),
-        executable_with_database_(executable_with_database) {}
   scoped_refptr<ExecutableWithDatabase<RequestCallback>>
       executable_with_database_;
 };
@@ -550,11 +553,24 @@
       std::unique_ptr<RequestDataCallback> request_callback,
       int skip_count,
       unsigned page_size) {
-    return new OpenCursorCallback(v8_session, script_state,
-                                  std::move(request_callback), skip_count,
-                                  page_size);
+    return MakeGarbageCollected<OpenCursorCallback>(v8_session, script_state,
+                                                    std::move(request_callback),
+                                                    skip_count, page_size);
   }
 
+  OpenCursorCallback(v8_inspector::V8InspectorSession* v8_session,
+                     ScriptState* script_state,
+                     std::unique_ptr<RequestDataCallback> request_callback,
+                     int skip_count,
+                     unsigned page_size)
+      : EventListener(EventListener::kCPPEventListenerType),
+        v8_session_(v8_session),
+        script_state_(script_state),
+        request_callback_(std::move(request_callback)),
+        skip_count_(skip_count),
+        page_size_(page_size) {
+    result_ = Array<DataEntry>::create();
+  }
   ~OpenCursorCallback() override = default;
 
   bool operator==(const EventListener& other) const override {
@@ -640,20 +656,6 @@
   }
 
  private:
-  OpenCursorCallback(v8_inspector::V8InspectorSession* v8_session,
-                     ScriptState* script_state,
-                     std::unique_ptr<RequestDataCallback> request_callback,
-                     int skip_count,
-                     unsigned page_size)
-      : EventListener(EventListener::kCPPEventListenerType),
-        v8_session_(v8_session),
-        script_state_(script_state),
-        request_callback_(std::move(request_callback)),
-        skip_count_(skip_count),
-        page_size_(page_size) {
-    result_ = Array<DataEntry>::create();
-  }
-
   v8_inspector::V8InspectorSession* v8_session_;
   Member<ScriptState> script_state_;
   std::unique_ptr<RequestDataCallback> request_callback_;
@@ -968,9 +970,14 @@
  public:
   static ClearObjectStoreListener* Create(
       std::unique_ptr<ClearObjectStoreCallback> request_callback) {
-    return new ClearObjectStoreListener(std::move(request_callback));
+    return MakeGarbageCollected<ClearObjectStoreListener>(
+        std::move(request_callback));
   }
 
+  ClearObjectStoreListener(
+      std::unique_ptr<ClearObjectStoreCallback> request_callback)
+      : EventListener(EventListener::kCPPEventListenerType),
+        request_callback_(std::move(request_callback)) {}
   ~ClearObjectStoreListener() override = default;
 
   bool operator==(const EventListener& other) const override {
@@ -987,11 +994,6 @@
   }
 
  private:
-  ClearObjectStoreListener(
-      std::unique_ptr<ClearObjectStoreCallback> request_callback)
-      : EventListener(EventListener::kCPPEventListenerType),
-        request_callback_(std::move(request_callback)) {}
-
   std::unique_ptr<ClearObjectStoreCallback> request_callback_;
 };
 
diff --git a/third_party/blink/renderer/modules/locks/navigator_locks.cc b/third_party/blink/renderer/modules/locks/navigator_locks.cc
index 2ee6981..6a6f3261 100644
--- a/third_party/blink/renderer/modules/locks/navigator_locks.cc
+++ b/third_party/blink/renderer/modules/locks/navigator_locks.cc
@@ -29,12 +29,14 @@
     NavigatorLocksImpl* supplement = static_cast<NavigatorLocksImpl*>(
         Supplement<T>::template From<NavigatorLocksImpl>(navigator));
     if (!supplement) {
-      supplement = new NavigatorLocksImpl(navigator);
+      supplement = MakeGarbageCollected<NavigatorLocksImpl>(navigator);
       Supplement<T>::ProvideTo(navigator, supplement);
     }
     return *supplement;
   }
 
+  explicit NavigatorLocksImpl(T& navigator) : Supplement<T>(navigator) {}
+
   LockManager* GetLockManager(ExecutionContext* context) const {
     if (!lock_manager_ && context) {
       lock_manager_ = MakeGarbageCollected<LockManager>(context);
@@ -52,8 +54,6 @@
   }
 
  private:
-  explicit NavigatorLocksImpl(T& navigator) : Supplement<T>(navigator) {}
-
   mutable TraceWrapperMember<LockManager> lock_manager_;
 };
 
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities_decoding_info_callbacks.cc b/third_party/blink/renderer/modules/media_capabilities/media_capabilities_decoding_info_callbacks.cc
index b40129b6..e4e9fbd 100644
--- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities_decoding_info_callbacks.cc
+++ b/third_party/blink/renderer/modules/media_capabilities/media_capabilities_decoding_info_callbacks.cc
@@ -34,7 +34,7 @@
     // is supported.
     DCHECK(result->supported);
 
-    info->setKeySystemAccess(new MediaKeySystemAccess(
+    info->setKeySystemAccess(MakeGarbageCollected<MediaKeySystemAccess>(
         std::move(result->content_decryption_module_access)));
   }
 
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_display_cutout_fullscreen_button_element_test.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_display_cutout_fullscreen_button_element_test.cc
index 45523499..ab067b7 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_display_cutout_fullscreen_button_element_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_display_cutout_fullscreen_button_element_test.cc
@@ -41,7 +41,7 @@
   }
 
   void SetUp() override {
-    chrome_client_ = new MockDisplayCutoutChromeClient();
+    chrome_client_ = MakeGarbageCollected<MockDisplayCutoutChromeClient>();
 
     Page::PageClients clients;
     FillWithEmptyClients(clients);
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element_test.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element_test.cc
index e948fe72..4bebf5c 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element_test.cc
@@ -64,7 +64,8 @@
     media_controls_ =
         static_cast<MediaControlsImpl*>(media_element_->GetMediaControls());
     ASSERT_NE(media_controls_, nullptr);
-    control_input_element_ = new MediaControlInputElementImpl(*media_controls_);
+    control_input_element_ =
+        MakeGarbageCollected<MediaControlInputElementImpl>(*media_controls_);
   }
 
  protected:
@@ -181,7 +182,7 @@
 
   Persistent<HTMLElement> overflow_container =
       ControlInputElement().CreateOverflowElement(
-          new MediaControlInputElementImpl(MediaControls()));
+          MakeGarbageCollected<MediaControlInputElementImpl>(MediaControls()));
 
   ControlInputElement().SetIsWanted(true);
   ControlInputElement().SetDoesFit(false);
@@ -198,7 +199,7 @@
 
   Persistent<HTMLElement> overflow_container =
       ControlInputElement().CreateOverflowElement(
-          new MediaControlInputElementImpl(MediaControls()));
+          MakeGarbageCollected<MediaControlInputElementImpl>(MediaControls()));
 
   ControlInputElement().SetIsWanted(true);
   ControlInputElement().SetDoesFit(false);
@@ -220,7 +221,7 @@
 
   Persistent<HTMLElement> overflow_container =
       ControlInputElement().CreateOverflowElement(
-          new MediaControlInputElementImpl(MediaControls()));
+          MakeGarbageCollected<MediaControlInputElementImpl>(MediaControls()));
 
   ControlInputElement().SetIsWanted(true);
   ControlInputElement().SetDoesFit(true);
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_display_cutout_delegate_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_display_cutout_delegate_test.cc
index 7400de9..d770f964 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_display_cutout_delegate_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_display_cutout_delegate_test.cc
@@ -39,7 +39,7 @@
 class MediaControlsDisplayCutoutDelegateTest : public PageTestBase {
  public:
   void SetUp() override {
-    chrome_client_ = new DisplayCutoutMockChromeClient();
+    chrome_client_ = MakeGarbageCollected<DisplayCutoutMockChromeClient>();
 
     Page::PageClients clients;
     FillWithEmptyClients(clients);
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
index 0bd0dfc..60a132a 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
@@ -109,7 +109,7 @@
 class StubLocalFrameClientForImpl : public EmptyLocalFrameClient {
  public:
   static StubLocalFrameClientForImpl* Create() {
-    return new StubLocalFrameClientForImpl;
+    return MakeGarbageCollected<StubLocalFrameClientForImpl>();
   }
 
   std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
@@ -210,7 +210,7 @@
   void InitializePage() {
     Page::PageClients clients;
     FillWithEmptyClients(clients);
-    clients.chrome_client = new MockChromeClientForImpl();
+    clients.chrome_client = MakeGarbageCollected<MockChromeClientForImpl>();
     SetupPageWithClients(&clients, StubLocalFrameClientForImpl::Create());
     GetDocument().GetSettings()->SetMediaDownloadInProductHelpEnabled(
         EnableDownloadInProductHelp());
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_media_event_listener.cc b/third_party/blink/renderer/modules/media_controls/media_controls_media_event_listener.cc
index 088f046..d33b11f 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_media_event_listener.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_media_event_listener.cc
@@ -89,11 +89,12 @@
     // TODO(avayvod, mlamouri): Attach can be called twice. See
     // https://crbug.com/713275.
     if (!remote_playback_availability_callback_id_.has_value()) {
-      remote_playback_availability_callback_id_ = base::make_optional(
-          remote->WatchAvailabilityInternal(new AvailabilityCallbackWrapper(
-              WTF::BindRepeating(&MediaControlsMediaEventListener::
-                                     OnRemotePlaybackAvailabilityChanged,
-                                 WrapWeakPersistent(this)))));
+      remote_playback_availability_callback_id_ =
+          base::make_optional(remote->WatchAvailabilityInternal(
+              MakeGarbageCollected<AvailabilityCallbackWrapper>(
+                  WTF::BindRepeating(&MediaControlsMediaEventListener::
+                                         OnRemotePlaybackAvailabilityChanged,
+                                     WrapWeakPersistent(this)))));
     }
   }
 }
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate_test.cc
index 12def00..84d6418 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate_test.cc
@@ -140,7 +140,8 @@
     : public EmptyLocalFrameClient {
  public:
   static StubLocalFrameClientForOrientationLockDelegate* Create() {
-    return new StubLocalFrameClientForOrientationLockDelegate;
+    return MakeGarbageCollected<
+        StubLocalFrameClientForOrientationLockDelegate>();
   }
 
   std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
@@ -176,7 +177,8 @@
   }
 
   void SetUp() override {
-    chrome_client_ = new MockChromeClientForOrientationLockDelegate();
+    chrome_client_ =
+        MakeGarbageCollected<MockChromeClientForOrientationLockDelegate>();
 
     Page::PageClients clients;
     FillWithEmptyClients(clients);
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc
index 77d754f..ef84bc9 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc
@@ -74,7 +74,9 @@
 
 class StubLocalFrameClient : public EmptyLocalFrameClient {
  public:
-  static StubLocalFrameClient* Create() { return new StubLocalFrameClient; }
+  static StubLocalFrameClient* Create() {
+    return MakeGarbageCollected<StubLocalFrameClient>();
+  }
 
   std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
       HTMLMediaElement&,
@@ -101,7 +103,7 @@
       MediaControlsRotateToFullscreenDelegate::SimpleOrientation;
 
   void SetUp() override {
-    chrome_client_ = new MockChromeClient();
+    chrome_client_ = MakeGarbageCollected<MockChromeClient>();
 
     Page::PageClients clients;
     FillWithEmptyClients(clients);
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/auto_canvas_draw_listener.cc b/third_party/blink/renderer/modules/mediacapturefromelement/auto_canvas_draw_listener.cc
index c844083..7b172990 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/auto_canvas_draw_listener.cc
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/auto_canvas_draw_listener.cc
@@ -15,7 +15,7 @@
 // static
 AutoCanvasDrawListener* AutoCanvasDrawListener::Create(
     std::unique_ptr<WebCanvasCaptureHandler> handler) {
-  return new AutoCanvasDrawListener(std::move(handler));
+  return MakeGarbageCollected<AutoCanvasDrawListener>(std::move(handler));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/auto_canvas_draw_listener.h b/third_party/blink/renderer/modules/mediacapturefromelement/auto_canvas_draw_listener.h
index 9649851..343731a 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/auto_canvas_draw_listener.h
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/auto_canvas_draw_listener.h
@@ -20,12 +20,11 @@
  public:
   static AutoCanvasDrawListener* Create(
       std::unique_ptr<WebCanvasCaptureHandler>);
+
+  AutoCanvasDrawListener(std::unique_ptr<WebCanvasCaptureHandler>);
   ~AutoCanvasDrawListener() override = default;
 
   void Trace(blink::Visitor* visitor) override {}
-
- private:
-  AutoCanvasDrawListener(std::unique_ptr<WebCanvasCaptureHandler>);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc b/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
index d993c18..3be95fd 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
@@ -169,7 +169,7 @@
   MediaStream* stream = MediaStream::Create(context, web_stream);
 
   MediaElementEventListener* listener =
-      new MediaElementEventListener(&element, stream);
+      MakeGarbageCollected<MediaElementEventListener>(&element, stream);
   element.addEventListener(event_type_names::kLoadedmetadata, listener, false);
   element.addEventListener(event_type_names::kEnded, listener, false);
 
diff --git a/third_party/blink/renderer/modules/mediarecorder/blob_event.cc b/third_party/blink/renderer/modules/mediarecorder/blob_event.cc
index 6ff4daa..44aafb7 100644
--- a/third_party/blink/renderer/modules/mediarecorder/blob_event.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/blob_event.cc
@@ -12,14 +12,14 @@
 // static
 BlobEvent* BlobEvent::Create(const AtomicString& type,
                              const BlobEventInit* initializer) {
-  return new BlobEvent(type, initializer);
+  return MakeGarbageCollected<BlobEvent>(type, initializer);
 }
 
 // static
 BlobEvent* BlobEvent::Create(const AtomicString& type,
                              Blob* blob,
                              double timecode) {
-  return new BlobEvent(type, blob, timecode);
+  return MakeGarbageCollected<BlobEvent>(type, blob, timecode);
 }
 
 const AtomicString& BlobEvent::InterfaceName() const {
diff --git a/third_party/blink/renderer/modules/mediarecorder/blob_event.h b/third_party/blink/renderer/modules/mediarecorder/blob_event.h
index cf7328a..97c2918 100644
--- a/third_party/blink/renderer/modules/mediarecorder/blob_event.h
+++ b/third_party/blink/renderer/modules/mediarecorder/blob_event.h
@@ -28,6 +28,9 @@
                            Blob* blob,
                            double timecode);
 
+  BlobEvent(const AtomicString& type, const BlobEventInit* initializer);
+  BlobEvent(const AtomicString& type, Blob* blob, double timecode);
+
   Blob* data() const { return blob_.Get(); }
   DOMHighResTimeStamp timecode() const { return timecode_; }
 
@@ -37,9 +40,6 @@
   void Trace(blink::Visitor* visitor) override;
 
  private:
-  BlobEvent(const AtomicString& type, const BlobEventInit* initializer);
-  BlobEvent(const AtomicString& type, Blob* blob, double timecode);
-
   Member<Blob> blob_;
   DOMHighResTimeStamp timecode_;
 };
diff --git a/third_party/blink/renderer/modules/mediastream/apply_constraints_request.cc b/third_party/blink/renderer/modules/mediastream/apply_constraints_request.cc
index e141f8a..65752f51 100644
--- a/third_party/blink/renderer/modules/mediastream/apply_constraints_request.cc
+++ b/third_party/blink/renderer/modules/mediastream/apply_constraints_request.cc
@@ -14,7 +14,8 @@
     const WebMediaStreamTrack& track,
     const WebMediaConstraints& constraints,
     ScriptPromiseResolver* resolver) {
-  return new ApplyConstraintsRequest(track, constraints, resolver);
+  return MakeGarbageCollected<ApplyConstraintsRequest>(track, constraints,
+                                                       resolver);
 }
 
 ApplyConstraintsRequest* ApplyConstraintsRequest::CreateForTesting(
diff --git a/third_party/blink/renderer/modules/mediastream/apply_constraints_request.h b/third_party/blink/renderer/modules/mediastream/apply_constraints_request.h
index 382ea67..61b4d96 100644
--- a/third_party/blink/renderer/modules/mediastream/apply_constraints_request.h
+++ b/third_party/blink/renderer/modules/mediastream/apply_constraints_request.h
@@ -24,6 +24,10 @@
   static ApplyConstraintsRequest* CreateForTesting(const WebMediaStreamTrack&,
                                                    const WebMediaConstraints&);
 
+  ApplyConstraintsRequest(const WebMediaStreamTrack&,
+                          const WebMediaConstraints&,
+                          ScriptPromiseResolver*);
+
   WebMediaStreamTrack Track() const;
   WebMediaConstraints Constraints() const;
 
@@ -33,10 +37,6 @@
   virtual void Trace(blink::Visitor*);
 
  private:
-  ApplyConstraintsRequest(const WebMediaStreamTrack&,
-                          const WebMediaConstraints&,
-                          ScriptPromiseResolver*);
-
   WebMediaStreamTrack track_;
   WebMediaConstraints constraints_;
   Member<ScriptPromiseResolver> resolver_;
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices.cc b/third_party/blink/renderer/modules/mediastream/media_devices.cc
index 7d099e5..f1f957b 100644
--- a/third_party/blink/renderer/modules/mediastream/media_devices.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_devices.cc
@@ -33,9 +33,11 @@
 class PromiseResolverCallbacks final : public UserMediaRequest::Callbacks {
  public:
   static PromiseResolverCallbacks* Create(ScriptPromiseResolver* resolver) {
-    return new PromiseResolverCallbacks(resolver);
+    return MakeGarbageCollected<PromiseResolverCallbacks>(resolver);
   }
 
+  explicit PromiseResolverCallbacks(ScriptPromiseResolver* resolver)
+      : resolver_(resolver) {}
   ~PromiseResolverCallbacks() override = default;
 
   void OnSuccess(ScriptWrappable* callback_this_value,
@@ -53,9 +55,6 @@
   }
 
  private:
-  explicit PromiseResolverCallbacks(ScriptPromiseResolver* resolver)
-      : resolver_(resolver) {}
-
   Member<ScriptPromiseResolver> resolver_;
 };
 
diff --git a/third_party/blink/renderer/modules/notifications/notification_data_test.cc b/third_party/blink/renderer/modules/notifications/notification_data_test.cc
index 2005d93..fccc3b1 100644
--- a/third_party/blink/renderer/modules/notifications/notification_data_test.cc
+++ b/third_party/blink/renderer/modules/notifications/notification_data_test.cc
@@ -66,7 +66,8 @@
 class NotificationDataTest : public testing::Test {
  public:
   void SetUp() override {
-    execution_context_ = new CompleteUrlExecutionContext(kNotificationBaseUrl);
+    execution_context_ =
+        MakeGarbageCollected<CompleteUrlExecutionContext>(kNotificationBaseUrl);
   }
 
   ExecutionContext* GetExecutionContext() { return execution_context_.Get(); }
diff --git a/third_party/blink/renderer/modules/payments/abort_payment_event.cc b/third_party/blink/renderer/modules/payments/abort_payment_event.cc
index 752bbc1..99dcad8a 100644
--- a/third_party/blink/renderer/modules/payments/abort_payment_event.cc
+++ b/third_party/blink/renderer/modules/payments/abort_payment_event.cc
@@ -19,7 +19,8 @@
 AbortPaymentEvent* AbortPaymentEvent::Create(
     const AtomicString& type,
     const ExtendableEventInit* initializer) {
-  return new AbortPaymentEvent(type, initializer, nullptr, nullptr);
+  return MakeGarbageCollected<AbortPaymentEvent>(type, initializer, nullptr,
+                                                 nullptr);
 }
 
 AbortPaymentEvent* AbortPaymentEvent::Create(
@@ -27,8 +28,8 @@
     const ExtendableEventInit* initializer,
     RespondWithObserver* respond_with_observer,
     WaitUntilObserver* wait_until_observer) {
-  return new AbortPaymentEvent(type, initializer, respond_with_observer,
-                               wait_until_observer);
+  return MakeGarbageCollected<AbortPaymentEvent>(
+      type, initializer, respond_with_observer, wait_until_observer);
 }
 
 AbortPaymentEvent::~AbortPaymentEvent() = default;
diff --git a/third_party/blink/renderer/modules/payments/abort_payment_event.h b/third_party/blink/renderer/modules/payments/abort_payment_event.h
index 6f77bbd..c40bce3 100644
--- a/third_party/blink/renderer/modules/payments/abort_payment_event.h
+++ b/third_party/blink/renderer/modules/payments/abort_payment_event.h
@@ -32,6 +32,11 @@
                                    const ExtendableEventInit*,
                                    RespondWithObserver*,
                                    WaitUntilObserver*);
+
+  AbortPaymentEvent(const AtomicString& type,
+                    const ExtendableEventInit*,
+                    RespondWithObserver*,
+                    WaitUntilObserver*);
   ~AbortPaymentEvent() override;
 
   const AtomicString& InterfaceName() const override;
@@ -41,11 +46,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AbortPaymentEvent(const AtomicString& type,
-                    const ExtendableEventInit*,
-                    RespondWithObserver*,
-                    WaitUntilObserver*);
-
   Member<RespondWithObserver> observer_;
 };
 
diff --git a/third_party/blink/renderer/modules/payments/can_make_payment_event.cc b/third_party/blink/renderer/modules/payments/can_make_payment_event.cc
index a03a1d0..f428ede 100644
--- a/third_party/blink/renderer/modules/payments/can_make_payment_event.cc
+++ b/third_party/blink/renderer/modules/payments/can_make_payment_event.cc
@@ -18,7 +18,8 @@
 CanMakePaymentEvent* CanMakePaymentEvent::Create(
     const AtomicString& type,
     const CanMakePaymentEventInit* initializer) {
-  return new CanMakePaymentEvent(type, initializer, nullptr, nullptr);
+  return MakeGarbageCollected<CanMakePaymentEvent>(type, initializer, nullptr,
+                                                   nullptr);
 }
 
 CanMakePaymentEvent* CanMakePaymentEvent::Create(
@@ -26,8 +27,8 @@
     const CanMakePaymentEventInit* initializer,
     RespondWithObserver* respond_with_observer,
     WaitUntilObserver* wait_until_observer) {
-  return new CanMakePaymentEvent(type, initializer, respond_with_observer,
-                                 wait_until_observer);
+  return MakeGarbageCollected<CanMakePaymentEvent>(
+      type, initializer, respond_with_observer, wait_until_observer);
 }
 
 CanMakePaymentEvent::~CanMakePaymentEvent() = default;
diff --git a/third_party/blink/renderer/modules/payments/can_make_payment_event.h b/third_party/blink/renderer/modules/payments/can_make_payment_event.h
index 3931550..b38d40ef 100644
--- a/third_party/blink/renderer/modules/payments/can_make_payment_event.h
+++ b/third_party/blink/renderer/modules/payments/can_make_payment_event.h
@@ -33,6 +33,11 @@
                                      const CanMakePaymentEventInit*,
                                      RespondWithObserver*,
                                      WaitUntilObserver*);
+
+  CanMakePaymentEvent(const AtomicString& type,
+                      const CanMakePaymentEventInit*,
+                      RespondWithObserver*,
+                      WaitUntilObserver*);
   ~CanMakePaymentEvent() override;
 
   const AtomicString& InterfaceName() const override;
@@ -47,11 +52,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  CanMakePaymentEvent(const AtomicString& type,
-                      const CanMakePaymentEventInit*,
-                      RespondWithObserver*,
-                      WaitUntilObserver*);
-
   String top_origin_;
   String payment_request_origin_;
   HeapVector<Member<PaymentMethodData>> method_data_;
diff --git a/third_party/blink/renderer/modules/payments/on_payment_response_test.cc b/third_party/blink/renderer/modules/payments/on_payment_response_test.cc
index 5c3852d7..49a42630 100644
--- a/third_party/blink/renderer/modules/payments/on_payment_response_test.cc
+++ b/third_party/blink/renderer/modules/payments/on_payment_response_test.cc
@@ -399,16 +399,16 @@
   static v8::Local<v8::Function> Create(ScriptState* script_state,
                                         ScriptValue* out_value) {
     PaymentResponseFunction* self =
-        new PaymentResponseFunction(script_state, out_value);
+        MakeGarbageCollected<PaymentResponseFunction>(script_state, out_value);
     return self->BindToV8Function();
   }
 
- private:
   PaymentResponseFunction(ScriptState* script_state, ScriptValue* out_value)
       : ScriptFunction(script_state), value_(out_value) {
     DCHECK(value_);
   }
 
+ private:
   ScriptValue Call(ScriptValue value) override {
     DCHECK(!value.IsEmpty());
     *value_ = value;
diff --git a/third_party/blink/renderer/modules/payments/payment_request_update_event.cc b/third_party/blink/renderer/modules/payments/payment_request_update_event.cc
index 080fc25..4035b7f 100644
--- a/third_party/blink/renderer/modules/payments/payment_request_update_event.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request_update_event.cc
@@ -27,22 +27,23 @@
       ScriptState* script_state,
       PaymentRequestUpdateEvent* update_event) {
     UpdatePaymentDetailsFunction* self =
-        new UpdatePaymentDetailsFunction(script_state, update_event);
+        MakeGarbageCollected<UpdatePaymentDetailsFunction>(script_state,
+                                                           update_event);
     return self->BindToV8Function();
   }
 
+  UpdatePaymentDetailsFunction(ScriptState* script_state,
+                               PaymentRequestUpdateEvent* update_event)
+      : ScriptFunction(script_state), update_event_(update_event) {
+    DCHECK(update_event_);
+  }
+
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(update_event_);
     ScriptFunction::Trace(visitor);
   }
 
  private:
-  UpdatePaymentDetailsFunction(ScriptState* script_state,
-                               PaymentRequestUpdateEvent* update_event)
-      : ScriptFunction(script_state), update_event_(update_event) {
-    DCHECK(update_event_);
-  }
-
   ScriptValue Call(ScriptValue value) override {
     update_event_->OnUpdatePaymentDetails(update_event_->type(), value);
     return ScriptValue();
@@ -56,22 +57,23 @@
   static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
                                                 PaymentUpdater* updater) {
     UpdatePaymentDetailsErrorFunction* self =
-        new UpdatePaymentDetailsErrorFunction(script_state, updater);
+        MakeGarbageCollected<UpdatePaymentDetailsErrorFunction>(script_state,
+                                                                updater);
     return self->BindToV8Function();
   }
 
+  UpdatePaymentDetailsErrorFunction(ScriptState* script_state,
+                                    PaymentUpdater* updater)
+      : ScriptFunction(script_state), updater_(updater) {
+    DCHECK(updater_);
+  }
+
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(updater_);
     ScriptFunction::Trace(visitor);
   }
 
  private:
-  UpdatePaymentDetailsErrorFunction(ScriptState* script_state,
-                                    PaymentUpdater* updater)
-      : ScriptFunction(script_state), updater_(updater) {
-    DCHECK(updater_);
-  }
-
   ScriptValue Call(ScriptValue value) override {
     updater_->OnUpdatePaymentDetailsFailure(
         ToCoreString(value.V8Value()
diff --git a/third_party/blink/renderer/modules/payments/payment_request_update_event_test.cc b/third_party/blink/renderer/modules/payments/payment_request_update_event_test.cc
index 4e2148c..0246a19 100644
--- a/third_party/blink/renderer/modules/payments/payment_request_update_event_test.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request_update_event_test.cc
@@ -40,7 +40,7 @@
   V8TestingScope scope;
   PaymentRequestUpdateEvent* event = PaymentRequestUpdateEvent::Create(
       scope.GetExecutionContext(), event_type_names::kShippingaddresschange);
-  MockPaymentUpdater* updater = new MockPaymentUpdater;
+  MockPaymentUpdater* updater = MakeGarbageCollected<MockPaymentUpdater>();
   event->SetTrusted(true);
   event->SetPaymentDetailsUpdater(updater);
   event->SetEventPhase(Event::kCapturingPhase);
@@ -62,7 +62,7 @@
   V8TestingScope scope;
   PaymentRequestUpdateEvent* event = PaymentRequestUpdateEvent::Create(
       scope.GetExecutionContext(), event_type_names::kShippingaddresschange);
-  MockPaymentUpdater* updater = new MockPaymentUpdater;
+  MockPaymentUpdater* updater = MakeGarbageCollected<MockPaymentUpdater>();
   event->SetTrusted(true);
   event->SetPaymentDetailsUpdater(updater);
   event->SetEventPhase(Event::kCapturingPhase);
@@ -99,7 +99,7 @@
   V8TestingScope scope;
   PaymentRequestUpdateEvent* event = PaymentRequestUpdateEvent::Create(
       scope.GetExecutionContext(), event_type_names::kShippingaddresschange);
-  MockPaymentUpdater* updater = new MockPaymentUpdater;
+  MockPaymentUpdater* updater = MakeGarbageCollected<MockPaymentUpdater>();
   event->SetTrusted(true);
   event->SetPaymentDetailsUpdater(updater);
   event->SetEventPhase(Event::kCapturingPhase);
diff --git a/third_party/blink/renderer/modules/payments/payment_response_test.cc b/third_party/blink/renderer/modules/payments/payment_response_test.cc
index e95f4ef..875c442 100644
--- a/third_party/blink/renderer/modules/payments/payment_response_test.cc
+++ b/third_party/blink/renderer/modules/payments/payment_response_test.cc
@@ -57,7 +57,8 @@
   input->payer->name = "Jon Doe";
   input->payer->email = "abc@gmail.com";
   input->payer->phone = "0123";
-  MockPaymentStateResolver* complete_callback = new MockPaymentStateResolver;
+  MockPaymentStateResolver* complete_callback =
+      MakeGarbageCollected<MockPaymentStateResolver>();
 
   PaymentResponse* output = MakeGarbageCollected<PaymentResponse>(
       scope.GetScriptState(), std::move(input), nullptr, complete_callback,
@@ -90,7 +91,8 @@
   payments::mojom::blink::PaymentResponsePtr input =
       BuildPaymentResponseForTest();
   input->stringified_details = "transactionId";
-  MockPaymentStateResolver* complete_callback = new MockPaymentStateResolver;
+  MockPaymentStateResolver* complete_callback =
+      MakeGarbageCollected<MockPaymentStateResolver>();
   PaymentResponse* output = MakeGarbageCollected<PaymentResponse>(
       scope.GetScriptState(), std::move(input), nullptr, complete_callback,
       "id");
@@ -113,7 +115,8 @@
       BuildPaymentResponseForTest();
   input->method_name = "foo";
   input->stringified_details = "{\"transactionId\": 123}";
-  MockPaymentStateResolver* complete_callback = new MockPaymentStateResolver;
+  MockPaymentStateResolver* complete_callback =
+      MakeGarbageCollected<MockPaymentStateResolver>();
   PaymentResponse* output = MakeGarbageCollected<PaymentResponse>(
       scope.GetScriptState(), std::move(input), nullptr, complete_callback,
       "id");
@@ -127,7 +130,8 @@
       BuildPaymentResponseForTest();
   input->method_name = "foo";
   input->stringified_details = "{\"transactionId\": 123}";
-  MockPaymentStateResolver* complete_callback = new MockPaymentStateResolver;
+  MockPaymentStateResolver* complete_callback =
+      MakeGarbageCollected<MockPaymentStateResolver>();
   PaymentResponse* output = MakeGarbageCollected<PaymentResponse>(
       scope.GetScriptState(), std::move(input), nullptr, complete_callback,
       "id");
@@ -144,7 +148,8 @@
       BuildPaymentResponseForTest();
   input->method_name = "foo";
   input->stringified_details = "{\"transactionId\": 123}";
-  MockPaymentStateResolver* complete_callback = new MockPaymentStateResolver;
+  MockPaymentStateResolver* complete_callback =
+      MakeGarbageCollected<MockPaymentStateResolver>();
   PaymentResponse* output = MakeGarbageCollected<PaymentResponse>(
       scope.GetScriptState(), std::move(input), nullptr, complete_callback,
       "id");
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream.cc b/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream.cc
index 5b654f4..e77bce3 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream.cc
@@ -191,7 +191,8 @@
     promise_resolver->Resolve();
   } else {
     pending_read_buffered_amount_promises_.push_back(
-        new PendingReadBufferedAmountPromise(promise_resolver, amount));
+        MakeGarbageCollected<PendingReadBufferedAmountPromise>(promise_resolver,
+                                                               amount));
   }
   return promise;
 }
@@ -210,7 +211,8 @@
     promise_resolver->Resolve();
   } else {
     pending_write_buffered_amount_promises_.push_back(
-        new PendingWriteBufferedAmountPromise(promise_resolver, threshold));
+        MakeGarbageCollected<PendingWriteBufferedAmountPromise>(
+            promise_resolver, threshold));
   }
   return promise;
 }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream_event.cc b/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream_event.cc
index b7a102b..f6eaaba 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream_event.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream_event.cc
@@ -9,13 +9,13 @@
 namespace blink {
 
 RTCQuicStreamEvent* RTCQuicStreamEvent::Create(RTCQuicStream* stream) {
-  return new RTCQuicStreamEvent(stream);
+  return MakeGarbageCollected<RTCQuicStreamEvent>(stream);
 }
 
 RTCQuicStreamEvent* RTCQuicStreamEvent::Create(
     const AtomicString& type,
     const RTCQuicStreamEventInit* initializer) {
-  return new RTCQuicStreamEvent(type, initializer);
+  return MakeGarbageCollected<RTCQuicStreamEvent>(type, initializer);
 }
 
 RTCQuicStreamEvent::RTCQuicStreamEvent(RTCQuicStream* stream)
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream_event.h b/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream_event.h
index 227b68c..8f924f9 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream_event.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_quic_stream_event.h
@@ -20,6 +20,9 @@
   static RTCQuicStreamEvent* Create(const AtomicString& type,
                                     const RTCQuicStreamEventInit* init);
 
+  RTCQuicStreamEvent(RTCQuicStream* stream);
+  RTCQuicStreamEvent(const AtomicString& type,
+                     const RTCQuicStreamEventInit* init);
   ~RTCQuicStreamEvent() override;
 
   // rtc_quic_stream_event.idl
@@ -32,10 +35,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  RTCQuicStreamEvent(RTCQuicStream* stream);
-  RTCQuicStreamEvent(const AtomicString& type,
-                     const RTCQuicStreamEventInit* init);
-
   Member<RTCQuicStream> stream_;
 };
 
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
index 0cd0ea1..3761492 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
@@ -287,7 +287,7 @@
     web_track = with_track->Component();
   }
   ReplaceTrackRequest* request =
-      new ReplaceTrackRequest(this, with_track, resolver);
+      MakeGarbageCollected<ReplaceTrackRequest>(this, with_track, resolver);
   sender_->ReplaceTrack(web_track, request);
   return promise;
 }
@@ -395,7 +395,7 @@
   webrtc::DegradationPreference degradation_preference;
   std::tie(encodings, degradation_preference) = ToRtpParameters(parameters);
 
-  auto* request = new SetParametersRequest(resolver, this);
+  auto* request = MakeGarbageCollected<SetParametersRequest>(resolver, this);
   sender_->SetParameters(std::move(encodings), degradation_preference, request);
   return promise;
 }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
index 7f73c9b..71b11c1 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
@@ -136,7 +136,8 @@
 
 PairIterable<String, v8::Local<v8::Value>>::IterationSource*
 RTCStatsReport::StartIteration(ScriptState*, ExceptionState&) {
-  return new RTCStatsReportIterationSource(report_->CopyHandle());
+  return MakeGarbageCollected<RTCStatsReportIterationSource>(
+      report_->CopyHandle());
 }
 
 bool RTCStatsReport::GetMapEntry(ScriptState* script_state,
diff --git a/third_party/blink/renderer/modules/picture_in_picture/enter_picture_in_picture_event.cc b/third_party/blink/renderer/modules/picture_in_picture/enter_picture_in_picture_event.cc
index 4839db8a..438d36f5 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/enter_picture_in_picture_event.cc
+++ b/third_party/blink/renderer/modules/picture_in_picture/enter_picture_in_picture_event.cc
@@ -9,13 +9,14 @@
 EnterPictureInPictureEvent* EnterPictureInPictureEvent::Create(
     const AtomicString& type,
     PictureInPictureWindow* picture_in_picture_window) {
-  return new EnterPictureInPictureEvent(type, picture_in_picture_window);
+  return MakeGarbageCollected<EnterPictureInPictureEvent>(
+      type, picture_in_picture_window);
 }
 
 EnterPictureInPictureEvent* EnterPictureInPictureEvent::Create(
     const AtomicString& type,
     const EnterPictureInPictureEventInit* initializer) {
-  return new EnterPictureInPictureEvent(type, initializer);
+  return MakeGarbageCollected<EnterPictureInPictureEvent>(type, initializer);
 }
 
 PictureInPictureWindow* EnterPictureInPictureEvent::pictureInPictureWindow()
diff --git a/third_party/blink/renderer/modules/picture_in_picture/enter_picture_in_picture_event.h b/third_party/blink/renderer/modules/picture_in_picture/enter_picture_in_picture_event.h
index 73989f0a..e931afc 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/enter_picture_in_picture_event.h
+++ b/third_party/blink/renderer/modules/picture_in_picture/enter_picture_in_picture_event.h
@@ -24,15 +24,15 @@
       const AtomicString&,
       const EnterPictureInPictureEventInit*);
 
+  EnterPictureInPictureEvent(AtomicString const&, PictureInPictureWindow*);
+  EnterPictureInPictureEvent(AtomicString const&,
+                             const EnterPictureInPictureEventInit*);
+
   PictureInPictureWindow* pictureInPictureWindow() const;
 
   void Trace(blink::Visitor*) override;
 
  private:
-  EnterPictureInPictureEvent(AtomicString const&, PictureInPictureWindow*);
-  EnterPictureInPictureEvent(AtomicString const&,
-                             const EnterPictureInPictureEventInit*);
-
   Member<PictureInPictureWindow> picture_in_picture_window_;
 };
 
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection.cc b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
index 0c3875d..f1f1d43 100644
--- a/third_party/blink/renderer/modules/presentation/presentation_connection.cc
+++ b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
@@ -235,7 +235,7 @@
   DCHECK(controller);
   DCHECK(request);
 
-  auto* connection = new ControllerPresentationConnection(
+  auto* connection = MakeGarbageCollected<ControllerPresentationConnection>(
       *controller->GetFrame(), controller, presentation_info.id,
       presentation_info.url);
   controller->RegisterConnection(connection);
diff --git a/third_party/blink/renderer/modules/presentation/presentation_receiver_test.cc b/third_party/blink/renderer/modules/presentation/presentation_receiver_test.cc
index e09a512..9fcfa97 100644
--- a/third_party/blink/renderer/modules/presentation/presentation_receiver_test.cc
+++ b/third_party/blink/renderer/modules/presentation/presentation_receiver_test.cc
@@ -82,8 +82,8 @@
   auto* receiver =
       MakeGarbageCollected<PresentationReceiver>(&scope.GetFrame());
 
-  auto* event_handler =
-      new StrictMock<MockEventListenerForPresentationReceiver>();
+  auto* event_handler = MakeGarbageCollected<
+      StrictMock<MockEventListenerForPresentationReceiver>>();
   AddConnectionavailableEventListener(event_handler, receiver);
   EXPECT_CALL(*event_handler, Invoke(testing::_, testing::_)).Times(0);
 
@@ -99,8 +99,8 @@
   auto* receiver =
       MakeGarbageCollected<PresentationReceiver>(&scope.GetFrame());
 
-  auto* event_handler =
-      new StrictMock<MockEventListenerForPresentationReceiver>();
+  auto* event_handler = MakeGarbageCollected<
+      StrictMock<MockEventListenerForPresentationReceiver>>();
   AddConnectionavailableEventListener(event_handler, receiver);
   EXPECT_CALL(*event_handler, Invoke(testing::_, testing::_)).Times(0);
 
@@ -122,7 +122,8 @@
       MakeGarbageCollected<PresentationReceiver>(&scope.GetFrame());
 
   StrictMock<MockEventListenerForPresentationReceiver>* event_handler =
-      new StrictMock<MockEventListenerForPresentationReceiver>();
+      MakeGarbageCollected<
+          StrictMock<MockEventListenerForPresentationReceiver>>();
   AddConnectionavailableEventListener(event_handler, receiver);
   EXPECT_CALL(*event_handler, Invoke(testing::_, testing::_)).Times(1);
 
@@ -154,7 +155,8 @@
       MakeGarbageCollected<PresentationReceiver>(&scope.GetFrame());
 
   StrictMock<MockEventListenerForPresentationReceiver>* event_handler =
-      new StrictMock<MockEventListenerForPresentationReceiver>();
+      MakeGarbageCollected<
+          StrictMock<MockEventListenerForPresentationReceiver>>();
   AddConnectionavailableEventListener(event_handler, receiver);
   EXPECT_CALL(*event_handler, Invoke(testing::_, testing::_)).Times(0);
 
diff --git a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
index bc20e505..763e43a6 100644
--- a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
+++ b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
@@ -108,7 +108,8 @@
     return promise;
   }
 
-  int id = WatchAvailabilityInternal(new AvailabilityCallbackWrapper(callback));
+  int id = WatchAvailabilityInternal(
+      MakeGarbageCollected<AvailabilityCallbackWrapper>(callback));
   if (id == kWatchAvailabilityNotSupported) {
     resolver->Reject(DOMException::Create(
         DOMExceptionCode::kNotSupportedError,
diff --git a/third_party/blink/renderer/modules/remoteplayback/remote_playback_test.cc b/third_party/blink/renderer/modules/remoteplayback/remote_playback_test.cc
index 4c000cc..332709d 100644
--- a/third_party/blink/renderer/modules/remoteplayback/remote_playback_test.cc
+++ b/third_party/blink/renderer/modules/remoteplayback/remote_playback_test.cc
@@ -27,7 +27,8 @@
 class MockFunction : public ScriptFunction {
  public:
   static testing::StrictMock<MockFunction>* Create(ScriptState* script_state) {
-    return new testing::StrictMock<MockFunction>(script_state);
+    return MakeGarbageCollected<testing::StrictMock<MockFunction>>(
+        script_state);
   }
 
   v8::Local<v8::Function> Bind() { return BindToV8Function(); }
@@ -192,12 +193,12 @@
   RemotePlayback* remote_playback =
       HTMLMediaElementRemotePlayback::remote(*element);
 
-  auto* connecting_handler =
-      new testing::StrictMock<MockEventListenerForRemotePlayback>();
-  auto* connect_handler =
-      new testing::StrictMock<MockEventListenerForRemotePlayback>();
-  auto* disconnect_handler =
-      new testing::StrictMock<MockEventListenerForRemotePlayback>();
+  auto* connecting_handler = MakeGarbageCollected<
+      testing::StrictMock<MockEventListenerForRemotePlayback>>();
+  auto* connect_handler = MakeGarbageCollected<
+      testing::StrictMock<MockEventListenerForRemotePlayback>>();
+  auto* disconnect_handler = MakeGarbageCollected<
+      testing::StrictMock<MockEventListenerForRemotePlayback>>();
 
   remote_playback->addEventListener(event_type_names::kConnecting,
                                     connecting_handler);
diff --git a/third_party/blink/renderer/modules/sensor/absolute_orientation_sensor.cc b/third_party/blink/renderer/modules/sensor/absolute_orientation_sensor.cc
index b2f1a98..17b391a 100644
--- a/third_party/blink/renderer/modules/sensor/absolute_orientation_sensor.cc
+++ b/third_party/blink/renderer/modules/sensor/absolute_orientation_sensor.cc
@@ -12,8 +12,8 @@
     ExecutionContext* execution_context,
     const SpatialSensorOptions* options,
     ExceptionState& exception_state) {
-  return new AbsoluteOrientationSensor(execution_context, options,
-                                       exception_state);
+  return MakeGarbageCollected<AbsoluteOrientationSensor>(
+      execution_context, options, exception_state);
 }
 
 // static
diff --git a/third_party/blink/renderer/modules/sensor/absolute_orientation_sensor.h b/third_party/blink/renderer/modules/sensor/absolute_orientation_sensor.h
index 5820f49f..225282f 100644
--- a/third_party/blink/renderer/modules/sensor/absolute_orientation_sensor.h
+++ b/third_party/blink/renderer/modules/sensor/absolute_orientation_sensor.h
@@ -19,12 +19,11 @@
                                            ExceptionState&);
   static AbsoluteOrientationSensor* Create(ExecutionContext*, ExceptionState&);
 
-  void Trace(blink::Visitor*) override;
-
- private:
   AbsoluteOrientationSensor(ExecutionContext*,
                             const SpatialSensorOptions*,
                             ExceptionState&);
+
+  void Trace(blink::Visitor*) override;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/sensor/accelerometer.cc b/third_party/blink/renderer/modules/sensor/accelerometer.cc
index 26b5ec4..e9f332e 100644
--- a/third_party/blink/renderer/modules/sensor/accelerometer.cc
+++ b/third_party/blink/renderer/modules/sensor/accelerometer.cc
@@ -11,9 +11,11 @@
 Accelerometer* Accelerometer::Create(ExecutionContext* execution_context,
                                      const SpatialSensorOptions* options,
                                      ExceptionState& exception_state) {
-  return new Accelerometer(execution_context, options, exception_state,
-                           SensorType::ACCELEROMETER,
-                           {mojom::FeaturePolicyFeature::kAccelerometer});
+  const Vector<mojom::FeaturePolicyFeature> features(
+      {mojom::FeaturePolicyFeature::kAccelerometer});
+  return MakeGarbageCollected<Accelerometer>(
+      execution_context, options, exception_state, SensorType::ACCELEROMETER,
+      features);
 }
 
 // static
diff --git a/third_party/blink/renderer/modules/sensor/accelerometer.h b/third_party/blink/renderer/modules/sensor/accelerometer.h
index 38bf771..5005db7 100644
--- a/third_party/blink/renderer/modules/sensor/accelerometer.h
+++ b/third_party/blink/renderer/modules/sensor/accelerometer.h
@@ -19,18 +19,17 @@
                                ExceptionState&);
   static Accelerometer* Create(ExecutionContext*, ExceptionState&);
 
-  double x(bool& is_null) const;
-  double y(bool& is_null) const;
-  double z(bool& is_null) const;
-
-  void Trace(blink::Visitor*) override;
-
- protected:
   Accelerometer(ExecutionContext*,
                 const SpatialSensorOptions*,
                 ExceptionState&,
                 device::mojom::blink::SensorType,
                 const Vector<mojom::FeaturePolicyFeature>&);
+
+  double x(bool& is_null) const;
+  double y(bool& is_null) const;
+  double z(bool& is_null) const;
+
+  void Trace(blink::Visitor*) override;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/sensor/ambient_light_sensor.cc b/third_party/blink/renderer/modules/sensor/ambient_light_sensor.cc
index f4695887..58e3961a 100644
--- a/third_party/blink/renderer/modules/sensor/ambient_light_sensor.cc
+++ b/third_party/blink/renderer/modules/sensor/ambient_light_sensor.cc
@@ -16,7 +16,8 @@
     ExecutionContext* execution_context,
     const SensorOptions* options,
     ExceptionState& exception_state) {
-  return new AmbientLightSensor(execution_context, options, exception_state);
+  return MakeGarbageCollected<AmbientLightSensor>(execution_context, options,
+                                                  exception_state);
 }
 
 // static
diff --git a/third_party/blink/renderer/modules/sensor/ambient_light_sensor.h b/third_party/blink/renderer/modules/sensor/ambient_light_sensor.h
index c7dfcbd..34b3f1e 100644
--- a/third_party/blink/renderer/modules/sensor/ambient_light_sensor.h
+++ b/third_party/blink/renderer/modules/sensor/ambient_light_sensor.h
@@ -18,12 +18,11 @@
                                     ExceptionState&);
   static AmbientLightSensor* Create(ExecutionContext*, ExceptionState&);
 
+  AmbientLightSensor(ExecutionContext*, const SensorOptions*, ExceptionState&);
+
   double illuminance(bool& is_null) const;
 
   void Trace(blink::Visitor*) override;
-
- private:
-  AmbientLightSensor(ExecutionContext*, const SensorOptions*, ExceptionState&);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/service_worker/fetch_event.cc b/third_party/blink/renderer/modules/service_worker/fetch_event.cc
index c95d157..8031a5b 100644
--- a/third_party/blink/renderer/modules/service_worker/fetch_event.cc
+++ b/third_party/blink/renderer/modules/service_worker/fetch_event.cc
@@ -124,18 +124,19 @@
   DataPipeBytesConsumer* bytes_consumer = nullptr;
   if (data_pipe.is_valid()) {
     DataPipeBytesConsumer::CompletionNotifier* completion_notifier = nullptr;
-    bytes_consumer =
-        new DataPipeBytesConsumer(ExecutionContext::From(script_state),
-                                  std::move(data_pipe), &completion_notifier);
+    bytes_consumer = MakeGarbageCollected<DataPipeBytesConsumer>(
+        ExecutionContext::From(script_state), std::move(data_pipe),
+        &completion_notifier);
     body_completion_notifier_ = completion_notifier;
   }
   // TODO(ricea): Verify that this response can't be aborted from JS.
   FetchResponseData* response_data =
-      bytes_consumer
-          ? FetchResponseData::CreateWithBuffer(new BodyStreamBuffer(
-                script_state, bytes_consumer,
-                new AbortSignal(ExecutionContext::From(script_state))))
-          : FetchResponseData::Create();
+      bytes_consumer ? FetchResponseData::CreateWithBuffer(
+                           MakeGarbageCollected<BodyStreamBuffer>(
+                               script_state, bytes_consumer,
+                               MakeGarbageCollected<AbortSignal>(
+                                   ExecutionContext::From(script_state))))
+                     : FetchResponseData::Create();
   Vector<KURL> url_list(1);
   url_list[0] = preload_response_->Url();
   response_data->SetURLList(url_list);
diff --git a/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc b/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc
index 3fd575b..d8cd91c6 100644
--- a/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc
+++ b/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc
@@ -335,7 +335,8 @@
 
     // Load the Response as a mojo::DataPipe.  The resulting pipe consumer
     // handle will be passed to the FetchLoaderClient on start.
-    FetchLoaderClient* fetch_loader_client = new FetchLoaderClient();
+    FetchLoaderClient* fetch_loader_client =
+        MakeGarbageCollected<FetchLoaderClient>();
     buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe(task_runner_),
                          fetch_loader_client, exception_state);
     if (exception_state.HadException()) {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc b/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc
index 072c0a8..948371a 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_container_test.cc
@@ -55,14 +55,15 @@
    public:
     static v8::Local<v8::Function> CreateFunction(ScriptState* script_state,
                                                   StubScriptFunction& owner) {
-      ScriptFunctionImpl* self = new ScriptFunctionImpl(script_state, owner);
+      ScriptFunctionImpl* self =
+          MakeGarbageCollected<ScriptFunctionImpl>(script_state, owner);
       return self->BindToV8Function();
     }
 
-   private:
     ScriptFunctionImpl(ScriptState* script_state, StubScriptFunction& owner)
         : ScriptFunction(script_state), owner_(owner) {}
 
+   private:
     ScriptValue Call(ScriptValue arg) override {
       owner_.arg_ = arg;
       owner_.call_count_++;
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index b8e6237..0fab547 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -204,9 +204,10 @@
     fetch_type = ModuleScriptCustomFetchType::kInstalledServiceWorker;
   }
 
-  FetchModuleScript(module_url_record, outside_settings_object,
-                    mojom::RequestContextType::SERVICE_WORKER, credentials_mode,
-                    fetch_type, new ServiceWorkerModuleTreeClient(modulator));
+  FetchModuleScript(
+      module_url_record, outside_settings_object,
+      mojom::RequestContextType::SERVICE_WORKER, credentials_mode, fetch_type,
+      MakeGarbageCollected<ServiceWorkerModuleTreeClient>(modulator));
 }
 
 void ServiceWorkerGlobalScope::Dispose() {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
index 1abbcf9..a54fe84 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
@@ -31,8 +31,8 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_SERVICE_WORKER_GLOBAL_SCOPE_H_
 
 #include <memory>
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/request_or_usv_string.h"
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
index 8b71293..dab3636 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
@@ -220,7 +220,7 @@
   ScriptState::Scope scope(script_state);
 
   BackgroundFetchEventInit* init = BackgroundFetchEventInit::Create();
-  init->setRegistration(new BackgroundFetchRegistration(
+  init->setRegistration(MakeGarbageCollected<BackgroundFetchRegistration>(
       WorkerGlobalScope()->registration() /* service_worker_registration */,
       registration));
 
@@ -238,7 +238,7 @@
       WorkerGlobalScope(), WaitUntilObserver::kBackgroundFetchClick, event_id);
 
   BackgroundFetchEventInit* init = BackgroundFetchEventInit::Create();
-  init->setRegistration(new BackgroundFetchRegistration(
+  init->setRegistration(MakeGarbageCollected<BackgroundFetchRegistration>(
       WorkerGlobalScope()->registration() /* service_worker_registration */,
       registration));
 
@@ -263,7 +263,7 @@
   ScriptState::Scope scope(script_state);
 
   BackgroundFetchEventInit* init = BackgroundFetchEventInit::Create();
-  init->setRegistration(new BackgroundFetchRegistration(
+  init->setRegistration(MakeGarbageCollected<BackgroundFetchRegistration>(
       WorkerGlobalScope()->registration() /* service_worker_registration */,
       registration));
 
@@ -290,7 +290,7 @@
   ScriptState::Scope scope(script_state);
 
   BackgroundFetchEventInit* init = BackgroundFetchEventInit::Create();
-  init->setRegistration(new BackgroundFetchRegistration(
+  init->setRegistration(MakeGarbageCollected<BackgroundFetchRegistration>(
       WorkerGlobalScope()->registration() /* service_worker_registration */,
       registration));
 
@@ -545,8 +545,8 @@
   WaitUntilObserver* wait_until_observer = WaitUntilObserver::Create(
       WorkerGlobalScope(), WaitUntilObserver::kAbortPayment, event_id);
   AbortPaymentRespondWithObserver* respond_with_observer =
-      new AbortPaymentRespondWithObserver(WorkerGlobalScope(), event_id,
-                                          wait_until_observer);
+      MakeGarbageCollected<AbortPaymentRespondWithObserver>(
+          WorkerGlobalScope(), event_id, wait_until_observer);
 
   Event* event = AbortPaymentEvent::Create(
       event_type_names::kAbortpayment, ExtendableEventInit::Create(),
@@ -563,8 +563,8 @@
   WaitUntilObserver* wait_until_observer = WaitUntilObserver::Create(
       WorkerGlobalScope(), WaitUntilObserver::kCanMakePayment, event_id);
   CanMakePaymentRespondWithObserver* respond_with_observer =
-      new CanMakePaymentRespondWithObserver(WorkerGlobalScope(), event_id,
-                                            wait_until_observer);
+      MakeGarbageCollected<CanMakePaymentRespondWithObserver>(
+          WorkerGlobalScope(), event_id, wait_until_observer);
 
   Event* event = CanMakePaymentEvent::Create(
       event_type_names::kCanmakepayment,
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_thread.h b/third_party/blink/renderer/modules/service_worker/service_worker_thread.h
index d073841..348e33f 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_thread.h
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_thread.h
@@ -31,7 +31,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_SERVICE_WORKER_SERVICE_WORKER_THREAD_H_
 
 #include <memory>
-#include "third_party/blink/public/platform/modules/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 #include "third_party/blink/renderer/core/workers/worker_thread.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
diff --git a/third_party/blink/renderer/modules/shapedetection/barcode_detector.cc b/third_party/blink/renderer/modules/shapedetection/barcode_detector.cc
index 66a43d4..13ea683 100644
--- a/third_party/blink/renderer/modules/shapedetection/barcode_detector.cc
+++ b/third_party/blink/renderer/modules/shapedetection/barcode_detector.cc
@@ -17,7 +17,7 @@
 namespace blink {
 
 BarcodeDetector* BarcodeDetector::Create(ExecutionContext* context) {
-  return new BarcodeDetector(context);
+  return MakeGarbageCollected<BarcodeDetector>(context);
 }
 
 BarcodeDetector::BarcodeDetector(ExecutionContext* context) : ShapeDetector() {
diff --git a/third_party/blink/renderer/modules/shapedetection/barcode_detector.h b/third_party/blink/renderer/modules/shapedetection/barcode_detector.h
index ba14b55..d596079 100644
--- a/third_party/blink/renderer/modules/shapedetection/barcode_detector.h
+++ b/third_party/blink/renderer/modules/shapedetection/barcode_detector.h
@@ -22,10 +22,11 @@
  public:
   static BarcodeDetector* Create(ExecutionContext*);
 
+  explicit BarcodeDetector(ExecutionContext*);
+
   void Trace(blink::Visitor*) override;
 
  private:
-  explicit BarcodeDetector(ExecutionContext*);
   ~BarcodeDetector() override = default;
 
   ScriptPromise DoDetect(ScriptPromiseResolver*, SkBitmap) override;
diff --git a/third_party/blink/renderer/modules/speech/speech_synthesis_error_event.cc b/third_party/blink/renderer/modules/speech/speech_synthesis_error_event.cc
index 54e4bbbf..db8ff33 100644
--- a/third_party/blink/renderer/modules/speech/speech_synthesis_error_event.cc
+++ b/third_party/blink/renderer/modules/speech/speech_synthesis_error_event.cc
@@ -10,7 +10,7 @@
 SpeechSynthesisErrorEvent* SpeechSynthesisErrorEvent::Create(
     const AtomicString& type,
     const SpeechSynthesisErrorEventInit* init) {
-  return new SpeechSynthesisErrorEvent(type, init);
+  return MakeGarbageCollected<SpeechSynthesisErrorEvent>(type, init);
 }
 
 SpeechSynthesisErrorEvent::SpeechSynthesisErrorEvent(
diff --git a/third_party/blink/renderer/modules/speech/speech_synthesis_error_event.h b/third_party/blink/renderer/modules/speech/speech_synthesis_error_event.h
index 62f5a5f3..75122f9 100644
--- a/third_party/blink/renderer/modules/speech/speech_synthesis_error_event.h
+++ b/third_party/blink/renderer/modules/speech/speech_synthesis_error_event.h
@@ -20,11 +20,12 @@
       const AtomicString& type,
       const SpeechSynthesisErrorEventInit* init);
 
+  SpeechSynthesisErrorEvent(const AtomicString& type,
+                            const SpeechSynthesisErrorEventInit* init);
+
   const String error() const { return error_; }
 
  private:
-  SpeechSynthesisErrorEvent(const AtomicString& type,
-                            const SpeechSynthesisErrorEventInit* init);
   const String error_;
 };
 
diff --git a/third_party/blink/renderer/modules/vr/vr_display.cc b/third_party/blink/renderer/modules/vr/vr_display.cc
index 850e5fe..bb80039 100644
--- a/third_party/blink/renderer/modules/vr/vr_display.cc
+++ b/third_party/blink/renderer/modules/vr/vr_display.cc
@@ -295,8 +295,8 @@
     non_immersive_provider_->GetFrameData(WTF::Bind(
         &VRDisplay::OnNonImmersiveFrameData, WrapWeakPersistent(this)));
     pending_non_immersive_vsync_ = true;
-    pending_non_immersive_vsync_id_ =
-        doc->RequestAnimationFrame(new VRDisplayFrameRequestCallback(this));
+    pending_non_immersive_vsync_id_ = doc->RequestAnimationFrame(
+        MakeGarbageCollected<VRDisplayFrameRequestCallback>(this));
     DVLOG(2) << __FUNCTION__ << " done: pending_non_immersive_vsync_="
              << pending_non_immersive_vsync_;
   }
diff --git a/third_party/blink/renderer/modules/webaudio/analyser_node.cc b/third_party/blink/renderer/modules/webaudio/analyser_node.cc
index a6887cf..c6ee14df 100644
--- a/third_party/blink/renderer/modules/webaudio/analyser_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/analyser_node.cc
@@ -201,7 +201,7 @@
     return nullptr;
   }
 
-  return new AnalyserNode(context);
+  return MakeGarbageCollected<AnalyserNode>(context);
 }
 
 AnalyserNode* AnalyserNode::Create(BaseAudioContext* context,
diff --git a/third_party/blink/renderer/modules/webaudio/analyser_node.h b/third_party/blink/renderer/modules/webaudio/analyser_node.h
index 235bfd7..21a366e 100644
--- a/third_party/blink/renderer/modules/webaudio/analyser_node.h
+++ b/third_party/blink/renderer/modules/webaudio/analyser_node.h
@@ -106,6 +106,8 @@
                               const AnalyserOptions*,
                               ExceptionState&);
 
+  AnalyserNode(BaseAudioContext&);
+
   unsigned fftSize() const;
   void setFftSize(unsigned size, ExceptionState&);
   unsigned frequencyBinCount() const;
@@ -121,7 +123,6 @@
   void getByteTimeDomainData(NotShared<DOMUint8Array>);
 
  private:
-  AnalyserNode(BaseAudioContext&);
   AnalyserHandler& GetAnalyserHandler() const;
 
   void SetMinMaxDecibels(double min, double max, ExceptionState&);
diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.cc b/third_party/blink/renderer/modules/webaudio/audio_buffer.cc
index 37818f2..ae02dde 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_buffer.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_buffer.cc
@@ -47,8 +47,8 @@
       !number_of_channels || !number_of_frames)
     return nullptr;
 
-  AudioBuffer* buffer =
-      new AudioBuffer(number_of_channels, number_of_frames, sample_rate);
+  AudioBuffer* buffer = MakeGarbageCollected<AudioBuffer>(
+      number_of_channels, number_of_frames, sample_rate);
 
   if (!buffer->CreatedSuccessfully(number_of_channels))
     return nullptr;
@@ -119,8 +119,8 @@
       !number_of_channels || !number_of_frames)
     return nullptr;
 
-  AudioBuffer* buffer = new AudioBuffer(number_of_channels, number_of_frames,
-                                        sample_rate, kDontInitialize);
+  AudioBuffer* buffer = MakeGarbageCollected<AudioBuffer>(
+      number_of_channels, number_of_frames, sample_rate, kDontInitialize);
 
   if (!buffer->CreatedSuccessfully(number_of_channels))
     return nullptr;
@@ -134,7 +134,7 @@
   scoped_refptr<AudioBus> bus =
       CreateBusFromInMemoryAudioFile(data, data_size, mix_to_mono, sample_rate);
   if (bus) {
-    AudioBuffer* buffer = new AudioBuffer(bus.get());
+    AudioBuffer* buffer = MakeGarbageCollected<AudioBuffer>(bus.get());
     if (buffer->CreatedSuccessfully(bus->NumberOfChannels()))
       return buffer;
   }
@@ -145,7 +145,7 @@
 AudioBuffer* AudioBuffer::CreateFromAudioBus(AudioBus* bus) {
   if (!bus)
     return nullptr;
-  AudioBuffer* buffer = new AudioBuffer(bus);
+  AudioBuffer* buffer = MakeGarbageCollected<AudioBuffer>(bus);
   if (buffer->CreatedSuccessfully(bus->NumberOfChannels()))
     return buffer;
   return nullptr;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer.h b/third_party/blink/renderer/modules/webaudio/audio_buffer.h
index 9867f77..ae3389c 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_buffer.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_buffer.h
@@ -72,6 +72,16 @@
 
   static AudioBuffer* CreateFromAudioBus(AudioBus*);
 
+  explicit AudioBuffer(AudioBus*);
+  // How to initialize the contents of an AudioBuffer.  Default is to
+  // zero-initialize (|kZeroInitialize|).  Otherwise, leave the array
+  // uninitialized (|kDontInitialize|).
+  enum InitializationPolicy { kZeroInitialize, kDontInitialize };
+  AudioBuffer(unsigned number_of_channels,
+              uint32_t number_of_frames,
+              float sample_rate,
+              InitializationPolicy allocation_policy = kZeroInitialize);
+
   // Format
   uint32_t length() const { return length_; }
   double duration() const {
@@ -107,21 +117,10 @@
   }
 
  private:
-  // How to initialize the contents of an AudioBuffer.  Default is to
-  // zero-initialize (|kZeroInitialize|).  Otherwise, leave the array
-  // uninitialized (|kDontInitialize|).
-  enum InitializationPolicy { kZeroInitialize, kDontInitialize };
-
-  explicit AudioBuffer(AudioBus*);
-
   static DOMFloat32Array* CreateFloat32ArrayOrNull(
       uint32_t length,
       InitializationPolicy allocation_policy = kZeroInitialize);
 
-  AudioBuffer(unsigned number_of_channels,
-              uint32_t number_of_frames,
-              float sample_rate,
-              InitializationPolicy allocation_policy = kZeroInitialize);
   bool CreatedSuccessfully(unsigned desired_number_of_channels) const;
 
   float sample_rate_;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.cc b/third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.cc
index 5f1162e..1d9ddec 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.cc
@@ -682,7 +682,7 @@
     return nullptr;
   }
 
-  return new AudioBufferSourceNode(context);
+  return MakeGarbageCollected<AudioBufferSourceNode>(context);
 }
 
 AudioBufferSourceNode* AudioBufferSourceNode::Create(
diff --git a/third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.h b/third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.h
index 27e2826..5f49b49 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.h
@@ -193,6 +193,7 @@
   static AudioBufferSourceNode* Create(BaseAudioContext*,
                                        AudioBufferSourceOptions*,
                                        ExceptionState&);
+  AudioBufferSourceNode(BaseAudioContext&);
   void Trace(blink::Visitor*) override;
   AudioBufferSourceHandler& GetAudioBufferSourceHandler() const;
 
@@ -216,8 +217,6 @@
              ExceptionState&);
 
  private:
-  AudioBufferSourceNode(BaseAudioContext&);
-
   Member<AudioParam> playback_rate_;
   Member<AudioParam> detune_;
 };
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc
index 6ebe91e4..3ff688d 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
@@ -64,7 +64,8 @@
         WebAudioLatencyHint(context_options->latencyHint().GetAsDouble());
   }
 
-  AudioContext* audio_context = new AudioContext(document, latency_hint);
+  AudioContext* audio_context =
+      MakeGarbageCollected<AudioContext>(document, latency_hint);
   audio_context->PauseIfNeeded();
 
   if (!audio_utilities::IsValidAudioBufferSampleRate(
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.h b/third_party/blink/renderer/modules/webaudio/audio_context.h
index c9bd2a5..8585846 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.h
@@ -37,6 +37,7 @@
                               const AudioContextOptions*,
                               ExceptionState&);
 
+  AudioContext(Document&, const WebAudioLatencyHint&);
   ~AudioContext() override;
   void Trace(blink::Visitor*) override;
 
@@ -67,7 +68,6 @@
   void NotifySourceNodeStart() final;
 
  protected:
-  AudioContext(Document&, const WebAudioLatencyHint&);
   void Uninitialize() final;
 
  private:
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context_autoplay_test.cc b/third_party/blink/renderer/modules/webaudio/audio_context_autoplay_test.cc
index e58c2f400..5028a5f 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context_autoplay_test.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_context_autoplay_test.cc
@@ -38,9 +38,11 @@
 class MockCrossOriginLocalFrameClient final : public EmptyLocalFrameClient {
  public:
   static MockCrossOriginLocalFrameClient* Create(Frame* parent) {
-    return new MockCrossOriginLocalFrameClient(parent);
+    return MakeGarbageCollected<MockCrossOriginLocalFrameClient>(parent);
   }
 
+  explicit MockCrossOriginLocalFrameClient(Frame* parent) : parent_(parent) {}
+
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(parent_);
     EmptyLocalFrameClient::Trace(visitor);
@@ -50,8 +52,6 @@
   Frame* Top() const override { return parent_.Get(); }
 
  private:
-  explicit MockCrossOriginLocalFrameClient(Frame* parent) : parent_(parent) {}
-
   Member<Frame> parent_;
 };
 
diff --git a/third_party/blink/renderer/modules/webaudio/audio_listener.h b/third_party/blink/renderer/modules/webaudio/audio_listener.h
index 608bd4d..ffe857b 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_listener.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_listener.h
@@ -47,8 +47,10 @@
 
  public:
   static AudioListener* Create(BaseAudioContext& context) {
-    return new AudioListener(context);
+    return MakeGarbageCollected<AudioListener>(context);
   }
+
+  AudioListener(BaseAudioContext&);
   ~AudioListener() override;
 
   // Location of the listener
@@ -131,8 +133,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AudioListener(BaseAudioContext&);
-
   void setPosition(const FloatPoint3D&, ExceptionState&);
   void setOrientation(const FloatPoint3D&, ExceptionState&);
   void SetUpVector(const FloatPoint3D&, ExceptionState&);
diff --git a/third_party/blink/renderer/modules/webaudio/audio_param.cc b/third_party/blink/renderer/modules/webaudio/audio_param.cc
index 70af68e..307273b5 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_param.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_param.cc
@@ -349,11 +349,11 @@
 AudioParam* AudioParam::Create(BaseAudioContext& context,
                                AudioParamType param_type,
                                double default_value) {
-  return new AudioParam(context, param_type, default_value,
-                        AudioParamHandler::AutomationRate::kAudio,
-                        AudioParamHandler::AutomationRateMode::kVariable,
-                        -std::numeric_limits<float>::max(),
-                        std::numeric_limits<float>::max());
+  return MakeGarbageCollected<AudioParam>(
+      context, param_type, default_value,
+      AudioParamHandler::AutomationRate::kAudio,
+      AudioParamHandler::AutomationRateMode::kVariable,
+      -std::numeric_limits<float>::max(), std::numeric_limits<float>::max());
 }
 
 AudioParam* AudioParam::Create(BaseAudioContext& context,
@@ -365,8 +365,9 @@
                                float max_value) {
   DCHECK_LE(min_value, max_value);
 
-  return new AudioParam(context, param_type, default_value, rate, rate_mode,
-                        min_value, max_value);
+  return MakeGarbageCollected<AudioParam>(context, param_type, default_value,
+                                          rate, rate_mode, min_value,
+                                          max_value);
 }
 
 AudioParam::~AudioParam() {
diff --git a/third_party/blink/renderer/modules/webaudio/audio_param.h b/third_party/blink/renderer/modules/webaudio/audio_param.h
index eca5b58..6339400 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_param.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_param.h
@@ -273,6 +273,13 @@
       float min_value = -std::numeric_limits<float>::max(),
       float max_value = std::numeric_limits<float>::max());
 
+  AudioParam(BaseAudioContext&,
+             AudioParamType,
+             double default_value,
+             AudioParamHandler::AutomationRate rate,
+             AudioParamHandler::AutomationRateMode rate_mode,
+             float min,
+             float max);
   ~AudioParam() override;
 
   void Trace(blink::Visitor*) override;
@@ -317,14 +324,6 @@
   AudioParam* cancelAndHoldAtTime(double start_time, ExceptionState&);
 
  private:
-  AudioParam(BaseAudioContext&,
-             AudioParamType,
-             double default_value,
-             AudioParamHandler::AutomationRate rate,
-             AudioParamHandler::AutomationRateMode rate_mode,
-             float min,
-             float max);
-
   void WarnIfOutsideRange(const String& param_methd, float value);
 
   scoped_refptr<AudioParamHandler> handler_;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_param_map.cc b/third_party/blink/renderer/modules/webaudio/audio_param_map.cc
index e310a52..de7c7b1 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_param_map.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_param_map.cc
@@ -47,7 +47,7 @@
 
 PairIterable<String, AudioParam*>::IterationSource*
     AudioParamMap::StartIteration(ScriptState*, ExceptionState&) {
-  return new AudioParamMapIterationSource(parameter_map_);
+  return MakeGarbageCollected<AudioParamMapIterationSource>(parameter_map_);
 }
 
 bool AudioParamMap::GetMapEntry(ScriptState*,
diff --git a/third_party/blink/renderer/modules/webaudio/audio_processing_event.cc b/third_party/blink/renderer/modules/webaudio/audio_processing_event.cc
index c5629a61..5d26c22c 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_processing_event.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_processing_event.cc
@@ -31,19 +31,20 @@
 namespace blink {
 
 AudioProcessingEvent* AudioProcessingEvent::Create() {
-  return new AudioProcessingEvent;
+  return MakeGarbageCollected<AudioProcessingEvent>();
 }
 
 AudioProcessingEvent* AudioProcessingEvent::Create(AudioBuffer* input_buffer,
                                                    AudioBuffer* output_buffer,
                                                    double playback_time) {
-  return new AudioProcessingEvent(input_buffer, output_buffer, playback_time);
+  return MakeGarbageCollected<AudioProcessingEvent>(input_buffer, output_buffer,
+                                                    playback_time);
 }
 
 AudioProcessingEvent* AudioProcessingEvent::Create(
     const AtomicString& type,
     const AudioProcessingEventInit* initializer) {
-  return new AudioProcessingEvent(type, initializer);
+  return MakeGarbageCollected<AudioProcessingEvent>(type, initializer);
 }
 
 AudioProcessingEvent::AudioProcessingEvent() = default;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_processing_event.h b/third_party/blink/renderer/modules/webaudio/audio_processing_event.h
index 705a3d4..9c662f38 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_processing_event.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_processing_event.h
@@ -48,6 +48,12 @@
   static AudioProcessingEvent* Create(const AtomicString& type,
                                       const AudioProcessingEventInit*);
 
+  AudioProcessingEvent();
+  AudioProcessingEvent(AudioBuffer* input_buffer,
+                       AudioBuffer* output_buffer,
+                       double playback_time);
+  AudioProcessingEvent(const AtomicString& type,
+                       const AudioProcessingEventInit*);
   ~AudioProcessingEvent() override;
 
   AudioBuffer* inputBuffer() { return input_buffer_.Get(); }
@@ -59,13 +65,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AudioProcessingEvent();
-  AudioProcessingEvent(AudioBuffer* input_buffer,
-                       AudioBuffer* output_buffer,
-                       double playback_time);
-  AudioProcessingEvent(const AtomicString& type,
-                       const AudioProcessingEventInit*);
-
   Member<AudioBuffer> input_buffer_;
   Member<AudioBuffer> output_buffer_;
   double playback_time_;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet.cc
index 761113d..7403a9d7 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet.cc
@@ -17,7 +17,7 @@
 namespace blink {
 
 AudioWorklet* AudioWorklet::Create(BaseAudioContext* context) {
-  return new AudioWorklet(context);
+  return MakeGarbageCollected<AudioWorklet>(context);
 }
 
 AudioWorklet::AudioWorklet(BaseAudioContext* context)
@@ -80,7 +80,8 @@
   DCHECK_EQ(GetNumberOfGlobalScopes(), 0u);
 
   AudioWorkletMessagingProxy* proxy =
-      new AudioWorkletMessagingProxy(GetExecutionContext(), this);
+      MakeGarbageCollected<AudioWorkletMessagingProxy>(GetExecutionContext(),
+                                                       this);
   proxy->Initialize(WorkerClients::Create(), ModuleResponsesMap());
   return proxy;
 }
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet.h b/third_party/blink/renderer/modules/webaudio/audio_worklet.h
index ab36e530..0086815 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet.h
@@ -26,6 +26,7 @@
  public:
   static AudioWorklet* Create(BaseAudioContext*);
 
+  explicit AudioWorklet(BaseAudioContext*);
   ~AudioWorklet() override = default;
 
   void CreateProcessor(scoped_refptr<AudioWorkletHandler>,
@@ -55,8 +56,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  explicit AudioWorklet(BaseAudioContext*);
-
   // Implements Worklet
   bool NeedsToCreateGlobalScope() final;
   WorkletGlobalScopeProxy* CreateGlobalScope() final;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.cc
index b5f727fb..835af6a 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.cc
@@ -38,7 +38,8 @@
 AudioWorkletGlobalScope* AudioWorkletGlobalScope::Create(
     std::unique_ptr<GlobalScopeCreationParams> creation_params,
     WorkerThread* thread) {
-  return new AudioWorkletGlobalScope(std::move(creation_params), thread);
+  return MakeGarbageCollected<AudioWorkletGlobalScope>(
+      std::move(creation_params), thread);
 }
 
 AudioWorkletGlobalScope::AudioWorkletGlobalScope(
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.h b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.h
index d6154430..d3b4309 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.h
@@ -54,7 +54,11 @@
   static AudioWorkletGlobalScope* Create(
       std::unique_ptr<GlobalScopeCreationParams>,
       WorkerThread*);
+
+  AudioWorkletGlobalScope(std::unique_ptr<GlobalScopeCreationParams>,
+                          WorkerThread*);
   ~AudioWorkletGlobalScope() override;
+
   bool IsAudioWorkletGlobalScope() const final { return true; }
   void Dispose() final;
   bool IsClosing() const final { return is_closing_; }
@@ -104,9 +108,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AudioWorkletGlobalScope(std::unique_ptr<GlobalScopeCreationParams>,
-                          WorkerThread*);
-
   bool is_closing_ = false;
 
   typedef HeapHashMap<String,
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc
index c60b041..1e10cd0d 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc
@@ -75,7 +75,8 @@
             nullptr /* worker_clients */, document->AddressSpace(),
             OriginTrialContext::GetTokens(document).get(),
             base::UnguessableToken::Create(), nullptr /* worker_settings */,
-            kV8CacheOptionsDefault, new WorkletModuleResponsesMap),
+            kV8CacheOptionsDefault,
+            MakeGarbageCollected<WorkletModuleResponsesMap>()),
         base::nullopt, std::make_unique<WorkerDevToolsParams>(),
         ParentExecutionContextTaskRunners::Create());
     return thread;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_node.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_node.cc
index 055cb2b5..e22cef3 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_node.cc
@@ -242,7 +242,7 @@
       }
     }
   }
-  parameter_map_ = new AudioParamMap(audio_param_map);
+  parameter_map_ = MakeGarbageCollected<AudioParamMap>(audio_param_map);
 
   SetHandler(AudioWorkletHandler::Create(*this,
                                          context.sampleRate(),
@@ -320,10 +320,10 @@
       MessageChannel::Create(context->GetExecutionContext());
   MessagePortChannel processor_port_channel = channel->port2()->Disentangle();
 
-  AudioWorkletNode* node =
-      new AudioWorkletNode(*context, name, options,
-          context->audioWorklet()->GetParamInfoListForProcessor(name),
-          channel->port1());
+  AudioWorkletNode* node = MakeGarbageCollected<AudioWorkletNode>(
+      *context, name, options,
+      context->audioWorklet()->GetParamInfoListForProcessor(name),
+      channel->port1());
 
   if (!node) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_node.h b/third_party/blink/renderer/modules/webaudio/audio_worklet_node.h
index 5a67d49..ae5c54e3 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_node.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_node.h
@@ -102,6 +102,12 @@
                                   const AudioWorkletNodeOptions*,
                                   ExceptionState&);
 
+  AudioWorkletNode(BaseAudioContext&,
+                   const String& name,
+                   const AudioWorkletNodeOptions*,
+                   const Vector<CrossThreadAudioParamInfo>,
+                   MessagePort* node_port);
+
   // ActiveScriptWrappable
   bool HasPendingActivity() const final;
 
@@ -115,12 +121,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AudioWorkletNode(BaseAudioContext&,
-                   const String& name,
-                   const AudioWorkletNodeOptions*,
-                   const Vector<CrossThreadAudioParamInfo>,
-                   MessagePort* node_port);
-
   scoped_refptr<AudioWorkletHandler> GetWorkletHandler() const;
 
   Member<AudioParamMap> parameter_map_;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_processor.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_processor.cc
index 67fa0ed..bc094b73 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_processor.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_processor.cc
@@ -23,7 +23,8 @@
 
   MessagePort* port = MessagePort::Create(*global_scope);
   port->Entangle(std::move(params->PortChannel()));
-  return new AudioWorkletProcessor(global_scope, params->Name(), port);
+  return MakeGarbageCollected<AudioWorkletProcessor>(global_scope,
+                                                     params->Name(), port);
 }
 
 AudioWorkletProcessor::AudioWorkletProcessor(
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_processor.h b/third_party/blink/renderer/modules/webaudio/audio_worklet_processor.h
index 02abe39..e5e9aed 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_processor.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_processor.h
@@ -38,6 +38,9 @@
   // |AudioWorkletGlobalScope|.
   static AudioWorkletProcessor* Create(ExecutionContext*);
 
+  AudioWorkletProcessor(AudioWorkletGlobalScope*,
+                        const String& name,
+                        MessagePort*);
   ~AudioWorkletProcessor() override = default;
 
   // |AudioWorkletHandler| invokes this method to process audio.
@@ -58,10 +61,6 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  AudioWorkletProcessor(AudioWorkletGlobalScope*,
-                        const String& name,
-                        MessagePort*);
-
   Member<AudioWorkletGlobalScope> global_scope_;
   Member<MessagePort> processor_port_;
 
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_processor_definition.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_processor_definition.cc
index 80baa71..772cc47 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_processor_definition.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_processor_definition.cc
@@ -12,8 +12,8 @@
     v8::Local<v8::Object> constructor,
     v8::Local<v8::Function> process) {
   DCHECK(!IsMainThread());
-  return new AudioWorkletProcessorDefinition(isolate, name, constructor,
-                                             process);
+  return MakeGarbageCollected<AudioWorkletProcessorDefinition>(
+      isolate, name, constructor, process);
 }
 
 AudioWorkletProcessorDefinition::AudioWorkletProcessorDefinition(
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_processor_definition.h b/third_party/blink/renderer/modules/webaudio/audio_worklet_processor_definition.h
index d54fdb2..c297824 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_processor_definition.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_processor_definition.h
@@ -32,6 +32,10 @@
       v8::Local<v8::Object> constructor,
       v8::Local<v8::Function> process);
 
+  AudioWorkletProcessorDefinition(v8::Isolate*,
+                                  const String& name,
+                                  v8::Local<v8::Object> constructor,
+                                  v8::Local<v8::Function> process);
   virtual ~AudioWorkletProcessorDefinition();
 
   const String& GetName() const { return name_; }
@@ -57,12 +61,6 @@
   }
 
  private:
-  AudioWorkletProcessorDefinition(
-      v8::Isolate*,
-      const String& name,
-      v8::Local<v8::Object> constructor,
-      v8::Local<v8::Function> process);
-
   const String name_;
   bool is_synchronized_ = false;
 
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
index 97250df4..3847c25 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
@@ -59,7 +59,8 @@
             nullptr /* worker_clients */, document->AddressSpace(),
             OriginTrialContext::GetTokens(document).get(),
             base::UnguessableToken::Create(), nullptr /* worker_settings */,
-            kV8CacheOptionsDefault, new WorkletModuleResponsesMap),
+            kV8CacheOptionsDefault,
+            MakeGarbageCollected<WorkletModuleResponsesMap>()),
         base::nullopt, std::make_unique<WorkerDevToolsParams>(),
         ParentExecutionContextTaskRunners::Create());
     return thread;
diff --git a/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc b/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc
index 07cb774..825a68f 100644
--- a/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc
@@ -108,7 +108,7 @@
     return nullptr;
   }
 
-  return new BiquadFilterNode(context);
+  return MakeGarbageCollected<BiquadFilterNode>(context);
 }
 
 BiquadFilterNode* BiquadFilterNode::Create(BaseAudioContext* context,
diff --git a/third_party/blink/renderer/modules/webaudio/biquad_filter_node.h b/third_party/blink/renderer/modules/webaudio/biquad_filter_node.h
index e4a7b177..fb59ba2 100644
--- a/third_party/blink/renderer/modules/webaudio/biquad_filter_node.h
+++ b/third_party/blink/renderer/modules/webaudio/biquad_filter_node.h
@@ -78,6 +78,8 @@
                                   const BiquadFilterOptions*,
                                   ExceptionState&);
 
+  BiquadFilterNode(BaseAudioContext&);
+
   void Trace(blink::Visitor*) override;
 
   String type() const;
@@ -96,8 +98,6 @@
                             ExceptionState&);
 
  private:
-  BiquadFilterNode(BaseAudioContext&);
-
   BiquadProcessor* GetBiquadProcessor() const;
   bool setType(unsigned);  // Returns true on success.
 
diff --git a/third_party/blink/renderer/modules/webaudio/channel_merger_node.cc b/third_party/blink/renderer/modules/webaudio/channel_merger_node.cc
index a1d325c..e1c94d1 100644
--- a/third_party/blink/renderer/modules/webaudio/channel_merger_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/channel_merger_node.cc
@@ -160,7 +160,7 @@
     return nullptr;
   }
 
-  return new ChannelMergerNode(context, number_of_inputs);
+  return MakeGarbageCollected<ChannelMergerNode>(context, number_of_inputs);
 }
 
 ChannelMergerNode* ChannelMergerNode::Create(
diff --git a/third_party/blink/renderer/modules/webaudio/channel_merger_node.h b/third_party/blink/renderer/modules/webaudio/channel_merger_node.h
index eb92527..19ec372 100644
--- a/third_party/blink/renderer/modules/webaudio/channel_merger_node.h
+++ b/third_party/blink/renderer/modules/webaudio/channel_merger_node.h
@@ -69,7 +69,6 @@
                                    const ChannelMergerOptions*,
                                    ExceptionState&);
 
- private:
   ChannelMergerNode(BaseAudioContext&, unsigned number_of_inputs);
 };
 
diff --git a/third_party/blink/renderer/modules/webaudio/channel_splitter_node.cc b/third_party/blink/renderer/modules/webaudio/channel_splitter_node.cc
index 6471c29..7f6199c 100644
--- a/third_party/blink/renderer/modules/webaudio/channel_splitter_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/channel_splitter_node.cc
@@ -166,7 +166,7 @@
     return nullptr;
   }
 
-  return new ChannelSplitterNode(context, number_of_outputs);
+  return MakeGarbageCollected<ChannelSplitterNode>(context, number_of_outputs);
 }
 
 ChannelSplitterNode* ChannelSplitterNode::Create(
diff --git a/third_party/blink/renderer/modules/webaudio/channel_splitter_node.h b/third_party/blink/renderer/modules/webaudio/channel_splitter_node.h
index 155c8f1..58d1243 100644
--- a/third_party/blink/renderer/modules/webaudio/channel_splitter_node.h
+++ b/third_party/blink/renderer/modules/webaudio/channel_splitter_node.h
@@ -67,7 +67,6 @@
                                      const ChannelSplitterOptions*,
                                      ExceptionState&);
 
- private:
   ChannelSplitterNode(BaseAudioContext&, unsigned number_of_outputs);
 };
 
diff --git a/third_party/blink/renderer/modules/webaudio/constant_source_node.cc b/third_party/blink/renderer/modules/webaudio/constant_source_node.cc
index b5641512..2668309 100644
--- a/third_party/blink/renderer/modules/webaudio/constant_source_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/constant_source_node.cc
@@ -127,7 +127,7 @@
     return nullptr;
   }
 
-  return new ConstantSourceNode(context);
+  return MakeGarbageCollected<ConstantSourceNode>(context);
 }
 
 ConstantSourceNode* ConstantSourceNode::Create(
diff --git a/third_party/blink/renderer/modules/webaudio/constant_source_node.h b/third_party/blink/renderer/modules/webaudio/constant_source_node.h
index 4885e2d7..436217bb 100644
--- a/third_party/blink/renderer/modules/webaudio/constant_source_node.h
+++ b/third_party/blink/renderer/modules/webaudio/constant_source_node.h
@@ -49,12 +49,13 @@
   static ConstantSourceNode* Create(BaseAudioContext*,
                                     const ConstantSourceOptions*,
                                     ExceptionState&);
+
+  ConstantSourceNode(BaseAudioContext&);
   void Trace(blink::Visitor*) override;
 
   AudioParam* offset();
 
  private:
-  ConstantSourceNode(BaseAudioContext&);
   ConstantSourceHandler& GetConstantSourceHandler() const;
 
   Member<AudioParam> offset_;
diff --git a/third_party/blink/renderer/modules/webaudio/convolver_node.cc b/third_party/blink/renderer/modules/webaudio/convolver_node.cc
index 4886bab..a4934eb1a 100644
--- a/third_party/blink/renderer/modules/webaudio/convolver_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/convolver_node.cc
@@ -273,7 +273,7 @@
     return nullptr;
   }
 
-  return new ConvolverNode(context);
+  return MakeGarbageCollected<ConvolverNode>(context);
 }
 
 ConvolverNode* ConvolverNode::Create(BaseAudioContext* context,
diff --git a/third_party/blink/renderer/modules/webaudio/convolver_node.h b/third_party/blink/renderer/modules/webaudio/convolver_node.h
index 9b28e5e..d615533 100644
--- a/third_party/blink/renderer/modules/webaudio/convolver_node.h
+++ b/third_party/blink/renderer/modules/webaudio/convolver_node.h
@@ -98,13 +98,14 @@
                                const ConvolverOptions*,
                                ExceptionState&);
 
+  ConvolverNode(BaseAudioContext&);
+
   AudioBuffer* buffer() const;
   void setBuffer(AudioBuffer*, ExceptionState&);
   bool normalize() const;
   void setNormalize(bool);
 
  private:
-  ConvolverNode(BaseAudioContext&);
   ConvolverHandler& GetConvolverHandler() const;
 
   FRIEND_TEST_ALL_PREFIXES(ConvolverNodeTest, ReverbLifetime);
diff --git a/third_party/blink/renderer/modules/webdatabase/change_version_wrapper.h b/third_party/blink/renderer/modules/webdatabase/change_version_wrapper.h
index e071e80f..f7c9896 100644
--- a/third_party/blink/renderer/modules/webdatabase/change_version_wrapper.h
+++ b/third_party/blink/renderer/modules/webdatabase/change_version_wrapper.h
@@ -41,17 +41,17 @@
  public:
   static ChangeVersionWrapper* Create(const String& old_version,
                                       const String& new_version) {
-    return new ChangeVersionWrapper(old_version, new_version);
+    return MakeGarbageCollected<ChangeVersionWrapper>(old_version, new_version);
   }
 
+  ChangeVersionWrapper(const String& old_version, const String& new_version);
+
   bool PerformPreflight(SQLTransactionBackend*) override;
   bool PerformPostflight(SQLTransactionBackend*) override;
   SQLErrorData* SqlError() const override { return sql_error_.get(); }
   void HandleCommitFailedAfterPostflight(SQLTransactionBackend*) override;
 
  private:
-  ChangeVersionWrapper(const String& old_version, const String& new_version);
-
   String old_version_;
   String new_version_;
   std::unique_ptr<SQLErrorData> sql_error_;
diff --git a/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc b/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc
index b28ced3..4e21c51 100644
--- a/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc
+++ b/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc
@@ -84,9 +84,12 @@
  public:
   static StatementCallback* Create(
       scoped_refptr<ExecuteSQLCallbackWrapper> request_callback) {
-    return new StatementCallback(std::move(request_callback));
+    return MakeGarbageCollected<StatementCallback>(std::move(request_callback));
   }
 
+  explicit StatementCallback(
+      scoped_refptr<ExecuteSQLCallbackWrapper> request_callback)
+      : request_callback_(std::move(request_callback)) {}
   ~StatementCallback() override = default;
 
   bool OnSuccess(SQLTransaction*, SQLResultSet* result_set) override {
@@ -122,10 +125,6 @@
   }
 
  private:
-  explicit StatementCallback(
-      scoped_refptr<ExecuteSQLCallbackWrapper> request_callback)
-      : request_callback_(std::move(request_callback)) {}
-
   scoped_refptr<ExecuteSQLCallbackWrapper> request_callback_;
 };
 
@@ -133,9 +132,13 @@
  public:
   static StatementErrorCallback* Create(
       scoped_refptr<ExecuteSQLCallbackWrapper> request_callback) {
-    return new StatementErrorCallback(std::move(request_callback));
+    return MakeGarbageCollected<StatementErrorCallback>(
+        std::move(request_callback));
   }
 
+  explicit StatementErrorCallback(
+      scoped_refptr<ExecuteSQLCallbackWrapper> request_callback)
+      : request_callback_(std::move(request_callback)) {}
   ~StatementErrorCallback() override = default;
 
   bool OnError(SQLTransaction*, SQLError* error) override {
@@ -144,10 +147,6 @@
   }
 
  private:
-  explicit StatementErrorCallback(
-      scoped_refptr<ExecuteSQLCallbackWrapper> request_callback)
-      : request_callback_(std::move(request_callback)) {}
-
   scoped_refptr<ExecuteSQLCallbackWrapper> request_callback_;
 };
 
@@ -156,9 +155,15 @@
   static TransactionCallback* Create(
       const String& sql_statement,
       scoped_refptr<ExecuteSQLCallbackWrapper> request_callback) {
-    return new TransactionCallback(sql_statement, std::move(request_callback));
+    return MakeGarbageCollected<TransactionCallback>(
+        sql_statement, std::move(request_callback));
   }
 
+  explicit TransactionCallback(
+      const String& sql_statement,
+      scoped_refptr<ExecuteSQLCallbackWrapper> request_callback)
+      : sql_statement_(sql_statement),
+        request_callback_(std::move(request_callback)) {}
   ~TransactionCallback() override = default;
 
   bool OnProcess(SQLTransaction* transaction) override {
@@ -171,12 +176,6 @@
   }
 
  private:
-  explicit TransactionCallback(
-      const String& sql_statement,
-      scoped_refptr<ExecuteSQLCallbackWrapper> request_callback)
-      : sql_statement_(sql_statement),
-        request_callback_(std::move(request_callback)) {}
-
   String sql_statement_;
   scoped_refptr<ExecuteSQLCallbackWrapper> request_callback_;
 };
@@ -185,9 +184,13 @@
  public:
   static TransactionErrorCallback* Create(
       scoped_refptr<ExecuteSQLCallbackWrapper> request_callback) {
-    return new TransactionErrorCallback(std::move(request_callback));
+    return MakeGarbageCollected<TransactionErrorCallback>(
+        std::move(request_callback));
   }
 
+  explicit TransactionErrorCallback(
+      scoped_refptr<ExecuteSQLCallbackWrapper> request_callback)
+      : request_callback_(std::move(request_callback)) {}
   ~TransactionErrorCallback() override = default;
 
   bool OnError(SQLError* error) override {
@@ -196,10 +199,6 @@
   }
 
  private:
-  explicit TransactionErrorCallback(
-      scoped_refptr<ExecuteSQLCallbackWrapper> request_callback)
-      : request_callback_(std::move(request_callback)) {}
-
   scoped_refptr<ExecuteSQLCallbackWrapper> request_callback_;
 };
 
diff --git a/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.cc b/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.cc
index 2499a82..29f14d52 100644
--- a/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.cc
+++ b/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.cc
@@ -46,7 +46,7 @@
 
 ANGLEInstancedArrays* ANGLEInstancedArrays::Create(
     WebGLRenderingContextBase* context) {
-  return new ANGLEInstancedArrays(context);
+  return MakeGarbageCollected<ANGLEInstancedArrays>(context);
 }
 
 bool ANGLEInstancedArrays::Supported(WebGLRenderingContextBase* context) {
diff --git a/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h b/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h
index f90bbcd7..859a34a 100644
--- a/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h
+++ b/third_party/blink/renderer/modules/webgl/angle_instanced_arrays.h
@@ -44,6 +44,8 @@
   static bool Supported(WebGLRenderingContextBase*);
   static const char* ExtensionName();
 
+  explicit ANGLEInstancedArrays(WebGLRenderingContextBase*);
+
   WebGLExtensionName GetName() const override;
 
   void drawArraysInstancedANGLE(GLenum mode,
@@ -56,9 +58,6 @@
                                   long long offset,
                                   GLsizei primcount);
   void vertexAttribDivisorANGLE(GLuint index, GLuint divisor);
-
- private:
-  explicit ANGLEInstancedArrays(WebGLRenderingContextBase*);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.cc b/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.cc
index 649ee4be..a2ea7c5 100644
--- a/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.cc
+++ b/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.cc
@@ -44,7 +44,7 @@
 
 KHRParallelShaderCompile* KHRParallelShaderCompile::Create(
     WebGLRenderingContextBase* context) {
-  return new KHRParallelShaderCompile(context);
+  return MakeGarbageCollected<KHRParallelShaderCompile>(context);
 }
 
 void KHRParallelShaderCompile::maxShaderCompilerThreadsKHR(GLuint count) {
diff --git a/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.h b/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.h
index e777123..02886101 100644
--- a/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.h
+++ b/third_party/blink/renderer/modules/webgl/khr_parallel_shader_compile.h
@@ -42,7 +42,6 @@
 
   void maxShaderCompilerThreadsKHR(GLuint count);
 
- private:
   explicit KHRParallelShaderCompile(WebGLRenderingContextBase*);
 };
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl_framebuffer.cc b/third_party/blink/renderer/modules/webgl/webgl_framebuffer.cc
index 397c596..4637d403 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_framebuffer.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_framebuffer.cc
@@ -39,12 +39,12 @@
  public:
   static WebGLFramebuffer::WebGLAttachment* Create(WebGLRenderbuffer*);
 
+  explicit WebGLRenderbufferAttachment(WebGLRenderbuffer*);
+
   void Trace(blink::Visitor*) override;
   const char* NameInHeapSnapshot() const override { return "WebGLAttachment"; }
 
  private:
-  explicit WebGLRenderbufferAttachment(WebGLRenderbuffer*);
-
   WebGLSharedObject* Object() const override;
   bool IsSharedObject(WebGLSharedObject*) const override;
   bool Valid() const override;
@@ -61,7 +61,7 @@
 
 WebGLFramebuffer::WebGLAttachment* WebGLRenderbufferAttachment::Create(
     WebGLRenderbuffer* renderbuffer) {
-  return new WebGLRenderbufferAttachment(renderbuffer);
+  return MakeGarbageCollected<WebGLRenderbufferAttachment>(renderbuffer);
 }
 
 void WebGLRenderbufferAttachment::Trace(blink::Visitor* visitor) {
@@ -110,17 +110,17 @@
                                                    GLint level,
                                                    GLint layer);
 
+  WebGLTextureAttachment(WebGLTexture*,
+                         GLenum target,
+                         GLint level,
+                         GLint layer);
+
   void Trace(blink::Visitor*) override;
   const char* NameInHeapSnapshot() const override {
     return "WebGLTextureAttachment";
   }
 
  private:
-  WebGLTextureAttachment(WebGLTexture*,
-                         GLenum target,
-                         GLint level,
-                         GLint layer);
-
   WebGLSharedObject* Object() const override;
   bool IsSharedObject(WebGLSharedObject*) const override;
   bool Valid() const override;
@@ -143,7 +143,8 @@
     GLenum target,
     GLint level,
     GLint layer) {
-  return new WebGLTextureAttachment(texture, target, level, layer);
+  return MakeGarbageCollected<WebGLTextureAttachment>(texture, target, level,
+                                                      layer);
 }
 
 void WebGLTextureAttachment::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
index 58fbb7a..ed1a145ec 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -871,9 +871,16 @@
     static TypedExtensionTracker<T>* Create(Member<T>& extension_field,
                                             ExtensionFlags flags,
                                             const char* const* prefixes) {
-      return new TypedExtensionTracker<T>(extension_field, flags, prefixes);
+      return MakeGarbageCollected<TypedExtensionTracker<T>>(extension_field,
+                                                            flags, prefixes);
     }
 
+    TypedExtensionTracker(Member<T>& extension_field,
+                          ExtensionFlags flags,
+                          const char* const* prefixes)
+        : ExtensionTracker(flags, prefixes),
+          extension_field_(extension_field) {}
+
     WebGLExtension* GetExtension(WebGLRenderingContextBase* context) override {
       if (!extension_) {
         extension_ = T::Create(context);
@@ -907,12 +914,6 @@
     }
 
    private:
-    TypedExtensionTracker(Member<T>& extension_field,
-                          ExtensionFlags flags,
-                          const char* const* prefixes)
-        : ExtensionTracker(flags, prefixes),
-          extension_field_(extension_field) {}
-
     GC_PLUGIN_IGNORE("http://crbug.com/519953")
     Member<T>& extension_field_;
     // ExtensionTracker holds it's own reference to the extension to ensure
diff --git a/third_party/blink/renderer/modules/websockets/close_event.h b/third_party/blink/renderer/modules/websockets/close_event.h
index 96f686e..14c2774 100644
--- a/third_party/blink/renderer/modules/websockets/close_event.h
+++ b/third_party/blink/renderer/modules/websockets/close_event.h
@@ -46,19 +46,27 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static CloseEvent* Create() { return new CloseEvent(); }
+  static CloseEvent* Create() { return MakeGarbageCollected<CloseEvent>(); }
 
   static CloseEvent* Create(bool was_clean,
                             unsigned short code,
                             const String& reason) {
-    return new CloseEvent(was_clean, code, reason);
+    return MakeGarbageCollected<CloseEvent>(was_clean, code, reason);
   }
 
   static CloseEvent* Create(const AtomicString& type,
                             const CloseEventInit* initializer) {
-    return new CloseEvent(type, initializer);
+    return MakeGarbageCollected<CloseEvent>(type, initializer);
   }
 
+  CloseEvent() : was_clean_(false), code_(0) {}
+  CloseEvent(bool was_clean, int code, const String& reason)
+      : Event(event_type_names::kClose, Bubbles::kNo, Cancelable::kNo),
+        was_clean_(was_clean),
+        code_(code),
+        reason_(reason) {}
+  CloseEvent(const AtomicString& type, const CloseEventInit* initializer);
+
   bool wasClean() const { return was_clean_; }
   unsigned short code() const { return code_; }
   String reason() const { return reason_; }
@@ -71,16 +79,6 @@
   void Trace(blink::Visitor* visitor) override { Event::Trace(visitor); }
 
  private:
-  CloseEvent() : was_clean_(false), code_(0) {}
-
-  CloseEvent(bool was_clean, int code, const String& reason)
-      : Event(event_type_names::kClose, Bubbles::kNo, Cancelable::kNo),
-        was_clean_(was_clean),
-        code_(code),
-        reason_(reason) {}
-
-  CloseEvent(const AtomicString& type, const CloseEventInit* initializer);
-
   bool was_clean_;
   unsigned short code_;
   String reason_;
diff --git a/third_party/blink/renderer/modules/websockets/dom_websocket_test.cc b/third_party/blink/renderer/modules/websockets/dom_websocket_test.cc
index 784928d..1e36a8b 100644
--- a/third_party/blink/renderer/modules/websockets/dom_websocket_test.cc
+++ b/third_party/blink/renderer/modules/websockets/dom_websocket_test.cc
@@ -44,7 +44,7 @@
 class MockWebSocketChannel : public WebSocketChannel {
  public:
   static MockWebSocketChannel* Create() {
-    return new testing::StrictMock<MockWebSocketChannel>();
+    return MakeGarbageCollected<testing::StrictMock<MockWebSocketChannel>>();
   }
 
   ~MockWebSocketChannel() override = default;
@@ -81,11 +81,16 @@
  public:
   static DOMWebSocketWithMockChannel* Create(ExecutionContext* context) {
     DOMWebSocketWithMockChannel* websocket =
-        new DOMWebSocketWithMockChannel(context);
+        MakeGarbageCollected<DOMWebSocketWithMockChannel>(context);
     websocket->PauseIfNeeded();
     return websocket;
   }
 
+  explicit DOMWebSocketWithMockChannel(ExecutionContext* context)
+      : DOMWebSocket(context),
+        channel_(MockWebSocketChannel::Create()),
+        has_created_channel_(false) {}
+
   MockWebSocketChannel* Channel() { return channel_.Get(); }
 
   WebSocketChannel* CreateChannel(ExecutionContext*,
@@ -101,11 +106,6 @@
   }
 
  private:
-  explicit DOMWebSocketWithMockChannel(ExecutionContext* context)
-      : DOMWebSocket(context),
-        channel_(MockWebSocketChannel::Create()),
-        has_created_channel_(false) {}
-
   Member<MockWebSocketChannel> channel_;
   bool has_created_channel_;
 };
diff --git a/third_party/blink/renderer/modules/websockets/websocket_channel_impl_test.cc b/third_party/blink/renderer/modules/websockets/websocket_channel_impl_test.cc
index c13eb98..cea8502 100644
--- a/third_party/blink/renderer/modules/websockets/websocket_channel_impl_test.cc
+++ b/third_party/blink/renderer/modules/websockets/websocket_channel_impl_test.cc
@@ -46,7 +46,8 @@
 
  public:
   static MockWebSocketChannelClient* Create() {
-    return new testing::StrictMock<MockWebSocketChannelClient>();
+    return MakeGarbageCollected<
+        testing::StrictMock<MockWebSocketChannelClient>>();
   }
 
   MockWebSocketChannelClient() = default;
diff --git a/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc b/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc
index 0928a5e..bab1a0b 100644
--- a/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc
+++ b/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc
@@ -58,8 +58,8 @@
   std::unique_ptr<AnimationAndPaintWorkletThread>
   CreateAnimationAndPaintWorkletThread() {
     WorkerClients* clients = WorkerClients::Create();
-    ProvideAnimationWorkletProxyClientTo(clients,
-                                         new TestAnimationWorkletProxyClient());
+    ProvideAnimationWorkletProxyClientTo(
+        clients, MakeGarbageCollected<TestAnimationWorkletProxyClient>());
 
     std::unique_ptr<AnimationAndPaintWorkletThread> thread =
         AnimationAndPaintWorkletThread::CreateForAnimationWorklet(
@@ -74,7 +74,8 @@
             document->AddressSpace(),
             OriginTrialContext::GetTokens(document).get(),
             base::UnguessableToken::Create(), nullptr /* worker_settings */,
-            kV8CacheOptionsDefault, new WorkletModuleResponsesMap),
+            kV8CacheOptionsDefault,
+            MakeGarbageCollected<WorkletModuleResponsesMap>()),
         base::nullopt, std::make_unique<WorkerDevToolsParams>(),
         ParentExecutionContextTaskRunners::Create());
     return thread;
diff --git a/third_party/blink/renderer/modules/xr/xr_canvas_input_provider.cc b/third_party/blink/renderer/modules/xr/xr_canvas_input_provider.cc
index 9420e85f..7f9986a 100644
--- a/third_party/blink/renderer/modules/xr/xr_canvas_input_provider.cc
+++ b/third_party/blink/renderer/modules/xr/xr_canvas_input_provider.cc
@@ -52,7 +52,7 @@
 XRCanvasInputProvider::XRCanvasInputProvider(XRSession* session,
                                              HTMLCanvasElement* canvas)
     : session_(session), canvas_(canvas) {
-  listener_ = new XRCanvasInputEventListener(this);
+  listener_ = MakeGarbageCollected<XRCanvasInputEventListener>(this);
   canvas->addEventListener(event_type_names::kPointerdown, listener_);
   canvas->addEventListener(event_type_names::kPointerup, listener_);
   canvas->addEventListener(event_type_names::kPointercancel, listener_);
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
index e935fdb..f26c3ff2 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
+++ b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
@@ -242,7 +242,8 @@
 
   // TODO(http://crbug.com/856257) Remove the special casing for AR and non-AR.
   if (!HasARSession()) {
-    doc->RequestAnimationFrame(new XRFrameProviderRequestCallback(this));
+    doc->RequestAnimationFrame(
+        MakeGarbageCollected<XRFrameProviderRequestCallback>(this));
   }
 }
 
@@ -336,7 +337,8 @@
     // Try to request a regular animation frame to avoid getting stuck.
     DVLOG(1) << __FUNCTION__ << ": NO FRAME DATA!";
     frame_pose_ = nullptr;
-    doc->RequestAnimationFrame(new XRFrameProviderRequestCallback(this));
+    doc->RequestAnimationFrame(
+        MakeGarbageCollected<XRFrameProviderRequestCallback>(this));
     return;
   }
 
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index ba938f7..9c4fe57 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1364,7 +1364,6 @@
     "web_mouse_event.cc",
     "web_mouse_wheel_event.cc",
     "web_pointer_event.cc",
-    "web_task_runner.h",
     "web_test_support.cc",
     "web_test_support.h",
     "web_text_input_info.cc",
diff --git a/third_party/blink/renderer/platform/async_method_runner.h b/third_party/blink/renderer/platform/async_method_runner.h
index 0313d39..e083ccc 100644
--- a/third_party/blink/renderer/platform/async_method_runner.h
+++ b/third_party/blink/renderer/platform/async_method_runner.h
@@ -50,9 +50,20 @@
       TargetClass* object,
       TargetMethod method,
       scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-    return new AsyncMethodRunner(object, method, std::move(task_runner));
+    return MakeGarbageCollected<AsyncMethodRunner>(object, method,
+                                                   std::move(task_runner));
   }
 
+  AsyncMethodRunner(TargetClass* object,
+                    TargetMethod method,
+                    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+      : timer_(std::move(task_runner),
+               this,
+               &AsyncMethodRunner<TargetClass>::Fired),
+        object_(object),
+        method_(method),
+        paused_(false),
+        run_when_unpaused_(false) {}
   ~AsyncMethodRunner() = default;
 
   // Schedules to run the method asynchronously. Do nothing if it's already
@@ -116,17 +127,6 @@
   void Trace(blink::Visitor* visitor) { visitor->Trace(object_); }
 
  private:
-  AsyncMethodRunner(TargetClass* object,
-                    TargetMethod method,
-                    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
-      : timer_(std::move(task_runner),
-               this,
-               &AsyncMethodRunner<TargetClass>::Fired),
-        object_(object),
-        method_(method),
-        paused_(false),
-        run_when_unpaused_(false) {}
-
   void Fired(TimerBase*) { (object_->*method_)(); }
 
   TaskRunnerTimer<AsyncMethodRunner<TargetClass>> timer_;
diff --git a/third_party/blink/renderer/platform/bindings/callback_function_base.h b/third_party/blink/renderer/platform/bindings/callback_function_base.h
index cc38447a..f7da224c 100644
--- a/third_party/blink/renderer/platform/bindings/callback_function_base.h
+++ b/third_party/blink/renderer/platform/bindings/callback_function_base.h
@@ -124,7 +124,8 @@
       std::is_base_of<CallbackFunctionBase, V8CallbackFunction>::value,
       "V8CallbackFunction must be a subclass of CallbackFunctionBase.");
   return callback_function
-             ? new V8PersistentCallbackFunction<V8CallbackFunction>(
+             ? MakeGarbageCollected<
+                   V8PersistentCallbackFunction<V8CallbackFunction>>(
                    callback_function)
              : nullptr;
 }
diff --git a/third_party/blink/renderer/platform/bindings/callback_interface_base.h b/third_party/blink/renderer/platform/bindings/callback_interface_base.h
index cdd141a..de706f72 100644
--- a/third_party/blink/renderer/platform/bindings/callback_interface_base.h
+++ b/third_party/blink/renderer/platform/bindings/callback_interface_base.h
@@ -145,7 +145,8 @@
       std::is_base_of<CallbackInterfaceBase, V8CallbackInterface>::value,
       "V8CallbackInterface must be a subclass of CallbackInterfaceBase.");
   return callback_interface
-             ? new V8PersistentCallbackInterface<V8CallbackInterface>(
+             ? MakeGarbageCollected<
+                   V8PersistentCallbackInterface<V8CallbackInterface>>(
                    callback_interface)
              : nullptr;
 }
diff --git a/third_party/blink/renderer/platform/bindings/v8_binding.h b/third_party/blink/renderer/platform/bindings/v8_binding.h
index 378f543..ba7445d 100644
--- a/third_party/blink/renderer/platform/bindings/v8_binding.h
+++ b/third_party/blink/renderer/platform/bindings/v8_binding.h
@@ -276,9 +276,9 @@
   DCHECK(isolate);
   if (!string || string[0] == '\0')
     return v8::String::Empty(isolate);
-  return v8::String::NewFromOneByte(isolate,
-                                    reinterpret_cast<const uint8_t*>(string),
-                                    v8::NewStringType::kNormal, strlen(string))
+  return v8::String::NewFromOneByte(
+             isolate, reinterpret_cast<const uint8_t*>(string),
+             v8::NewStringType::kNormal, static_cast<int>(strlen(string)))
       .ToLocalChecked();
 }
 
@@ -324,7 +324,7 @@
     return v8::String::Empty(isolate);
   return v8::String::NewFromOneByte(
              isolate, reinterpret_cast<const uint8_t*>(string),
-             v8::NewStringType::kInternalized, strlen(string))
+             v8::NewStringType::kInternalized, static_cast<int>(strlen(string)))
       .ToLocalChecked();
 }
 
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index dc457e72..3df52a3c 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -456,16 +456,6 @@
   RuntimeEnabledFeatures::SetResourceLoadSchedulerEnabled(enable);
 }
 
-void WebRuntimeFeatures::EnableRestrictLazyFrameLoadingToDataSaver(
-    bool enable) {
-  RuntimeEnabledFeatures::SetRestrictLazyFrameLoadingToDataSaverEnabled(enable);
-}
-
-void WebRuntimeFeatures::EnableRestrictLazyImageLoadingToDataSaver(
-    bool enable) {
-  RuntimeEnabledFeatures::SetRestrictLazyImageLoadingToDataSaverEnabled(enable);
-}
-
 void WebRuntimeFeatures::EnableExpensiveBackgroundTimerThrottling(bool enable) {
   RuntimeEnabledFeatures::SetExpensiveBackgroundTimerThrottlingEnabled(enable);
 }
diff --git a/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl_test.cc b/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl_test.cc
index 383fe84..22c2426 100644
--- a/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl_test.cc
+++ b/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl_test.cc
@@ -116,7 +116,7 @@
        RegisteredAnimatorShouldOnlyReceiveInputForItself) {
   std::unique_ptr<Thread> first_thread = CreateThread("FirstThread");
   MockAnimationWorkletMutator* first_mutator =
-      new ::testing::StrictMock<MockAnimationWorkletMutator>(
+      MakeGarbageCollected<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
 
   mutator_->RegisterAnimationWorkletMutator(first_mutator,
@@ -135,7 +135,7 @@
        RegisteredAnimatorShouldNotBeMutatedWhenNoInput) {
   std::unique_ptr<Thread> first_thread = CreateThread("FirstThread");
   MockAnimationWorkletMutator* first_mutator =
-      new ::testing::StrictMock<MockAnimationWorkletMutator>(
+      MakeGarbageCollected<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
 
   mutator_->RegisterAnimationWorkletMutator(first_mutator,
@@ -167,7 +167,7 @@
   // Create a thread to run mutator tasks.
   std::unique_ptr<Thread> first_thread = CreateThread("FirstAnimationThread");
   MockAnimationWorkletMutator* first_mutator =
-      new ::testing::StrictMock<MockAnimationWorkletMutator>(
+      MakeGarbageCollected<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
 
   mutator_->RegisterAnimationWorkletMutator(first_mutator,
@@ -183,7 +183,7 @@
   // Create a thread to run mutator tasks.
   std::unique_ptr<Thread> first_thread = CreateThread("FirstAnimationThread");
   MockAnimationWorkletMutator* first_mutator =
-      new ::testing::StrictMock<MockAnimationWorkletMutator>(
+      MakeGarbageCollected<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
 
   mutator_->RegisterAnimationWorkletMutator(first_mutator,
@@ -212,10 +212,10 @@
        MutationUpdateInvokedCorrectlyWithTwoRegisteredAnimatorsOnSameThread) {
   std::unique_ptr<Thread> first_thread = CreateThread("FirstAnimationThread");
   MockAnimationWorkletMutator* first_mutator =
-      new ::testing::StrictMock<MockAnimationWorkletMutator>(
+      MakeGarbageCollected<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
   MockAnimationWorkletMutator* second_mutator =
-      new ::testing::StrictMock<MockAnimationWorkletMutator>(
+      MakeGarbageCollected<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
 
   mutator_->RegisterAnimationWorkletMutator(first_mutator,
@@ -241,12 +241,12 @@
     MutationUpdateInvokedCorrectlyWithTwoRegisteredAnimatorsOnDifferentThreads) {
   std::unique_ptr<Thread> first_thread = CreateThread("FirstAnimationThread");
   MockAnimationWorkletMutator* first_mutator =
-      new ::testing::StrictMock<MockAnimationWorkletMutator>(
+      MakeGarbageCollected<MockAnimationWorkletMutator>(
           first_thread->GetTaskRunner());
 
   std::unique_ptr<Thread> second_thread = CreateThread("SecondAnimationThread");
   MockAnimationWorkletMutator* second_mutator =
-      new ::testing::StrictMock<MockAnimationWorkletMutator>(
+      MakeGarbageCollected<MockAnimationWorkletMutator>(
           second_thread->GetTaskRunner());
 
   mutator_->RegisterAnimationWorkletMutator(first_mutator,
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image_test.cc b/third_party/blink/renderer/platform/graphics/bitmap_image_test.cc
index 616b61d..d7c0ca1 100644
--- a/third_party/blink/renderer/platform/graphics/bitmap_image_test.cc
+++ b/third_party/blink/renderer/platform/graphics/bitmap_image_test.cc
@@ -233,7 +233,7 @@
 
  protected:
   void SetUp() override {
-    image_observer_ = new FakeImageObserver;
+    image_observer_ = MakeGarbageCollected<FakeImageObserver>();
     image_ = BitmapImage::Create(image_observer_.Get());
   }
 
diff --git a/third_party/blink/renderer/platform/graphics/compositing_reasons.cc b/third_party/blink/renderer/platform/graphics/compositing_reasons.cc
index 843a84a..b5824d8 100644
--- a/third_party/blink/renderer/platform/graphics/compositing_reasons.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing_reasons.cc
@@ -156,9 +156,6 @@
      "with no scrolling contents"},
     {CompositingReason::kLayerForDecoration, "layerForDecoration",
      "Layer painted on top of other layers as decoration"},
-    {CompositingReason::kInlineTransform, "inlineTransform",
-     "Has an inline transform, which causes subsequent layers to assume "
-     "overlap"},
 
 };
 
diff --git a/third_party/blink/renderer/platform/graphics/compositing_reasons.h b/third_party/blink/renderer/platform/graphics/compositing_reasons.h
index 30e174d..a9d700a 100644
--- a/third_party/blink/renderer/platform/graphics/compositing_reasons.h
+++ b/third_party/blink/renderer/platform/graphics/compositing_reasons.h
@@ -82,11 +82,7 @@
   V(LayerForAncestorClippingMask)                                             \
   V(LayerForScrollingBlockSelection)                                          \
   /* Composited layer painted on top of all other layers as decoration. */    \
-  V(LayerForDecoration)                                                       \
-                                                                              \
-  /* Composited elements with inline transforms trigger assumed overlap so    \
-  that we can update their transforms quickly. */                             \
-  V(InlineTransform)
+  V(LayerForDecoration)
 
 class PLATFORM_EXPORT CompositingReason {
  private:
@@ -147,7 +143,7 @@
 
     kComboAllStyleDeterminedReasons = kComboAllDirectStyleDeterminedReasons |
                                       kComboCompositedDescendants |
-                                      kCombo3DDescendants | kInlineTransform,
+                                      kCombo3DDescendants,
 
     kComboSquashableReasons =
         kOverlap | kAssumedOverlap | kOverflowScrollingParent,
diff --git a/third_party/blink/renderer/platform/heap/heap_compact_test.cc b/third_party/blink/renderer/platform/heap/heap_compact_test.cc
index c703577..a09b609e 100644
--- a/third_party/blink/renderer/platform/heap/heap_compact_test.cc
+++ b/third_party/blink/renderer/platform/heap/heap_compact_test.cc
@@ -30,7 +30,7 @@
 
   static IntWrapper* Create(int x, VerifyArenaCompaction verify = NoVerify) {
     did_verify_at_least_once = false;
-    return new IntWrapper(x, verify);
+    return blink::MakeGarbageCollected<IntWrapper>(x, verify);
   }
 
   virtual ~IntWrapper() = default;
diff --git a/third_party/blink/renderer/platform/heap/heap_test.cc b/third_party/blink/renderer/platform/heap/heap_test.cc
index d2f5032..e48c956 100644
--- a/third_party/blink/renderer/platform/heap/heap_test.cc
+++ b/third_party/blink/renderer/platform/heap/heap_test.cc
@@ -61,7 +61,9 @@
 
 class IntWrapper : public GarbageCollectedFinalized<IntWrapper> {
  public:
-  static IntWrapper* Create(int x) { return new IntWrapper(x); }
+  static IntWrapper* Create(int x) {
+    return MakeGarbageCollected<IntWrapper>(x);
+  }
 
   virtual ~IntWrapper() { AtomicIncrement(&destructor_calls_); }
 
@@ -381,7 +383,8 @@
 
 class SimpleObject : public GarbageCollected<SimpleObject> {
  public:
-  static SimpleObject* Create() { return new SimpleObject(); }
+  static SimpleObject* Create() { return MakeGarbageCollected<SimpleObject>(); }
+  SimpleObject() = default;
   void Trace(blink::Visitor* visitor) {}
   char GetPayload(int i) { return payload[i]; }
   // This virtual method is unused but it is here to make sure
@@ -393,22 +396,21 @@
   virtual void VirtualMethod() {}
 
  protected:
-  SimpleObject() = default;
   char payload[64];
 };
 
 class HeapTestSuperClass
     : public GarbageCollectedFinalized<HeapTestSuperClass> {
  public:
-  static HeapTestSuperClass* Create() { return new HeapTestSuperClass(); }
+  static HeapTestSuperClass* Create() {
+    return MakeGarbageCollected<HeapTestSuperClass>();
+  }
 
+  HeapTestSuperClass() = default;
   virtual ~HeapTestSuperClass() { ++destructor_calls_; }
 
   static int destructor_calls_;
   void Trace(blink::Visitor* visitor) {}
-
- protected:
-  HeapTestSuperClass() = default;
 };
 
 int HeapTestSuperClass::destructor_calls_ = 0;
@@ -423,8 +425,11 @@
 class HeapTestSubClass : public HeapTestOtherSuperClass,
                          public HeapTestSuperClass {
  public:
-  static HeapTestSubClass* Create() { return new HeapTestSubClass(); }
+  static HeapTestSubClass* Create() {
+    return MakeGarbageCollected<HeapTestSubClass>();
+  }
 
+  HeapTestSubClass() : magic_(kClassMagic) {}
   ~HeapTestSubClass() override {
     EXPECT_EQ(kClassMagic, magic_);
     ++destructor_calls_;
@@ -433,8 +438,6 @@
   static int destructor_calls_;
 
  private:
-  HeapTestSubClass() : magic_(kClassMagic) {}
-
   const size_t magic_;
 };
 
@@ -686,16 +689,16 @@
   class PersistentChain : public GarbageCollectedFinalized<PersistentChain> {
    public:
     static PersistentChain* Create(int count) {
-      return new PersistentChain(count);
+      return MakeGarbageCollected<PersistentChain>(count);
+    }
+
+    explicit PersistentChain(int count) {
+      ref_counted_chain_ = base::AdoptRef(RefCountedChain::Create(count));
     }
 
     void Trace(blink::Visitor* visitor) {}
 
    private:
-    explicit PersistentChain(int count) {
-      ref_counted_chain_ = base::AdoptRef(RefCountedChain::Create(count));
-    }
-
     scoped_refptr<RefCountedChain> ref_counted_chain_;
   };
 
@@ -724,14 +727,14 @@
 
 class TraceCounter : public GarbageCollectedFinalized<TraceCounter> {
  public:
-  static TraceCounter* Create() { return new TraceCounter(); }
+  static TraceCounter* Create() { return MakeGarbageCollected<TraceCounter>(); }
+
+  TraceCounter() : trace_count_(0) {}
 
   void Trace(blink::Visitor* visitor) { trace_count_++; }
   int TraceCount() const { return trace_count_; }
 
  private:
-  TraceCounter() : trace_count_(0) {}
-
   int trace_count_;
 };
 
@@ -747,7 +750,11 @@
 
 class ClassWithMember : public GarbageCollected<ClassWithMember> {
  public:
-  static ClassWithMember* Create() { return new ClassWithMember(); }
+  static ClassWithMember* Create() {
+    return MakeGarbageCollected<ClassWithMember>();
+  }
+
+  ClassWithMember() : trace_counter_(TraceCounter::Create()) {}
 
   void Trace(blink::Visitor* visitor) {
     visitor->Trace(trace_counter_);
@@ -755,24 +762,22 @@
   int TraceCount() const { return trace_counter_->TraceCount(); }
 
  private:
-  ClassWithMember() : trace_counter_(TraceCounter::Create()) {}
-
   Member<TraceCounter> trace_counter_;
 };
 
 class SimpleFinalizedObject
     : public GarbageCollectedFinalized<SimpleFinalizedObject> {
  public:
-  static SimpleFinalizedObject* Create() { return new SimpleFinalizedObject(); }
+  static SimpleFinalizedObject* Create() {
+    return MakeGarbageCollected<SimpleFinalizedObject>();
+  }
 
+  SimpleFinalizedObject() = default;
   ~SimpleFinalizedObject() { ++destructor_calls_; }
 
   static int destructor_calls_;
 
   void Trace(blink::Visitor* visitor) {}
-
- private:
-  SimpleFinalizedObject() = default;
 };
 
 int SimpleFinalizedObject::destructor_calls_ = 0;
@@ -809,7 +814,9 @@
 
 class Bar : public GarbageCollectedFinalized<Bar> {
  public:
-  static Bar* Create() { return new Bar(); }
+  static Bar* Create() { return MakeGarbageCollected<Bar>(); }
+
+  Bar() : magic_(kMagic) { live_++; }
 
   void FinalizeGarbageCollectedObject() {
     EXPECT_TRUE(magic_ == kMagic);
@@ -824,8 +831,6 @@
  protected:
   static const int kMagic = 1337;
   int magic_;
-
-  Bar() : magic_(kMagic) { live_++; }
 };
 
 WILL_NOT_BE_EAGERLY_TRACED_CLASS(Bar);
@@ -834,7 +839,9 @@
 
 class Baz : public GarbageCollected<Baz> {
  public:
-  static Baz* Create(Bar* bar) { return new Baz(bar); }
+  static Baz* Create(Bar* bar) { return MakeGarbageCollected<Baz>(bar); }
+
+  explicit Baz(Bar* bar) : bar_(bar) {}
 
   void Trace(blink::Visitor* visitor) { visitor->Trace(bar_); }
 
@@ -844,16 +851,18 @@
   void WillFinalize() { EXPECT_TRUE(!bar_->HasBeenFinalized()); }
 
  private:
-  explicit Baz(Bar* bar) : bar_(bar) {}
-
   Member<Bar> bar_;
 };
 
 class Foo : public Bar {
  public:
-  static Foo* Create(Bar* bar) { return new Foo(bar); }
+  static Foo* Create(Bar* bar) { return MakeGarbageCollected<Foo>(bar); }
 
-  static Foo* Create(Foo* foo) { return new Foo(foo); }
+  static Foo* Create(Foo* foo) { return MakeGarbageCollected<Foo>(foo); }
+
+  Foo(Bar* bar) : Bar(), bar_(bar), points_to_foo_(false) {}
+
+  Foo(Foo* foo) : Bar(), bar_(foo), points_to_foo_(true) {}
 
   void Trace(blink::Visitor* visitor) override {
     if (points_to_foo_)
@@ -863,10 +872,6 @@
   }
 
  private:
-  Foo(Bar* bar) : Bar(), bar_(bar), points_to_foo_(false) {}
-
-  Foo(Foo* foo) : Bar(), bar_(foo), points_to_foo_(true) {}
-
   Bar* bar_;
   bool points_to_foo_;
 };
@@ -875,7 +880,14 @@
 
 class Bars : public Bar {
  public:
-  static Bars* Create() { return new Bars(); }
+  static Bars* Create() { return MakeGarbageCollected<Bars>(); }
+
+  Bars() : width_(0) {
+    for (unsigned i = 0; i < kWidth; i++) {
+      bars_[i] = Bar::Create();
+      width_++;
+    }
+  }
 
   void Trace(blink::Visitor* visitor) override {
     for (unsigned i = 0; i < width_; i++)
@@ -887,13 +899,6 @@
   static const unsigned kWidth = 7500;
 
  private:
-  Bars() : width_(0) {
-    for (unsigned i = 0; i < kWidth; i++) {
-      bars_[i] = Bar::Create();
-      width_++;
-    }
-  }
-
   unsigned width_;
   Member<Bar> bars_[kWidth];
 };
@@ -902,20 +907,25 @@
 
 class ConstructorAllocation : public GarbageCollected<ConstructorAllocation> {
  public:
-  static ConstructorAllocation* Create() { return new ConstructorAllocation(); }
+  static ConstructorAllocation* Create() {
+    return MakeGarbageCollected<ConstructorAllocation>();
+  }
+
+  ConstructorAllocation() { int_wrapper_ = IntWrapper::Create(42); }
 
   void Trace(blink::Visitor* visitor) { visitor->Trace(int_wrapper_); }
 
  private:
-  ConstructorAllocation() { int_wrapper_ = IntWrapper::Create(42); }
-
   Member<IntWrapper> int_wrapper_;
 };
 
 class LargeHeapObject : public GarbageCollectedFinalized<LargeHeapObject> {
  public:
+  LargeHeapObject() { int_wrapper_ = IntWrapper::Create(23); }
   ~LargeHeapObject() { destructor_calls_++; }
-  static LargeHeapObject* Create() { return new LargeHeapObject(); }
+  static LargeHeapObject* Create() {
+    return MakeGarbageCollected<LargeHeapObject>();
+  }
   char Get(size_t i) { return data_[i]; }
   void Set(size_t i, char c) { data_[i] = c; }
   size_t length() { return kLength; }
@@ -924,7 +934,6 @@
 
  private:
   static const size_t kLength = 1024 * 1024;
-  LargeHeapObject() { int_wrapper_ = IntWrapper::Create(23); }
   Member<IntWrapper> int_wrapper_;
   char data_[kLength];
 };
@@ -946,9 +955,10 @@
     : public GarbageCollectedFinalized<RefCountedAndGarbageCollected> {
  public:
   static RefCountedAndGarbageCollected* Create() {
-    return new RefCountedAndGarbageCollected;
+    return MakeGarbageCollected<RefCountedAndGarbageCollected>();
   }
 
+  RefCountedAndGarbageCollected() : ref_count_(0) {}
   ~RefCountedAndGarbageCollected() { ++destructor_calls_; }
 
   void AddRef() {
@@ -973,8 +983,6 @@
   static int destructor_calls_;
 
  private:
-  RefCountedAndGarbageCollected() : ref_count_(0) {}
-
   int ref_count_;
   SelfKeepAlive<RefCountedAndGarbageCollected> keep_alive_;
 };
@@ -986,9 +994,10 @@
       public GarbageCollectedFinalized<RefCountedAndGarbageCollected2> {
  public:
   static RefCountedAndGarbageCollected2* Create() {
-    return new RefCountedAndGarbageCollected2;
+    return MakeGarbageCollected<RefCountedAndGarbageCollected2>();
   }
 
+  RefCountedAndGarbageCollected2() : ref_count_(0) {}
   ~RefCountedAndGarbageCollected2() { ++destructor_calls_; }
 
   void Ref() {
@@ -1013,8 +1022,6 @@
   static int destructor_calls_;
 
  private:
-  RefCountedAndGarbageCollected2() : ref_count_(0) {}
-
   int ref_count_;
   SelfKeepAlive<RefCountedAndGarbageCollected2> keep_alive_;
 };
@@ -1023,7 +1030,12 @@
 
 class Weak : public Bar {
  public:
-  static Weak* Create(Bar* strong, Bar* weak) { return new Weak(strong, weak); }
+  static Weak* Create(Bar* strong, Bar* weak) {
+    return MakeGarbageCollected<Weak>(strong, weak);
+  }
+
+  Weak(Bar* strong_bar, Bar* weak_bar)
+      : Bar(), strong_bar_(strong_bar), weak_bar_(weak_bar) {}
 
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(strong_bar_);
@@ -1039,9 +1051,6 @@
   bool WeakIsThere() { return !!weak_bar_; }
 
  private:
-  Weak(Bar* strong_bar, Bar* weak_bar)
-      : Bar(), strong_bar_(strong_bar), weak_bar_(weak_bar) {}
-
   Member<Bar> strong_bar_;
   Bar* weak_bar_;
 };
@@ -1051,9 +1060,12 @@
 class WithWeakMember : public Bar {
  public:
   static WithWeakMember* Create(Bar* strong, Bar* weak) {
-    return new WithWeakMember(strong, weak);
+    return MakeGarbageCollected<WithWeakMember>(strong, weak);
   }
 
+  WithWeakMember(Bar* strong_bar, Bar* weak_bar)
+      : Bar(), strong_bar_(strong_bar), weak_bar_(weak_bar) {}
+
   void Trace(blink::Visitor* visitor) override {
     visitor->Trace(strong_bar_);
     visitor->Trace(weak_bar_);
@@ -1063,9 +1075,6 @@
   bool WeakIsThere() { return !!weak_bar_; }
 
  private:
-  WithWeakMember(Bar* strong_bar, Bar* weak_bar)
-      : Bar(), strong_bar_(strong_bar), weak_bar_(weak_bar) {}
-
   Member<Bar> strong_bar_;
   WeakMember<Bar> weak_bar_;
 };
@@ -1076,7 +1085,10 @@
   USING_PRE_FINALIZER(Observable, WillFinalize);
 
  public:
-  static Observable* Create(Bar* bar) { return new Observable(bar); }
+  static Observable* Create(Bar* bar) {
+    return MakeGarbageCollected<Observable>(bar);
+  }
+  explicit Observable(Bar* bar) : bar_(bar), was_destructed_(false) {}
   ~Observable() { was_destructed_ = true; }
   void Trace(blink::Visitor* visitor) { visitor->Trace(bar_); }
 
@@ -1090,8 +1102,6 @@
   static bool will_finalize_was_called_;
 
  private:
-  explicit Observable(Bar* bar) : bar_(bar), was_destructed_(false) {}
-
   Member<Bar> bar_;
   bool was_destructed_;
 };
@@ -1104,8 +1114,9 @@
 
  public:
   static ObservableWithPreFinalizer* Create() {
-    return new ObservableWithPreFinalizer();
+    return MakeGarbageCollected<ObservableWithPreFinalizer>();
   }
+  ObservableWithPreFinalizer() : was_destructed_(false) {}
   ~ObservableWithPreFinalizer() { was_destructed_ = true; }
   void Trace(blink::Visitor* visitor) {}
   void Dispose() {
@@ -1115,8 +1126,6 @@
   static bool dispose_was_called_;
 
  protected:
-  ObservableWithPreFinalizer() : was_destructed_(false) {}
-
   bool was_destructed_;
 };
 
@@ -1130,7 +1139,10 @@
   USING_PRE_FINALIZER(PreFinalizerBase, Dispose);
 
  public:
-  static PreFinalizerBase* Create() { return new PreFinalizerBase(); }
+  static PreFinalizerBase* Create() {
+    return MakeGarbageCollected<PreFinalizerBase>();
+  }
+  PreFinalizerBase() : was_destructed_(false) {}
   virtual ~PreFinalizerBase() { was_destructed_ = true; }
   virtual void Trace(blink::Visitor* visitor) {}
   void Dispose() {
@@ -1142,7 +1154,6 @@
   }
 
  protected:
-  PreFinalizerBase() : was_destructed_(false) {}
   bool was_destructed_;
 };
 
@@ -1190,8 +1201,11 @@
 class FinalizationObserver : public GarbageCollected<FinalizationObserver<T>> {
  public:
   static FinalizationObserver* Create(T* data) {
-    return new FinalizationObserver(data);
+    return MakeGarbageCollected<FinalizationObserver>(data);
   }
+
+  FinalizationObserver(T* data) : data_(data), did_call_will_finalize_(false) {}
+
   bool DidCallWillFinalize() const { return did_call_will_finalize_; }
 
   void Trace(blink::Visitor* visitor) {
@@ -1209,8 +1223,6 @@
   }
 
  private:
-  FinalizationObserver(T* data) : data_(data), did_call_will_finalize_(false) {}
-
   WeakMember<T> data_;
   bool did_call_will_finalize_;
 };
@@ -1268,8 +1280,9 @@
 
 class PointsBack : public GarbageCollectedFinalized<PointsBack> {
  public:
-  static PointsBack* Create() { return new PointsBack; }
+  static PointsBack* Create() { return MakeGarbageCollected<PointsBack>(); }
 
+  PointsBack() : back_pointer_(nullptr) { ++alive_count_; }
   ~PointsBack() { --alive_count_; }
 
   void SetBackPointer(SuperClass* back_pointer) {
@@ -1283,8 +1296,6 @@
   static int alive_count_;
 
  private:
-  PointsBack() : back_pointer_(nullptr) { ++alive_count_; }
-
   WeakMember<SuperClass> back_pointer_;
 };
 
@@ -1293,9 +1304,13 @@
 class SuperClass : public GarbageCollectedFinalized<SuperClass> {
  public:
   static SuperClass* Create(PointsBack* points_back) {
-    return new SuperClass(points_back);
+    return MakeGarbageCollected<SuperClass>(points_back);
   }
 
+  explicit SuperClass(PointsBack* points_back) : points_back_(points_back) {
+    points_back_->SetBackPointer(this);
+    ++alive_count_;
+  }
   virtual ~SuperClass() { --alive_count_; }
 
   void DoStuff(SuperClass* target,
@@ -1312,12 +1327,6 @@
 
   static int alive_count_;
 
- protected:
-  explicit SuperClass(PointsBack* points_back) : points_back_(points_back) {
-    points_back_->SetBackPointer(this);
-    ++alive_count_;
-  }
-
  private:
   Member<PointsBack> points_back_;
 };
@@ -1338,9 +1347,13 @@
 class SubClass : public SuperClass {
  public:
   static SubClass* Create(PointsBack* points_back) {
-    return new SubClass(points_back);
+    return MakeGarbageCollected<SubClass>(points_back);
   }
 
+  explicit SubClass(PointsBack* points_back)
+      : SuperClass(points_back), data_(MakeGarbageCollected<SubData>()) {
+    ++alive_count_;
+  }
   ~SubClass() override { --alive_count_; }
 
   void Trace(blink::Visitor* visitor) override {
@@ -1351,12 +1364,6 @@
   static int alive_count_;
 
  private:
-  explicit SubClass(PointsBack* points_back)
-      : SuperClass(points_back), data_(new SubData) {
-    ++alive_count_;
-  }
-
- private:
   Member<SubData> data_;
 };
 
@@ -1488,7 +1495,7 @@
     for (int i = 0; i < 10; ++i)
       *wrapper_ = IntWrapper::Create(42);
     for (int i = 0; i < 512; ++i)
-      new OneKiloByteObject();
+      MakeGarbageCollected<OneKiloByteObject>();
     for (int i = 0; i < 32; ++i)
       LargeHeapObject::Create();
   }
@@ -1511,7 +1518,7 @@
     for (int i = 0; i < 10; ++i)
       *wrapper_ = IntWrapper::Create(42);
     for (int i = 0; i < 512; ++i)
-      new OneKiloByteObject();
+      MakeGarbageCollected<OneKiloByteObject>();
     for (int i = 0; i < 32; ++i)
       LargeHeapObject::Create();
   }
@@ -1529,12 +1536,12 @@
  public:
   PreFinalizerBackingShrinkForbidden() {
     for (int i = 0; i < 32; ++i) {
-      vector_.push_back(new IntWrapper(i));
+      vector_.push_back(MakeGarbageCollected<IntWrapper>(i));
     }
     EXPECT_LT(31ul, vector_.capacity());
 
     for (int i = 0; i < 32; ++i) {
-      map_.insert(i + 1, new IntWrapper(i + 1));
+      map_.insert(i + 1, MakeGarbageCollected<IntWrapper>(i + 1));
     }
     EXPECT_LT(31ul, map_.Capacity());
   }
@@ -1572,7 +1579,7 @@
 };
 
 TEST(HeapTest, PreFinalizerBackingShrinkForbidden) {
-  new PreFinalizerBackingShrinkForbidden();
+  MakeGarbageCollected<PreFinalizerBackingShrinkForbidden>();
   PreciselyCollectGarbage();
 }
 
@@ -1583,7 +1590,7 @@
 
  public:
   PreFinalizerVectorBackingExpandForbidden() {
-    vector_.push_back(new IntWrapper(1));
+    vector_.push_back(MakeGarbageCollected<IntWrapper>(1));
   }
 
   void Dispose() { EXPECT_DEATH(Test(), ""); }
@@ -1602,7 +1609,7 @@
 };
 
 TEST(HeapDeathTest, PreFinalizerVectorBackingExpandForbidden) {
-  new PreFinalizerVectorBackingExpandForbidden();
+  MakeGarbageCollected<PreFinalizerVectorBackingExpandForbidden>();
   PreciselyCollectGarbage();
 }
 
@@ -1613,7 +1620,7 @@
 
  public:
   PreFinalizerHashTableBackingExpandForbidden() {
-    map_.insert(123, new IntWrapper(123));
+    map_.insert(123, MakeGarbageCollected<IntWrapper>(123));
   }
 
   void Dispose() { EXPECT_DEATH(Test(), ""); }
@@ -1632,7 +1639,7 @@
 };
 
 TEST(HeapDeathTest, PreFinalizerHashTableBackingExpandForbidden) {
-  new PreFinalizerHashTableBackingExpandForbidden();
+  MakeGarbageCollected<PreFinalizerHashTableBackingExpandForbidden>();
   PreciselyCollectGarbage();
 }
 
@@ -1874,7 +1881,7 @@
   EXPECT_EQ(0ul, heap.ObjectPayloadSizeForTesting());
 
   // Allocate an object in the heap.
-  HeapAllocatedArray* array = new HeapAllocatedArray();
+  HeapAllocatedArray* array = MakeGarbageCollected<HeapAllocatedArray>();
   EXPECT_TRUE(heap.ObjectPayloadSizeForTesting() >= sizeof(HeapAllocatedArray));
 
   // Sanity check of the contents in the heap.
@@ -1918,13 +1925,13 @@
   ClearOutOldGarbage();
 
   for (int i = 0; i < 100; i++)
-    new IntWrapper(i);
-  IntWrapper* p1 = new IntWrapper(100);
+    MakeGarbageCollected<IntWrapper>(i);
+  IntWrapper* p1 = MakeGarbageCollected<IntWrapper>(100);
   PreciselyCollectGarbage();
   // In non-production builds, we delay reusing freed memory for at least
   // one GC cycle.
   for (int i = 0; i < 100; i++) {
-    IntWrapper* p2 = new IntWrapper(i);
+    IntWrapper* p2 = MakeGarbageCollected<IntWrapper>(i);
     EXPECT_NE(p1, p2);
   }
 
@@ -1933,7 +1940,7 @@
   // Now the freed memory in the first GC should be reused.
   bool reused_memory_found = false;
   for (int i = 0; i < 10000; i++) {
-    IntWrapper* p2 = new IntWrapper(i);
+    IntWrapper* p2 = MakeGarbageCollected<IntWrapper>(i);
     if (p1 == p2) {
       reused_memory_found = true;
       break;
@@ -1966,11 +1973,11 @@
 
   // Create free lists that can be reused for IntWrappers created in
   // LargeHeapObject::create().
-  Persistent<IntWrapper> p1 = new IntWrapper(1);
+  Persistent<IntWrapper> p1 = MakeGarbageCollected<IntWrapper>(1);
   for (int i = 0; i < 100; i++) {
-    new IntWrapper(i);
+    MakeGarbageCollected<IntWrapper>(i);
   }
-  Persistent<IntWrapper> p2 = new IntWrapper(2);
+  Persistent<IntWrapper> p2 = MakeGarbageCollected<IntWrapper>(2);
   PreciselyCollectGarbage();
   PreciselyCollectGarbage();
 
@@ -2012,15 +2019,13 @@
 class SimpleFinalizedEagerObject : public SimpleFinalizedEagerObjectBase {
  public:
   static SimpleFinalizedEagerObject* Create() {
-    return new SimpleFinalizedEagerObject();
+    return MakeGarbageCollected<SimpleFinalizedEagerObject>();
   }
 
+  SimpleFinalizedEagerObject() = default;
   ~SimpleFinalizedEagerObject() override { ++destructor_calls_; }
 
   static int destructor_calls_;
-
- private:
-  SimpleFinalizedEagerObject() = default;
 };
 
 template <typename T>
@@ -2034,16 +2039,15 @@
       public ParameterizedButEmpty<SimpleFinalizedObjectInstanceOfTemplate> {
  public:
   static SimpleFinalizedObjectInstanceOfTemplate* Create() {
-    return new SimpleFinalizedObjectInstanceOfTemplate();
+    return MakeGarbageCollected<SimpleFinalizedObjectInstanceOfTemplate>();
   }
+
+  SimpleFinalizedObjectInstanceOfTemplate() = default;
   ~SimpleFinalizedObjectInstanceOfTemplate() { ++destructor_calls_; }
 
   void Trace(blink::Visitor* visitor) {}
 
   static int destructor_calls_;
-
- private:
-  SimpleFinalizedObjectInstanceOfTemplate() = default;
 };
 
 int SimpleFinalizedEagerObject::destructor_calls_ = 0;
@@ -2423,7 +2427,7 @@
 
 class Container : public GarbageCollected<Container> {
  public:
-  static Container* Create() { return new Container(); }
+  static Container* Create() { return MakeGarbageCollected<Container>(); }
   HeapHashMap<Member<IntWrapper>, Member<IntWrapper>> map;
   HeapHashSet<Member<IntWrapper>> set;
   HeapHashSet<Member<IntWrapper>> set2;
@@ -3848,9 +3852,9 @@
 TEST(HeapTest, HeapHashCountedSetToVector) {
   HeapHashCountedSet<Member<IntWrapper>> set;
   HeapVector<Member<IntWrapper>> vector;
-  set.insert(new IntWrapper(1));
-  set.insert(new IntWrapper(1));
-  set.insert(new IntWrapper(2));
+  set.insert(MakeGarbageCollected<IntWrapper>(1));
+  set.insert(MakeGarbageCollected<IntWrapper>(1));
+  set.insert(MakeGarbageCollected<IntWrapper>(2));
 
   CopyToVector(set, vector);
   EXPECT_EQ(3u, vector.size());
@@ -3868,9 +3872,9 @@
 TEST(HeapTest, WeakHeapHashCountedSetToVector) {
   HeapHashCountedSet<WeakMember<IntWrapper>> set;
   HeapVector<Member<IntWrapper>> vector;
-  set.insert(new IntWrapper(1));
-  set.insert(new IntWrapper(1));
-  set.insert(new IntWrapper(2));
+  set.insert(MakeGarbageCollected<IntWrapper>(1));
+  set.insert(MakeGarbageCollected<IntWrapper>(1));
+  set.insert(MakeGarbageCollected<IntWrapper>(2));
 
   CopyToVector(set, vector);
   EXPECT_LE(3u, vector.size());
@@ -4409,7 +4413,7 @@
   InlinedVectorObject::destructor_calls_ = 0;
   {
     Persistent<InlinedVectorObjectWrapper> vector_wrapper =
-        new InlinedVectorObjectWrapper();
+        MakeGarbageCollected<InlinedVectorObjectWrapper>();
     ConservativelyCollectGarbage();
     EXPECT_EQ(2, InlinedVectorObject::destructor_calls_);
   }
@@ -4455,7 +4459,7 @@
   InlinedVectorObjectWithVtable::destructor_calls_ = 0;
   {
     Persistent<InlinedVectorObjectWithVtableWrapper> vector_wrapper =
-        new InlinedVectorObjectWithVtableWrapper();
+        MakeGarbageCollected<InlinedVectorObjectWithVtableWrapper>();
     ConservativelyCollectGarbage();
     EXPECT_EQ(3, InlinedVectorObjectWithVtable::destructor_calls_);
   }
@@ -4481,7 +4485,7 @@
   IntWrapper::destructor_calls_ = 0;
 
   HeapLinkedStack<TerminatedArrayItem>* stack =
-      new HeapLinkedStack<TerminatedArrayItem>();
+      MakeGarbageCollected<HeapLinkedStack<TerminatedArrayItem>>();
 
   const wtf_size_t kStackSize = 10;
 
@@ -4511,7 +4515,7 @@
   LargeHeapObject::destructor_calls_ = 0;
 
   Persistent<IntWrapper> wrapper;
-  new FinalizationAllocator(&wrapper);
+  MakeGarbageCollected<FinalizationAllocator>(&wrapper);
 
   PreciselyCollectGarbage();
   EXPECT_EQ(0, IntWrapper::destructor_calls_);
@@ -4537,7 +4541,7 @@
   LargeHeapObject::destructor_calls_ = 0;
 
   Persistent<IntWrapper> wrapper;
-  new PreFinalizationAllocator(&wrapper);
+  MakeGarbageCollected<PreFinalizationAllocator>(&wrapper);
 
   PreciselyCollectGarbage();
   EXPECT_EQ(0, IntWrapper::destructor_calls_);
@@ -5216,12 +5220,13 @@
   Persistent<EphemeronWrapper> chain;
   for (int i = 0; i < 100; i++) {
     EphemeronWrapper* old_head = chain;
-    chain = new EphemeronWrapper();
+    chain = MakeGarbageCollected<EphemeronWrapper>();
     if (i == 50)
       chain->GetMap().insert(key2, old_head);
     else
       chain->GetMap().insert(key, old_head);
-    chain->GetMap().insert(IntWrapper::Create(103), new EphemeronWrapper());
+    chain->GetMap().insert(IntWrapper::Create(103),
+                           MakeGarbageCollected<EphemeronWrapper>());
   }
 
   PreciselyCollectGarbage();
@@ -5351,8 +5356,8 @@
   Persistent<IntWrapper> dead_object =
       IntWrapper::Create(100);  // Named for "Drowning by Numbers" (1988).
   Persistent<IntWrapper> life_object = IntWrapper::Create(42);
-  map->insert(dead_object, new Link1(dead_object));
-  map->insert(life_object, new Link1(life_object));
+  map->insert(dead_object, MakeGarbageCollected<Link1>(dead_object));
+  map->insert(life_object, MakeGarbageCollected<Link1>(life_object));
   EXPECT_EQ(2u, map->size());
   PreciselyCollectGarbage();
   EXPECT_EQ(2u, map->size());
@@ -5605,7 +5610,8 @@
     std::unique_ptr<Thread> worker_thread = Platform::Current()->CreateThread(
         ThreadCreationParams(WebThreadType::kTestThread)
             .SetThreadNameForTest("Test Worker Thread"));
-    Persistent<MainThreadObject> main_thread_object = new MainThreadObject();
+    Persistent<MainThreadObject> main_thread_object =
+        MakeGarbageCollected<MainThreadObject>();
     PostCrossThreadTask(
         *worker_thread->GetTaskRunner(), FROM_HERE,
         CrossThreadBind(&MarkingSameThreadCheckTester::WorkerThreadMain,
@@ -5715,18 +5721,16 @@
     : public GarbageCollectedFinalized<DestructorLockingObject> {
  public:
   static DestructorLockingObject* Create() {
-    return new DestructorLockingObject();
+    return MakeGarbageCollected<DestructorLockingObject>();
   }
 
+  DestructorLockingObject() = default;
   virtual ~DestructorLockingObject() {
     ++destructor_calls_;
   }
 
   static int destructor_calls_;
   void Trace(blink::Visitor* visitor) {}
-
- private:
-  DestructorLockingObject() = default;
 };
 
 int DestructorLockingObject::destructor_calls_ = 0;
@@ -5767,7 +5771,7 @@
 class AllocatesOnAssignment {
  public:
   AllocatesOnAssignment(std::nullptr_t) : value_(nullptr) {}
-  AllocatesOnAssignment(int x) : value_(new IntWrapper(x)) {}
+  AllocatesOnAssignment(int x) : value_(MakeGarbageCollected<IntWrapper>(x)) {}
   AllocatesOnAssignment(IntWrapper* x) : value_(x) {}
 
   AllocatesOnAssignment& operator=(const AllocatesOnAssignment x) {
@@ -5780,7 +5784,7 @@
   AllocatesOnAssignment(const AllocatesOnAssignment& other) {
     if (!ThreadState::Current()->IsGCForbidden())
       ConservativelyCollectGarbage();
-    value_ = new IntWrapper(other.value_->Value());
+    value_ = MakeGarbageCollected<IntWrapper>(other.value_->Value());
   }
 
   AllocatesOnAssignment(DeletedMarker) : value_(WTF::kHashTableDeletedValue) {}
@@ -5852,7 +5856,7 @@
 TEST(HeapTest, GCInHashMapOperations) {
   typedef HeapHashMap<AllocatesOnAssignment, AllocatesOnAssignment> Map;
   Map* map = MakeGarbageCollected<Map>();
-  IntWrapper* key = new IntWrapper(42);
+  IntWrapper* key = MakeGarbageCollected<IntWrapper>(42);
   map->insert(key, AllocatesOnAssignment(103));
   map->erase(key);
   for (int i = 0; i < 10; i++)
@@ -5878,7 +5882,8 @@
 };
 
 TEST(HeapTest, PartObjectWithVirtualMethod) {
-  ObjectWithVirtualPartObject* object = new ObjectWithVirtualPartObject();
+  ObjectWithVirtualPartObject* object =
+      MakeGarbageCollected<ObjectWithVirtualPartObject>();
   EXPECT_TRUE(object);
 }
 
@@ -5905,7 +5910,7 @@
 // an object with an uninitialized vtable.
 TEST(HeapTest, AllocationInSuperConstructorArgument) {
   AllocInSuperConstructorArgument* object =
-      new AllocInSuperConstructorArgument();
+      MakeGarbageCollected<AllocInSuperConstructorArgument>();
   EXPECT_TRUE(object);
   ThreadState::Current()->CollectAllGarbage();
 }
@@ -5925,7 +5930,7 @@
 Persistent<IntNode>* NonNodeAllocatingNodeInDestructor::node_ = nullptr;
 
 TEST(HeapTest, NonNodeAllocatingNodeInDestructor) {
-  new NonNodeAllocatingNodeInDestructor();
+  MakeGarbageCollected<NonNodeAllocatingNodeInDestructor>();
   PreciselyCollectGarbage();
   EXPECT_EQ(10, (*NonNodeAllocatingNodeInDestructor::node_)->Value());
   delete NonNodeAllocatingNodeInDestructor::node_;
@@ -5999,7 +6004,7 @@
 #if !DCHECK_IS_ON() && !defined(OS_ANDROID)
   DeepEagerly* obj = nullptr;
   for (int i = 0; i < 10000000; i++)
-    obj = new DeepEagerly(obj);
+    obj = MakeGarbageCollected<DeepEagerly>(obj);
 
   Persistent<DeepEagerly> persistent(obj);
   PreciselyCollectGarbage();
@@ -6354,7 +6359,7 @@
 };
 
 TEST(HeapTest, WeakPersistent) {
-  Persistent<IntWrapper> object = new IntWrapper(20);
+  Persistent<IntWrapper> object = MakeGarbageCollected<IntWrapper>(20);
   std::unique_ptr<WeakPersistentHolder> holder =
       std::make_unique<WeakPersistentHolder>(object);
   PreciselyCollectGarbage();
@@ -6465,7 +6470,7 @@
                                     int_wrapper, ());
     Persistent<IntWrapper>& handle = *int_wrapper;
     if (!handle) {
-      handle = new IntWrapper(42);
+      handle = MakeGarbageCollected<IntWrapper>(42);
       handle.RegisterAsStaticReference();
     }
     return *handle;
@@ -6477,9 +6482,11 @@
           ThreadedClearOnShutdownTester::HeapObject> {
  public:
   static HeapObject* Create(bool test_destructor) {
-    return new HeapObject(test_destructor);
+    return MakeGarbageCollected<HeapObject>(test_destructor);
   }
 
+  explicit HeapObject(bool test_destructor)
+      : test_destructor_(test_destructor) {}
   ~HeapObject() {
     if (!test_destructor_)
       return;
@@ -6498,9 +6505,6 @@
   void Trace(blink::Visitor* visitor) {}
 
  private:
-  explicit HeapObject(bool test_destructor)
-      : test_destructor_(test_destructor) {}
-
   bool test_destructor_;
 };
 
@@ -6544,16 +6548,16 @@
 class WithWeakConstObject final : public GarbageCollected<WithWeakConstObject> {
  public:
   static WithWeakConstObject* Create(const IntWrapper* int_wrapper) {
-    return new WithWeakConstObject(int_wrapper);
+    return MakeGarbageCollected<WithWeakConstObject>(int_wrapper);
   }
 
+  WithWeakConstObject(const IntWrapper* int_wrapper) : wrapper_(int_wrapper) {}
+
   void Trace(blink::Visitor* visitor) { visitor->Trace(wrapper_); }
 
   const IntWrapper* Value() const { return wrapper_; }
 
  private:
-  WithWeakConstObject(const IntWrapper* int_wrapper) : wrapper_(int_wrapper) {}
-
   WeakMember<const IntWrapper> wrapper_;
 };
 
@@ -6649,7 +6653,7 @@
  public:
   DoublyLinkedListNodeImpl() = default;
   static DoublyLinkedListNodeImpl* Create() {
-    return new DoublyLinkedListNodeImpl();
+    return MakeGarbageCollected<DoublyLinkedListNodeImpl>();
   }
 
   static int destructor_calls_;
@@ -6673,7 +6677,7 @@
     : public GarbageCollected<HeapDoublyLinkedListContainer<T>> {
  public:
   static HeapDoublyLinkedListContainer<T>* Create() {
-    return new HeapDoublyLinkedListContainer<T>();
+    return MakeGarbageCollected<HeapDoublyLinkedListContainer<T>>();
   }
   HeapDoublyLinkedListContainer<T>() = default;
   HeapDoublyLinkedList<T> list_;
@@ -6706,7 +6710,7 @@
   Address before;
   {
     HeapVector<Member<IntWrapper>> vector;
-    vector.push_back(new IntWrapper(0));
+    vector.push_back(MakeGarbageCollected<IntWrapper>(0));
     NormalPage* normal_page =
         static_cast<NormalPage*>(PageFromObject(vector.data()));
     normal_arena = normal_page->ArenaForNormalPage();
@@ -6723,7 +6727,7 @@
   Address before;
   {
     HeapDeque<Member<IntWrapper>> deque;
-    deque.push_back(new IntWrapper(0));
+    deque.push_back(MakeGarbageCollected<IntWrapper>(0));
     NormalPage* normal_page =
         static_cast<NormalPage*>(PageFromObject(&deque.front()));
     normal_arena = normal_page->ArenaForNormalPage();
@@ -6742,7 +6746,7 @@
   Address before;
   {
     HeapHashSet<Member<IntWrapper>> hash_set;
-    hash_set.insert(new IntWrapper(0));
+    hash_set.insert(MakeGarbageCollected<IntWrapper>(0));
     before = normal_arena->CurrentAllocationPoint();
   }
   Address after = normal_arena->CurrentAllocationPoint();
@@ -6758,7 +6762,7 @@
   Address before;
   {
     HeapListHashSet<Member<IntWrapper>> list_hash_set;
-    list_hash_set.insert(new IntWrapper(0));
+    list_hash_set.insert(MakeGarbageCollected<IntWrapper>(0));
     before = normal_arena->CurrentAllocationPoint();
   }
   Address after = normal_arena->CurrentAllocationPoint();
@@ -6773,7 +6777,7 @@
   Address before;
   {
     HeapLinkedHashSet<Member<IntWrapper>> linked_hash_set;
-    linked_hash_set.insert(new IntWrapper(0));
+    linked_hash_set.insert(MakeGarbageCollected<IntWrapper>(0));
     before = normal_arena->CurrentAllocationPoint();
   }
   Address after = normal_arena->CurrentAllocationPoint();
@@ -6787,7 +6791,7 @@
   HeapVector<Member<IntWrapper>> vector;
   vector.ReserveCapacity(32);
   for (int i = 0; i < 4; i++) {
-    vector.push_back(new IntWrapper(i));
+    vector.push_back(MakeGarbageCollected<IntWrapper>(i));
   }
 
   ConservativelyCollectGarbage(BlinkGC::kLazySweeping);
diff --git a/third_party/blink/renderer/platform/heap/incremental_marking_test.cc b/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
index d50cf17..2bbd9f9 100644
--- a/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
+++ b/third_party/blink/renderer/platform/heap/incremental_marking_test.cc
@@ -223,8 +223,13 @@
 
 class Object : public GarbageCollected<Object> {
  public:
-  static Object* Create() { return new Object(); }
-  static Object* Create(Object* next) { return new Object(next); }
+  static Object* Create() { return MakeGarbageCollected<Object>(); }
+  static Object* Create(Object* next) {
+    return MakeGarbageCollected<Object>(next);
+  }
+
+  Object() : next_(nullptr) {}
+  explicit Object(Object* next) : next_(next) {}
 
   void set_next(Object* next) { next_ = next; }
 
@@ -235,9 +240,6 @@
   virtual void Trace(blink::Visitor* visitor) { visitor->Trace(next_); }
 
  private:
-  Object() : next_(nullptr) {}
-  explicit Object(Object* next) : next_(next) {}
-
   Member<Object> next_;
 };
 
@@ -402,16 +404,16 @@
 class ParentWithMixinPointer : public GarbageCollected<ParentWithMixinPointer> {
  public:
   static ParentWithMixinPointer* Create() {
-    return new ParentWithMixinPointer();
+    return MakeGarbageCollected<ParentWithMixinPointer>();
   }
 
+  ParentWithMixinPointer() : mixin_(nullptr) {}
+
   void set_mixin(Mixin* mixin) { mixin_ = mixin; }
 
   virtual void Trace(blink::Visitor* visitor) { visitor->Trace(mixin_); }
 
  protected:
-  ParentWithMixinPointer() : mixin_(nullptr) {}
-
   Member<Mixin> mixin_;
 };
 
@@ -698,7 +700,7 @@
 
 TEST(IncrementalMarkingTest, HeapDoublyLinkedListPush) {
   Object* obj = Object::Create();
-  ObjectNode* obj_node = new ObjectNode(obj);
+  ObjectNode* obj_node = MakeGarbageCollected<ObjectNode>(obj);
   HeapDoublyLinkedList<ObjectNode> list;
   {
     ExpectWriteBarrierFires scope(ThreadState::Current(), {obj_node});
@@ -710,7 +712,7 @@
 
 TEST(IncrementalMarkingTest, HeapDoublyLinkedListAppend) {
   Object* obj = Object::Create();
-  ObjectNode* obj_node = new ObjectNode(obj);
+  ObjectNode* obj_node = MakeGarbageCollected<ObjectNode>(obj);
   HeapDoublyLinkedList<ObjectNode> list;
   {
     ExpectWriteBarrierFires scope(ThreadState::Current(), {obj_node});
diff --git a/third_party/blink/renderer/platform/heap/persistent_test.cc b/third_party/blink/renderer/platform/heap/persistent_test.cc
index fad427713..11d0dd51 100644
--- a/third_party/blink/renderer/platform/heap/persistent_test.cc
+++ b/third_party/blink/renderer/platform/heap/persistent_test.cc
@@ -22,7 +22,7 @@
 };
 
 TEST(PersistentTest, BindCancellation) {
-  Receiver* receiver = new Receiver;
+  Receiver* receiver = MakeGarbageCollected<Receiver>();
   int counter = 0;
   base::RepeatingClosure function =
       WTF::BindRepeating(&Receiver::Increment, WrapWeakPersistent(receiver),
@@ -38,7 +38,7 @@
 }
 
 TEST(PersistentTest, CrossThreadBindCancellation) {
-  Receiver* receiver = new Receiver;
+  Receiver* receiver = MakeGarbageCollected<Receiver>();
   int counter = 0;
   CrossThreadClosure function = blink::CrossThreadBind(
       &Receiver::Increment, WrapCrossThreadWeakPersistent(receiver),
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index 198af3f..6ac785b3 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -511,9 +511,14 @@
   if (IsGCForbidden())
     return;
 
-  // This completeSweep() will do nothing in common cases since we've
-  // called completeSweep() before V8 starts minor/major GCs.
   if (gc_type == BlinkGC::kV8MajorGC) {
+    // In case of unified heap garbage collections a V8 major GC also collects
+    // the Blink heap.
+    if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
+      return;
+
+    // This CompleteSweep() will do nothing in common cases since we've
+    // called CompleteSweep() before V8 starts minor/major GCs.
     // TODO(ulan): Try removing this for Major V8 GC too.
     CompleteSweep();
     DCHECK(!IsSweepingInProgress());
@@ -535,13 +540,10 @@
               << "ScheduleV8FollowupGCIfNeeded: Scheduled precise GC";
       SchedulePreciseGC();
     }
-    return;
-  }
-  if (gc_type == BlinkGC::kV8MajorGC && ShouldScheduleIdleGC()) {
+  } else if (gc_type == BlinkGC::kV8MajorGC && ShouldScheduleIdleGC()) {
     VLOG(2) << "[state:" << this << "] "
             << "ScheduleV8FollowupGCIfNeeded: Scheduled idle GC";
     ScheduleIdleGC();
-    return;
   }
 }
 
diff --git a/third_party/blink/renderer/platform/loader/cors/cors.h b/third_party/blink/renderer/platform/loader/cors/cors.h
index 425930b9..934824f 100644
--- a/third_party/blink/renderer/platform/loader/cors/cors.h
+++ b/third_party/blink/renderer/platform/loader/cors/cors.h
@@ -9,7 +9,7 @@
 #include "services/network/public/cpp/cors/cors_error_status.h"
 #include "services/network/public/mojom/cors.mojom-shared.h"
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/web_http_header_set.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_context.cc b/third_party/blink/renderer/platform/loader/fetch/fetch_context.cc
index b54b5503..13f16c5 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_context.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_context.cc
@@ -69,14 +69,15 @@
 
 FetchContext& FetchContext::NullInstance(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  return *(new NullFetchContext(std::move(task_runner)));
+  return *(MakeGarbageCollected<NullFetchContext>(std::move(task_runner)));
 }
 
 FetchContext::FetchContext(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner)
-    : platform_probe_sink_(new PlatformProbeSink),
+    : platform_probe_sink_(MakeGarbageCollected<PlatformProbeSink>()),
       task_runner_(std::move(task_runner)) {
-  platform_probe_sink_->addPlatformTraceEvents(new PlatformTraceEventsAgent);
+  platform_probe_sink_->addPlatformTraceEvents(
+      MakeGarbageCollected<PlatformTraceEventsAgent>());
 }
 
 void FetchContext::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_context.h b/third_party/blink/renderer/platform/loader/fetch/fetch_context.h
index 60875d2..d7dabe2 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_context.h
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_context.h
@@ -36,9 +36,9 @@
 #include "base/optional.h"
 #include "base/single_thread_task_runner.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom-blink.h"
 #include "third_party/blink/public/platform/code_cache_loader.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/resource_request_blocked_reason.h"
 #include "third_party/blink/public/platform/scheduler/web_resource_loading_task_runner_handle.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/raw_resource_test.cc b/third_party/blink/renderer/platform/loader/fetch/raw_resource_test.cc
index a28d04a..a33d67e 100644
--- a/third_party/blink/renderer/platform/loader/fetch/raw_resource_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/raw_resource_test.cc
@@ -167,7 +167,7 @@
 
   Persistent<DummyClient> dummy_client = MakeGarbageCollected<DummyClient>();
   Persistent<AddingClient> adding_client =
-      new AddingClient(dummy_client.Get(), raw);
+      MakeGarbageCollected<AddingClient>(dummy_client.Get(), raw);
   raw->AddClient(adding_client, platform_->test_task_runner().get());
   platform_->RunUntilIdle();
   raw->RemoveClient(adding_client);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index 7fe72d1d..5485d62 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -34,7 +34,7 @@
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/time/time.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-blink.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/platform/web_url_request.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
index 783d74e..0995c26 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
@@ -35,7 +35,7 @@
 #include "build/build_config.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom-shared.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_url_loader.h"
 #include "third_party/blink/public/platform/web_url_loader_mock_factory.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.h b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
index 98f750c..a50a101 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_request.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
@@ -36,8 +36,8 @@
 #include "services/network/public/mojom/cors.mojom-blink.h"
 #include "services/network/public/mojom/fetch_api.mojom-blink.h"
 #include "services/network/public/mojom/request_context_frame_type.mojom-shared.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/mojom/net/ip_address_space.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom-shared.h"
 #include "third_party/blink/public/platform/resource_request_blocked_reason.h"
 #include "third_party/blink/public/platform/web_content_security_policy_struct.h"
 #include "third_party/blink/public/platform/web_url_request.h"
diff --git a/third_party/blink/renderer/platform/memory_coordinator.cc b/third_party/blink/renderer/platform/memory_coordinator.cc
index a65474a..73b958a8 100644
--- a/third_party/blink/renderer/platform/memory_coordinator.cc
+++ b/third_party/blink/renderer/platform/memory_coordinator.cc
@@ -58,7 +58,8 @@
 // static
 MemoryCoordinator& MemoryCoordinator::Instance() {
   DEFINE_THREAD_SAFE_STATIC_LOCAL(CrossThreadPersistent<MemoryCoordinator>,
-                                  external, (new MemoryCoordinator));
+                                  external,
+                                  (MakeGarbageCollected<MemoryCoordinator>()));
   return *external.Get();
 }
 
diff --git a/third_party/blink/renderer/platform/memory_coordinator.h b/third_party/blink/renderer/platform/memory_coordinator.h
index b652a68..5d11a91 100644
--- a/third_party/blink/renderer/platform/memory_coordinator.h
+++ b/third_party/blink/renderer/platform/memory_coordinator.h
@@ -52,6 +52,8 @@
   // the heap size.
   static void Initialize();
 
+  MemoryCoordinator();
+
   void RegisterThread(Thread*) LOCKS_EXCLUDED(threads_mutex_);
   void UnregisterThread(Thread*) LOCKS_EXCLUDED(threads_mutex_);
 
@@ -73,8 +75,6 @@
 
   static void SetIsLowEndDeviceForTesting(bool);
 
-  MemoryCoordinator();
-
   void ClearMemory();
   static void ClearThreadSpecificMemory();
 
diff --git a/third_party/blink/renderer/platform/mhtml/archive_resource.cc b/third_party/blink/renderer/platform/mhtml/archive_resource.cc
index 9e6003dc..2178532 100644
--- a/third_party/blink/renderer/platform/mhtml/archive_resource.cc
+++ b/third_party/blink/renderer/platform/mhtml/archive_resource.cc
@@ -50,8 +50,8 @@
                                          const String& content_id,
                                          const AtomicString& mime_type,
                                          const AtomicString& text_encoding) {
-  return new ArchiveResource(std::move(data), url, content_id, mime_type,
-                             text_encoding);
+  return MakeGarbageCollected<ArchiveResource>(std::move(data), url, content_id,
+                                               mime_type, text_encoding);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/mhtml/archive_resource.h b/third_party/blink/renderer/platform/mhtml/archive_resource.h
index 9c012991..7dcc5be 100644
--- a/third_party/blink/renderer/platform/mhtml/archive_resource.h
+++ b/third_party/blink/renderer/platform/mhtml/archive_resource.h
@@ -46,6 +46,11 @@
                                  const AtomicString& mime_type,
                                  const AtomicString& text_encoding);
 
+  ArchiveResource(scoped_refptr<SharedBuffer>,
+                  const KURL&,
+                  const String& content_id,
+                  const AtomicString& mime_type,
+                  const AtomicString& text_encoding);
   ~ArchiveResource();
 
   const KURL& Url() const { return url_; }
@@ -57,12 +62,6 @@
   void Trace(blink::Visitor* visitor) {}
 
  private:
-  ArchiveResource(scoped_refptr<SharedBuffer>,
-                  const KURL&,
-                  const String& content_id,
-                  const AtomicString& mime_type,
-                  const AtomicString& text_encoding);
-
   KURL url_;
   String content_id_;
   scoped_refptr<SharedBuffer> data_;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index c81d6f2..ec7bfb6 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1065,12 +1065,6 @@
       status: "stable",
     },
     {
-      name: "RestrictLazyFrameLoadingToDataSaver",
-    },
-    {
-      name: "RestrictLazyImageLoadingToDataSaver",
-    },
-    {
       name: "RtcAudioJitterBufferMaxPackets",
       origin_trial_feature_name: "RtcAudioJitterBufferMaxPackets",
       status: "experimental",
diff --git a/third_party/blink/renderer/platform/testing/fuzzed_data_provider.cc b/third_party/blink/renderer/platform/testing/fuzzed_data_provider.cc
index dae0154..a2bb3a2 100644
--- a/third_party/blink/renderer/platform/testing/fuzzed_data_provider.cc
+++ b/third_party/blink/renderer/platform/testing/fuzzed_data_provider.cc
@@ -9,11 +9,11 @@
 FuzzedDataProvider::FuzzedDataProvider(const uint8_t* bytes, size_t num_bytes)
     : provider_(bytes, num_bytes) {}
 
-CString FuzzedDataProvider::ConsumeBytesInRange(uint32_t min_bytes,
-                                                uint32_t max_bytes) {
-  size_t num_bytes = provider_.ConsumeIntegralInRange(min_bytes, max_bytes);
-  std::vector<char> bytes = provider_.ConsumeBytes<char>(num_bytes);
-  return CString(bytes.data(), bytes.size());
+String FuzzedDataProvider::ConsumeRandomLengthString(size_t max_length) {
+  std::string str = provider_.ConsumeRandomLengthString(max_length);
+  // FromUTF8 will return a null string if the input data contains invalid UTF-8
+  // sequences. Fall back to latin1 in those cases.
+  return String::FromUTF8WithLatin1Fallback(str.data(), str.length());
 }
 
 CString FuzzedDataProvider::ConsumeRemainingBytes() {
diff --git a/third_party/blink/renderer/platform/testing/fuzzed_data_provider.h b/third_party/blink/renderer/platform/testing/fuzzed_data_provider.h
index bcb6ac8..0adc915 100644
--- a/third_party/blink/renderer/platform/testing/fuzzed_data_provider.h
+++ b/third_party/blink/renderer/platform/testing/fuzzed_data_provider.h
@@ -8,6 +8,7 @@
 #include "base/test/fuzzed_data_provider.h"
 #include "third_party/blink/renderer/platform/wtf/noncopyable.h"
 #include "third_party/blink/renderer/platform/wtf/text/cstring.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
 
@@ -19,10 +20,8 @@
  public:
   FuzzedDataProvider(const uint8_t* bytes, size_t num_bytes);
 
-  // Returns a string with length between minBytes and maxBytes. If the
-  // length is greater than the length of the remaining data this is
-  // equivalent to ConsumeRemainingBytes().
-  CString ConsumeBytesInRange(uint32_t min_bytes, uint32_t max_bytes);
+  // Returns a string with length between 0 and max_length.
+  String ConsumeRandomLengthString(size_t max_length);
 
   // Returns a String containing all remaining bytes of the input data.
   CString ConsumeRemainingBytes();
diff --git a/third_party/blink/renderer/platform/timer_test.cc b/third_party/blink/renderer/platform/timer_test.cc
index 1a578779..fa9e765 100644
--- a/third_party/blink/renderer/platform/timer_test.cc
+++ b/third_party/blink/renderer/platform/timer_test.cc
@@ -617,7 +617,7 @@
   scoped_refptr<OnHeapTimerOwner::Record> record =
       OnHeapTimerOwner::Record::Create();
   Persistent<OnHeapTimerOwner> owner =
-      new OnHeapTimerOwner(record, GetTaskRunner());
+      MakeGarbageCollected<OnHeapTimerOwner>(record, GetTaskRunner());
 
   owner->StartOneShot(TimeDelta(), FROM_HERE);
 
@@ -630,7 +630,7 @@
   scoped_refptr<OnHeapTimerOwner::Record> record =
       OnHeapTimerOwner::Record::Create();
   Persistent<OnHeapTimerOwner> owner =
-      new OnHeapTimerOwner(record, GetTaskRunner());
+      MakeGarbageCollected<OnHeapTimerOwner>(record, GetTaskRunner());
 
   record->Dispose();
   owner->StartOneShot(TimeDelta(), FROM_HERE);
@@ -650,7 +650,7 @@
   scoped_refptr<OnHeapTimerOwner::Record> record =
       OnHeapTimerOwner::Record::Create();
   Persistent<OnHeapTimerOwner> owner =
-      new OnHeapTimerOwner(record, GetTaskRunner());
+      MakeGarbageCollected<OnHeapTimerOwner>(record, GetTaskRunner());
 
   record->Dispose();
   owner->StartOneShot(TimeDelta(), FROM_HERE);
diff --git a/third_party/blink/renderer/platform/web_task_runner.h b/third_party/blink/renderer/platform/web_task_runner.h
deleted file mode 100644
index 04c6b31e..0000000
--- a/third_party/blink/renderer/platform/web_task_runner.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WEB_TASK_RUNNER_H_
-#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WEB_TASK_RUNNER_H_
-
-#include "third_party/blink/renderer/platform/scheduler/public/post_cancellable_task.h"
-#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
-
-// The contents of this file are moved to the above headers. For future
-// includes, use either of them.
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WEB_TASK_RUNNER_H_
diff --git a/third_party/blink/renderer/platform/wtf/hash_map.h b/third_party/blink/renderer/platform/wtf/hash_map.h
index 96cb4996..46b39e0 100644
--- a/third_party/blink/renderer/platform/wtf/hash_map.h
+++ b/third_party/blink/renderer/platform/wtf/hash_map.h
@@ -198,7 +198,8 @@
             typename IncomingMappedType>
   AddResult Insert(IncomingKeyType&&, IncomingMappedType&&);
 
-  static bool IsValidKey(KeyPeekInType);
+  template <typename IncomingKeyType>
+  static bool IsValidKey(const IncomingKeyType&);
 
   template <typename VisitorDispatcher, typename A = Allocator>
   std::enable_if_t<A::kIsGarbageCollected> Trace(VisitorDispatcher visitor) {
@@ -665,7 +666,8 @@
           typename W,
           typename X,
           typename Y>
-inline bool HashMap<T, U, V, W, X, Y>::IsValidKey(KeyPeekInType key) {
+template <typename IncomingKeyType>
+inline bool HashMap<T, U, V, W, X, Y>::IsValidKey(const IncomingKeyType& key) {
   if (KeyTraits::IsDeletedValue(key))
     return false;
 
diff --git a/third_party/blink/renderer/platform/wtf/hash_map_test.cc b/third_party/blink/renderer/platform/wtf/hash_map_test.cc
index d1864f1..16ccad0 100644
--- a/third_party/blink/renderer/platform/wtf/hash_map_test.cc
+++ b/third_party/blink/renderer/platform/wtf/hash_map_test.cc
@@ -617,6 +617,21 @@
   EXPECT_TRUE(IsOneTwoThreeMap(ReturnOneTwoThreeMap()));
 }
 
+TEST(HashMapTest, IsValidKey) {
+  bool is_deleted;
+  EXPECT_FALSE((HashMap<int, int>::IsValidKey(0)));
+  EXPECT_FALSE((HashMap<int, int>::IsValidKey(-1)));
+  EXPECT_TRUE((HashMap<int, int>::IsValidKey(-2)));
+
+  EXPECT_FALSE((HashMap<int*, int>::IsValidKey(nullptr)));
+  EXPECT_TRUE((HashMap<int*, int>::IsValidKey(std::make_unique<int>().get())));
+
+  auto p = base::MakeRefCounted<DummyRefCounted>(is_deleted);
+  EXPECT_TRUE((HashMap<scoped_refptr<DummyRefCounted>, int>::IsValidKey(p)));
+  EXPECT_FALSE(
+      (HashMap<scoped_refptr<DummyRefCounted>, int>::IsValidKey(nullptr)));
+}
+
 static_assert(!IsTraceable<HashMap<int, int>>::value,
               "HashMap<int, int> must not be traceable.");
 
diff --git a/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer.h b/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer.h
index 39f91ea1..fc67bba 100644
--- a/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer.h
+++ b/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer.h
@@ -253,7 +253,10 @@
 }
 
 unsigned ArrayBuffer::ByteLength() const {
-  return contents_.DataLength();
+  // TODO(dtapuska): Revisit this cast. ArrayBufferContents
+  // uses size_t for storing data. Whereas ArrayBuffer IDL is
+  // only uint32_t based.
+  return static_cast<unsigned>(contents_.DataLength());
 }
 
 scoped_refptr<ArrayBuffer> ArrayBuffer::Slice(int begin, int end) const {
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-gen-property-trees b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=BlinkGenPropertyTrees
similarity index 100%
rename from third_party/blink/web_tests/FlagExpectations/enable-blink-gen-property-trees
rename to third_party/blink/web_tests/FlagExpectations/enable-blink-features=BlinkGenPropertyTrees
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-features=NetworkService b/third_party/blink/web_tests/FlagExpectations/enable-features=NetworkService
index 3b51d5c09..67be992 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-features=NetworkService
+++ b/third_party/blink/web_tests/FlagExpectations/enable-features=NetworkService
@@ -22,9 +22,6 @@
 # enabled this fails in both content_shell and chrome.
 Bug(none) http/tests/misc/redirect-to-about-blank.html [ Timeout ]
 
-crbug.com/898306 http/tests/inspector-protocol/network/raw-headers-for-protected-document.js [ Failure ]
-crbug.com/898306 http/tests/inspector-protocol/network/security-info-on-response.js [ Failure ]
-
 # Reports aren't allowed under content_shell NS
 crbug.com/910212 virtual/network-error-logging/external/wpt/network-error-logging/sends-report-on-404.https.html [ Failure ]
 crbug.com/910212 virtual/network-error-logging/external/wpt/network-error-logging/sends-report-on-cache-validation.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-slimming-paint-v2 b/third_party/blink/web_tests/FlagExpectations/enable-slimming-paint-v2
index ee0c9bc..40607c0 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-slimming-paint-v2
+++ b/third_party/blink/web_tests/FlagExpectations/enable-slimming-paint-v2
@@ -1,98 +1,34 @@
 # Expectations for slimming paint v2
 # See: https://docs.google.com/document/d/1QCM912Dr6u38DqyQqd7pxQxDy8FFOoWMMDq7uAXqKdA/view
 # We are focused on fast/, compositing/, and svg/ with all other directories skipped (for now).
-Bug(none) accessibility/ [ Skip ]
-Bug(none) app_banner/ [ Skip ]
-Bug(none) battery-status/ [ Skip ]
-Bug(none) bindings/ [ Skip ]
-Bug(none) bluetooth/ [ Skip ]
-Bug(none) crypto/ [ Skip ]
-Bug(none) css-parser/ [ Skip ]
-Bug(none) css1/ [ Skip ]
-Bug(none) css2.1/ [ Skip ]
 Bug(none) css3/ [ Skip ]
 Bug(none) css3/blending [ Pass ]
-Bug(none) cssom/ [ Skip ]
-Bug(none) custom-elements/ [ Skip ]
-Bug(none) dom/ [ Skip ]
-Bug(none) editing/ [ Skip ]
-Bug(none) fonts/ [ Skip ]
-Bug(none) fragmentation/ [ Skip ]
-Bug(none) fullscreen/ [ Skip ]
-Bug(none) gamepad/ [ Skip ]
-Bug(none) harness-tests/ [ Skip ]
-Bug(none) hittesting/ [ Skip ]
-Bug(none) html/dialog/ [ Skip ]
-Bug(none) html5lib/ [ Skip ]
-Bug(none) http/ [ Skip ]
-Bug(none) idle-callback/ [ Skip ]
-Bug(none) ietestcenter/ [ Skip ]
-Bug(none) external/wpt/imagecapture/ [ Skip ]
-Bug(none) external/ [ Skip ]
-Bug(none) inspector-protocol/ [ Skip ]
-Bug(none) intersection-observer/ [ Skip ]
-Bug(none) jquery/ [ Skip ]
-Bug(none) loader/ [ Skip ]
-Bug(none) mathml/ [ Skip ]
+Bug(none) editing/input [ Skip ]
+Bug(none) external/wpt [ Skip ]
+Bug(none) http/tests/devtools [ Skip ]
 Bug(none) media/ [ Skip ]
-Bug(none) mhtml/ [ Skip ]
-Bug(none) navigator_language/ [ Skip ]
-Bug(none) netinfo/ [ Skip ]
-Bug(none) nfc/ [ Skip ]
-Bug(none) payments/ [ Skip ]
-Bug(none) permissionclient/ [ Skip ]
-Bug(none) platform/ [ Skip ]
 Bug(none) plugins/ [ Skip ]
-Bug(none) pointer-lock/ [ Skip ]
-Bug(none) presentation/ [ Skip ]
 Bug(none) printing/ [ Skip ]
-Bug(none) resources/ [ Skip ]
-Bug(none) screen_orientation/ [ Skip ]
 Bug(none) scrollbars/ [ Skip ]
 Bug(none) scrollingcoordinator/ [ Skip ]
-Bug(none) security/ [ Skip ]
-Bug(none) shadow-dom/ [ Skip ]
-Bug(none) storage/ [ Skip ]
 Bug(none) tables/ [ Skip ]
-Bug(none) third_party/ [ Skip ]
-Bug(none) touchadjustment/ [ Skip ]
 Bug(none) transforms/ [ Skip ]
-Bug(none) traversal/ [ Skip ]
-Bug(none) typedcssom/ [ Skip ]
-Bug(none) vibration/ [ Skip ]
-Bug(none) wake_lock/ [ Skip ]
-Bug(none) webaudio/ [ Skip ]
-Bug(none) webexposed/ [ Skip ]
-Bug(none) webmidi/ [ Skip ]
-Bug(none) xmlviewer/ [ Skip ]
 
-Bug(none) virtual/android/ [ Skip ]
-Bug(none) virtual/blink-gen-property-trees/ [ Skip ]
+Bug(none) virtual/android [ Skip ]
 Bug(none) virtual/exotic-color-space/ [ Skip ]
 Bug(none) virtual/gpu/ [ Skip ]
 Bug(none) virtual/gpu-rasterization/ [ Skip ]
 Bug(none) virtual/layout_ng/ [ Skip ]
 Bug(none) virtual/layout_ng_experimental/ [ Skip ]
-Bug(none) virtual/linux-subpixel/ [ Skip ]
-Bug(none) virtual/mac-antialiasedtext/ [ Skip ]
-Bug(none) virtual/media-gpu-accelerated/ [ Skip ]
 Bug(none) virtual/mouseevent_fractional/ [ Skip ]
-Bug(none) virtual/mse-1mb-buffers/ [ Skip ]
 Bug(none) virtual/new-remote-playback-pipeline/ [ Skip ]
 Bug(none) virtual/outofblink-cors/ [ Skip ]
 Bug(none) virtual/prefer_compositing_to_lcd_text/ [ Skip ]
-Bug(none) virtual/reporting-api/ [ Skip ]
-Bug(none) virtual/scalefactor150/ [ Skip ]
-Bug(none) virtual/scalefactor200/ [ Skip ]
-Bug(none) virtual/scalefactor200withzoom/ [ Skip ]
 Bug(none) virtual/scroll_customization/ [ Skip ]
-Bug(none) virtual/spv2/ [ Skip ]
 Bug(none) virtual/stable/ [ Skip ]
-Bug(none) virtual/targetedstylerecalc/ [ Skip ]
-Bug(none) virtual/unified-autoplay/ [ Skip ]
+Bug(none) virtual/sxg-with-network-service [ Skip ]
 Bug(none) virtual/user-activation-v2/ [ Skip ]
 Bug(none) virtual/video-surface-layer/ [ Skip ]
-Bug(none) virtual/windows-directwrite/ [ Skip ]
 
 crbug.com/778875 virtual/threaded/animations/animationworklet/ [ Skip ]
 crbug.com/841567 virtual/threaded/fast/scrolling [ Skip ]
@@ -103,6 +39,12 @@
 crbug.com/817175 compositing/overflow/clip-escaping-reverse-order-should-not-crash.html [ Pass ]
 crbug.com/736052 compositing/overflow/composited-scroll-with-fractional-translation.html [ Pass ]
 
+Bug(none) virtual/scalefactor150/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure ]
+Bug(none) virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure ]
+Bug(none) virtual/scalefactor200withzoom/fast/hidpi/static/mousewheel-scroll-amount.html [ Failure ]
+Bug(none) virtual/scalefactor200withzoom/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure ]
+
+Bug(none) accessibility/reach-and-scroll-overflow-div-without-mouse.html [ Timeout ]
 Bug(none) compositing/animation/hidden-composited.html [ Failure ]
 Bug(none) compositing/change-preferCompositingToLCDText-setting.html [ Failure ]
 Bug(none) compositing/contents-opaque/hidden-with-visible-child.html [ Failure ]
@@ -358,6 +300,15 @@
 Bug(none) fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer.html [ Failure ]
 Bug(none) fast/sub-pixel/should-not-repaint-subpixel-composited-layer.html [ Failure ]
 Bug(none) fast/sub-pixel/transformed-iframe-copy-on-scroll.html [ Failure ]
+Bug(none) fragmentation/outline-crossing-columns.html [ Crash ]
+Bug(none) fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html [ Failure ]
+Bug(none) http/tests/local/blob/send-data-blob.html [ Crash ]
+Bug(none) http/tests/misc/scroll-cross-origin-iframes.html [ Timeout ]
+Bug(none) http/tests/misc/slow-loading-mask.html [ Failure ]
+Bug(none) http/tests/navigation/same-document-scroll-position-restore.html [ Timeout ]
+Bug(none) ietestcenter/css3/bordersbackgrounds/background-attachment-local-scrolling.htm [ Failure ]
+Bug(none) inspector-protocol/layers/get-layers.js [ Timeout ]
+Bug(none) inspector-protocol/layers/paint-profiler.js [ Failure ]
 Bug(none) paint/pagination/pagination-change-clip-crash.html [ Failure ]
 
 # Less invalidations or different invalidations without pixel failures.
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 335216f6..eaed9242 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -1670,6 +1670,7 @@
 crbug.com/846170 http/tests/lazyload/lazy.html [ WontFix ]
 crbug.com/846170 http/tests/lazyload/attribute.html [ WontFix ]
 crbug.com/846170 http/tests/lazyload/fixed-dimension.html [ WontFix ]
+crbug.com/846170 http/tests/lazyload/style-dimension.html [ WontFix ]
 crbug.com/869492 external/wpt/feature-policy/experimental-features/lazyload/lazyload-disabled-image-tentative.html [ WontFix ]
 crbug.com/869492 external/wpt/feature-policy/experimental-features/lazyload/lazyload-enabled-image-tentative.sub.html [ WontFix ]
 crbug.com/869492 external/wpt/feature-policy/experimental-features/lazyload/lazyload-image-attribute-on-sanity-check-tentative.sub.html [ WontFix ]
@@ -2123,7 +2124,7 @@
 [ Retina ] external/wpt/pointerevents/pointerevent_touch-action-table-test_touch-manual.html [ WontFix ]
 
 # ====== Tests incompatible with the default Site Isolation from here ======
-# See also third_party/WebKit/LayoutTests/virtual/not-site-per-process/README.md
+# See also third_party/blink/web_tests/virtual/not-site-per-process/README.md
 #
 # When modifying the list of files that behave differently with and without
 # OOPIFs, please consider modifying all the locations below:
diff --git a/third_party/blink/web_tests/SmokeTests b/third_party/blink/web_tests/SmokeTests
index 1b2e845..5554052 100644
--- a/third_party/blink/web_tests/SmokeTests
+++ b/third_party/blink/web_tests/SmokeTests
@@ -26,7 +26,6 @@
 compositing/gestures/gesture-tapHighlight-no-graphics-layer-region-based-multicol.html
 compositing/iframes/visibility-hidden-transformed-content.html
 compositing/images/clip-on-directly-composited-image.html
-compositing/layer-creation/assumed-overlap-for-inline-transform.html
 compositing/layer-creation/fixed-position-out-of-view-dynamic.html
 compositing/layer-creation/fixed-position-out-of-view.html
 compositing/reflections/empty-reflection-with-mask.html
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 9ced6de..241b46d 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -121,7 +121,7 @@
 
 
 # ====== Site Isolation failures from here ======
-# See also third_party/WebKit/LayoutTests/virtual/not-site-per-process/README.md
+# See also third_party/blink/web_tests/virtual/not-site-per-process/README.md
 #
 # When modifying the list of files that behave differently with and without
 # OOPIFs, please consider modifying all the locations below:
@@ -132,10 +132,6 @@
 # Tests temporarily disabled with Site Isolation - test issues or test harness
 # issues (e.g. missing OOPIF support in the test harness).
 # TODO(lukasza, alexmos): Burn down this list.
-crbug.com/585188 http/tests/xmlhttprequest/origin-whitelisting-all.html [ Failure ]
-crbug.com/585188 http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html [ Failure ]
-crbug.com/585188 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-all.html [ Failure ]
-crbug.com/585188 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html [ Failure ]
 crbug.com/606594 http/tests/local/serviceworker/fetch-request-body-file.html [ Skip ]
 crbug.com/645641 external/wpt/html/syntax/parsing/html5lib_tests19.html [ Crash Failure ]
 crbug.com/650348 http/tests/webaudio/autoplay-crossorigin.html [ Timeout ]
@@ -692,15 +688,6 @@
 # Maybe a Mac-specific rebaselining issue.
 crbug.com/846557 [ Mac ] virtual/layout_ng_experimental/css3/flexbox/button.html [ Skip ]
 
-# Element.innerText doesn't work with multicol.
-crbug.com/873957 virtual/layout_ng_experimental/fast/multicol/float-not-removed-crash.html [ Failure ]
-crbug.com/873957 virtual/layout_ng_experimental/fast/multicol/span/anonymous-before-child-parent-crash.html [ Failure ]
-crbug.com/873957 virtual/layout_ng_experimental/fast/multicol/span/anonymous-split-block-crash.html [ Failure ]
-crbug.com/873957 virtual/layout_ng_experimental/fast/multicol/span/clone-anonymous-block-non-inline-child-crash.html [ Failure ]
-
-### Crash site: layout_ng_block_flow.cc
-crbug.com/714962 virtual/layout_ng/fast/inline/inline-offsetLeft-relpos.html [ Crash Failure ]
-
 crbug.com/835810 [ Win7 ] http/tests/devtools/startup/dom-storage-open.js [ Pass Timeout ]
 
 ### Image/text failures
@@ -710,7 +697,6 @@
 crbug.com/714962 virtual/layout_ng/fast/inline/inline-box-background-repeat-x.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/inline/inline-box-background-repeat-y.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/inline/inline-box-background.html [ Failure ]
-crbug.com/714962 virtual/layout_ng/fast/inline/inline-offsetLeft-continuation.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/inline/justify-emphasis-inline-box.html [ Failure ]
 crbug.com/714962 [ Mac ] virtual/layout_ng/fast/inline/br-text-decoration.html [ Failure ]
 crbug.com/714962 [ Mac ] virtual/layout_ng/fast/inline/drawStyledEmptyInlines.html [ Failure ]
@@ -721,8 +707,6 @@
 crbug.com/714962 virtual/layout_ng/fast/inline/continuation-outlines-with-layers.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/inline/continuation-outlines.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/inline/inline-borders-with-bidi-override.html [ Failure ]
-crbug.com/714962 virtual/layout_ng/fast/inline/inline-focus-ring-under-absolute-enclosing-relative-div.html [ Failure ]
-crbug.com/714962 virtual/layout_ng/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/inline/outline-continuations.html [ Failure ]
 
 ### virtual/layout_ng/external/wpt/css/CSS2/normal-flow/
@@ -757,7 +741,6 @@
 crbug.com/714962 virtual/layout_ng/fast/writing-mode/japanese-rl-selection.html [ Failure ]
 crbug.com/714962 [ Mac ] virtual/layout_ng/fast/writing-mode/margins.html [ Failure ]
 crbug.com/714962 [ Mac ] virtual/layout_ng/fast/writing-mode/orthogonal-inline-block.html [ Failure ]
-crbug.com/714962 virtual/layout_ng/fast/writing-mode/orthogonal-writing-modes-available-width-absolute-crash.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/writing-mode/percentage-height-orthogonal-writing-modes.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/writing-mode/vertical-align-table-baseline.html [ Failure ]
 crbug.com/714962 virtual/layout_ng/fast/writing-mode/vertical-baseline-alignment.html [ Failure ]
@@ -1002,7 +985,6 @@
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/composited-relpos-resize.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/composited-with-child-layer-in-next-column.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/composited-with-overflow-in-next-column.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_experimental/fast/multicol/content-change-same-height.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/cssom-view.html [ Crash ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/doubly-nested-with-top-padding-crossing-row-boundaries.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/dynamic/abspos-becomes-spanner.html [ Failure ]
@@ -1085,8 +1067,6 @@
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/hit-test-end-of-column.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/hit-test-end-of-column-with-line-height.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/hit-test-gap-between-pages-flipped.html [ Failure ]
-crbug.com/812457 virtual/layout_ng_experimental/fast/multicol/huge-column-count.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_experimental/fast/multicol/huge-column-gap-crash.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/image-inside-nested-blocks-with-border.html [ Failure ]
 crbug.com/829181 virtual/layout_ng_experimental/fast/multicol/infinitely-tall-content-in-outer-crash.html [ Skip ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/inline-block-baseline.html [ Failure ]
@@ -1102,7 +1082,6 @@
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/many-lines-overflow-in-single-row-inner.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/mixed-opacity-test.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/mixed-positioning-stacking-order.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_experimental/fast/multicol/multicol-becomes-abspos-crash.html [ Failure ]
 crbug.com/626703 virtual/layout_ng_experimental/fast/multicol/multicol-becomes-paged-auto-height.html [ Crash Pass ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/multicol-with-child-renderLayer-for-input.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_experimental/fast/multicol/multicol-with-spanner-becomes-paged.html [ Failure ]
@@ -1131,14 +1110,9 @@
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/nested-with-tall-block.html [ Failure ]
 crbug.com/874506 virtual/layout_ng_experimental/fast/multicol/nested-writing-mode-root-crash.html [ Crash ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/avoid-column-break-inside.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance10.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance1.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance2.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance3.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance4.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance5.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance-images.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance-maxheight1.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/break-before.html [ Failure ]
 crbug.com/874506 virtual/layout_ng_experimental/fast/multicol/newmulticol/breaks-2-columns-3.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/breaks-2-columns-3-no-balancing.html [ Failure ]
@@ -1168,7 +1142,6 @@
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/pushed-line-affected-by-float.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/relayout-and-push-float.html [ Failure ]
 crbug.com/591099 [ Mac ] virtual/layout_ng_experimental/fast/multicol/relpos-inside-inline-block.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/renderer-positioned-assert-crash.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/rule-in-nested-with-too-tall-line.html [ Failure ]
 crbug.com/714962 virtual/layout_ng_experimental/fast/multicol/scale-transform-text.html [ Failure ]
 crbug.com/874506 virtual/layout_ng_experimental/fast/multicol/scrollable-basic.html [ Failure ]
@@ -1253,7 +1226,6 @@
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/tall-content-in-inner-with-fixed-height.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/tall-float2.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/three-inner-rows.html [ Failure ]
-crbug.com/714962 virtual/layout_ng_experimental/fast/multicol/unbreakable-content-taller-than-height-crash.html [ Failure ]
 crbug.com/874506 virtual/layout_ng_experimental/fast/multicol/unsplittable-inline-block.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/vertical-lr/break-properties.html [ Failure ]
@@ -3016,6 +2988,11 @@
 crbug.com/893480 external/wpt/infrastructure/testdriver/actions/multiDevice.html [ Failure Timeout ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/svg/painting/marker-006.svg [ Failure ]
+crbug.com/626703 external/wpt/svg/painting/marker-005.svg [ Failure ]
+crbug.com/626703 [ Linux ] external/wpt/css/css-variables/variable-exponential-blowup.html [ Timeout Crash ]
+crbug.com/626703 [ Mac ] external/wpt/css/css-variables/variable-exponential-blowup.html [ Timeout ]
+crbug.com/626703 [ Win ] external/wpt/css/css-variables/variable-exponential-blowup.html [ Crash ]
 crbug.com/626703 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-004.html [ Failure ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/preload/dynamic-adding-preload-imagesrcset.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-text/text-transform/text-transform-capitalize-033.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 75502a50..9657c5f 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -294,7 +294,7 @@
   {
     "prefix": "blink-gen-property-trees",
     "base": "paint/transparency",
-    "args": ["--enable-blink-gen-property-trees"]
+    "args": ["--enable-blink-features=BlinkGenPropertyTrees"]
   },
   {
     "prefix": "scalefactor200",
@@ -1018,16 +1018,6 @@
     "args": ["--disable-site-isolation-trials"]
   },
   {
-    "prefix": "not-site-per-process",
-    "base": "http/tests/xmlhttprequest/origin-whitelisting-all.html",
-    "args": ["--disable-site-isolation-trials"]
-  },
-  {
-    "prefix": "not-site-per-process",
-    "base": "http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html",
-    "args": ["--disable-site-isolation-trials"]
-  },
-  {
     "prefix": "transferable-streams",
     "base": "http/tests/streams/transferable",
     "args": ["--enable-blink-features=TransferableStreams"]
diff --git a/third_party/blink/web_tests/W3CImportExpectations b/third_party/blink/web_tests/W3CImportExpectations
index 635fc02..a113029d 100644
--- a/third_party/blink/web_tests/W3CImportExpectations
+++ b/third_party/blink/web_tests/W3CImportExpectations
@@ -453,5 +453,5 @@
 external/wpt/uievents/order-of-events/mouse-events/mousemove-between-manual.html [ Skip ]
 
 # Tests that fail in content_shell but pass when run manually.
-third_party/WebKit/LayoutTests/external/wpt/client-hints/accept_ch_lifetime.https.html [ Skip ]
-third_party/WebKit/LayoutTests/external/wpt/client-hints/accept_ch.https.html [ Skip ]
+external/wpt/client-hints/accept_ch_lifetime.https.html [ Skip ]
+external/wpt/client-hints/accept_ch.https.html [ Skip ]
diff --git a/third_party/blink/web_tests/animations/animationworklet/animator-registration.html b/third_party/blink/web_tests/animations/animationworklet/animator-registration.html
index 8fabf8b..4559df7 100644
--- a/third_party/blink/web_tests/animations/animationworklet/animator-registration.html
+++ b/third_party/blink/web_tests/animations/animationworklet/animator-registration.html
@@ -3,7 +3,7 @@
 <!--
 TODO(majidvp): The try/catch in above test cases should not be needed but at the moment
 threaded worklet does not correctly pass error to its parent context. It crashes in
-https://codesearch.chromium.org/chromium/src/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp?sq=package:chromium&dr&l=320
+https://codesearch.chromium.org/chromium/src/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc?sq=package:chromium&dr&l=320
 -->
 <script id="duplicate" type="text/worklet">
 try {
diff --git a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite-expected.html b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite-expected.html
index e92c47a..e6b66b9c 100644
--- a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite-expected.html
+++ b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite-expected.html
@@ -8,12 +8,12 @@
 <div style="transform: translateZ(0); position: relative; left: 10px; top: 10px"></div>
 <div id="targetDiv" style="position: relative; left: 10px; top: 40px; width: 200px; height: 100px; overflow-y: scroll; overflow-x: scroll;">
 <div id="divToForceCompositedLayer">
-<a href="">Link 1</a><br>
-<a href="">Link 2</a><br>
-<a href="">Link 3</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
 <a href="" class="activeLink" id="targetLink">Target Link.</a><br>
-<a href="">Link 4</a><br>
-<a href="">Link 5</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
 </div></div>
 <div style="position: relative; left: 10px; top: 80px">
 This test is successful if "Target Link" above is covered in a green rectangle with square corners.
diff --git a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite.html b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite.html
index 4ff3ccd..d479170 100644
--- a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite.html
+++ b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite.html
@@ -8,12 +8,12 @@
 <div style="transform: translateZ(0); position: relative; left: 10px; top: 10px"></div>
 <div id="targetDiv" style="position: relative; left: 10px; top: 40px; width: 200px; height: 100px; overflow-y: scroll; overflow-x: scroll;">
 <div id="divToForceCompositedLayer">
-<a href="">Link 1</a><br>
-<a href="">Link 2</a><br>
-<a href="">Link 3</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
 <a class="opaqueHighlight" href="" id="targetLink">Target Link.</a><br>
-<a href="">Link 4</a><br>
-<a href="">Link 5</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
 </div></div>
 <div style="position: relative; left: 10px; top: 80px">
 This test is successful if "Target Link" above is covered in a green rectangle with square corners.
diff --git a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite-expected.html b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite-expected.html
index d777d861..5aacc3b 100644
--- a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite-expected.html
+++ b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite-expected.html
@@ -7,12 +7,12 @@
 <div style="transform: translateZ(0); position: relative; left: 10px; top: 10px"></div>
 <div id="targetDiv" style="position: relative; left: 10px; top: 40px; width: 200px; height: 100px; overflow-y: scroll; overflow-x: scroll;">
 <div id="divToControlCompositedLayer" style="transform: translateZ(0);">
-<a href="">Link 1</a><br>
-<a href="">Link 2</a><br>
-<a href="">Link 3</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
 <span class="fauxHighlight" id="targetLink">Target Link.</span><br>
-<a href="">Link 4</a><br>
-<a href="">Link 5</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
 </div></div>
 <div style="position: relative; left: 10px; top: 80px">
 This test is successful if "Target Link" above is covered in a green rectangle with square corners.
diff --git a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite.html b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite.html
index 1fca4c2..1550212 100644
--- a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite.html
+++ b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite.html
@@ -9,12 +9,12 @@
 <div style="transform: translateZ(0); position: relative; left: 10px; top: 10px"></div>
 <div id="targetDiv" style="position: relative; left: 10px; top: 40px; width: 200px; height: 100px; overflow-y: scroll; overflow-x: scroll;">
 <div id="divToControlCompositedLayer" style="transform: translateZ(0);">
-<a href="">Link 1</a><br>
-<a href="">Link 2</a><br>
-<a href="">Link 3</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
 <a class="opaqueHighlight needsFix" href="" id="targetLink">Target Link.</a><br>
-<a href="">Link 4</a><br>
-<a href="">Link 5</a><br>
+<a href="">AAAAAA</a><br>
+<a href="">AAAAAA</a><br>
 </div></div>
 <div style="position: relative; left: 10px; top: 80px">
 This test is successful if "Target Link" above is covered in a green rectangle with square corners.
diff --git a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled-expected.html b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled-expected.html
index 379f84ba..39aaee6 100644
--- a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled-expected.html
+++ b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled-expected.html
@@ -15,12 +15,12 @@
   <body onload="runTest();">
     <div style="transform: translateZ(0); position: relative; left: 10px; top: 10px"></div>
     <div id="targetDiv" style="position: relative; left: 10px; top: 40px; width: 200px; height: 100px; overflow-y: scroll; overflow-x: scroll;">
-      <a href="">Link 1</a><br>
-      <a href="">Link 2</a><br>
-      <a href="">Link 3</a><br>
+      <a href="">AAAAAA</a><br>
+      <a href="">AAAAAA</a><br>
+      <a href="">AAAAAA</a><br>
       <a href="" class="activeLink" id="targetLink">Target Link.</a><br>
-      <a href="">Link 4</a><br>
-      <a href="">Link 5</a><br>
+      <a href="">AAAAAA</a><br>
+      <a href="">AAAAAA</a><br>
     </div>
     <div style="position: relative; left: 10px; top: 80px">
       This test is successful if "Target Link" above is covered in a green
diff --git a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled.html b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled.html
index f7af71d..02da16c2 100644
--- a/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled.html
+++ b/third_party/blink/web_tests/compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled.html
@@ -36,12 +36,12 @@
   <body onload="runTest();">
     <div style="transform: translateZ(0); position: relative; left: 10px; top: 10px"></div>
     <div id="targetDiv" style="position: relative; left: 10px; top: 40px; width: 200px; height: 100px; overflow-y: scroll; overflow-x: scroll;">
-      <a href="">Link 1</a><br>
-      <a href="">Link 2</a><br>
-      <a href="">Link 3</a><br>
+      <a href="">AAAAAA</a><br>
+      <a href="">AAAAAA</a><br>
+      <a href="">AAAAAA</a><br>
       <a class="opaqueHighlight" href="" id="targetLink">Target Link.</a><br>
-      <a href="">Link 4</a><br>
-      <a href="">Link 5</a><br>
+      <a href="">AAAAAA</a><br>
+      <a href="">AAAAAA</a><br>
     </div>
     <div style="position: relative; left: 10px; top: 80px">
       This test is successful if "Target Link" above is covered in a green
diff --git a/third_party/blink/web_tests/compositing/layer-creation/assumed-overlap-for-inline-transform.html b/third_party/blink/web_tests/compositing/layer-creation/assumed-overlap-for-inline-transform.html
deleted file mode 100644
index 8774045..0000000
--- a/third_party/blink/web_tests/compositing/layer-creation/assumed-overlap-for-inline-transform.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<style>
-.box {
-  position: relative;
-  width: 100px;
-  height: 100px;
-}
-</style>
-<div class="box" style="transform: translateZ(0); background-color: blue;"></div>
-<div class="box" style="background-color: yellow;"></div>
-<script>
-if (window.testRunner) {
-    testRunner.dumpAsText();
-    testRunner.setCustomTextOutput(internals.layerTreeAsText(document));
-}
-</script>
diff --git a/third_party/blink/web_tests/compositing/overflow/avoid-ancestor-clip-for-scroll-children.html b/third_party/blink/web_tests/compositing/overflow/avoid-ancestor-clip-for-scroll-children.html
index 2ff2f9d..ff507da 100644
--- a/third_party/blink/web_tests/compositing/overflow/avoid-ancestor-clip-for-scroll-children.html
+++ b/third_party/blink/web_tests/compositing/overflow/avoid-ancestor-clip-for-scroll-children.html
@@ -31,7 +31,7 @@
     <div class="translated">
       <div class="scrolled"></div>
     </div>
-    <div class="translated" style="transform: translate(0,430px)">
+    <div class="translated" style="transform: translate3D(0px,430px,0px)">
       <div class="scrolled"></div>
     </div>
   </div>
diff --git a/third_party/blink/web_tests/compositing/squashing/frame-clip-squashed-scrolled-expected.txt b/third_party/blink/web_tests/compositing/squashing/frame-clip-squashed-scrolled-expected.txt
index c3e99843..2528202 100644
--- a/third_party/blink/web_tests/compositing/squashing/frame-clip-squashed-scrolled-expected.txt
+++ b/third_party/blink/web_tests/compositing/squashing/frame-clip-squashed-scrolled-expected.txt
@@ -19,21 +19,10 @@
       "transform": 1
     },
     {
-      "name": "Squashing Containment Layer",
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
       "name": "LayoutBlockFlow DIV",
       "contentsOpaque": true,
       "drawsContent": false,
       "transform": 2
-    },
-    {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (relative positioned) DIV)",
-      "position": [8, 8],
-      "bounds": [102, 2002],
-      "transform": 1
     }
   ],
   "transforms": [
@@ -55,8 +44,7 @@
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [8, 8, 0, 1]
-      ],
-      "flattenInheritedTransform": false
+      ]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/compositing/squashing/squash-onto-distant-relative-expected.txt b/third_party/blink/web_tests/compositing/squashing/squash-onto-distant-relative-expected.txt
index c3843a8..ed7e648 100644
--- a/third_party/blink/web_tests/compositing/squashing/squash-onto-distant-relative-expected.txt
+++ b/third_party/blink/web_tests/compositing/squashing/squash-onto-distant-relative-expected.txt
@@ -18,20 +18,11 @@
       "backgroundColor": "#FFFFFF"
     },
     {
-      "name": "Squashing Containment Layer",
-      "drawsContent": false
-    },
-    {
       "name": "LayoutBlockFlow (positioned) DIV id='squashing'",
       "bounds": [1, 1],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "transform": 1
-    },
-    {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV id='squashed')",
-      "position": [600, 0],
-      "bounds": [200, 200]
     }
   ],
   "transforms": [
@@ -42,8 +33,7 @@
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [-33554430, 0, 0, 1]
-      ],
-      "flattenInheritedTransform": false
+      ]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/compositing/squashing/squashing-inside-perspective-expected.txt b/third_party/blink/web_tests/compositing/squashing/squashing-inside-perspective-expected.txt
index 94cc92d..e7ecd61 100644
--- a/third_party/blink/web_tests/compositing/squashing/squashing-inside-perspective-expected.txt
+++ b/third_party/blink/web_tests/compositing/squashing/squashing-inside-perspective-expected.txt
@@ -29,20 +29,11 @@
       "transform": 2
     },
     {
-      "name": "Squashing Containment Layer",
-      "drawsContent": false,
-      "transform": 2
-    },
-    {
       "name": "LayoutBlockFlow (positioned) DIV",
       "bounds": [200, 200],
       "contentsOpaque": true,
       "backgroundColor": "#00008B",
       "transform": 3
-    },
-    {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV)",
-      "transform": 2
     }
   ],
   "transforms": [
diff --git a/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png
index 05c2b5a6..f2ef4f5 100644
--- a/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png
+++ b/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/custom-elements/tentative/form-association.html b/third_party/blink/web_tests/custom-elements/tentative/form-association.html
index 3e2284d..d565fcf 100644
--- a/third_party/blink/web_tests/custom-elements/tentative/form-association.html
+++ b/third_party/blink/web_tests/custom-elements/tentative/form-association.html
@@ -171,4 +171,22 @@
   assert_equals($('#form2').elements.length, 0, 'form.elements.length after removal');
   assert_equals($('#fs2').elements.length, 0, 'fieldset.elements.length after removal');
 }, 'Disassociation');
+
+test(() => {
+  $('#container').innerHTML = '<form id="form1"></form>' +
+      '<pre-defined id="pd1"></pre-defined><form id="form2"></form>';
+  const pd1 = $('#pd1');
+  const form1 = $('#form1');
+  const form2 = $('#form2');
+  assert_equals(pd1.form, null);
+
+  pd1.setAttribute('form', 'form1');
+  assert_equals(pd1.form, form1);
+
+  pd1.setAttribute('form', 'form2');
+  assert_equals(pd1.form, form2);
+
+  $('#container').innerHTML = '';
+  assert_equals(pd1.form, null);
+}, 'Updating "form" content attribute');
 </script>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
index e8f5541..0f6acee 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
@@ -104495,6 +104495,102 @@
      {}
     ]
    ],
+   "svg/painting/marker-001.svg": [
+    [
+     "/svg/painting/marker-001.svg",
+     [
+      [
+       "/svg/painting/marker-001-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "svg/painting/marker-002.svg": [
+    [
+     "/svg/painting/marker-002.svg",
+     [
+      [
+       "/svg/painting/marker-002-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "svg/painting/marker-003.svg": [
+    [
+     "/svg/painting/marker-003.svg",
+     [
+      [
+       "/svg/painting/marker-003-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "svg/painting/marker-004.svg": [
+    [
+     "/svg/painting/marker-004.svg",
+     [
+      [
+       "/svg/painting/marker-004-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "svg/painting/marker-005.svg": [
+    [
+     "/svg/painting/marker-005.svg",
+     [
+      [
+       "/svg/painting/marker-005-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "svg/painting/marker-006.svg": [
+    [
+     "/svg/painting/marker-006.svg",
+     [
+      [
+       "/svg/painting/marker-006-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "svg/painting/marker-007.svg": [
+    [
+     "/svg/painting/marker-007.svg",
+     [
+      [
+       "/svg/painting/marker-007-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "svg/painting/marker-008.svg": [
+    [
+     "/svg/painting/marker-008.svg",
+     [
+      [
+       "/svg/painting/marker-008-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "svg/painting/reftests/markers-orient-001.svg": [
     [
      "/svg/painting/reftests/markers-orient-001.svg",
@@ -148599,11 +148695,6 @@
      {}
     ]
    ],
-   "css/geometry/interfaces.worker-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "css/geometry/support/dommatrix-test-util.js": [
     [
      {}
@@ -180779,6 +180870,46 @@
      {}
     ]
    ],
+   "svg/painting/marker-001-ref.svg": [
+    [
+     {}
+    ]
+   ],
+   "svg/painting/marker-002-ref.svg": [
+    [
+     {}
+    ]
+   ],
+   "svg/painting/marker-003-ref.svg": [
+    [
+     {}
+    ]
+   ],
+   "svg/painting/marker-004-ref.svg": [
+    [
+     {}
+    ]
+   ],
+   "svg/painting/marker-005-ref.svg": [
+    [
+     {}
+    ]
+   ],
+   "svg/painting/marker-006-ref.svg": [
+    [
+     {}
+    ]
+   ],
+   "svg/painting/marker-007-ref.svg": [
+    [
+     {}
+    ]
+   ],
+   "svg/painting/marker-008-ref.svg": [
+    [
+     {}
+    ]
+   ],
    "svg/painting/parsing/fill-opacity-valid-expected.txt": [
     [
      {}
@@ -193447,6 +193578,26 @@
      }
     ]
    ],
+   "IndexedDB/idb-explicit-commit-throw.any.js": [
+    [
+     "/IndexedDB/idb-explicit-commit-throw.any.html",
+     {}
+    ],
+    [
+     "/IndexedDB/idb-explicit-commit-throw.any.worker.html",
+     {}
+    ]
+   ],
+   "IndexedDB/idb-explicit-commit.any.js": [
+    [
+     "/IndexedDB/idb-explicit-commit.any.html",
+     {}
+    ],
+    [
+     "/IndexedDB/idb-explicit-commit.any.worker.html",
+     {}
+    ]
+   ],
    "IndexedDB/idb_binary_key_conversion.htm": [
     [
      "/IndexedDB/idb_binary_key_conversion.htm",
@@ -212391,6 +212542,12 @@
      {}
     ]
    ],
+   "css/css-variables/variable-exponential-blowup.html": [
+    [
+     "/css/css-variables/variable-exponential-blowup.html",
+     {}
+    ]
+   ],
    "css/css-variables/variable-first-letter.html": [
     [
      "/css/css-variables/variable-first-letter.html",
@@ -295864,6 +296021,14 @@
    "36b7863fe05d72a1a3e1ba9bb3fc803838409065",
    "testharness"
   ],
+  "IndexedDB/idb-explicit-commit-throw.any.js": [
+   "3b8d148d76c1e9cd59486b4b612bfc7641023c37",
+   "testharness"
+  ],
+  "IndexedDB/idb-explicit-commit.any.js": [
+   "b2dec751b1a8f1e82fce2db965b78f26d416073e",
+   "testharness"
+  ],
   "IndexedDB/idb_binary_key_conversion.htm": [
    "b55e6324b349987750816d49efb9eb908a845724",
    "testharness"
@@ -297161,11 +297326,11 @@
    "testharness"
   ],
   "IndexedDB/support-promises.js": [
-   "433af5092701d617e2964f7d1ea3ea089b50c441",
+   "8195be341e18860865c072bc78a1efa1f25f2d56",
    "support"
   ],
   "IndexedDB/support.js": [
-   "5edbdacbcc7d0cf27d0e3330198b55d50540345e",
+   "d3b2bb7d1212dd6de0379bf2dce0b23e45f7c7cb",
    "support"
   ],
   "IndexedDB/transaction-abort-generator-revert.html": [
@@ -364440,6 +364605,10 @@
    "037aa314dab4644acd684e845488bb77e88ba69a",
    "testharness"
   ],
+  "css/css-variables/variable-exponential-blowup.html": [
+   "513a6f1628f17d31211b75ce4351b7dc95523a87",
+   "testharness"
+  ],
   "css/css-variables/variable-first-letter.html": [
    "da6daba42f6d3bd2297ea7e0e5dfe9365c4090c9",
    "testharness"
@@ -372709,11 +372878,11 @@
    "testharness"
   ],
   "css/geometry/DOMMatrix-002.html": [
-   "d5f1137a413ce747f40792b06504255d151bd97b",
+   "2b39cce9adc0b83dfd8603355ddbf01504718d04",
    "testharness"
   ],
   "css/geometry/DOMMatrix-003.html": [
-   "9b77f1966d6fb7d668bb907576781c8be60ac8fa",
+   "d363b504bd5dd404612914afccc881774d5c63d0",
    "testharness"
   ],
   "css/geometry/DOMMatrix-a-f-alias.html": [
@@ -372793,21 +372962,17 @@
    "testharness"
   ],
   "css/geometry/historical.html": [
-   "4f8e65e98e5748498e7ac4c01c63afe5e08a29a5",
+   "ddc3c777a0133b7e8153afbf821ff48d2b0a01fd",
    "testharness"
   ],
   "css/geometry/interfaces-expected.txt": [
-   "7d541df556bca68d4a9e4ff8763699d4b3bcb3ab",
+   "9b73550b32d8e2a205c845edb04bbdfb42a32145",
    "support"
   ],
   "css/geometry/interfaces.html": [
    "b120700373076fb7ef818e22e7c12fefeff7bee5",
    "testharness"
   ],
-  "css/geometry/interfaces.worker-expected.txt": [
-   "6b1223ee6a1d1ddea27aabfb2405db74432471ff",
-   "support"
-  ],
   "css/geometry/interfaces.worker.js": [
    "fad617b2e02f65b8ac80b0445018697d0c7667ba",
    "testharness"
@@ -409033,7 +409198,7 @@
    "support"
   ],
   "interfaces/screen-capture.idl": [
-   "f00660bd904e8ad3fcdf0fa9cf66c49e5d918767",
+   "612480cb080dfa3052186558732cc4ec1768f036",
    "support"
   ],
   "interfaces/screen-orientation.idl": [
@@ -434641,11 +434806,11 @@
    "testharness"
   ],
   "service-workers/service-worker/navigation-redirect.https-expected.txt": [
-   "28a5b788ef706a80cdd40b4bc4aeece347dadbc1",
+   "110c6c294b0f497fa35dfa39c381a3fecb83a6d3",
    "support"
   ],
   "service-workers/service-worker/navigation-redirect.https.html": [
-   "e8b8e9afd5820acf9422d11f4410c0158fa31732",
+   "d7d3d5259a454d923d1e89004fcf55ce7e2e6bda",
    "testharness"
   ],
   "service-workers/service-worker/navigation-timing.https.html": [
@@ -438148,6 +438313,70 @@
    "4499b9249a84a9d7de4a5a101993ad14f9cc21c9",
    "testharness"
   ],
+  "svg/painting/marker-001-ref.svg": [
+   "09bc3b7f77cf6a633d48f26df5968f1f799db3ea",
+   "support"
+  ],
+  "svg/painting/marker-001.svg": [
+   "dbcfd5b43206e030860a8f53af4a54fac40622be",
+   "reftest"
+  ],
+  "svg/painting/marker-002-ref.svg": [
+   "1b1446ce1132e1ba8a751f122cc5b530ed1c0dce",
+   "support"
+  ],
+  "svg/painting/marker-002.svg": [
+   "790edd1cabac6d6dcb0085c1e508aa763443be5f",
+   "reftest"
+  ],
+  "svg/painting/marker-003-ref.svg": [
+   "a9cdc59cf3805a4b47330bcd09bd5244632bcd07",
+   "support"
+  ],
+  "svg/painting/marker-003.svg": [
+   "b4bebec5879831fc4fb756742f25b1ca382e9826",
+   "reftest"
+  ],
+  "svg/painting/marker-004-ref.svg": [
+   "aaad02c732f16272a32c96bca8b1a696952c9857",
+   "support"
+  ],
+  "svg/painting/marker-004.svg": [
+   "7f106961db833ce922e1adad57e1e1d8da50fdcc",
+   "reftest"
+  ],
+  "svg/painting/marker-005-ref.svg": [
+   "6e4ae279540ed46cdfc18a57e1f453fa11185e8b",
+   "support"
+  ],
+  "svg/painting/marker-005.svg": [
+   "640b3545deb4ba62fbebfc32dbea1a0e41db57ee",
+   "reftest"
+  ],
+  "svg/painting/marker-006-ref.svg": [
+   "09bc3b7f77cf6a633d48f26df5968f1f799db3ea",
+   "support"
+  ],
+  "svg/painting/marker-006.svg": [
+   "61af077f29f206415e0fa1af9f66534a515bbe6d",
+   "reftest"
+  ],
+  "svg/painting/marker-007-ref.svg": [
+   "be4df3a410ec6151a96ada360236539cd594f878",
+   "support"
+  ],
+  "svg/painting/marker-007.svg": [
+   "c7812203787a02db8f8e8ae005b4be54605dbf7e",
+   "reftest"
+  ],
+  "svg/painting/marker-008-ref.svg": [
+   "b4f329b3bc292327db841ccec1f94cfa344333d9",
+   "support"
+  ],
+  "svg/painting/marker-008.svg": [
+   "47f70336a6f6774805c08c99f37e8ee7c32ecc10",
+   "reftest"
+  ],
   "svg/painting/parsing/color-interpolation-invalid.svg": [
    "11fd05be070350c13fabbc3f2627ae80a381f389",
    "testharness"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-variables/variable-exponential-blowup.html b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-exponential-blowup.html
new file mode 100644
index 0000000..513a6f16
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-variables/variable-exponential-blowup.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<title>CSS Variables Test: Exponential blowup doesn't crash</title>
+<meta charset="UTF-8">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<link rel="help" href="https://drafts.csswg.org/css-variables/">
+<script>
+  let css = `
+    --v0: "Something really really really long";
+  `;
+  for (let i = 0; i < 30; ++i)
+    css += `--v${i + 1}: var(--v${i}), var(--v${i});`;
+  let s = document.createElement("style");
+  s.innerHTML = `
+    :root { ${css}; }
+    :root::before { content: var(--v31); }
+  `;
+  document.head.appendChild(s);
+</script>
+PASS if doesn't crash
+<script>
+  test(function() {
+    getComputedStyle(document.documentElement, "::before").content;
+    assert_true(true, "Didn't crash");
+  });
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/response/response-clone-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/response/response-clone-expected.txt
index 488000c5..6488f2d6 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/api/response/response-clone-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/fetch/api/response/response-clone-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-FAIL Check Response's clone with default values, without body assert_equals: Expect default response.statusText is  expected "" but got "OK"
+PASS Check Response's clone with default values, without body
 PASS Check Response's clone has the expected attribute values
 PASS Check orginal response's body after cloning
 PASS Check cloned response's body
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/response/response-init-001-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/api/response/response-init-001-expected.txt
deleted file mode 100644
index 07ed8a6..0000000
--- a/third_party/blink/web_tests/external/wpt/fetch/api/response/response-init-001-expected.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-This is a testharness.js-based test.
-PASS Check default value for type attribute
-PASS Check default value for url attribute
-PASS Check default value for ok attribute
-PASS Check default value for status attribute
-FAIL Check default value for statusText attribute assert_equals: Expect default response.statusText is  expected "" but got "OK"
-PASS Check default value for body attribute
-PASS Check status init values and associated getter
-PASS Check statusText init values and associated getter
-PASS Test that Response.headers has the [SameObject] extended attribute
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/screen-capture.idl b/third_party/blink/web_tests/external/wpt/interfaces/screen-capture.idl
index f00660bd..612480c 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/screen-capture.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/screen-capture.idl
@@ -4,7 +4,12 @@
 // Source: Screen Capture (https://w3c.github.io/mediacapture-screen-share/)
 
 partial interface MediaDevices {
-    Promise<MediaStream> getDisplayMedia(optional MediaStreamConstraints constraints);
+    Promise<MediaStream> getDisplayMedia(optional DisplayMediaStreamConstraints constraints);
+};
+
+dictionary DisplayMediaStreamConstraints {
+    (boolean or MediaTrackConstraints) video = true;
+    (boolean or MediaTrackConstraints) audio = false;
 };
 
 partial dictionary MediaTrackSupportedConstraints {
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/navigation-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/navigation-redirect.https-expected.txt
index 28a5b78..110c6c2 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/navigation-redirect.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/navigation-redirect.https-expected.txt
@@ -24,6 +24,7 @@
 PASS SW-fetched redirect to same-origin other-scope.
 PASS SW-fetched redirect to other-origin out-scope.
 PASS SW-fetched redirect to other-origin in-scope.
+PASS SW-fetched response from different URL, same-origin same-scope.
 PASS Redirect to same-origin out-scope with opaque redirect response.
 PASS Redirect to same-origin same-scope with opaque redirect response.
 PASS Redirect to same-origin other-scope with opaque redirect response.
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/navigation-redirect.https.html b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/navigation-redirect.https.html
index e8b8e9a..d7d3d52 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/navigation-redirect.https.html
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/navigation-redirect.https.html
@@ -668,6 +668,24 @@
     'SW-fetched redirect to other-origin in-scope.');
 
 
+// SW responds with a fetch from a different url.
+// SW: event.respondWith(fetch(params['url']));
+url2 = SCOPE1;
+url1 = SCOPE1 + 'sw=fetch-url&url=' + encodeURIComponent(url2);
+redirect_test(
+    url1,
+    url1,
+    [
+      [
+        {url: url1, resultingClientIdTag: 'x'}
+      ],
+      [],
+      []
+    ],
+    'x',
+    'SW-fetched response from different URL, same-origin same-scope.');
+
+
 // Opaque redirect.
 // SW: event.respondWith(fetch(
 //         new Request(event.request.url, {redirect: 'manual'})));
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-001-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-001-ref.svg
new file mode 100644
index 0000000..09bc3b7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-001-ref.svg
@@ -0,0 +1,37 @@
+<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg">
+  <text x="10" y="30" font-size="14">Basic Markers</text>
+  <path fill="none" stroke="black" stroke-width="16" d="M 130 40 L 180 40 L 180 90"/>
+  <g transform="translate(114,24)">
+    <rect width="32" height="32" fill="purple" stroke="none"/>
+  </g>
+  <g transform="translate(164,24)">
+    <rect width="32" height="32" fill="purple" stroke="none"/>
+  </g>
+  <g transform="translate(164,74)">
+    <rect width="32" height="32" fill="purple" stroke="none"/>
+  </g>
+
+  <text x="10" y="115" font-size="14">Start, Middle and End</text>
+  <path fill="none" stroke="black" stroke-width="16" d="M 130 135 L 180 135 L 180 185"/>
+  <g transform="translate(114,119)">
+    <rect width="32" height="32" fill="purple" stroke="none"/>
+  </g>
+  <g transform="translate(180,135)">
+    <circle r="16" fill="green" stroke="none"/>
+  </g>
+  <g transform="translate(164,169)">
+    <path d="M 16 0 L 32 32 L 0 32 Z" fill="blue" stroke="none"/>
+  </g>
+
+  <text x="10" y="210" font-size="14">Automatic Orientation</text>
+  <path fill="none" stroke="black" stroke-width="16" d="M 130 230 L 180 230 L 180 280"/>
+  <g transform="translate(130,230) rotate(0)">
+    <path d="M 0 -16 L 16 16 L -16 16 Z" fill="blue" stroke="none"/>
+  </g>
+  <g transform="translate(180,230) rotate(45)">
+    <path d="M 0 -16 L 16 16 L -16 16 Z" fill="blue" stroke="none"/>
+  </g>
+  <g transform="translate(180,280) rotate(90)">
+    <path d="M 0 -16 L 16 16 L -16 16 Z" fill="blue" stroke="none"/>
+  </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-001.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-001.svg
new file mode 100644
index 0000000..dbcfd5b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-001.svg
@@ -0,0 +1,55 @@
+<svg width="300" height="300"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+    Tests the basic support for markers.
+
+    The top test examines the basic support for the marker element and style. The
+    markers are purple rectangles.
+
+    The middle test examines the support for the different styles of marker
+    properties. The "marker-start" property defines the marker to use at the first
+    vertex of the marked path, in this case a purple rectangle. The "marker-end"
+    property defines the marker to use at the last vertex of the marked path, in
+    this case a blue triangle. The "marker-mid" property defines the marker to use
+    at all vertices, other than the first and last, of the marked path, in this
+    case a green circle.
+
+    The bottom test examines the support for marker orientation along the path
+    direction. The second vertex, the top right corner of the path, has a marker
+    that is rotated 45 degrees, since that is the average of the horizontal and
+    vertical segments each side. The last vertex, the bottom right corner of the
+    path, has a marker rotated 90 degrees since that is the direction of the last
+    path segment.
+    -->
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#Markers"/>
+    <html:link rel="match" href="marker-001-ref.svg"/>
+    <html:meta name="assert" content="Tests the basic support for markers."/>
+    <defs>
+      <!-- Define a few simple marker elements -->
+      <marker id="marker1" refX="1" refY="1" overflow="visible" >
+        <rect width="2" height="2" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="marker2" orient="auto" refX="1" refY="1" overflow="visible">
+        <path d="M 1 0 L 2 2 L 0 2 Z" fill="blue" stroke="none"/>
+      </marker>
+      <marker id="markerStart" refX="1" refY="1" overflow="visible">
+        <rect width="2" height="2" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="markerMiddle" overflow="visible">
+        <circle cx="0" cy="0" r="1" fill="green" stroke="none"/>
+      </marker>
+      <marker id="markerEnd" refX="1" refY="1" overflow="visible">
+        <path d="M 1 0 L 2 2 L 0 2 Z" fill="blue" stroke="none"/>
+      </marker>
+    </defs>
+    <!-- Basic Marker Test -->
+    <text x="10" y="30" font-size="14">Basic Markers</text>
+    <path fill="none" stroke="black" stroke-width="16" marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 130 40 L 180 40 L 180 90"/>
+    <!-- Start, Middle and End Marker Test -->
+    <text x="10" y="115" font-size="14">Start, Middle and End</text>
+    <path fill="none" stroke="black" stroke-width="16" marker-start="url(#markerStart)" marker-mid="url(#markerMiddle)" marker-end="url(#markerEnd)" d="M 130 135 L 180 135 L 180 185"/>
+    <!-- Auto Orientation Marker Test -->
+    <text x="10" y="210" font-size="14">Automatic Orientation</text>
+    <path fill="none" stroke="black" stroke-width="16" marker-start="url(#marker2)" marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 130 230 L 180 230 L 180 280"/>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-002-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-002-ref.svg
new file mode 100644
index 0000000..1b1446ce
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-002-ref.svg
@@ -0,0 +1,43 @@
+<svg width="500" height="500"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <g>
+      <text x="125" y="30" font-size="14" fill="black">Marker Rendering Properties</text>
+      <!-- Fill property -->
+      <g>
+        <marker id="marker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+          <rect width="10" height="10" fill="black" stroke="none" stroke-width="8"/>
+        </marker>
+        <text x="100" y="140" font-size="10" fill="black" stroke="none">Fill Property</text>
+        <path marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 30 60 L 80 60 L 80 110 Z"
+            fill="black" stroke="none" stroke-width="8"/>
+      </g>
+      <!-- Stroke property -->
+      <g>
+        <marker id="marker2" viewBox="0 0 20 20" markerWidth="4" markerHeight="4" refX="10" refY="10" markerUnits="strokeWidth">
+          <rect width="20" height="20" fill="none" stroke="black" stroke-width="4"/>
+        </marker>
+        <text x="340" y="140" font-size="10" fill="black" stroke="none">Stroke Property</text>
+        <path marker-start="url(#marker2)" marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 270 60 L 320 60 L 320 110 Z"
+            fill="none" stroke="black" stroke-width="4"/>
+      </g>
+      <!-- Define marker element with parents setting painting properties -->
+      <g>
+        <marker id="marker3" viewBox="0 0 20 20" markerWidth="4" markerHeight="4" refX="10" refY="10" markerUnits="strokeWidth">
+          <rect width="20" height="20" stroke="black" fill="green" stroke-width="8"/>
+        </marker>
+        <marker id="marker4" viewBox="0 0 10 10" markerWidth="4" markerHeight="4" refX="5" refY="5" markerUnits="strokeWidth">
+          <rect width="10" height="10" fill="black" stroke-width="4" stroke="blue"/>
+        </marker>
+      </g>
+      <!-- Parent and specified properties -->
+      <g>
+        <text x="90" y="270" font-size="10" fill="black" stroke="none">Mixed Properties</text>
+        <path stroke="purple" stroke-width="4" marker-start="url(#marker3)" marker-mid="url(#marker3)" marker-end="url(#marker3)" d="M 30 190 L 80 190 L 80 240 Z" fill="orange"/>
+      </g>
+      <g>
+        <text x="340" y="270" font-size="10" fill="black" stroke="none">Mixed Properties</text>
+        <path stroke="purple" stroke-width="4" marker-start="url(#marker4)" marker-mid="url(#marker4)" marker-end="url(#marker4)" d="M 270 190 L 320 190 L 320 240 Z" fill="orange"/>
+      </g>
+    </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-002.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-002.svg
new file mode 100644
index 0000000..790edd1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-002.svg
@@ -0,0 +1,67 @@
+<svg width="500" height="500"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+    Tests the rendering of markers, specifically property inheritance. For the four
+    tests, there should be two identical paths with markers drawn.
+
+    The top two tests examine the rendering of markers when the marker and the path
+    referencing it share the same parent and all painting properties are specfied
+    on that parent. The first test show inheritance of the 'fill' property and the
+    second the inheritance of the 'paint' property. In both tests, the marker is
+    painting using the same properties as the referencing object. Because of
+    scaling transformations on the marker, the stroke on the second test is thinner
+    than on the referencing object.
+
+    The third and fourth tests examine the rendering of markers in a situation
+    where the marker and referencing path do NOT share the same parent and painting
+    properties are specified both on the parent of the marked path and on the
+    contents of the marker itself. In both cases, the marker's parent specifies
+    fill="green" stroke="blue" stroke-width="8". For the third test, the marker
+    contents override with stroke="black". For the fourth test, the marker contents
+    override with fill="black". In neither case should you see fill="orange" or
+    stroke="blue" or "stroke="purple" on the markers as these properties are
+    specified on the ancestor of the referencing object or the referencing object
+    itself and thus shouldn't affect the marker.
+    -->
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#Markers"/>
+    <html:link rel="match" href="marker-002-ref.svg"/>
+    <html:meta name="assert" content="Tests property inheritance when rendering markers."/>
+    <g fill="green">
+      <text x="125" y="30" font-size="14" fill="black">Marker Rendering Properties</text>
+      <!-- Fill property -->
+      <g fill="black" stroke="none" stroke-width="8">
+        <marker id="marker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+          <rect width="10" height="10"/>
+        </marker>
+        <text x="100" y="140" font-size="10" fill="black" stroke="none">Fill Property</text>
+        <path marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 30 60 L 80 60 L 80 110 Z"/>
+      </g>
+      <!-- Stroke property -->
+      <g fill="none" stroke="black" stroke-width="4">
+        <marker id="marker2" viewBox="0 0 20 20" markerWidth="4" markerHeight="4" refX="10" refY="10" markerUnits="strokeWidth">
+          <rect width="20" height="20"/>
+        </marker>
+        <text x="340" y="140" font-size="10" fill="black" stroke="none">Stroke Property</text>
+        <path marker-start="url(#marker2)" marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 270 60 L 320 60 L 320 110 Z"/>
+      </g>
+      <!-- Define marker element with parents setting painting properties -->
+      <g fill="green" stroke="blue" stroke-width="8">
+        <marker id="marker3" viewBox="0 0 20 20" markerWidth="4" markerHeight="4" refX="10" refY="10" markerUnits="strokeWidth">
+          <rect width="20" height="20" stroke="black"/>
+        </marker>
+        <marker id="marker4" viewBox="0 0 10 10" markerWidth="4" markerHeight="4" refX="5" refY="5" markerUnits="strokeWidth">
+          <rect width="10" height="10" fill="black" stroke-width="4"/>
+        </marker>
+      </g>
+      <!-- Parent and specified properties -->
+      <g fill="orange" stroke="blue">
+        <text x="90" y="270" font-size="10" fill="black" stroke="none">Mixed Properties</text>
+        <path stroke="purple" stroke-width="4" marker-start="url(#marker3)" marker-mid="url(#marker3)" marker-end="url(#marker3)" d="M 30 190 L 80 190 L 80 240 Z"/>
+      </g>
+      <g fill="orange" stroke="green">
+        <text x="340" y="270" font-size="10" fill="black" stroke="none">Mixed Properties</text>
+        <path stroke="purple" stroke-width="4" marker-start="url(#marker4)" marker-mid="url(#marker4)" marker-end="url(#marker4)" d="M 270 190 L 320 190 L 320 240 Z"/>
+      </g>
+    </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-003-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-003-ref.svg
new file mode 100644
index 0000000..a9cdc59
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-003-ref.svg
@@ -0,0 +1,19 @@
+<svg width="500" height="500"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <defs>
+      <marker id="marker1" markerUnits="strokeWidth" refX="50" refY="50" markerWidth="5" markerHeight="5" viewBox="0 0 100 100">
+        <rect width="100" height="100" fill="royalblue" stroke="none"/>
+      </marker>
+    </defs>
+
+    <text font-size="20" x="240" y="28" text-anchor="middle">'marker' property test</text>
+    <g fill="gold" stroke="black" fill-rule="evenodd" transform="translate(50,20)"
+        marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)">
+      <path d="M10,60 Q90,60 90,140 Q10,140 10,60 Z M10,140 Q10,60 90,60 Q90,140 10,140 Z M50,70 L80,100 50,130 20,100 Z"/>
+      <polygon points="100,60 120,140 140,60 160,140 180,60 180,100 100,100"/>
+      <polyline points="190,60 210,140 230,60 250,140 270,60 270,100 190,100"/>
+      <line x1="280" x2="370" y1="60" y2="140"/>
+      <line x1="370" x2="280" y1="60" y2="140"/>
+    </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-003.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-003.svg
new file mode 100644
index 0000000..b4bebec
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-003.svg
@@ -0,0 +1,29 @@
+<svg width="500" height="500"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+    The SVG specification defines three properties to reference markers: marker-start, marker-mid,
+    marker-end. It also provides a shorthand property,marker.  Using the marker property from a style sheet
+    is equivalent to using all three (start, mid, end). However, shorthand properties cannot be used as presentation attributes.
+    -->
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#Markers"/>
+    <html:link rel="match" href="marker-003-ref.svg"/>
+    <html:meta name="assert" content="Tests marker property."/>
+    <defs>
+      <marker id="marker1" markerUnits="strokeWidth" refX="50" refY="50" markerWidth="5" markerHeight="5" viewBox="0 0 100 100">
+        <rect width="100" height="100" fill="royalblue" stroke="none"/>
+      </marker>
+      <style type="text/css">
+        #markme { marker: url(#marker1) }
+      </style>
+    </defs>
+
+    <text font-size="20" x="240" y="28" text-anchor="middle">'marker' property test</text>
+    <g fill="gold" stroke="black" fill-rule="evenodd" transform="translate(50,20)" id="markme">
+      <path d="M10,60 Q90,60 90,140 Q10,140 10,60 Z M10,140 Q10,60 90,60 Q90,140 10,140 Z M50,70 L80,100 50,130 20,100 Z"/>
+      <polygon points="100,60 120,140 140,60 160,140 180,60 180,100 100,100"/>
+      <polyline points="190,60 210,140 230,60 250,140 270,60 270,100 190,100"/>
+      <line x1="280" x2="370" y1="60" y2="140"/>
+      <line x1="370" x2="280" y1="60" y2="140"/>
+    </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-004-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-004-ref.svg
new file mode 100644
index 0000000..aaad02c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-004-ref.svg
@@ -0,0 +1,10 @@
+<svg width="100%" height="100%" viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg">
+    <text font-size="20" x="240" y="28" text-anchor="middle">'marker' attribute test</text>
+    <g fill="gold" stroke="black" fill-rule="evenodd" transform="translate(50,20)">
+      <path d="M10,60 Q90,60 90,140 Q10,140 10,60 Z M10,140 Q10,60 90,60 Q90,140 10,140 Z M50,70 L80,100 50,130 20,100 Z"/>
+      <polygon points="100,60 120,140 140,60 160,140 180,60 180,100 100,100"/>
+      <polyline points="190,60 210,140 230,60 250,140 270,60 270,100 190,100"/>
+      <line x1="280" x2="370" y1="60" y2="140"/>
+      <line x1="370" x2="280" y1="60" y2="140"/>
+    </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-004.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-004.svg
new file mode 100644
index 0000000..7f106961d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-004.svg
@@ -0,0 +1,27 @@
+<svg width="100%" height="100%" viewBox="0 0 480 360"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+    The SVG specification defines three properties to reference markers: marker-start, marker-mid,
+    marker-end. It also provides a shorthand property,marker.  Using the marker property from a style sheet
+    is equivalent to using all three (start, mid, end). However, shorthand properties cannot be used as presentation attributes.
+    -->
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#Markers"/>
+    <html:link rel="match" href="marker-004-ref.svg"/>
+    <html:meta name="assert" content="Tests marker property."/>
+    <defs>
+      <marker id="marker2" markerUnits="strokeWidth" refX="100" refY="100" markerWidth="15" markerHeight="15" viewBox="0 0 200 200">
+        <rect width="200" height="200" fill="red" stroke="none"/>
+      </marker>
+    </defs>
+
+    <text font-size="20" x="240" y="28" text-anchor="middle">'marker' attribute test</text>
+    <!-- There is no marker attribute so no markers should be applied. -->
+    <g marker="url(#marker2)" fill="gold" stroke="black" fill-rule="evenodd" transform="translate(50,20)">
+      <path d="M10,60 Q90,60 90,140 Q10,140 10,60 Z M10,140 Q10,60 90,60 Q90,140 10,140 Z M50,70 L80,100 50,130 20,100 Z"/>
+      <polygon points="100,60 120,140 140,60 160,140 180,60 180,100 100,100"/>
+      <polyline points="190,60 210,140 230,60 250,140 270,60 270,100 190,100"/>
+      <line x1="280" x2="370" y1="60" y2="140"/>
+      <line x1="370" x2="280" y1="60" y2="140"/>
+    </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-005-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-005-ref.svg
new file mode 100644
index 0000000..6e4ae27
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-005-ref.svg
@@ -0,0 +1,192 @@
+<svg width="500" height="500"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+        Verify result of overflow using explicit clip boxes.
+        Dimensions of shapes in markers are different than in the test so that
+        the ref will be different to the test when neither overflow nor
+        clip-path are implemented.
+    -->
+    <defs>
+      <clipPath id="viewBox10x10Clip">
+        <rect width="10" height="10"/>
+      </clipPath>
+      <clipPath id="viewBox8x8Clip">
+        <rect width="8" height="8"/>
+      </clipPath>
+      <marker id="marker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="100" height="100" fill="purple" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="marker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="markerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="100" height="100" fill="purple" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="markerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="visible">
+        <circle cx="4" cy="4" r="80" fill="green" stroke="none" clip-path="url(#viewBox8x8Clip)"/>
+      </marker>
+      <marker id="markerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+
+      <marker id="vmarker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="vmarker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+      <marker id="vmarkerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="vmarkerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="visible">
+        <circle cx="4" cy="4" r="8" fill="green" stroke="none"/>
+      </marker>
+      <marker id="vmarkerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+
+      <marker id="amarker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="amarker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+      <marker id="amarkerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+        <rect width="100" height="100" fill="purple" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="amarkerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="visible">
+        <circle cx="4" cy="4" r="8" fill="green" stroke="none"/>
+      </marker>
+      <marker id="amarkerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+
+      <marker id="smarker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="100" height="100" fill="purple" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="smarker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="smarkerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="100" height="100" fill="purple" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="smarkerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="visible">
+        <circle cx="4" cy="4" r="80" fill="green" stroke="none" clip-path="url(#viewBox8x8Clip)"/>
+      </marker>
+      <marker id="smarkerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+
+      <marker id="hmarker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="100" height="100" fill="purple" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="hmarker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="hmarkerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="100" height="100" fill="purple" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+      <marker id="hmarkerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="visible">
+        <circle cx="4" cy="4" r="80" fill="green" stroke="none" clip-path="url(#viewBox8x8Clip)"/>
+      </marker>
+      <marker id="hmarkerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none" clip-path="url(#viewBox10x10Clip)"/>
+      </marker>
+    </defs>
+
+    <style type="text/css">
+      .testpaths {
+          fill:none;
+          stroke:black;
+          stroke-width:8px;
+      }
+
+      /* no overflow specified */
+      #p1  { marker: url(#marker1); }
+      #p2  {
+          marker-start: url(#markerStart);
+          marker-mid:url(#markerMiddle);
+          marker-end: url(#markerEnd);
+      }
+      #p3  { marker: url(#marker2); }
+
+      /* overflow = visible */
+      #p4  { marker: url(#vmarker1); }
+      #p5  {
+          marker-start: url(#vmarkerStart);
+          marker-mid:url(#vmarkerMiddle);
+          marker-end: url(#vmarkerEnd);
+      }
+      #p6  { marker: url(#vmarker2); }
+
+      /* overflow = auto */
+      #p7  { marker: url(#amarker1); }
+      #p8  {
+          marker-start: url(#amarkerStart);
+          marker-mid:url(#amarkerMiddle);
+          marker-end: url(#amarkerEnd);
+      }
+      #p9  { marker: url(#amarker2); }
+
+      /* overflow = scroll */
+      #p10  { marker: url(#smarker1); }
+      #p11  {
+          marker-start: url(#smarkerStart);
+          marker-mid:url(#smarkerMiddle);
+          marker-end: url(#smarkerEnd);
+      }
+      #p12  { marker: url(#smarker2); }
+
+      /* overflow = hidden */
+      #p13  { marker: url(#hmarker1); }
+      #p14  {
+          marker-start: url(#hmarkerStart);
+          marker-mid:url(#hmarkerMiddle);
+          marker-end: url(#hmarkerEnd);
+      }
+      #p15  { marker: url(#hmarker2); }
+    </style>
+
+    <text x="50%" y="3em" style="font: 18px; text-anchor:middle;">Test marker overflow</text>
+
+    <g style="font: 14px; text-anchor:middle" transform="translate(0,280)">
+      <text x="60">default</text>
+      <text x="155">'visible'</text>
+      <text x="245">'auto'</text>
+      <text x="340">'scroll'</text>
+      <text x="430">'hidden'</text>
+    </g>
+
+    <g transform="translate(-30,75)">
+      <g id="subtest1" transform="scale(0.6)">
+        <path id="p1" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p2" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p3" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+
+      <g id="subtest2" transform="scale(0.6) translate(150,0)">
+        <path id="p4" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p5" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p6" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+      <g id="subtest3" transform="scale(0.6) translate(300,0)">
+        <path id="p7" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p8" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p9" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+
+      <g id="subtest4" transform="scale(0.6) translate(450,0)">
+        <path id="p10" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p11" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p12" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+
+      <g id="subtest5" transform="scale(0.6) translate(600,0)">
+        <path id="p13" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p14" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p15" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+    </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-005.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-005.svg
new file mode 100644
index 0000000..640b354
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-005.svg
@@ -0,0 +1,191 @@
+<svg width="500" height="500"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+    Test all the 'overflow' property values except 'inherit' on the 'marker' element.
+
+    Each column tests a value of the 'overflow' property.
+    The first row uses the 'marker' property to set the same marker on start-, mid- and end-points on the path.
+    The second row uses 'marker-start', 'marker-mid' and 'marker-end' to give each point its own marker.
+    The third row uses the 'marker' property like the first row, but here the marker has orient="auto" set.
+    -->
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#Markers"/>
+    <html:link rel="match" href="marker-005-ref.svg"/>
+    <html:meta name="assert" content="Test all the 'overflow' property values except 'inherit' on the 'marker' element."/>
+    <defs>
+      <marker id="marker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="marker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+      <marker id="markerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="markerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth">
+        <circle cx="4" cy="4" r="8" fill="green" stroke="none"/>
+      </marker>
+      <marker id="markerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+
+      <marker id="vmarker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="vmarker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+      <marker id="vmarkerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="visible">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="vmarkerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="visible">
+        <circle cx="4" cy="4" r="8" fill="green" stroke="none"/>
+      </marker>
+      <marker id="vmarkerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="visible">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+
+      <marker id="amarker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="auto">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="amarker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="auto">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+      <marker id="amarkerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="auto">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="amarkerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="auto">
+        <circle cx="4" cy="4" r="8" fill="green" stroke="none"/>
+      </marker>
+      <marker id="amarkerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="auto">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+
+      <marker id="smarker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="scroll">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="smarker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="scroll">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+      <marker id="smarkerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="scroll">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="smarkerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="scroll">
+        <circle cx="4" cy="4" r="8" fill="green" stroke="none"/>
+      </marker>
+      <marker id="smarkerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="scroll">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+
+      <marker id="hmarker1" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="hidden">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="hmarker2" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" orient="auto" overflow="hidden">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+      <marker id="hmarkerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="7.5" refY="7.5" markerUnits="strokeWidth" overflow="hidden">
+        <rect width="15" height="15" fill="purple" stroke="none"/>
+      </marker>
+      <marker id="hmarkerMiddle" viewBox="0 0 8 8" markerWidth="2" markerHeight="2" refX="4" refY="4" markerUnits="strokeWidth" overflow="hidden">
+        <circle cx="4" cy="4" r="8" fill="green" stroke="none"/>
+      </marker>
+      <marker id="hmarkerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="10" refY="10" markerUnits="strokeWidth" overflow="hidden">
+        <path d="M 10 0 L 20 20 L 0 20 Z" fill="blue" stroke="none"/>
+      </marker>
+    </defs>
+
+    <style type="text/css">
+      .testpaths {
+          fill:none;
+          stroke:black;
+          stroke-width:8px;
+      }
+
+      /* no overflow specified */
+      #p1  { marker: url(#marker1); }
+      #p2  {
+          marker-start: url(#markerStart);
+          marker-mid:url(#markerMiddle);
+          marker-end: url(#markerEnd);
+      }
+      #p3  { marker: url(#marker2); }
+
+      /* overflow = visible */
+      #p4  { marker: url(#vmarker1); }
+      #p5  {
+          marker-start: url(#vmarkerStart);
+          marker-mid:url(#vmarkerMiddle);
+          marker-end: url(#vmarkerEnd);
+      }
+      #p6  { marker: url(#vmarker2); }
+
+      /* overflow = auto */
+      #p7  { marker: url(#amarker1); }
+      #p8  {
+          marker-start: url(#amarkerStart);
+          marker-mid:url(#amarkerMiddle);
+          marker-end: url(#amarkerEnd);
+      }
+      #p9  { marker: url(#amarker2); }
+
+      /* overflow = scroll */
+      #p10  { marker: url(#smarker1); }
+      #p11  {
+          marker-start: url(#smarkerStart);
+          marker-mid:url(#smarkerMiddle);
+          marker-end: url(#smarkerEnd);
+      }
+      #p12  { marker: url(#smarker2); }
+
+      /* overflow = hidden */
+      #p13  { marker: url(#hmarker1); }
+      #p14  {
+          marker-start: url(#hmarkerStart);
+          marker-mid:url(#hmarkerMiddle);
+          marker-end: url(#hmarkerEnd);
+      }
+      #p15  { marker: url(#hmarker2); }
+    </style>
+
+    <text x="50%" y="3em" style="font: 18px; text-anchor:middle;">Test marker overflow</text>
+
+    <g style="font: 14px; text-anchor:middle" transform="translate(0,280)">
+      <text x="60">default</text>
+      <text x="155">'visible'</text>
+      <text x="245">'auto'</text>
+      <text x="340">'scroll'</text>
+      <text x="430">'hidden'</text>
+    </g>
+
+    <g transform="translate(-30,75)">
+      <g id="subtest1" transform="scale(0.6)">
+        <path id="p1" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p2" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p3" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+
+      <g id="subtest2" transform="scale(0.6) translate(150,0)">
+        <path id="p4" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p5" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p6" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+
+      <g id="subtest3" transform="scale(0.6) translate(300,0)">
+        <path id="p7" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p8" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p9" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+
+      <g id="subtest4" transform="scale(0.6) translate(450,0)">
+        <path id="p10" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p11" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p12" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+
+      <g id="subtest5" transform="scale(0.6) translate(600,0)">
+        <path id="p13" class="testpaths" d="M 130 40 L 180 40 L 180 90"/>
+        <path id="p14" class="testpaths" d="M 130 135 L 180 135 L 180 185"/>
+        <path id="p15" class="testpaths" d="M 130 230 L 180 230 L 180 280"/>
+      </g>
+    </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-006-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-006-ref.svg
new file mode 100644
index 0000000..09bc3b7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-006-ref.svg
@@ -0,0 +1,37 @@
+<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg">
+  <text x="10" y="30" font-size="14">Basic Markers</text>
+  <path fill="none" stroke="black" stroke-width="16" d="M 130 40 L 180 40 L 180 90"/>
+  <g transform="translate(114,24)">
+    <rect width="32" height="32" fill="purple" stroke="none"/>
+  </g>
+  <g transform="translate(164,24)">
+    <rect width="32" height="32" fill="purple" stroke="none"/>
+  </g>
+  <g transform="translate(164,74)">
+    <rect width="32" height="32" fill="purple" stroke="none"/>
+  </g>
+
+  <text x="10" y="115" font-size="14">Start, Middle and End</text>
+  <path fill="none" stroke="black" stroke-width="16" d="M 130 135 L 180 135 L 180 185"/>
+  <g transform="translate(114,119)">
+    <rect width="32" height="32" fill="purple" stroke="none"/>
+  </g>
+  <g transform="translate(180,135)">
+    <circle r="16" fill="green" stroke="none"/>
+  </g>
+  <g transform="translate(164,169)">
+    <path d="M 16 0 L 32 32 L 0 32 Z" fill="blue" stroke="none"/>
+  </g>
+
+  <text x="10" y="210" font-size="14">Automatic Orientation</text>
+  <path fill="none" stroke="black" stroke-width="16" d="M 130 230 L 180 230 L 180 280"/>
+  <g transform="translate(130,230) rotate(0)">
+    <path d="M 0 -16 L 16 16 L -16 16 Z" fill="blue" stroke="none"/>
+  </g>
+  <g transform="translate(180,230) rotate(45)">
+    <path d="M 0 -16 L 16 16 L -16 16 Z" fill="blue" stroke="none"/>
+  </g>
+  <g transform="translate(180,280) rotate(90)">
+    <path d="M 0 -16 L 16 16 L -16 16 Z" fill="blue" stroke="none"/>
+  </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-006.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-006.svg
new file mode 100644
index 0000000..61af077
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-006.svg
@@ -0,0 +1,61 @@
+<svg width="300" height="300"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+    Tests the basic support for markers. For the three tests, there should be two
+    identical paths with markers drawn. The path on the left is rendered using the
+    marker elements. The path on the right is rendered using the equivalent SVG,
+    showing what the marked path should look like.
+
+    This test is similar to the marker-001.svg test, but has some viewBox
+    attributes that have a non-zero offset.
+
+    The top test examines the basic support for the marker element and style. The
+    markers are purple rectangles.
+
+    The middle test examines the support for the different styles of marker
+    properties. The "marker-start" property defines the marker to use at the first
+    vertex of the marked path, in this case a purple rectangle. The "marker-end"
+    property defines the marker to use at the last vertex of the marked path, in
+    this case a blue triangle. The "marker-mid" property defines the marker to use
+    at all vertices, other than the first and last, of the marked path, in this
+    case a green circle.
+
+    The bottom test examines the support for marker orientation along the path
+    direction. The second vertex, the top right corner of the path, has a marker
+    that is rotated 45 degrees, since that is the average of the horizontal and
+    vertical segments each side. The last vertex, the bottom right corner of the
+    path, has a marker rotated 90 degrees since that is the direction of the last
+    path segment.
+    -->
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#Markers"/>
+    <html:link rel="match" href="marker-006-ref.svg"/>
+    <html:meta name="assert" content="Support for marker viewBox."/>
+    <defs>
+        <!-- Define a few simple marker elements -->
+        <marker id="marker1" viewBox="20 20 10 10" markerWidth="2" markerHeight="2" refX="25" refY="25" markerUnits="strokeWidth">
+            <rect x="20" y="20" width="10" height="10" fill="purple" stroke="none"/>
+        </marker>
+        <marker id="marker2" viewBox="-5 -5 10 10" markerWidth="2" markerHeight="2" markerUnits="strokeWidth" orient="auto">
+            <path d="M 0 -5 L 5 5 L -5 5 Z" fill="blue" stroke="none"/>
+        </marker>
+        <marker id="markerStart" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+            <rect width="10" height="10" fill="purple" stroke="none"/>
+        </marker>
+        <marker id="markerMiddle" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+            <circle cx="5" cy="5" r="5" fill="green" stroke="none"/>
+        </marker>
+        <marker id="markerEnd" viewBox="0 0 10 10" markerWidth="2" markerHeight="2" refX="5" refY="5" markerUnits="strokeWidth">
+            <path d="M 5 0 L 10 10 L 0 10 Z" fill="blue" stroke="none"/>
+        </marker>
+    </defs>
+    <!-- Basic Marker Test -->
+    <text x="10" y="30" font-size="14">Basic Markers</text>
+    <path fill="none" stroke="black" stroke-width="16" marker-start="url(#marker1)" marker-mid="url(#marker1)" marker-end="url(#marker1)" d="M 130 40 L 180 40 L 180 90"/>
+    <!-- Start, Middle and End Marker Test -->
+    <text x="10" y="115" font-size="14">Start, Middle and End</text>
+    <path fill="none" stroke="black" stroke-width="16" marker-start="url(#markerStart)" marker-mid="url(#markerMiddle)" marker-end="url(#markerEnd)" d="M 130 135 L 180 135 L 180 185"/>
+    <!-- Auto Orientation Marker Test -->
+    <text x="10" y="210" font-size="14">Automatic Orientation</text>
+    <path fill="none" stroke="black" stroke-width="16" marker-start="url(#marker2)" marker-mid="url(#marker2)" marker-end="url(#marker2)" d="M 130 230 L 180 230 L 180 280"/>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-007-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-007-ref.svg
new file mode 100644
index 0000000..be4df3a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-007-ref.svg
@@ -0,0 +1,4 @@
+<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg">
+    <path d="M 25 25 v100 h100 z" fill="green" />
+    <path d="M 125 25 v100 h100 z" fill="green" />
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-007.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-007.svg
new file mode 100644
index 0000000..c781220
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-007.svg
@@ -0,0 +1,23 @@
+<svg width="300" height="300"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+    A 'marker' element with 'display' set to 'none' on that
+    element or any ancestor is rendered when referenced by another element.
+    -->
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#Markers"/>
+    <html:link rel="match" href="marker-007-ref.svg"/>
+    <html:meta name="assert" content="Test marker element with 'display' set to 'none' is rendered when referenced."/>
+    <defs>
+        <marker id="testMarker" markerWidth="100" markerHeight="100" display="none">
+            <path d="M 0 0 L 200 200 L 0 150 z" fill="green" />
+        </marker>
+        <g display="none">
+          <marker id="testMarker2" markerWidth="100" markerHeight="100">
+            <path d="M 0 0 L 200 200 L 0 150 z" fill="green" />
+          </marker>
+        </g>
+    </defs>
+    <path d="M 0 0 L 25 25" marker-end="url(#testMarker)" />
+    <path d="M 100 0 L 125 25" marker-end="url(#testMarker2)" />
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-008-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-008-ref.svg
new file mode 100644
index 0000000..b4f329b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-008-ref.svg
@@ -0,0 +1,28 @@
+<svg width="500" height="300" xmlns="http://www.w3.org/2000/svg">
+
+    <line class="start" x1="10" y1="50" x2="100" y2="50" stroke="black" />
+    <rect x="10" y="50" width="10" height="10" fill="blue"/>
+    <path class="start" d="M 10 100 L 50 100 L 100 100" stroke="black"/>
+    <rect x="10" y="100" width="10" height="10" fill="blue"/>
+    <polygon class="start" points="10,150 50,150 100,150" stroke="black"/>
+    <rect x="10" y="150" width="10" height="10" fill="blue"/>
+    <polyline class="start" points="10,200 50,200 100,200" stroke="black"/>
+    <rect x="10" y="200" width="10" height="10" fill="blue"/>
+
+    <line class="end" x1="150" y1="50" x2="250" y2="50" stroke="black"/>
+    <rect x="250" y="50" width="10" height="10" fill="blue"/>
+    <path class="end" d="M 150 100 L 200 100 L 250 100" stroke="black"/>
+    <rect x="250" y="100" width="10" height="10" fill="blue"/>
+    <polygon class="end" points="250,150 200,150" stroke="black"/>
+    <rect x="250" y="150" width="10" height="10" fill="blue"/>
+    <polyline class="end" points="150,200 200,200 250,200" stroke="black"/>
+    <rect x="250" y="200" width="10" height="10" fill="blue"/>
+
+    <line class="mid" x1="300" y1="50" x2="400" y2="50" stroke="black"/>
+    <path class="mid" d="M 300 100 L 350 100 L 400 100" stroke="black"/>
+    <rect x="350" y="100" width="10" height="10" fill="blue"/>
+    <polygon class="mid" points="300,150 350,150" stroke="black"/>
+    <rect x="350" y="150" width="10" height="10" fill="blue"/>
+    <polyline class="mid" points="300,200 350,200 400,200" stroke="black"/>
+    <rect x="350" y="200" width="10" height="10" fill="blue"/>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-008.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-008.svg
new file mode 100644
index 0000000..47f7033
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-008.svg
@@ -0,0 +1,46 @@
+<svg width="500" height="300"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:html="http://www.w3.org/1999/xhtml">
+    <!--
+    Test 'Marker-start', 'marker-mid', and 'marker-end' apply markers at the
+    appropriate vertices when applied to 'line', 'path', 'polygon' and 'polyline'
+    elements.
+    Note: 'marker-mid' has no effect on the 'line' element.
+    -->
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#Markers"/>
+    <html:link rel="match" href="marker-008-ref.svg"/>
+    <html:meta name="assert" content="Tests marker-* render at the appropriate vertices."/>
+    <style type="text/css">
+        .start
+        {
+            marker-start: url(#markerTest);
+        }
+        .end
+        {
+            marker-end: url(#markerTest);
+        }
+        .mid
+        {
+            marker-mid: url(#markerTest);
+        }
+    </style>
+    <defs>
+        <marker id="markerTest" markerWidth="10" markerHeight="10" fill="blue">
+            <rect width="50" height="55" />
+        </marker>
+    </defs>
+    <line class="start" x1="10" y1="50" x2="100" y2="50" stroke="black" />
+    <path class="start" d="M 10 100 L 50 100 L 100 100" stroke="black"/>
+    <polygon class="start" points="10,150 50,150 100,150" stroke="black"/>
+    <polyline class="start" points="10,200 50,200 100,200" stroke="black"/>
+
+    <line class="end" x1="150" y1="50" x2="250" y2="50" stroke="black"/>
+    <path class="end" d="M 150 100 L 200 100 L 250 100" stroke="black"/>
+    <polygon class="end" points="250,150 200,150" stroke="black"/>
+    <polyline class="end" points="150,200 200,200 250,200" stroke="black"/>
+
+    <line class="mid" x1="300" y1="50" x2="400" y2="50" stroke="black"/>
+    <path class="mid" d="M 300 100 L 350 100 L 400 100" stroke="black"/>
+    <polygon class="mid" points="300,150 350,150" stroke="black"/>
+    <polyline class="mid" points="300,200 350,200 400,200" stroke="black"/>
+</svg>
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/composited-scaled-child-with-border-radius-parent-clip-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/composited-scaled-child-with-border-radius-parent-clip-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/composited-scaled-child-with-border-radius-parent-clip-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/composited-scaled-child-with-border-radius-parent-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/composited-translated-child-with-border-radius-parent-clip-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/composited-translated-child-with-border-radius-parent-clip-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/composited-translated-child-with-border-radius-parent-clip-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/composited-translated-child-with-border-radius-parent-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/direct-image-compositing-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/direct-image-compositing-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/direct-image-compositing-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/direct-image-compositing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/fixed-body-background-positioned-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/fixed-body-background-positioned-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/fixed-body-background-positioned-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/fixed-body-background-positioned-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/clip-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/clip-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/clip-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/clip-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/clip-inside-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/clip-inside-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/clip-inside-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/clip-inside-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/clip-with-shadow-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/clip-with-shadow-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/clip-with-shadow-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/clip-with-shadow-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/foreground-layer-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/foreground-layer-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/foreground-layer-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/foreground-layer-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/layer-due-to-layer-children-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/layer-due-to-layer-children-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/geometry/layer-due-to-layer-children-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/geometry/layer-due-to-layer-children-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/iframes/become-composited-nested-iframes-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/iframes/become-composited-nested-iframes-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/iframes/become-composited-nested-iframes-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/iframes/become-composited-nested-iframes-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/iframes/invisible-nested-iframe-show-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/iframes/invisible-nested-iframe-show-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/iframes/invisible-nested-iframe-show-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/iframes/invisible-nested-iframe-show-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/iframes/overlapped-iframe-iframe-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/iframes/overlapped-iframe-iframe-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/iframes/overlapped-iframe-iframe-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/iframes/overlapped-iframe-iframe-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/iframes/overlapped-nested-iframes-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/iframes/overlapped-nested-iframes-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/iframes/overlapped-nested-iframes-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/iframes/overlapped-nested-iframes-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overflow-scroll-overlap-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overflow-scroll-overlap-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overflow-scroll-overlap-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overflow-scroll-overlap-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-animation-clipping-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-animation-clipping-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-animation-clipping-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-animation-clipping-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-animation-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-animation-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-animation-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-animation-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-clipping-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-clipping-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-clipping-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-clipping-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-transformed-and-clipped-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-transformed-and-clipped-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-transformed-and-clipped-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-transformed-and-clipped-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-transforms-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-transforms-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/overlap-transforms-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/overlap-transforms-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/squashing-into-ancestor-clipping-layer-change-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/squashing-into-ancestor-clipping-layer-change-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-creation/squashing-into-ancestor-clipping-layer-change-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-creation/squashing-into-ancestor-clipping-layer-change-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-tree-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-tree-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/layer-tree-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/layer-tree-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/lots-of-img-layers-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/lots-of-img-layers-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/lots-of-img-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/lots-of-img-layers-with-opacity-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/lots-of-img-layers-with-opacity-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/lots-of-img-layers-with-opacity-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/direct-image-mask-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/direct-image-mask-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/direct-image-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/mask-with-added-filters-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/mask-with-added-filters-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/mask-with-added-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/masked-ancestor-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/masked-ancestor-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/masked-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/multiple-masks-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/multiple-masks-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/multiple-masks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/simple-composited-mask-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/masks/simple-composited-mask-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/masks/simple-composited-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/opacity-with-mask-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/opacity-with-mask-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/opacity-with-mask-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/opacity-with-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-above-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-above-composited-subframe-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-above-composited-subframe-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-above-composited-subframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-composited-subframe-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-composited-subframe-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-composited-subframe-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-composited-subframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-on-grandparent-composited-grandchild-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-on-grandparent-composited-grandchild-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-on-grandparent-composited-grandchild-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-on-grandparent-composited-grandchild-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-on-parent-composited-grandchild-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-on-parent-composited-grandchild-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-on-parent-composited-grandchild-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-on-parent-composited-grandchild-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-on-two-ancestors-composited-grandchild-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-on-two-ancestors-composited-grandchild-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-on-two-ancestors-composited-grandchild-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-on-two-ancestors-composited-grandchild-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-styles-with-composited-child-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-styles-with-composited-child-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/border-radius-styles-with-composited-child-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/border-radius-styles-with-composited-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/clear-scroll-parent-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/clear-scroll-parent-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/clear-scroll-parent-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/clear-scroll-parent-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/clip-descendents-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/clip-descendents-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/clip-descendents-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/clip-descendents-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/content-gains-scrollbars-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/content-gains-scrollbars-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/content-gains-scrollbars-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/content-gains-scrollbars-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/content-loses-scrollbars-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/content-loses-scrollbars-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/content-loses-scrollbars-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/content-loses-scrollbars-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/grandchild-composited-with-border-radius-ancestor-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/grandchild-composited-with-border-radius-ancestor-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/grandchild-composited-with-border-radius-ancestor-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/grandchild-composited-with-border-radius-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/grandchild-with-border-radius-ancestor-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/grandchild-with-border-radius-ancestor-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/grandchild-with-border-radius-ancestor-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/grandchild-with-border-radius-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/no-excessive-clip-parent-if-parent-escaped-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/no-excessive-clip-parent-if-parent-escaped-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/no-excessive-clip-parent-if-parent-escaped-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/no-excessive-clip-parent-if-parent-escaped-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/overflow-scrollbar-layers-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/overflow-scrollbar-layers-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/overflow-scrollbar-layers-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/overflow-scrollbar-layers-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/reparented-scrollbars-non-sc-anc-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/reparented-scrollbars-non-sc-anc-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/reparented-scrollbars-non-sc-anc-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/reparented-scrollbars-non-sc-anc-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-clip-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-clip-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-clip-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-clip-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-then-clip-effect-interleave-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-then-clip-effect-interleave-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-then-clip-effect-interleave-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-then-clip-effect-interleave-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-then-clip-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-then-clip-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-then-clip-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-then-clip-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-then-clip-z-order-interleave-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-then-clip-z-order-interleave-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-then-clip-z-order-interleave-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/rotate-then-clip-z-order-interleave-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/rotate-then-clip-z-order-interleave-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/scroll-parent-with-non-stacking-context-composited-ancestor-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/scrollbar-layer-placement-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/scrollbar-layer-placement-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/scrollbar-layer-placement-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/siblings-composited-with-border-radius-ancestor-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/siblings-composited-with-border-radius-ancestor-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/siblings-composited-with-border-radius-ancestor-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/siblings-composited-with-border-radius-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/siblings-composited-with-border-radius-ancestor-one-clipped-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/siblings-composited-with-border-radius-ancestor-one-clipped-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/siblings-composited-with-border-radius-ancestor-one-clipped-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/siblings-composited-with-border-radius-ancestor-one-clipped-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/siblings-with-border-radius-ancestor-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/siblings-with-border-radius-ancestor-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/siblings-with-border-radius-ancestor-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/siblings-with-border-radius-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/tiled-mask-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/tiled-mask-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/overflow/tiled-mask-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/overflow/tiled-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/perpendicular-layer-sorting-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/perpendicular-layer-sorting-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/perpendicular-layer-sorting-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/perpendicular-layer-sorting-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/perspective-interest-rect-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/perspective-interest-rect-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/perspective-interest-rect-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/perspective-interest-rect-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/rtl/rtl-iframe-absolute-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/rtl/rtl-iframe-absolute-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/rtl/rtl-iframe-absolute-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/rtl/rtl-iframe-absolute-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/rtl/rtl-iframe-fixed-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/rtl/rtl-iframe-fixed-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/rtl/rtl-iframe-fixed-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/rtl/rtl-iframe-fixed-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/rtl/rtl-iframe-relative-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/rtl/rtl-iframe-relative-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/rtl/rtl-iframe-relative-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/rtl/rtl-iframe-relative-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/scrollbars/nested-overlay-scrollbars-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/scrollbars/nested-overlay-scrollbars-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/scrollbars/nested-overlay-scrollbars-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/scrollbars/nested-overlay-scrollbars-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/squashing/clipping-ancestor-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/squashing/clipping-ancestor-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/squashing/clipping-ancestor-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/squashing/clipping-ancestor-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/squashing/no-squashing-into-another-clip-layer-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/squashing/no-squashing-into-another-clip-layer-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/squashing/no-squashing-into-another-clip-layer-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/squashing/no-squashing-into-another-clip-layer-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/squashing/no-squashing-into-fixed-position-that-clips-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/squashing/no-squashing-into-fixed-position-that-clips-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/squashing/no-squashing-into-fixed-position-that-clips-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/squashing/no-squashing-into-fixed-position-that-clips-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/visibility/layer-visible-content-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/visibility/layer-visible-content-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/compositing/visibility/layer-visible-content-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/compositing/visibility/layer-visible-content-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-canvas-border-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-canvas-border-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-canvas-border-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-canvas-border-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-canvas-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-canvas-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-canvas-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-canvas-with-mask-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-canvas-with-mask-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-canvas-with-mask-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-canvas-with-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-video-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-video-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-video-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-video-ratio-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-video-ratio-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-video-ratio-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-video-ratio-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-video-shadow-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-video-shadow-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/border-radius-mask-video-shadow-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/border-radius-mask-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/overflow-hidden-border-radius-force-backing-store-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/overflow-hidden-border-radius-force-backing-store-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/borders/overflow-hidden-border-radius-force-backing-store-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/borders/overflow-hidden-border-radius-force-backing-store-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/clip/overflow-border-radius-composited-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/clip/overflow-border-radius-composited-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/clip/overflow-border-radius-composited-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/clip/overflow-border-radius-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/clip/overflow-border-radius-composited-parent-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/clip/overflow-border-radius-composited-parent-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/clip/overflow-border-radius-composited-parent-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/clip/overflow-border-radius-composited-parent-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/multicol/composited-layer-nested-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/multicol/composited-layer-nested-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/multicol/composited-layer-nested-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/multicol/composited-layer-nested-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/clip/clip-path-constant-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/clip/clip-path-constant-repaint-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/clip/clip-path-constant-repaint-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/clip/clip-path-constant-repaint-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/clipping-should-not-repaint-composited-descendants-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/clipping-should-not-repaint-composited-descendants-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/clipping-should-not-repaint-composited-descendants-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/clipping-should-not-repaint-composited-descendants-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/overlap-test-with-filter-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/overlap-test-with-filter-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/overlap-test-with-filter-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/overlap-test-with-filter-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/repaint-overflow-scrolled-squashed-content-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/repaint-overflow-scrolled-squashed-content-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/repaint-overflow-scrolled-squashed-content-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/repaint-overflow-scrolled-squashed-content-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/scrolling-neg-z-index-descendants-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/scrolling-neg-z-index-descendants-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/scrolling-neg-z-index-descendants-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/scrolling-neg-z-index-descendants-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/should-not-repaint-composited-descendants-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/should-not-repaint-composited-descendants-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/should-not-repaint-composited-descendants-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/should-not-repaint-composited-descendants-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/should-not-repaint-composited-descendants-on-overflow-change-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/should-not-repaint-composited-descendants-on-overflow-change-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/compositing/should-not-repaint-composited-descendants-on-overflow-change-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/compositing/should-not-repaint-composited-descendants-on-overflow-change-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/scroll/composited-iframe-scroll-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/scroll/composited-iframe-scroll-repaint-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/scroll/composited-iframe-scroll-repaint-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/scroll/composited-iframe-scroll-repaint-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/scroll/repaint-composited-child-in-scrolled-container-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/scroll/repaint-composited-child-in-scrolled-container-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/scroll/repaint-composited-child-in-scrolled-container-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/scroll/repaint-composited-child-in-scrolled-container-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/video-paint-invalidation-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/video-paint-invalidation-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/paint/invalidation/video-paint-invalidation-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/paint/invalidation/video-paint-invalidation-expected.txt
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/transforms/3d/point-mapping/3d-point-mapping-2-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/transforms/3d/point-mapping/3d-point-mapping-2-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/transforms/3d/point-mapping/3d-point-mapping-2-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/transforms/3d/point-mapping/3d-point-mapping-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/transforms/3d/point-mapping/3d-point-mapping-deep-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/virtual/android/fullscreen/video-overlay-scroll-expected.txt b/third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/virtual/android/fullscreen/video-overlay-scroll-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/flag-specific/enable-blink-gen-property-trees/virtual/android/fullscreen/video-overlay-scroll-expected.txt
rename to third_party/blink/web_tests/flag-specific/enable-features=BlinkGenPropertyTrees/virtual/android/fullscreen/video-overlay-scroll-expected.txt
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/resources/gc.js b/third_party/blink/web_tests/http/tests/devtools/network/resources/gc.js
index 2d6147e3..761160c8 100644
--- a/third_party/blink/web_tests/http/tests/devtools/network/resources/gc.js
+++ b/third_party/blink/web_tests/http/tests/devtools/network/resources/gc.js
@@ -1,4 +1,4 @@
-// This file was copied from third_party/WebKit/LayoutTests/resources/gc.js
+// This file was copied from third_party/blink/web_tests/resources/gc.js
 // If there is no window.gc() already defined, define one using the best
 // method we can find.
 // The slow fallback should not hit in the actual test environment.
diff --git a/third_party/blink/web_tests/http/tests/fetch/script-tests/response.js b/third_party/blink/web_tests/http/tests/fetch/script-tests/response.js
index 5bbc36c..5bb30bf 100644
--- a/third_party/blink/web_tests/http/tests/fetch/script-tests/response.js
+++ b/third_party/blink/web_tests/http/tests/fetch/script-tests/response.js
@@ -22,8 +22,8 @@
     assert_equals(response.status, 200,
                   'Default Response.status should be 200');
     assert_true(response.ok, 'Default Response.ok must be true');
-    assert_equals(response.statusText, 'OK',
-                  'Default Response.statusText should be \'OK\'');
+    assert_equals(response.statusText, '',
+                  'Default Response.statusText should be \'\'');
     assert_equals(size(response.headers), 0,
                   'Default Response should not have any header.');
     if (self.internals) {
@@ -38,7 +38,7 @@
     assert_true(response.ok, 'Response.ok must remain unchanged ' +
                              'when Response.status is attempted ' +
                              'unsuccessfully to change');
-    assert_equals(response.statusText, 'OK',
+    assert_equals(response.statusText, '',
                   'Response.statusText should be readonly');
     response.ok = false;
     assert_true(response.ok, 'Response.ok must be readonly');
diff --git a/third_party/blink/web_tests/http/tests/lazyload/style-dimension.html b/third_party/blink/web_tests/http/tests/lazyload/style-dimension.html
new file mode 100644
index 0000000..9b926b0
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/lazyload/style-dimension.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="placeholder.js"></script>
+
+<body>
+  <div style="height:10000px;"></div>
+  <img id="small_dimension_img" src='../loading/resources/base-image1.png' style="height:1px; width:10px">
+  <img id="large_dimension_img" src='../loading/resources/base-image2.png' style="height:20px; width:20px">
+  <img id="height_only_img" src='../loading/resources/base-image3.png' style="height:1px;">
+  <img id="width_only_img" src='../loading/resources/dup-image1.png' style="width:1px;">
+  <img id="percent_dimension_img" src='../loading/resources/dup-image2.png' style="height:10%; width:10%">
+</body>
+
+<script>
+  async_test(function(t) {
+    window.addEventListener("load", t.step_func_done());
+  }, "Test that document load event is fired");
+
+  async_test(function(t) {
+    var small_dimension_img = document.getElementById("small_dimension_img");
+    small_dimension_img.addEventListener("load",
+      t.step_func_done(function() {
+        assert_true(is_image_fully_loaded(small_dimension_img));
+      }));
+  }, "Test that small <img> with width and height mentioned in inline dimensions is not deferred by lazyload ");
+
+  async_test(function(t) {
+    var large_dimension_img = document.getElementById("large_dimension_img");
+    var height_only_img = document.getElementById("height_only_img");
+    var width_only_img = document.getElementById("width_only_img");
+    var percent_dimension_img = document.getElementById("percent_dimension_img");
+    window.addEventListener("load", t.step_func_done(function() {
+      assert_false(is_image_fully_loaded(large_dimension_img));
+      assert_false(is_image_fully_loaded(height_only_img));
+      assert_false(is_image_fully_loaded(width_only_img));
+      assert_false(is_image_fully_loaded(percent_dimension_img));
+    }));
+    large_dimension_img.addEventListener("load",
+      t.unreached_func("Load event should not be fired for below viewport image with large inline dimension"));
+    height_only_img.addEventListener("load",
+      t.unreached_func("Load event should not be fired for below viewport image with only inline height"));
+    width_only_img.addEventListener("load",
+      t.unreached_func("Load event should not be fired for below viewport image with only inline width"));
+    percent_dimension_img.addEventListener("load",
+      t.unreached_func("Load event should not be fired for below viewport image with percentage inline dimension"));
+  }, "Test that <img> with non small height or width below the viewport is loaded as placeholder");
+</script>
diff --git a/third_party/blink/web_tests/http/tests/streams/resources/test-utils.js b/third_party/blink/web_tests/http/tests/streams/resources/test-utils.js
new file mode 100644
index 0000000..871ab49
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/streams/resources/test-utils.js
@@ -0,0 +1,73 @@
+'use strict';
+
+self.getterRejects = (t, obj, getterName, target) => {
+  const getter = Object.getOwnPropertyDescriptor(obj, getterName).get;
+
+  return promise_rejects(t, new TypeError(), getter.call(target), getterName + ' should reject with a TypeError');
+};
+
+self.getterRejectsForAll = (t, obj, getterName, targets) => {
+  return Promise.all(targets.map(target => self.getterRejects(t, obj, getterName, target)));
+};
+
+self.methodRejects = (t, obj, methodName, target, args) => {
+  const method = obj[methodName];
+
+  return promise_rejects(t, new TypeError(), method.apply(target, args),
+                         methodName + ' should reject with a TypeError');
+};
+
+self.methodRejectsForAll = (t, obj, methodName, targets, args) => {
+  return Promise.all(targets.map(target => self.methodRejects(t, obj, methodName, target, args)));
+};
+
+self.getterThrows = (obj, getterName, target) => {
+  const getter = Object.getOwnPropertyDescriptor(obj, getterName).get;
+
+  assert_throws(new TypeError(), () => getter.call(target), getterName + ' should throw a TypeError');
+};
+
+self.getterThrowsForAll = (obj, getterName, targets) => {
+  targets.forEach(target => self.getterThrows(obj, getterName, target));
+};
+
+self.methodThrows = (obj, methodName, target, args) => {
+  const method = obj[methodName];
+  assert_equals(typeof method, 'function', methodName + ' should exist');
+
+  assert_throws(new TypeError(), () => method.apply(target, args), methodName + ' should throw a TypeError');
+};
+
+self.methodThrowsForAll = (obj, methodName, targets, args) => {
+  targets.forEach(target => self.methodThrows(obj, methodName, target, args));
+};
+
+self.constructorThrowsForAll = (constructor, firstArgs) => {
+  firstArgs.forEach(firstArg => assert_throws(new TypeError(), () => new constructor(firstArg),
+                                              'constructor should throw a TypeError'));
+};
+
+self.garbageCollect = () => {
+  if (self.gc) {
+    // Use --expose_gc for V8 (and Node.js)
+    // Exposed in SpiderMonkey shell as well
+    self.gc();
+  } else if (self.GCController) {
+    // Present in some WebKit development environments
+    GCController.collect();
+  } else {
+    /* eslint-disable no-console */
+    console.warn('Tests are running without the ability to do manual garbage collection. They will still work, but ' +
+      'coverage will be suboptimal.');
+    /* eslint-enable no-console */
+  }
+};
+
+self.delay = ms => new Promise(resolve => step_timeout(resolve, ms));
+
+// For tests which verify that the implementation doesn't do something it shouldn't, it's better not to use a
+// timeout. Instead, assume that any reasonable implementation is going to finish work after 2 times around the event
+// loop, and use flushAsyncEvents().then(() => assert_array_equals(...));
+// Some tests include promise resolutions which may mean the test code takes a couple of event loop visits itself. So go
+// around an extra 2 times to avoid complicating those tests.
+self.flushAsyncEvents = () => delay(0).then(() => delay(0)).then(() => delay(0)).then(() => delay(0));
diff --git a/third_party/blink/web_tests/http/tests/streams/transferable/transform-stream-expected.txt b/third_party/blink/web_tests/http/tests/streams/transferable/transform-stream-expected.txt
new file mode 100644
index 0000000..903c0c98
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/streams/transferable/transform-stream-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL window.postMessage should be able to transfer a TransformStream Failed to execute 'postMessage' on 'Window': Value at index 0 does not have a transferable type.
+FAIL a TransformStream with a locked writable should not be transferable assert_throws: postMessage should throw function "() => postMessage(ts, '*', [ts])" threw object "TypeError: Failed to execute 'postMessage' on 'Window': Value at index 0 does not have a transferable type." that is not a DOMException DataCloneError: property "code" is equal to undefined, expected 25
+FAIL a TransformStream with a locked readable should not be transferable assert_throws: postMessage should throw function "() => postMessage(ts, '*', [ts])" threw object "TypeError: Failed to execute 'postMessage' on 'Window': Value at index 0 does not have a transferable type." that is not a DOMException DataCloneError: property "code" is equal to undefined, expected 25
+FAIL a TransformStream with both sides locked should not be transferable assert_throws: postMessage should throw function "() => postMessage(ts, '*', [ts])" threw object "TypeError: Failed to execute 'postMessage' on 'Window': Value at index 0 does not have a transferable type." that is not a DOMException DataCloneError: property "code" is equal to undefined, expected 25
+FAIL piping through transferred transforms should work Failed to execute 'postMessage' on 'Window': Value at index 0 does not have a transferable type.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/http/tests/streams/transferable/transform-stream.html b/third_party/blink/web_tests/http/tests/streams/transferable/transform-stream.html
new file mode 100644
index 0000000..388ac82
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/streams/transferable/transform-stream.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/test-utils.js"></script>
+<script>
+'use strict';
+
+promise_test(t => {
+  const orig = new TransformStream();
+  const promise = new Promise(resolve => {
+    addEventListener('message', t.step_func(evt => {
+      const transferred = evt.data;
+      assert_equals(transferred.constructor, TransformStream,
+                    'transferred should be a TransformStream in this realm');
+      assert_true(transferred instanceof TransformStream,
+                  'instanceof check should pass');
+
+      // Perform a brand-check on |transferred|.
+      const readableGetter = Object.getOwnPropertyDescriptor(
+        TransformStream.prototype, 'readable').get;
+      assert_true(readableGetter.call(transferred) instanceof ReadableStream,
+                 'brand check should pass and readable stream should result');
+      const writableGetter = Object.getOwnPropertyDescriptor(
+        TransformStream.prototype, 'writable').get;
+      assert_true(writableGetter.call(transferred) instanceof WritableStream,
+                 'brand check should pass and writable stream should result');
+      resolve();
+    }), {once: true});
+  });
+  postMessage(orig, '*', [orig]);
+  assert_true(orig.readable.locked, 'the readable side should be locked');
+  assert_true(orig.writable.locked, 'the writable side should be locked');
+  return promise;
+}, 'window.postMessage should be able to transfer a TransformStream');
+
+test(() => {
+  const ts = new TransformStream();
+  const writer = ts.writable.getWriter();
+  assert_throws('DataCloneError', () => postMessage(ts, '*', [ts]),
+                'postMessage should throw');
+}, 'a TransformStream with a locked writable should not be transferable');
+
+test(() => {
+  const ts = new TransformStream();
+  const reader = ts.readable.getReader();
+  assert_throws('DataCloneError', () => postMessage(ts, '*', [ts]),
+                'postMessage should throw');
+}, 'a TransformStream with a locked readable should not be transferable');
+
+test(() => {
+  const ts = new TransformStream();
+  const reader = ts.readable.getReader();
+  const writer = ts.writable.getWriter();
+  assert_throws('DataCloneError', () => postMessage(ts, '*', [ts]),
+                'postMessage should throw');
+}, 'a TransformStream with both sides locked should not be transferable');
+
+promise_test(t => {
+  const source = new ReadableStream({
+    start(controller) {
+      controller.enqueue('hello ');
+      controller.enqueue('there ');
+      controller.close();
+    }
+  });
+  let result = '';
+  const sink = new WritableStream({
+    write(chunk) {
+      result += chunk;
+    }
+  });
+  const transform1 = new TransformStream({
+    transform(chunk, controller) {
+      controller.enqueue(chunk.toUpperCase());
+    }
+  });
+  const transform2 = new TransformStream({
+    transform(chunk, controller) {
+      controller.enqueue(chunk + chunk);
+    }
+  });
+  const promise = new Promise(resolve => {
+    addEventListener('message', t.step_func(evt => {
+      const data = evt.data;
+      resolve(data.source
+                .pipeThrough(data.transform1)
+                .pipeThrough(data.transform2)
+                .pipeTo(data.sink));
+    }));
+  });
+  postMessage({source, sink, transform1, transform2}, '*',
+              [source, transform1, sink, transform2]);
+  return promise
+    .then(() => delay(0))
+    .then(() => {
+      assert_equals(result, 'HELLO HELLO THERE THERE ',
+                    'transforms should have been applied');
+    });
+}, 'piping through transferred transforms should work');
+
+</script>
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-all-expected.txt b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-all-expected.txt
index f67ed32..12ba42f 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-all-expected.txt
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-all-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE WARNING: line 20: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Tests the special case of whitelisting all origins.
 
 Testing: http://localhost:8000/xmlhttprequest/resources/get.txt (sync)
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-all.html b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-all.html
index c6f2c321..a578757 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-all.html
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-all.html
@@ -5,7 +5,7 @@
 testRunner.dumpAsText();
 testRunner.waitUntilDone();
 testRunner.addOriginAccessAllowListEntry("http://127.0.0.1:8000", "http", "", true);
-testRunner.addOriginAccessAllowListEntry("http://localhost:8000", "http", "", true);
+testRunner.setDumpConsoleMessages(false);
 
 function log(message)
 {
@@ -43,7 +43,7 @@
 {
     var iframe = document.createElement("iframe");
     document.body.appendChild(iframe);
-    iframe.src = "http://localhost:8000/xmlhttprequest/resources/origin-whitelisting-ip-address-test.html";
+    iframe.src = "http://localhost:8000/xmlhttprequest/resources/origin-whitelisting-ip-address-test.html#all";
     window.addEventListener("message", function(e) {
         if (e.data == "DONE")
             testRunner.notifyDone();
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-expected.txt b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-expected.txt
index 05733ab..d18d7d0 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-expected.txt
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 14: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
+CONSOLE WARNING: line 24: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
 Tests origin whitelisting with IP addresses.
 
 Testing: http://127.0.0.1:8000/xmlhttprequest/resources/get.txt (sync)
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-with-subdomains-expected.txt b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-with-subdomains-expected.txt
index 6dac77a..c07b886 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-with-subdomains-expected.txt
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-with-subdomains-expected.txt
@@ -1,5 +1,5 @@
-CONSOLE WARNING: line 14: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
-CONSOLE ERROR: line 16: Access to XMLHttpRequest at 'http://127.0.0.1:8000/xmlhttprequest/resources/get.txt' from origin 'http://localhost:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
+CONSOLE WARNING: line 24: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
+CONSOLE ERROR: line 26: Access to XMLHttpRequest at 'http://127.0.0.1:8000/xmlhttprequest/resources/get.txt' from origin 'http://localhost:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
 CONSOLE ERROR: Access to XMLHttpRequest at 'http://127.0.0.1:8000/xmlhttprequest/resources/get.txt' from origin 'http://localhost:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
 Specifying that an IP address should match subdomains doesn't make sense. This test verifies that it doesn't do anything.
 
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-with-subdomains.html b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-with-subdomains.html
index 73eae94..85b50bc 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-with-subdomains.html
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses-with-subdomains.html
@@ -3,7 +3,6 @@
 <script>
 testRunner.dumpAsText();
 testRunner.waitUntilDone();
-testRunner.addOriginAccessAllowListEntry("http://localhost:8000", "http", "*.0.0.1", true);
 
 function log(message)
 {
@@ -12,7 +11,7 @@
 
 var iframe = document.createElement("iframe");
 document.body.appendChild(iframe);
-iframe.src = "http://localhost:8000/xmlhttprequest/resources/origin-whitelisting-ip-address-test.html";
+iframe.src = "http://localhost:8000/xmlhttprequest/resources/origin-whitelisting-ip-address-test.html#subdomains";
 window.addEventListener("message", function(e) {
     if (e.data == "DONE")
         testRunner.notifyDone();
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html
index 3d6aed5..a6692c6 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html
@@ -3,7 +3,6 @@
 <script>
 testRunner.dumpAsText();
 testRunner.waitUntilDone();
-testRunner.addOriginAccessAllowListEntry("http://localhost:8000", "http", "127.0.0.1", false);
 
 function log(message)
 {
diff --git a/third_party/blink/web_tests/http/tests/xmlhttprequest/resources/origin-whitelisting-ip-address-test.html b/third_party/blink/web_tests/http/tests/xmlhttprequest/resources/origin-whitelisting-ip-address-test.html
index 3be1d29a..50f4bfe9 100644
--- a/third_party/blink/web_tests/http/tests/xmlhttprequest/resources/origin-whitelisting-ip-address-test.html
+++ b/third_party/blink/web_tests/http/tests/xmlhttprequest/resources/origin-whitelisting-ip-address-test.html
@@ -1,5 +1,6 @@
 <p>Tests origin whitelisting to an IP address.</p>
 <p>Intended to be run in an iframe. Notifies success/failure via postMessage().</p>
+<p>The specific case to test is determined based on location.hash.
 
 <pre id="console"></pre>
 <script>
@@ -8,6 +9,15 @@
     window.parent.postMessage(message, "http://127.0.0.1:8000");
 }
 
+if (window.testRunner) {
+  if (location.hash == "#all")
+      testRunner.addOriginAccessAllowListEntry("http://localhost:8000", "http", "", true);
+  else if (location.hash == "#subdomains")
+      testRunner.addOriginAccessAllowListEntry("http://localhost:8000", "http", "*.0.0.1", true);
+  else
+      testRunner.addOriginAccessAllowListEntry("http://localhost:8000", "http", "127.0.0.1", false);
+}
+
 var url = "http://127.0.0.1:8000/xmlhttprequest/resources/get.txt";
 log("Testing: " + url + " (sync)");
 var req = new XMLHttpRequest();
diff --git a/third_party/blink/web_tests/paint/invalidation/compositing/repaint-via-layout-offset-expected.txt b/third_party/blink/web_tests/paint/invalidation/compositing/repaint-via-layout-offset-expected.txt
index 41cb0fc9..1c9b5aa 100644
--- a/third_party/blink/web_tests/paint/invalidation/compositing/repaint-via-layout-offset-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/compositing/repaint-via-layout-offset-expected.txt
@@ -29,7 +29,7 @@
       "transform": 1
     },
     {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV id='container')",
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) SPAN class='child')",
       "position": [50, 50],
       "bounds": [50, 50],
       "paintInvalidations": [
diff --git a/third_party/blink/web_tests/paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child-expected.txt b/third_party/blink/web_tests/paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child-expected.txt
index 3b7ce4a..74356dd2 100644
--- a/third_party/blink/web_tests/paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/scroll/overflow-scroll-composited-non-stacking-child-expected.txt
@@ -40,23 +40,6 @@
       "contentsOpaque": true,
       "backgroundColor": "#FFDDBB",
       "transform": 1
-    },
-    {
-      "name": "Ancestor Clipping Layer",
-      "position": [23, 65],
-      "bounds": [285, 175],
-      "drawsContent": false
-    },
-    {
-      "name": "LayoutBlockFlow (relative positioned) DIV class='list'",
-      "position": [43, 35],
-      "bounds": [180, 250],
-      "drawsContent": false
-    },
-    {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (relative positioned) DIV class='commit')",
-      "position": [43, 35],
-      "bounds": [180, 250]
     }
   ],
   "transforms": [
diff --git a/third_party/blink/web_tests/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt b/third_party/blink/web_tests/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt
index 36ee416..e937af2 100644
--- a/third_party/blink/web_tests/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt
@@ -18,6 +18,10 @@
       "backgroundColor": "#FFFFFF"
     },
     {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
       "name": "LayoutBlockFlow (positioned) DIV id='target'",
       "position": [7, 57],
       "bounds": [402, 542],
@@ -37,32 +41,9 @@
       ]
     },
     {
-      "name": "LayoutBlockFlow (positioned) DIV",
-      "bounds": [440, 300],
-      "backgroundColor": "#0000FF",
-      "transform": 2
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [108, 158, 0, 1]
-      ]
-    },
-    {
-      "id": 2,
-      "parent": 1,
-      "transform": [
-        [0, 1, 0, 0],
-        [-1, 0, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [150, 150]
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV)",
+      "position": [108, 158],
+      "bounds": [300, 440]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/platform/mac/compositing/squashing/frame-clip-squashed-scrolled-expected.txt b/third_party/blink/web_tests/platform/mac/compositing/squashing/frame-clip-squashed-scrolled-expected.txt
index bab8a50..a3709b34 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/squashing/frame-clip-squashed-scrolled-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/compositing/squashing/frame-clip-squashed-scrolled-expected.txt
@@ -19,21 +19,10 @@
       "transform": 1
     },
     {
-      "name": "Squashing Containment Layer",
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
       "name": "LayoutBlockFlow DIV",
       "contentsOpaque": true,
       "drawsContent": false,
       "transform": 2
-    },
-    {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (relative positioned) DIV)",
-      "position": [8, 8],
-      "bounds": [102, 2002],
-      "transform": 1
     }
   ],
   "transforms": [
@@ -55,8 +44,7 @@
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [8, 8, 0, 1]
-      ],
-      "flattenInheritedTransform": false
+      ]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt
index 4290097..9cf060f 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/transform-focus-ring-repaint-expected.txt
@@ -18,6 +18,10 @@
       "backgroundColor": "#FFFFFF"
     },
     {
+      "name": "Squashing Containment Layer",
+      "drawsContent": false
+    },
+    {
       "name": "LayoutBlockFlow (positioned) DIV id='target'",
       "position": [5, 55],
       "bounds": [406, 546],
@@ -37,32 +41,9 @@
       ]
     },
     {
-      "name": "LayoutBlockFlow (positioned) DIV",
-      "bounds": [440, 300],
-      "backgroundColor": "#0000FF",
-      "transform": 2
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [108, 158, 0, 1]
-      ]
-    },
-    {
-      "id": 2,
-      "parent": 1,
-      "transform": [
-        [0, 1, 0, 0],
-        [-1, 0, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [150, 150]
+      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV)",
+      "position": [108, 158],
+      "bounds": [300, 440]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/svg/hittest/foreign-object-with-transform.html b/third_party/blink/web_tests/svg/hittest/foreign-object-with-transform.html
new file mode 100644
index 0000000..7d557bda
--- /dev/null
+++ b/third_party/blink/web_tests/svg/hittest/foreign-object-with-transform.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<title>Hit-test on contents of transformed foreignObject</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<svg>
+  <foreignObject width="100" height="100" transform="translate(100, 0)">
+    <div id="target" style="width: 100px; height: 100px; background-color: blue"></div>
+  </foreignObject>
+</svg>
+<script>
+  test(function() {
+    assert_equals(document.elementFromPoint(150, 50), target);
+  });
+</script>
diff --git a/third_party/blink/web_tests/virtual/transferable-streams/http/tests/streams/transferable/transform-stream-expected.txt b/third_party/blink/web_tests/virtual/transferable-streams/http/tests/streams/transferable/transform-stream-expected.txt
new file mode 100644
index 0000000..a74947f
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/transferable-streams/http/tests/streams/transferable/transform-stream-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS window.postMessage should be able to transfer a TransformStream
+PASS a TransformStream with a locked writable should not be transferable
+PASS a TransformStream with a locked readable should not be transferable
+PASS a TransformStream with both sides locked should not be transferable
+PASS piping through transferred transforms should work
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/webaudio/tools/README.md b/third_party/blink/web_tests/webaudio/tools/README.md
index ac06092..5ba540c 100644
--- a/third_party/blink/web_tests/webaudio/tools/README.md
+++ b/third_party/blink/web_tests/webaudio/tools/README.md
@@ -1,7 +1,7 @@
 # layout-test-tidy
 
 This tool, a Node.js CLI utility, performs a set of clean-up tasks for layout
-test files in LayoutTests/webaudio. (Potentially it can be applied to any kind
+test files in web_tests/webaudio. (Potentially it can be applied to any kind
 of layout test files in HTML or JS format.)
 
 The clean-up tasks includes:
@@ -48,5 +48,5 @@
 node layout-test-tidy -v ${TARGET_PATH} > result.txt
 
 # Apply in-place tidy to the entire layout test files for WebAudio.
-node layout-test-tidy -i -R ${CHROME_SRC}/third_party/WebKit/LayoutTests/webaudio
+node layout-test-tidy -i -R ${CHROME_SRC}/third_party/blink/web_tests/webaudio
 ```
diff --git a/third_party/closure_compiler/externs/file_manager_private.js b/third_party/closure_compiler/externs/file_manager_private.js
index 45274193..ae4f00a 100644
--- a/third_party/closure_compiler/externs/file_manager_private.js
+++ b/third_party/closure_compiler/externs/file_manager_private.js
@@ -961,16 +961,25 @@
 chrome.fileManagerPrivate.mountCrostini = function(callback) {};
 
 /**
- * Shares directory with crostini container.
+ * Shares paths with crostini container.
  * @param {!Array<!Entry>} entries Entries of the files and directories to share.
  * @param {boolean} persist If true, share will persist across restarts.
- * @param {function()} callback Callback called after the folder is shared.
+ * @param {function()} callback Callback called after the paths are shared.
  *     chrome.runtime.lastError will be set if there was an error.
  */
 chrome.fileManagerPrivate.sharePathsWithCrostini = function(
     entries, persist, callback) {};
 
 /**
+ * Unshares path with crostini container.
+ * @param {!Entry} entry Entry of the file or directory to unshare.
+ * @param {function()} callback Callback called after the path is unshared.
+ *     chrome.runtime.lastError will be set if there was an error.
+ */
+chrome.fileManagerPrivate.unsharePathWithCrostini = function(
+    entry, callback) {};
+
+/**
  * Returns list of paths shared with the crostini container, and whether this is
  * the first time this function is called for this session.
  * @param {function(!Array<!Entry>, boolean)} callback
diff --git a/tools/android/native_lib_memory/visualize.js b/tools/android/native_lib_memory/visualize.js
index 6eadc2b..c030409 100644
--- a/tools/android/native_lib_memory/visualize.js
+++ b/tools/android/native_lib_memory/visualize.js
@@ -34,7 +34,7 @@
 const colors = d3.scale.category20();
 let colorIndex = 1;
 const COLOR_MAPPING = [
-  [["third_party/WebKit"], colors(colorIndex++), "Blink"],
+  [["third_party/blink"], colors(colorIndex++), "Blink"],
   [["v8"], colors(colorIndex++), "V8"],
   [["base"], colors(colorIndex++), "//base"],
   [["content"], colors(colorIndex++), "//content"],
diff --git a/tools/checklicenses/checklicenses.py b/tools/checklicenses/checklicenses.py
index 3c1c1f1..e670c68 100755
--- a/tools/checklicenses/checklicenses.py
+++ b/tools/checklicenses/checklicenses.py
@@ -168,12 +168,6 @@
         'UNKNOWN',
     ],
 
-    # TODO(tkent): Remove this entry after the move is completed.
-    # crbug.com/622551
-    'third_party/WebKit': [
-        'UNKNOWN',
-    ],
-
     # https://bugs.chromium.org/p/swiftshader/issues/detail?id=1
     'third_party/swiftshader': [
         'UNKNOWN',
diff --git a/tools/cygprofile/cluster.py b/tools/cygprofile/cluster.py
new file mode 100644
index 0000000..b20372ae
--- /dev/null
+++ b/tools/cygprofile/cluster.py
@@ -0,0 +1,275 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Clustering for function call-graph.
+
+See the Clustering class for a detailed description.
+"""
+
+import collections
+import itertools
+import logging
+
+
+Neighbor = collections.namedtuple('Neighbor', ('src', 'dst', 'dist'))
+
+
+class Clustering(object):
+  """Cluster symbols.
+
+  We are given a list of the first function calls, ordered by
+  time. There are multiple lists: different benchmarks run multiple
+  times, as well as list from startup and then a second list after
+  startup (5 seconds) that runs until the benchmark memory dump.
+
+  We have evidence (see below) that this simple ordering of code from a
+  single profiling run (a load of a website) improves performance,
+  presumably by improving code locality. To reconstruct this ordering
+  using profiling information from multiple files, we cluster. Doing
+  this clustering over multiple runs on the speedometer benchmark
+  recovered speedometer performance compared with the legacy benchmark.
+
+  For each offset list, we record the distances between each symbol and
+  its neighborhood of the following k symbols (k=19, chosen
+  arbitrarily). For example, if we have an offset list of symbols
+  'abcdef', we add the neighbors (a->b, 1), (a->c, 2), (b->c, 1), (b->e,
+  3), etc. Then we average distances of a given neighbor pair over all
+  seen symbol lists. If we see an inversion (for example, (b->a, 3), we
+  use this as a distance of -3). For each file that a given pair does
+  not appear, that is, if the pair does not appear in that file or they
+  are separated by 20 symbols, we use a large distance D (D=1000). The
+  distances are then averages over all files. If the average is
+  negative, the neighbor pair is inverted and the distance flipped. The
+  idea is that if two symbols appear near each other in all profiling
+  runs, there is high confidence that they are usually called
+  together. If they don't appear near in some runs, there is less
+  confidence that they should be colocated. Symbol distances are taken
+  only as following distances to avoid confusing double-counting
+  possibilities as well as to give a clear ordering to combining
+  clusters.
+
+  Neighbors are sorted, and starting with the shortest distance, symbols
+  are coalesced into clusters. If the neighbor pair is (a->b), the
+  clusters containing a and b are combined in that order. If a and b are
+  already in the same cluster, nothing happens. After processing all
+  neighbors there is usually only one cluster; if there are multiple
+  clusters they are combined in order from largest to smallest (although
+  that choice may not matter).
+
+  Cluster merging may optionally be halted if they get above the size
+  of an android page. As of November 2018 this slightly reduces
+  performance and should not be used (1.7% decline in speedometer2,
+  450K native library memory regression).
+  """
+  NEIGHBOR_DISTANCE = 20
+  FAR_DISTANCE = 1000
+  MAX_CLUSTER_SIZE = 4096  # 4k pages on android.
+
+  class _Cluster(object):
+    def __init__(self, syms, size):
+      assert len(set(syms)) == len(syms), 'Duplicated symbols in cluster'
+      self._syms = syms
+      self._size = size
+
+    @property
+    def syms(self):
+      return self._syms
+
+    @property
+    def binary_size(self):
+      return self._size
+
+  @classmethod
+  def ClusteredSymbolLists(cls, sym_lists, size_map):
+    c = cls()
+    c.AddSymbolLists(sym_lists)
+    return c.ClusterToList(size_map)
+
+  def __init__(self):
+    self._num_lists = None
+    self._neighbors = None
+    self._cluster_map = {}
+    self._symbol_size = lambda _: 0  # Maps a symbol to a size.
+
+  def _MakeCluster(self, syms):
+    c = self._Cluster(syms, sum(self._symbol_size(s) for s in syms))
+    for s in syms:
+      self._cluster_map[s] = c
+    return c
+
+  def ClusterOf(self, s):
+    if isinstance(s, self._Cluster):
+      assert self._cluster_map[s.syms[0]] == s
+      return s
+    if s in self._cluster_map:
+      return self._cluster_map[s]
+    return self._MakeCluster([s])
+
+  def Combine(self, a, b):
+    """Combine clusters.
+
+    Args:
+      a, b: Clusters or str. The canonical cluster (ClusterOf) will be
+        used to do the combining.
+
+    Returns:
+      A merged cluster from a and b, or None if a and b are in the same cluster.
+    """
+    canonical_a = self.ClusterOf(a)
+    canonical_b = self.ClusterOf(b)
+    if canonical_a == canonical_b:
+      return None
+    return self._MakeCluster(canonical_a._syms + canonical_b._syms)
+
+  def AddSymbolLists(self, sym_lists):
+    self._num_lists = len(sym_lists)
+    self._neighbors = self._CoalesceNeighbors(
+        self._ConstructNeighbors(sym_lists))
+
+  def _ConstructNeighbors(self, sym_lists):
+    neighbors = []
+    for sym_list in sym_lists:
+      for i, s in enumerate(sym_list):
+        for j in xrange(i + 1, min(i + self.NEIGHBOR_DISTANCE, len(sym_list))):
+          if s == sym_list[j]:
+            # Free functions that are static inline seem to be the only
+            # source of these duplicates.
+            continue
+          neighbors.append(Neighbor(s, sym_list[j], j - i))
+    logging.info('Constructed %s symbol neighbors', len(neighbors))
+    return neighbors
+
+  def _CoalesceNeighbors(self, neighbors):
+    pairs = collections.defaultdict(list)
+    for n in neighbors:
+      pairs[(n.src, n.dst)].append(n.dist)
+    coalesced = []
+    logging.info('Will coalesce over %s neighbor pairs', len(pairs))
+    count = 0
+    for (s, t) in pairs:
+      assert s != t, '{} != {}'.format(s, t)
+      if (t, s) in pairs and t < s:
+        # Only process each unordered pair once.
+        continue
+      count += 1
+      if not (count % 1e6):
+        logging.info('tick')
+      distances = []
+      if (s, t) in pairs:
+        distances.extend(pairs[(s, t)])
+      if (t, s) in pairs:
+        distances.extend(-d for d in pairs[(t, s)])
+      if distances:
+        num_missing = self._num_lists - len(distances)
+        avg_distance = (float(sum(distances)) +
+                        self.FAR_DISTANCE * num_missing) / self._num_lists
+        if avg_distance > 0:
+          coalesced.append(Neighbor(s, t, avg_distance))
+        else:
+          coalesced.append(Neighbor(t, s, avg_distance))
+    return coalesced
+
+  def ClusterToList(self, size_map=None):
+    """Merge the clusters with the smallest distances.
+
+    Args:
+      size_map ({symbol: size} or None): Map symbol names to their size. Cluster
+        growth will be stopped at MAX_CLUSTER_SIZE. If None, sizes are taken to
+        be zero and cluster growth is not stopped.
+
+    Returns:
+      An ordered list of symbols from AddSymbolLists, appropriately clustered.
+    """
+    if size_map:
+      self._symbol_size = lambda s: size_map[s]
+    if not self._num_lists or not self._neighbors:
+      # Some sort of trivial set of symbol lists, such as all being
+      # length 1. Return an empty ordering.
+      return []
+    logging.info('Sorting %s neighbors', len(self._neighbors))
+    self._neighbors.sort(key=lambda n: (-n.dist, n.src, n.dst))
+    logging.info('Clustering...')
+    count = 0
+    while self._neighbors:
+      count += 1
+      if not (count % 1e6):
+        logging.info('tock')
+      neighbor = self._neighbors.pop()
+      src = self.ClusterOf(neighbor.src)
+      dst = self.ClusterOf(neighbor.dst)
+      if (src == dst or
+          src.binary_size + dst.binary_size > self.MAX_CLUSTER_SIZE):
+        continue
+      self.Combine(src, dst)
+    if size_map:
+      clusters_by_size = sorted(list(set(self._cluster_map.values())),
+                                key=lambda c: -c.binary_size)
+    else:
+      clusters_by_size = sorted(list(set(self._cluster_map.values())),
+                                key=lambda c: -len(c.syms))
+    logging.info('Produced %s clusters', len(clusters_by_size))
+    logging.info('Top sizes: %s', ['{}/{}'.format(len(c.syms), c.binary_size)
+                                   for c in clusters_by_size[:4]])
+    logging.info('Bottom sizes: %s', ['{}/{}'.format(len(c.syms), c.binary_size)
+                                      for c in clusters_by_size[-4:]])
+    ordered_syms = []
+    for c in clusters_by_size:
+      ordered_syms.extend(c.syms)
+    assert len(ordered_syms) == len(set(ordered_syms)), 'Duplicated symbols!'
+    return ordered_syms
+
+
+def ClusterOffsets(profiles, processor, limit_cluster_size=False):
+  """Cluster profile offsets.
+
+  Args:
+    profiles (ProfileManager) Manager of the profile dump files.
+    processor (SymbolOffsetProcessor) Symbol table processor for the dumps.
+
+  Returns:
+    A list of clustered symbol offsets.
+  """
+  raw_offsets = profiles.GetProcessOffsetLists()
+  process_symbols = collections.defaultdict(list)
+  seen_symbols = set()
+  for p in raw_offsets:
+    for offsets in raw_offsets[p]:
+      symbol_names = processor.GetOrderedSymbols(
+          processor.GetReachedOffsetsFromDump(offsets))
+      process_symbols[p].append(symbol_names)
+      seen_symbols |= set(symbol_names)
+  if limit_cluster_size:
+    name_map = processor.NameToSymbolMap()
+    size_map = {name: name_map[name].size for name in seen_symbols}
+  else:
+    size_map = None
+
+  # Process names from the profile dumps that are treated specially.
+  _RENDERER = 'renderer'
+  _BROWSER = 'browser'
+
+  assert _RENDERER in process_symbols
+  assert _BROWSER in process_symbols
+
+  renderer_clustering = Clustering.ClusteredSymbolLists(
+      process_symbols[_RENDERER], size_map)
+  browser_clustering = Clustering.ClusteredSymbolLists(
+      process_symbols[_BROWSER], size_map)
+  other_lists = []
+  for process, syms in process_symbols.items():
+    if process not in (_RENDERER, _BROWSER):
+      other_lists.extend(syms)
+  if other_lists:
+    other_clustering = Clustering.ClusteredSymbolLists(other_lists, size_map)
+  else:
+    other_clustering = []
+
+  # Start with the renderer cluster to favor rendering performance.
+  final_ordering = [s for s in renderer_clustering]
+  seen = set(final_ordering)
+  final_ordering.extend(s for s in browser_clustering if s not in seen)
+  seen |= set(browser_clustering)
+  final_ordering.extend(s for s in other_clustering if s not in seen)
+
+  return final_ordering
diff --git a/tools/cygprofile/cluster_unittest.py b/tools/cygprofile/cluster_unittest.py
new file mode 100755
index 0000000..249811c
--- /dev/null
+++ b/tools/cygprofile/cluster_unittest.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env vpython
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Tests for cluster.py."""
+
+import unittest
+
+import cluster
+import process_profiles
+from test_utils import (ProfileFile,
+                        SimpleTestSymbol,
+                        TestProfileManager,
+                        TestSymbolOffsetProcessor)
+
+
+class ClusteringTestCase(unittest.TestCase):
+  def testClusterOf(self):
+    clstr = cluster.Clustering()
+    c = clstr.ClusterOf('a')
+    self.assertEqual(['a'], c.syms)
+    c = clstr._MakeCluster(['a', 'b', 'c'])
+    self.assertEqual(c, clstr.ClusterOf('a'))
+    self.assertEqual(c, clstr.ClusterOf('b'))
+    self.assertEqual(c, clstr.ClusterOf('c'))
+
+  def testClusterCombine(self):
+    clstr = cluster.Clustering()
+    x = clstr._MakeCluster(['a', 'b'])
+    self.assertEqual(x, clstr.ClusterOf('a'))
+    self.assertEqual(x, clstr.ClusterOf('b'))
+
+    y = clstr._MakeCluster(['c'])
+    self.assertEqual(y, clstr.ClusterOf('c'))
+
+    z = clstr.Combine(y, x)
+    self.assertEqual(['c', 'a', 'b'], z.syms)
+    self.assertEqual(z, clstr.ClusterOf('a'))
+    self.assertEqual(z, clstr.ClusterOf('b'))
+    self.assertEqual(z, clstr.ClusterOf('c'))
+
+  def testClusteringDistances(self):
+    c = cluster.Clustering()
+    c.NEIGHBOR_DISTANCE = 3
+    c.AddSymbolLists([list('abcd'), list('acbe'), list('bacf'),
+                      list('badf'), list('baef')])
+    distances = {}
+    for n in c._neighbors:
+      self.assertFalse((n.src, n.dst) in distances)
+      distances[(n.src, n.dst)] = n.dist
+    self.assertEqual(13, len(distances))
+    self.assertEqual((2 + 1 + 1 + 2000) / 5., distances[('a', 'c')])
+    self.assertEqual((1 + 4000) / 5., distances[('a', 'd')])
+    self.assertEqual((1 + 4000) / 5., distances[('a', 'e')])
+    self.assertEqual((2 + 2 + 2 + 2000) / 5., distances[('a', 'f')])
+    self.assertEqual(0, distances[('b', 'a')])
+    self.assertEqual((1 + -1 + 2 + 2000) / 5., distances[('b', 'c')])
+    self.assertTrue(('b', 'd') in distances)
+    self.assertTrue(('b', 'e') in distances)
+    self.assertTrue(('c', 'd') in distances)
+    self.assertTrue(('c', 'e') in distances)
+    self.assertTrue(('c', 'f') in distances)
+    self.assertTrue(('d', 'f') in distances)
+    self.assertTrue(('e', 'f') in distances)
+
+  def testClusterToList(self):
+    c = cluster.Clustering()
+    c.NEIGHBOR_DISTANCE = 3
+    c.AddSymbolLists([list('abcd'), list('acbe'), list('bacf'),
+                      list('badf'), list('baef')])
+    self.assertEqual(list('bacfed'), c.ClusterToList())
+
+  def testClusterOneList(self):
+    c = cluster.Clustering()
+    c.NEIGHBOR_DISTANCE = 3
+    c.AddSymbolLists([list('fedcba')])
+    self.assertEqual(list('fedcba'), c.ClusterToList())
+
+  def testClusterShortList(self):
+    c = cluster.Clustering()
+    c.NEIGHBOR_DISTANCE = 3
+    c.AddSymbolLists([list('ab')])
+    self.assertEqual(list('ab'), c.ClusterToList())
+
+  def testClusterReallyShortList(self):
+    c = cluster.Clustering()
+    c.NEIGHBOR_DISTANCE = 3
+    c.AddSymbolLists([list('a')])
+    self.assertEqual([], c.ClusterToList())
+
+  def testSizedClusterToList(self):
+    c = cluster.Clustering()
+    c.NEIGHBOR_DISTANCE = 3
+    c.MAX_CLUSTER_SIZE = 1  # Will supress all clusters
+    size_map = {'a': 3,
+                'b': 4,
+                'c': 5,
+                'd': 6,
+                'e': 7,
+                'f': 8}
+    c.AddSymbolLists([list('abcd'), list('acbe'), list('bacf'),
+                      list('badf'), list('baef')])
+    self.assertEqual(list('fedcba'), c.ClusterToList(size_map))
+
+
+  def testClusterOffsets(self):
+    processor = TestSymbolOffsetProcessor([
+        SimpleTestSymbol('linker_script_start_of_text', 0, 0),
+        SimpleTestSymbol('1', 1000, 999),
+        SimpleTestSymbol('2', 2000, 999),
+        SimpleTestSymbol('3', 3000, 999),
+        SimpleTestSymbol('4', 4000, 16),
+        SimpleTestSymbol('5', 5000, 16),
+        SimpleTestSymbol('6', 6000, 999),
+        SimpleTestSymbol('7', 7000, 16),
+        SimpleTestSymbol('8', 8000, 999),
+        SimpleTestSymbol('9', 9000, 16),
+    ])
+    mgr = TestProfileManager({
+        ProfileFile(40, 0, ''): [1000, 2000, 3000],
+        ProfileFile(50, 1, ''): [3000, 4000, 5000],
+        ProfileFile(51, 0, 'renderer'): [2000, 3000, 6000],
+        ProfileFile(51, 1, 'gpu-process'): [6000, 7000],
+        ProfileFile(70, 0, ''): [1000, 2000, 6000, 8000, 9000],
+        ProfileFile(70, 1, ''): [9000, 5000, 3000]})
+    syms = cluster.ClusterOffsets(mgr, processor, False)
+    self.assertListEqual(list('236148957'), syms)
+
+    syms = cluster.ClusterOffsets(mgr, processor, True)
+    self.assertListEqual(list('236489517'), syms)
+
+
+
+if __name__ == "__main__":
+  unittest.main()
diff --git a/tools/cygprofile/orderfile_generator_backend.py b/tools/cygprofile/orderfile_generator_backend.py
index 12d7091..54d5a34d 100755
--- a/tools/cygprofile/orderfile_generator_backend.py
+++ b/tools/cygprofile/orderfile_generator_backend.py
@@ -27,10 +27,10 @@
 import tempfile
 import time
 
+import cluster
 import cyglog_to_orderfile
 import cygprofile_utils
 import patch_orderfile
-import phased_orderfile
 import process_profiles
 import profile_android_startup
 import symbol_extractor
@@ -527,25 +527,11 @@
     profiles = process_profiles.ProfileManager(files)
     processor = process_profiles.SymbolOffsetProcessor(
         self._compiler.lib_chrome_so)
-    phaser = phased_orderfile.PhasedAnalyzer(profiles, processor)
-    if self._options.offsets_for_memory:
-      profile_offsets = phaser.GetOffsetsForMemoryFootprint()
-    else:
-      profile_offsets = phaser.GetOffsetsForStartup()
-    self._output_data['orderfile_size'] = {
-        'startup_kib': processor.OffsetsPrimarySize(
-            profile_offsets.startup) / 1024,
-        'common_kib': processor.OffsetsPrimarySize(
-            profile_offsets.common) / 1024,
-        'interaction_kib': processor.OffsetsPrimarySize(
-            profile_offsets.interaction) / 1024}
-
-    offsets_list = (profile_offsets.startup +
-                    profile_offsets.common +
-                    profile_offsets.interaction)
-    ordered_symbols = processor.GetOrderedSymbols(offsets_list)
+    ordered_symbols= cluster.ClusterOffsets(profiles, processor)
     if not ordered_symbols:
       raise Exception('Failed to get ordered symbols')
+    self._output_data['offsets_kib'] = processor.SymbolsSize(
+            ordered_symbols) / 1024
     with open(self._GetUnpatchedOrderfileFilename(), 'w') as orderfile:
       orderfile.write('\n'.join(ordered_symbols))
 
@@ -654,7 +640,7 @@
     Args:
       filename: (str) Orderfile to upload.
     """
-    # First compute hashes so that we can download them later if we need to
+    # First compute hashes so that we can download them later if we need to.
     self._step_recorder.BeginStep('Compute hash for ' + filename)
     self._RecordHash(filename)
     if self._options.buildbot:
@@ -830,10 +816,6 @@
   parser.add_argument('--monochrome', action='store_true',
                       help=('Compile and instrument monochrome (for post-N '
                             'devices).'))
-  parser.add_argument('--offsets-for-memory', action='store_true',
-                      help=('Favor memory savings in the orderfile. Used '
-                            'with --system-health-orderfile.'),
-                      default=False)
 
   parser.add_argument('--manual-symbol-offsets', default=None, type=str,
                       help=('File of list of ordered symbol offsets generated '
diff --git a/tools/cygprofile/phased_orderfile.py b/tools/cygprofile/phased_orderfile.py
deleted file mode 100755
index 73b20b9..0000000
--- a/tools/cygprofile/phased_orderfile.py
+++ /dev/null
@@ -1,326 +0,0 @@
-#!/usr/bin/env vpython
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Utilities for creating a phased orderfile.
-
-The profile dump format is described in process_profiles.py. These tools assume
-profiling has been done with two phases.
-
-The first phase, labeled 0 in the filename, is called "startup" and the second,
-labeled 1, is called "interaction". These two phases are used to create an
-orderfile with three parts: the code touched only in startup, the code
-touched only during interaction, and code common to the two phases. We refer to
-these parts as the orderfile phases.
-
-Example invocation, with PROFILE_DIR the location of the profile data pulled
-from a device and LIBTYPE either monochrome or chrome as appropriate.
-./tools/cygprofile/phased_orderfile.py \
-    --profile-directory=PROFILE_DIR \
-    --instrumented-build-dir=out-android/Orderfile/ \
-    --library-name=libLIBTYPE.so --offset-output-base=PROFILE_DIR/offset
-"""
-
-import argparse
-import collections
-import glob
-import itertools
-import logging
-import os.path
-
-import process_profiles
-
-
-# Files matched when using this script to analyze directly (see main()).
-PROFILE_GLOB = 'profile-hitmap-*.txt_*'
-
-
-OrderfilePhaseOffsets = collections.namedtuple(
-    'OrderfilePhaseOffsets', ('startup', 'common', 'interaction'))
-
-
-class PhasedAnalyzer(object):
-  """A class which collects analysis around phased orderfiles.
-
-  It maintains common data such as symbol table information to make analysis
-  more convenient.
-  """
-  # The process name of the browser as used in the profile dumps.
-  BROWSER = 'browser'
-
-  def __init__(self, profiles, processor):
-    """Intialize.
-
-    Args:
-      profiles (ProfileManager) Manager of the profile dump files.
-      processor (SymbolOffsetProcessor) Symbol table processor for the dumps.
-    """
-    self._profiles = profiles
-    self._processor = processor
-
-    # These members cache various computed values.
-    self._phase_offsets = None
-    self._annotated_offsets = None
-    self._process_list = None
-
-  def GetOffsetsForMemoryFootprint(self):
-    """Get offsets organized to minimize the memory footprint.
-
-    The startup, common and interaction offsets are computed for each
-    process. Any symbols used by one process in startup or interaction that are
-    used in a different phase by another process are moved to the common
-    section. This should minimize the memory footprint by keeping startup- or
-    interaction-only pages clean, at the possibly expense of startup time, as
-    more of the common section will need to be loaded. To mitigate that effect,
-    symbols moved from startup are placed at the beginning of the common
-    section, and those moved from interaction are placed at the end.
-
-    Browser startup symbols are placed at the beginning of the startup section
-    in the hope of working out with native library prefetching to minimize
-    startup time.
-
-    Returns:
-      OrdrerfilePhaseOffsets as described above.
-    """
-    startup = []
-    common_head = []
-    common = []
-    common_tail = []
-    interaction = []
-
-    process_offsets = {p: self._GetCombinedProcessOffsets(p)
-                       for p in self._GetProcessList()}
-    assert self.BROWSER in process_offsets.keys()
-
-    any_startup = set()
-    any_interaction = set()
-    any_common = set()
-    for offsets in process_offsets.itervalues():
-      any_startup |= set(offsets.startup)
-      any_interaction |= set(offsets.interaction)
-      any_common |= set(offsets.common)
-
-    already_added = set()
-    # This helper function splits |offsets|, adding to |alternate| all offsets
-    # that are in |interfering| or are already known to be common, and otherwise
-    # adding to |target|.
-    def add_process_offsets(offsets, interfering, target, alternate):
-      for o in offsets:
-        if o in already_added:
-          continue
-        if o in interfering or o in any_common:
-          alternate.append(o)
-        else:
-          target.append(o)
-        already_added.add(o)
-
-    # This helper updates |common| with new members of |offsets|.
-    def add_common_offsets(offsets):
-      for o in offsets:
-        if o not in already_added:
-          common.append(o)
-          already_added.add(o)
-
-    add_process_offsets(process_offsets[self.BROWSER].startup,
-                        any_interaction, startup, common_head)
-    add_process_offsets(process_offsets[self.BROWSER].interaction,
-                        any_startup, interaction, common_tail)
-    add_common_offsets(process_offsets[self.BROWSER].common)
-
-    for p in process_offsets:
-      if p == self.BROWSER:
-        continue
-      add_process_offsets(process_offsets[p].startup,
-                          any_interaction, startup, common_head)
-      add_process_offsets(process_offsets[p].interaction,
-                          any_startup, interaction, common_tail)
-      add_common_offsets(process_offsets[p].common)
-
-    return OrderfilePhaseOffsets(
-        startup=startup,
-        common=(common_head + common + common_tail),
-        interaction=interaction)
-
-  def GetOffsetsForStartup(self):
-    """Get offsets organized to minimize startup time.
-
-    The startup, common and interaction offsets are computed for each
-    process. Any symbol used by one process in interaction that appears in a
-    different phase in another process is moved to common, but any symbol that
-    appears in startup for *any* process stays in startup.
-
-    This should maximize startup performance at the expense of increasing the
-    memory footprint, as some startup symbols will not be able to page out.
-
-    The startup symbols in the browser process appear first in the hope of
-    working out with native library prefetching to minimize startup time.
-    """
-    startup = []
-    common = []
-    interaction = []
-    already_added = set()
-
-    process_offsets = {p: self._GetCombinedProcessOffsets(p)
-                       for p in self._GetProcessList()}
-    startup.extend(process_offsets[self.BROWSER].startup)
-    already_added |= set(process_offsets[self.BROWSER].startup)
-    common.extend(process_offsets[self.BROWSER].common)
-    already_added |= set(process_offsets[self.BROWSER].common)
-    interaction.extend(process_offsets[self.BROWSER].interaction)
-    already_added |= set(process_offsets[self.BROWSER].interaction)
-
-    for process, offsets in process_offsets.iteritems():
-      if process == self.BROWSER:
-        continue
-      startup.extend(o for o in offsets.startup
-                     if o not in already_added)
-      already_added |= set(offsets.startup)
-      common.extend(o for o in offsets.common
-                     if o not in already_added)
-      already_added |= set(offsets.common)
-      interaction.extend(o for o in offsets.interaction
-                     if o not in already_added)
-      already_added |= set(offsets.interaction)
-
-    return OrderfilePhaseOffsets(
-        startup=startup, common=common, interaction=interaction)
-
-  def _GetCombinedProcessOffsets(self, process):
-    """Combine offsets across runs for a particular process.
-
-    Args:
-      process (str) The process to combine.
-
-    Returns:
-      OrderfilePhaseOffsets, the startup, common and interaction offsets for the
-      process in question. The offsets are sorted arbitrarily.
-    """
-    (startup, common, interaction) = ([], [], [])
-    assert self._profiles.GetPhases() == set([0,1]), (
-        'Unexpected phases {}'.format(self._profiles.GetPhases()))
-    for o in self._GetAnnotatedOffsets():
-      startup_count = o.Count(0, process)
-      interaction_count = o.Count(1, process)
-      if not startup_count and not interaction_count:
-        continue
-      if startup_count and interaction_count:
-        common.append(o.Offset())
-      elif startup_count:
-        startup.append(o.Offset())
-      else:
-        interaction.append(o.Offset())
-    return OrderfilePhaseOffsets(
-        startup=startup, common=common, interaction=interaction)
-
-  def _GetAnnotatedOffsets(self):
-    if self._annotated_offsets is None:
-      self._annotated_offsets = self._profiles.GetAnnotatedOffsets()
-      self._processor.TranslateAnnotatedSymbolOffsets(self._annotated_offsets)
-      # A warning for missing offsets has already been emitted in
-      # TranslateAnnotatedSymbolOffsets.
-      self._annotated_offsets = filter(
-          lambda offset: offset.Offset() is not None,
-          self._annotated_offsets)
-    return self._annotated_offsets
-
-  def _GetProcessList(self):
-    if self._process_list is None:
-      self._process_list = set()
-      for o in self._GetAnnotatedOffsets():
-        self._process_list.update(o.Processes())
-    return self._process_list
-
-  def _GetOrderfilePhaseOffsets(self):
-    """Compute the phase offsets for each run.
-
-    Returns:
-      [OrderfilePhaseOffsets] Each run corresponds to an OrderfilePhaseOffsets,
-          which groups the symbol offsets discovered in the runs.
-    """
-    if self._phase_offsets is not None:
-      return self._phase_offsets
-
-    assert self._profiles.GetPhases() == set([0, 1]), (
-        'Unexpected phases {}'.format(self._profiles.GetPhases()))
-    self._phase_offsets = []
-    for first, second in zip(self._profiles.GetRunGroupOffsets(phase=0),
-                             self._profiles.GetRunGroupOffsets(phase=1)):
-      all_first_offsets = self._processor.GetReachedOffsetsFromDump(first)
-      all_second_offsets = self._processor.GetReachedOffsetsFromDump(second)
-      first_offsets_set = set(all_first_offsets)
-      second_offsets_set = set(all_second_offsets)
-      common_offsets_set = first_offsets_set & second_offsets_set
-      first_offsets_set -= common_offsets_set
-      second_offsets_set -= common_offsets_set
-
-      startup = [x for x in all_first_offsets
-                 if x in first_offsets_set]
-
-      interaction = [x for x in all_second_offsets
-                     if x in second_offsets_set]
-
-      common_seen = set()
-      common = []
-      for x in itertools.chain(all_first_offsets, all_second_offsets):
-        if x in common_offsets_set and x not in common_seen:
-          common_seen.add(x)
-          common.append(x)
-
-      self._phase_offsets.append(OrderfilePhaseOffsets(
-          startup=startup,
-          interaction=interaction,
-          common=common))
-
-    return self._phase_offsets
-
-
-def _CreateArgumentParser():
-  parser = argparse.ArgumentParser(
-      description='Compute statistics on phased orderfiles')
-  parser.add_argument('--profile-directory', type=str, required=True,
-                      help=('Directory containing profile runs. Files '
-                            'matching {} are used.'.format(PROFILE_GLOB)))
-  parser.add_argument('--instrumented-build-dir', type=str,
-                      help='Path to the instrumented build (eg, out/Orderfile)',
-                      required=True)
-  parser.add_argument('--library-name', default='libchrome.so',
-                      help=('Chrome shared library name (usually libchrome.so '
-                            'or libmonochrome.so'))
-  parser.add_argument('--offset-output-base', default=None, type=str,
-                      help=('If present, a base name to output offsets to. '
-                            'No offsets are output if this is missing. The '
-                            'base name is suffixed with _for_memory and '
-                            '_for_startup, corresponding to the two sets of '
-                            'offsets produced.'))
-  return parser
-
-
-def main():
-  logging.basicConfig(level=logging.INFO)
-  parser = _CreateArgumentParser()
-  args = parser.parse_args()
-  profiles = process_profiles.ProfileManager(itertools.chain.from_iterable(
-      glob.glob(os.path.join(d, PROFILE_GLOB))
-      for d in args.profile_directory.split(',')))
-  processor = process_profiles.SymbolOffsetProcessor(os.path.join(
-      args.instrumented_build_dir, 'lib.unstripped', args.library_name))
-  phaser = PhasedAnalyzer(profiles, processor)
-  for name, offsets in (
-      ('_for_memory', phaser.GetOffsetsForMemoryFootprint()),
-      ('_for_startup', phaser.GetOffsetsForStartup())):
-    logging.info('%s Offset sizes (KiB):\n'
-                 '%s startup\n%s common\n%s interaction',
-                 name, processor.OffsetsPrimarySize(offsets.startup) / 1024,
-                 processor.OffsetsPrimarySize(offsets.common) / 1024,
-                 processor.OffsetsPrimarySize(offsets.interaction) / 1024)
-    if args.offset_output_base is not None:
-      with file(args.offset_output_base + name, 'w') as output:
-        output.write('\n'.join(
-            str(i) for i in (offsets.startup + offsets.common +
-                             offsets.interaction)))
-        output.write('\n')
-
-
-if __name__ == '__main__':
-  main()
diff --git a/tools/cygprofile/phased_orderfile_unittest.py b/tools/cygprofile/phased_orderfile_unittest.py
deleted file mode 100755
index 100121c9..0000000
--- a/tools/cygprofile/phased_orderfile_unittest.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env vpython
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Tests for phased_orderfile.py."""
-
-import collections
-import unittest
-
-import phased_orderfile
-import process_profiles
-
-from test_utils import (ProfileFile,
-                        SimpleTestSymbol,
-                        TestSymbolOffsetProcessor,
-                        TestProfileManager)
-
-
-class Mod10Processor(process_profiles.SymbolOffsetProcessor):
-  """A restricted mock for a SymbolOffsetProcessor.
-
-  This only implements {Translate,Get}ReacheOffsetsFromDump, and works by
-  mapping a dump offset to offset - (offset % 10). If the dump offset is
-  negative, it is marked as not found.
-  """
-  def __init__(self):
-    super(Mod10Processor, self).__init__(None)
-
-  def _TranslateReachedOffsetsFromDump(self, items, get, update):
-    for i in items:
-      x = get(i)
-      if x >= 0:
-        update(i, x - (x % 10))
-      else:
-        update(i, None)
-
-
-class IdentityProcessor(process_profiles.SymbolOffsetProcessor):
-  """A restricted mock for a SymbolOffsetProcessor.
-
-  This only implements {Translate,Get}ReachedOffsetsFromDump, and maps the dump
-  offset to itself. If the dump offset is negative, it is marked as not found.
-  """
-  def __init__(self):
-    super(IdentityProcessor, self).__init__(None)
-
-  def _TranslateReachedOffsetsFromDump(self, items, get, update):
-    for i in items:
-      x = get(i)
-      if x >= 0:
-        update(i, x)
-      else:
-        update(i, None)
-
-
-class PhasedOrderfileTestCase(unittest.TestCase):
-
-  def setUp(self):
-    self._file_counter = 0
-
-  def testGetOrderfilePhaseOffsets(self):
-    mgr = TestProfileManager({
-        ProfileFile(0, 0): [12, 21, -1, 33],
-        ProfileFile(0, 1): [31, 49, 52],
-        ProfileFile(100, 0): [113, 128],
-        ProfileFile(200, 1): [132, 146],
-        ProfileFile(300, 0): [19, 20, 32],
-        ProfileFile(300, 1): [24, 39]})
-    phaser = phased_orderfile.PhasedAnalyzer(mgr, Mod10Processor())
-    opo = lambda s, c, i: phased_orderfile.OrderfilePhaseOffsets(
-        startup=s, common=c, interaction=i)
-    self.assertListEqual([opo([10, 20], [30], [40, 50]),
-                          opo([110, 120], [], []),
-                          opo([], [], [130, 140]),
-                          opo([10], [20, 30], [])],
-                         phaser._GetOrderfilePhaseOffsets())
-
-  def testGetCombinedProcessOffsets(self):
-    mgr = TestProfileManager({
-        ProfileFile(40, 0, ''): [1, 2, 3],
-        ProfileFile(50, 1, ''): [3, 4, 5],
-        ProfileFile(51, 0, 'renderer'): [2, 3, 6],
-        ProfileFile(51, 1, 'gpu-process'): [6, 7],
-        ProfileFile(70, 0, ''): [2, 8, 9],
-        ProfileFile(70, 1, ''): [9]})
-    phaser = phased_orderfile.PhasedAnalyzer(mgr, IdentityProcessor())
-    offsets = phaser._GetCombinedProcessOffsets('browser')
-    self.assertListEqual([1, 2, 8], sorted(offsets.startup))
-    self.assertListEqual([4, 5], sorted(offsets.interaction))
-    self.assertListEqual([3, 9], sorted(offsets.common))
-
-    offsets = phaser._GetCombinedProcessOffsets('gpu-process')
-    self.assertListEqual([], sorted(offsets.startup))
-    self.assertListEqual([6, 7], sorted(offsets.interaction))
-    self.assertListEqual([], sorted(offsets.common))
-
-    self.assertListEqual(['browser', 'gpu-process', 'renderer'],
-                         sorted(phaser._GetProcessList()))
-
-  def testGetOffsetVariations(self):
-    mgr = TestProfileManager({
-        ProfileFile(40, 0, ''): [1, 2, 3],
-        ProfileFile(50, 1, ''): [3, 4, -10, 5],
-        ProfileFile(51, 0, 'renderer'): [2, 3, 6],
-        ProfileFile(51, 1, 'gpu-process'): [6, 7],
-        ProfileFile(70, 0, ''): [2, 6, 8, 9],
-        ProfileFile(70, 1, ''): [9]})
-    phaser = phased_orderfile.PhasedAnalyzer(mgr, IdentityProcessor())
-    offsets = phaser.GetOffsetsForMemoryFootprint()
-    self.assertListEqual([1, 2, 8], offsets.startup)
-    self.assertListEqual([6, 3, 9], offsets.common)
-    self.assertListEqual([4, 5, 7], offsets.interaction)
-
-    offsets = phaser.GetOffsetsForStartup()
-    self.assertListEqual([1, 2, 6, 8], offsets.startup)
-    self.assertListEqual([3, 9], offsets.common)
-    self.assertListEqual([4, 5, 7], offsets.interaction)
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/tools/cygprofile/process_profiles.py b/tools/cygprofile/process_profiles.py
index fff34483..1da9861 100755
--- a/tools/cygprofile/process_profiles.py
+++ b/tools/cygprofile/process_profiles.py
@@ -6,6 +6,7 @@
 """Lists all the reached symbols from an instrumentation dump."""
 
 import argparse
+import collections
 import logging
 import operator
 import os
@@ -152,16 +153,17 @@
       logging.warning('%d offsets do not have matching symbol', not_found)
     return symbols
 
-  def OffsetsPrimarySize(self, offsets):
-    """Computes the total primary size of a set of offsets.
+  def SymbolsSize(self, symbols):
+    """Computes the total size of a set of symbol names.
 
     Args:
-      offsets (int iterable) a set of offsets.
+      offsets (str iterable) a set of symbols.
 
     Returns
       int The sum of the primary size of the offsets.
     """
-    return sum(self.OffsetToPrimaryMap()[x].size for x in offsets)
+    name_map = self.NameToSymbolMap()
+    return sum(name_map[sym].size for sym in symbols)
 
   def GetReachedOffsetsFromDump(self, dump):
     """Find the symbol offsets from a list of binary offsets.
@@ -231,7 +233,6 @@
       update: (lambda item, int) As described above.
     """
     dump_offset_to_symbol_info = self._GetDumpOffsetToSymbolInfo()
-    logging.info('Offset to Symbol size = %d', len(dump_offset_to_symbol_info))
     for i in items:
       dump_offset = get(i)
       idx = dump_offset / 2
@@ -421,6 +422,13 @@
               phase, process)
     return offset_map.values()
 
+  def GetProcessOffsetLists(self):
+    """Returns all symbol offsets lists, grouped by process."""
+    offsets_by_process = collections.defaultdict(list)
+    for f in self._filenames:
+      offsets_by_process[self._ProcessName(f)].append(self._ReadOffsets(f))
+    return offsets_by_process
+
   def GetRunGroupOffsets(self, phase=None):
     """Merges files from each run group and returns offset list for each.
 
@@ -451,7 +459,7 @@
   @classmethod
   def _ProcessName(cls, filename):
     # The filename starts with 'profile-hitmap-' and ends with
-    # '-PID-TIMESTAMP.text_X'. Anything in between is the process name. The
+    # '-PID-TIMESTAMP.txt_X'. Anything in between is the process name. The
     # browser has an empty process name, which is insterted here.
     process_name_parts = os.path.basename(filename).split('-')[2:-2]
     if not process_name_parts:
diff --git a/tools/cygprofile/process_profiles_unittest.py b/tools/cygprofile/process_profiles_unittest.py
index 5c4641d..d65c388 100755
--- a/tools/cygprofile/process_profiles_unittest.py
+++ b/tools/cygprofile/process_profiles_unittest.py
@@ -107,13 +107,13 @@
     self.assertListEqual(symbols[1:3],
                          processor.MatchSymbolNames(['Y', 'X']))
 
-  def testOffsetsPrimarySize(self):
+  def testSymbolsSize(self):
     symbols = [SimpleTestSymbol('W', 10, 1),
                SimpleTestSymbol('X', 20, 2),
                SimpleTestSymbol('Y', 30, 4),
                SimpleTestSymbol('Z', 40, 8)]
     processor = TestSymbolOffsetProcessor(symbols)
-    self.assertEqual(13, processor.OffsetsPrimarySize([10, 30, 40]))
+    self.assertEqual(13, processor.SymbolsSize(['W', 'Y', 'Z']))
 
   def testMedian(self):
     self.assertEquals(None, process_profiles._Median([]))
diff --git a/tools/cygprofile/profile_android_startup.py b/tools/cygprofile/profile_android_startup.py
index 32a1151..fbe4faa 100755
--- a/tools/cygprofile/profile_android_startup.py
+++ b/tools/cygprofile/profile_android_startup.py
@@ -226,6 +226,7 @@
     Args:
       files: ([str]) List of pregenerated files.
     """
+    logging.info('Using pregenerated profiles')
     self._pregenerated_profiles = files
 
   def RunCygprofileTests(self):
@@ -300,9 +301,11 @@
       NoProfileDataError: No data was found on the device.
     """
     if self._pregenerated_profiles:
-      logging.info('Using pregenerated profiles instead of running profile')
+      logging.info('Using pregenerated profiles instead of running '
+                   'system health profile')
       logging.info('Profile files: %s', '\n'.join(self._pregenerated_profiles))
       return self._pregenerated_profiles
+    logging.info('Running system health profile')
     self._SetUpDeviceFolders()
     self._RunCommand(['tools/perf/run_benchmark',
                       '--device={}'.format(self._device.serial),
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a1a269e..561fec0 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -15009,6 +15009,7 @@
   <int value="503" label="PluginVmAllowed"/>
   <int value="504" label="PluginVmImage"/>
   <int value="505" label="CloudManagementEnrollmentMandatory"/>
+  <int value="506" label="PrintingSendUsernameAndFilenameEnabled"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -17393,6 +17394,7 @@
   <int value="1294" label="CRYPTOTOKENPRIVATE_CANPROXYTOWEBAUTHN"/>
   <int value="1295" label="INPUTMETHODPRIVATE_GETSETTING"/>
   <int value="1296" label="INPUTMETHODPRIVATE_SETSETTING"/>
+  <int value="1297" label="FILEMANAGERPRIVATEINTERNAL_UNSHAREPATHWITHCROSTINI"/>
 </enum>
 
 <enum name="ExtensionIconState">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index faa5740..2862b2c 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -57203,6 +57203,14 @@
   </summary>
 </histogram>
 
+<histogram name="Net.DNS.RecordParser.DomainNameLength" units="octets">
+  <owner>dmcardle@chromium.org</owner>
+  <owner>davidben@chromium.org</owner>
+  <summary>
+    Length of domain name parsed by DnsRecordParser::ReadName().
+  </summary>
+</histogram>
+
 <histogram name="Net.DNS.ResolveCategory" enum="ResolutionCategory">
   <owner>pauljensen@chromium.org</owner>
   <owner>mef@chromium.org</owner>
@@ -117084,7 +117092,10 @@
 </histogram>
 
 <histogram name="UnifiedConsent.ConsentBump.Action"
-    enum="UnifiedConsentBumpAction" expires_after="2019-08-01">
+    enum="UnifiedConsentBumpAction">
+  <obsolete>
+    Removed 2018/11, because the consent bump was removed.
+  </obsolete>
   <owner>tangltom@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <summary>
@@ -117092,8 +117103,10 @@
   </summary>
 </histogram>
 
-<histogram name="UnifiedConsent.ConsentBump.EligibleAtStartup" enum="Boolean"
-    expires_after="2019-08-01">
+<histogram name="UnifiedConsent.ConsentBump.EligibleAtStartup" enum="Boolean">
+  <obsolete>
+    Removed 2018/11, because the consent bump was removed.
+  </obsolete>
   <owner>droger@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>tangltom@chromium.org</owner>
@@ -117105,7 +117118,10 @@
 </histogram>
 
 <histogram name="UnifiedConsent.ConsentBump.SuppressReason"
-    enum="UnifiedConsentBumpSuppressReason" expires_after="2019-08-01">
+    enum="UnifiedConsentBumpSuppressReason">
+  <obsolete>
+    Removed 2018/11, because the consent bump was removed.
+  </obsolete>
   <owner>tangltom@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <summary>
@@ -117114,8 +117130,7 @@
   </summary>
 </histogram>
 
-<histogram name="UnifiedConsent.RevokeReason" enum="UnifiedConsentRevokeReason"
-    expires_after="2019-08-01">
+<histogram name="UnifiedConsent.RevokeReason" enum="UnifiedConsentRevokeReason">
   <obsolete>
     Removed 2018/11 because it's no longer necessary.
   </obsolete>
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index dff0137..c4c474cb 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -141,7 +141,6 @@
  <item id="interest_feed_send" hash_code="76717919" type="0" content_hash_code="34678180" os_list="linux,windows" file_path="components/feed/core/feed_networking_host.cc"/>
  <item id="intranet_redirect_detector" hash_code="21785164" type="0" content_hash_code="62025595" os_list="linux,windows" file_path="chrome/browser/intranet_redirect_detector.cc"/>
  <item id="invalidation_service" hash_code="72354423" type="0" content_hash_code="78425687" os_list="linux,windows" file_path="components/invalidation/impl/gcm_network_channel.cc"/>
- <item id="journey_journey_info_json_request" hash_code="62660788" type="0" content_hash_code="77009071" os_list="linux,windows" file_path="components/journey/journey_info_json_request.cc"/>
  <item id="lib_address_input" hash_code="50816767" type="0" content_hash_code="57977576" os_list="linux,windows" file_path="third_party/libaddressinput/chromium/chrome_metadata_source.cc"/>
  <item id="logo_tracker" hash_code="36859107" type="0" content_hash_code="67588075" os_list="linux,windows" file_path="components/search_provider_logos/logo_tracker.cc"/>
  <item id="md_downloads_dom_handler" hash_code="65603364" type="0" content_hash_code="134779147" os_list="linux,windows" file_path="chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.cc"/>
diff --git a/ui/aura/window_targeter.cc b/ui/aura/window_targeter.cc
index 14665e38..0e182f2 100644
--- a/ui/aura/window_targeter.cc
+++ b/ui/aura/window_targeter.cc
@@ -29,6 +29,21 @@
          insets.bottom() >= 0;
 }
 
+void UpdateMusIfNecessary(aura::Window* window,
+                          const gfx::Insets& mouse_extend,
+                          const gfx::Insets& touch_extend) {
+  if (!window || window->env()->mode() != Env::Mode::MUS)
+    return;
+
+  // Negative insets are used solely to extend the hit-test region of child
+  // windows, which is not needed by code using MUS (negative insets are only
+  // used in the server).
+  if (AreInsetsEmptyOrPositive(mouse_extend) &&
+      AreInsetsEmptyOrPositive(touch_extend)) {
+    WindowPortMus::Get(window)->SetHitTestInsets(mouse_extend, touch_extend);
+  }
+}
+
 }  // namespace
 
 WindowTargeter::WindowTargeter() {}
@@ -224,6 +239,9 @@
 }
 
 void WindowTargeter::OnInstalled(Window* window) {
+  // Needs to clear the existing insets when uninstalled.
+  if (!window)
+    aura::UpdateMusIfNecessary(window_, gfx::Insets(), gfx::Insets());
   window_ = window;
   UpdateMusIfNecessary();
 }
@@ -334,16 +352,7 @@
 
 // TODO: this function should go away once https://crbug.com/879308 is fixed.
 void WindowTargeter::UpdateMusIfNecessary() {
-  if (!window_ || window_->env()->mode() != Env::Mode::MUS)
-    return;
-
-  // Negative insets are used solely to extend the hit-test region of child
-  // windows, which is not needed by code using MUS (negative insets are only
-  // used in the server).
-  if (AreInsetsEmptyOrPositive(mouse_extend_) &&
-      AreInsetsEmptyOrPositive(touch_extend_)) {
-    WindowPortMus::Get(window_)->SetHitTestInsets(mouse_extend_, touch_extend_);
-  }
+  aura::UpdateMusIfNecessary(window_, mouse_extend_, touch_extend_);
 }
 
 Window* WindowTargeter::FindTargetForNonKeyEvent(Window* root_window,
diff --git a/ui/file_manager/file_manager/common/js/BUILD.gn b/ui/file_manager/file_manager/common/js/BUILD.gn
index 6b93293..f62d12e 100644
--- a/ui/file_manager/file_manager/common/js/BUILD.gn
+++ b/ui/file_manager/file_manager/common/js/BUILD.gn
@@ -174,6 +174,7 @@
     "../../../externs/app_window_common.js",
     "../../../externs/entry_location.js",
     "../../../externs/platform.js",
+    "../../../externs/volume_info.js",
   ]
 }
 
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js
index ee11c97..558544697 100644
--- a/ui/file_manager/file_manager/common/js/util.js
+++ b/ui/file_manager/file_manager/common/js/util.js
@@ -1506,6 +1506,31 @@
 };
 
 /**
+ * Do not remove or modify.  Used in vm.CrostiniFiles tast tests at:
+ * https://chromium.googlesource.com/chromiumos/platform/tast-tests
+ *
+ * Get all entries for the given volume.
+ * @param {!VolumeInfo} volumeInfo
+ * @return {!Promise<Object<Entry>>} all entries keyed by fullPath.
+ */
+util.getEntries = function(volumeInfo) {
+  const root = volumeInfo.fileSystem.root;
+  return new Promise((resolve, reject) => {
+    const allEntries = {'/': root};
+    function entriesCallback(someEntries) {
+      someEntries.forEach(entry => {
+        allEntries[entry.fullPath] = entry;
+      });
+    }
+    function successCallback() {
+      resolve(allEntries);
+    }
+    util.readEntriesRecursively(
+        root, entriesCallback, successCallback, reject, () => false);
+  });
+};
+
+/**
  * Executes a functions only when the context is not the incognito one in a
  * regular session.
  * @param {function()} callback
diff --git a/ui/file_manager/file_manager/test/js/chrome_file_manager_private_test_impl.js b/ui/file_manager/file_manager/test/js/chrome_file_manager_private_test_impl.js
index 7a7d3f47..c48cb8d 100644
--- a/ui/file_manager/file_manager/test/js/chrome_file_manager_private_test_impl.js
+++ b/ui/file_manager/file_manager/test/js/chrome_file_manager_private_test_impl.js
@@ -190,6 +190,9 @@
   sharePathsWithCrostini: (entries, persist, callback) => {
     setTimeout(callback, 0);
   },
+  unsharePathWithCrostini: (entry, callback) => {
+    setTimeout(callback, 0);
+  },
   nextCopyId_: 0,
   startCopy: (entry, parentEntry, newName, callback) => {
     // Returns copyId immediately.
diff --git a/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js b/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
index 2db27ec..53b1234a 100644
--- a/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
+++ b/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
@@ -2,28 +2,25 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+'use strict';
+
 /**
  * Sets up for directory tree context menu test. In addition to normal setup, we
  * add destination directory.
  */
-function setupForDirectoryTreeContextMenuTest() {
-  var windowId;
-  return setupAndWaitUntilReady(
-      null, RootPath.DOWNLOADS).then(function(results) {
-    windowId = results.windowId;
+async function setupForDirectoryTreeContextMenuTest() {
+  const {appId} = await setupAndWaitUntilReady(null, RootPath.DOWNLOADS);
 
-    // Add destination directory.
-    return new addEntries(['local'], [new TestEntryInfo({
-                            type: EntryType.DIRECTORY,
-                            targetPath: 'destination',
-                            lastModifiedTime: 'Jan 1, 1980, 11:59 PM',
-                            nameText: 'destination',
-                            sizeText: '--',
-                            typeText: 'Folder'
-                          })]);
-  }).then(function() {
-    return windowId;
-  });
+  // Add destination directory.
+  await new addEntries(['local'], [new TestEntryInfo({
+                         type: EntryType.DIRECTORY,
+                         targetPath: 'destination',
+                         lastModifiedTime: 'Jan 1, 1980, 11:59 PM',
+                         nameText: 'destination',
+                         sizeText: '--',
+                         typeText: 'Folder'
+                       })]);
+  return appId;
 }
 
 /**
@@ -47,26 +44,28 @@
 /**
  * Clicks context menu item of id in directory tree.
  */
-function clickDirectoryTreeContextMenuItem(windowId, path, id) {
+async function clickDirectoryTreeContextMenuItem(appId, path, id) {
   const contextMenu = '#directory-tree-context-menu:not([hidden])';
   const pathQuery = `#directory-tree [full-path-for-testing="${path}"]`;
 
-  return remoteCall.callRemoteTestUtil('focus', windowId,
-      [pathQuery]).then(function(result) {
-    chrome.test.assertTrue(!!result, 'focus failed');
-    // Right click photos directory.
-    return remoteCall.callRemoteTestUtil('fakeMouseRightClick', windowId,
-            [pathQuery]);
-  }).then(function(result) {
-    chrome.test.assertTrue(!!result, 'fakeMouseRightClick failed');
-    // Check: context menu item |id| should be shown enabled.
-    return remoteCall.waitForElement(windowId,
-        `${contextMenu} [command="#${id}"]:not([disabled])`);
-  }).then(function() {
-    // Click the menu item specified by |id|.
-    return remoteCall.callRemoteTestUtil('fakeMouseClick', windowId,
-        [`${contextMenu} [command="#${id}"]`]);
-  });
+  chrome.test.assertTrue(
+      !!await remoteCall.callRemoteTestUtil('focus', appId, [pathQuery]),
+      'focus failed');
+
+  // Right click photos directory.
+  chrome.test.assertTrue(
+      !!await remoteCall.callRemoteTestUtil(
+          'fakeMouseRightClick', appId, [pathQuery]),
+      'fakeMouseRightClick failed');
+
+
+  // Check: context menu item |id| should be shown enabled.
+  await remoteCall.waitForElement(
+      appId, `${contextMenu} [command="#${id}"]:not([disabled])`);
+
+  // Click the menu item specified by |id|.
+  await remoteCall.callRemoteTestUtil(
+      'fakeMouseClick', appId, [`${contextMenu} [command="#${id}"]`]);
 }
 
 /**
@@ -74,519 +73,401 @@
  * the paste operation is done correctly or not. This method does NOT check
  * source entry is deleted or not for cut operation.
  */
-function navigateToDestinationDirectoryAndTestPaste(windowId) {
+async function navigateToDestinationDirectoryAndTestPaste(appId) {
   // Navigates to destination directory.
-  return remoteCall
-      .navigateWithDirectoryTree(
-          windowId, RootPath.DOWNLOADS_PATH + '/destination',
-          'My files/Downloads')
-      .then(function() {
-        // Confirm files before paste.
-        return remoteCall.waitForFiles(
-            windowId, ITEMS_IN_DEST_DIR_BEFORE_PASTE,
-            {ignoreLastModifiedTime: true});
-      })
-      .then(function() {
-        // Paste
-        return remoteCall.callRemoteTestUtil(
-            'fakeKeyDown', windowId,
-            ['body', 'v', true /* ctrl */, false, false]);
-      })
-      .then(function() {
-        // Confirm the photos directory is pasted correctly.
-        return remoteCall.waitForFiles(
-            windowId, ITEMS_IN_DEST_DIR_AFTER_PASTE,
-            {ignoreLastModifiedTime: true});
-      });
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/destination', 'My files/Downloads');
+
+  // Confirm files before paste.
+  await remoteCall.waitForFiles(
+      appId, ITEMS_IN_DEST_DIR_BEFORE_PASTE, {ignoreLastModifiedTime: true});
+
+  // Paste
+  await remoteCall.callRemoteTestUtil(
+      'fakeKeyDown', appId, ['body', 'v', true /* ctrl */, false, false]);
+
+  // Confirm the photos directory is pasted correctly.
+  await remoteCall.waitForFiles(
+      appId, ITEMS_IN_DEST_DIR_AFTER_PASTE, {ignoreLastModifiedTime: true});
 }
 
 /**
  * Rename photos directory to specified name by using directory tree.
  */
-function renamePhotosDirectoryTo(windowId, newName, useKeyboardShortcut) {
-  return (useKeyboardShortcut ?
-      remoteCall.callRemoteTestUtil(
-          'fakeKeyDown', windowId,
-          ['body', 'Enter', true /* ctrl */, false, false]) :
-      clickDirectoryTreeContextMenuItem(
-          windowId, RootPath.DOWNLOADS_PATH + '/photos', 'rename')
-      ).then(function() {
-    return remoteCall.waitForElement(windowId, '.tree-row > input');
-  }).then(function() {
-    return remoteCall.callRemoteTestUtil(
-        'inputText', windowId, ['.tree-row > input', newName]);
-  }).then(function() {
-    return remoteCall.callRemoteTestUtil(
-        'fakeKeyDown', windowId,
-        ['.tree-row > input', 'Enter', false, false, false]);
-  });
+async function renamePhotosDirectoryTo(appId, newName, useKeyboardShortcut) {
+  if (useKeyboardShortcut) {
+    chrome.test.assertTrue(await remoteCall.callRemoteTestUtil(
+        'fakeKeyDown', appId,
+        ['body', 'Enter', true /* ctrl */, false, false]));
+  } else {
+    await clickDirectoryTreeContextMenuItem(
+        appId, RootPath.DOWNLOADS_PATH + '/photos', 'rename');
+  }
+  await remoteCall.waitForElement(appId, '.tree-row > input');
+  await remoteCall.callRemoteTestUtil(
+      'inputText', appId, ['.tree-row > input', newName]);
+  await remoteCall.callRemoteTestUtil(
+      'fakeKeyDown', appId,
+      ['.tree-row > input', 'Enter', false, false, false]);
 }
 
 /**
  * Renames directory and confirm current directory is moved to the renamed
  * directory.
  */
-function renameDirectoryFromDirectoryTreeSuccessCase(useKeyboardShortcut) {
-  var windowId;
-  return setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    return remoteCall.navigateWithDirectoryTree(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
-  }).then(function() {
-    return renamePhotosDirectoryTo(windowId, 'New photos', useKeyboardShortcut);
-  }).then(function() {
-    // Confirm that current directory has moved to new folder.
-    return remoteCall.waitUntilCurrentDirectoryIsChanged(
-        windowId, '/My files/Downloads/New photos');
-  });
+async function renameDirectoryFromDirectoryTreeSuccessCase(
+    useKeyboardShortcut) {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
+  await renamePhotosDirectoryTo(appId, 'New photos', useKeyboardShortcut);
+
+  // Confirm that current directory has moved to new folder.
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(
+      appId, '/My files/Downloads/New photos');
 }
 
 /**
  * Renames directory and confirms that an alert dialog is shown.
  */
-function renameDirectoryFromDirectoryTreeAndConfirmAlertDialog(newName) {
-  var windowId;
-  return setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    return remoteCall.navigateWithDirectoryTree(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
-  }).then(function() {
-    return renamePhotosDirectoryTo(windowId, newName, false);
-  }).then(function() {
-    // Confirm that a dialog is shown.
-    return remoteCall.waitForElement(windowId, '.cr-dialog-container.shown');
-  });
+async function renameDirectoryFromDirectoryTreeAndConfirmAlertDialog(newName) {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
+  await renamePhotosDirectoryTo(appId, newName, false);
+
+  // Confirm that a dialog is shown.
+  await remoteCall.waitForElement(appId, '.cr-dialog-container.shown');
 }
 
 /**
  * Creates directory from directory tree.
  */
-function createDirectoryFromDirectoryTree(
+async function createDirectoryFromDirectoryTree(
     useKeyboardShortcut, changeCurrentDirectory) {
-  var windowId;
-  return setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
+  const appId = await setupForDirectoryTreeContextMenuTest();
 
-    if (changeCurrentDirectory) {
-      return remoteCall.navigateWithDirectoryTree(
-          windowId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
-    } else {
-      const downloadsQuery =
-          '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
-      return remoteCall.expandDirectoryTreeFor(windowId, downloadsQuery);
-    }
-  }).then(function() {
-    if (useKeyboardShortcut) {
-      return remoteCall.callRemoteTestUtil('fakeKeyDown', windowId,
-          ['body', 'e', true /* ctrl */, false, false]);
-    } else {
-      return clickDirectoryTreeContextMenuItem(
-          windowId, RootPath.DOWNLOADS_PATH +'/photos', 'new-folder');
-    }
-  }).then(function() {
-    return remoteCall.waitForElement(windowId, '.tree-row > input');
-  }).then(function() {
-    return remoteCall.callRemoteTestUtil(
-        'inputText', windowId, ['.tree-row > input', 'test']);
-  }).then(function() {
-    return remoteCall.callRemoteTestUtil(
-        'fakeKeyDown', windowId,
-        ['.tree-row > input', 'Enter', false, false, false]);
-  }).then(function() {
-    // Confirm that new directory is added to the directory tree.
-    return remoteCall.waitForElement(
-        windowId,
-        `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos/test"]`);
-  }).then(function() {
-    // Confirm that current directory is not changed at this timing.
-    return remoteCall.waitUntilCurrentDirectoryIsChanged(
-        windowId,
-        changeCurrentDirectory ? '/My files/Downloads/photos' :
-                                 '/My files/Downloads');
-  }).then(function() {
-    // Confirm that new directory is actually created by navigating to it.
-    return remoteCall.navigateWithDirectoryTree(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos/test',
-        'My files/Downloads');
-  });
+
+  if (changeCurrentDirectory) {
+    await remoteCall.navigateWithDirectoryTree(
+        appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
+  } else {
+    const downloadsQuery =
+        '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
+    await remoteCall.expandDirectoryTreeFor(appId, downloadsQuery);
+  }
+  if (useKeyboardShortcut) {
+    await remoteCall.callRemoteTestUtil(
+        'fakeKeyDown', appId, ['body', 'e', true /* ctrl */, false, false]);
+  } else {
+    await clickDirectoryTreeContextMenuItem(
+        appId, RootPath.DOWNLOADS_PATH + '/photos', 'new-folder');
+  }
+  await remoteCall.waitForElement(appId, '.tree-row > input');
+  await remoteCall.callRemoteTestUtil(
+      'inputText', appId, ['.tree-row > input', 'test']);
+  await remoteCall.callRemoteTestUtil(
+      'fakeKeyDown', appId,
+      ['.tree-row > input', 'Enter', false, false, false]);
+
+  // Confirm that new directory is added to the directory tree.
+  await remoteCall.waitForElement(
+      appId,
+      `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos/test"]`);
+
+  // Confirm that current directory is not changed at this timing.
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(
+      appId,
+      changeCurrentDirectory ? '/My files/Downloads/photos' :
+                               '/My files/Downloads');
+
+  // Confirm that new directory is actually created by navigating to it.
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos/test', 'My files/Downloads');
 }
 
 /**
  * Tests copying a directory from directory tree with context menu.
  */
-testcase.dirCopyWithContextMenu = function() {
-  var windowId;
-  testPromise(setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    return remoteCall.navigateWithDirectoryTree(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
-  }).then(function() {
-    return clickDirectoryTreeContextMenuItem(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'copy');
-  }).then(function() {
-    return navigateToDestinationDirectoryAndTestPaste(windowId);
-  }));
+testcase.dirCopyWithContextMenu = async function() {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
+  await clickDirectoryTreeContextMenuItem(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'copy');
+  await navigateToDestinationDirectoryAndTestPaste(appId);
 };
 
 /**
  * Tests copying a directory from directory tree with the keyboard shortcut.
  */
-testcase.dirCopyWithKeyboard = function() {
-  var windowId;
-  testPromise(setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    return remoteCall.navigateWithDirectoryTree(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
-  }).then(function() {
-    // Press Ctrl+C.
-    return remoteCall.callRemoteTestUtil('fakeKeyDown', windowId,
-        ['body', 'c', true /* ctrl */, false, false]);
-  }).then(function() {
-    return navigateToDestinationDirectoryAndTestPaste(windowId);
-  }));
+testcase.dirCopyWithKeyboard = async function() {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
+
+  // Press Ctrl+C.
+  await remoteCall.callRemoteTestUtil(
+      'fakeKeyDown', appId, ['body', 'c', true /* ctrl */, false, false]);
+  await navigateToDestinationDirectoryAndTestPaste(appId);
 };
 
 /**
  * Tests copying a directory without changing the current directory.
  */
-testcase.dirCopyWithoutChangingCurrent = function() {
-  var windowId;
-  testPromise(setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    const downloadsQuery =
-        '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
-    return remoteCall.expandTreeItemInDirectoryTree(windowId, downloadsQuery);
-  }).then(function(result) {
-    return clickDirectoryTreeContextMenuItem(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'copy');
-  }).then(function() {
-    return navigateToDestinationDirectoryAndTestPaste(windowId);
-  }));
+testcase.dirCopyWithoutChangingCurrent = async function() {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+
+  const downloadsQuery =
+      '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
+  await remoteCall.expandTreeItemInDirectoryTree(appId, downloadsQuery);
+  await clickDirectoryTreeContextMenuItem(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'copy');
+  await navigateToDestinationDirectoryAndTestPaste(appId);
 };
 
 /**
  * Tests cutting a directory with the context menu.
  */
-testcase.dirCutWithContextMenu = function() {
-  var windowId;
-  testPromise(setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    return remoteCall.navigateWithDirectoryTree(
-        windowId,  RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
-  }).then(function() {
-    return clickDirectoryTreeContextMenuItem(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'cut');
-  }).then(function() {
-    return navigateToDestinationDirectoryAndTestPaste(windowId);
-  }).then(function() {
-    // Confirm that directory tree is updated.
-    return remoteCall.waitForElementLost(
-        windowId,
-        `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
-  }));
+testcase.dirCutWithContextMenu = async function() {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
+  await clickDirectoryTreeContextMenuItem(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'cut');
+  await navigateToDestinationDirectoryAndTestPaste(appId);
+
+  // Confirm that directory tree is updated.
+  await remoteCall.waitForElementLost(
+      appId, `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
 };
 
 /**
  * Tests cutting a directory with the keyboard shortcut.
  */
-testcase.dirCutWithKeyboard = function() {
-  var windowId;
-  testPromise(setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    return remoteCall.navigateWithDirectoryTree(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
-  }).then(function() {
-    // Press Ctrl+X.
-    return remoteCall.callRemoteTestUtil('fakeKeyDown', windowId,
-        ['body', 'x', true /* ctrl */, false, false]);
-  }).then(function() {
-    return navigateToDestinationDirectoryAndTestPaste(windowId);
-  }).then(function() {
-     // Confirm that directory tree is updated.
-    return remoteCall.waitForElementLost(
-        windowId,
-        `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
-  }));
+testcase.dirCutWithKeyboard = async function() {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
+
+  // Press Ctrl+X.
+  await remoteCall.callRemoteTestUtil(
+      'fakeKeyDown', appId, ['body', 'x', true /* ctrl */, false, false]);
+  await navigateToDestinationDirectoryAndTestPaste(appId);
+
+  // Confirm that directory tree is updated.
+  await remoteCall.waitForElementLost(
+      appId, `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
 };
 
 /**
  * Tests cutting a directory without changing the current directory.
  */
-testcase.dirCutWithoutChangingCurrent = function() {
-  var windowId;
-  testPromise(setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    const downloadsQuery =
-        '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
-    return remoteCall.expandTreeItemInDirectoryTree(windowId, downloadsQuery);
-  }).then(function() {
-    return clickDirectoryTreeContextMenuItem(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'cut');
-  }).then(function() {
-    return navigateToDestinationDirectoryAndTestPaste(windowId);
-  }).then(function() {
-    return remoteCall.waitForElementLost(
-        windowId,
-        `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
-  }));
+testcase.dirCutWithoutChangingCurrent = async function() {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+
+  const downloadsQuery =
+      '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
+  await remoteCall.expandTreeItemInDirectoryTree(appId, downloadsQuery);
+  await clickDirectoryTreeContextMenuItem(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'cut');
+  await navigateToDestinationDirectoryAndTestPaste(appId);
+  await remoteCall.waitForElementLost(
+      appId, `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
 };
 
 /**
  * Tests pasting into folder with the context menu.
  */
-testcase.dirPasteWithContextMenu = function() {
-  var windowId;
+testcase.dirPasteWithContextMenu = async function() {
+  const appId = await setupForDirectoryTreeContextMenuTest();
   const destinationPath = RootPath.DOWNLOADS_PATH + '/destination';
-  testPromise(
-      setupForDirectoryTreeContextMenuTest()
-          .then(function(id) {
-            // Copy photos directory as a test data.
-            windowId = id;
-            return remoteCall.navigateWithDirectoryTree(
-                windowId, RootPath.DOWNLOADS_PATH + '/photos',
-                'My files/Downloads');
-          })
-          .then(function() {
-            return remoteCall.callRemoteTestUtil(
-                'fakeKeyDown', windowId,
-                ['body', 'c', true /* ctrl */, false, false]);
-          })
-          .then(function() {
-            return remoteCall.navigateWithDirectoryTree(
-                windowId, RootPath.DOWNLOADS_PATH + '/destination',
-                'My files/Downloads');
-          })
-          .then(function() {
-            // Confirm files before paste.
-            return remoteCall.waitForFiles(
-                windowId, ITEMS_IN_DEST_DIR_BEFORE_PASTE,
-                {ignoreLastModifiedTime: true});
-          })
-          .then(function() {
-            return clickDirectoryTreeContextMenuItem(
-                windowId, RootPath.DOWNLOADS_PATH + '/destination',
-                'paste-into-folder');
-          })
-          .then(function() {
-            // Confirm the photos directory is pasted correctly.
-            return remoteCall.waitForFiles(
-                windowId, ITEMS_IN_DEST_DIR_AFTER_PASTE,
-                {ignoreLastModifiedTime: true});
-          })
-          .then(function() {
-            // Expand the directory tree.
-            return remoteCall.waitForElement(
-                windowId,
-                `[full-path-for-testing="${destinationPath}"] .expand-icon`);
-          })
-          .then(function() {
-            return remoteCall.callRemoteTestUtil(
-                'fakeMouseClick', windowId,
-                [`[full-path-for-testing="${destinationPath}"] .expand-icon`]);
-          })
-          .then(function() {
-            // Confirm the copied directory is added to the directory tree.
-            return remoteCall.waitForElement(
-                windowId,
-                `[full-path-for-testing="${destinationPath}/photos"]`);
-          }));
+
+  // Copy photos directory as a test data.
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'My files/Downloads');
+  await remoteCall.callRemoteTestUtil(
+      'fakeKeyDown', appId, ['body', 'c', true /* ctrl */, false, false]);
+  await remoteCall.navigateWithDirectoryTree(
+      appId, destinationPath, 'My files/Downloads');
+
+  // Confirm files before paste.
+  await remoteCall.waitForFiles(
+      appId, ITEMS_IN_DEST_DIR_BEFORE_PASTE, {ignoreLastModifiedTime: true});
+
+  await clickDirectoryTreeContextMenuItem(
+      appId, destinationPath, 'paste-into-folder');
+
+  // Confirm the photos directory is pasted correctly.
+  await remoteCall.waitForFiles(
+      appId, ITEMS_IN_DEST_DIR_AFTER_PASTE, {ignoreLastModifiedTime: true});
+
+  // Expand the directory tree.
+  await remoteCall.waitForElement(
+      appId, `[full-path-for-testing="${destinationPath}"] .expand-icon`);
+  await remoteCall.callRemoteTestUtil(
+      'fakeMouseClick', appId,
+      [`[full-path-for-testing="${destinationPath}"] .expand-icon`]);
+
+  // Confirm the copied directory is added to the directory tree.
+  await remoteCall.waitForElement(
+      appId, `[full-path-for-testing="${destinationPath}/photos"]`);
 };
 
 /**
  * Tests pasting into a folder without changing the current directory.
  */
-testcase.dirPasteWithoutChangingCurrent = function() {
-  var windowId;
+testcase.dirPasteWithoutChangingCurrent = async function() {
   const destinationPath = RootPath.DOWNLOADS_PATH + '/destination';
   const downloadsQuery =
       '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
-  testPromise(setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    return remoteCall.expandDirectoryTreeFor(windowId, downloadsQuery);
-  }).then(function() {
-    return remoteCall.callRemoteTestUtil(
-        'fakeMouseClick', windowId,
-        [`${downloadsQuery} .expand-icon`]);
-  }).then((result) => {
-    chrome.test.assertTrue(result, 'click on expand icon failed');
-    return remoteCall.waitForElement(windowId, downloadsQuery + '[expanded]');
-  }).then(() => {
-    return remoteCall.callRemoteTestUtil(
-        'focus', windowId, ['#directory-tree']);
-  }).then(function(result) {
-    return clickDirectoryTreeContextMenuItem(
-        windowId, RootPath.DOWNLOADS_PATH + '/photos', 'copy');
-  }).then(function() {
-    return clickDirectoryTreeContextMenuItem(
-        windowId, destinationPath, 'paste-into-folder');
-  }).then(function() {
-    return remoteCall.waitForElement(windowId,
-        `[full-path-for-testing="${destinationPath}"][may-have-children]`);
-  }).then(function() {
-    return remoteCall.callRemoteTestUtil('fakeMouseClick', windowId,
-        [`[full-path-for-testing="${destinationPath}"] .expand-icon`]);
-  }).then(function() {
-    // Confirm the copied directory is added to the directory tree.
-    return remoteCall.waitForElement(windowId,
-        `[full-path-for-testing="${destinationPath}/photos"]`);
-  }));
+
+  const appId = await setupForDirectoryTreeContextMenuTest();
+  await remoteCall.expandDirectoryTreeFor(appId, downloadsQuery);
+  chrome.test.assertTrue(
+      await remoteCall.callRemoteTestUtil(
+          'fakeMouseClick', appId, [`${downloadsQuery} .expand-icon`]),
+      'click on expand icon failed');
+  await remoteCall.waitForElement(appId, downloadsQuery + '[expanded]');
+  await remoteCall.callRemoteTestUtil('focus', appId, ['#directory-tree']);
+  await clickDirectoryTreeContextMenuItem(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'copy');
+  await clickDirectoryTreeContextMenuItem(
+      appId, destinationPath, 'paste-into-folder');
+  await remoteCall.waitForElement(
+      appId, `[full-path-for-testing="${destinationPath}"][may-have-children]`);
+  await remoteCall.callRemoteTestUtil(
+      'fakeMouseClick', appId,
+      [`[full-path-for-testing="${destinationPath}"] .expand-icon`]);
+
+  // Confirm the copied directory is added to the directory tree.
+  await remoteCall.waitForElement(
+      appId, `[full-path-for-testing="${destinationPath}/photos"]`);
 };
 
 /**
  * Tests renaming a folder with the context menu.
  */
 testcase.dirRenameWithContextMenu = function() {
-  testPromise(renameDirectoryFromDirectoryTreeSuccessCase(
-      false /* do not use keyboard shortcut */));
+  return renameDirectoryFromDirectoryTreeSuccessCase(
+      false /* do not use keyboard shortcut */);
 };
 
 /**
  * Tests that a child folder breadcrumbs is updated when renaming its parent
  * folder. crbug.com/885328.
  */
-testcase.dirRenameUpdateChildrenBreadcrumbs = function() {
-  let appId;
-  testPromise(
-      setupAndWaitUntilReady(null, RootPath.DOWNLOADS)
-          .then(function(results) {
-            appId = results.windowId;
+testcase.dirRenameUpdateChildrenBreadcrumbs = async function() {
+  const {appId} = await setupAndWaitUntilReady(null, RootPath.DOWNLOADS);
 
-            // Add child-folder inside /photos/
-            return new addEntries(['local'], [new TestEntryInfo({
-                                    type: EntryType.DIRECTORY,
-                                    targetPath: 'photos/child-folder',
-                                    lastModifiedTime: 'Jan 1, 1980, 11:59 PM',
-                                    nameText: 'child-folder',
-                                    sizeText: '--',
-                                    typeText: 'Folder'
-                                  })]);
-          })
-          .then(function() {
-            // Navigate to child folder.
-            return remoteCall.navigateWithDirectoryTree(
-                appId, RootPath.DOWNLOADS_PATH + '/photos/child-folder',
-                'My files/Downloads');
-          })
-          .then(function() {
-            // Rename parent folder.
-            return clickDirectoryTreeContextMenuItem(
-                appId, RootPath.DOWNLOADS_PATH + '/photos', 'rename')
-                .then(function() {
-                  return remoteCall.waitForElement(appId, '.tree-row > input');
-                })
-                .then(function() {
-                  return remoteCall.callRemoteTestUtil(
-                      'inputText', appId, ['.tree-row > input', 'photos-new']);
-                })
-                .then(function() {
-                  const enterKey = [
-                    '.tree-row > input', 'Enter', false, false, false
-                  ];
-                  return remoteCall.callRemoteTestUtil(
-                      'fakeKeyDown', appId, enterKey);
-                })
-                .then(function(result) {
-                  chrome.test.assertTrue(result, 'Enter key failed');
-                });
-          })
-          .then(function() {
-            // Confirm that current directory is now My files or /Downloads,
-            // because it can't find the previously selected folder
-            // /Downloads/photos/child-folder, since its path/parent has been
-            // renamed.
-            let volumeFolder = '/My files/Downloads';
-            // TODO(lucmult): Remove this conditional once MyFilesVolume is
-            // rolled out.
-            if (RootPath.DOWNLOADS_PATH === '/Downloads')
-              volumeFolder = '/My files';
+  // Add child-folder inside /photos/
+  await new addEntries(['local'], [new TestEntryInfo({
+                         type: EntryType.DIRECTORY,
+                         targetPath: 'photos/child-folder',
+                         lastModifiedTime: 'Jan 1, 1980, 11:59 PM',
+                         nameText: 'child-folder',
+                         sizeText: '--',
+                         typeText: 'Folder'
+                       })]);
 
-            return remoteCall.waitUntilCurrentDirectoryIsChanged(
-                appId, volumeFolder);
-          })
-          .then(function() {
-            // Navigate to child-folder using the new path.
-            // |navigateWithDirectoryTree| already checks for breadcrumbs to
-            // match the path.
-            return remoteCall.navigateWithDirectoryTree(
-                appId, RootPath.DOWNLOADS_PATH + '/photos-new/child-folder',
-                'My files/Downloads');
-          }));
+  // Navigate to child folder.
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos/child-folder',
+      'My files/Downloads');
+
+  // Rename parent folder.
+  await clickDirectoryTreeContextMenuItem(
+      appId, RootPath.DOWNLOADS_PATH + '/photos', 'rename');
+  await remoteCall.waitForElement(appId, '.tree-row > input');
+  await remoteCall.callRemoteTestUtil(
+      'inputText', appId, ['.tree-row > input', 'photos-new']);
+  const enterKey = ['.tree-row > input', 'Enter', false, false, false];
+  chrome.test.assertTrue(
+      await remoteCall.callRemoteTestUtil('fakeKeyDown', appId, enterKey),
+      'Enter key failed');
+
+
+  // Confirm that current directory is now My files or /Downloads, because it
+  // can't find the previously selected folder /Downloads/photos/child-folder,
+  // since its path/parent has been renamed.
+  // TODO(lucmult): Remove this conditional once MyFilesVolume is rolled out.
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(
+      appId,
+      RootPath.DOWNLOADS_PATH === '/Downloads' ? '/My files' :
+                                                 '/My files/Downloads');
+
+  // Navigate to child-folder using the new path.
+  // |navigateWithDirectoryTree| already checks for breadcrumbs to
+  // match the path.
+  await remoteCall.navigateWithDirectoryTree(
+      appId, RootPath.DOWNLOADS_PATH + '/photos-new/child-folder',
+      'My files/Downloads');
 };
 
 /**
  * Tests renaming folder with the keyboard shortcut.
  */
 testcase.dirRenameWithKeyboard = function() {
-  testPromise(renameDirectoryFromDirectoryTreeSuccessCase(
-      true /* use keyboard shortcut */));
+  return renameDirectoryFromDirectoryTreeSuccessCase(
+      true /* use keyboard shortcut */);
 };
 
 /**
  * Tests renaming folder without changing the current directory.
  */
-testcase.dirRenameWithoutChangingCurrent = function() {
-  var windowId;
-  testPromise(setupForDirectoryTreeContextMenuTest().then(function(id) {
-    windowId = id;
-    const downloadsQuery =
-        '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
-    return remoteCall.expandDirectoryTreeFor(windowId, downloadsQuery);
-  }).then(function() {
-    return remoteCall.waitForElement(
-        windowId,
-        `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
-  }).then(function() {
-    return renamePhotosDirectoryTo(
-        windowId, 'New photos', false /* Do not use keyboard shortcut. */);
-  }).then(function() {
-    return remoteCall.waitForElementLost(
-        windowId,
-        `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
-  }).then(function() {
-    return remoteCall.waitForElement(
-        windowId,
-        `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/New photos"]`);
-  }));
+testcase.dirRenameWithoutChangingCurrent = async function() {
+  const appId = await setupForDirectoryTreeContextMenuTest();
+  const downloadsQuery =
+      '#directory-tree [entry-label="My files"] [entry-label="Downloads"]';
+  await remoteCall.expandTreeItemInDirectoryTree(appId, downloadsQuery);
+  await remoteCall.waitForElement(
+      appId, `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
+  await renamePhotosDirectoryTo(
+      appId, 'New photos', false /* Do not use keyboard shortcut. */);
+  await remoteCall.waitForElementLost(
+      appId, `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/photos"]`);
+  await remoteCall.waitForElement(
+      appId, `[full-path-for-testing="${RootPath.DOWNLOADS_PATH}/New photos"]`);
 };
 
 /**
  * Tests renaming a folder to an empty string.
  */
 testcase.dirRenameToEmptyString = function() {
-  testPromise(renameDirectoryFromDirectoryTreeAndConfirmAlertDialog(''));
+  return renameDirectoryFromDirectoryTreeAndConfirmAlertDialog('');
 };
 
 /**
  * Tests renaming folder an existing name.
  */
 testcase.dirRenameToExisting = function() {
-  testPromise(renameDirectoryFromDirectoryTreeAndConfirmAlertDialog(
-      'destination'));
+  return renameDirectoryFromDirectoryTreeAndConfirmAlertDialog('destination');
 };
 
 /**
  * Tests creating a folder with the context menu.
  */
 testcase.dirCreateWithContextMenu = function() {
-  testPromise(createDirectoryFromDirectoryTree(
+  return createDirectoryFromDirectoryTree(
       false /* do not use keyboard shortcut */,
-      true /* change current directory */));
+      true /* change current directory */);
 };
 
 /**
  * Tests creating a folder with the keyboard shortcut.
  */
 testcase.dirCreateWithKeyboard = function() {
-  testPromise(createDirectoryFromDirectoryTree(
-      true /* use keyboard shortcut */,
-      true /* change current directory */));
+  return createDirectoryFromDirectoryTree(
+      true /* use keyboard shortcut */, true /* change current directory */);
 };
 
 /**
  * Tests creating folder without changing the current directory.
  */
 testcase.dirCreateWithoutChangingCurrent = function() {
-  testPromise(createDirectoryFromDirectoryTree(
+  return createDirectoryFromDirectoryTree(
       false /* Do not use keyboard shortcut */,
-      false /* Do not change current directory */));
+      false /* Do not change current directory */);
 };
diff --git a/ui/file_manager/integration_tests/file_manager/file_dialog.js b/ui/file_manager/integration_tests/file_manager/file_dialog.js
index 13c5404f..c8ceed2 100644
--- a/ui/file_manager/integration_tests/file_manager/file_dialog.js
+++ b/ui/file_manager/integration_tests/file_manager/file_dialog.js
@@ -13,11 +13,9 @@
  * @param {!string} dialog ID of the file dialog window.
  * @return {!Promise} Promise to be fulfilled on success.
  */
-function sendOpenFileDialogKey(name, key, dialog) {
-  return remoteCall.callRemoteTestUtil('selectFile', dialog, [name])
-      .then(function sendDialogKeyEvent() {
-        return remoteCall.callRemoteTestUtil('fakeKeyDown', dialog, key);
-      });
+async function sendOpenFileDialogKey(name, key, dialog) {
+  await remoteCall.callRemoteTestUtil('selectFile', dialog, [name]);
+  await remoteCall.callRemoteTestUtil('fakeKeyDown', dialog, key);
 }
 
 /**
@@ -29,15 +27,11 @@
  * @param {!string} dialog ID of the file dialog window.
  * @return {!Promise} Promise to be fulfilled on success.
  */
-function clickOpenFileDialogButton(name, button, dialog) {
-  return remoteCall.callRemoteTestUtil('selectFile', dialog, [name])
-      .then(function awaitDialogButton() {
-        return remoteCall.waitForElement(dialog, button);
-      })
-      .then(function sendButtonClickEvent() {
-        const event = [button, 'click'];
-        return remoteCall.callRemoteTestUtil('fakeEvent', dialog, event);
-      });
+async function clickOpenFileDialogButton(name, button, dialog) {
+  await remoteCall.callRemoteTestUtil('selectFile', dialog, [name]);
+  await remoteCall.waitForElement(dialog, button);
+  const event = [button, 'click'];
+  await remoteCall.callRemoteTestUtil('fakeEvent', dialog, event);
 }
 
 /**
@@ -48,16 +42,13 @@
  * @param {string} element Element to query for drawing.
  * @return {!Promise} Promise to be fulfilled on success.
  */
-function unloadOpenFileDialog(dialog, element = '.button-panel button.ok') {
-  return remoteCall.waitForElement(dialog, element).then(() => {
-    return remoteCall.callRemoteTestUtil('unload', dialog, [])
-        .then(function getDialogErrorCount() {
-          return remoteCall.callRemoteTestUtil('getErrorCount', dialog, []);
-        })
-        .then(function expectNoDialogErrors(errorCount) {
-          chrome.test.assertEq(0, errorCount);
-        });
-  });
+async function unloadOpenFileDialog(
+    dialog, element = '.button-panel button.ok') {
+  await remoteCall.waitForElement(dialog, element);
+  await remoteCall.callRemoteTestUtil('unload', dialog, []);
+  const errorCount =
+      await remoteCall.callRemoteTestUtil('getErrorCount', dialog, []);
+  chrome.test.assertEq(0, errorCount);
 }
 
 /**
@@ -68,17 +59,15 @@
  * @return {!Promise} Promise to resolve({Array<TestEntryInfo>}) on success,
  *    the Array being the basic file entry set of the |volume|.
  */
-function createFileEntryPromise(volume) {
+async function setUpFileEntrySet(volume) {
   let localEntryPromise = addEntries(['local'], BASIC_LOCAL_ENTRY_SET);
   let driveEntryPromise = addEntries(
       ['drive'], [ENTRIES.hello, ENTRIES.pinned, ENTRIES.testDocument]);
 
-  return Promise.all([localEntryPromise, driveEntryPromise])
-      .then(function returnVolumeEntrySet() {
-        if (volume == 'drive')
-          return [ENTRIES.hello, ENTRIES.pinned, ENTRIES.testDocument];
-        return BASIC_LOCAL_ENTRY_SET;
-      });
+  await Promise.all([localEntryPromise, driveEntryPromise]);
+  if (volume == 'drive')
+    return [ENTRIES.hello, ENTRIES.pinned, ENTRIES.testDocument];
+  return BASIC_LOCAL_ENTRY_SET;
 }
 
 /**
@@ -89,24 +78,21 @@
  * @param {!string} name File name to select in the dialog.
  * @return {!Promise} Promise to be fulfilled on success.
  */
-function openFileDialogClickOkButton(volume, name, expectedUrl = undefined) {
+async function openFileDialogClickOkButton(
+    volume, name, expectedUrl = undefined) {
   const type = {type: 'openFile'};
 
   const okButton = '.button-panel button.ok:enabled';
   let closer = clickOpenFileDialogButton.bind(null, name, okButton);
 
-  return createFileEntryPromise(volume)
-      .then(function openFileDialog(entrySet) {
-        return openAndWaitForClosingDialog(
-            type, volume, entrySet, closer, !!expectedUrl);
-      })
-      .then(function expectDialogFileEntry(result) {
-        if (expectedUrl) {
-          chrome.test.assertEq(expectedUrl, result);
-        } else {
-          chrome.test.assertEq(name, result.name);
-        }
-      });
+  const entrySet = await setUpFileEntrySet(volume);
+  const result = await openAndWaitForClosingDialog(
+      type, volume, entrySet, closer, !!expectedUrl);
+  if (expectedUrl) {
+    chrome.test.assertEq(expectedUrl, result);
+  } else {
+    chrome.test.assertEq(name, result.name);
+  }
 }
 
 /**
@@ -118,33 +104,24 @@
  * @param {!string} name File name to select in the dialog.
  * @return {!Promise} Promise to be fulfilled on success.
  */
-function openFileDialogExpectOkButtonDisabled(volume, name, pinnedName) {
+async function openFileDialogExpectOkButtonDisabled(volume, name, pinnedName) {
   const type = {type: 'openFile'};
 
   const okButton = '.button-panel button.ok:enabled';
   const disabledOkButton = '.button-panel button.ok:disabled';
   const cancelButton = '.button-panel button.cancel';
-  let closer = dialog => {
-    return remoteCall.callRemoteTestUtil('selectFile', dialog, [pinnedName])
-        .then(function awaitDialogButton() {
-          return remoteCall.waitForElement(dialog, okButton);
-        })
-        .then(() => remoteCall.callRemoteTestUtil('selectFile', dialog, [name]))
-        .then(function awaitDialogButton() {
-          return remoteCall.waitForElement(dialog, disabledOkButton);
-        })
-        .then(() => {
-          clickOpenFileDialogButton(name, cancelButton, dialog);
-        });
+  let closer = async (dialog) => {
+    await remoteCall.callRemoteTestUtil('selectFile', dialog, [pinnedName]);
+    await remoteCall.waitForElement(dialog, okButton);
+    await remoteCall.callRemoteTestUtil('selectFile', dialog, [name]);
+    await remoteCall.waitForElement(dialog, disabledOkButton);
+    clickOpenFileDialogButton(name, cancelButton, dialog);
   };
 
-  return createFileEntryPromise(volume)
-      .then(function openFileDialog(entrySet) {
-        return openAndWaitForClosingDialog(type, volume, entrySet, closer);
-      })
-      .then(function expectDialogFileEntry(result) {
-        chrome.test.assertEq(undefined, result);
-      });
+  const entrySet = await setUpFileEntrySet(volume);
+  chrome.test.assertEq(
+      undefined,
+      await openAndWaitForClosingDialog(type, volume, entrySet, closer));
 }
 
 /**
@@ -155,19 +132,16 @@
  * @param {!string} name File name to select in the dialog.
  * @return {!Promise} Promise to be fulfilled on success.
  */
-function openFileDialogClickCancelButton(volume, name) {
+async function openFileDialogClickCancelButton(volume, name) {
   const type = {type: 'openFile'};
 
   const cancelButton = '.button-panel button.cancel';
   let closer = clickOpenFileDialogButton.bind(null, name, cancelButton);
 
-  return createFileEntryPromise(volume)
-      .then(function openFileDialog(entrySet) {
-        return openAndWaitForClosingDialog(type, volume, entrySet, closer);
-      })
-      .then(function expectDialogCancelled(result) {
-        chrome.test.assertEq(undefined, result);
-      });
+  const entrySet = await setUpFileEntrySet(volume);
+  chrome.test.assertEq(
+      undefined,
+      await openAndWaitForClosingDialog(type, volume, entrySet, closer));
 }
 
 /**
@@ -178,19 +152,16 @@
  * @param {!string} name File name to select in the dialog.
  * @return {!Promise} Promise to be fulfilled on success.
  */
-function openFileDialogSendEscapeKey(volume, name) {
+async function openFileDialogSendEscapeKey(volume, name) {
   const type = {type: 'openFile'};
 
   const escapeKey = ['#file-list', 'Escape', false, false, false];
   let closer = sendOpenFileDialogKey.bind(null, name, escapeKey);
 
-  return createFileEntryPromise(volume)
-      .then(function openFileDialog(entrySet) {
-        return openAndWaitForClosingDialog(type, volume, entrySet, closer);
-      })
-      .then(function expectDialogCancelled(result) {
-        chrome.test.assertEq(undefined, result);
-      });
+  const entrySet = await setUpFileEntrySet(volume);
+  chrome.test.assertEq(
+      undefined,
+      await openAndWaitForClosingDialog(type, volume, entrySet, closer));
 }
 
 /**
@@ -203,21 +174,21 @@
  * Tests opening file dialog on Downloads and closing it with Ok button.
  */
 testcase.openFileDialogDownloads = function() {
-  testPromise(openFileDialogClickOkButton('downloads', TEST_LOCAL_FILE));
+  return openFileDialogClickOkButton('downloads', TEST_LOCAL_FILE);
 };
 
 /**
  * Tests opening file dialog on Downloads and closing it with Cancel button.
  */
 testcase.openFileDialogCancelDownloads = function() {
-  testPromise(openFileDialogClickCancelButton('downloads', TEST_LOCAL_FILE));
+  return openFileDialogClickCancelButton('downloads', TEST_LOCAL_FILE);
 };
 
 /**
  * Tests opening file dialog on Downloads and closing it with ESC key.
  */
 testcase.openFileDialogEscapeDownloads = function() {
-  testPromise(openFileDialogSendEscapeKey('downloads', TEST_LOCAL_FILE));
+  return openFileDialogSendEscapeKey('downloads', TEST_LOCAL_FILE);
 };
 
 /**
@@ -236,22 +207,22 @@
  * Tests opening file dialog on Drive and closing it with Ok button.
  */
 testcase.openFileDialogDrive = function() {
-  testPromise(openFileDialogClickOkButton('drive', TEST_DRIVE_FILE));
+  return openFileDialogClickOkButton('drive', TEST_DRIVE_FILE);
 };
 
 /**
  * Tests opening file dialog on Drive and closing it with Ok button.
  */
 testcase.openFileDialogDriveOffline = function() {
-  testPromise(openFileDialogExpectOkButtonDisabled(
-      'drive', TEST_DRIVE_FILE, TEST_DRIVE_PINNED_FILE));
+  return openFileDialogExpectOkButtonDisabled(
+      'drive', TEST_DRIVE_FILE, TEST_DRIVE_PINNED_FILE);
 };
 
 /**
  * Tests opening file dialog on Drive and closing it with Ok button.
  */
 testcase.openFileDialogDriveOfflinePinned = function() {
-  testPromise(openFileDialogClickOkButton('drive', TEST_DRIVE_PINNED_FILE));
+  return openFileDialogClickOkButton('drive', TEST_DRIVE_PINNED_FILE);
 };
 
 /**
@@ -259,32 +230,30 @@
  * the doc's URL.
  */
 testcase.openFileDialogDriveHostedDoc = function() {
-  testPromise(openFileDialogClickOkButton(
+  return openFileDialogClickOkButton(
       'drive', ENTRIES.testDocument.nameText,
-      'https://document_alternate_link/Test%20Document'));
+      'https://document_alternate_link/Test%20Document');
 };
 
 /**
  * Tests opening file dialog on Drive and closing it with Cancel button.
  */
 testcase.openFileDialogCancelDrive = function() {
-  testPromise(openFileDialogClickCancelButton('drive', TEST_DRIVE_FILE));
+  return openFileDialogClickCancelButton('drive', TEST_DRIVE_FILE);
 };
 
 /**
  * Tests opening file dialog on Drive and closing it with ESC key.
  */
 testcase.openFileDialogEscapeDrive = function() {
-  testPromise(openFileDialogSendEscapeKey('drive', TEST_DRIVE_FILE));
+  return openFileDialogSendEscapeKey('drive', TEST_DRIVE_FILE);
 };
 
 /**
  * Tests opening file dialog, then closing it with an 'unload' event.
  */
-testcase.openFileDialogUnload = function() {
+testcase.openFileDialogUnload = async function() {
   chrome.fileSystem.chooseEntry({type: 'openFile'}, (entry) => {});
-
-  testPromise(remoteCall.waitForWindow('dialog#').then((dialog) => {
-    return unloadOpenFileDialog(dialog);
-  }));
+  const dialog = await remoteCall.waitForWindow('dialog#');
+  await unloadOpenFileDialog(dialog);
 };
diff --git a/ui/file_manager/integration_tests/file_manager/tab_index.js b/ui/file_manager/integration_tests/file_manager/tab_index.js
index 55463c4..eea1193 100644
--- a/ui/file_manager/integration_tests/file_manager/tab_index.js
+++ b/ui/file_manager/integration_tests/file_manager/tab_index.js
@@ -7,221 +7,137 @@
 /**
  * Tests the focus behavior of the search box.
  */
-testcase.tabindexSearchBoxFocus = function() {
-  var appId;
-  StepsRunner.run([
-    // Set up File Manager.
-    function() {
-      setupAndWaitUntilReady(null, RootPath.DRIVE, this.next);
-    },
-    // Check that the file list has the focus on launch.
-    function(results) {
-      appId = results.windowId;
-      remoteCall.waitForElement(appId, ['#file-list:focus']).then(this.next);
-    },
-    // Press the Ctrl-F key.
-    function(element) {
-      remoteCall.callRemoteTestUtil(
-          'fakeKeyDown', appId, ['body', 'f', true, false, false], this.next);
-    },
-    // Check that the search box has the focus.
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.waitForElement(appId, ['#search-box cr-input:focus-within'])
-          .then(this.next);
-    },
-    // Press the Esc key.
-    function(element) {
-      remoteCall.callRemoteTestUtil(
-          'fakeKeyDown', appId,
-          ['#search-box cr-input', 'Escape', false, false, false], this.next);
-    },
-    // Check that the file list has the focus.
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'file-list').then(this.next);
-    },
-    // Check for errors.
-    function(result) {
-      chrome.test.assertTrue(result);
-      checkIfNoErrorsOccured(this.next);
-    }
-  ]);
+testcase.tabindexSearchBoxFocus = async function() {
+  // Open Files app on Drive.
+  const {appId} = await setupAndWaitUntilReady(null, RootPath.DRIVE, null);
+
+  // Check that the file list has the focus on launch.
+  await remoteCall.waitForElement(appId, ['#file-list:focus']);
+
+  // Press the Ctrl-F key.
+  chrome.test.assertTrue(await remoteCall.callRemoteTestUtil(
+      'fakeKeyDown', appId, ['body', 'f', true, false, false]));
+
+  // Check that the search box has the focus.
+  await remoteCall.waitForElement(appId, ['#search-box cr-input:focus-within']);
+
+  // Press the Esc key.
+  chrome.test.assertTrue(await remoteCall.callRemoteTestUtil(
+      'fakeKeyDown', appId,
+      ['#search-box cr-input', 'Escape', false, false, false]));
+
+  // Check that the file list has the focus.
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'file-list'));
 };
 
 /**
  * Tests the tab focus behavior of the Files app when no file is selected.
  */
-testcase.tabindexFocus = function() {
-  var appId;
-  StepsRunner.run([
-    // Set up File Manager.
-    function() {
-      setupAndWaitUntilReady(null, RootPath.DRIVE, this.next);
-    },
-    // Check that the file list has the focus on launch.
-    function(results) {
-      appId = results.windowId;
-      remoteCall.waitForElement(appId, ['#file-list:focus']).then(this.next);
-    },
-    function(element) {
-      remoteCall.waitForElement(appId, ['#drive-welcome-link']).then(this.next);
-    },
-    function(element) {
-      remoteCall.callRemoteTestUtil('getActiveElement', appId, [], this.next);
-    // Press the Tab key.
-    }, function(element) {
-      chrome.test.assertEq('list', element.attributes['class']);
-      remoteCall.checkNextTabFocus(appId, 'search-button').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'view-button').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'sort-button').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'gear-button').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'directory-tree').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'drive-welcome-link').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'file-list').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      checkIfNoErrorsOccured(this.next);
-    }
-  ]);
+testcase.tabindexFocus = async function() {
+  // Open Files app on Drive.
+  const {appId} = await setupAndWaitUntilReady(null, RootPath.DRIVE, null);
+
+  // Check that the file list has the focus on launch.
+  await remoteCall.waitForElement(appId, ['#file-list:focus']);
+  await remoteCall.waitForElement(appId, ['#drive-welcome-link']);
+  const element =
+      await remoteCall.callRemoteTestUtil('getActiveElement', appId, []);
+  chrome.test.assertEq('list', element.attributes['class']);
+
+  // Send Tab key events to cycle through the tabable elements.
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'search-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'view-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'sort-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'gear-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'directory-tree'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'drive-welcome-link'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'file-list'));
 };
 
 /**
  * Tests the tab focus behavior of the Files app when no file is selected in
  * Downloads directory.
  */
-testcase.tabindexFocusDownloads = function() {
-  var appId;
-  StepsRunner.run([
-    // Set up File Manager.
-    function() {
-      setupAndWaitUntilReady(null, RootPath.DOWNLOADS, this.next);
-    },
-    // Check that the file list has the focus on launch.
-    function(results) {
-      appId = results.windowId;
-      remoteCall.waitForElement(appId, ['#file-list:focus']).then(this.next);
-    }, function(element) {
-      remoteCall.callRemoteTestUtil('getActiveElement', appId, [], this.next);
-    }, function(element) {
-      chrome.test.assertEq('list', element.attributes['class']);
-      remoteCall.checkNextTabFocus(appId, 'breadcrumb-path-0').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'search-button').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'view-button').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'sort-button').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'gear-button').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'directory-tree').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'file-list').then(this.next);
-    }, function(result) {
-      chrome.test.assertTrue(result);
-      checkIfNoErrorsOccured(this.next);
-    }
-  ]);
-};
+testcase.tabindexFocusDownloads = async function() {
+  // Open Files app on Downloads.
+  const {appId} = await setupAndWaitUntilReady(null, RootPath.DOWNLOADS, null);
 
+  // Check that the file list has the focus on launch.
+  await remoteCall.waitForElement(appId, ['#file-list:focus']);
+  const element =
+      await remoteCall.callRemoteTestUtil('getActiveElement', appId, []);
+  chrome.test.assertEq('list', element.attributes['class']);
+
+  // Send Tab key events to cycle through the tabable elements.
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'breadcrumb-path-0'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'search-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'view-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'sort-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'gear-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'directory-tree'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'file-list'));
+};
 /**
  * Tests the tab focus behavior of the Files app when a directory is selected.
  */
-testcase.tabindexFocusDirectorySelected = function() {
-  var appId;
-  StepsRunner.run([
-    // Set up File Manager.
-    function() {
-      setupAndWaitUntilReady(null, RootPath.DRIVE, this.next);
-    },
-    // Check that the file list has the focus on launch.
-    function(results) {
-      appId = results.windowId;
-      Promise.all([
-        remoteCall.waitForElement(appId, ['#file-list:focus']),
-        remoteCall.waitForElement(appId, ['#drive-welcome-link']),
-     ]).then(this.next);
-    },
-    function(elements) {
-      remoteCall.callRemoteTestUtil('getActiveElement', appId, [], this.next);
-    },
-    function(element) {
-      chrome.test.assertEq('list', element.attributes['class']);
-      // Select the directory named 'photos'.
-      remoteCall.callRemoteTestUtil(
-          'selectFile', appId, ['photos']).then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      Promise
-          .all([
-            remoteCall.waitForElement(
-                appId, ['#share-menu-button:not([hidden]):not([disabled])']),
-            remoteCall.waitForElement(
-                appId, ['#delete-button:not([hidden]):not([disabled])']),
-          ])
-          .then(this.next);
-      // Press the Tab key.
-    },
-    function(elements) {
-      remoteCall.checkNextTabFocus(appId, 'share-menu-button').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'delete-button').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'search-button').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'view-button').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'sort-button').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'gear-button').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'directory-tree').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'drive-welcome-link').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      remoteCall.checkNextTabFocus(appId, 'file-list').then(this.next);
-    },
-    function(result) {
-      chrome.test.assertTrue(result);
-      checkIfNoErrorsOccured(this.next);
-    }
+testcase.tabindexFocusDirectorySelected = async function() {
+  // Open Files app on Drive.
+  const {appId} = await setupAndWaitUntilReady(null, RootPath.DRIVE, null);
+
+  // Check that the file list has the focus on launch.
+  await Promise.all([
+    remoteCall.waitForElement(appId, ['#file-list:focus']),
+    remoteCall.waitForElement(appId, ['#drive-welcome-link']),
   ]);
+  const element =
+      await remoteCall.callRemoteTestUtil('getActiveElement', appId, []);
+  chrome.test.assertEq('list', element.attributes['class']);
+
+  // Select the directory named 'photos'.
+  chrome.test.assertTrue(
+      await remoteCall.callRemoteTestUtil('selectFile', appId, ['photos']));
+
+  await Promise.all([
+    remoteCall.waitForElement(
+        appId, ['#share-menu-button:not([hidden]):not([disabled])']),
+    remoteCall.waitForElement(
+        appId, ['#delete-button:not([hidden]):not([disabled])']),
+  ]);
+
+  // Send Tab key events to cycle through the tabable elements.
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'share-menu-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'delete-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'search-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'view-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'sort-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'gear-button'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'directory-tree'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'drive-welcome-link'));
+  chrome.test.assertTrue(
+      await remoteCall.checkNextTabFocus(appId, 'file-list'));
 };
 
 /**
@@ -241,98 +157,82 @@
  * @param {Array<string>} expectedTabOrder Array with the IDs of the element
  *     with the corresponding order of expected tab-indexes.
  */
-function tabindexFocus(dialogParams, volumeName, expectedSet, initialize,
-                       initialElements, expectedTabOrder) {
-  var localEntriesPromise = addEntries(['local'], BASIC_LOCAL_ENTRY_SET);
-  var driveEntriesPromise = addEntries(['drive'], BASIC_DRIVE_ENTRY_SET);
-  var setupPromise = Promise.all([localEntriesPromise, driveEntriesPromise]);
+async function tabindexFocus(
+    dialogParams, volumeName, expectedSet, initialize, initialElements,
+    expectedTabOrder) {
+  await Promise.all([
+    addEntries(['local'], BASIC_LOCAL_ENTRY_SET),
+    addEntries(['drive'], BASIC_DRIVE_ENTRY_SET)
+  ]);
 
-  var selectAndCheckAndClose = function(appId) {
-    var promise = Promise.resolve();
-
+  const selectAndCheckAndClose = async (appId) => {
     if (dialogParams.type === 'saveFile') {
-      promise = promise.then(function() {
-        return remoteCall.waitForElement(
-            appId, ['#filename-input-textbox:focus-within']);
-      });
+      await remoteCall.waitForElement(
+          appId, ['#filename-input-textbox:focus-within']);
     } else {
-      promise = promise.then(function() {
-        return remoteCall.waitForElement(appId, ['#file-list:focus']);
-      });
+      await remoteCall.waitForElement(appId, ['#file-list:focus']);
     }
 
-    if (initialize)
-      promise = promise.then(initialize.bind(null, appId));
+    if (initialize) {
+      await initialize(appId);
+    }
 
-    // Waits for the initial element.
-    promise = promise.then(function() {
-      return Promise.all(initialElements.map(function(selector) {
-        return remoteCall.waitForElement(appId, [selector]);
-      }));
-    });
+    // Wait for the initial element.
+    await Promise.all(initialElements.map((selector) => {
+      return remoteCall.waitForElement(appId, [selector]);
+    }));
 
     // Checks tabfocus.
-    expectedTabOrder.forEach(function(className) {
-      promise = promise.then(function() {
-        return remoteCall.checkNextTabFocus(appId, className);
-      }).then(function(result) {
-        chrome.test.assertTrue(result);
-      });
-    });
+    for (const className of expectedTabOrder) {
+      chrome.test.assertTrue(
+          await remoteCall.checkNextTabFocus(appId, className), className);
+    }
 
-    promise = promise.then(function() {
-      // Closes the window by pressing Enter.
-      return remoteCall.callRemoteTestUtil(
-          'fakeKeyDown', appId, ['#file-list', 'Enter', false, false, false]);
-    });
-
-    return promise;
+    // Closes the window by pressing Enter.
+    await remoteCall.callRemoteTestUtil(
+        'fakeKeyDown', appId, ['#file-list', 'Enter', false, false, false]);
   };
 
-  return setupPromise.then(function() {
-    return openAndWaitForClosingDialog(
-        dialogParams, volumeName, expectedSet, selectAndCheckAndClose);
-  });
+  await openAndWaitForClosingDialog(
+      dialogParams, volumeName, expectedSet, selectAndCheckAndClose);
 }
 
 /**
  * Tests the tab focus behavior of Open Dialog (Downloads).
  */
-testcase.tabindexOpenDialogDownloads = function() {
-  testPromise(tabindexFocus(
+testcase.tabindexOpenDialogDownloads = async function() {
+  return tabindexFocus(
       {type: 'openFile'}, 'downloads', BASIC_LOCAL_ENTRY_SET,
-      function(appId) {
-        return remoteCall.callRemoteTestUtil(
-            'selectFile', appId, ['hello.txt']);
+      async (appId) => {
+        await remoteCall.callRemoteTestUtil('selectFile', appId, ['hello.txt']);
       },
       ['#ok-button:not([disabled])'], [
         'cancel-button', 'ok-button', 'breadcrumb-path-0', 'search-button',
         'view-button', 'sort-button', 'gear-button', 'directory-tree',
         'file-list'
-      ]));
+      ]);
 };
 
 /**
  * Tests the tab focus behavior of Open Dialog (Drive).
  */
-testcase.tabindexOpenDialogDrive = function() {
-  testPromise(tabindexFocus(
+testcase.tabindexOpenDialogDrive = async function() {
+  return tabindexFocus(
       {type: 'openFile'}, 'drive', BASIC_DRIVE_ENTRY_SET,
-      function(appId) {
-        return remoteCall.callRemoteTestUtil(
-            'selectFile', appId, ['hello.txt']);
+      async (appId) => {
+        await remoteCall.callRemoteTestUtil('selectFile', appId, ['hello.txt']);
       },
       ['#ok-button:not([disabled])'], [
         'cancel-button', 'ok-button', 'search-button', 'view-button',
         'sort-button', 'gear-button', 'directory-tree', 'file-list'
-      ]));
+      ]);
 };
 
 /**
  * Tests the tab focus behavior of Save File Dialog (Downloads).
  */
-testcase.tabindexSaveFileDialogDownloads = function() {
-  testPromise(tabindexFocus(
+testcase.tabindexSaveFileDialogDownloads = async function() {
+  return tabindexFocus(
       {
         type: 'saveFile',
         suggestedName: 'hoge.txt'  // Prevent showing a override prompt
@@ -342,14 +242,14 @@
         'cancel-button', 'ok-button', 'breadcrumb-path-0', 'search-button',
         'view-button', 'sort-button', 'gear-button', 'directory-tree',
         'file-list', 'new-folder-button', 'filename-input-textbox'
-      ]));
+      ]);
 };
 
 /**
  * Tests the tab focus behavior of Save File Dialog (Drive).
  */
-testcase.tabindexSaveFileDialogDrive = function() {
-  testPromise(tabindexFocus(
+testcase.tabindexSaveFileDialogDrive = async function() {
+  return tabindexFocus(
       {
         type: 'saveFile',
         suggestedName: 'hoge.txt'  // Prevent showing a override prompt
@@ -358,5 +258,5 @@
         'cancel-button', 'ok-button', 'search-button', 'view-button',
         'sort-button', 'gear-button', 'directory-tree', 'file-list',
         'new-folder-button', 'filename-input-textbox'
-      ]));
+      ]);
 };
diff --git a/ui/file_manager/integration_tests/file_manager/tasks.js b/ui/file_manager/integration_tests/file_manager/tasks.js
index dce4de1..052d45d 100644
--- a/ui/file_manager/integration_tests/file_manager/tasks.js
+++ b/ui/file_manager/integration_tests/file_manager/tasks.js
@@ -52,218 +52,160 @@
  * @param {string} rootPath Root path.
  * @param {Array<FakeTask>} fakeTasks Fake tasks.
  */
-function setupTaskTest(rootPath, fakeTasks) {
-  return setupAndWaitUntilReady(null, rootPath).then(function(results) {
-    return remoteCall.callRemoteTestUtil(
-        'overrideTasks',
-        results.windowId,
-        [fakeTasks]).then(function() {
-      return results.windowId;
-    });
-  });
+async function setupTaskTest(rootPath, fakeTasks) {
+  const {appId} = await setupAndWaitUntilReady(null, rootPath);
+  await remoteCall.callRemoteTestUtil('overrideTasks', appId, [fakeTasks]);
+  return appId;
 }
 
 /**
  * Tests executing the default task when there is only one task.
  *
+ * @param {string} appId Window ID.
  * @param {string} expectedTaskId Task ID expected to execute.
- * @param {string} windowId Window ID.
  */
-function executeDefaultTask(expectedTaskId, windowId) {
+async function executeDefaultTask(appId, expectedTaskId) {
   // Select file.
-  var selectFilePromise =
-      remoteCall.callRemoteTestUtil('selectFile', windowId, ['hello.txt']);
+  chrome.test.assertTrue(
+      await remoteCall.callRemoteTestUtil('selectFile', appId, ['hello.txt']));
 
   // Double-click the file.
-  var doubleClickPromise = selectFilePromise.then(function(result) {
-    chrome.test.assertTrue(result);
-    return remoteCall.callRemoteTestUtil(
-        'fakeMouseDoubleClick',
-        windowId,
-        ['#file-list li.table-row[selected] .filename-label span']);
-  });
+  chrome.test.assertTrue(!!await remoteCall.callRemoteTestUtil(
+      'fakeMouseDoubleClick', appId,
+      ['#file-list li.table-row[selected] .filename-label span']));
 
   // Wait until the task is executed.
-  return doubleClickPromise.then(function(result) {
-    chrome.test.assertTrue(!!result);
-    return remoteCall.waitUntilTaskExecutes(windowId, expectedTaskId);
-  });
+  await remoteCall.waitUntilTaskExecutes(appId, expectedTaskId);
 }
 
 /**
  * Tests to specify default task via the default task dialog.
  *
+ * @param {string} appId Window ID.
  * @param {string} expectedTaskId Task ID to be expected to newly specify as
  *     default.
- * @param {string} windowId Window ID.
  * @return {Promise} Promise to be fulfilled/rejected depends on the test
  *     result.
  */
-function defaultTaskDialog(expectedTaskId, windowId) {
+async function defaultTaskDialog(appId, expectedTaskId) {
   // Prepare expected labels.
   var expectedLabels = [
     'DummyTask1 (default)',
-    'DummyTask2'
+    'DummyTask2',
   ];
 
   // Select file.
-  var selectFilePromise =
-      remoteCall.callRemoteTestUtil('selectFile', windowId, ['hello.txt']);
+  await remoteCall.callRemoteTestUtil('selectFile', appId, ['hello.txt']);
 
   // Click the change default menu.
-  var menuClickedPromise = selectFilePromise.
-      then(function() {
-        return remoteCall.waitForElement(windowId, '#tasks[multiple]');
-      }).
-      then(function() {
-        return remoteCall.waitForElement(
-            windowId, '#tasks-menu .change-default');
-      }).
-      then(function() {
-        return remoteCall.callRemoteTestUtil(
-            'fakeEvent', windowId, ['#tasks', 'select', {
-              item: {type: 'ChangeDefaultTask'}
-            }]);
-      }).
-      then(function(result) {
-        chrome.test.assertTrue(result);
-      });
+  await remoteCall.waitForElement(appId, '#tasks[multiple]');
+  await remoteCall.waitForElement(appId, '#tasks-menu .change-default');
+  chrome.test.assertTrue(await remoteCall.callRemoteTestUtil(
+      'fakeEvent', appId,
+      ['#tasks', 'select', {item: {type: 'ChangeDefaultTask'}}]));
 
   var caller = getCaller();
-  // Wait for the list of menu item is added as expected.
-  var menuPreparedPromise = menuClickedPromise.then(function() {
-    return repeatUntil(function() {
-      // Obtains menu items.
-      var menuItemsPromise = remoteCall.callRemoteTestUtil(
-          'queryAllElements',
-          windowId,
-          ['#default-task-dialog #default-tasks-list li']);
 
-      // Compare the contents of items.
-      return menuItemsPromise.then(function(items) {
-        var actualLabels = items.map(function(item) { return item.text; });
-        if (chrome.test.checkDeepEq(expectedLabels, actualLabels)) {
-          return true;
-        } else {
-          return pending(
-              caller, 'Tasks do not match, expected: %j, actual: %j.',
-              expectedLabels, actualLabels);
-        }
-      });
-    });
+  // Wait for the list of menu item is added as expected.
+  await repeatUntil(async function() {
+    // Obtains menu items.
+    const items = await remoteCall.callRemoteTestUtil(
+        'queryAllElements', appId,
+        ['#default-task-dialog #default-tasks-list li']);
+
+    // Compare the contents of items.
+    var actualLabels = items.map((item) => item.text);
+    if (chrome.test.checkDeepEq(expectedLabels, actualLabels)) {
+      return true;
+    }
+    return pending(
+        caller, 'Tasks do not match, expected: %j, actual: %j.', expectedLabels,
+        actualLabels);
   });
 
   // Click the non default item.
-  var itemClickedPromise = menuPreparedPromise.
-      then(function() {
-        return remoteCall.callRemoteTestUtil(
-            'fakeEvent',
-            windowId,
-            [
-              '#default-task-dialog #default-tasks-list li:nth-of-type(2)',
-              'mousedown',
-              {bubbles: true, button: 0}
-            ]);
-      }).
-      then(function() {
-        return remoteCall.callRemoteTestUtil(
-            'fakeEvent',
-            windowId,
-            [
-              '#default-task-dialog #default-tasks-list li:nth-of-type(2)',
-              'click',
-              {bubbles: true}
-            ]);
-      }).
-      then(function(result) {
-        chrome.test.assertTrue(result);
-      });
+  chrome.test.assertTrue(
+      await remoteCall.callRemoteTestUtil('fakeEvent', appId, [
+        '#default-task-dialog #default-tasks-list li:nth-of-type(2)',
+        'mousedown', {bubbles: true, button: 0}
+      ]));
+  chrome.test.assertTrue(
+      await remoteCall.callRemoteTestUtil('fakeEvent', appId, [
+        '#default-task-dialog #default-tasks-list li:nth-of-type(2)', 'click',
+        {bubbles: true}
+      ]));
 
   // Wait for the dialog hidden, and the task is executed.
-  var dialogHiddenPromise = itemClickedPromise.then(function() {
-    return remoteCall.waitForElementLost(
-        windowId, '#default-task-dialog', null);
-  });
+  await remoteCall.waitForElementLost(appId, '#default-task-dialog', null);
 
-  // Execute the new default task.
-  var taskButtonClicked =
-      dialogHiddenPromise
-          .then(function() {
-            // Click on "Open ▼" button.
-            remoteCall.callRemoteTestUtil(
-                'fakeMouseClick', windowId, ['#tasks']);
-            // Wait for dropdown menu to show.
-            return remoteCall.waitForElement(
-                windowId, '#tasks-menu:not([hidden]) cr-menu-item');
-          })
-          .then(function(result) {
-            chrome.test.assertTrue(!!result);
-            // Click on first menu item.
-            remoteCall.callRemoteTestUtil(
-                'fakeMouseClick', windowId,
-                ['#tasks-menu:not([hidden]) cr-menu-item:nth-child(1)']);
-            // Wait dropdown menu to hide.
-            return remoteCall.waitForElement(windowId, '#tasks-menu[hidden]');
-          })
-          .then(function(result) {
-            chrome.test.assertTrue(!!result);
-          });
+  // Execute the new default task. Click on "Open ▼" button.
+  remoteCall.callRemoteTestUtil('fakeMouseClick', appId, ['#tasks']);
+
+  // Wait for dropdown menu to show.
+  await remoteCall.waitForElement(
+      appId, '#tasks-menu:not([hidden]) cr-menu-item');
+
+  // Click on first menu item.
+  remoteCall.callRemoteTestUtil(
+      'fakeMouseClick', appId,
+      ['#tasks-menu:not([hidden]) cr-menu-item:nth-child(1)']);
+
+  // Wait dropdown menu to hide.
+  chrome.test.assertTrue(
+      !!await remoteCall.waitForElement(appId, '#tasks-menu[hidden]'));
 
   // Check the executed tasks.
-  return taskButtonClicked.then(function() {
-    return remoteCall.waitUntilTaskExecutes(windowId, expectedTaskId);
-  });
+  await remoteCall.waitUntilTaskExecutes(appId, expectedTaskId);
 }
 
-testcase.executeDefaultTaskDrive = function() {
-  testPromise(setupTaskTest(RootPath.DRIVE, DRIVE_FAKE_TASKS).then(
-      executeDefaultTask.bind(null, 'dummytaskid|drive|open-with')));
+testcase.executeDefaultTaskDrive = async function() {
+  const appId = await setupTaskTest(RootPath.DRIVE, DRIVE_FAKE_TASKS);
+  await executeDefaultTask(appId, 'dummytaskid|drive|open-with');
 };
 
-testcase.executeDefaultTaskDownloads = function() {
-  testPromise(setupTaskTest(RootPath.DOWNLOADS, DOWNLOADS_FAKE_TASKS).then(
-      executeDefaultTask.bind(null, 'dummytaskid|open-with')));
+testcase.executeDefaultTaskDownloads = async function() {
+  const appId = await setupTaskTest(RootPath.DOWNLOADS, DOWNLOADS_FAKE_TASKS);
+  await executeDefaultTask(appId, 'dummytaskid|open-with');
 };
 
-testcase.defaultTaskDialogDrive = function() {
-  testPromise(setupTaskTest(RootPath.DRIVE, DRIVE_FAKE_TASKS).then(
-      defaultTaskDialog.bind(null, 'dummytaskid-2|drive|open-with')));
+testcase.defaultTaskDialogDrive = async function() {
+  const appId = await setupTaskTest(RootPath.DRIVE, DRIVE_FAKE_TASKS);
+  await defaultTaskDialog(appId, 'dummytaskid-2|drive|open-with');
 };
 
-testcase.defaultTaskDialogDownloads = function() {
-  testPromise(setupTaskTest(RootPath.DOWNLOADS, DOWNLOADS_FAKE_TASKS).then(
-      defaultTaskDialog.bind(null, 'dummytaskid-2|open-with')));
+testcase.defaultTaskDialogDownloads = async function() {
+  const appId = await setupTaskTest(RootPath.DOWNLOADS, DOWNLOADS_FAKE_TASKS);
+  await defaultTaskDialog(appId, 'dummytaskid-2|open-with');
 };
 
-testcase.genericTaskIsNotExecuted = function() {
-  var tasks = [
-    new FakeTask(false, 'dummytaskid|open-with', 'DummyTask1',
-        true /* isGenericFileHandler */)
-  ];
+testcase.genericTaskIsNotExecuted = async function() {
+  var tasks = [new FakeTask(
+      false, 'dummytaskid|open-with', 'DummyTask1',
+      true /* isGenericFileHandler */)];
 
   // When default task is not set, executeDefaultInternal_ in file_tasks.js
   // tries to show it in a browser tab. By checking the view-in-browser task is
   // executed, we check that default task is not set in this situation.
   //
   // See: src/ui/file_manager/file_manager/foreground/js/file_tasks.js&l=404
-  testPromise(setupTaskTest(RootPath.DOWNLOADS, tasks)
-    .then(function(windowId) {
-      return executeDefaultTask(
-          FILE_MANAGER_EXTENSIONS_ID + '|file|view-in-browser',
-          windowId);
-    }));
+  const appId = await setupTaskTest(RootPath.DOWNLOADS, tasks);
+  await executeDefaultTask(
+      appId, FILE_MANAGER_EXTENSIONS_ID + '|file|view-in-browser');
 };
 
-testcase.genericTaskAndNonGenericTask = function() {
+testcase.genericTaskAndNonGenericTask = async function() {
   var tasks = [
-    new FakeTask(false, 'dummytaskid|open-with', 'DummyTask1',
+    new FakeTask(
+        false, 'dummytaskid|open-with', 'DummyTask1',
         true /* isGenericFileHandler */),
-    new FakeTask(false, 'dummytaskid-2|open-with', 'DummyTask2',
+    new FakeTask(
+        false, 'dummytaskid-2|open-with', 'DummyTask2',
         false /* isGenericFileHandler */),
-    new FakeTask(false, 'dummytaskid-3|open-with', 'DummyTask3',
+    new FakeTask(
+        false, 'dummytaskid-3|open-with', 'DummyTask3',
         true /* isGenericFileHandler */)
   ];
 
-  testPromise(setupTaskTest(RootPath.DOWNLOADS, tasks).then(
-    executeDefaultTask.bind(null, 'dummytaskid-2|open-with')));
+  const appId = await setupTaskTest(RootPath.DOWNLOADS, tasks);
+  await executeDefaultTask(appId, 'dummytaskid-2|open-with');
 };
diff --git a/ui/views/accessibility/ax_root_obj_wrapper.cc b/ui/views/accessibility/ax_root_obj_wrapper.cc
index c9327cbb..b5c4c30 100644
--- a/ui/views/accessibility/ax_root_obj_wrapper.cc
+++ b/ui/views/accessibility/ax_root_obj_wrapper.cc
@@ -22,16 +22,13 @@
     : alert_window_(std::make_unique<aura::Window>(nullptr)),
       delegate_(delegate) {
   alert_window_->Init(ui::LAYER_NOT_DRAWN);
-#if !defined(IS_CHROMECAST)
   aura::Env::GetInstance()->AddObserver(this);
 
   if (display::Screen::GetScreen())
     display::Screen::GetScreen()->AddObserver(this);
-#endif
 }
 
 AXRootObjWrapper::~AXRootObjWrapper() {
-#if !defined(IS_CHROMECAST)
   if (display::Screen::GetScreen())
     display::Screen::GetScreen()->RemoveObserver(this);
 
@@ -41,7 +38,6 @@
     return;
 
   aura::Env::GetInstance()->RemoveObserver(this);
-#endif
   alert_window_.reset();
 }
 
@@ -81,13 +77,15 @@
   out_node_data->id = unique_id_.Get();
   out_node_data->role = ax::mojom::Role::kDesktop;
 
-#if !defined(IS_CHROMECAST)
   display::Screen* screen = display::Screen::GetScreen();
   if (!screen)
     return;
 
   const display::Display& display = screen->GetPrimaryDisplay();
 
+  out_node_data->relative_bounds.bounds =
+      gfx::RectF(display.bounds().width(), display.bounds().height());
+
   // Utilize the display bounds to figure out if this screen is in landscape or
   // portrait. We use this rather than |rotation| because some devices default
   // to landscape, some in portrait. Encode landscape as horizontal state,
@@ -96,7 +94,6 @@
     out_node_data->AddState(ax::mojom::State::kHorizontal);
   else
     out_node_data->AddState(ax::mojom::State::kVertical);
-#endif
 }
 
 int32_t AXRootObjWrapper::GetUniqueId() const {
diff --git a/ui/views/controls/native/native_view_host.cc b/ui/views/controls/native/native_view_host.cc
index 270f22b0..047265f9 100644
--- a/ui/views/controls/native/native_view_host.cc
+++ b/ui/views/controls/native/native_view_host.cc
@@ -60,6 +60,10 @@
   return native_wrapper_->SetCustomMask(std::move(mask));
 }
 
+void NativeViewHost::SetHitTestTopInset(int top_inset) {
+  native_wrapper_->SetHitTestTopInset(top_inset);
+}
+
 void NativeViewHost::SetNativeViewSize(const gfx::Size& size) {
   if (native_view_size_ == size)
     return;
diff --git a/ui/views/controls/native/native_view_host.h b/ui/views/controls/native/native_view_host.h
index 5c47f29..36d9e90 100644
--- a/ui/views/controls/native/native_view_host.h
+++ b/ui/views/controls/native/native_view_host.h
@@ -57,6 +57,11 @@
   // NB: This does not interact nicely with fast_resize.
   bool SetCustomMask(std::unique_ptr<ui::LayerOwner> mask);
 
+  // Sets the height of the top region where the gfx::NativeView shouldn't be
+  // targeted. This will be used when another view is covering there
+  // temporarily, like the immersive fullscreen mode of ChromeOS.
+  void SetHitTestTopInset(int top_inset);
+
   // Sets the size for the NativeView that may or may not match the size of this
   // View when it is being captured. If the size does not match, scaling will
   // occur. Pass an empty size to revert to the default behavior, where the
diff --git a/ui/views/controls/native/native_view_host_aura.cc b/ui/views/controls/native/native_view_host_aura.cc
index dabae67..4d487a0 100644
--- a/ui/views/controls/native/native_view_host_aura.cc
+++ b/ui/views/controls/native/native_view_host_aura.cc
@@ -12,9 +12,11 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
 #include "ui/aura/window_occlusion_tracker.h"
+#include "ui/aura/window_targeter.h"
 #include "ui/base/cursor/cursor.h"
 #include "ui/base/hit_test.h"
 #include "ui/compositor/paint_recorder.h"
+#include "ui/gfx/geometry/insets.h"
 #include "ui/views/controls/native/native_view_host.h"
 #include "ui/views/painter.h"
 #include "ui/views/view_constants_aura.h"
@@ -161,6 +163,13 @@
 #endif
 }
 
+void NativeViewHostAura::SetHitTestTopInset(int top_inset) {
+  if (top_inset_ == top_inset)
+    return;
+  top_inset_ = top_inset;
+  UpdateInsets();
+}
+
 void NativeViewHostAura::InstallClip(int x, int y, int w, int h) {
   clip_rect_.reset(
       new gfx::Rect(host_->ConvertRectToWidget(gfx::Rect(x, y, w, h))));
@@ -284,6 +293,7 @@
   clipping_window_->SetName("NativeViewHostAuraClip");
   clipping_window_->layer()->SetMasksToBounds(true);
   clipping_window_->SetProperty(views::kHostViewKey, static_cast<View*>(host_));
+  UpdateInsets();
 }
 
 void NativeViewHostAura::AddClippingWindow() {
@@ -340,4 +350,23 @@
   mask_.reset();
 }
 
+void NativeViewHostAura::UpdateInsets() {
+  if (!clipping_window_)
+    return;
+
+  if (top_inset_ == 0) {
+    // The window targeter needs to be uninstalled when not used; keeping empty
+    // targeter here actually conflicts with ash::ImmersiveWindowTargeter on
+    // immersive mode in Ash.
+    // TODO(mukai): fix this.
+    clipping_window_->SetEventTargeter(nullptr);
+  } else {
+    if (!clipping_window_->targeter()) {
+      clipping_window_->SetEventTargeter(
+          std::make_unique<aura::WindowTargeter>());
+    }
+    clipping_window_->targeter()->SetInsets(gfx::Insets(top_inset_, 0, 0, 0));
+  }
+}
+
 }  // namespace views
diff --git a/ui/views/controls/native/native_view_host_aura.h b/ui/views/controls/native/native_view_host_aura.h
index 1e247145..cabd3ee 100644
--- a/ui/views/controls/native/native_view_host_aura.h
+++ b/ui/views/controls/native/native_view_host_aura.h
@@ -34,6 +34,7 @@
   void AddedToWidget() override;
   void RemovedFromWidget() override;
   bool SetCustomMask(std::unique_ptr<ui::LayerOwner> mask) override;
+  void SetHitTestTopInset(int top_inset) override;
   void InstallClip(int x, int y, int w, int h) override;
   bool HasInstalledClip() override;
   void UninstallClip() override;
@@ -74,6 +75,9 @@
   // Unsets the mask layer on the native view's layer.
   void UninstallMask();
 
+  // Updates the top insets of |clipping_window_|.
+  void UpdateInsets();
+
   // Our associated NativeViewHost.
   NativeViewHost* host_;
 
@@ -98,6 +102,9 @@
   // True if a transform different from the original was set.
   bool original_transform_changed_ = false;
 
+  // The top insets to exclude the underlying native view from the target.
+  int top_inset_ = 0;
+
   DISALLOW_COPY_AND_ASSIGN(NativeViewHostAura);
 };
 
diff --git a/ui/views/controls/native/native_view_host_aura_unittest.cc b/ui/views/controls/native/native_view_host_aura_unittest.cc
index 4a7e05f..6eeaf9b5 100644
--- a/ui/views/controls/native/native_view_host_aura_unittest.cc
+++ b/ui/views/controls/native/native_view_host_aura_unittest.cc
@@ -9,6 +9,9 @@
 #include "base/macros.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
+#include "ui/aura/window_event_dispatcher.h"
+#include "ui/aura/window_targeter.h"
+#include "ui/aura/window_tree_host.h"
 #include "ui/base/cursor/cursor.h"
 #include "ui/events/event_utils.h"
 #include "ui/views/controls/native/native_view_host.h"
@@ -518,4 +521,40 @@
   EXPECT_EQ(nullptr, toplevel()->GetFocusManager()->GetFocusedView());
 }
 
+namespace {
+
+ui::EventTarget* GetTarget(aura::Window* window, const gfx::Point& location) {
+  gfx::Point root_location = location;
+  aura::Window::ConvertPointToTarget(window, window->GetRootWindow(),
+                                     &root_location);
+  ui::MouseEvent event(ui::ET_MOUSE_MOVED, root_location, root_location,
+                       base::TimeTicks::Now(), 0, 0);
+  return window->GetHost()->dispatcher()->event_targeter()->FindTargetForEvent(
+      window->GetRootWindow(), &event);
+}
+
+}  // namespace
+
+TEST_F(NativeViewHostAuraTest, TopInsets) {
+  CreateHost();
+  toplevel()->SetBounds(gfx::Rect(20, 20, 100, 100));
+  toplevel()->Show();
+
+  aura::Window* toplevel_window = toplevel()->GetNativeWindow();
+  aura::Window* child_window = child()->GetNativeWindow();
+  EXPECT_EQ(child_window, GetTarget(toplevel_window, gfx::Point(1, 1)));
+  EXPECT_EQ(child_window, GetTarget(toplevel_window, gfx::Point(1, 11)));
+
+  host()->SetHitTestTopInset(10);
+  EXPECT_EQ(toplevel_window, GetTarget(toplevel_window, gfx::Point(1, 1)));
+  EXPECT_EQ(child_window, GetTarget(toplevel_window, gfx::Point(1, 11)));
+
+  host()->SetHitTestTopInset(0);
+  EXPECT_EQ(child_window, GetTarget(toplevel_window, gfx::Point(1, 1)));
+  EXPECT_EQ(child_window, GetTarget(toplevel_window, gfx::Point(1, 11)));
+
+  DestroyHost();
+  DestroyTopLevel();
+}
+
 }  // namespace views
diff --git a/ui/views/controls/native/native_view_host_mac.h b/ui/views/controls/native/native_view_host_mac.h
index 08a0ce3..4773a3c 100644
--- a/ui/views/controls/native/native_view_host_mac.h
+++ b/ui/views/controls/native/native_view_host_mac.h
@@ -41,6 +41,7 @@
   void AddedToWidget() override;
   void RemovedFromWidget() override;
   bool SetCustomMask(std::unique_ptr<ui::LayerOwner> mask) override;
+  void SetHitTestTopInset(int top_inset) override;
   void InstallClip(int x, int y, int w, int h) override;
   bool HasInstalledClip() override;
   void UninstallClip() override;
diff --git a/ui/views/controls/native/native_view_host_mac.mm b/ui/views/controls/native/native_view_host_mac.mm
index 7ce3631..6dcc32280 100644
--- a/ui/views/controls/native/native_view_host_mac.mm
+++ b/ui/views/controls/native/native_view_host_mac.mm
@@ -183,6 +183,10 @@
   return false;
 }
 
+void NativeViewHostMac::SetHitTestTopInset(int top_inset) {
+  NOTIMPLEMENTED();
+}
+
 void NativeViewHostMac::InstallClip(int x, int y, int w, int h) {
   NOTIMPLEMENTED();
 }
diff --git a/ui/views/controls/native/native_view_host_wrapper.h b/ui/views/controls/native/native_view_host_wrapper.h
index acd9b2f..8dcfd88 100644
--- a/ui/views/controls/native/native_view_host_wrapper.h
+++ b/ui/views/controls/native/native_view_host_wrapper.h
@@ -46,6 +46,10 @@
   // success or false if the platform doesn't support the operation.
   virtual bool SetCustomMask(std::unique_ptr<ui::LayerOwner> mask) = 0;
 
+  // Sets the height of the top region where gfx::NativeView shouldn't be
+  // targeted.
+  virtual void SetHitTestTopInset(int top_inset) = 0;
+
   // Installs a clip on the gfx::NativeView. These values are in the coordinate
   // space of the Widget, so if this method is called from ShowWidget
   // then the values need to be translated.
diff --git a/ui/views/mus/views_mus_test_suite.cc b/ui/views/mus/views_mus_test_suite.cc
index d5713e1..a58fd7d 100644
--- a/ui/views/mus/views_mus_test_suite.cc
+++ b/ui/views/mus/views_mus_test_suite.cc
@@ -21,7 +21,7 @@
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/constants.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_context.h"
+#include "services/service_manager/public/cpp/service_binding.h"
 #include "services/ws/common/switches.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
@@ -51,24 +51,11 @@
     cmd_line->AppendSwitch(name);
 }
 
-class DefaultService : public service_manager::Service {
- public:
-  DefaultService() {}
-  ~DefaultService() override {}
-
-  // service_manager::Service:
-  void OnBindInterface(const service_manager::BindSourceInfo& source_info,
-                       const std::string& interface_name,
-                       mojo::ScopedMessagePipeHandle interface_pipe) override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DefaultService);
-};
-
 class ServiceManagerConnection {
  public:
   ServiceManagerConnection()
-      : thread_("Persistent service_manager connections") {
+      : thread_("Persistent service_manager connections"),
+        default_service_binding_(&default_service_) {
     catalog::Catalog::LoadDefaultCatalogManifest(
         base::FilePath(kCatalogFilename));
     base::WaitableEvent wait(base::WaitableEvent::ResetPolicy::AUTOMATIC,
@@ -115,7 +102,8 @@
   }
 
   void CloneConnector(base::WaitableEvent* wait) {
-    service_manager_connector_ = context_->connector()->Clone();
+    service_manager_connector_ =
+        default_service_binding_.GetConnector()->Clone();
     wait->Signal();
   }
 
@@ -124,20 +112,20 @@
         std::make_unique<service_manager::BackgroundServiceManager>(nullptr,
                                                                     nullptr);
     service_manager::mojom::ServicePtr service;
-    context_ = std::make_unique<service_manager::ServiceContext>(
-        std::make_unique<DefaultService>(), mojo::MakeRequest(&service));
+    default_service_binding_.Bind(mojo::MakeRequest(&service));
     background_service_manager_->RegisterService(
         service_manager::Identity(GetTestName(),
                                   service_manager::kSystemInstanceGroup,
                                   base::Token{}, base::Token::CreateRandom()),
         std::move(service), nullptr);
-    service_manager_connector_ = context_->connector()->Clone();
-    service_manager_identity_ = context_->identity();
+    service_manager_connector_ =
+        default_service_binding_.GetConnector()->Clone();
+    service_manager_identity_ = default_service_binding_.identity();
     wait->Signal();
   }
 
   void TearDownConnectionsOnBackgroundThread(base::WaitableEvent* wait) {
-    context_.reset();
+    default_service_binding_.Close();
     background_service_manager_.reset();
     wait->Signal();
   }
@@ -154,7 +142,8 @@
   base::Thread thread_;
   std::unique_ptr<service_manager::BackgroundServiceManager>
       background_service_manager_;
-  std::unique_ptr<service_manager::ServiceContext> context_;
+  service_manager::Service default_service_;
+  service_manager::ServiceBinding default_service_binding_;
   std::unique_ptr<service_manager::Connector> service_manager_connector_;
   service_manager::Identity service_manager_identity_;