diff --git a/AUTHORS b/AUTHORS
index 0fff09e..712cbde 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -730,6 +730,7 @@
 William Xie <william.xie@intel.com>
 Xiang Long <xiang.long@intel.com>
 Xiangze Zhang <xiangze.zhang@intel.com>
+Xiaofeng Zhang <xiaofeng.zhang@intel.com>
 Xiaolei Yu <dreifachstein@gmail.com>
 Xiaoyin Liu <xiaoyin.l@outlook.com>
 Xinchao He <hexinchao@gmail.com>
diff --git a/DEPS b/DEPS
index 922c0c7..73cbdfd 100644
--- a/DEPS
+++ b/DEPS
@@ -64,7 +64,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': '29a9f87a8bcd1b6913bb070c5a1514af41fab3ef',
+  'pdfium_revision': '44bc1f818dd791c2a5a81103be3853093fd934b3',
   # 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.
@@ -423,7 +423,7 @@
 
     # Graphics buffer allocator for Chrome OS.
     'src/third_party/minigbm/src':
-      Var('chromium_git') + '/chromiumos/platform/minigbm.git' + '@' + '71db2b551d3b189b0266052446aee35152a2eae3',
+      Var('chromium_git') + '/chromiumos/platform/minigbm.git' + '@' + '682d73bd00595a493bd446c5274bef08bd17c096',
 
     # Userspace interface to kernel DRM services.
     'src/third_party/libdrm/src':
diff --git a/WATCHLISTS b/WATCHLISTS
index efb84a2..d30c6c4 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1993,7 +1993,8 @@
                    'teravest+watch@chromium.org',
                    'tzik@chromium.org',
                    'yusukes+watch@chromium.org'],
-    'permissions': ['mlamouri+watch-permissions@chromium.org'],
+    'permissions': ['mlamouri+watch-permissions@chromium.org',
+                    'raymes+watch@chromium.org'],
     'plugin': ['jam@chromium.org'],
     'policy_definitions': ['tnagel+watch@chromium.org'],
     'polymer': ['dbeam+watch-polymer@chromium.org',
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt
index 7b8852a..d31b752b 100644
--- a/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt
@@ -3167,7 +3167,6 @@
     getter memory
     getter navigation
     getter onresourcetimingbufferfull
-    getter onwebkitresourcetimingbufferfull
     getter timing
     method clearMarks
     method clearMeasures
@@ -3180,10 +3179,7 @@
     method measure
     method now
     method setResourceTimingBufferSize
-    method webkitClearResourceTimings
-    method webkitSetResourceTimingBufferSize
     setter onresourcetimingbufferfull
-    setter onwebkitresourcetimingbufferfull
 interface PerformanceEntry
     getter duration
     getter entryType
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 06f3ffc..e09087a 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -42,8 +42,6 @@
     "aura/pointer_watcher_adapter.h",
     "aura/wm_lookup_aura.cc",
     "aura/wm_lookup_aura.h",
-    "aura/wm_root_window_controller_aura.cc",
-    "aura/wm_root_window_controller_aura.h",
     "aura/wm_shell_aura.cc",
     "aura/wm_shell_aura.h",
     "aura/wm_window_aura.cc",
diff --git a/ash/ash_touch_exploration_manager_chromeos.cc b/ash/ash_touch_exploration_manager_chromeos.cc
index 94df98ab..a6faf964 100644
--- a/ash/ash_touch_exploration_manager_chromeos.cc
+++ b/ash/ash_touch_exploration_manager_chromeos.cc
@@ -4,9 +4,9 @@
 
 #include "ash/ash_touch_exploration_manager_chromeos.h"
 
-#include "ash/aura/wm_root_window_controller_aura.h"
 #include "ash/common/accessibility_delegate.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
+#include "ash/common/wm_root_window_controller.h"
 #include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "ash/root_window_controller.h"
diff --git a/ash/aura/wm_lookup_aura.cc b/ash/aura/wm_lookup_aura.cc
index b068227..9277235 100644
--- a/ash/aura/wm_lookup_aura.cc
+++ b/ash/aura/wm_lookup_aura.cc
@@ -4,11 +4,12 @@
 
 #include "ash/aura/wm_lookup_aura.h"
 
-#include "ash/aura/wm_root_window_controller_aura.h"
 #include "ash/aura/wm_window_aura.h"
 #include "ash/common/wm_layout_manager.h"
 #include "ash/display/window_tree_host_manager.h"
+#include "ash/root_window_controller.h"
 #include "ash/shell.h"
+#include "ui/views/widget/widget.h"
 
 namespace ash {
 
@@ -22,9 +23,13 @@
 
 WmRootWindowController* WmLookupAura::GetRootWindowControllerWithDisplayId(
     int64_t id) {
-  return WmRootWindowControllerAura::Get(Shell::GetInstance()
-                                             ->window_tree_host_manager()
-                                             ->GetRootWindowForDisplayId(id));
+  aura::Window* root_window = Shell::GetInstance()
+                                  ->window_tree_host_manager()
+                                  ->GetRootWindowForDisplayId(id);
+  return root_window
+             ? RootWindowController::ForWindow(root_window)
+                   ->wm_root_window_controller()
+             : nullptr;
 }
 
 WmWindow* WmLookupAura::GetWindowForWidget(views::Widget* widget) {
diff --git a/ash/aura/wm_root_window_controller_aura.cc b/ash/aura/wm_root_window_controller_aura.cc
deleted file mode 100644
index 21964424..0000000
--- a/ash/aura/wm_root_window_controller_aura.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/aura/wm_root_window_controller_aura.h"
-
-#include "ash/aura/wm_window_aura.h"
-#include "ash/common/shelf/shelf_widget.h"
-#include "ash/common/shelf/wm_shelf.h"
-#include "ash/display/window_tree_host_manager.h"
-#include "ash/root_window_controller.h"
-#include "ash/shell.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_property.h"
-
-DECLARE_WINDOW_PROPERTY_TYPE(ash::WmRootWindowControllerAura*);
-
-namespace ash {
-
-// TODO(sky): it likely makes more sense to hang this off RootWindowSettings.
-DEFINE_OWNED_WINDOW_PROPERTY_KEY(ash::WmRootWindowControllerAura,
-                                 kWmRootWindowControllerKey,
-                                 nullptr);
-
-WmRootWindowControllerAura::WmRootWindowControllerAura(
-    RootWindowController* root_window_controller)
-    : WmRootWindowController(
-          WmWindowAura::Get(root_window_controller->GetRootWindow())),
-      root_window_controller_(root_window_controller) {
-  root_window_controller_->GetRootWindow()->SetProperty(
-      kWmRootWindowControllerKey, this);
-}
-
-WmRootWindowControllerAura::~WmRootWindowControllerAura() {}
-
-// static
-const WmRootWindowControllerAura* WmRootWindowControllerAura::Get(
-    const aura::Window* window) {
-  if (!window)
-    return nullptr;
-
-  RootWindowController* root_window_controller =
-      GetRootWindowController(window);
-  if (!root_window_controller)
-    return nullptr;
-
-  WmRootWindowControllerAura* wm_root_window_controller =
-      root_window_controller->GetRootWindow()->GetProperty(
-          kWmRootWindowControllerKey);
-  if (wm_root_window_controller)
-    return wm_root_window_controller;
-
-  DCHECK_EQ(aura::Env::Mode::LOCAL, aura::Env::GetInstance()->mode());
-  // WmRootWindowControllerAura is owned by the RootWindowController's window.
-  return new WmRootWindowControllerAura(root_window_controller);
-}
-
-bool WmRootWindowControllerAura::HasShelf() {
-  return root_window_controller_->wm_shelf()->shelf_widget() != nullptr;
-}
-
-WmShelf* WmRootWindowControllerAura::GetShelf() {
-  return root_window_controller_->wm_shelf();
-}
-
-WmWindow* WmRootWindowControllerAura::GetWindow() {
-  return WmWindowAura::Get(root_window_controller_->GetRootWindow());
-}
-
-void WmRootWindowControllerAura::OnInitialWallpaperAnimationStarted() {
-  root_window_controller_->OnInitialWallpaperAnimationStarted();
-  WmRootWindowController::OnInitialWallpaperAnimationStarted();
-}
-
-void WmRootWindowControllerAura::OnWallpaperAnimationFinished(
-    views::Widget* widget) {
-  root_window_controller_->OnWallpaperAnimationFinished(widget);
-  WmRootWindowController::OnWallpaperAnimationFinished(widget);
-}
-
-bool WmRootWindowControllerAura::ShouldDestroyWindowInCloseChildWindows(
-    WmWindow* window) {
-  return WmWindowAura::GetAuraWindow(window)->owned_by_parent();
-}
-
-}  // namespace ash
diff --git a/ash/aura/wm_root_window_controller_aura.h b/ash/aura/wm_root_window_controller_aura.h
deleted file mode 100644
index cbeba00..0000000
--- a/ash/aura/wm_root_window_controller_aura.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_AURA_WM_ROOT_CONTROLLER_AURA_H_
-#define ASH_AURA_WM_ROOT_CONTROLLER_AURA_H_
-
-#include "ash/ash_export.h"
-#include "ash/common/wm_root_window_controller.h"
-#include "base/macros.h"
-
-namespace aura {
-class Window;
-}
-
-namespace ash {
-
-class RootWindowController;
-
-class ASH_EXPORT WmRootWindowControllerAura : public WmRootWindowController {
- public:
-  explicit WmRootWindowControllerAura(
-      RootWindowController* root_window_controller);
-  ~WmRootWindowControllerAura() override;
-
-  static WmRootWindowControllerAura* Get(aura::Window* window) {
-    return const_cast<WmRootWindowControllerAura*>(
-        Get(const_cast<const aura::Window*>(window)));
-  }
-  static const WmRootWindowControllerAura* Get(const aura::Window* window);
-
-  // WmRootWindowController:
-  bool HasShelf() override;
-  WmShelf* GetShelf() override;
-  WmWindow* GetWindow() override;
-  void OnInitialWallpaperAnimationStarted() override;
-  void OnWallpaperAnimationFinished(views::Widget* widget) override;
-
- protected:
-  // WmRootWindowController:
-  bool ShouldDestroyWindowInCloseChildWindows(WmWindow* window) override;
-
- private:
-  friend class RootWindowController;
-
-  RootWindowController* root_window_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(WmRootWindowControllerAura);
-};
-
-}  // namespace ash
-
-#endif  // ASH_AURA_WM_ROOT_CONTROLLER_AURA_H_
diff --git a/ash/aura/wm_window_aura.cc b/ash/aura/wm_window_aura.cc
index 371b048..0179758 100644
--- a/ash/aura/wm_window_aura.cc
+++ b/ash/aura/wm_window_aura.cc
@@ -5,7 +5,6 @@
 #include "ash/aura/wm_window_aura.h"
 
 #include "ash/aura/aura_layout_manager_adapter.h"
-#include "ash/aura/wm_root_window_controller_aura.h"
 #include "ash/aura/wm_shell_aura.h"
 #include "ash/common/ash_constants.h"
 #include "ash/common/shelf/shelf_item_types.h"
@@ -15,6 +14,7 @@
 #include "ash/common/wm_window_observer.h"
 #include "ash/common/wm_window_property.h"
 #include "ash/public/cpp/shell_window_ids.h"
+#include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
 #include "ash/shell.h"
 #include "ash/wm/resize_handle_window_targeter.h"
@@ -152,7 +152,11 @@
 
 WmRootWindowController* WmWindowAura::GetRootWindowController() {
   aura::Window* root = window_->GetRootWindow();
-  return root ? WmRootWindowControllerAura::Get(root) : nullptr;
+  if (!root)
+    return nullptr;
+
+  RootWindowController* rwc = RootWindowController::ForWindow(root);
+  return rwc ? rwc->wm_root_window_controller() : nullptr;
 }
 
 WmShell* WmWindowAura::GetShell() const {
diff --git a/ash/common/system/tray/tray_popup_utils.cc b/ash/common/system/tray/tray_popup_utils.cc
index 20e0db8..2abe1f6 100644
--- a/ash/common/system/tray/tray_popup_utils.cc
+++ b/ash/common/system/tray/tray_popup_utils.cc
@@ -270,8 +270,6 @@
       (kTrayToggleButtonWidth - toggle_size.width()) / 2;
   toggle->SetBorder(views::CreateEmptyBorder(
       gfx::Insets(vertical_padding, horizontal_padding)));
-  // TODO(varkha): remove this and implement toggle-button specific focus. See
-  // crbug.com/669124
   toggle->SetFocusPainter(CreateFocusPainter());
   toggle->SetAccessibleName(l10n_util::GetStringUTF16(accessible_name_id));
   return toggle;
diff --git a/ash/common/wm_root_window_controller.cc b/ash/common/wm_root_window_controller.cc
index 9063e95..c236c16 100644
--- a/ash/common/wm_root_window_controller.cc
+++ b/ash/common/wm_root_window_controller.cc
@@ -27,7 +27,12 @@
 #include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "ash/public/cpp/shell_window_ids.h"
+#include "ash/root_window_controller.h"
+#include "ash/shell.h"
 #include "base/memory/ptr_util.h"
+#include "ui/aura/env.h"
+#include "ui/aura/mus/window_mus.h"
+#include "ui/aura/mus/window_tree_client.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tree_host.h"
@@ -151,7 +156,13 @@
 
 }  // namespace
 
-WmRootWindowController::WmRootWindowController(WmWindow* root) : root_(root) {}
+WmRootWindowController::WmRootWindowController(
+    RootWindowController* root_window_controller,
+    WmWindow* root)
+    : root_window_controller_(root_window_controller), root_(root) {
+  DCHECK(root_window_controller_);
+  DCHECK(root_);
+}
 
 WmRootWindowController::~WmRootWindowController() {
   if (animating_wallpaper_widget_controller_.get())
@@ -199,6 +210,14 @@
                          : nullptr;
 }
 
+bool WmRootWindowController::HasShelf() {
+  return GetShelf()->shelf_widget() != nullptr;
+}
+
+WmShelf* WmRootWindowController::GetShelf() {
+  return root_window_controller_->wm_shelf();
+}
+
 void WmRootWindowController::CreateShelf() {
   WmShelf* shelf = GetShelf();
   if (shelf->IsShelfInitialized())
@@ -237,6 +256,10 @@
   return shelf_widget->status_area_widget()->system_tray();
 }
 
+WmWindow* WmRootWindowController::GetWindow() {
+  return root_;
+}
+
 WmWindow* WmRootWindowController::GetContainer(int container_id) {
   return root_->GetChildByShellWindowId(container_id);
 }
@@ -301,10 +324,13 @@
                               views::MENU_ANCHOR_TOPLEFT, source_type));
 }
 
-void WmRootWindowController::OnInitialWallpaperAnimationStarted() {}
+void WmRootWindowController::OnInitialWallpaperAnimationStarted() {
+  root_window_controller_->OnInitialWallpaperAnimationStarted();
+}
 
 void WmRootWindowController::OnWallpaperAnimationFinished(
     views::Widget* widget) {
+  root_window_controller_->OnWallpaperAnimationFinished(widget);
   WmShell::Get()->wallpaper_delegate()->OnWallpaperAnimationFinished();
   // Only removes old component when wallpaper animation finished. If we
   // remove the old one before the new wallpaper is done fading in there will
@@ -626,6 +652,20 @@
     shelf->ShutdownShelf();
 }
 
+bool WmRootWindowController::ShouldDestroyWindowInCloseChildWindows(
+    WmWindow* window) {
+  if (!WmWindowAura::GetAuraWindow(window)->owned_by_parent())
+    return false;
+
+  if (aura::Env::GetInstance()->mode() == aura::Env::Mode::LOCAL)
+    return true;
+
+  aura::WindowMus* window_mus =
+      aura::WindowMus::Get(WmWindowAura::GetAuraWindow(window));
+  return Shell::window_tree_client()->WasCreatedByThisClient(window_mus) ||
+         Shell::window_tree_client()->IsRoot(window_mus);
+}
+
 void WmRootWindowController::OnMenuClosed() {
   menu_runner_.reset();
   menu_model_adapter_.reset();
diff --git a/ash/common/wm_root_window_controller.h b/ash/common/wm_root_window_controller.h
index 6ac288a..15e811c 100644
--- a/ash/common/wm_root_window_controller.h
+++ b/ash/common/wm_root_window_controller.h
@@ -30,6 +30,7 @@
 class AnimatingWallpaperWidgetController;
 class DockedWindowLayoutManager;
 class PanelLayoutManager;
+class RootWindowController;
 class SystemModalContainerLayoutManager;
 class SystemTray;
 class WallpaperWidgetController;
@@ -46,8 +47,9 @@
 // Provides state associated with a root of a window hierarchy.
 class ASH_EXPORT WmRootWindowController {
  public:
-  explicit WmRootWindowController(WmWindow* window);
-  virtual ~WmRootWindowController();
+  WmRootWindowController(RootWindowController* root_window_controller,
+                         WmWindow* window);
+  ~WmRootWindowController();
 
   DockedWindowLayoutManager* docked_window_layout_manager() {
     return docked_window_layout_manager_;
@@ -90,9 +92,9 @@
   SystemModalContainerLayoutManager* GetSystemModalLayoutManager(
       WmWindow* window);
 
-  virtual bool HasShelf() = 0;
+  bool HasShelf();
 
-  virtual WmShelf* GetShelf() = 0;
+  WmShelf* GetShelf();
 
   // Creates the shelf for this root window and notifies observers.
   void CreateShelf();
@@ -105,7 +107,7 @@
   SystemTray* GetSystemTray();
 
   // Returns the window associated with this WmRootWindowController.
-  virtual WmWindow* GetWindow() = 0;
+  WmWindow* GetWindow();
 
   // Gets the WmWindow whose shell window id is |container_id|.
   WmWindow* GetContainer(int container_id);
@@ -135,8 +137,8 @@
 
   // Called when the wallpaper animation has started or finished.
   // TODO: port remaining classic ash wallpaper functionality here.
-  virtual void OnInitialWallpaperAnimationStarted();
-  virtual void OnWallpaperAnimationFinished(views::Widget* widget);
+  void OnInitialWallpaperAnimationStarted();
+  void OnWallpaperAnimationFinished(views::Widget* widget);
 
   // Called when the login status changes after login (such as lock/unlock).
   // TODO(oshima): Investigate if we can merge this and |OnLoginStateChanged|.
@@ -160,14 +162,19 @@
   // Called during shutdown to destroy state such as windows and LayoutManagers.
   void CloseChildWindows();
 
+ private:
+  friend class RootWindowController;
+
   // Called from CloseChildWindows() to determine if the specified window should
   // be destroyed.
-  virtual bool ShouldDestroyWindowInCloseChildWindows(WmWindow* window) = 0;
+  bool ShouldDestroyWindowInCloseChildWindows(WmWindow* window);
 
- private:
   // Callback for MenuModelAdapter.
   void OnMenuClosed();
 
+  // TODO(sky): remove this, needed until merge two classes.
+  RootWindowController* root_window_controller_;
+
   WmWindow* root_;
 
   // LayoutManagers are owned by the window they are installed on.
diff --git a/ash/mus/BUILD.gn b/ash/mus/BUILD.gn
index f40d004c..bde44a8 100644
--- a/ash/mus/BUILD.gn
+++ b/ash/mus/BUILD.gn
@@ -24,8 +24,6 @@
     "bridge/immersive_handler_factory_mus.h",
     "bridge/wm_lookup_mus.cc",
     "bridge/wm_lookup_mus.h",
-    "bridge/wm_root_window_controller_mus.cc",
-    "bridge/wm_root_window_controller_mus.h",
     "bridge/wm_shell_mus.cc",
     "bridge/wm_shell_mus.h",
     "bridge/wm_window_mus.cc",
diff --git a/ash/mus/bridge/wm_lookup_mus.cc b/ash/mus/bridge/wm_lookup_mus.cc
index 4f18f12..8f96d88 100644
--- a/ash/mus/bridge/wm_lookup_mus.cc
+++ b/ash/mus/bridge/wm_lookup_mus.cc
@@ -4,9 +4,9 @@
 
 #include "ash/mus/bridge/wm_lookup_mus.h"
 
-#include "ash/mus/bridge/wm_root_window_controller_mus.h"
 #include "ash/mus/bridge/wm_shell_mus.h"
 #include "ash/mus/bridge/wm_window_mus.h"
+#include "ash/mus/root_window_controller.h"
 #include "ui/views/widget/widget.h"
 
 namespace ash {
@@ -23,7 +23,10 @@
 
 WmRootWindowController* WmLookupMus::GetRootWindowControllerWithDisplayId(
     int64_t id) {
-  return WmShellMus::Get()->GetRootWindowControllerWithDisplayId(id);
+  return WmShellMus::Get()
+      ->GetRootWindowControllerWithDisplayId(id)
+      ->ash_root_window_controller()
+      ->wm_root_window_controller();
 }
 
 WmWindow* WmLookupMus::GetWindowForWidget(views::Widget* widget) {
diff --git a/ash/mus/bridge/wm_root_window_controller_mus.cc b/ash/mus/bridge/wm_root_window_controller_mus.cc
deleted file mode 100644
index a5a3279a..0000000
--- a/ash/mus/bridge/wm_root_window_controller_mus.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/mus/bridge/wm_root_window_controller_mus.h"
-
-#include "ash/common/shelf/wm_shelf.h"
-#include "ash/mus/bridge/wm_shell_mus.h"
-#include "ash/mus/bridge/wm_window_mus.h"
-#include "ash/mus/root_window_controller.h"
-#include "ash/mus/window_manager.h"
-#include "ui/aura/mus/window_mus.h"
-#include "ui/aura/mus/window_tree_client.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_property.h"
-#include "ui/display/display.h"
-
-DECLARE_WINDOW_PROPERTY_TYPE(ash::mus::WmRootWindowControllerMus*);
-
-namespace {
-
-DEFINE_LOCAL_WINDOW_PROPERTY_KEY(ash::mus::WmRootWindowControllerMus*,
-                                 kWmRootWindowControllerKey,
-                                 nullptr);
-
-}  // namespace
-
-namespace ash {
-namespace mus {
-
-WmRootWindowControllerMus::WmRootWindowControllerMus(
-    WmShellMus* shell,
-    RootWindowController* root_window_controller)
-    : WmRootWindowController(WmWindowMus::Get(root_window_controller->root())),
-      shell_(shell),
-      root_window_controller_(root_window_controller) {
-  shell_->AddRootWindowController(this);
-  root_window_controller_->root()->SetProperty(kWmRootWindowControllerKey,
-                                               this);
-}
-
-WmRootWindowControllerMus::~WmRootWindowControllerMus() {
-  shell_->RemoveRootWindowController(this);
-}
-
-// static
-const WmRootWindowControllerMus* WmRootWindowControllerMus::Get(
-    const aura::Window* window) {
-  if (!window)
-    return nullptr;
-
-  return window->GetRootWindow()->GetProperty(kWmRootWindowControllerKey);
-}
-
-gfx::Point WmRootWindowControllerMus::ConvertPointToScreen(
-    const WmWindowMus* source,
-    const gfx::Point& point) const {
-  gfx::Point point_in_root =
-      source->ConvertPointToTarget(source->GetRootWindow(), point);
-  point_in_root += GetDisplay().bounds().OffsetFromOrigin();
-  return point_in_root;
-}
-
-const display::Display& WmRootWindowControllerMus::GetDisplay() const {
-  return root_window_controller_->display();
-}
-
-void WmRootWindowControllerMus::MoveWindowsTo(WmWindow* dest) {
-  WmRootWindowController::MoveWindowsTo(dest);
-}
-
-bool WmRootWindowControllerMus::HasShelf() {
-  return GetShelf() != nullptr;
-}
-
-WmShelf* WmRootWindowControllerMus::GetShelf() {
-  return root_window_controller_->wm_shelf();
-}
-
-WmWindow* WmRootWindowControllerMus::GetWindow() {
-  return WmWindowMus::Get(root_window_controller_->root());
-}
-
-bool WmRootWindowControllerMus::ShouldDestroyWindowInCloseChildWindows(
-    WmWindow* window) {
-  aura::WindowTreeClient* window_tree_client =
-      root_window_controller_->window_manager()->window_tree_client();
-  aura::Window* aura_window = WmWindowMus::GetAuraWindow(window);
-  aura::WindowMus* window_mus = aura::WindowMus::Get(aura_window);
-  return window_tree_client->WasCreatedByThisClient(window_mus) ||
-         window_tree_client->IsRoot(window_mus);
-}
-
-}  // namespace mus
-}  // namespace ash
diff --git a/ash/mus/bridge/wm_root_window_controller_mus.h b/ash/mus/bridge/wm_root_window_controller_mus.h
deleted file mode 100644
index 8d0b64ee..0000000
--- a/ash/mus/bridge/wm_root_window_controller_mus.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_MUS_BRIDGE_WM_ROOT_WINDOW_CONTROLLER_MUS_H_
-#define ASH_MUS_BRIDGE_WM_ROOT_WINDOW_CONTROLLER_MUS_H_
-
-#include "ash/common/wm_root_window_controller.h"
-#include "base/macros.h"
-
-namespace aura {
-class Window;
-}
-
-namespace display {
-class Display;
-}
-
-namespace ash {
-namespace mus {
-
-class RootWindowController;
-class WmShellMus;
-class WmWindowMus;
-
-// WmRootWindowController implementations for mus.
-class WmRootWindowControllerMus : public WmRootWindowController {
- public:
-  WmRootWindowControllerMus(WmShellMus* shell,
-                            RootWindowController* root_window_controller);
-  ~WmRootWindowControllerMus() override;
-
-  static WmRootWindowControllerMus* Get(aura::Window* window) {
-    return const_cast<WmRootWindowControllerMus*>(
-        Get(const_cast<const aura::Window*>(window)));
-  }
-  static const WmRootWindowControllerMus* Get(const aura::Window* window);
-
-  RootWindowController* root_window_controller() {
-    return root_window_controller_;
-  }
-
-  // Screen conversion functions.
-  gfx::Point ConvertPointToScreen(const WmWindowMus* source,
-                                  const gfx::Point& point) const;
-
-  const display::Display& GetDisplay() const;
-
-  // Exposed as public so WindowManager can call it.
-  void MoveWindowsTo(WmWindow* dest);
-
-  // WmRootWindowController:
-  bool HasShelf() override;
-  WmShelf* GetShelf() override;
-  WmWindow* GetWindow() override;
-
- private:
-  friend class RootWindowController;
-
-  // WmRootWindowController:
-  bool ShouldDestroyWindowInCloseChildWindows(WmWindow* window) override;
-
-  WmShellMus* shell_;
-  RootWindowController* root_window_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(WmRootWindowControllerMus);
-};
-
-}  // namespace mus
-}  // namespace ash
-
-#endif  // ASH_MUS_BRIDGE_WM_ROOT_WINDOW_CONTROLLER_MUS_H_
diff --git a/ash/mus/bridge/wm_shell_mus.cc b/ash/mus/bridge/wm_shell_mus.cc
index 52f7b6b..a839b12 100644
--- a/ash/mus/bridge/wm_shell_mus.cc
+++ b/ash/mus/bridge/wm_shell_mus.cc
@@ -22,7 +22,6 @@
 #include "ash/mus/accelerators/accelerator_controller_delegate_mus.h"
 #include "ash/mus/accelerators/accelerator_controller_registrar.h"
 #include "ash/mus/bridge/immersive_handler_factory_mus.h"
-#include "ash/mus/bridge/wm_root_window_controller_mus.h"
 #include "ash/mus/bridge/wm_window_mus.h"
 #include "ash/mus/bridge/workspace_event_handler_mus.h"
 #include "ash/mus/drag_window_resizer.h"
@@ -165,27 +164,25 @@
   return static_cast<WmShellMus*>(WmShell::Get());
 }
 
-void WmShellMus::AddRootWindowController(
-    WmRootWindowControllerMus* controller) {
+void WmShellMus::AddRootWindowController(RootWindowController* controller) {
   root_window_controllers_.push_back(controller);
   // The first root window will be the initial root for new windows.
   if (!GetRootWindowForNewWindows())
-    set_root_window_for_new_windows(controller->GetWindow());
+    set_root_window_for_new_windows(WmWindowMus::Get(controller->root()));
 }
 
-void WmShellMus::RemoveRootWindowController(
-    WmRootWindowControllerMus* controller) {
+void WmShellMus::RemoveRootWindowController(RootWindowController* controller) {
   auto iter = std::find(root_window_controllers_.begin(),
                         root_window_controllers_.end(), controller);
   DCHECK(iter != root_window_controllers_.end());
   root_window_controllers_.erase(iter);
 }
 
-WmRootWindowControllerMus* WmShellMus::GetRootWindowControllerWithDisplayId(
+RootWindowController* WmShellMus::GetRootWindowControllerWithDisplayId(
     int64_t id) {
-  for (WmRootWindowControllerMus* root_window_controller :
+  for (RootWindowController* root_window_controller :
        root_window_controllers_) {
-    if (root_window_controller->GetDisplay().id() == id)
+    if (root_window_controller->display().id() == id)
       return root_window_controller;
   }
   NOTREACHED();
@@ -228,11 +225,12 @@
 }
 
 WmWindow* WmShellMus::GetPrimaryRootWindow() {
-  return root_window_controllers_[0]->GetWindow();
+  return WmWindowMus::Get(root_window_controllers_[0]->root());
 }
 
 WmWindow* WmShellMus::GetRootWindowForDisplayId(int64_t display_id) {
-  return GetRootWindowControllerWithDisplayId(display_id)->GetWindow();
+  return WmWindowMus::Get(
+      GetRootWindowControllerWithDisplayId(display_id)->root());
 }
 
 const display::ManagedDisplayInfo& WmShellMus::GetDisplayInfo(
@@ -274,10 +272,10 @@
 
 void WmShellMus::SetDisplayWorkAreaInsets(WmWindow* window,
                                           const gfx::Insets& insets) {
-  WmRootWindowControllerMus* root_window_controller_mus =
-      static_cast<WmWindowMus*>(window)->GetRootWindowControllerMus();
-  root_window_controller_mus->root_window_controller()->SetWorkAreaInests(
-      insets);
+  RootWindowController* root_window_controller =
+      RootWindowController::ForWindow(
+          static_cast<WmWindowMus*>(window)->aura_window());
+  root_window_controller->SetWorkAreaInests(insets);
 }
 
 bool WmShellMus::IsPinned() {
@@ -308,7 +306,7 @@
 std::vector<WmWindow*> WmShellMus::GetAllRootWindows() {
   std::vector<WmWindow*> wm_windows(root_window_controllers_.size());
   for (size_t i = 0; i < root_window_controllers_.size(); ++i)
-    wm_windows[i] = root_window_controllers_[i]->GetWindow();
+    wm_windows[i] = WmWindowMus::Get(root_window_controllers_[i]->root());
   return wm_windows;
 }
 
diff --git a/ash/mus/bridge/wm_shell_mus.h b/ash/mus/bridge/wm_shell_mus.h
index d7e3cac..4b13ba4 100644
--- a/ash/mus/bridge/wm_shell_mus.h
+++ b/ash/mus/bridge/wm_shell_mus.h
@@ -29,8 +29,8 @@
 class AcceleratorControllerDelegateMus;
 class AcceleratorControllerRegistrar;
 class ImmersiveHandlerFactoryMus;
+class RootWindowController;
 class WindowManager;
-class WmRootWindowControllerMus;
 class WmShellMusTestApi;
 
 // WmShell implementation for mus.
@@ -44,10 +44,10 @@
 
   static WmShellMus* Get();
 
-  void AddRootWindowController(WmRootWindowControllerMus* controller);
-  void RemoveRootWindowController(WmRootWindowControllerMus* controller);
+  void AddRootWindowController(RootWindowController* controller);
+  void RemoveRootWindowController(RootWindowController* controller);
 
-  WmRootWindowControllerMus* GetRootWindowControllerWithDisplayId(int64_t id);
+  RootWindowController* GetRootWindowControllerWithDisplayId(int64_t id);
 
   AcceleratorControllerDelegateMus* accelerator_controller_delegate() {
     return accelerator_controller_delegate_.get();
@@ -125,7 +125,7 @@
 
   views::PointerWatcherEventRouter* pointer_watcher_event_router_;
 
-  std::vector<WmRootWindowControllerMus*> root_window_controllers_;
+  std::vector<RootWindowController*> root_window_controllers_;
 
   std::unique_ptr<AcceleratorControllerDelegateMus>
       accelerator_controller_delegate_;
diff --git a/ash/mus/bridge/wm_window_mus.cc b/ash/mus/bridge/wm_window_mus.cc
index 3e58848..289ed40 100644
--- a/ash/mus/bridge/wm_window_mus.cc
+++ b/ash/mus/bridge/wm_window_mus.cc
@@ -13,9 +13,9 @@
 #include "ash/common/wm_transient_window_observer.h"
 #include "ash/common/wm_window_observer.h"
 #include "ash/common/wm_window_property.h"
-#include "ash/mus/bridge/wm_root_window_controller_mus.h"
 #include "ash/mus/bridge/wm_shell_mus.h"
 #include "ash/mus/property_util.h"
+#include "ash/mus/root_window_controller.h"
 #include "ash/mus/window_manager.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/wm/window_properties.h"
@@ -57,19 +57,10 @@
   return WmWindowMus::Get(widget->GetNativeView());
 }
 
-const WmRootWindowControllerMus* WmWindowMus::GetRootWindowControllerMus()
-    const {
-  return WmRootWindowControllerMus::Get(aura_window()->GetRootWindow());
-}
-
 bool WmWindowMus::IsContainer() const {
   return GetShellWindowId() != kShellWindowId_Invalid;
 }
 
-WmRootWindowController* WmWindowMus::GetRootWindowController() {
-  return GetRootWindowControllerMus();
-}
-
 WmShell* WmWindowMus::GetShell() const {
   return WmShellMus::Get();
 }
diff --git a/ash/mus/bridge/wm_window_mus.h b/ash/mus/bridge/wm_window_mus.h
index f4c8fcd..5483094 100644
--- a/ash/mus/bridge/wm_window_mus.h
+++ b/ash/mus/bridge/wm_window_mus.h
@@ -21,8 +21,6 @@
 namespace ash {
 namespace mus {
 
-class WmRootWindowControllerMus;
-
 // WmWindow implementation for mus.
 //
 // WmWindowMus is tied to the life of the underlying aura::Window (it is stored
@@ -43,12 +41,6 @@
 
   static WmWindowMus* Get(views::Widget* widget);
 
-  WmRootWindowControllerMus* GetRootWindowControllerMus() {
-    return const_cast<WmRootWindowControllerMus*>(
-        const_cast<const WmWindowMus*>(this)->GetRootWindowControllerMus());
-  }
-  const WmRootWindowControllerMus* GetRootWindowControllerMus() const;
-
   static WmWindowMus* AsWmWindowMus(WmWindow* window) {
     return static_cast<WmWindowMus*>(window);
   }
@@ -60,7 +52,6 @@
   bool IsContainer() const;
 
   // WmWindow:
-  WmRootWindowController* GetRootWindowController() override;
   WmShell* GetShell() const override;
   void CloseWidget() override;
   void AddLimitedPreTargetHandler(ui::EventHandler* handler) override;
diff --git a/ash/mus/root_window_controller.cc b/ash/mus/root_window_controller.cc
index 337cf849..438e0cd 100644
--- a/ash/mus/root_window_controller.cc
+++ b/ash/mus/root_window_controller.cc
@@ -19,7 +19,6 @@
 #include "ash/common/wm/dock/docked_window_layout_manager.h"
 #include "ash/common/wm/panels/panel_layout_manager.h"
 #include "ash/common/wm/root_window_layout_manager.h"
-#include "ash/mus/bridge/wm_root_window_controller_mus.h"
 #include "ash/mus/bridge/wm_shell_mus.h"
 #include "ash/mus/bridge/wm_window_mus.h"
 #include "ash/mus/non_client_frame_controller.h"
@@ -27,7 +26,7 @@
 #include "ash/mus/screen_mus.h"
 #include "ash/mus/window_manager.h"
 #include "ash/public/cpp/shell_window_ids.h"
-#include "ash/wm/stacking_controller.h"
+#include "ash/root_window_settings.h"
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
@@ -41,13 +40,20 @@
 #include "ui/aura/mus/window_tree_client.h"
 #include "ui/aura/mus/window_tree_host_mus.h"
 #include "ui/aura/window.h"
+#include "ui/aura/window_property.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/display/display_list.h"
 
+DECLARE_WINDOW_PROPERTY_TYPE(ash::mus::RootWindowController*);
+
 namespace ash {
 namespace mus {
 namespace {
 
+DEFINE_LOCAL_WINDOW_PROPERTY_KEY(ash::mus::RootWindowController*,
+                                 kRootWindowControllerKey,
+                                 nullptr);
+
 bool IsFullscreen(aura::PropertyConverter* property_converter,
                   const std::vector<uint8_t>& transport_data) {
   using ui::mojom::WindowManager;
@@ -63,26 +69,21 @@
 RootWindowController::RootWindowController(
     WindowManager* window_manager,
     std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
-    const display::Display& display)
+    const display::Display& display,
+    ash::RootWindowController::RootWindowType root_window_type)
     : window_manager_(window_manager),
-      window_tree_host_(std::move(window_tree_host)),
+      window_tree_host_(window_tree_host.get()),
       window_count_(0),
-      display_(display),
-      wm_shelf_(base::MakeUnique<WmShelf>()) {
-  wm_root_window_controller_ = base::MakeUnique<WmRootWindowControllerMus>(
-      window_manager_->shell(), this);
-  wm_root_window_controller_->CreateContainers();
-  wm_root_window_controller_->CreateLayoutManagers();
-
-  parenting_client_ = base::MakeUnique<StackingController>();
-  aura::client::SetWindowParentingClient(root(), parenting_client_.get());
+      display_(display) {
+  ash::InitRootWindowSettings(window_tree_host->window());
+  window_tree_host->window()->SetProperty(kRootWindowControllerKey, this);
+  WmShellMus::Get()->AddRootWindowController(this);
+  ash_root_window_controller_ = base::WrapUnique(
+      new ash::RootWindowController(nullptr, window_tree_host.release()));
+  ash_root_window_controller_->Init(root_window_type);
 
   disconnected_app_handler_.reset(new DisconnectedAppHandler(root()));
 
-  // Force a layout of the root, and its children, RootWindowLayout handles
-  // both.
-  wm_root_window_controller_->root_window_layout_manager()->OnWindowResized();
-
   for (size_t i = 0; i < kNumActivatableShellWindowIds; ++i) {
     window_manager_->window_manager_client()->AddActivationParent(
         GetWindowByShellWindowId(kActivatableShellWindowIds[i])->aura_window());
@@ -91,16 +92,18 @@
 
 RootWindowController::~RootWindowController() {
   Shutdown();
-  // Destroy WindowTreeHost last as it owns the root Window.
-  wm_shelf_.reset();
-  wm_root_window_controller_.reset();
-  window_tree_host_.reset();
+  ash_root_window_controller_.reset();
+  WmShellMus::Get()->RemoveRootWindowController(this);
+}
+
+// static
+RootWindowController* RootWindowController::ForWindow(aura::Window* window) {
+  return window->GetRootWindow()->GetProperty(kRootWindowControllerKey);
 }
 
 void RootWindowController::Shutdown() {
   // NOTE: Shutdown() may be called multiple times.
-  wm_root_window_controller_->ResetRootForNewWindowsIfNecessary();
-  wm_root_window_controller_->CloseChildWindows();
+  ash_root_window_controller_->Shutdown();
 }
 
 service_manager::Connector* RootWindowController::GetConnector() {
@@ -160,7 +163,8 @@
   } else {
     WmWindowMus* root = WmWindowMus::Get(this->root());
     gfx::Point origin =
-        wm_root_window_controller_->ConvertPointToScreen(root, gfx::Point());
+        root->ConvertPointToTarget(root->GetRootWindow(), gfx::Point());
+    origin += display_.bounds().OffsetFromOrigin();
     gfx::Rect bounds_in_screen(origin, bounds.size());
     static_cast<WmWindowMus*>(
         ash::wm::GetDefaultParent(WmWindowMus::Get(context),
@@ -187,9 +191,10 @@
 
   // Push new display insets to service:ui if we have a connection.
   auto* display_controller = window_manager_->GetDisplayController();
-  if (display_controller)
+  if (display_controller) {
     display_controller->SetDisplayWorkArea(display_.id(),
                                            display_.bounds().size(), insets);
+  }
 }
 
 void RootWindowController::SetDisplay(const display::Display& display) {
diff --git a/ash/mus/root_window_controller.h b/ash/mus/root_window_controller.h
index d4c5532..206b0dc 100644
--- a/ash/mus/root_window_controller.h
+++ b/ash/mus/root_window_controller.h
@@ -8,14 +8,12 @@
 #include <memory>
 
 #include "ash/mus/disconnected_app_handler.h"
+#include "ash/root_window_controller.h"
 #include "services/ui/public/interfaces/window_manager_constants.mojom.h"
 #include "ui/display/display.h"
 
 namespace aura {
 class WindowTreeHostMus;
-namespace client {
-class WindowParentingClient;
-}
 }
 
 namespace gfx {
@@ -27,13 +25,9 @@
 }
 
 namespace ash {
-
-class WmShelf;
-
 namespace mus {
 
 class WindowManager;
-class WmRootWindowControllerMus;
 class WmTestBase;
 class WmTestHelper;
 class WmWindowMus;
@@ -41,23 +35,26 @@
 // RootWindowController manages the windows and state for a single display.
 // RootWindowController takes ownership of the WindowTreeHostMus that it passed
 // to it.
+// TODO(sky): rename this (or possibly just remove entirely).
+// http://crbug.com/671246
 class RootWindowController {
  public:
   RootWindowController(
       WindowManager* window_manager,
       std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
-      const display::Display& display);
+      const display::Display& display,
+      ash::RootWindowController::RootWindowType root_window_type);
   ~RootWindowController();
 
+  // Returns the RootWindowController for |window|'s root.
+  static RootWindowController* ForWindow(aura::Window* window);
+
   void Shutdown();
 
   service_manager::Connector* GetConnector();
 
   aura::Window* root();
   const aura::Window* root() const;
-  WmRootWindowControllerMus* wm_root_window_controller() {
-    return wm_root_window_controller_.get();
-  }
 
   aura::Window* NewTopLevelWindow(
       ui::mojom::WindowType window_type,
@@ -70,13 +67,13 @@
 
   WindowManager* window_manager() { return window_manager_; }
 
-  aura::WindowTreeHostMus* window_tree_host() {
-    return window_tree_host_.get();
-  }
+  aura::WindowTreeHostMus* window_tree_host() { return window_tree_host_; }
 
   const display::Display& display() const { return display_; }
 
-  WmShelf* wm_shelf() { return wm_shelf_.get(); }
+  ash::RootWindowController* ash_root_window_controller() {
+    return ash_root_window_controller_.get();
+  }
 
  private:
   friend class WmTestBase;
@@ -88,16 +85,13 @@
   gfx::Rect GetMaximizedWindowBounds() const;
 
   WindowManager* window_manager_;
-  std::unique_ptr<aura::WindowTreeHostMus> window_tree_host_;
+  std::unique_ptr<ash::RootWindowController> ash_root_window_controller_;
+  // Owned by |ash_root_window_controller_|.
+  aura::WindowTreeHostMus* window_tree_host_;
   int window_count_ = 0;
 
   display::Display display_;
 
-  std::unique_ptr<WmRootWindowControllerMus> wm_root_window_controller_;
-  std::unique_ptr<WmShelf> wm_shelf_;
-
-  std::unique_ptr<aura::client::WindowParentingClient> parenting_client_;
-
   std::unique_ptr<DisconnectedAppHandler> disconnected_app_handler_;
 
   DISALLOW_COPY_AND_ASSIGN(RootWindowController);
diff --git a/ash/mus/window_manager.cc b/ash/mus/window_manager.cc
index 59464880..ac91f77 100644
--- a/ash/mus/window_manager.cc
+++ b/ash/mus/window_manager.cc
@@ -10,11 +10,11 @@
 
 #include "ash/common/wm/container_finder.h"
 #include "ash/common/wm/window_state.h"
+#include "ash/common/wm_root_window_controller.h"
 #include "ash/display/screen_position_controller.h"
 #include "ash/mus/accelerators/accelerator_handler.h"
 #include "ash/mus/accelerators/accelerator_ids.h"
 #include "ash/mus/bridge/wm_lookup_mus.h"
-#include "ash/mus/bridge/wm_root_window_controller_mus.h"
 #include "ash/mus/bridge/wm_shell_mus.h"
 #include "ash/mus/bridge/wm_window_mus.h"
 #include "ash/mus/move_event_handler.h"
@@ -27,6 +27,7 @@
 #include "ash/mus/window_manager_observer.h"
 #include "ash/mus/window_properties.h"
 #include "ash/public/cpp/shell_window_ids.h"
+#include "ash/shell.h"
 #include "ash/wm/ash_focus_rules.h"
 #include "ash/wm/event_client_impl.h"
 #include "ash/wm/window_properties.h"
@@ -95,6 +96,7 @@
 WindowManager::~WindowManager() {
   Shutdown();
   aura::Env::GetInstance()->RemoveObserver(this);
+  ash::Shell::set_window_tree_client(nullptr);
 }
 
 void WindowManager::Init(
@@ -104,6 +106,9 @@
   DCHECK(!window_tree_client_);
   window_tree_client_ = std::move(window_tree_client);
 
+  DCHECK_EQ(nullptr, ash::Shell::window_tree_client());
+  ash::Shell::set_window_tree_client(window_tree_client_.get());
+
   aura::Env::GetInstance()->AddObserver(this);
 
   // |connector_| will be null in some tests.
@@ -204,10 +209,10 @@
 
 RootWindowController* WindowManager::CreateRootWindowController(
     std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
-    const display::Display& display) {
-  // TODO(sky): this is temporary, should use RootWindowController directly.
-  aura::client::SetCaptureClient(window_tree_host->window(),
-                                 wm_state_->capture_controller());
+    const display::Display& display,
+    ash::RootWindowController::RootWindowType root_window_type) {
+  // TODO(sky): all of these calls to SetFooClient() are done in
+  // Shell::InitRootWindow(). When Shell is used these can be removed.
   aura::client::SetFocusClient(window_tree_host->window(),
                                focus_controller_.get());
   aura::client::SetActivationClient(window_tree_host->window(),
@@ -217,13 +222,16 @@
                                         screen_position_controller_.get());
 
   std::unique_ptr<RootWindowController> root_window_controller_ptr(
-      new RootWindowController(this, std::move(window_tree_host), display));
+      new RootWindowController(this, std::move(window_tree_host), display,
+                               root_window_type));
   RootWindowController* root_window_controller =
       root_window_controller_ptr.get();
   root_window_controllers_.insert(std::move(root_window_controller_ptr));
 
   // TODO: this should be called when logged in. See http://crbug.com/654606.
-  root_window_controller->wm_root_window_controller()->CreateShelf();
+  root_window_controller->ash_root_window_controller()
+      ->wm_root_window_controller()
+      ->CreateShelf();
 
   for (auto& observer : observers_)
     observer.OnRootWindowControllerAdded(root_window_controller);
@@ -238,8 +246,8 @@
     RootWindowController* root_window_controller) {
   if (root_window_controllers_.size() > 1) {
     DCHECK_NE(root_window_controller, GetPrimaryRootWindowController());
-    root_window_controller->wm_root_window_controller()->MoveWindowsTo(
-        WmWindowMus::Get(GetPrimaryRootWindowController()->root()));
+    root_window_controller->ash_root_window_controller()->MoveWindowsTo(
+        GetPrimaryRootWindowController()->root());
   }
 
   root_window_controller->Shutdown();
@@ -303,9 +311,10 @@
 }
 
 RootWindowController* WindowManager::GetPrimaryRootWindowController() {
-  return static_cast<WmRootWindowControllerMus*>(
-             WmShell::Get()->GetPrimaryRootWindowController())
-      ->root_window_controller();
+  return RootWindowController::ForWindow(
+      static_cast<WmWindowMus*>(
+          WmShell::Get()->GetPrimaryRootWindowController()->GetWindow())
+          ->aura_window());
 }
 
 RootWindowController*
@@ -318,11 +327,9 @@
       return root_window_controller_ptr.get();
   }
 
-  return static_cast<WmRootWindowControllerMus*>(
-             WmShellMus::Get()
-                 ->GetRootWindowForNewWindows()
-                 ->GetRootWindowController())
-      ->root_window_controller();
+  return RootWindowController::ForWindow(
+      static_cast<WmWindowMus*>(WmShellMus::Get()->GetRootWindowForNewWindows())
+          ->aura_window());
 }
 
 void WindowManager::OnEmbed(
@@ -427,7 +434,12 @@
 void WindowManager::OnWmNewDisplay(
     std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
     const display::Display& display) {
-  CreateRootWindowController(std::move(window_tree_host), display);
+  ash::RootWindowController::RootWindowType root_window_type =
+      screen_->display_list().displays().size() == 1
+          ? ash::RootWindowController::RootWindowType::PRIMARY
+          : ash::RootWindowController::RootWindowType::SECONDARY;
+  CreateRootWindowController(std::move(window_tree_host), display,
+                             root_window_type);
 }
 
 void WindowManager::OnWmDisplayRemoved(
diff --git a/ash/mus/window_manager.h b/ash/mus/window_manager.h
index 60422783..6523a33 100644
--- a/ash/mus/window_manager.h
+++ b/ash/mus/window_manager.h
@@ -10,6 +10,7 @@
 #include <memory>
 #include <set>
 
+#include "ash/root_window_controller.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/observer_list.h"
@@ -127,7 +128,8 @@
 
   RootWindowController* CreateRootWindowController(
       std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
-      const display::Display& display);
+      const display::Display& display,
+      ash::RootWindowController::RootWindowType root_window_type);
 
   // Deletes the specified RootWindowController. Called when a display is
   // removed.
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index d31636cd..b8e46a33 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -9,7 +9,6 @@
 
 #include "ash/ash_touch_exploration_manager_chromeos.h"
 #include "ash/aura/aura_layout_manager_adapter.h"
-#include "ash/aura/wm_root_window_controller_aura.h"
 #include "ash/aura/wm_window_aura.h"
 #include "ash/common/ash_constants.h"
 #include "ash/common/ash_switches.h"
@@ -37,6 +36,7 @@
 #include "ash/common/wm/window_state.h"
 #include "ash/common/wm/workspace/workspace_layout_manager.h"
 #include "ash/common/wm/workspace_controller.h"
+#include "ash/common/wm_root_window_controller.h"
 #include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "ash/high_contrast/high_contrast_controller.h"
@@ -139,20 +139,31 @@
 
 }  // namespace
 
+RootWindowController::~RootWindowController() {
+  Shutdown();
+  ash_host_.reset();
+  mus_window_tree_host_.reset();
+  // The CaptureClient needs to be around for as long as the RootWindow is
+  // valid.
+  capture_client_.reset();
+}
+
 void RootWindowController::CreateForPrimaryDisplay(AshWindowTreeHost* host) {
-  RootWindowController* controller = new RootWindowController(host);
-  controller->Init(RootWindowController::PRIMARY);
+  RootWindowController* controller = new RootWindowController(host, nullptr);
+  controller->Init(RootWindowType::PRIMARY);
 }
 
 void RootWindowController::CreateForSecondaryDisplay(AshWindowTreeHost* host) {
-  RootWindowController* controller = new RootWindowController(host);
-  controller->Init(RootWindowController::SECONDARY);
+  RootWindowController* controller = new RootWindowController(host, nullptr);
+  controller->Init(RootWindowType::SECONDARY);
 }
 
 // static
 RootWindowController* RootWindowController::ForWindow(
     const aura::Window* window) {
-  CHECK(Shell::HasInstance());
+  DCHECK(window);
+  CHECK(WmShell::HasInstance() &&
+        (WmShell::Get()->IsRunningInMash() || Shell::HasInstance()));
   return GetRootWindowController(window->GetRootWindow());
 }
 
@@ -162,20 +173,12 @@
   return GetRootWindowController(Shell::GetTargetRootWindow());
 }
 
-RootWindowController::~RootWindowController() {
-  Shutdown();
-  ash_host_.reset();
-  // The CaptureClient needs to be around for as long as the RootWindow is
-  // valid.
-  capture_client_.reset();
-}
-
 aura::WindowTreeHost* RootWindowController::GetHost() {
-  return ash_host_->AsWindowTreeHost();
+  return window_tree_host_;
 }
 
 const aura::WindowTreeHost* RootWindowController::GetHost() const {
-  return ash_host_->AsWindowTreeHost();
+  return window_tree_host_;
 }
 
 aura::Window* RootWindowController::GetRootWindow() {
@@ -203,7 +206,8 @@
   // Forget with the display ID so that display lookup
   // ends up with invalid display.
   GetRootWindowSettings(root_window)->display_id = display::kInvalidDisplayId;
-  ash_host_->PrepareForShutdown();
+  if (ash_host_)
+    ash_host_->PrepareForShutdown();
 
   system_wallpaper_.reset();
   aura::client::SetScreenPositionClient(root_window, NULL);
@@ -259,7 +263,7 @@
 }
 
 const aura::Window* RootWindowController::GetContainer(int container_id) const {
-  return ash_host_->AsWindowTreeHost()->window()->GetChildById(container_id);
+  return window_tree_host_->window()->GetChildById(container_id);
 }
 
 void RootWindowController::OnInitialWallpaperAnimationStarted() {
@@ -389,16 +393,23 @@
 ////////////////////////////////////////////////////////////////////////////////
 // RootWindowController, private:
 
-RootWindowController::RootWindowController(AshWindowTreeHost* ash_host)
+RootWindowController::RootWindowController(
+    AshWindowTreeHost* ash_host,
+    aura::WindowTreeHost* window_tree_host)
     : ash_host_(ash_host),
+      mus_window_tree_host_(window_tree_host),
+      window_tree_host_(ash_host ? ash_host->AsWindowTreeHost()
+                                 : window_tree_host),
       wm_shelf_(base::MakeUnique<WmShelf>()),
       touch_hud_debug_(NULL),
       touch_hud_projection_(NULL) {
+  DCHECK((ash_host && !window_tree_host) || (!ash_host && window_tree_host));
   aura::Window* root_window = GetRootWindow();
   GetRootWindowSettings(root_window)->controller = this;
 
   // Has to happen after this is set as |controller| of RootWindowSettings.
-  wm_root_window_controller_ = WmRootWindowControllerAura::Get(root_window);
+  wm_root_window_controller_ = base::MakeUnique<WmRootWindowController>(
+      this, WmWindowAura::Get(root_window));
 
   stacking_controller_.reset(new StackingController);
   aura::client::SetWindowParentingClient(root_window,
@@ -408,8 +419,12 @@
 
 void RootWindowController::Init(RootWindowType root_window_type) {
   aura::Window* root_window = GetRootWindow();
-  Shell* shell = Shell::GetInstance();
-  shell->InitRootWindow(root_window);
+  WmShell* wm_shell = WmShell::Get();
+  Shell* shell = nullptr;
+  if (!wm_shell->IsRunningInMash()) {
+    shell = Shell::GetInstance();
+    shell->InitRootWindow(root_window);
+  }
 
   wm_root_window_controller_->CreateContainers();
 
@@ -418,32 +433,36 @@
   InitLayoutManagers();
   InitTouchHuds();
 
-  if (WmShell::Get()
-          ->GetPrimaryRootWindowController()
+  if (wm_shell->GetPrimaryRootWindowController()
           ->GetSystemModalLayoutManager(nullptr)
           ->has_window_dimmer()) {
     wm_root_window_controller_->GetSystemModalLayoutManager(nullptr)
         ->CreateModalBackground();
   }
 
-  WmShell::Get()->AddShellObserver(this);
+  wm_shell->AddShellObserver(this);
 
   wm_root_window_controller_->root_window_layout_manager()->OnWindowResized();
-  if (root_window_type == PRIMARY) {
-    shell->InitKeyboard();
+  if (root_window_type == RootWindowType::PRIMARY) {
+    if (!wm_shell->IsRunningInMash())
+      shell->InitKeyboard();
   } else {
-    ash_host_->AsWindowTreeHost()->Show();
+    window_tree_host_->Show();
 
     // Create a shelf if a user is already logged in.
-    if (WmShell::Get()->GetSessionStateDelegate()->NumberOfLoggedInUsers())
+    if (wm_shell->GetSessionStateDelegate()->NumberOfLoggedInUsers())
       wm_root_window_controller_->CreateShelf();
 
     // Notify shell observers about new root window.
-    shell->OnRootWindowAdded(WmWindowAura::Get(root_window));
+    if (!wm_shell->IsRunningInMash())
+      shell->OnRootWindowAdded(WmWindowAura::Get(root_window));
   }
 
+  // TODO: AshTouchExplorationManager doesn't work with mus.
+  // http://crbug.com/679782
   if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kAshDisableTouchExplorationMode)) {
+          switches::kAshDisableTouchExplorationMode) &&
+      !wm_shell->IsRunningInMash()) {
     touch_exploration_manager_.reset(new AshTouchExplorationManager(this));
   }
 }
@@ -483,6 +502,9 @@
 }
 
 void RootWindowController::InitTouchHuds() {
+  if (WmShell::Get()->IsRunningInMash())
+    return;
+
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kAshTouchHud))
     set_touch_hud_debug(new TouchHudDebug(GetRootWindow()));
@@ -497,7 +519,7 @@
   // secondary monitor (either connected at boot or connected later) or if the
   // browser restarted for a second login then don't use the boot color.
   const bool is_boot_splash_screen =
-      root_window_type == PRIMARY &&
+      root_window_type == RootWindowType::PRIMARY &&
       base::CommandLine::ForCurrentProcess()->HasSwitch(
           chromeos::switches::kFirstExecAfterBoot);
   if (is_boot_splash_screen)
diff --git a/ash/root_window_controller.h b/ash/root_window_controller.h
index 1fe197d..eb59b134 100644
--- a/ash/root_window_controller.h
+++ b/ash/root_window_controller.h
@@ -29,6 +29,7 @@
 
 namespace ui {
 class EventHandler;
+class WindowTreeHost;
 }
 
 namespace views {
@@ -53,10 +54,14 @@
 class SystemWallpaperController;
 class TouchHudDebug;
 class TouchHudProjection;
-class WmRootWindowControllerAura;
+class WmRootWindowController;
 class WmShelf;
 class WorkspaceController;
 
+namespace mus {
+class RootWindowController;
+}
+
 // This class maintains the per root window state for ash. This class
 // owns the root window and other dependent objects that should be
 // deleted upon the deletion of the root window. This object is
@@ -64,12 +69,15 @@
 // The RootWindowController for particular root window is stored in
 // its property (RootWindowSettings) and can be obtained using
 // |GetRootWindowController(aura::WindowEventDispatcher*)| function.
-//
-// NOTE: In classic ash there is one RootWindow per display, so every RootWindow
-// has a RootWindowController. In mus/mash there is one RootWindow per top-level
-// Widget, so not all RootWindows have a RootWindowController.
 class ASH_EXPORT RootWindowController : public ShellObserver {
  public:
+  // Enumerates the type of display. If there is only a single display then
+  // it is primary. In a multi-display environment one monitor is deemed the
+  // PRIMARY and all others SECONDARY.
+  enum class RootWindowType { PRIMARY, SECONDARY };
+
+  ~RootWindowController() override;
+
   // Creates and Initialize the RootWindowController for primary display.
   static void CreateForPrimaryDisplay(AshWindowTreeHost* host);
 
@@ -82,8 +90,8 @@
   // Returns the RootWindowController of the target root window.
   static RootWindowController* ForTargetRootWindow();
 
-  ~RootWindowController() override;
-
+  // TODO(sky): move these to a separate class or use AshWindowTreeHost in
+  // mash. http://crbug.com/671246.
   AshWindowTreeHost* ash_host() { return ash_host_.get(); }
   const AshWindowTreeHost* ash_host() const { return ash_host_.get(); }
 
@@ -96,8 +104,8 @@
 
   WmShelf* wm_shelf() const { return wm_shelf_.get(); }
 
-  WmRootWindowControllerAura* wm_root_window_controller() {
-    return wm_root_window_controller_;
+  WmRootWindowController* wm_root_window_controller() {
+    return wm_root_window_controller_.get();
   }
 
   // Get touch HUDs associated with this root window controller.
@@ -180,8 +188,16 @@
   void SetTouchAccessibilityAnchorPoint(const gfx::Point& anchor_point);
 
  private:
-  explicit RootWindowController(AshWindowTreeHost* host);
-  enum RootWindowType { PRIMARY, SECONDARY };
+  // TODO(sky): remove this. Temporary during ash-mus unification.
+  // http://crbug.com/671246.
+  friend class mus::RootWindowController;
+
+  // Creates a new RootWindowController with the specified host. Only one of
+  // |ash_host| or |window_tree_host| should be specified. This takes ownership
+  // of the supplied arguments.
+  // TODO(sky): mash should create AshWindowTreeHost, http://crbug.com/671246.
+  RootWindowController(AshWindowTreeHost* ash_host,
+                       aura::WindowTreeHost* window_tree_host);
 
   // Initializes the RootWindowController based on |root_window_type|.
   void Init(RootWindowType root_window_type);
@@ -207,9 +223,11 @@
   void OnTouchHudProjectionToggled(bool enabled) override;
 
   std::unique_ptr<AshWindowTreeHost> ash_host_;
+  std::unique_ptr<aura::WindowTreeHost> mus_window_tree_host_;
+  // This comes from |ash_host_| or |mus_window_tree_host_|.
+  aura::WindowTreeHost* window_tree_host_;
 
-  // Owned by the root window.
-  WmRootWindowControllerAura* wm_root_window_controller_ = nullptr;
+  std::unique_ptr<WmRootWindowController> wm_root_window_controller_;
 
   std::unique_ptr<StackingController> stacking_controller_;
 
diff --git a/ash/shell.cc b/ash/shell.cc
index 4c3106f4..6b60772 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -173,6 +173,8 @@
 // static
 Shell* Shell::instance_ = nullptr;
 // static
+aura::WindowTreeClient* Shell::window_tree_client_ = nullptr;
+// static
 bool Shell::initially_hide_cursor_ = false;
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/ash/shell.h b/ash/shell.h
index 86d2677f..723d969 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -26,6 +26,7 @@
 namespace aura {
 class RootWindow;
 class Window;
+class WindowTreeClient;
 namespace client {
 class ActivationClient;
 class FocusClient;
@@ -184,6 +185,15 @@
   static const aura::Window* GetContainer(const aura::Window* root_window,
                                           int container_id);
 
+  // TODO(sky): better isolate this.
+  static void set_window_tree_client(aura::WindowTreeClient* client) {
+    window_tree_client_ = client;
+  }
+
+  static aura::WindowTreeClient* window_tree_client() {
+    return window_tree_client_;
+  }
+
   // Creates a default views::NonClientFrameView for use by windows in the
   // Ash environment.
   views::NonClientFrameView* CreateDefaultNonClientFrameView(
@@ -414,6 +424,9 @@
 
   static Shell* instance_;
 
+  // Only valid in mash, for classic ash this is null.
+  static aura::WindowTreeClient* window_tree_client_;
+
   // If set before the Shell is initialized, the mouse cursor will be hidden
   // when the screen is initially created.
   static bool initially_hide_cursor_;
diff --git a/ash/wm/always_on_top_controller_unittest.cc b/ash/wm/always_on_top_controller_unittest.cc
index 85d9e31..58cdcaa2 100644
--- a/ash/wm/always_on_top_controller_unittest.cc
+++ b/ash/wm/always_on_top_controller_unittest.cc
@@ -4,9 +4,9 @@
 
 #include "ash/common/wm/always_on_top_controller.h"
 
-#include "ash/aura/wm_root_window_controller_aura.h"
 #include "ash/aura/wm_window_aura.h"
 #include "ash/common/wm/workspace/workspace_layout_manager.h"
+#include "ash/common/wm_root_window_controller.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
diff --git a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
index 5286a07..3d8ef6f 100644
--- a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
+++ b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
@@ -44,14 +44,19 @@
     }
 
     /**
-     * @see Long#compare(long, long)
+     * Compares two long values numerically. The value returned is identical to what would be
+     * returned by {@link Long#compare(long, long)} which is available since API level 19.
      */
     public static int compareLong(long lhs, long rhs) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            return Long.compare(lhs, rhs);
-        } else {
-            return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
-        }
+        return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
+    }
+
+    /**
+     * Compares two boolean values. The value returned is identical to what would be returned by
+     * {@link Boolean#compare(boolean, boolean)} which is available since API level 19.
+     */
+    public static int compareBoolean(boolean lhs, boolean rhs) {
+        return lhs == rhs ? 0 : lhs ? 1 : -1;
     }
 
     /**
diff --git a/base/android/java/src/org/chromium/base/BuildInfo.java b/base/android/java/src/org/chromium/base/BuildInfo.java
index d6063fe3..54c12c5 100644
--- a/base/android/java/src/org/chromium/base/BuildInfo.java
+++ b/base/android/java/src/org/chromium/base/BuildInfo.java
@@ -71,7 +71,7 @@
             PackageInfo packageInfo = packageManager.getPackageInfo("com.google.android.gms", 0);
             msg = Integer.toString(packageInfo.versionCode);
         } catch (NameNotFoundException e) {
-            Log.d(TAG, "GMS package is not found: %s", e);
+            Log.d(TAG, "GMS package is not found.", e);
         }
         return msg;
     }
diff --git a/chrome/VERSION b/chrome/VERSION
index 6237332f..9500d63 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=57
 MINOR=0
-BUILD=2978
+BUILD=2979
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
index 9408598c..7267932e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
@@ -196,7 +196,7 @@
                         AutofillAddress.checkAddressCompletionStatus(a) == AutofillAddress.COMPLETE;
                 boolean isBComplete =
                         AutofillAddress.checkAddressCompletionStatus(b) == AutofillAddress.COMPLETE;
-                return (isBComplete ? 1 : 0) - (isAComplete ? 1 : 0);
+                return ApiCompatibilityUtils.compareBoolean(isBComplete, isAComplete);
             }
         });
 
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 56e55e4..8e77a11 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -603,6 +603,8 @@
     "metrics/metrics_memory_details.h",
     "metrics/metrics_reporting_state.cc",
     "metrics/metrics_reporting_state.h",
+    "metrics/network_quality_estimator_provider_impl.cc",
+    "metrics/network_quality_estimator_provider_impl.h",
     "metrics/perf/perf_provider_chromeos.cc",
     "metrics/perf/perf_provider_chromeos.h",
     "metrics/sampling_metrics_provider.cc",
@@ -826,6 +828,8 @@
     "permissions/chooser_context_base.h",
     "permissions/delegation_tracker.cc",
     "permissions/delegation_tracker.h",
+    "permissions/permission_blacklist_client.cc",
+    "permissions/permission_blacklist_client.h",
     "permissions/permission_context_base.cc",
     "permissions/permission_context_base.h",
     "permissions/permission_decision_auto_blocker.cc",
diff --git a/chrome/browser/chromeos/arc/arc_session_manager.cc b/chrome/browser/chromeos/arc/arc_session_manager.cc
index 4c0c753..876e24b 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager.cc
+++ b/chrome/browser/chromeos/arc/arc_session_manager.cc
@@ -733,13 +733,15 @@
     return;
   }
 
-  // In case |state_| is ACTIVE, UI page can be ARC_LOADING (which means normal
-  // ARC booting) or ERROR (in case ARC can not be started). If ARC is booting
-  // normally don't stop it on progress close.
+  // If ARC failed to boot normally, stop ARC. Similarly, if the current page is
+  // LSO, closing the window should stop ARC since the user activity chooses to
+  // not sign in. In any other case, ARC is booting normally and the instance
+  // should not be stopped.
   if ((state_ != State::SHOWING_TERMS_OF_SERVICE &&
        state_ != State::CHECKING_ANDROID_MANAGEMENT) &&
       (!support_host_ ||
-       support_host_->ui_page() != ArcSupportHost::UIPage::ERROR)) {
+       (support_host_->ui_page() != ArcSupportHost::UIPage::ERROR &&
+        support_host_->ui_page() != ArcSupportHost::UIPage::LSO))) {
     return;
   }
 
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc
index f736507..1c82b2bc 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -32,6 +32,7 @@
 #include "chrome/browser/metrics/chrome_stability_metrics_provider.h"
 #include "chrome/browser/metrics/https_engagement_metrics_provider.h"
 #include "chrome/browser/metrics/metrics_reporting_state.h"
+#include "chrome/browser/metrics/network_quality_estimator_provider_impl.h"
 #include "chrome/browser/metrics/sampling_metrics_provider.h"
 #include "chrome/browser/metrics/subprocess_metrics_provider.h"
 #include "chrome/browser/metrics/time_ticks_experiment_win.h"
@@ -571,10 +572,12 @@
       std::unique_ptr<metrics::MetricsProvider>(
           new ExtensionsMetricsProvider(metrics_state_manager_)));
 #endif
+
   metrics_service_->RegisterMetricsProvider(
-      std::unique_ptr<metrics::MetricsProvider>(
-          new metrics::NetworkMetricsProvider(
-              content::BrowserThread::GetBlockingPool())));
+      base::MakeUnique<metrics::NetworkMetricsProvider>(
+          base::MakeUnique<metrics::NetworkQualityEstimatorProviderImpl>(
+              g_browser_process->io_thread()),
+          content::BrowserThread::GetBlockingPool()));
 
   // Currently, we configure OmniboxMetricsProvider to not log events to UMA
   // if there is a single incognito session visible. In the future, it may
diff --git a/chrome/browser/metrics/network_quality_estimator_provider_impl.cc b/chrome/browser/metrics/network_quality_estimator_provider_impl.cc
new file mode 100644
index 0000000..144fa60
--- /dev/null
+++ b/chrome/browser/metrics/network_quality_estimator_provider_impl.cc
@@ -0,0 +1,42 @@
+// 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 "chrome/browser/metrics/network_quality_estimator_provider_impl.h"
+
+#include "chrome/browser/io_thread.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace net {
+class NetworkQualityEstimator;
+}
+
+namespace metrics {
+
+NetworkQualityEstimatorProviderImpl::NetworkQualityEstimatorProviderImpl(
+    IOThread* io_thread)
+    : io_thread_(io_thread) {
+  DCHECK(io_thread_);
+}
+
+NetworkQualityEstimatorProviderImpl::~NetworkQualityEstimatorProviderImpl() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+}
+
+scoped_refptr<base::SequencedTaskRunner>
+NetworkQualityEstimatorProviderImpl::GetTaskRunner() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  // |this| is constructed on UI thread, but must be used on the IO thread.
+  thread_checker_.DetachFromThread();
+  return content::BrowserThread::GetTaskRunnerForThread(
+      content::BrowserThread::IO);
+}
+
+net::NetworkQualityEstimator*
+NetworkQualityEstimatorProviderImpl::GetNetworkQualityEstimator() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
+  return io_thread_->globals()->network_quality_estimator.get();
+}
+
+}  // namespace metrics
diff --git a/chrome/browser/metrics/network_quality_estimator_provider_impl.h b/chrome/browser/metrics/network_quality_estimator_provider_impl.h
new file mode 100644
index 0000000..9495d8d
--- /dev/null
+++ b/chrome/browser/metrics/network_quality_estimator_provider_impl.h
@@ -0,0 +1,38 @@
+// 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 CHROME_BROWSER_METRICS_NETWORK_QUALITY_ESTIMATOR_PROVIDER_IMPL_H_
+#define CHROME_BROWSER_METRICS_NETWORK_QUALITY_ESTIMATOR_PROVIDER_IMPL_H_
+
+#include "base/macros.h"
+#include "base/threading/thread_checker.h"
+#include "components/metrics/net/network_metrics_provider.h"
+
+class IOThread;
+
+namespace metrics {
+
+// Implements NetworkMetricsProvider::NetworkQualityEstimatorProvider. Provides
+// NetworkQualityEstimator by querying the IOThread.
+class NetworkQualityEstimatorProviderImpl
+    : public NetworkMetricsProvider::NetworkQualityEstimatorProvider {
+ public:
+  explicit NetworkQualityEstimatorProviderImpl(IOThread* io_thread);
+  ~NetworkQualityEstimatorProviderImpl() override;
+
+ private:
+  // NetworkMetricsProvider::NetworkQualityEstimatorProvider:
+  scoped_refptr<base::SequencedTaskRunner> GetTaskRunner() override;
+  net::NetworkQualityEstimator* GetNetworkQualityEstimator() override;
+
+  IOThread* io_thread_;
+
+  base::ThreadChecker thread_checker_;
+
+  DISALLOW_COPY_AND_ASSIGN(NetworkQualityEstimatorProviderImpl);
+};
+
+}  // namespace metrics
+
+#endif  // CHROME_BROWSER_METRICS_NETWORK_QUALITY_ESTIMATOR_PROVIDER_IMPL_H_
diff --git a/chrome/browser/permissions/permission_blacklist_client.cc b/chrome/browser/permissions/permission_blacklist_client.cc
new file mode 100644
index 0000000..18f57460
--- /dev/null
+++ b/chrome/browser/permissions/permission_blacklist_client.cc
@@ -0,0 +1,102 @@
+// 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 "chrome/browser/permissions/permission_blacklist_client.h"
+
+#include <set>
+#include <string>
+
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/timer/timer.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/web_contents.h"
+#include "url/gurl.h"
+
+// static
+void PermissionBlacklistClient::CheckSafeBrowsingBlacklist(
+    scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
+    content::PermissionType permission_type,
+    const GURL& request_origin,
+    content::WebContents* web_contents,
+    int timeout,
+    base::Callback<void(bool)> callback) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  new PermissionBlacklistClient(db_manager, permission_type, request_origin,
+                                web_contents, timeout, callback);
+}
+
+PermissionBlacklistClient::PermissionBlacklistClient(
+    scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
+    content::PermissionType permission_type,
+    const GURL& request_origin,
+    content::WebContents* web_contents,
+    int timeout,
+    base::Callback<void(bool)> callback)
+    : content::WebContentsObserver(web_contents),
+      db_manager_(db_manager),
+      permission_type_(permission_type),
+      callback_(callback),
+      timeout_(timeout),
+      is_active_(true) {
+  // Balanced by a call to Release() in OnCheckApiBlacklistUrlResult().
+  AddRef();
+  content::BrowserThread::PostTask(
+      content::BrowserThread::IO, FROM_HERE,
+      base::Bind(&PermissionBlacklistClient::StartCheck, this, request_origin));
+}
+
+PermissionBlacklistClient::~PermissionBlacklistClient() {}
+
+void PermissionBlacklistClient::StartCheck(const GURL& request_origin) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+  // Start the timer to interrupt into the client callback method with an
+  // empty response if Safe Browsing times out.
+  safe_browsing::ThreatMetadata empty_metadata;
+  timer_ = base::MakeUnique<base::OneShotTimer>();
+  timer_->Start(
+      FROM_HERE, base::TimeDelta::FromMilliseconds(timeout_),
+      base::Bind(&PermissionBlacklistClient::OnCheckApiBlacklistUrlResult, this,
+                 request_origin, empty_metadata));
+  db_manager_->CheckApiBlacklistUrl(request_origin, this);
+}
+
+void PermissionBlacklistClient::OnCheckApiBlacklistUrlResult(
+    const GURL& url,
+    const safe_browsing::ThreatMetadata& metadata) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+  if (timer_->IsRunning())
+    timer_->Stop();
+  else
+    db_manager_->CancelApiCheck(this);
+  timer_.reset(nullptr);
+
+  // TODO(meredithl): Convert the strings returned from Safe Browsing to the
+  // ones used by PermissionUtil for comparison.
+  bool permission_blocked =
+      metadata.api_permissions.find(PermissionUtil::GetPermissionString(
+          permission_type_)) != metadata.api_permissions.end();
+
+  content::BrowserThread::PostTask(
+      content::BrowserThread::UI, FROM_HERE,
+      base::Bind(&PermissionBlacklistClient::EvaluateBlacklistResultOnUiThread,
+                 this, permission_blocked));
+}
+
+void PermissionBlacklistClient::EvaluateBlacklistResultOnUiThread(
+    bool permission_blocked) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  if (is_active_)
+    callback_.Run(permission_blocked);
+  Release();
+}
+
+void PermissionBlacklistClient::WebContentsDestroyed() {
+  is_active_ = false;
+  Observe(nullptr);
+}
diff --git a/chrome/browser/permissions/permission_blacklist_client.h b/chrome/browser/permissions/permission_blacklist_client.h
new file mode 100644
index 0000000..2d1666e0
--- /dev/null
+++ b/chrome/browser/permissions/permission_blacklist_client.h
@@ -0,0 +1,87 @@
+// 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 CHROME_BROWSER_PERMISSIONS_PERMISSION_BLACKLIST_CLIENT_H_
+#define CHROME_BROWSER_PERMISSIONS_PERMISSION_BLACKLIST_CLIENT_H_
+
+#include "base/callback.h"
+#include "base/memory/ref_counted.h"
+#include "chrome/browser/permissions/permission_util.h"
+#include "components/safe_browsing_db/database_manager.h"
+#include "content/public/browser/permission_type.h"
+#include "content/public/browser/web_contents_observer.h"
+
+class GURL;
+
+namespace content {
+class WebContents;
+}
+
+namespace base {
+class OneShotTimer;
+}
+
+// The client used when checking whether a permission has been blacklisted by
+// Safe Browsing. The check is done asynchronously as no state can be stored in
+// PermissionContextBase (since additional permission requests may be made).
+// This class must be created and destroyed on the UI thread.
+class PermissionBlacklistClient
+    : public safe_browsing::SafeBrowsingDatabaseManager::Client,
+      public base::RefCountedThreadSafe<PermissionBlacklistClient>,
+      public content::WebContentsObserver {
+ public:
+  static void CheckSafeBrowsingBlacklist(
+      scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
+      content::PermissionType permission_type,
+      const GURL& request_origin,
+      content::WebContents* web_contents,
+      int timeout,
+      base::Callback<void(bool)> callback);
+
+ private:
+  friend class base::RefCountedThreadSafe<PermissionBlacklistClient>;
+
+  PermissionBlacklistClient(
+      scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
+      content::PermissionType permission_type,
+      const GURL& request_origin,
+      content::WebContents* web_contents,
+      int timeout,
+      base::Callback<void(bool)> callback);
+
+  ~PermissionBlacklistClient() override;
+
+  void StartCheck(const GURL& request_origin);
+
+  // SafeBrowsingDatabaseManager::Client implementation.
+  void OnCheckApiBlacklistUrlResult(
+      const GURL& url,
+      const safe_browsing::ThreatMetadata& metadata) override;
+
+  void EvaluateBlacklistResultOnUiThread(bool permission_blocked);
+
+  // WebContentsObserver implementation. Sets a flag so that when the database
+  // manager returns with a result, it won't attempt to run the callback with a
+  // deleted WebContents.
+  void WebContentsDestroyed() override;
+
+  scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager_;
+  content::PermissionType permission_type_;
+
+  // PermissionContextBase callback to run on the UI thread.
+  base::Callback<void(bool)> callback_;
+
+  // Timer to abort the Safe Browsing check if it takes too long. Created and
+  // used on the IO Thread.
+  std::unique_ptr<base::OneShotTimer> timer_;
+  int timeout_;
+
+  // True if |callback_| should be invoked, if web_contents() is destroyed, this
+  // is set to false.
+  bool is_active_;
+
+  DISALLOW_COPY_AND_ASSIGN(PermissionBlacklistClient);
+};
+
+#endif  // CHROME_BROWSER_PERMISSIONS_PERMISSION_BLACKLIST_CLIENT_H_
diff --git a/chrome/browser/permissions/permission_context_base.cc b/chrome/browser/permissions/permission_context_base.cc
index 8911b967..753134c3 100644
--- a/chrome/browser/permissions/permission_context_base.cc
+++ b/chrome/browser/permissions/permission_context_base.cc
@@ -6,7 +6,6 @@
 
 #include <stddef.h>
 
-#include <set>
 #include <string>
 #include <utility>
 
@@ -14,10 +13,10 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/permissions/permission_blacklist_client.h"
 #include "chrome/browser/permissions/permission_decision_auto_blocker.h"
 #include "chrome/browser/permissions/permission_request.h"
 #include "chrome/browser/permissions/permission_request_id.h"
@@ -32,12 +31,10 @@
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/browser/website_settings_registry.h"
 #include "components/prefs/pref_service.h"
-#include "components/safe_browsing_db/database_manager.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_contents_observer.h"
 #include "content/public/common/origin_util.h"
 #include "url/gurl.h"
 
@@ -57,128 +54,6 @@
 // TODO(meredithl): Revisit this once UMA metrics have data about request time.
 const int kCheckUrlTimeoutMs = 2000;
 
-// The client used when checking whether a permission has been blacklisted by
-// Safe Browsing. The check is done asynchronously as no state can be stored in
-// PermissionContextBase (since additional permission requests may be made).
-// This class must be created and destroyed on the UI thread.
-class PermissionsBlacklistingClient
-    : public safe_browsing::SafeBrowsingDatabaseManager::Client,
-      public base::RefCountedThreadSafe<PermissionsBlacklistingClient>,
-      public content::WebContentsObserver {
- public:
-  static void CheckSafeBrowsingBlacklist(
-      scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
-      content::PermissionType permission_type,
-      const GURL& request_origin,
-      content::WebContents* web_contents,
-      int timeout,
-      base::Callback<void(bool)> callback) {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-    new PermissionsBlacklistingClient(db_manager, permission_type,
-                                      request_origin, web_contents, timeout,
-                                      callback);
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<PermissionsBlacklistingClient>;
-
-  PermissionsBlacklistingClient(
-      scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
-      content::PermissionType permission_type,
-      const GURL& request_origin,
-      content::WebContents* web_contents,
-      int timeout,
-      base::Callback<void(bool)> callback)
-      : content::WebContentsObserver(web_contents),
-        db_manager_(db_manager),
-        permission_type_(permission_type),
-        callback_(callback),
-        timeout_(timeout),
-        is_active_(true) {
-    // Balanced by a call to Release() in OnCheckApiBlacklistUrlResult().
-    AddRef();
-    content::BrowserThread::PostTask(
-        content::BrowserThread::IO, FROM_HERE,
-        base::Bind(&PermissionsBlacklistingClient::StartCheck, this,
-                   request_origin));
-  }
-
-  ~PermissionsBlacklistingClient() override {}
-
-  void StartCheck(const GURL& request_origin) {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-    // Start the timer to interrupt into the client callback method with an
-    // empty response if Safe Browsing times out.
-    safe_browsing::ThreatMetadata empty_metadata;
-    timer_ = base::MakeUnique<base::OneShotTimer>();
-    timer_->Start(
-        FROM_HERE, base::TimeDelta::FromMilliseconds(timeout_),
-        base::Bind(&PermissionsBlacklistingClient::OnCheckApiBlacklistUrlResult,
-                   this, request_origin, empty_metadata));
-    db_manager_->CheckApiBlacklistUrl(request_origin, this);
-  }
-
-  // SafeBrowsingDatabaseManager::Client implementation.
-  void OnCheckApiBlacklistUrlResult(
-      const GURL& url,
-      const safe_browsing::ThreatMetadata& metadata) override {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-    if (timer_->IsRunning())
-      timer_->Stop();
-    else
-      db_manager_->CancelApiCheck(this);
-    timer_.reset(nullptr);
-
-    // TODO(meredithl): Convert the strings returned from Safe Browsing to the
-    // ones used by PermissionUtil for comparison.
-    bool permission_blocked =
-        metadata.api_permissions.find(PermissionUtil::GetPermissionString(
-            permission_type_)) != metadata.api_permissions.end();
-
-    content::BrowserThread::PostTask(
-        content::BrowserThread::UI, FROM_HERE,
-        base::Bind(
-            &PermissionsBlacklistingClient::EvaluateBlacklistResultOnUiThread,
-            this, permission_blocked));
-  }
-
-  void EvaluateBlacklistResultOnUiThread(bool permission_blocked) {
-    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
-    if (is_active_)
-      callback_.Run(permission_blocked);
-    Release();
-  }
-
-  // WebContentsObserver implementation. Sets the flag so that when the database
-  // manager returns with a result, it won't attempt to run the callback with a
-  // deleted WebContents.
-  void WebContentsDestroyed() override {
-    is_active_ = false;
-    Observe(nullptr);
-  }
-
-  scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager_;
-  content::PermissionType permission_type_;
-
-  // PermissionContextBase callback to run on the UI thread.
-  base::Callback<void(bool)> callback_;
-
-  // Timer to abort the Safe Browsing check if it takes too long. Created and
-  // used on the IO Thread.
-  std::unique_ptr<base::OneShotTimer> timer_;
-  int timeout_;
-
-  // True if |callback_| should be invoked, if web_contents() is destroyed, this
-  // is set to false.
-  bool is_active_;
-
-  DISALLOW_COPY_AND_ASSIGN(PermissionsBlacklistingClient);
-};
-
 PermissionContextBase::PermissionContextBase(
     Profile* profile,
     const content::PermissionType permission_type,
@@ -247,7 +122,7 @@
     }
 
     // The client contacts Safe Browsing, and runs the callback with the result.
-    PermissionsBlacklistingClient::CheckSafeBrowsingBlacklist(
+    PermissionBlacklistClient::CheckSafeBrowsingBlacklist(
         db_manager_, permission_type_, requesting_origin, web_contents,
         safe_browsing_timeout_,
         base::Bind(&PermissionContextBase::ContinueRequestPermission,
diff --git a/chrome/browser/resources/settings/people_page/change_picture.js b/chrome/browser/resources/settings/people_page/change_picture.js
index abdad67..4bed8bf 100644
--- a/chrome/browser/resources/settings/people_page/change_picture.js
+++ b/chrome/browser/resources/settings/people_page/change_picture.js
@@ -282,6 +282,9 @@
           selector.selectPrevious();
         } while (this.selectedItem_.hidden);
 
+        if (this.selectedItem_.dataset.type != ChangePictureSelectionTypes.FILE)
+          this.selectImage_(this.selectedItem_);
+
         this.lastSelectedImageType_ = this.selectedItem_.dataset.type;
         e.detail.keyboardEvent.preventDefault();
         break;
@@ -294,6 +297,9 @@
           selector.selectNext();
         } while (this.selectedItem_.hidden);
 
+        if (this.selectedItem_.dataset.type != ChangePictureSelectionTypes.FILE)
+          this.selectImage_(this.selectedItem_);
+
         this.lastSelectedImageType_ = this.selectedItem_.dataset.type;
         e.detail.keyboardEvent.preventDefault();
         break;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc
index 63d49599..49f44a6 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -751,7 +751,7 @@
       gfx::CreateVectorIcon(kNavigateBackIcon, normal_color));
   back_->SetImage(
       views::Button::STATE_DISABLED,
-      gfx::CreateVectorIcon(kNavigateBackIcon, normal_color));
+      gfx::CreateVectorIcon(kNavigateBackIcon, disabled_color));
   forward_->SetImage(
       views::Button::STATE_NORMAL,
       gfx::CreateVectorIcon(kNavigateForwardIcon, normal_color));
diff --git a/chrome/browser/web_dev_style/html_checker.py b/chrome/browser/web_dev_style/html_checker.py
index 040a4c71..2ab90e1 100644
--- a/chrome/browser/web_dev_style/html_checker.py
+++ b/chrome/browser/web_dev_style/html_checker.py
@@ -91,6 +91,9 @@
         file_filter=self.file_filter, include_deletes=False)
 
     for f in affected_files:
+      if not f.LocalPath().endswith('.html'):
+        continue
+
       errors = []
 
       for line_number, line in f.ChangedContents():
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc
index 15630642..4b63c2a 100644
--- a/chrome/installer/setup/install_worker.cc
+++ b/chrome/installer/setup/install_worker.cc
@@ -427,7 +427,7 @@
       true);
 
   // MSI installations will manage their own uninstall shortcuts.
-  if (!installer_state.is_msi() && product.ShouldCreateUninstallEntry()) {
+  if (!installer_state.is_msi()) {
     // We need to quote the command line for the Add/Remove Programs dialog.
     base::CommandLine quoted_uninstall_cmd(installer_path);
     DCHECK_EQ(quoted_uninstall_cmd.GetCommandLineString()[0], '"');
@@ -669,10 +669,8 @@
     // We want MSI installs to take over the Add/Remove Programs entry. Make a
     // best-effort attempt to delete any entry left over from previous non-MSI
     // installations for the same type of install (system or per user).
-    if (product.ShouldCreateUninstallEntry()) {
-      AddDeleteUninstallEntryForMSIWorkItems(installer_state, product,
-                                             post_install_task_list);
-    }
+    AddDeleteUninstallEntryForMSIWorkItems(installer_state, product,
+                                           post_install_task_list);
   }
 
   return true;
diff --git a/chrome/installer/setup/uninstall.cc b/chrome/installer/setup/uninstall.cc
index 2c8f2af2..a55f28d 100644
--- a/chrome/installer/setup/uninstall.cc
+++ b/chrome/installer/setup/uninstall.cc
@@ -903,10 +903,8 @@
   base::string16 distribution_data(browser_dist->GetDistributionData(reg_root));
 
   // Remove Control Panel uninstall link.
-  if (product.ShouldCreateUninstallEntry()) {
-    InstallUtil::DeleteRegistryKey(
-        reg_root, browser_dist->GetUninstallRegPath(), KEY_WOW64_32KEY);
-  }
+  InstallUtil::DeleteRegistryKey(reg_root, browser_dist->GetUninstallRegPath(),
+                                 KEY_WOW64_32KEY);
 
   // Remove Omaha product key.
   InstallUtil::DeleteRegistryKey(
diff --git a/chrome/installer/util/BUILD.gn b/chrome/installer/util/BUILD.gn
index e66d04b..f671dbec 100644
--- a/chrome/installer/util/BUILD.gn
+++ b/chrome/installer/util/BUILD.gn
@@ -53,8 +53,6 @@
 
   if (is_win) {
     sources = [
-      "chrome_binaries_operations.cc",
-      "chrome_binaries_operations.h",
       "chrome_browser_operations.cc",
       "chrome_browser_operations.h",
       "chrome_browser_sxs_operations.cc",
@@ -141,8 +139,6 @@
       "callback_work_item.h",
       "channel_info.cc",
       "channel_info.h",
-      "chromium_binaries_distribution.cc",
-      "chromium_binaries_distribution.h",
       "conditional_work_item_list.cc",
       "conditional_work_item_list.h",
       "copy_tree_work_item.cc",
@@ -163,8 +159,6 @@
       "duplicate_tree_detector.h",
       "firewall_manager_win.cc",
       "firewall_manager_win.h",
-      "google_chrome_binaries_distribution.cc",
-      "google_chrome_binaries_distribution.h",
       "google_chrome_sxs_distribution.cc",
       "google_chrome_sxs_distribution.h",
       "google_update_constants.cc",
diff --git a/chrome/installer/util/browser_distribution.cc b/chrome/installer/util/browser_distribution.cc
index 82e8977..8e83dda2 100644
--- a/chrome/installer/util/browser_distribution.cc
+++ b/chrome/installer/util/browser_distribution.cc
@@ -21,8 +21,6 @@
 #include "chrome/common/chrome_icon_resources_win.h"
 #include "chrome/common/env_vars.h"
 #include "chrome/installer/util/app_registration_data.h"
-#include "chrome/installer/util/chromium_binaries_distribution.h"
-#include "chrome/installer/util/google_chrome_binaries_distribution.h"
 #include "chrome/installer/util/google_chrome_distribution.h"
 #include "chrome/installer/util/google_chrome_sxs_distribution.h"
 #include "chrome/installer/util/install_util.h"
@@ -43,8 +41,6 @@
 
 // The BrowserDistribution objects are never freed.
 BrowserDistribution* g_browser_distribution = NULL;
-BrowserDistribution* g_binaries_distribution = NULL;
-
 BrowserDistribution::Type GetCurrentDistributionType() {
   return BrowserDistribution::CHROME_BROWSER;
 }
@@ -84,34 +80,21 @@
 // static
 BrowserDistribution* BrowserDistribution::GetSpecificDistribution(
     BrowserDistribution::Type type) {
+  DCHECK_EQ(type, CHROME_BROWSER);
   BrowserDistribution* dist = NULL;
 
-  switch (type) {
-    case CHROME_BROWSER:
 #if defined(GOOGLE_CHROME_BUILD)
-      if (InstallUtil::IsChromeSxSProcess()) {
-        dist = GetOrCreateBrowserDistribution<GoogleChromeSxSDistribution>(
-            &g_browser_distribution);
-      } else {
-        dist = GetOrCreateBrowserDistribution<GoogleChromeDistribution>(
-            &g_browser_distribution);
-      }
-#else
-      dist = GetOrCreateBrowserDistribution<BrowserDistribution>(
-          &g_browser_distribution);
-#endif
-      break;
-
-    default:
-      DCHECK_EQ(CHROME_BINARIES, type);
-#if defined(GOOGLE_CHROME_BUILD)
-      dist = GetOrCreateBrowserDistribution<GoogleChromeBinariesDistribution>(
-          &g_binaries_distribution);
-#else
-      dist = GetOrCreateBrowserDistribution<ChromiumBinariesDistribution>(
-          &g_binaries_distribution);
-#endif
+  if (InstallUtil::IsChromeSxSProcess()) {
+    dist = GetOrCreateBrowserDistribution<GoogleChromeSxSDistribution>(
+        &g_browser_distribution);
+  } else {
+    dist = GetOrCreateBrowserDistribution<GoogleChromeDistribution>(
+        &g_browser_distribution);
   }
+#else
+  dist = GetOrCreateBrowserDistribution<BrowserDistribution>(
+      &g_browser_distribution);
+#endif
 
   return dist;
 }
diff --git a/chrome/installer/util/browser_distribution.h b/chrome/installer/util/browser_distribution.h
index 3ff0a2a0..8894824 100644
--- a/chrome/installer/util/browser_distribution.h
+++ b/chrome/installer/util/browser_distribution.h
@@ -25,9 +25,9 @@
 
 class BrowserDistribution {
  public:
+  // TODO(grt): Remove Type.
   enum Type {
     CHROME_BROWSER,
-    CHROME_BINARIES,
     NUM_TYPES
   };
 
diff --git a/chrome/installer/util/chrome_binaries_operations.cc b/chrome/installer/util/chrome_binaries_operations.cc
deleted file mode 100644
index 63d8f93..0000000
--- a/chrome/installer/util/chrome_binaries_operations.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/installer/util/chrome_binaries_operations.h"
-
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "chrome/installer/util/channel_info.h"
-#include "chrome/installer/util/helper.h"
-#include "chrome/installer/util/master_preferences.h"
-#include "chrome/installer/util/master_preferences_constants.h"
-#include "chrome/installer/util/util_constants.h"
-
-namespace installer {
-
-void ChromeBinariesOperations::ReadOptions(const MasterPreferences& prefs,
-                                           std::set<base::string16>* options)
-    const {
-  DCHECK(options);
-  options->insert(kOptionMultiInstall);
-}
-
-void ChromeBinariesOperations::ReadOptions(
-    const base::CommandLine& uninstall_command,
-    std::set<base::string16>* options) const {
-  DCHECK(options);
-  options->insert(kOptionMultiInstall);
-}
-
-void ChromeBinariesOperations::AddKeyFiles(
-    const std::set<base::string16>& options,
-    std::vector<base::FilePath>* key_files) const {
-  DCHECK(key_files);
-  key_files->push_back(base::FilePath(installer::kChromeDll));
-}
-
-void ChromeBinariesOperations::AppendProductFlags(
-    const std::set<base::string16>& options,
-    base::CommandLine* cmd_line) const {
-  DCHECK(cmd_line);
-
-  DCHECK(options.find(kOptionMultiInstall) != options.end());
-
-  // Add --multi-install if it isn't already there.
-  if (!cmd_line->HasSwitch(switches::kMultiInstall))
-    cmd_line->AppendSwitch(switches::kMultiInstall);
-}
-
-void ChromeBinariesOperations::AppendRenameFlags(
-    const std::set<base::string16>& options,
-    base::CommandLine* cmd_line) const {
-  DCHECK(cmd_line);
-
-  DCHECK(options.find(kOptionMultiInstall) != options.end());
-
-  // Add --multi-install if it isn't already there.
-  if (!cmd_line->HasSwitch(switches::kMultiInstall))
-    cmd_line->AppendSwitch(switches::kMultiInstall);
-}
-
-bool ChromeBinariesOperations::SetChannelFlags(
-    const std::set<base::string16>& options,
-    bool set,
-    ChannelInfo* channel_info) const {
-  return false;
-}
-
-bool ChromeBinariesOperations::ShouldCreateUninstallEntry(
-    const std::set<base::string16>& options) const {
-  return false;
-}
-
-void ChromeBinariesOperations::AddDefaultShortcutProperties(
-    BrowserDistribution* dist,
-    const base::FilePath& target_exe,
-    ShellUtil::ShortcutProperties* properties) const {
-  NOTREACHED() << "Chrome Binaries do not create shortcuts.";
-}
-
-void ChromeBinariesOperations::LaunchUserExperiment(
-    const base::FilePath& setup_path,
-    const std::set<base::string16>& options,
-    InstallStatus status,
-    bool system_level) const {
-  // Not meaningful to have binaries run experiments.
-  NOTREACHED();
-}
-
-}  // namespace installer
diff --git a/chrome/installer/util/chrome_binaries_operations.h b/chrome/installer/util/chrome_binaries_operations.h
deleted file mode 100644
index 7e2404ec..0000000
--- a/chrome/installer/util/chrome_binaries_operations.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_INSTALLER_UTIL_CHROME_BINARIES_OPERATIONS_H_
-#define CHROME_INSTALLER_UTIL_CHROME_BINARIES_OPERATIONS_H_
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "chrome/installer/util/product_operations.h"
-
-namespace installer {
-
-// Operations specific to the Chrome Binaries; see ProductOperations for general
-// info.
-class ChromeBinariesOperations : public ProductOperations {
- public:
-  ChromeBinariesOperations() {}
-
-  void ReadOptions(const MasterPreferences& prefs,
-                   std::set<base::string16>* options) const override;
-
-  void ReadOptions(const base::CommandLine& uninstall_command,
-                   std::set<base::string16>* options) const override;
-
-  void AddKeyFiles(const std::set<base::string16>& options,
-                   std::vector<base::FilePath>* key_files) const override;
-
-  void AppendProductFlags(const std::set<base::string16>& options,
-                          base::CommandLine* cmd_line) const override;
-
-  void AppendRenameFlags(const std::set<base::string16>& options,
-                         base::CommandLine* cmd_line) const override;
-
-  bool SetChannelFlags(const std::set<base::string16>& options,
-                       bool set,
-                       ChannelInfo* channel_info) const override;
-
-  bool ShouldCreateUninstallEntry(
-      const std::set<base::string16>& options) const override;
-
-  void AddDefaultShortcutProperties(
-      BrowserDistribution* dist,
-      const base::FilePath& target_exe,
-      ShellUtil::ShortcutProperties* properties) const override;
-
-  void LaunchUserExperiment(const base::FilePath& setup_path,
-                            const std::set<base::string16>& options,
-                            InstallStatus status,
-                            bool system_level) const override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ChromeBinariesOperations);
-};
-
-}  // namespace installer
-
-#endif  // CHROME_INSTALLER_UTIL_CHROME_BINARIES_OPERATIONS_H_
diff --git a/chrome/installer/util/chrome_browser_operations.cc b/chrome/installer/util/chrome_browser_operations.cc
index f92f00d..99397dd 100644
--- a/chrome/installer/util/chrome_browser_operations.cc
+++ b/chrome/installer/util/chrome_browser_operations.cc
@@ -93,11 +93,6 @@
 #endif
 }
 
-bool ChromeBrowserOperations::ShouldCreateUninstallEntry(
-    const std::set<base::string16>& options) const {
-  return true;
-}
-
 // Modifies a ShortcutProperties object by adding default values to
 // uninitialized members. Tries to assign:
 // - target: |chrome_exe|.
diff --git a/chrome/installer/util/chrome_browser_operations.h b/chrome/installer/util/chrome_browser_operations.h
index 8ae4a639..d7e02dc 100644
--- a/chrome/installer/util/chrome_browser_operations.h
+++ b/chrome/installer/util/chrome_browser_operations.h
@@ -35,9 +35,6 @@
                        bool set,
                        ChannelInfo* channel_info) const override;
 
-  bool ShouldCreateUninstallEntry(
-      const std::set<base::string16>& options) const override;
-
   void AddDefaultShortcutProperties(
       BrowserDistribution* dist,
       const base::FilePath& target_exe,
diff --git a/chrome/installer/util/chromium_binaries_distribution.cc b/chrome/installer/util/chromium_binaries_distribution.cc
deleted file mode 100644
index 0c2b2de..0000000
--- a/chrome/installer/util/chromium_binaries_distribution.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This file declares a class that contains various method related to branding.
-
-#include "chrome/installer/util/google_chrome_binaries_distribution.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "chrome/installer/util/app_registration_data.h"
-#include "chrome/installer/util/non_updating_app_registration_data.h"
-
-namespace {
-
-const wchar_t kChromiumBinariesName[] = L"Chromium Binaries";
-
-}  // namespace
-
-ChromiumBinariesDistribution::ChromiumBinariesDistribution()
-    : BrowserDistribution(CHROME_BINARIES,
-                          std::unique_ptr<AppRegistrationData>(
-                              new NonUpdatingAppRegistrationData(
-                                  base::string16(L"Software\\")
-                                      .append(kChromiumBinariesName)))),
-      browser_distribution_(
-          BrowserDistribution::GetSpecificDistribution(CHROME_BROWSER)) {}
-
-ChromiumBinariesDistribution::ChromiumBinariesDistribution(
-    std::unique_ptr<AppRegistrationData> app_reg_data)
-    : BrowserDistribution(CHROME_BINARIES, std::move(app_reg_data)),
-      browser_distribution_(
-          BrowserDistribution::GetSpecificDistribution(CHROME_BROWSER)) {}
-
-base::string16 ChromiumBinariesDistribution::GetBaseAppName() {
-  NOTREACHED();
-  return base::string16();
-}
-
-base::string16 ChromiumBinariesDistribution::GetBrowserProgIdPrefix() {
-  NOTREACHED();
-  return base::string16();
-}
-
-base::string16 ChromiumBinariesDistribution::GetBrowserProgIdDesc() {
-  NOTREACHED();
-  return base::string16();
-}
-
-base::string16 ChromiumBinariesDistribution::GetDisplayName() {
-  return kChromiumBinariesName;
-}
-
-base::string16 ChromiumBinariesDistribution::GetShortcutName() {
-  NOTREACHED();
-  return base::string16();
-}
-
-base::string16 ChromiumBinariesDistribution::GetBaseAppId() {
-  NOTREACHED();
-  return base::string16();
-}
-
-base::string16 ChromiumBinariesDistribution::GetInstallSubDir() {
-  return browser_distribution_->GetInstallSubDir();
-}
-
-base::string16 ChromiumBinariesDistribution::GetPublisherName() {
-  NOTREACHED();
-  return base::string16();
-}
-
-base::string16 ChromiumBinariesDistribution::GetAppDescription() {
-  NOTREACHED();
-  return base::string16();
-}
-
-base::string16 ChromiumBinariesDistribution::GetLongAppDescription() {
-  NOTREACHED();
-  return base::string16();
-}
-
-std::string ChromiumBinariesDistribution::GetSafeBrowsingName() {
-  NOTREACHED();
-  return std::string();
-}
-
-base::string16 ChromiumBinariesDistribution::GetRegistryPath() {
-  NOTREACHED();
-  // Handling a NOTREACHED() with anything but a default return value is unusual
-  // but in this case returning the empty string would point the caller at the
-  // root of the registry which could have disastrous consequences.
-  return BrowserDistribution::GetRegistryPath();
-}
-
-base::string16 ChromiumBinariesDistribution::GetUninstallRegPath() {
-  NOTREACHED();
-  return base::string16();
-}
-
-BrowserDistribution::DefaultBrowserControlPolicy
-    ChromiumBinariesDistribution::GetDefaultBrowserControlPolicy() {
-  return DEFAULT_BROWSER_UNSUPPORTED;
-}
-
-int ChromiumBinariesDistribution::GetIconIndex() {
-  NOTREACHED();
-  return 0;
-}
-
-bool ChromiumBinariesDistribution::GetChromeChannel(base::string16* channel) {
-  NOTREACHED();
-  return false;
-}
-
-base::string16 ChromiumBinariesDistribution::GetCommandExecuteImplClsid() {
-  return base::string16();
-}
diff --git a/chrome/installer/util/chromium_binaries_distribution.h b/chrome/installer/util/chromium_binaries_distribution.h
deleted file mode 100644
index e52b35d..0000000
--- a/chrome/installer/util/chromium_binaries_distribution.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This file declares a class that contains various method related to branding.
-
-#ifndef CHROME_INSTALLER_UTIL_CHROMIUM_BINARIES_DISTRIBUTION_H_
-#define CHROME_INSTALLER_UTIL_CHROMIUM_BINARIES_DISTRIBUTION_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "chrome/installer/util/browser_distribution.h"
-
-class ChromiumBinariesDistribution : public BrowserDistribution {
- public:
-  base::string16 GetBrowserProgIdPrefix() override;
-
-  base::string16 GetBrowserProgIdDesc() override;
-
-  base::string16 GetDisplayName() override;
-
-  base::string16 GetShortcutName() override;
-
-  int GetIconIndex() override;
-
-  base::string16 GetBaseAppName() override;
-
-  base::string16 GetBaseAppId() override;
-
-  base::string16 GetInstallSubDir() override;
-
-  base::string16 GetPublisherName() override;
-
-  base::string16 GetAppDescription() override;
-
-  base::string16 GetLongAppDescription() override;
-
-  std::string GetSafeBrowsingName() override;
-
-  base::string16 GetRegistryPath() override;
-
-  base::string16 GetUninstallRegPath() override;
-
-  DefaultBrowserControlPolicy GetDefaultBrowserControlPolicy() override;
-
-  bool GetChromeChannel(base::string16* channel) override;
-
-  base::string16 GetCommandExecuteImplClsid() override;
-
- protected:
-  friend class BrowserDistribution;
-
-  ChromiumBinariesDistribution();
-
-  explicit ChromiumBinariesDistribution(
-      std::unique_ptr<AppRegistrationData> app_reg_data);
-
-  BrowserDistribution* browser_distribution_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ChromiumBinariesDistribution);
-};
-
-#endif  // CHROME_INSTALLER_UTIL_CHROMIUM_BINARIES_DISTRIBUTION_H_
diff --git a/chrome/installer/util/google_chrome_binaries_distribution.cc b/chrome/installer/util/google_chrome_binaries_distribution.cc
deleted file mode 100644
index bf131dc..0000000
--- a/chrome/installer/util/google_chrome_binaries_distribution.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This file defines a class that contains various method related to branding.
-
-#include "chrome/installer/util/google_chrome_binaries_distribution.h"
-
-#include "chrome/installer/util/google_update_constants.h"
-#include "chrome/installer/util/google_update_settings.h"
-#include "chrome/installer/util/install_util.h"
-#include "chrome/installer/util/updating_app_registration_data.h"
-
-namespace {
-
-const wchar_t kChromeBinariesGuid[] = L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}";
-const wchar_t kChromeBinariesName[] = L"Google Chrome binaries";
-
-}  // namespace
-
-GoogleChromeBinariesDistribution::GoogleChromeBinariesDistribution()
-    : ChromiumBinariesDistribution(std::unique_ptr<AppRegistrationData>(
-          new UpdatingAppRegistrationData(kChromeBinariesGuid))) {}
-
-base::string16 GoogleChromeBinariesDistribution::GetDisplayName() {
-  return kChromeBinariesName;
-}
-
-base::string16 GoogleChromeBinariesDistribution::GetShortcutName() {
-  NOTREACHED();
-  return base::string16();
-}
-
-void GoogleChromeBinariesDistribution::UpdateInstallStatus(bool system_install,
-    installer::ArchiveType archive_type,
-    installer::InstallStatus install_status) {
-  GoogleUpdateSettings::UpdateInstallStatus(system_install,
-      archive_type, InstallUtil::GetInstallReturnCode(install_status),
-      kChromeBinariesGuid);
-}
diff --git a/chrome/installer/util/google_chrome_binaries_distribution.h b/chrome/installer/util/google_chrome_binaries_distribution.h
deleted file mode 100644
index 54b7bc6..0000000
--- a/chrome/installer/util/google_chrome_binaries_distribution.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This file declares a class that contains various method related to branding.
-
-#ifndef CHROME_INSTALLER_UTIL_GOOGLE_CHROME_BINARIES_DISTRIBUTION_H_
-#define CHROME_INSTALLER_UTIL_GOOGLE_CHROME_BINARIES_DISTRIBUTION_H_
-
-#include "base/macros.h"
-#include "chrome/installer/util/chromium_binaries_distribution.h"
-
-class GoogleChromeBinariesDistribution : public ChromiumBinariesDistribution {
- public:
-  base::string16 GetDisplayName() override;
-
-  base::string16 GetShortcutName() override;
-
-  void UpdateInstallStatus(bool system_install,
-                           installer::ArchiveType archive_type,
-                           installer::InstallStatus install_status) override;
-
- protected:
-  friend class BrowserDistribution;
-
-  GoogleChromeBinariesDistribution();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(GoogleChromeBinariesDistribution);
-};
-
-#endif  // CHROME_INSTALLER_UTIL_GOOGLE_CHROME_BINARIES_DISTRIBUTION_H_
diff --git a/chrome/installer/util/product.cc b/chrome/installer/util/product.cc
index a7fbe0f..32b70e48 100644
--- a/chrome/installer/util/product.cc
+++ b/chrome/installer/util/product.cc
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "base/process/launch.h"
 #include "base/win/registry.h"
-#include "chrome/installer/util/chrome_binaries_operations.h"
 #include "chrome/installer/util/chrome_browser_operations.h"
 #include "chrome/installer/util/chrome_browser_sxs_operations.h"
 #include "chrome/installer/util/google_update_constants.h"
@@ -32,9 +31,6 @@
           new ChromeBrowserSxSOperations() :
           new ChromeBrowserOperations());
       break;
-    case BrowserDistribution::CHROME_BINARIES:
-      operations_.reset(new ChromeBinariesOperations());
-      break;
     default:
       NOTREACHED() << "Unsupported BrowserDistribution::Type: "
                    << distribution->GetType();
@@ -122,10 +118,6 @@
   return true;
 }
 
-bool Product::ShouldCreateUninstallEntry() const {
-  return operations_->ShouldCreateUninstallEntry(options_);
-}
-
 void Product::AddKeyFiles(std::vector<base::FilePath>* key_files) const {
   operations_->AddKeyFiles(options_, key_files);
 }
diff --git a/chrome/installer/util/product.h b/chrome/installer/util/product.h
index ae9cefa..f3d29e8 100644
--- a/chrome/installer/util/product.h
+++ b/chrome/installer/util/product.h
@@ -60,10 +60,6 @@
     return distribution_->GetType() == BrowserDistribution::CHROME_BROWSER;
   }
 
-  bool is_chrome_binaries() const {
-    return distribution_->GetType() == BrowserDistribution::CHROME_BINARIES;
-  }
-
   bool HasOption(const std::wstring& option) const {
     return options_.find(option) != options_.end();
   }
@@ -94,10 +90,6 @@
   // ClientState key.
   bool SetMsiMarker(bool system_install, bool set) const;
 
-  // Returns true if setup should create an entry in the Add/Remove list
-  // of installed applications.
-  bool ShouldCreateUninstallEntry() const;
-
   // See ProductOperations::AddKeyFiles.
   void AddKeyFiles(std::vector<base::FilePath>* key_files) const;
 
diff --git a/chrome/installer/util/product_operations.h b/chrome/installer/util/product_operations.h
index fb14283..ae4abe4 100644
--- a/chrome/installer/util/product_operations.h
+++ b/chrome/installer/util/product_operations.h
@@ -68,12 +68,6 @@
                                bool set,
                                ChannelInfo* channel_info) const = 0;
 
-  // Returns true if setup should create an entry in the Add/Remove list
-  // of installed applications for this product.  This does not test for use of
-  // MSI; see InstallerState::is_msi.
-  virtual bool ShouldCreateUninstallEntry(
-      const std::set<base::string16>& options) const = 0;
-
   // Modifies a ShellUtil::ShortcutProperties object by assigning default values
   // to unintialized members.
   virtual void AddDefaultShortcutProperties(
diff --git a/chrome/test/data/webui/settings/people_page_change_picture_test.js b/chrome/test/data/webui/settings/people_page_change_picture_test.js
index acf646b6..5a20bf9 100644
--- a/chrome/test/data/webui/settings/people_page_change_picture_test.js
+++ b/chrome/test/data/webui/settings/people_page_change_picture_test.js
@@ -201,6 +201,14 @@
               expectEquals(firstDefaultImage, changePicture.selectedItem_);
               expectFalse(settingsCamera.cameraActive);
               expectTrue(discardControlBar.hidden);
+
+              // Now verify that arrow keys actually select the new image.
+              browserProxy.resetResolver('selectDefaultImage');
+              MockInteractions.pressAndReleaseKeyOn(
+                  changePicture.selectedItem_, 39 /* right */);
+              return browserProxy.whenCalled('selectDefaultImage');
+            }).then(function(args) {
+              expectEquals('chrome://foo/2.png', args[0]);
             });
       });
 
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn
index 09d5c64..58321a5 100644
--- a/components/metrics/BUILD.gn
+++ b/components/metrics/BUILD.gn
@@ -325,6 +325,7 @@
     "metrics_service_unittest.cc",
     "metrics_state_manager_unittest.cc",
     "net/net_metrics_log_uploader_unittest.cc",
+    "net/network_metrics_provider_unittest.cc",
     "persisted_logs_unittest.cc",
     "profiler/profiler_metrics_provider_unittest.cc",
     "profiler/tracking_synchronizer_unittest.cc",
@@ -358,7 +359,10 @@
   }
 
   if (is_chromeos) {
-    deps += [ "leak_detector:unit_tests" ]
+    deps += [
+      "leak_detector:unit_tests",
+      "//chromeos",
+    ]
   }
 
   # iOS is not supported by the profiler and the ios-simulator bot chokes on
diff --git a/components/metrics/net/DEPS b/components/metrics/net/DEPS
index f0349cc..df18a66 100644
--- a/components/metrics/net/DEPS
+++ b/components/metrics/net/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+chromeos/dbus",
   "+chromeos/network",
   "+components/data_use_measurement/core",
   "+components/variations",
diff --git a/components/metrics/net/network_metrics_provider.cc b/components/metrics/net/network_metrics_provider.cc
index aa83846b8..d392bf81 100644
--- a/components/metrics/net/network_metrics_provider.cc
+++ b/components/metrics/net/network_metrics_provider.cc
@@ -9,6 +9,8 @@
 #include <string>
 #include <vector>
 
+#include "base/bind_helpers.h"
+#include "base/callback_forward.h"
 #include "base/compiler_specific.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/sparse_histogram.h"
@@ -18,6 +20,7 @@
 #include "base/task_runner_util.h"
 #include "build/build_config.h"
 #include "net/base/net_errors.h"
+#include "net/nqe/network_quality_estimator.h"
 
 #if defined(OS_CHROMEOS)
 #include "components/metrics/net/wifi_access_point_info_provider_chromeos.h"
@@ -25,25 +28,145 @@
 
 namespace metrics {
 
+namespace {
+
+// Gets the network quality estimator from |network_quality_estimator_provider|,
+// and provides it to the |callback|.
+void GetAndSetNetworkQualityEstimator(
+    const base::Callback<void(net::NetworkQualityEstimator*)>& callback,
+    NetworkMetricsProvider::NetworkQualityEstimatorProvider*
+        network_quality_estimator_provider) {
+  callback.Run(
+      network_quality_estimator_provider->GetNetworkQualityEstimator());
+}
+
+}  // namespace
+
+// Listens to the changes in the effective conection type.
+class NetworkMetricsProvider::EffectiveConnectionTypeObserver
+    : public net::NetworkQualityEstimator::EffectiveConnectionTypeObserver {
+ public:
+  // |network_quality_estimator| is used to provide the network quality
+  // estimates. Guaranteed to be non-null. |callback| is run on
+  // |callback_task_runner|, and provides notifications about the changes in the
+  // effective connection type.
+  EffectiveConnectionTypeObserver(
+      base::Callback<void(net::EffectiveConnectionType)> callback,
+      const scoped_refptr<base::SequencedTaskRunner>& callback_task_runner)
+      : network_quality_estimator_(nullptr),
+        callback_(callback),
+        callback_task_runner_(callback_task_runner) {
+    DCHECK(callback_);
+    DCHECK(callback_task_runner_);
+    // |this| is initialized and used on the IO thread using
+    // |network_quality_task_runner_|.
+    thread_checker_.DetachFromThread();
+  }
+
+  ~EffectiveConnectionTypeObserver() override {
+    DCHECK(thread_checker_.CalledOnValidThread());
+    if (network_quality_estimator_)
+      network_quality_estimator_->RemoveEffectiveConnectionTypeObserver(this);
+  }
+
+  // Initializes |this| on IO thread using |network_quality_task_runner_|. This
+  // is the same thread on which |network_quality_estimator| lives.
+  void Init(net::NetworkQualityEstimator* network_quality_estimator) {
+    network_quality_estimator_ = network_quality_estimator;
+    if (network_quality_estimator_)
+      network_quality_estimator_->AddEffectiveConnectionTypeObserver(this);
+  }
+
+ private:
+  // net::EffectiveConnectionTypeObserver:
+  void OnEffectiveConnectionTypeChanged(
+      net::EffectiveConnectionType type) override {
+    DCHECK(thread_checker_.CalledOnValidThread());
+    callback_task_runner_->PostTask(FROM_HERE, base::Bind(callback_, type));
+  }
+
+  // Notifies |this| when there is a change in the effective connection type.
+  net::NetworkQualityEstimator* network_quality_estimator_;
+
+  // Called when the effective connection type is changed.
+  base::Callback<void(net::EffectiveConnectionType)> callback_;
+
+  // Task runner on which |callback_| is run.
+  scoped_refptr<base::SequencedTaskRunner> callback_task_runner_;
+
+  base::ThreadChecker thread_checker_;
+
+  DISALLOW_COPY_AND_ASSIGN(EffectiveConnectionTypeObserver);
+};
+
 NetworkMetricsProvider::NetworkMetricsProvider(base::TaskRunner* io_task_runner)
+    : NetworkMetricsProvider(nullptr, io_task_runner) {}
+
+NetworkMetricsProvider::NetworkMetricsProvider(
+    std::unique_ptr<NetworkQualityEstimatorProvider>
+        network_quality_estimator_provider,
+    base::TaskRunner* io_task_runner)
     : io_task_runner_(io_task_runner),
       connection_type_is_ambiguous_(false),
       wifi_phy_layer_protocol_is_ambiguous_(false),
       wifi_phy_layer_protocol_(net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN),
       total_aborts_(0),
       total_codes_(0),
+      network_quality_estimator_provider_(
+          std::move(network_quality_estimator_provider)),
+      effective_connection_type_(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
+      effective_connection_type_is_ambiguous_(false),
       weak_ptr_factory_(this) {
   net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
   connection_type_ = net::NetworkChangeNotifier::GetConnectionType();
   ProbeWifiPHYLayerProtocol();
+
+  if (network_quality_estimator_provider_) {
+    network_quality_task_runner_ =
+        network_quality_estimator_provider_->GetTaskRunner();
+    DCHECK(network_quality_task_runner_);
+    effective_connection_type_observer_.reset(
+        new EffectiveConnectionTypeObserver(
+            base::Bind(
+                &NetworkMetricsProvider::OnEffectiveConnectionTypeChanged,
+                base::Unretained(this)),
+            base::ThreadTaskRunnerHandle::Get()));
+
+    // Get the network quality estimator and initialize
+    // |effective_connection_type_observer_| on the same task runner on  which
+    // the network quality estimator lives. It is safe to use base::Unretained
+    // here since both |network_quality_estimator_provider_| and
+    // |effective_connection_type_observer_| are owned by |this|, and are
+    // deleted on the |network_quality_task_runner_|.
+    network_quality_task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&GetAndSetNetworkQualityEstimator,
+                   base::Bind(&EffectiveConnectionTypeObserver::Init,
+                              base::Unretained(
+                                  effective_connection_type_observer_.get())),
+                   network_quality_estimator_provider_.get()));
+  }
 }
 
 NetworkMetricsProvider::~NetworkMetricsProvider() {
+  DCHECK(thread_checker_.CalledOnValidThread());
   net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
+  if (effective_connection_type_observer_ &&
+      !network_quality_task_runner_->DeleteSoon(
+          FROM_HERE, effective_connection_type_observer_.release())) {
+    NOTREACHED() << " ECT observer was not deleted successfully";
+  }
+  if (network_quality_estimator_provider_ &&
+      !network_quality_task_runner_->DeleteSoon(
+          FROM_HERE, network_quality_estimator_provider_.release())) {
+    NOTREACHED()
+        << " Network quality estimate provider was not deleted successfully";
+  }
 }
 
 void NetworkMetricsProvider::ProvideGeneralMetrics(
     ChromeUserMetricsExtension*) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   // ProvideGeneralMetrics is called on the main thread, at the time a metrics
   // record is being finalized.
   net::NetworkChangeNotifier::FinalizingMetricsLogRecord();
@@ -52,12 +175,14 @@
 
 void NetworkMetricsProvider::ProvideSystemProfileMetrics(
     SystemProfileProto* system_profile) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   SystemProfileProto::Network* network = system_profile->mutable_network();
   network->set_connection_type_is_ambiguous(connection_type_is_ambiguous_);
   network->set_connection_type(GetConnectionType());
   network->set_wifi_phy_layer_protocol_is_ambiguous(
       wifi_phy_layer_protocol_is_ambiguous_);
   network->set_wifi_phy_layer_protocol(GetWifiPHYLayerProtocol());
+  network->set_effective_connection_type(GetEffectiveConnectionType());
 
   // Update the connection type. Note that this is necessary to set the network
   // type to "none" if there is no network connection for an entire UMA logging
@@ -67,6 +192,7 @@
   // Reset the "ambiguous" flags, since a new metrics log session has started.
   connection_type_is_ambiguous_ = false;
   wifi_phy_layer_protocol_is_ambiguous_ = false;
+  effective_connection_type_is_ambiguous_ = false;
 
   if (!wifi_access_point_info_provider_.get()) {
 #if defined(OS_CHROMEOS)
@@ -86,6 +212,7 @@
 
 void NetworkMetricsProvider::OnConnectionTypeChanged(
     net::NetworkChangeNotifier::ConnectionType type) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   // To avoid reporting an ambiguous connection type for users on flaky
   // connections, ignore transitions to the "none" state. Note that the
   // connection type is refreshed in ProvideSystemProfileMetrics() each time a
@@ -106,6 +233,7 @@
 
 SystemProfileProto::Network::ConnectionType
 NetworkMetricsProvider::GetConnectionType() const {
+  DCHECK(thread_checker_.CalledOnValidThread());
   switch (connection_type_) {
     case net::NetworkChangeNotifier::CONNECTION_NONE:
       return SystemProfileProto::Network::CONNECTION_NONE;
@@ -130,6 +258,7 @@
 
 SystemProfileProto::Network::WifiPHYLayerProtocol
 NetworkMetricsProvider::GetWifiPHYLayerProtocol() const {
+  DCHECK(thread_checker_.CalledOnValidThread());
   switch (wifi_phy_layer_protocol_) {
     case net::WIFI_PHY_LAYER_PROTOCOL_NONE:
       return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_NONE;
@@ -150,7 +279,36 @@
   return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN;
 }
 
+SystemProfileProto::Network::EffectiveConnectionType
+NetworkMetricsProvider::GetEffectiveConnectionType() const {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (effective_connection_type_is_ambiguous_)
+    return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_AMBIGUOUS;
+
+  switch (effective_connection_type_) {
+    case net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN:
+      return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+    case net::EFFECTIVE_CONNECTION_TYPE_OFFLINE:
+      return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_OFFLINE;
+    case net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G:
+      return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
+    case net::EFFECTIVE_CONNECTION_TYPE_2G:
+      return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_2G;
+    case net::EFFECTIVE_CONNECTION_TYPE_3G:
+      return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_3G;
+    case net::EFFECTIVE_CONNECTION_TYPE_4G:
+      return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_4G;
+    case net::EFFECTIVE_CONNECTION_TYPE_LAST:
+      NOTREACHED();
+      return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+  }
+  NOTREACHED();
+  return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+}
+
 void NetworkMetricsProvider::ProbeWifiPHYLayerProtocol() {
+  DCHECK(thread_checker_.CalledOnValidThread());
   PostTaskAndReplyWithResult(
       io_task_runner_,
       FROM_HERE,
@@ -161,6 +319,7 @@
 
 void NetworkMetricsProvider::OnWifiPHYLayerProtocolResult(
     net::WifiPHYLayerProtocol mode) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   if (wifi_phy_layer_protocol_ != net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN &&
       mode != wifi_phy_layer_protocol_) {
     wifi_phy_layer_protocol_is_ambiguous_ = true;
@@ -171,6 +330,7 @@
 void NetworkMetricsProvider::WriteWifiAccessPointProto(
     const WifiAccessPointInfoProvider::WifiAccessPointInfo& info,
     SystemProfileProto::Network* network_proto) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   SystemProfileProto::Network::WifiAccessPoint* access_point_info =
       network_proto->mutable_access_point_info();
   SystemProfileProto::Network::WifiAccessPoint::SecurityMode security =
@@ -246,6 +406,7 @@
 }
 
 void NetworkMetricsProvider::LogAggregatedMetrics() {
+  DCHECK(thread_checker_.CalledOnValidThread());
   base::HistogramBase* error_codes = base::SparseHistogram::FactoryGet(
       "Net.ErrorCodesForMainFrame3",
       base::HistogramBase::kUmaTargetedHistogramFlag);
@@ -263,4 +424,15 @@
   }
 }
 
+void NetworkMetricsProvider::OnEffectiveConnectionTypeChanged(
+    net::EffectiveConnectionType type) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (effective_connection_type_ != type &&
+      type != net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN &&
+      effective_connection_type_ != net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) {
+    effective_connection_type_is_ambiguous_ = true;
+  }
+  effective_connection_type_ = type;
+}
+
 }  // namespace metrics
diff --git a/components/metrics/net/network_metrics_provider.h b/components/metrics/net/network_metrics_provider.h
index da47689..2eccee04 100644
--- a/components/metrics/net/network_metrics_provider.h
+++ b/components/metrics/net/network_metrics_provider.h
@@ -10,11 +10,17 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_base.h"
+#include "base/threading/thread_checker.h"
 #include "components/metrics/metrics_provider.h"
 #include "components/metrics/net/wifi_access_point_info_provider.h"
 #include "components/metrics/proto/system_profile.pb.h"
 #include "net/base/network_change_notifier.h"
 #include "net/base/network_interfaces.h"
+#include "net/nqe/effective_connection_type.h"
+
+namespace net {
+class NetworkQualityEstimator;
+}
 
 namespace metrics {
 
@@ -24,12 +30,44 @@
     : public MetricsProvider,
       public net::NetworkChangeNotifier::ConnectionTypeObserver {
  public:
+  // Class that provides |this| with the network quality estimator.
+  class NetworkQualityEstimatorProvider {
+   public:
+    virtual ~NetworkQualityEstimatorProvider() {}
+
+    // Returns the network quality estimator. May be nullptr.
+    virtual net::NetworkQualityEstimator* GetNetworkQualityEstimator() = 0;
+
+    // Returns the task runner on which |this| should be used and destroyed.
+    virtual scoped_refptr<base::SequencedTaskRunner> GetTaskRunner() = 0;
+
+   protected:
+    NetworkQualityEstimatorProvider() {}
+
+   private:
+    DISALLOW_COPY_AND_ASSIGN(NetworkQualityEstimatorProvider);
+  };
+
   // Creates a NetworkMetricsProvider, where |io_task_runner| is used to post
   // network info collection tasks.
   explicit NetworkMetricsProvider(base::TaskRunner* io_task_runner);
+
+  // Creates a NetworkMetricsProvider, where |io_task_runner| is used to post
+  // network info collection tasks.  |network_quality_estimator_provider|
+  // should be set if it is useful to attach the quality of the network to the
+  // metrics report.
+  NetworkMetricsProvider(std::unique_ptr<NetworkQualityEstimatorProvider>
+                             network_quality_estimator_provider,
+                         base::TaskRunner* io_task_runner);
+
   ~NetworkMetricsProvider() override;
 
  private:
+  FRIEND_TEST_ALL_PREFIXES(NetworkMetricsProviderTest, EffectiveConnectionType);
+
+  // Listens to the changes in the effective conection type.
+  class EffectiveConnectionTypeObserver;
+
   // MetricsProvider:
   void ProvideGeneralMetrics(ChromeUserMetricsExtension* uma_proto) override;
   void ProvideSystemProfileMetrics(SystemProfileProto* system_profile) override;
@@ -41,6 +79,8 @@
   SystemProfileProto::Network::ConnectionType GetConnectionType() const;
   SystemProfileProto::Network::WifiPHYLayerProtocol GetWifiPHYLayerProtocol()
       const;
+  SystemProfileProto::Network::EffectiveConnectionType
+  GetEffectiveConnectionType() const;
 
   // Posts a call to net::GetWifiPHYLayerProtocol on the blocking pool.
   void ProbeWifiPHYLayerProtocol();
@@ -57,6 +97,10 @@
   // Logs metrics that are functions of other metrics being uploaded.
   void LogAggregatedMetrics();
 
+  // Notifies |this| that the effective connection type of the current network
+  // has changed to |type|.
+  void OnEffectiveConnectionTypeChanged(net::EffectiveConnectionType type);
+
   // Task runner used for blocking file I/O.
   base::TaskRunner* io_task_runner_;
 
@@ -79,6 +123,28 @@
   base::HistogramBase::Count total_aborts_;
   base::HistogramBase::Count total_codes_;
 
+  // Provides the network quality estimator. May be null.
+  std::unique_ptr<NetworkQualityEstimatorProvider>
+      network_quality_estimator_provider_;
+
+  // Listens to the changes in the effective connection type. Initialized and
+  // destroyed using |network_quality_task_runner_|. May be null.
+  std::unique_ptr<EffectiveConnectionTypeObserver>
+      effective_connection_type_observer_;
+
+  // Task runner using which |effective_connection_type_observer_| is
+  // initialized and destroyed. May be null.
+  scoped_refptr<base::SequencedTaskRunner> network_quality_task_runner_;
+
+  // Last known effective connection type.
+  net::EffectiveConnectionType effective_connection_type_;
+
+  // True if |effective_connection_type_| changed during the lifetime of the
+  // log.
+  bool effective_connection_type_is_ambiguous_;
+
+  base::ThreadChecker thread_checker_;
+
   base::WeakPtrFactory<NetworkMetricsProvider> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(NetworkMetricsProvider);
diff --git a/components/metrics/net/network_metrics_provider_unittest.cc b/components/metrics/net/network_metrics_provider_unittest.cc
new file mode 100644
index 0000000..a8b2c2a
--- /dev/null
+++ b/components/metrics/net/network_metrics_provider_unittest.cc
@@ -0,0 +1,114 @@
+// 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 "components/metrics/net/network_metrics_provider.h"
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "components/metrics/proto/system_profile.pb.h"
+#include "net/base/network_change_notifier.h"
+#include "net/nqe/network_quality_estimator_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if defined(OS_CHROMEOS)
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/network/network_handler.h"
+#endif  // OS_CHROMEOS
+
+namespace metrics {
+
+namespace {
+
+class TestNetworkQualityEstimatorProvider
+    : public NetworkMetricsProvider::NetworkQualityEstimatorProvider {
+ public:
+  explicit TestNetworkQualityEstimatorProvider(
+      net::TestNetworkQualityEstimator* estimator)
+      : estimator_(estimator) {}
+  ~TestNetworkQualityEstimatorProvider() override {}
+
+ private:
+  // NetworkMetricsProvider::NetworkQualityEstimatorProvider:
+  scoped_refptr<base::SequencedTaskRunner> GetTaskRunner() override {
+    return base::ThreadTaskRunnerHandle::Get();
+  }
+
+  net::NetworkQualityEstimator* GetNetworkQualityEstimator() override {
+    return estimator_;
+  }
+
+  net::TestNetworkQualityEstimator* estimator_;
+  DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimatorProvider);
+};
+
+}  // namespace
+
+// Verifies that the effective connection type is correctly set.
+TEST(NetworkMetricsProviderTest, EffectiveConnectionType) {
+  base::MessageLoop loop(base::MessageLoop::TYPE_IO);
+
+#if defined(OS_CHROMEOS)
+  chromeos::DBusThreadManager::Initialize();
+  chromeos::NetworkHandler::Initialize();
+#endif  // OS_CHROMEOS
+
+  net::TestNetworkQualityEstimator estimator;
+  std::unique_ptr<NetworkMetricsProvider::NetworkQualityEstimatorProvider>
+      estimator_provider(base::WrapUnique(
+          new TestNetworkQualityEstimatorProvider(&estimator)));
+  SystemProfileProto system_profile;
+  NetworkMetricsProvider network_metrics_provider(
+      std::move(estimator_provider), base::ThreadTaskRunnerHandle::Get().get());
+
+  EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
+            network_metrics_provider.effective_connection_type_);
+  network_metrics_provider.ProvideSystemProfileMetrics(&system_profile);
+  EXPECT_EQ(SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
+            system_profile.network().effective_connection_type());
+
+  // Set RTT so that the effective connection type is computed as 2G.
+  estimator.set_recent_http_rtt(base::TimeDelta::FromMilliseconds(1500));
+  estimator.set_start_time_null_http_rtt(
+      base::TimeDelta::FromMilliseconds(1500));
+
+  EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
+            network_metrics_provider.effective_connection_type_);
+  // Running a request would cause the effective connection type to be computed
+  // as 2G, and observers to be notified.
+  estimator.RunOneRequest();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G,
+            network_metrics_provider.effective_connection_type_);
+  network_metrics_provider.ProvideSystemProfileMetrics(&system_profile);
+  EXPECT_EQ(SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_2G,
+            system_profile.network().effective_connection_type());
+
+  // Set RTT so that the effective connection type is computed as SLOW_2G.
+  estimator.set_recent_http_rtt(base::TimeDelta::FromMilliseconds(3000));
+  estimator.set_start_time_null_http_rtt(
+      base::TimeDelta::FromMilliseconds(3000));
+  // Running a request would cause the effective connection type to be computed
+  // as SLOW_2G, and observers to be notified.
+  estimator.RunOneRequest();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G,
+            network_metrics_provider.effective_connection_type_);
+  network_metrics_provider.ProvideSystemProfileMetrics(&system_profile);
+  // Effective connection type is set to ambiguous since the effective
+  // connection type changed from 2G to SLOW_2G during the lifetime of the log.
+  EXPECT_EQ(SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_AMBIGUOUS,
+            system_profile.network().effective_connection_type());
+
+  // Getting the system profile again should return the actual effective
+  // connection type since the effective connection type did not change during
+  // the lifetime of the log.
+  network_metrics_provider.ProvideSystemProfileMetrics(&system_profile);
+  EXPECT_EQ(SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_SLOW_2G,
+            system_profile.network().effective_connection_type());
+}
+
+}  // namespace metrics
\ No newline at end of file
diff --git a/components/metrics/proto/system_profile.proto b/components/metrics/proto/system_profile.proto
index c116a0a..3497529 100644
--- a/components/metrics/proto/system_profile.proto
+++ b/components/metrics/proto/system_profile.proto
@@ -281,6 +281,7 @@
   optional Hardware hardware = 6;
 
   // Information about the network connection.
+  // Next tag: 7
   message Network {
     // Set to true if connection_type changed during the lifetime of the log.
     optional bool connection_type_is_ambiguous = 1;
@@ -366,6 +367,27 @@
     }
     // Information of the wireless AP that device is connected to.
     optional WifiAccessPoint access_point_info = 5;
+
+    // Derived from net::NetworkQualityEstimator::EffectiveConnectionType
+    // translated through NetworkMetricsProvider::GetConnectionType.
+    enum EffectiveConnectionType {
+      EFFECTIVE_CONNECTION_TYPE_UNKNOWN = 0;
+      // Specifies that the connection_type changed during the lifetime of the
+      // log.
+      EFFECTIVE_CONNECTION_TYPE_AMBIGUOUS = 1;
+      EFFECTIVE_CONNECTION_TYPE_OFFLINE = 2;
+      EFFECTIVE_CONNECTION_TYPE_SLOW_2G = 3;
+      EFFECTIVE_CONNECTION_TYPE_2G = 4;
+      EFFECTIVE_CONNECTION_TYPE_3G = 5;
+      EFFECTIVE_CONNECTION_TYPE_4G = 6;
+    }
+    // The connection type according to net::NetworkQualityEstimator.
+    // EffectiveConnectionType is the connection type whose typical performance
+    // is most similar to the measured performance of the network in use. In
+    // many cases, the "effective" connection type and the actual type of
+    // connection in use are the same, but often a network connection performs
+    // significantly differently, usually worse, from its expected capabilities.
+    optional EffectiveConnectionType effective_connection_type = 6;
   }
   optional Network network = 13;
 
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index 185c8e7..f4b000d 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -373,18 +373,19 @@
 
 void BrowserChildProcessHostImpl::OnBadMessageReceived(
     const IPC::Message& message) {
-  TerminateOnBadMessageReceived(message.type());
+  std::string log_message =
+      base::StringPrintf("Bad message received of type: %u", message.type());
+  TerminateOnBadMessageReceived(log_message);
 }
 
-void BrowserChildProcessHostImpl::TerminateOnBadMessageReceived(uint32_t type) {
+void BrowserChildProcessHostImpl::TerminateOnBadMessageReceived(
+    const std::string& error) {
   HistogramBadMessageTerminated(data_.process_type);
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kDisableKillAfterBadIPC)) {
     return;
   }
-  LOG(ERROR) << "Terminating child process for bad IPC message of type "
-             << type;
-
+  LOG(ERROR) << "Terminating child process for bad IPC message: " << error;
   // Create a memory dump. This will contain enough stack frames to work out
   // what the bad message was.
   base::debug::DumpWithoutCrashing();
diff --git a/content/browser/browser_child_process_host_impl.h b/content/browser/browser_child_process_host_impl.h
index 9975dc1..ff9c3291 100644
--- a/content/browser/browser_child_process_host_impl.h
+++ b/content/browser/browser_child_process_host_impl.h
@@ -92,9 +92,9 @@
   void OnChannelError() override;
   void OnBadMessageReceived(const IPC::Message& message) override;
 
-  // Terminates the process and logs an error after a bad message was received
-  // from the child process.
-  void TerminateOnBadMessageReceived(uint32_t type);
+  // Terminates the process and logs a stack trace after a bad message was
+  // received from the child process.
+  void TerminateOnBadMessageReceived(const std::string& error);
 
   // Removes this host from the host list. Calls ChildProcessHost::ForceShutdown
   void ForceShutdown();
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index b6ead8eb..b434c7d 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -691,6 +691,7 @@
 void GpuProcessHost::OnAcceleratedSurfaceCreatedChildWindow(
     gpu::SurfaceHandle parent_handle,
     gpu::SurfaceHandle window_handle) {
+  constexpr char kBadMessageError[] = "Bad parenting request from gpu process.";
   if (!in_process_) {
     DCHECK(process_);
     {
@@ -698,8 +699,7 @@
       DWORD thread_id = GetWindowThreadProcessId(parent_handle, &process_id);
 
       if (!thread_id || process_id != ::GetCurrentProcessId()) {
-        process_->TerminateOnBadMessageReceived(
-            GpuHostMsg_AcceleratedSurfaceCreatedChildWindow::ID);
+        process_->TerminateOnBadMessageReceived(kBadMessageError);
         return;
       }
     }
@@ -709,8 +709,7 @@
       DWORD thread_id = GetWindowThreadProcessId(window_handle, &process_id);
 
       if (!thread_id || process_id != process_->GetProcess().Pid()) {
-        process_->TerminateOnBadMessageReceived(
-            GpuHostMsg_AcceleratedSurfaceCreatedChildWindow::ID);
+        process_->TerminateOnBadMessageReceived(kBadMessageError);
         return;
       }
     }
@@ -718,8 +717,7 @@
 
   if (!gfx::RenderingWindowManager::GetInstance()->RegisterChild(
           parent_handle, window_handle)) {
-    process_->TerminateOnBadMessageReceived(
-        GpuHostMsg_AcceleratedSurfaceCreatedChildWindow::ID);
+    process_->TerminateOnBadMessageReceived(kBadMessageError);
   }
 }
 #endif
diff --git a/content/browser/media/capture/desktop_capture_device_aura_unittest.cc b/content/browser/media/capture/desktop_capture_device_aura_unittest.cc
index 2cb5b47..e7e5668 100644
--- a/content/browser/media/capture/desktop_capture_device_aura_unittest.cc
+++ b/content/browser/media/capture/desktop_capture_device_aura_unittest.cc
@@ -73,9 +73,13 @@
                                 base::TimeDelta timestamp) override {
     DoOnIncomingCapturedBuffer();
   }
-  void OnIncomingCapturedVideoFrame(
+  void OnIncomingCapturedBufferExt(
       std::unique_ptr<Buffer> buffer,
-      scoped_refptr<media::VideoFrame> frame) override {
+      const media::VideoCaptureFormat& format,
+      base::TimeTicks reference_time,
+      base::TimeDelta timestamp,
+      gfx::Rect visible_rect,
+      const media::VideoFrameMetadata& additional_metadata) override {
     DoOnIncomingCapturedVideoFrame();
   }
   std::unique_ptr<Buffer> ResurrectLastOutputBuffer(
diff --git a/content/browser/media/capture/desktop_capture_device_unittest.cc b/content/browser/media/capture/desktop_capture_device_unittest.cc
index 4fe54c08..0d19dec 100644
--- a/content/browser/media/capture/desktop_capture_device_unittest.cc
+++ b/content/browser/media/capture/desktop_capture_device_unittest.cc
@@ -92,9 +92,13 @@
                                 base::TimeDelta timestamp) override {
     DoOnIncomingCapturedBuffer();
   }
-  void OnIncomingCapturedVideoFrame(
-      std::unique_ptr<Buffer> buffer,
-      scoped_refptr<media::VideoFrame> frame) override {
+  void OnIncomingCapturedBufferExt(
+        std::unique_ptr<Buffer> buffer,
+        const media::VideoCaptureFormat& format,
+        base::TimeTicks reference_time,
+        base::TimeDelta timestamp,
+        gfx::Rect visible_rect,
+        const media::VideoFrameMetadata& additional_metadata) override {
     DoOnIncomingCapturedVideoFrame();
   }
   std::unique_ptr<Buffer> ResurrectLastOutputBuffer(
diff --git a/content/browser/media/capture/screen_capture_device_android_unittest.cc b/content/browser/media/capture/screen_capture_device_android_unittest.cc
index 421d621..114123e 100644
--- a/content/browser/media/capture/screen_capture_device_android_unittest.cc
+++ b/content/browser/media/capture/screen_capture_device_android_unittest.cc
@@ -50,9 +50,13 @@
                                 base::TimeDelta timestamp) override {
     DoOnIncomingCapturedBuffer();
   }
-  void OnIncomingCapturedVideoFrame(
+  void OnIncomingCapturedBufferExt(
       std::unique_ptr<Buffer> buffer,
-      scoped_refptr<media::VideoFrame> frame) override {
+        const media::VideoCaptureFormat& format,
+        base::TimeTicks reference_time,
+        base::TimeDelta timestamp,
+        gfx::Rect visible_rect,
+        const media::VideoFrameMetadata& additional_metadata) override {
     DoOnIncomingCapturedVideoFrame();
   }
   std::unique_ptr<Buffer> ResurrectLastOutputBuffer(
diff --git a/content/browser/media/capture/web_contents_video_capture_device_unittest.cc b/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
index f6abb656..018c961 100644
--- a/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
+++ b/content/browser/media/capture/web_contents_video_capture_device_unittest.cc
@@ -270,27 +270,32 @@
     DoOnIncomingCapturedBuffer();
   }
 
-  void OnIncomingCapturedVideoFrame(
-      std::unique_ptr<Buffer> buffer,
-      scoped_refptr<media::VideoFrame> frame) override {
-    EXPECT_FALSE(frame->visible_rect().IsEmpty());
-    EXPECT_EQ(media::PIXEL_FORMAT_I420, frame->format());
-    double frame_rate = 0;
-    EXPECT_TRUE(
-        frame->metadata()->GetDouble(media::VideoFrameMetadata::FRAME_RATE,
-                                     &frame_rate));
-    EXPECT_EQ(kTestFramesPerSecond, frame_rate);
+  void OnIncomingCapturedBufferExt(
+      std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer,
+      const media::VideoCaptureFormat& format,
+      base::TimeTicks reference_time,
+      base::TimeDelta timestamp,
+      gfx::Rect visible_rect,
+      const media::VideoFrameMetadata& additional_metadata) override {
+    EXPECT_FALSE(visible_rect.IsEmpty());
+    EXPECT_EQ(media::PIXEL_FORMAT_I420, format.pixel_format);
+    EXPECT_EQ(kTestFramesPerSecond, format.frame_rate);
 
     // TODO(miu): We just look at the center pixel presently, because if the
     // analysis is too slow, the backlog of frames will grow without bound and
     // trouble erupts. http://crbug.com/174519
     using media::VideoFrame;
-    const gfx::Point center = frame->visible_rect().CenterPoint();
+    auto frame = VideoFrame::WrapExternalSharedMemory(
+        media::PIXEL_FORMAT_I420, format.frame_size, visible_rect,
+        format.frame_size, static_cast<uint8_t*>(buffer->data()),
+        buffer->mapped_size(), base::SharedMemory::NULLHandle(), 0u,
+        base::TimeDelta());
+    const gfx::Point center = visible_rect.CenterPoint();
     const int center_offset_y =
         (frame->stride(VideoFrame::kYPlane) * center.y()) + center.x();
     const int center_offset_uv =
         (frame->stride(VideoFrame::kUPlane) * (center.y() / 2)) +
-            (center.x() / 2);
+        (center.x() / 2);
     report_callback_.Run(
         SkColorSetRGB(frame->data(VideoFrame::kYPlane)[center_offset_y],
                       frame->data(VideoFrame::kUPlane)[center_offset_uv],
diff --git a/content/browser/renderer_host/media/video_capture_controller_unittest.cc b/content/browser/renderer_host/media/video_capture_controller_unittest.cc
index e9e59c4..9990d32d 100644
--- a/content/browser/renderer_host/media/video_capture_controller_unittest.cc
+++ b/content/browser/renderer_host/media/video_capture_controller_unittest.cc
@@ -160,19 +160,6 @@
 
   void TearDown() override { base::RunLoop().RunUntilIdle(); }
 
-  scoped_refptr<media::VideoFrame> WrapBuffer(
-      gfx::Size dimensions,
-      uint8_t* data,
-      media::VideoPixelFormat format = media::PIXEL_FORMAT_I420) {
-    scoped_refptr<media::VideoFrame> video_frame =
-        media::VideoFrame::WrapExternalSharedMemory(
-            format, dimensions, gfx::Rect(dimensions), dimensions, data,
-            media::VideoFrame::AllocationSize(format, dimensions),
-            base::SharedMemory::NULLHandle(), 0u, base::TimeDelta());
-    EXPECT_TRUE(video_frame);
-    return video_frame;
-  }
-
   TestBrowserThreadBundle bundle_;
   std::unique_ptr<MockVideoCaptureControllerEventHandler> client_a_;
   std::unique_ptr<MockVideoCaptureControllerEventHandler> client_b_;
@@ -180,6 +167,9 @@
   std::unique_ptr<media::VideoCaptureDevice::Client> device_client_;
   MockFrameBufferPool* mock_frame_receiver_observer_;
   MockConsumerFeedbackObserver* mock_consumer_feedback_observer_;
+  const float arbitrary_frame_rate_ = 10.0f;
+  const base::TimeTicks arbitrary_reference_time_ = base::TimeTicks();
+  const base::TimeDelta arbitrary_timestamp_ = base::TimeDelta();
 
  private:
   DISALLOW_COPY_AND_ASSIGN(VideoCaptureControllerTest);
@@ -299,19 +289,13 @@
 
   media::VideoCaptureParams session_1 = session_100;
 
-  const gfx::Size capture_resolution(444, 200);
-
-  // The device format needn't match the VideoCaptureParams (the camera can do
-  // what it wants). Pick something random.
-  media::VideoCaptureFormat device_format(
-      gfx::Size(10, 10), 25, media::PIXEL_FORMAT_RGB24);
+  media::VideoCaptureFormat device_format(gfx::Size(444, 200), 25, format);
 
   const VideoCaptureControllerID client_a_route_1(0xa1a1a1a1);
   const VideoCaptureControllerID client_a_route_2(0xa2a2a2a2);
   const VideoCaptureControllerID client_b_route_1(0xb1b1b1b1);
   const VideoCaptureControllerID client_b_route_2(0xb2b2b2b2);
 
-  // Start with two clients.
   controller_->AddClient(client_a_route_1,
                          client_a_.get(),
                          100,
@@ -332,8 +316,9 @@
   const int arbitrary_frame_feedback_id = 101;
   ASSERT_EQ(0.0, device_client_->GetBufferPoolUtilization());
   std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer(
-      device_client_->ReserveOutputBuffer(capture_resolution, format,
-                                          media::PIXEL_STORAGE_CPU,
+      device_client_->ReserveOutputBuffer(device_format.frame_size,
+                                          device_format.pixel_format,
+                                          device_format.pixel_storage,
                                           arbitrary_frame_feedback_id));
   ASSERT_TRUE(buffer.get());
   ASSERT_EQ(1.0 / kPoolSize, device_client_->GetBufferPoolUtilization());
@@ -341,26 +326,24 @@
   {
     InSequence s;
     EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)).Times(1);
-    EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1, capture_resolution))
+    EXPECT_CALL(*client_a_,
+                DoBufferReady(client_a_route_1, device_format.frame_size))
         .Times(1);
   }
   {
     InSequence s;
     EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1);
-    EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1, capture_resolution))
+    EXPECT_CALL(*client_b_,
+                DoBufferReady(client_b_route_1, device_format.frame_size))
         .Times(1);
   }
   {
     InSequence s;
     EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1);
-    EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2, capture_resolution))
+    EXPECT_CALL(*client_a_,
+                DoBufferReady(client_a_route_2, device_format.frame_size))
         .Times(1);
   }
-  scoped_refptr<media::VideoFrame> video_frame = WrapBuffer(
-      capture_resolution, static_cast<uint8_t*>(buffer->data()), format);
-  ASSERT_TRUE(video_frame);
-  ASSERT_FALSE(video_frame->metadata()->HasKey(
-      media::VideoFrameMetadata::RESOURCE_UTILIZATION));
   client_a_->resource_utilization_ = 0.5;
   client_b_->resource_utilization_ = -1.0;
   {
@@ -376,9 +359,10 @@
         .Times(1);
   }
 
-  video_frame->metadata()->SetTimeTicks(
-      media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
-  device_client_->OnIncomingCapturedVideoFrame(std::move(buffer), video_frame);
+  device_client_->OnIncomingCapturedBuffer(std::move(buffer),
+    device_format,
+    arbitrary_reference_time_,
+    arbitrary_timestamp_);
 
   base::RunLoop().RunUntilIdle();
   Mock::VerifyAndClearExpectations(client_a_.get());
@@ -391,17 +375,14 @@
   // delay. This shouldn't affect anything.
   const int arbitrary_frame_feedback_id_2 = 102;
   std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer2 =
-      device_client_->ReserveOutputBuffer(capture_resolution, format,
-                                          media::PIXEL_STORAGE_CPU,
+      device_client_->ReserveOutputBuffer(device_format.frame_size,
+                                          device_format.pixel_format,
+                                          device_format.pixel_storage,
                                           arbitrary_frame_feedback_id_2);
   ASSERT_TRUE(buffer2.get());
   memset(buffer2->data(), buffer_no++, buffer2->mapped_size());
-  video_frame = WrapBuffer(capture_resolution,
-                           static_cast<uint8_t*>(buffer2->data()), format);
   client_a_->resource_utilization_ = 0.5;
   client_b_->resource_utilization_ = 3.14;
-  video_frame->metadata()->SetTimeTicks(
-      media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
   // Expect VideoCaptureController to call the load observer with a
   // resource utilization of 3.14 (the largest of all reported values).
   {
@@ -418,25 +399,31 @@
         .Times(1);
   }
 
-  device_client_->OnIncomingCapturedVideoFrame(std::move(buffer2), video_frame);
+  device_client_->OnIncomingCapturedBuffer(std::move(buffer2),
+    device_format,
+    arbitrary_reference_time_,
+    arbitrary_timestamp_);
 
   // The buffer should be delivered to the clients in any order.
   {
     InSequence s;
     EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1)).Times(1);
-    EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1, capture_resolution))
+    EXPECT_CALL(*client_a_,
+                DoBufferReady(client_a_route_1, device_format.frame_size))
         .Times(1);
   }
   {
     InSequence s;
     EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1)).Times(1);
-    EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1, capture_resolution))
+    EXPECT_CALL(*client_b_,
+                DoBufferReady(client_b_route_1, device_format.frame_size))
         .Times(1);
   }
   {
     InSequence s;
     EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2)).Times(1);
-    EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2, capture_resolution))
+    EXPECT_CALL(*client_a_,
+                DoBufferReady(client_a_route_2, device_format.frame_size))
         .Times(1);
   }
   base::RunLoop().RunUntilIdle();
@@ -456,42 +443,45 @@
   for (int i = 0; i < kPoolSize; i++) {
     const int arbitrary_frame_feedback_id = 200 + i;
     std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer =
-        device_client_->ReserveOutputBuffer(capture_resolution, format,
-                                            media::PIXEL_STORAGE_CPU,
+        device_client_->ReserveOutputBuffer(device_format.frame_size,
+                                            device_format.pixel_format,
+                                            device_format.pixel_storage,
                                             arbitrary_frame_feedback_id);
     ASSERT_TRUE(buffer.get());
     memset(buffer->data(), buffer_no++, buffer->mapped_size());
-    video_frame = WrapBuffer(capture_resolution,
-                             static_cast<uint8_t*>(buffer->data()), format);
-    ASSERT_TRUE(video_frame);
-    video_frame->metadata()->SetTimeTicks(
-        media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
-    device_client_->OnIncomingCapturedVideoFrame(std::move(buffer),
-                                                 video_frame);
+    device_client_->OnIncomingCapturedBuffer(std::move(buffer),
+      device_format,
+      arbitrary_reference_time_,
+      arbitrary_timestamp_);
   }
   // ReserveOutputBuffer ought to fail now, because the pool is depleted.
   ASSERT_FALSE(device_client_
-                   ->ReserveOutputBuffer(capture_resolution, format,
-                                         media::PIXEL_STORAGE_CPU,
+                   ->ReserveOutputBuffer(device_format.frame_size,
+                                         device_format.pixel_format,
+                                         device_format.pixel_storage,
                                          arbitrary_frame_feedback_id)
                    .get());
 
   // The new client needs to be notified of the creation of |kPoolSize| buffers;
   // the old clients only |kPoolSize - 2|.
   EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_2)).Times(kPoolSize);
-  EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2, capture_resolution))
+  EXPECT_CALL(*client_b_,
+              DoBufferReady(client_b_route_2, device_format.frame_size))
       .Times(kPoolSize);
   EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_1))
       .Times(kPoolSize - 2);
-  EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_1, capture_resolution))
+  EXPECT_CALL(*client_a_,
+              DoBufferReady(client_a_route_1, device_format.frame_size))
       .Times(kPoolSize);
   EXPECT_CALL(*client_a_, DoBufferCreated(client_a_route_2))
       .Times(kPoolSize - 2);
-  EXPECT_CALL(*client_a_, DoBufferReady(client_a_route_2, capture_resolution))
+  EXPECT_CALL(*client_a_,
+              DoBufferReady(client_a_route_2, device_format.frame_size))
       .Times(kPoolSize);
   EXPECT_CALL(*client_b_, DoBufferCreated(client_b_route_1))
       .Times(kPoolSize - 2);
-  EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_1, capture_resolution))
+  EXPECT_CALL(*client_b_,
+              DoBufferReady(client_b_route_1, device_format.frame_size))
       .Times(kPoolSize);
   base::RunLoop().RunUntilIdle();
   Mock::VerifyAndClearExpectations(client_a_.get());
@@ -505,21 +495,21 @@
   controller_->StopSession(300);
   // Queue up another buffer.
   std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer3 =
-      device_client_->ReserveOutputBuffer(capture_resolution, format,
-                                          media::PIXEL_STORAGE_CPU,
+      device_client_->ReserveOutputBuffer(device_format.frame_size,
+                                          device_format.pixel_format,
+                                          device_format.pixel_storage,
                                           arbitrary_frame_feedback_id);
   ASSERT_TRUE(buffer3.get());
   memset(buffer3->data(), buffer_no++, buffer3->mapped_size());
-  video_frame = WrapBuffer(capture_resolution,
-                           static_cast<uint8_t*>(buffer3->data()), format);
-  ASSERT_TRUE(video_frame);
-  video_frame->metadata()->SetTimeTicks(
-      media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
-  device_client_->OnIncomingCapturedVideoFrame(std::move(buffer3), video_frame);
+  device_client_->OnIncomingCapturedBuffer(std::move(buffer3),
+    device_format,
+    arbitrary_reference_time_,
+    arbitrary_timestamp_);
 
   std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer4 =
-      device_client_->ReserveOutputBuffer(capture_resolution, format,
-                                          media::PIXEL_STORAGE_CPU,
+      device_client_->ReserveOutputBuffer(device_format.frame_size,
+                                          device_format.pixel_format,
+                                          device_format.pixel_storage,
                                           arbitrary_frame_feedback_id);
   {
     // Kill A2 via session close (posts a task to disconnect, but A2 must not
@@ -529,15 +519,14 @@
   }
   ASSERT_TRUE(buffer4.get());
   memset(buffer4->data(), buffer_no++, buffer4->mapped_size());
-  video_frame = WrapBuffer(capture_resolution,
-                           static_cast<uint8_t*>(buffer4->data()), format);
-  ASSERT_TRUE(video_frame);
-  video_frame->metadata()->SetTimeTicks(
-      media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
-  device_client_->OnIncomingCapturedVideoFrame(std::move(buffer4), video_frame);
+  device_client_->OnIncomingCapturedBuffer(std::move(buffer4),
+    device_format,
+    arbitrary_reference_time_,
+    arbitrary_timestamp_);
   // B2 is the only client left, and is the only one that should
   // get the buffer.
-  EXPECT_CALL(*client_b_, DoBufferReady(client_b_route_2, capture_resolution))
+  EXPECT_CALL(*client_b_,
+              DoBufferReady(client_b_route_2, device_format.frame_size))
       .Times(2);
   base::RunLoop().RunUntilIdle();
   Mock::VerifyAndClearExpectations(client_a_.get());
@@ -576,18 +565,19 @@
   base::RunLoop().RunUntilIdle();
   Mock::VerifyAndClearExpectations(client_b_.get());
 
-  const int arbitrary_frame_feedback_id = 101;
+  media::VideoCaptureFormat device_format(
+      capture_resolution, arbitrary_frame_rate_, media::PIXEL_FORMAT_I420,
+      media::PIXEL_STORAGE_CPU);
+    const int arbitrary_frame_feedback_id = 101;
   std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer(
-      device_client_->ReserveOutputBuffer(
-          capture_resolution, media::PIXEL_FORMAT_I420,
-          media::PIXEL_STORAGE_CPU, arbitrary_frame_feedback_id));
-  ASSERT_TRUE(buffer.get());
-  scoped_refptr<media::VideoFrame> video_frame =
-      WrapBuffer(capture_resolution, static_cast<uint8_t*>(buffer->data()));
-  ASSERT_TRUE(video_frame);
-  video_frame->metadata()->SetTimeTicks(
-      media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
-  device_client_->OnIncomingCapturedVideoFrame(std::move(buffer), video_frame);
+      device_client_->ReserveOutputBuffer(device_format.frame_size,
+                                          device_format.pixel_format,
+                                          device_format.pixel_storage,
+                                          arbitrary_frame_feedback_id));
+  device_client_->OnIncomingCapturedBuffer(std::move(buffer),
+    device_format,
+    arbitrary_reference_time_,
+    arbitrary_timestamp_);
 
   base::RunLoop().RunUntilIdle();
 }
@@ -605,8 +595,6 @@
 
   // Start with one client.
   controller_->AddClient(route_id, client_a_.get(), 100, session_100);
-  media::VideoCaptureFormat device_format(
-      gfx::Size(10, 10), 25, media::PIXEL_FORMAT_ARGB);
 
   // Start the device. Then, before the first buffer, signal an error and
   // deliver the buffer. The error should be propagated to clients; the buffer
@@ -614,21 +602,21 @@
   base::RunLoop().RunUntilIdle();
   Mock::VerifyAndClearExpectations(client_a_.get());
 
-  const gfx::Size dims(320, 240);
+  media::VideoCaptureFormat device_format(
+      gfx::Size(10, 10), arbitrary_frame_rate_, media::PIXEL_FORMAT_I420);
   const int arbitrary_frame_feedback_id = 101;
   std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer(
-      device_client_->ReserveOutputBuffer(dims, media::PIXEL_FORMAT_I420,
-                                          media::PIXEL_STORAGE_CPU,
+      device_client_->ReserveOutputBuffer(device_format.frame_size,
+                                          device_format.pixel_format,
+                                          device_format.pixel_storage,
                                           arbitrary_frame_feedback_id));
   ASSERT_TRUE(buffer.get());
 
-  scoped_refptr<media::VideoFrame> video_frame =
-      WrapBuffer(dims, static_cast<uint8_t*>(buffer->data()));
-  ASSERT_TRUE(video_frame);
   device_client_->OnError(FROM_HERE, "Test Error");
-  video_frame->metadata()->SetTimeTicks(
-      media::VideoFrameMetadata::REFERENCE_TIME, base::TimeTicks());
-  device_client_->OnIncomingCapturedVideoFrame(std::move(buffer), video_frame);
+  device_client_->OnIncomingCapturedBuffer(std::move(buffer),
+    device_format,
+    arbitrary_reference_time_,
+    arbitrary_timestamp_);
 
   EXPECT_CALL(*client_a_, DoError(route_id)).Times(1);
   base::RunLoop().RunUntilIdle();
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 43a660e2..3edb052 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -30,6 +30,7 @@
 #include "content/child/service_worker/web_service_worker_registration_impl.h"
 #include "content/child/thread_safe_sender.h"
 #include "content/child/web_data_consumer_handle_impl.h"
+#include "content/child/web_url_loader_impl.h"
 #include "content/child/webmessageportchannel_impl.h"
 #include "content/common/devtools_messages.h"
 #include "content/common/message_port_messages.h"
@@ -54,6 +55,7 @@
 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
 #include "third_party/WebKit/public/platform/WebString.h"
+#include "third_party/WebKit/public/platform/WebURLResponse.h"
 #include "third_party/WebKit/public/platform/modules/notifications/WebNotificationData.h"
 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerClientQueryOptions.h"
 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerError.h"
@@ -112,6 +114,18 @@
   }
 };
 
+ServiceWorkerStatusCode EventResultToStatus(
+    blink::WebServiceWorkerEventResult result) {
+  switch (result) {
+    case blink::WebServiceWorkerEventResultCompleted:
+      return SERVICE_WORKER_OK;
+    case blink::WebServiceWorkerEventResultRejected:
+      return SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED;
+  }
+  NOTREACHED() << "Got invalid result: " << result;
+  return SERVICE_WORKER_ERROR_FAILED;
+}
+
 void SendPostMessageToClientOnMainThread(
     ThreadSafeSender* sender,
     int routing_id,
@@ -258,22 +272,11 @@
       mojom::DownloadedTempFilePtr downloaded_file) override {
     DCHECK(!response_);
     DCHECK(!downloaded_file);
-    response_ = base::MakeUnique<blink::WebServiceWorkerResponse>();
-    response_->setURLList(std::vector<blink::WebURL>({url_}));
-    DCHECK(response_head.headers);
-    response_->setStatus(response_head.headers->response_code());
-    response_->setStatusText(
-        blink::WebString::fromUTF8(response_head.headers->GetStatusText()));
-    response_->setResponseType(blink::WebServiceWorkerResponseTypeBasic);
-    size_t iter = 0;
-    std::string header_name;
-    std::string header_value;
-    while (response_head.headers->EnumerateHeaderLines(&iter, &header_name,
-                                                       &header_value)) {
-      response_->appendHeader(blink::WebString::fromUTF8(header_name),
-                              blink::WebString::fromUTF8(header_value));
-    }
-    response_->setResponseTime(response_head.response_time.ToInternalValue());
+    response_ = base::MakeUnique<blink::WebURLResponse>();
+    // TODO(horo): Set report_security_info to true when DevTools is attached.
+    const bool report_security_info = false;
+    WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(),
+                                          report_security_info);
     MaybeReportResponseToClient();
   }
 
@@ -343,7 +346,7 @@
   mojom::URLLoaderPtr url_loader_;
   mojo::Binding<mojom::URLLoaderClient> binding_;
 
-  std::unique_ptr<blink::WebServiceWorkerResponse> response_;
+  std::unique_ptr<blink::WebURLResponse> response_;
   mojo::ScopedDataPipeConsumerHandle body_;
   bool result_reported_ = false;
 };
@@ -683,13 +686,8 @@
   const DispatchExtendableMessageEventCallback* callback =
       context_->message_event_callbacks.Lookup(request_id);
   DCHECK(callback);
-  if (result == blink::WebServiceWorkerEventResultCompleted) {
-    callback->Run(SERVICE_WORKER_OK,
-                  base::Time::FromDoubleT(event_dispatch_time));
-  } else {
-    callback->Run(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED,
-                  base::Time::FromDoubleT(event_dispatch_time));
-  }
+  callback->Run(EventResultToStatus(result),
+                base::Time::FromDoubleT(event_dispatch_time));
   context_->message_event_callbacks.Remove(request_id);
 }
 
@@ -734,12 +732,8 @@
   }
   const FetchCallback* callback =
       context_->fetch_event_callbacks.Lookup(fetch_event_id);
-  if (!callback)
-    return;
-
-  callback->Run(result == blink::WebServiceWorkerEventResultCompleted
-                    ? SERVICE_WORKER_OK
-                    : SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED,
+  DCHECK(callback);
+  callback->Run(EventResultToStatus(result),
                 base::Time::FromDoubleT(event_dispatch_time));
   context_->fetch_event_callbacks.Remove(fetch_event_id);
 }
@@ -777,15 +771,9 @@
     double event_dispatch_time) {
   const SyncCallback* callback =
       context_->sync_event_callbacks.Lookup(request_id);
-  if (!callback)
-    return;
-  if (result == blink::WebServiceWorkerEventResultCompleted) {
-    callback->Run(SERVICE_WORKER_OK,
-                  base::Time::FromDoubleT(event_dispatch_time));
-  } else {
-    callback->Run(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED,
-                  base::Time::FromDoubleT(event_dispatch_time));
-  }
+  DCHECK(callback);
+  callback->Run(EventResultToStatus(result),
+                base::Time::FromDoubleT(event_dispatch_time));
   context_->sync_event_callbacks.Remove(request_id);
 }
 
@@ -1266,7 +1254,7 @@
 
 void ServiceWorkerContextClient::OnNavigationPreloadResponse(
     int fetch_event_id,
-    std::unique_ptr<blink::WebServiceWorkerResponse> response,
+    std::unique_ptr<blink::WebURLResponse> response,
     std::unique_ptr<blink::WebDataConsumerHandle> data_consumer_handle) {
   proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response),
                                       std::move(data_consumer_handle));
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 4bbcc32..b11dfec2 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -45,6 +45,7 @@
 class WebServiceWorkerContextProxy;
 class WebServiceWorkerProvider;
 class WebServiceWorkerResponse;
+class WebURLResponse;
 }
 
 namespace IPC {
@@ -266,7 +267,7 @@
 
   void OnNavigationPreloadResponse(
       int fetch_event_id,
-      std::unique_ptr<blink::WebServiceWorkerResponse> response,
+      std::unique_ptr<blink::WebURLResponse> response,
       std::unique_ptr<blink::WebDataConsumerHandle> data_consumer_handle);
   void OnNavigationPreloadError(
       int fetch_event_id,
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py
index 9399235..fca3765 100755
--- a/content/test/gpu/generate_buildbot_json.py
+++ b/content/test/gpu/generate_buildbot_json.py
@@ -54,7 +54,7 @@
       'swarming_dimensions': [
         {
           'gpu': '8086:0a2e',
-          'os': 'Mac-10.10'
+          'os': 'Mac-10.12'
         },
       ],
       'build_config': 'Release',
@@ -65,7 +65,7 @@
       'swarming_dimensions': [
         {
           'gpu': '8086:0a2e',
-          'os': 'Mac-10.10'
+          'os': 'Mac-10.12'
         },
       ],
       'build_config': 'Debug',
@@ -323,7 +323,7 @@
       'swarming_dimensions': [
         {
           'gpu': '8086:0a2e',
-          'os': 'Mac-10.10'
+          'os': 'Mac-10.12'
         },
       ],
       'build_config': 'Release',
@@ -334,7 +334,7 @@
       'swarming_dimensions': [
         {
           'gpu': '8086:0a2e',
-          'os': 'Mac-10.10'
+          'os': 'Mac-10.12'
         },
       ],
       'build_config': 'Debug',
@@ -433,7 +433,7 @@
       'swarming_dimensions': [
         {
           'gpu': '8086:0a2e',
-          'os': 'Mac-10.10'
+          'os': 'Mac-10.12'
         },
         {
           'gpu': '1002:6821',
@@ -690,7 +690,7 @@
       'swarming_dimensions': [
         {
           'gpu': '8086:0a2e',
-          'os': 'Mac-10.10'
+          'os': 'Mac-10.12'
         },
       ],
       'build_config': 'Release',
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py
index ff3fb67..e072811 100644
--- a/content/test/gpu/gpu_tests/pixel_expectations.py
+++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -48,3 +48,9 @@
     # TODO(kainino): remove this once golden images are generated
     self.Fail('Pixel_WebGLTransparentGreenTriangle_NoAlpha_ImplicitClear',
               bug=666259)
+
+    # TODO(xlai): check if the new reference image has blurring edge between
+    # red rectangle and green rectangle; if so, delete this.
+    self.Fail('Pixel_OffscreenCanvas2DResizeOnWorker', bug=676666)
+    self.Fail('Pixel_OffscreenCanvasAccelerated2D', bug=676666)
+    self.Fail('Pixel_OffscreenCanvasAccelerated2DWorker', bug=676666)
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py
index b88272b9..5cfb6283 100644
--- a/content/test/gpu/gpu_tests/pixel_test_pages.py
+++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -336,14 +336,14 @@
       'pixel_offscreenCanvas_2d_commit_main.html',
       base_name + '_OffscreenCanvasAccelerated2D',
       test_rect=[0, 0, 300, 300],
-      revision=2,
+      revision=3,
       browser_args=browser_args),
 
     PixelTestPage(
       'pixel_offscreenCanvas_2d_commit_worker.html',
       base_name + '_OffscreenCanvasAccelerated2DWorker',
       test_rect=[0, 0, 300, 300],
-      revision=2,
+      revision=3,
       browser_args=browser_args),
 
     PixelTestPage(
@@ -378,7 +378,7 @@
       'pixel_offscreenCanvas_2d_resize_on_worker.html',
       base_name + '_OffscreenCanvas2DResizeOnWorker',
       test_rect=[0, 0, 200, 200],
-      revision=1,
+      revision=2,
       browser_args=browser_args),
 
     PixelTestPage(
diff --git a/content/test/gpu/gpu_tests/test_expectations.py b/content/test/gpu/gpu_tests/test_expectations.py
index 528153c..d97a9a3a 100644
--- a/content/test/gpu/gpu_tests/test_expectations.py
+++ b/content/test/gpu/gpu_tests/test_expectations.py
@@ -9,7 +9,7 @@
 #
 # Operating systems:
 #     win, xp, vista, win7, win8, win10, mac, leopard, snowleopard,
-#     lion, mountainlion, mavericks, yosemite, linux, chromeos,
+#     lion, mountainlion, mavericks, yosemite, sierra, linux, chromeos,
 #     android
 #
 # Browser types:
@@ -21,7 +21,7 @@
 
 WIN_CONDITIONS = ['xp', 'vista', 'win7', 'win8', 'win10']
 MAC_CONDITIONS = ['leopard', 'snowleopard', 'lion', 'mountainlion',
-                 'mavericks', 'yosemite']
+                  'mavericks', 'yosemite', 'sierra']
 
 OS_CONDITIONS = ['win', 'mac', 'linux', 'chromeos', 'android'] + \
                 WIN_CONDITIONS + MAC_CONDITIONS
@@ -74,7 +74,8 @@
 
     Operating systems:
       win, xp, vista, win7, mac, leopard, snowleopard, lion,
-      mountainlion, mavericks, yosemite, linux, chromeos, android
+      mountainlion, mavericks, yosemite, sierra, linux, chromeos,
+      android
 
     Browser types:
       android-webview-shell, android-content-shell, android-chromium,
@@ -83,6 +84,7 @@
     Sample usage in SetExpectations in subclasses:
       self.Fail('gl-enable-vertex-attrib.html',
          ['mac', 'release'], bug=123)
+
     """
     cl = condition.lower()
     if cl in OS_CONDITIONS:
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
index 5f7b4ddb..0b41550 100644
--- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -430,6 +430,32 @@
         ['mac', ('amd', 0x679e)], bug=483282)
 
     # Mac Intel
+
+    self.Fail(
+      'conformance2/textures/canvas/tex-2d-rgb9_e5-rgb-float.html',
+      ['sierra', 'intel'], bug=663188)
+    self.Fail(
+      'conformance2/textures/canvas/tex-2d-rgb9_e5-rgb-half_float.html',
+      ['sierra', 'intel'], bug=663188)
+    self.Fail(
+      'conformance2/textures/canvas/tex-3d-rgb9_e5-rgb-float.html',
+      ['sierra', 'intel'], bug=663188)
+    self.Fail(
+      'conformance2/textures/canvas/tex-3d-rgb9_e5-rgb-half_float.html',
+      ['sierra', 'intel'], bug=663188)
+    self.Fail(
+      'conformance2/textures/webgl_canvas/tex-2d-rgb9_e5-rgb-float.html',
+      ['sierra', 'intel'], bug=663188)
+    self.Fail(
+      'conformance2/textures/webgl_canvas/tex-2d-rgb9_e5-rgb-half_float.html',
+      ['sierra', 'intel'], bug=663188)
+    self.Fail(
+      'conformance2/textures/webgl_canvas/tex-3d-rgb9_e5-rgb-float.html',
+      ['sierra', 'intel'], bug=663188)
+    self.Fail(
+      'conformance2/textures/webgl_canvas/tex-3d-rgb9_e5-rgb-half_float.html',
+      ['sierra', 'intel'], bug=663188)
+
     self.Fail('deqp/functional/gles3/fbomultisample*',
         ['mac', 'intel'], bug=641209)
     self.Fail('deqp/functional/gles3/texturefiltering/2d_combinations_01.html',
diff --git a/media/capture/content/thread_safe_capture_oracle.cc b/media/capture/content/thread_safe_capture_oracle.cc
index 9fc8f93..ad869b7d 100644
--- a/media/capture/content/thread_safe_capture_oracle.cc
+++ b/media/capture/content/thread_safe_capture_oracle.cc
@@ -211,26 +211,33 @@
 
   base::AutoLock guard(lock_);
 
-  if (oracle_.CompleteCapture(frame_number, success, &reference_time)) {
-    TRACE_EVENT_INSTANT0("gpu.capture", "CaptureSucceeded",
-                         TRACE_EVENT_SCOPE_THREAD);
+  if (!oracle_.CompleteCapture(frame_number, success, &reference_time))
+    return;
 
-    if (!client_)
-      return;  // Capture is stopped.
+  TRACE_EVENT_INSTANT0("gpu.capture", "CaptureSucceeded",
+                       TRACE_EVENT_SCOPE_THREAD);
 
-    frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE,
-                                 params_.requested_format.frame_rate);
-    frame->metadata()->SetTimeTicks(VideoFrameMetadata::CAPTURE_BEGIN_TIME,
-                                    capture_begin_time);
-    frame->metadata()->SetTimeTicks(VideoFrameMetadata::CAPTURE_END_TIME,
-                                    base::TimeTicks::Now());
-    frame->metadata()->SetTimeDelta(VideoFrameMetadata::FRAME_DURATION,
-                                    estimated_frame_duration);
-    frame->metadata()->SetTimeTicks(VideoFrameMetadata::REFERENCE_TIME,
-                                    reference_time);
+  if (!client_)
+    return;  // Capture is stopped.
 
-    client_->OnIncomingCapturedVideoFrame(std::move(buffer), std::move(frame));
-  }
+  frame->metadata()->SetDouble(VideoFrameMetadata::FRAME_RATE,
+                               params_.requested_format.frame_rate);
+  frame->metadata()->SetTimeTicks(VideoFrameMetadata::CAPTURE_BEGIN_TIME,
+                                  capture_begin_time);
+  frame->metadata()->SetTimeTicks(VideoFrameMetadata::CAPTURE_END_TIME,
+                                  base::TimeTicks::Now());
+  frame->metadata()->SetTimeDelta(VideoFrameMetadata::FRAME_DURATION,
+                                  estimated_frame_duration);
+  frame->metadata()->SetTimeTicks(VideoFrameMetadata::REFERENCE_TIME,
+                                  reference_time);
+
+  DCHECK(frame->IsMappable());
+  media::VideoCaptureFormat format(frame->coded_size(),
+                                   params_.requested_format.frame_rate,
+                                   frame->format(), media::PIXEL_STORAGE_CPU);
+  client_->OnIncomingCapturedBufferExt(
+      std::move(buffer), format, reference_time, frame->timestamp(),
+      frame->visible_rect(), *frame->metadata());
 }
 
 void ThreadSafeCaptureOracle::OnConsumerReportingUtilization(
diff --git a/media/capture/video/fake_video_capture_device_unittest.cc b/media/capture/video/fake_video_capture_device_unittest.cc
index c9bbae9..21563c0 100644
--- a/media/capture/video/fake_video_capture_device_unittest.cc
+++ b/media/capture/video/fake_video_capture_device_unittest.cc
@@ -101,11 +101,13 @@
                                 base::TimeDelta timestamp) override {
     frame_cb_.Run(format);
   }
-  void OnIncomingCapturedVideoFrame(
+  void OnIncomingCapturedBufferExt(
       std::unique_ptr<Buffer> buffer,
-      scoped_refptr<media::VideoFrame> frame) override {
-    VideoCaptureFormat format(frame->natural_size(), 30.0,
-                              PIXEL_FORMAT_I420);
+      const VideoCaptureFormat& format,
+      base::TimeTicks reference_time,
+      base::TimeDelta timestamp,
+      gfx::Rect visible_rect,
+      const VideoFrameMetadata& additional_metadata) override {
     frame_cb_.Run(format);
   }
   std::unique_ptr<Buffer> ResurrectLastOutputBuffer(
diff --git a/media/capture/video/linux/camera_facing_chromeos.cc b/media/capture/video/linux/camera_facing_chromeos.cc
index c8aedbd..ad633d8 100644
--- a/media/capture/video/linux/camera_facing_chromeos.cc
+++ b/media/capture/video/linux/camera_facing_chromeos.cc
@@ -170,7 +170,10 @@
         DLOG(ERROR) << "model_id is empty";
         continue;
       }
-      model_id_to_camera_id_[value.as_string()] = camera_id;
+      std::string model_id = value.as_string();
+      std::transform(model_id.begin(), model_id.end(), model_id.begin(),
+                     ::tolower);
+      model_id_to_camera_id_[model_id] = camera_id;
     } else if (sub_keys.size() == 3 && sub_keys[2] == kUsbPath) {
       if (value.empty()) {
         DLOG(ERROR) << "usb_path is empty";
diff --git a/media/capture/video/linux/v4l2_capture_delegate_unittest.cc b/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
index ad67ae5..3febf4456 100644
--- a/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
+++ b/media/capture/video/linux/v4l2_capture_delegate_unittest.cc
@@ -170,9 +170,13 @@
     DoOnIncomingCapturedBuffer();
   }
   MOCK_METHOD0(DoOnIncomingCapturedBuffer, void(void));
-  void OnIncomingCapturedVideoFrame(
+  void OnIncomingCapturedBufferExt(
       std::unique_ptr<Buffer> buffer,
-      scoped_refptr<media::VideoFrame> frame) override {
+      const VideoCaptureFormat& format,
+      base::TimeTicks reference_time,
+      base::TimeDelta timestamp,
+      gfx::Rect visible_rect,
+      const VideoFrameMetadata& additional_metadata) override {
     DoOnIncomingCapturedVideoFrame();
   }
   MOCK_METHOD0(DoOnIncomingCapturedVideoFrame, void(void));
diff --git a/media/capture/video/video_capture_device.h b/media/capture/video/video_capture_device.h
index 81a273f..120c183 100644
--- a/media/capture/video/video_capture_device.h
+++ b/media/capture/video/video_capture_device.h
@@ -146,28 +146,30 @@
         VideoPixelStorage storage,
         int frame_feedback_id) = 0;
 
-    // Captured new video data, held in |frame| or |buffer|, respectively for
-    // OnIncomingCapturedVideoFrame() and  OnIncomingCapturedBuffer().
-    //
-    // In both cases, as the frame is backed by a reservation returned by
-    // ReserveOutputBuffer(), delivery is guaranteed and will require no
-    // additional copies in the browser process.
+    // Provides VCD::Client with a populated Buffer containing the content of
+    // the next video frame. The |buffer| must originate from an earlier call to
+    // ReserveOutputBuffer().
     // See OnIncomingCapturedData for details of |reference_time| and
     // |timestamp|.
-    // TODO(chfremer): Consider removing one of the two in order to simplify the
-    // interface.
     virtual void OnIncomingCapturedBuffer(std::unique_ptr<Buffer> buffer,
                                           const VideoCaptureFormat& format,
                                           base::TimeTicks reference_time,
                                           base::TimeDelta timestamp) = 0;
-    virtual void OnIncomingCapturedVideoFrame(
+
+    // Extended version of OnIncomingCapturedBuffer() allowing clients to
+    // pass a custom |visible_rect| and |additional_metadata|.
+    virtual void OnIncomingCapturedBufferExt(
         std::unique_ptr<Buffer> buffer,
-        scoped_refptr<VideoFrame> frame) = 0;
+        const VideoCaptureFormat& format,
+        base::TimeTicks reference_time,
+        base::TimeDelta timestamp,
+        gfx::Rect visible_rect,
+        const VideoFrameMetadata& additional_metadata) = 0;
 
     // Attempts to reserve the same Buffer provided in the last call to one of
-    // the OnIncomingCapturedXXX() methods. This will fail if the content of the
-    // Buffer has not been preserved, or if the |dimensions|, |format|, or
-    // |storage| disagree with how it was reserved via ReserveOutputBuffer().
+    // the OnIncomingCapturedBufferXXX() methods. This will fail if the content
+    // of the Buffer has not been preserved, or if the |dimensions|, |format|,
+    // or |storage| disagree with how it was reserved via ReserveOutputBuffer().
     // When this operation fails, nullptr will be returned.
     virtual std::unique_ptr<Buffer> ResurrectLastOutputBuffer(
         const gfx::Size& dimensions,
diff --git a/media/capture/video/video_capture_device_client.cc b/media/capture/video/video_capture_device_client.cc
index 3321633..857e714e 100644
--- a/media/capture/video/video_capture_device_client.cc
+++ b/media/capture/video/video_capture_device_client.cc
@@ -21,6 +21,7 @@
 #include "media/capture/video/video_capture_jpeg_decoder.h"
 #include "media/capture/video/video_frame_receiver.h"
 #include "media/capture/video_capture_types.h"
+#include "mojo/public/cpp/system/platform_handle.h"
 #include "third_party/libyuv/include/libyuv.h"
 
 using media::VideoCaptureFormat;
@@ -295,32 +296,35 @@
     const VideoCaptureFormat& format,
     base::TimeTicks reference_time,
     base::TimeDelta timestamp) {
-  DCHECK(IsFormatSupported(format.pixel_format));
-  DCHECK_EQ(media::PIXEL_STORAGE_CPU, format.pixel_storage);
+  OnIncomingCapturedBufferExt(std::move(buffer), format, reference_time,
+                              timestamp, gfx::Rect(format.frame_size),
+                              VideoFrameMetadata());
+}
 
-  scoped_refptr<VideoFrame> frame;
-  if (buffer->IsBackedByVideoFrame()) {
-    frame = buffer->GetVideoFrame();
-    frame->set_timestamp(timestamp);
-  } else {
-    frame = VideoFrame::WrapExternalSharedMemory(
-        format.pixel_format, format.frame_size, gfx::Rect(format.frame_size),
-        format.frame_size, reinterpret_cast<uint8_t*>(buffer->data()),
-        VideoFrame::AllocationSize(format.pixel_format, format.frame_size),
-        base::SharedMemory::NULLHandle(), 0u, timestamp);
-  }
-  if (!frame)
-    return;
+void VideoCaptureDeviceClient::OnIncomingCapturedBufferExt(
+    std::unique_ptr<Buffer> buffer,
+    const VideoCaptureFormat& format,
+    base::TimeTicks reference_time,
+    base::TimeDelta timestamp,
+    gfx::Rect visible_rect,
+    const VideoFrameMetadata& additional_metadata) {
+  scoped_refptr<media::VideoFrame> frame =
+      media::VideoFrame::WrapExternalSharedMemory(
+          format.pixel_format,                    // format
+          format.frame_size,                      // coded_size
+          visible_rect,                           // visible_rect
+          format.frame_size,                      // natural_size
+          static_cast<uint8_t*>(buffer->data()),  // data
+          buffer->mapped_size(),                  // data_size
+          base::SharedMemory::NULLHandle(),       // handle
+          0u,                                     // shared_memory_offset
+          timestamp);                             // timestamp
+  frame->metadata()->MergeMetadataFrom(&additional_metadata);
   frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE,
                                format.frame_rate);
   frame->metadata()->SetTimeTicks(media::VideoFrameMetadata::REFERENCE_TIME,
                                   reference_time);
-  OnIncomingCapturedVideoFrame(std::move(buffer), std::move(frame));
-}
 
-void VideoCaptureDeviceClient::OnIncomingCapturedVideoFrame(
-    std::unique_ptr<Buffer> buffer,
-    scoped_refptr<VideoFrame> frame) {
   receiver_->OnIncomingCapturedVideoFrame(std::move(buffer), std::move(frame));
 }
 
diff --git a/media/capture/video/video_capture_device_client.h b/media/capture/video/video_capture_device_client.h
index 0c85539..adac1bc1 100644
--- a/media/capture/video/video_capture_device_client.h
+++ b/media/capture/video/video_capture_device_client.h
@@ -65,9 +65,13 @@
                                 const VideoCaptureFormat& format,
                                 base::TimeTicks reference_time,
                                 base::TimeDelta timestamp) override;
-  void OnIncomingCapturedVideoFrame(
+  void OnIncomingCapturedBufferExt(
       std::unique_ptr<Buffer> buffer,
-      scoped_refptr<media::VideoFrame> frame) override;
+      const VideoCaptureFormat& format,
+      base::TimeTicks reference_time,
+      base::TimeDelta timestamp,
+      gfx::Rect visible_rect,
+      const VideoFrameMetadata& additional_metadata) override;
   std::unique_ptr<Buffer> ResurrectLastOutputBuffer(
       const gfx::Size& dimensions,
       media::VideoPixelFormat format,
diff --git a/media/capture/video/video_capture_device_unittest.cc b/media/capture/video/video_capture_device_unittest.cc
index b3289d2..ca6a4a1 100644
--- a/media/capture/video/video_capture_device_unittest.cc
+++ b/media/capture/video/video_capture_device_unittest.cc
@@ -135,8 +135,13 @@
                                 base::TimeDelta timestamp) override {
     DoOnIncomingCapturedBuffer();
   }
-  void OnIncomingCapturedVideoFrame(std::unique_ptr<Buffer> buffer,
-                                    scoped_refptr<VideoFrame> frame) override {
+  void OnIncomingCapturedBufferExt(
+      std::unique_ptr<Buffer> buffer,
+      const VideoCaptureFormat& format,
+      base::TimeTicks reference_time,
+      base::TimeDelta timestamp,
+      gfx::Rect visible_rect,
+      const VideoFrameMetadata& additional_metadata) override {
     DoOnIncomingCapturedVideoFrame();
   }
   std::unique_ptr<Buffer> ResurrectLastOutputBuffer(
diff --git a/services/video_capture/test/fake_device_descriptor_unittest.cc b/services/video_capture/test/fake_device_descriptor_unittest.cc
index c69e0a8..e0120fe 100644
--- a/services/video_capture/test/fake_device_descriptor_unittest.cc
+++ b/services/video_capture/test/fake_device_descriptor_unittest.cc
@@ -19,7 +19,7 @@
 // Tests that when requesting a second proxy for a device without closing the
 // first one, the service revokes access to the first one by closing the
 // connection.
-TEST_F(FakeDeviceDescriptorTest, AccessIsRevokedOnSecondAccess) {
+TEST_F(FakeDeviceDescriptorTest, DISABLED_AccessIsRevokedOnSecondAccess) {
   mojom::DevicePtr device_proxy_1;
   bool device_access_1_revoked = false;
   MockCreateDeviceProxyCallback create_device_proxy_callback_1;
@@ -55,7 +55,7 @@
 }
 
 // Tests that a second proxy requested for a device can be used successfully.
-TEST_F(FakeDeviceDescriptorTest, CanUseSecondRequestedProxy) {
+TEST_F(FakeDeviceDescriptorTest, DISABLED_CanUseSecondRequestedProxy) {
   mojom::DevicePtr device_proxy_1;
   factory_->CreateDevice(
       fake_device_descriptor_.device_id, mojo::MakeRequest(&device_proxy_1),
diff --git a/services/video_capture/test/fake_device_unittest.cc b/services/video_capture/test/fake_device_unittest.cc
index 7af7a1af6..edfcc97 100644
--- a/services/video_capture/test/fake_device_unittest.cc
+++ b/services/video_capture/test/fake_device_unittest.cc
@@ -30,7 +30,7 @@
 
 namespace video_capture {
 
-TEST_F(FakeDeviceTest, FrameCallbacksArrive) {
+TEST_F(FakeDeviceTest, DISABLED_FrameCallbacksArrive) {
   base::RunLoop wait_loop;
   const int kNumFramesToWaitFor = 3;
   int num_frames_arrived = 0;
@@ -51,7 +51,7 @@
 
 // Tests that frames received from a fake capture device match the requested
 // format and have increasing timestamps.
-TEST_F(FakeDeviceTest, ReceiveFramesFromFakeCaptureDevice) {
+TEST_F(FakeDeviceTest, DISABLED_ReceiveFramesFromFakeCaptureDevice) {
   base::RunLoop wait_loop;
   mojom::ReceiverPtr receiver_proxy;
   constexpr int num_frames_to_receive = 2;
diff --git a/services/video_capture/test/mock_device_unittest.cc b/services/video_capture/test/mock_device_unittest.cc
index f3035fe..40f36b4 100644
--- a/services/video_capture/test/mock_device_unittest.cc
+++ b/services/video_capture/test/mock_device_unittest.cc
@@ -12,7 +12,7 @@
 
 // Tests that the service stops the capture device when the client closes the
 // connection to the device proxy.
-TEST_F(MockDeviceTest, DeviceIsStoppedWhenDiscardingDeviceProxy) {
+TEST_F(MockDeviceTest, DISABLED_DeviceIsStoppedWhenDiscardingDeviceProxy) {
   base::RunLoop wait_loop;
 
   // The mock device must hold on to the device client that is passed to it.
@@ -34,7 +34,7 @@
 
 // Tests that the service stops the capture device when the client closes the
 // connection to the client proxy it provided to the service.
-TEST_F(MockDeviceTest, DeviceIsStoppedWhenDiscardingDeviceClient) {
+TEST_F(MockDeviceTest, DISABLED_DeviceIsStoppedWhenDiscardingDeviceClient) {
   base::RunLoop wait_loop;
 
   // The mock device must hold on to the device client that is passed to it.
diff --git a/services/video_capture/test/service_unittest.cc b/services/video_capture/test/service_unittest.cc
index 7f382157..0966f45c 100644
--- a/services/video_capture/test/service_unittest.cc
+++ b/services/video_capture/test/service_unittest.cc
@@ -21,7 +21,7 @@
 
 // Tests that an answer arrives from the service when calling
 // EnumerateDeviceDescriptors().
-TEST_F(ServiceTest, EnumerateDeviceDescriptorsCallbackArrives) {
+TEST_F(ServiceTest, DISABLED_EnumerateDeviceDescriptorsCallbackArrives) {
   base::RunLoop wait_loop;
   EXPECT_CALL(descriptor_receiver_, OnEnumerateDeviceDescriptorsCallback(_))
       .Times(Exactly(1))
@@ -33,7 +33,7 @@
   wait_loop.Run();
 }
 
-TEST_F(ServiceTest, FakeDeviceFactoryEnumeratesOneDevice) {
+TEST_F(ServiceTest, DISABLED_FakeDeviceFactoryEnumeratesOneDevice) {
   base::RunLoop wait_loop;
   size_t num_devices_enumerated = 0;
   EXPECT_CALL(descriptor_receiver_, OnEnumerateDeviceDescriptorsCallback(_))
@@ -53,7 +53,7 @@
 
 // Tests that VideoCaptureDeviceFactory::CreateDeviceProxy() returns an error
 // code when trying to create a device for an invalid descriptor.
-TEST_F(ServiceTest, ErrorCodeOnCreateDeviceForInvalidDescriptor) {
+TEST_F(ServiceTest, DISABLED_ErrorCodeOnCreateDeviceForInvalidDescriptor) {
   const std::string invalid_device_id = "invalid";
   base::RunLoop wait_loop;
   mojom::DevicePtr fake_device_proxy;
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 59411c9..ab677514 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -6370,7 +6370,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -6387,7 +6387,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -6403,7 +6403,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -6419,7 +6419,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -6435,7 +6435,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -6451,7 +6451,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -6478,7 +6478,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -6501,7 +6501,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -6524,7 +6524,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -6547,7 +6547,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -6576,7 +6576,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -6613,7 +6613,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -6636,7 +6636,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -6659,7 +6659,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -6682,7 +6682,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7071,7 +7071,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -7088,7 +7088,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -7104,7 +7104,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -7120,7 +7120,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -7136,7 +7136,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -7152,7 +7152,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -7168,7 +7168,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -7195,7 +7195,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7218,7 +7218,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7241,7 +7241,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7264,7 +7264,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7293,7 +7293,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7330,7 +7330,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7353,7 +7353,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7376,7 +7376,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -7401,7 +7401,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ],
           "shards": 15
@@ -7425,7 +7425,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -8566,7 +8566,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8588,7 +8588,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8609,7 +8609,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8630,7 +8630,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8651,7 +8651,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8672,7 +8672,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8693,7 +8693,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8725,7 +8725,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8753,7 +8753,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8781,7 +8781,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8809,7 +8809,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8843,7 +8843,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8885,7 +8885,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8913,7 +8913,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8941,7 +8941,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -8971,7 +8971,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -9000,7 +9000,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             },
             {
               "gpu": "1002:6821",
@@ -9883,7 +9883,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -9899,7 +9899,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -9928,7 +9928,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ],
           "shards": 15
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json
index ba07558..9b29f1d 100644
--- a/testing/buildbot/chromium.gpu.json
+++ b/testing/buildbot/chromium.gpu.json
@@ -599,7 +599,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -615,7 +615,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -631,7 +631,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -658,7 +658,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -681,7 +681,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -704,7 +704,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -727,7 +727,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -756,7 +756,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -793,7 +793,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -816,7 +816,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -839,7 +839,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -862,7 +862,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -881,7 +881,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -897,7 +897,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -913,7 +913,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -929,7 +929,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         },
@@ -956,7 +956,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -979,7 +979,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -1002,7 +1002,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -1025,7 +1025,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -1054,7 +1054,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -1091,7 +1091,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -1114,7 +1114,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -1137,7 +1137,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
@@ -1160,7 +1160,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.10"
+              "os": "Mac-10.12"
             }
           ]
         }
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index 73274e7..9296666 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -746,63 +746,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -1031,63 +974,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device4",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -11770,63 +11656,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build144-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build144-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -12055,63 +11884,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build146-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build146-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -22870,63 +22642,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build208-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build208-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -23155,63 +22870,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build210-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build210-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index 143ec0c..af896f0 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -852,63 +852,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build148-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build148-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -1137,63 +1080,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build150-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build150-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -11914,63 +11800,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build102-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build102-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -12199,63 +12028,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build104-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build104-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -22919,63 +22691,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build158-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build158-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -23204,63 +22919,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build160-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build160-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -33924,63 +33582,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build123-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build123-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -34209,63 +33810,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build125-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build125-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -44929,63 +44473,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build128-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build128-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -45214,63 +44701,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build130-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build130-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -55934,63 +55364,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build4-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build4-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -56219,63 +55592,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build6-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build6-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -66939,63 +66255,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build117-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build117-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -67224,63 +66483,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build119-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build119-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -77944,63 +77146,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build132-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build132-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -78229,63 +77374,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build134-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build134-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -88968,63 +88056,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6779",
-              "id": "build101-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6779",
-              "id": "build101-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -89253,63 +88284,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6779",
-              "id": "build103-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6779",
-              "id": "build103-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -100011,63 +98985,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build164-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build164-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -100296,63 +99213,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build166-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build166-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -111035,63 +109895,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build92-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build92-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -111320,63 +110123,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build94-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build94-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -122078,63 +120824,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build185-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build185-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -122363,63 +121052,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build187-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build187-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -133121,63 +131753,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build138-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build138-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -133406,63 +131981,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build140-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build140-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -144164,63 +142682,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build143-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build143-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -144449,63 +142910,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build145-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build145-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
@@ -155207,63 +153611,6 @@
       },
       {
         "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:161e",
-              "id": "build30-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.paint_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.paint_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:161e",
-              "id": "build30-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.parser",
           "-v",
           "--upload-results",
@@ -155492,63 +153839,6 @@
       },
       {
         "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:161e",
-              "id": "build32-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "blink_perf.svg_slimmingpaintinvalidation",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "blink_perf.svg_slimmingpaintinvalidation.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:161e",
-              "id": "build32-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 7200,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "blink_perf.xml_http_request",
           "-v",
           "--upload-results",
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 157d19d..07045a5 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -717,7 +717,6 @@
 crbug.com/248938 virtual/threaded/transitions/change-duration-during-transition.html [ Pass Failure ]
 crbug.com/638693 virtual/threaded/animations/display-inline-style-adjust.html [ Pass Crash Failure ]
 crbug.com/421283 fast/html/marquee-scrollamount.html [ Pass Failure ]
-crbug.com/248938 virtual/threaded/transitions/transition-end-event-rendering.html [ Pass Timeout ]
 crbug.com/248938 [ Mac ] virtual/threaded/transitions/interrupted-all-transition.html [ Pass Failure ]
 
 crbug.com/659123 [ Mac ] fast/css/text-overflow-ellipsis-button.html [ Pass Failure ]
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/5075944.html b/third_party/WebKit/LayoutTests/editing/pasteboard/5075944.html
deleted file mode 100644
index e99406b..0000000
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/5075944.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<p>This test for a bug copy/pasting underlined text.</p>
-<div id="copy" contenteditable="true">This should be underlined.</div>
-<div id="paste" contenteditable="true"><br></div>
-
-<script>
-var copy = document.getElementById("copy");
-copy.focus();
-document.execCommand("SelectAll");
-document.execCommand("Underline");
-document.execCommand("Copy");
-var paste = document.getElementById("paste");
-paste.focus();
-document.execCommand("Paste");
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/copy-paste-underlined.html b/third_party/WebKit/LayoutTests/editing/pasteboard/copy-paste-underlined.html
new file mode 100644
index 0000000..38aea5bc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/pasteboard/copy-paste-underlined.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
+<script>
+test(() => {
+  assert_not_equals(
+      window.testRunner, undefined,
+     'This test requires testRunner.');
+
+  assert_selection(
+      [
+        '<div contenteditable>^foo bar baz.|</div>',
+        '<div contenteditable id="paste"><br></div>'
+      ].join(''),
+      selection => {
+        const document = selection.document;
+        document.execCommand('underline');
+        document.execCommand('copy');
+        document.getElementById('paste').focus();
+        document.execCommand('paste');
+      },
+      [
+        '<div contenteditable><u>foo bar baz.</u></div>',
+        '<div contenteditable id="paste"><u>foo bar baz.|</u></div>'
+      ].join(''));
+  }, 'Copy/paste underlined text.');
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/css/invalidation/independent-inheritance-fast-path.html b/third_party/WebKit/LayoutTests/fast/css/invalidation/independent-inheritance-fast-path.html
index e08827a1..0658d836b 100644
--- a/third_party/WebKit/LayoutTests/fast/css/invalidation/independent-inheritance-fast-path.html
+++ b/third_party/WebKit/LayoutTests/fast/css/invalidation/independent-inheritance-fast-path.html
@@ -23,6 +23,7 @@
     ["webkitPrintColorAdjust", "economy", "exact"],
     ["textAlign", "start", "left"],
     ["textTransform", "capitalize", "uppercase"],
+    ["webkitRtlOrdering", "logical", "visual"],
 ];
 
 independent_properties.forEach(function(test_data)
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
index 24b4c0f1..0daa4a8 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE WARNING: line 101: 'Performance.onwebkitresourcetimingbufferfull' is deprecated. Please use 'Performance.onresourcetimingbufferfull' instead.
 CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is navigated. Test should not crash and properties should be set to sane defaults.
 
@@ -58,7 +57,6 @@
 PASS window.cached_navigator_usb.ondisconnect is null
 PASS window.cached_performance.onframetimingbufferfull is null
 PASS window.cached_performance.onresourcetimingbufferfull is null
-PASS window.cached_performance.onwebkitresourcetimingbufferfull is null
 PASS window.cached_performance_navigation.redirectCount is 0
 PASS window.cached_performance_navigation.type is 0
 PASS window.cached_performance_timing.connectEnd is 0
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
index 71e7d2d..03fb6d55 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE WARNING: line 101: 'Performance.onwebkitresourcetimingbufferfull' is deprecated. Please use 'Performance.onresourcetimingbufferfull' instead.
 CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
@@ -58,7 +57,6 @@
 PASS window.cached_navigator_usb.ondisconnect is null
 PASS window.cached_performance.onframetimingbufferfull is null
 PASS window.cached_performance.onresourcetimingbufferfull is null
-PASS window.cached_performance.onwebkitresourcetimingbufferfull is null
 PASS window.cached_performance_navigation.redirectCount is 0
 PASS window.cached_performance_navigation.type is 0
 PASS window.cached_performance_timing.connectEnd is 0
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
index 394af88..d7a8ab8 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE WARNING: line 101: 'Performance.onwebkitresourcetimingbufferfull' is deprecated. Please use 'Performance.onresourcetimingbufferfull' instead.
 CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
@@ -58,7 +57,6 @@
 PASS window.cached_navigator_usb.ondisconnect is null
 PASS window.cached_performance.onframetimingbufferfull is null
 PASS window.cached_performance.onresourcetimingbufferfull is null
-PASS window.cached_performance.onwebkitresourcetimingbufferfull is null
 PASS window.cached_performance_navigation.redirectCount is 0
 PASS window.cached_performance_navigation.type is 0
 PASS window.cached_performance_timing.connectEnd is 0
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index 9fe7b53..da7a2c82 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE WARNING: line 101: 'Performance.onwebkitresourcetimingbufferfull' is deprecated. Please use 'Performance.onresourcetimingbufferfull' instead.
 CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests property access on a cached DOMWindow after the associated frame is navigated. Test should not crash and properties read from the cached DOMWindow should be identical to properties through the 'current' DOMWindow.
 
@@ -175,7 +174,6 @@
 PASS oldChildWindow.performance.navigation.type is newChildWindow.performance.navigation.type
 PASS oldChildWindow.performance.onframetimingbufferfull is newChildWindow.performance.onframetimingbufferfull
 PASS oldChildWindow.performance.onresourcetimingbufferfull is newChildWindow.performance.onresourcetimingbufferfull
-PASS oldChildWindow.performance.onwebkitresourcetimingbufferfull is newChildWindow.performance.onwebkitresourcetimingbufferfull
 PASS oldChildWindow.performance.timing.connectEnd is newChildWindow.performance.timing.connectEnd
 PASS oldChildWindow.performance.timing.connectStart is newChildWindow.performance.timing.connectStart
 PASS oldChildWindow.performance.timing.domComplete is newChildWindow.performance.timing.domComplete
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
index 78afec1..cdb184ea 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE WARNING: line 101: 'Performance.onwebkitresourcetimingbufferfull' is deprecated. Please use 'Performance.onresourcetimingbufferfull' instead.
 CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests property access on a cached DOMWindow after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
@@ -147,7 +146,6 @@
 PASS childWindow.performance.navigation.type is 0
 PASS childWindow.performance.onframetimingbufferfull is null
 PASS childWindow.performance.onresourcetimingbufferfull is null
-PASS childWindow.performance.onwebkitresourcetimingbufferfull is null
 PASS childWindow.performance.timing.connectEnd is 0
 PASS childWindow.performance.timing.connectStart is 0
 PASS childWindow.performance.timing.domComplete is 0
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
index 5ff7524..18f6536 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE WARNING: line 101: 'Performance.onwebkitresourcetimingbufferfull' is deprecated. Please use 'Performance.onresourcetimingbufferfull' instead.
 CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests property access on a cached DOMWindow after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
@@ -147,7 +146,6 @@
 PASS childWindow.performance.navigation.type is 0
 PASS childWindow.performance.onframetimingbufferfull is null
 PASS childWindow.performance.onresourcetimingbufferfull is null
-PASS childWindow.performance.onwebkitresourcetimingbufferfull is null
 PASS childWindow.performance.timing.connectEnd is 0
 PASS childWindow.performance.timing.connectStart is 0
 PASS childWindow.performance.timing.domComplete is 0
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/window-properties-performance-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/window-properties-performance-expected.txt
index db07e65..2374d1d4 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/window-properties-performance-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/window-properties-performance-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE WARNING: line 1: 'Performance.onwebkitresourcetimingbufferfull' is deprecated. Please use 'Performance.onresourcetimingbufferfull' instead.
 This test dumps all of the properties that are reachable from the window.performance object, along with their types.
 
 window.performance [object Performance]
@@ -28,7 +27,6 @@
 window.performance.now [function]
 window.performance.onframetimingbufferfull [null]
 window.performance.onresourcetimingbufferfull [null]
-window.performance.onwebkitresourcetimingbufferfull [null]
 window.performance.removeEventListener [function]
 window.performance.setFrameTimingBufferSize [function]
 window.performance.setResourceTimingBufferSize [function]
@@ -56,8 +54,6 @@
 window.performance.timing.unloadEventEnd [number]
 window.performance.timing.unloadEventStart [number]
 window.performance.toJSON [function]
-window.performance.webkitClearResourceTimings [function]
-window.performance.webkitSetResourceTimingBufferSize [function]
 window.performance.timing [printed above as window.performance.timing]
 jsonizedTiming [object Object]
 jsonizedTiming.connectEnd [number]
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/subresourceIntegrity/resources/subresource-integrity-fetch-worker.js b/third_party/WebKit/LayoutTests/http/tests/security/subresourceIntegrity/resources/subresource-integrity-fetch-worker.js
new file mode 100644
index 0000000..64183f5b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/subresourceIntegrity/resources/subresource-integrity-fetch-worker.js
@@ -0,0 +1,28 @@
+importScripts('/resources/testharness.js');
+console.log('hehehe');
+const url = '../call-success.js';
+const integrity = 'sha256-B0/62fJSJFrdjEFR9ba04m/D+LHQ+zG6PGcaR0Trpxg=';
+
+promise_test(() => {
+    return fetch(url).then(res => res.text()).then(text => {
+        assert_equals(text, 'success();\n');
+    });
+}, 'No integrity');
+
+promise_test(() => {
+    return fetch(url, {integrity: integrity}).then(res => {
+        return res.text();
+    }).then(text => {
+        assert_equals(text, 'success();\n');
+    });
+}, 'Good integrity');
+
+promise_test(() => {
+    return fetch(url, {integrity: 'sha256-deadbeaf'}).then(res => {
+        assert_unreached('the integrity check should fail');
+    }, () => {
+        // The integrity check should fail.
+    });
+}, 'Bad integrity');
+
+done();
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/subresourceIntegrity/subresource-integrity-fetch-worker.html b/third_party/WebKit/LayoutTests/http/tests/security/subresourceIntegrity/subresource-integrity-fetch-worker.html
new file mode 100644
index 0000000..509daab
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/security/subresourceIntegrity/subresource-integrity-fetch-worker.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Tests integrity enforcement on fetch() on Web Worker</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+const SCRIPT = 'resources/subresource-integrity-fetch-worker.js';
+fetch_tests_from_worker(new Worker(SCRIPT));
+console.log('hello');
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/5075944-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/5075944-expected.png
deleted file mode 100644
index 41cefe9..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/5075944-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/5075944-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/5075944-expected.txt
deleted file mode 100644
index 99a7094c..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/5075944-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x20
-        LayoutText {#text} at (0,0) size 284x19
-          text run at (0,0) width 284: "This test for a bug copy/pasting underlined text."
-      LayoutBlockFlow {DIV} at (0,36) size 784x20
-        LayoutInline {U} at (0,0) size 157x19
-          LayoutText {#text} at (0,0) size 157x19
-            text run at (0,0) width 157: "This should be underlined."
-      LayoutBlockFlow {DIV} at (0,56) size 784x20
-        LayoutInline {U} at (0,0) size 157x19
-          LayoutText {#text} at (0,0) size 157x19
-            text run at (0,0) width 157: "This should be underlined."
-caret: position 26 of child 0 {#text} of child 0 {U} of child 4 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/stable/webexposed/global-interface-listing-expected.txt
index 79f98cf4..ff2e741 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -3677,7 +3677,6 @@
     getter memory
     getter navigation
     getter onresourcetimingbufferfull
-    getter onwebkitresourcetimingbufferfull
     getter timing
     method clearMarks
     method clearMeasures
@@ -3691,10 +3690,7 @@
     method now
     method setResourceTimingBufferSize
     method toJSON
-    method webkitClearResourceTimings
-    method webkitSetResourceTimingBufferSize
     setter onresourcetimingbufferfull
-    setter onwebkitresourcetimingbufferfull
 interface PerformanceEntry
     attribute @@toStringTag
     getter duration
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/5075944-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/5075944-expected.png
deleted file mode 100644
index df34d4d..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/5075944-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/5075944-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/5075944-expected.txt
deleted file mode 100644
index 724d8ecb..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/5075944-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x18
-        LayoutText {#text} at (0,0) size 307x18
-          text run at (0,0) width 307: "This test for a bug copy/pasting underlined text."
-      LayoutBlockFlow {DIV} at (0,34) size 784x18
-        LayoutInline {U} at (0,0) size 171x18
-          LayoutText {#text} at (0,0) size 171x18
-            text run at (0,0) width 171: "This should be underlined."
-      LayoutBlockFlow {DIV} at (0,52) size 784x18
-        LayoutInline {U} at (0,0) size 171x18
-          LayoutText {#text} at (0,0) size 171x18
-            text run at (0,0) width 171: "This should be underlined."
-caret: position 26 of child 0 {#text} of child 0 {U} of child 4 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/5075944-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/5075944-expected.png
deleted file mode 100644
index 4c3162cd..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/5075944-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/5075944-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/5075944-expected.txt
deleted file mode 100644
index 688749b..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/5075944-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x18
-        LayoutText {#text} at (0,0) size 307x17
-          text run at (0,0) width 307: "This test for a bug copy/pasting underlined text."
-      LayoutBlockFlow {DIV} at (0,34) size 784x18
-        LayoutInline {U} at (0,0) size 171x17
-          LayoutText {#text} at (0,0) size 171x17
-            text run at (0,0) width 171: "This should be underlined."
-      LayoutBlockFlow {DIV} at (0,52) size 784x18
-        LayoutInline {U} at (0,0) size 171x17
-          LayoutText {#text} at (0,0) size 171x17
-            text run at (0,0) width 171: "This should be underlined."
-caret: position 26 of child 0 {#text} of child 0 {U} of child 4 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/input-appearance-color-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/input-appearance-color-expected.png
index a52e9b9..e6a56e5 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/input-appearance-color-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/color/input-appearance-color-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select/menulist-appearance-basic-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select/menulist-appearance-basic-expected.png
index 3521f00..28bac72 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select/menulist-appearance-basic-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select/menulist-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select/menulist-appearance-basic-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select/menulist-appearance-basic-expected.txt
index 75c150b1..747b6455 100644
--- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/select/menulist-appearance-basic-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/select/menulist-appearance-basic-expected.txt
@@ -3,116 +3,116 @@
 layer at (0,0) size 800x523
   LayoutBlockFlow {HTML} at (0,0) size 800x523
     LayoutBlockFlow {BODY} at (8,8) size 784x507
-      LayoutMenuList {SELECT} at (4,4) size 39x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 37x18
+      LayoutMenuList {SELECT} at (4,4) size 41x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (47,5) size 4x17
-        text run at (47,5) width 4: " "
-      LayoutBR {BR} at (51,5) size 0x17
-      LayoutMenuList {SELECT} at (4,32) size 39x28 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,9) size 37x18
+      LayoutText {#text} at (49,5) size 4x17
+        text run at (49,5) width 4: " "
+      LayoutBR {BR} at (53,5) size 0x17
+      LayoutMenuList {SELECT} at (4,32) size 41x28 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,9) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (47,41) size 4x17
-        text run at (47,41) width 4: " "
-      LayoutMenuList {SELECT} at (55,40) size 45x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 37x18
+      LayoutText {#text} at (49,41) size 4x17
+        text run at (49,41) width 4: " "
+      LayoutMenuList {SELECT} at (57,40) size 47x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (104,41) size 4x17
-        text run at (104,41) width 4: " "
-      LayoutMenuList {SELECT} at (112,40) size 39x28 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 37x18
+      LayoutText {#text} at (108,41) size 4x17
+        text run at (108,41) width 4: " "
+      LayoutMenuList {SELECT} at (116,40) size 41x28 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (155,41) size 4x17
-        text run at (155,41) width 4: " "
-      LayoutMenuList {SELECT} at (163,40) size 45x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (7,1) size 37x18
+      LayoutText {#text} at (161,41) size 4x17
+        text run at (161,41) width 4: " "
+      LayoutMenuList {SELECT} at (169,40) size 47x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (7,1) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (212,41) size 4x17
-        text run at (212,41) width 4: " "
-      LayoutBR {BR} at (216,41) size 0x17
-      LayoutMenuList {SELECT} at (4,76) size 43x24 [bgcolor=#FFFFFF] [border: (3px solid #00FF00)]
-        LayoutBlockFlow (anonymous) at (3,3) size 37x18
+      LayoutText {#text} at (220,41) size 4x17
+        text run at (220,41) width 4: " "
+      LayoutBR {BR} at (224,41) size 0x17
+      LayoutMenuList {SELECT} at (4,76) size 45x24 [bgcolor=#FFFFFF] [border: (3px solid #00FF00)]
+        LayoutBlockFlow (anonymous) at (3,3) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (51,79) size 4x17
-        text run at (51,79) width 4: " "
-      LayoutMenuList {SELECT} at (59,78) size 39x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 37x18
+      LayoutText {#text} at (53,79) size 4x17
+        text run at (53,79) width 4: " "
+      LayoutMenuList {SELECT} at (61,78) size 41x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (102,79) size 4x17
-        text run at (102,79) width 4: " "
-      LayoutBR {BR} at (106,79) size 0x17
-      LayoutMenuList {SELECT} at (4,115) size 39x20 [color=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 37x18
+      LayoutText {#text} at (106,79) size 4x17
+        text run at (106,79) width 4: " "
+      LayoutBR {BR} at (110,79) size 0x17
+      LayoutMenuList {SELECT} at (4,115) size 41x20 [color=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (47,116) size 4x17
-        text run at (47,116) width 4: " "
-      LayoutBlockFlow {DIV} at (51,104) size 62x42 [bgcolor=#DBB102]
-        LayoutMenuList {SELECT} at (12,12) size 38x18
-          LayoutBlockFlow (anonymous) at (0,0) size 38x18
+      LayoutText {#text} at (49,116) size 4x17
+        text run at (49,116) width 4: " "
+      LayoutBlockFlow {DIV} at (53,104) size 64x42 [bgcolor=#DBB102]
+        LayoutMenuList {SELECT} at (12,12) size 40x18
+          LayoutBlockFlow (anonymous) at (0,0) size 40x18
             LayoutText (anonymous) at (4,1) size 18x16
               text run at (4,1) width 18: "bar"
-      LayoutText {#text} at (113,116) size 4x17
-        text run at (113,116) width 4: " "
-      LayoutBR {BR} at (117,116) size 0x17
-      LayoutMenuList {SELECT} at (4,150) size 39x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 37x18
+      LayoutText {#text} at (117,116) size 4x17
+        text run at (117,116) width 4: " "
+      LayoutBR {BR} at (121,116) size 0x17
+      LayoutMenuList {SELECT} at (4,150) size 41x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 39x18
           LayoutText (anonymous) at (4,1) size 17x16
             text run at (4,1) width 17: "foo"
-      LayoutText {#text} at (47,151) size 4x17
-        text run at (47,151) width 4: " "
-      LayoutBR {BR} at (51,151) size 0x17
-      LayoutMenuList {SELECT} at (4,186) size 45x21 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 43x20
+      LayoutText {#text} at (49,151) size 4x17
+        text run at (49,151) width 4: " "
+      LayoutBR {BR} at (53,151) size 0x17
+      LayoutMenuList {SELECT} at (4,186) size 47x21 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 45x20
           LayoutText (anonymous) at (4,1) size 23x17
             text run at (4,1) width 23: "foo"
-      LayoutText {#text} at (53,188) size 4x17
-        text run at (53,188) width 4: " "
-      LayoutMenuList {SELECT} at (61,182) size 50x26 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 48x25
+      LayoutText {#text} at (55,188) size 4x17
+        text run at (55,188) width 4: " "
+      LayoutMenuList {SELECT} at (63,182) size 52x26 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 50x25
           LayoutText (anonymous) at (4,1) size 28x22
             text run at (4,1) width 28: "foo"
-      LayoutText {#text} at (115,188) size 4x17
-        text run at (115,188) width 4: " "
-      LayoutMenuList {SELECT} at (123,178) size 56x31 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 54x30
+      LayoutText {#text} at (119,188) size 4x17
+        text run at (119,188) width 4: " "
+      LayoutMenuList {SELECT} at (127,178) size 58x31 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 56x30
           LayoutText (anonymous) at (4,1) size 34x27
             text run at (4,1) width 34: "foo"
-      LayoutText {#text} at (183,188) size 4x17
-        text run at (183,188) width 4: " "
-      LayoutMenuList {SELECT} at (191,187) size 124x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 122x18
+      LayoutText {#text} at (189,188) size 4x17
+        text run at (189,188) width 4: " "
+      LayoutMenuList {SELECT} at (197,187) size 126x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 124x18
           LayoutText (anonymous) at (4,1) size 102x16
             text run at (4,1) width 102: "September 2016"
-      LayoutText {#text} at (319,188) size 4x17
-        text run at (319,188) width 4: " "
-      LayoutBR {BR} at (323,188) size 0x17
-      LayoutMenuList {SELECT} at (6,229) size 60x26 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 58x25
+      LayoutText {#text} at (327,188) size 4x17
+        text run at (327,188) width 4: " "
+      LayoutBR {BR} at (331,188) size 0x17
+      LayoutMenuList {SELECT} at (6,229) size 63x26 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 61x25
           LayoutText (anonymous) at (6,1) size 28x22
             text run at (6,1) width 28: "foo"
-      LayoutText {#text} at (72,235) size 4x17
-        text run at (72,235) width 4: " "
-      LayoutMenuList {SELECT} at (84,221) size 82x38 [bgcolor=#FFFFFF] [border: (2px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (2,2) size 78x35
+      LayoutText {#text} at (75,235) size 4x17
+        text run at (75,235) width 4: " "
+      LayoutMenuList {SELECT} at (87,221) size 86x38 [bgcolor=#FFFFFF] [border: (2px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (2,2) size 82x35
           LayoutText (anonymous) at (8,2) size 38x30
             text run at (8,2) width 38: "foo"
-      LayoutText {#text} at (174,235) size 4x17
-        text run at (174,235) width 4: " "
-      LayoutMenuList {SELECT} at (180,239) size 33x14 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 31x12
+      LayoutText {#text} at (181,235) size 4x17
+        text run at (181,235) width 4: " "
+      LayoutMenuList {SELECT} at (187,239) size 35x14 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 33x12
           LayoutText (anonymous) at (2,0) size 14x12
             text run at (2,0) width 14: "foo"
-      LayoutText {#text} at (215,235) size 4x17
-        text run at (215,235) width 4: " "
-      LayoutBR {BR} at (219,235) size 0x17
+      LayoutText {#text} at (224,235) size 4x17
+        text run at (224,235) width 4: " "
+      LayoutBR {BR} at (228,235) size 0x17
       LayoutText {#text} at (208,283) size 4x17
         text run at (208,283) width 4: " "
       LayoutBR {BR} at (212,283) size 0x17
@@ -135,31 +135,31 @@
       LayoutText {#text} at (68,442) size 4x17
         text run at (68,442) width 4: " "
       LayoutBR {BR} at (72,442) size 0x17
-      LayoutMenuList {SELECT} at (4,476) size 39x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 37x18
-          LayoutText (anonymous) at (16,1) size 17x16
-            text run at (16,1) width 17: "foo"
-      LayoutText {#text} at (47,477) size 4x17
-        text run at (47,477) width 4: " "
-      LayoutMenuList {SELECT} at (55,474) size 43x24 [bgcolor=#FFFFFF] [border: (3px solid #00FF00)]
-        LayoutBlockFlow (anonymous) at (3,3) size 37x18
-          LayoutText (anonymous) at (16,1) size 17x16
-            text run at (16,1) width 17: "foo"
-      LayoutText {#text} at (102,477) size 4x17
-        text run at (102,477) width 4: " "
-      LayoutMenuList {SELECT} at (110,469) size 53x34 [bgcolor=#FFFFFF] [border: (8px solid #00FF00)]
-        LayoutBlockFlow (anonymous) at (8,8) size 37x18
-          LayoutText (anonymous) at (16,1) size 17x16
-            text run at (16,1) width 17: "foo"
-      LayoutText {#text} at (167,477) size 4x17
-        text run at (167,477) width 4: " "
-      LayoutMenuList {SELECT} at (175,476) size 39x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
-        LayoutBlockFlow (anonymous) at (1,1) size 37x18
-          LayoutText (anonymous) at (16,1) size 17x16
-            text run at (16,1) width 17: "foo"
-      LayoutText {#text} at (218,477) size 4x17
-        text run at (218,477) width 4: " "
-      LayoutBR {BR} at (222,477) size 0x17
+      LayoutMenuList {SELECT} at (4,476) size 41x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 39x18
+          LayoutText (anonymous) at (18,1) size 17x16
+            text run at (18,1) width 17: "foo"
+      LayoutText {#text} at (49,477) size 4x17
+        text run at (49,477) width 4: " "
+      LayoutMenuList {SELECT} at (57,474) size 45x24 [bgcolor=#FFFFFF] [border: (3px solid #00FF00)]
+        LayoutBlockFlow (anonymous) at (3,3) size 39x18
+          LayoutText (anonymous) at (18,1) size 17x16
+            text run at (18,1) width 17: "foo"
+      LayoutText {#text} at (106,477) size 4x17
+        text run at (106,477) width 4: " "
+      LayoutMenuList {SELECT} at (114,469) size 55x34 [bgcolor=#FFFFFF] [border: (8px solid #00FF00)]
+        LayoutBlockFlow (anonymous) at (8,8) size 39x18
+          LayoutText (anonymous) at (18,1) size 17x16
+            text run at (18,1) width 17: "foo"
+      LayoutText {#text} at (173,477) size 4x17
+        text run at (173,477) width 4: " "
+      LayoutMenuList {SELECT} at (181,476) size 41x20 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
+        LayoutBlockFlow (anonymous) at (1,1) size 39x18
+          LayoutText (anonymous) at (18,1) size 17x16
+            text run at (18,1) width 17: "foo"
+      LayoutText {#text} at (226,477) size 4x17
+        text run at (226,477) width 4: " "
+      LayoutBR {BR} at (230,477) size 0x17
 layer at (12,279) size 200x25 clip at (13,280) size 183x23 scrollHeight 51
   LayoutListBox {SELECT} at (4,271) size 200x25 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)]
     LayoutBlockFlow {OPTION} at (1,1) size 183x17
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
index 79f98cf4..ff2e741 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -3677,7 +3677,6 @@
     getter memory
     getter navigation
     getter onresourcetimingbufferfull
-    getter onwebkitresourcetimingbufferfull
     getter timing
     method clearMarks
     method clearMeasures
@@ -3691,10 +3690,7 @@
     method now
     method setResourceTimingBufferSize
     method toJSON
-    method webkitClearResourceTimings
-    method webkitSetResourceTimingBufferSize
     setter onresourcetimingbufferfull
-    setter onwebkitresourcetimingbufferfull
 interface PerformanceEntry
     attribute @@toStringTag
     getter duration
diff --git a/third_party/WebKit/LayoutTests/transitions/cancel-transition.html b/third_party/WebKit/LayoutTests/transitions/cancel-transition.html
index 7ff24f2..3495953 100644
--- a/third_party/WebKit/LayoutTests/transitions/cancel-transition.html
+++ b/third_party/WebKit/LayoutTests/transitions/cancel-transition.html
@@ -48,19 +48,30 @@
     <script>
         'use strict';
 
-        function waitSeveralFrames() {
-            return container.animate({opacity: ['1', '1']}, 100).finished;
+        function waitForProgress() {
+          var initialLeft = getComputedStyle(left).left;
+          return new Promise(resolve => {
+            function poll() {
+              var currentLeft = getComputedStyle(left).left;
+              if (currentLeft === initialLeft) {
+                requestAnimationFrame(poll);
+              } else {
+                resolve();
+              }
+            }
+            requestAnimationFrame(poll);
+          });
         }
 
         async_test(t => {
             getComputedStyle(container).height; // force style recalc
             container.className = 'run';
             getComputedStyle(container).height; // force style recalc - transition will start
-            waitSeveralFrames().then(t.step_func(() => {
+            waitForProgress().then(t.step_func_done(() => {
                 assert_greater_than(parseFloat(getComputedStyle(left).left), 50);
                 container.className = '';
                 getComputedStyle(container).height; // force style recalc - transition will cancel
-            })).then(waitSeveralFrames).then(t.step_func_done(() => {
+
                 container.className = 'run'; // restart transition
                 assert_equals(getComputedStyle(left).left, '50px');
                 assert_equals(getComputedStyle(translate).transform, 'matrix(1, 0, 0, 1, 100, 0)');
diff --git a/third_party/WebKit/LayoutTests/transitions/transition-end-event-rendering.html b/third_party/WebKit/LayoutTests/transitions/transition-end-event-rendering.html
index 010a073..0d50deaa 100644
--- a/third_party/WebKit/LayoutTests/transitions/transition-end-event-rendering.html
+++ b/third_party/WebKit/LayoutTests/transitions/transition-end-event-rendering.html
@@ -21,39 +21,39 @@
       margin: 10px 0;
       background-color: green;
     }
-    
-    #container.moved .software {
-      left: 300px;
-    }
 
     #container.moved .hardware {
       transform: translateX(300px);
     }
 
-    .software {
-      -webkit-transition: left 300ms linear;
-    }
-
     .hardware {
-      -webkit-transition: transform 1s linear;
+      -webkit-transition: transform 100ms linear;
       transform: translateX(0);
     }
 
    </style>
-   <script src="../animations/resources/animation-test-helpers.js"></script>
    <script>
+    'use strict';
+    function waitForCompositor() {
+      var tester = document.getElementById('tester');
+      return tester.animate({transform: ['scale(1)', 'scale(1)']}, 1).finished;
+    }
 
     function testEnded()
     {
-      if (window.testRunner)
-        testRunner.notifyDone();
+      waitForCompositor().then(() => {
+        if (window.testRunner)
+          testRunner.notifyDone();
+      });
     }
     
     function startTest()
     {
       if (window.testRunner)
         testRunner.waitUntilDone();
+
       document.getElementById('tester').addEventListener('webkitTransitionEnd', testEnded, false);
+      document.getElementById('container').offsetTop; // Force style recalc
       document.getElementById('container').className = 'moved';
     }
     
@@ -63,7 +63,6 @@
 <body>
 
   <div id="container">
-    <!-- <div class="software box"></div> -->
     <div id="tester" class="hardware box"></div>
   </div>
 
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 230ccd4..88ea189 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -3739,7 +3739,6 @@
     getter memory
     getter navigation
     getter onresourcetimingbufferfull
-    getter onwebkitresourcetimingbufferfull
     getter timing
     method clearMarks
     method clearMeasures
@@ -3753,10 +3752,7 @@
     method now
     method setResourceTimingBufferSize
     method toJSON
-    method webkitClearResourceTimings
-    method webkitSetResourceTimingBufferSize
     setter onresourcetimingbufferfull
-    setter onwebkitresourcetimingbufferfull
 interface PerformanceEntry
     attribute @@toStringTag
     getter duration
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 8bbcedc..1886d67 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -4535,7 +4535,6 @@
     getter navigation
     getter onframetimingbufferfull
     getter onresourcetimingbufferfull
-    getter onwebkitresourcetimingbufferfull
     getter timing
     method clearFrameTimings
     method clearMarks
@@ -4551,11 +4550,8 @@
     method setFrameTimingBufferSize
     method setResourceTimingBufferSize
     method toJSON
-    method webkitClearResourceTimings
-    method webkitSetResourceTimingBufferSize
     setter onframetimingbufferfull
     setter onresourcetimingbufferfull
-    setter onwebkitresourcetimingbufferfull
 interface PerformanceEntry
     attribute @@toStringTag
     getter duration
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp
index 65f0f9f7..d737f8d3 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp
@@ -175,13 +175,13 @@
   WTF_MAKE_NONCOPYABLE(SourceStream);
 
  public:
-  explicit SourceStream(WebTaskRunner* loadingTaskRunner)
+  explicit SourceStream(RefPtr<WebTaskRunner> loadingTaskRunner)
       : v8::ScriptCompiler::ExternalSourceStream(),
         m_cancelled(false),
         m_finished(false),
         m_queueLeadPosition(0),
         m_queueTailPosition(0),
-        m_loadingTaskRunner(loadingTaskRunner->clone()) {}
+        m_loadingTaskRunner(std::move(loadingTaskRunner)) {}
 
   virtual ~SourceStream() override {}
 
@@ -317,7 +317,7 @@
   size_t m_queueLeadPosition;         // Only used by v8 thread.
   size_t m_queueTailPosition;  // Used by both threads; guarded by m_mutex.
 
-  std::unique_ptr<WebTaskRunner> m_loadingTaskRunner;
+  RefPtr<WebTaskRunner> m_loadingTaskRunner;
 };
 
 size_t ScriptStreamer::s_smallScriptThreshold = 30 * 1024;
@@ -326,12 +326,12 @@
                                     Type scriptType,
                                     Settings* settings,
                                     ScriptState* scriptState,
-                                    WebTaskRunner* loadingTaskRunner) {
+                                    RefPtr<WebTaskRunner> loadingTaskRunner) {
   // We don't yet know whether the script will really be streamed. E.g.,
   // suppressing streaming for short scripts is done later. Record only the
   // sure negative cases here.
   bool startedStreaming = startStreamingInternal(
-      script, scriptType, settings, scriptState, loadingTaskRunner);
+      script, scriptType, settings, scriptState, std::move(loadingTaskRunner));
   if (!startedStreaming)
     recordStartedStreamingHistogram(scriptType, 0);
 }
@@ -523,7 +523,7 @@
     Type scriptType,
     ScriptState* scriptState,
     v8::ScriptCompiler::CompileOptions compileOptions,
-    WebTaskRunner* loadingTaskRunner)
+    RefPtr<WebTaskRunner> loadingTaskRunner)
     : m_pendingScript(script),
       m_resource(script->resource()),
       m_detached(false),
@@ -540,7 +540,7 @@
       // Unfortunately there's no dummy encoding value in the enum; let's use
       // one we don't stream.
       m_encoding(v8::ScriptCompiler::StreamedSource::TWO_BYTE),
-      m_loadingTaskRunner(loadingTaskRunner->clone()) {}
+      m_loadingTaskRunner(std::move(loadingTaskRunner)) {}
 
 ScriptStreamer::~ScriptStreamer() {}
 
@@ -584,11 +584,12 @@
   m_pendingScript->streamingFinished();
 }
 
-bool ScriptStreamer::startStreamingInternal(PendingScript* script,
-                                            Type scriptType,
-                                            Settings* settings,
-                                            ScriptState* scriptState,
-                                            WebTaskRunner* loadingTaskRunner) {
+bool ScriptStreamer::startStreamingInternal(
+    PendingScript* script,
+    Type scriptType,
+    Settings* settings,
+    ScriptState* scriptState,
+    RefPtr<WebTaskRunner> loadingTaskRunner) {
   DCHECK(isMainThread());
   DCHECK(scriptState->contextIsValid());
   ScriptResource* resource = script->resource();
@@ -622,7 +623,8 @@
   // needed. This makes PendingScript notify the ScriptStreamer when it is
   // destroyed.
   script->setStreamer(ScriptStreamer::create(script, scriptType, scriptState,
-                                             compileOption, loadingTaskRunner));
+                                             compileOption,
+                                             std::move(loadingTaskRunner)));
 
   return true;
 }
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.h b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.h
index c4fca3f..d5b295b 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.h
@@ -45,7 +45,7 @@
                              Type,
                              Settings*,
                              ScriptState*,
-                             WebTaskRunner*);
+                             RefPtr<WebTaskRunner>);
 
   // Returns false if we cannot stream the given encoding.
   static bool convertEncoding(const char* encodingName,
@@ -108,15 +108,15 @@
       Type scriptType,
       ScriptState* scriptState,
       v8::ScriptCompiler::CompileOptions compileOptions,
-      WebTaskRunner* loadingTaskRunner) {
+      RefPtr<WebTaskRunner> loadingTaskRunner) {
     return new ScriptStreamer(script, scriptType, scriptState, compileOptions,
-                              loadingTaskRunner);
+                              std::move(loadingTaskRunner));
   }
   ScriptStreamer(PendingScript*,
                  Type,
                  ScriptState*,
                  v8::ScriptCompiler::CompileOptions,
-                 WebTaskRunner*);
+                 RefPtr<WebTaskRunner>);
 
   void streamingComplete();
   void notifyFinishedToClient();
@@ -125,7 +125,7 @@
                                      Type,
                                      Settings*,
                                      ScriptState*,
-                                     WebTaskRunner*);
+                                     RefPtr<WebTaskRunner>);
 
   Member<PendingScript> m_pendingScript;
   // This pointer is weak. If PendingScript and its Resource are deleted
@@ -169,7 +169,7 @@
   // Encoding of the streamed script. Saved for sanity checking purposes.
   v8::ScriptCompiler::StreamedSource::Encoding m_encoding;
 
-  std::unique_ptr<WebTaskRunner> m_loadingTaskRunner;
+  RefPtr<WebTaskRunner> m_loadingTaskRunner;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
index f99a1d1..8a73ed8 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
@@ -81,7 +81,7 @@
     testing::runPendingTasks();
   }
 
-  WebTaskRunner* m_loadingTaskRunner;  // NOT OWNED
+  RefPtr<WebTaskRunner> m_loadingTaskRunner;
   std::unique_ptr<Settings> m_settings;
   // The Resource and PendingScript where we stream from. These don't really
   // fetch any data outside the test; the test controls the data by calling
diff --git a/third_party/WebKit/Source/core/animation/BUILD.gn b/third_party/WebKit/Source/core/animation/BUILD.gn
index e1109ccc..d37569a 100644
--- a/third_party/WebKit/Source/core/animation/BUILD.gn
+++ b/third_party/WebKit/Source/core/animation/BUILD.gn
@@ -116,7 +116,6 @@
     "InertEffect.h",
     "InterpolableValue.cpp",
     "InterpolableValue.h",
-    "Interpolation.cpp",
     "Interpolation.h",
     "InterpolationEffect.cpp",
     "InterpolationEffect.h",
@@ -133,6 +132,7 @@
     "KeyframeEffectModel.h",
     "KeyframeEffectReadOnly.cpp",
     "KeyframeEffectReadOnly.h",
+    "LegacyStyleInterpolation.cpp",
     "LegacyStyleInterpolation.h",
     "LengthInterpolationFunctions.cpp",
     "LengthInterpolationFunctions.h",
diff --git a/third_party/WebKit/Source/core/animation/InterpolableValue.h b/third_party/WebKit/Source/core/animation/InterpolableValue.h
index 85312d6c..ceb4346 100644
--- a/third_party/WebKit/Source/core/animation/InterpolableValue.h
+++ b/third_party/WebKit/Source/core/animation/InterpolableValue.h
@@ -38,7 +38,7 @@
                            const double progress,
                            InterpolableValue& result) const = 0;
 
-  friend class Interpolation;
+  friend class LegacyStyleInterpolation;
   friend class PairwisePrimitiveInterpolation;
 
   // Keep interpolate private, but allow calls within the hierarchy without
diff --git a/third_party/WebKit/Source/core/animation/InterpolableValueTest.cpp b/third_party/WebKit/Source/core/animation/InterpolableValueTest.cpp
index 8d3b9a7..def12636 100644
--- a/third_party/WebKit/Source/core/animation/InterpolableValueTest.cpp
+++ b/third_party/WebKit/Source/core/animation/InterpolableValueTest.cpp
@@ -4,8 +4,7 @@
 
 #include "core/animation/InterpolableValue.h"
 
-#include "core/animation/Interpolation.h"
-#include "core/animation/PropertyHandle.h"
+#include "core/animation/LegacyStyleInterpolation.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include <memory>
 
@@ -13,7 +12,7 @@
 
 namespace {
 
-class SampleInterpolation : public Interpolation {
+class SampleInterpolation : public LegacyStyleInterpolation {
  public:
   static PassRefPtr<Interpolation> create(
       std::unique_ptr<InterpolableValue> start,
@@ -21,14 +20,12 @@
     return adoptRef(new SampleInterpolation(std::move(start), std::move(end)));
   }
 
-  PropertyHandle getProperty() const override {
-    return PropertyHandle(CSSPropertyBackgroundColor);
-  }
-
  private:
   SampleInterpolation(std::unique_ptr<InterpolableValue> start,
                       std::unique_ptr<InterpolableValue> end)
-      : Interpolation(std::move(start), std::move(end)) {}
+      : LegacyStyleInterpolation(std::move(start),
+                                 std::move(end),
+                                 CSSPropertyBackgroundColor) {}
 };
 
 }  // namespace
diff --git a/third_party/WebKit/Source/core/animation/Interpolation.h b/third_party/WebKit/Source/core/animation/Interpolation.h
index 702d01d8..2b49062 100644
--- a/third_party/WebKit/Source/core/animation/Interpolation.h
+++ b/third_party/WebKit/Source/core/animation/Interpolation.h
@@ -21,9 +21,9 @@
   WTF_MAKE_NONCOPYABLE(Interpolation);
 
  public:
-  virtual ~Interpolation();
+  virtual ~Interpolation() {}
 
-  virtual void interpolate(int iteration, double fraction);
+  virtual void interpolate(int iteration, double fraction) = 0;
 
   virtual bool isInvalidatableInterpolation() const { return false; }
   virtual bool isLegacyStyleInterpolation() const { return false; }
@@ -32,20 +32,9 @@
   virtual bool dependsOnUnderlyingValue() const { return false; }
 
  protected:
-  const std::unique_ptr<InterpolableValue> m_start;
-  const std::unique_ptr<InterpolableValue> m_end;
+  Interpolation() {}
 
-  mutable double m_cachedFraction;
-  mutable int m_cachedIteration;
-  mutable std::unique_ptr<InterpolableValue> m_cachedValue;
-
-  Interpolation(std::unique_ptr<InterpolableValue> start,
-                std::unique_ptr<InterpolableValue> end);
-
- private:
-  InterpolableValue* getCachedValueForTesting() const {
-    return m_cachedValue.get();
-  }
+  virtual InterpolableValue* getCachedValueForTesting() const = 0;
 
   friend class AnimationInterpolableValueTest;
   friend class AnimationInterpolationEffectTest;
diff --git a/third_party/WebKit/Source/core/animation/InterpolationEffectTest.cpp b/third_party/WebKit/Source/core/animation/InterpolationEffectTest.cpp
index 5015f1f..df258937 100644
--- a/third_party/WebKit/Source/core/animation/InterpolationEffectTest.cpp
+++ b/third_party/WebKit/Source/core/animation/InterpolationEffectTest.cpp
@@ -4,6 +4,7 @@
 
 #include "core/animation/InterpolationEffect.h"
 
+#include "core/animation/LegacyStyleInterpolation.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include <memory>
 
@@ -11,7 +12,7 @@
 
 namespace {
 
-class SampleInterpolation : public Interpolation {
+class SampleInterpolation : public LegacyStyleInterpolation {
  public:
   static PassRefPtr<Interpolation> create(
       std::unique_ptr<InterpolableValue> start,
@@ -19,14 +20,12 @@
     return adoptRef(new SampleInterpolation(std::move(start), std::move(end)));
   }
 
-  PropertyHandle getProperty() const override {
-    return PropertyHandle(CSSPropertyBackgroundColor);
-  }
-
  private:
   SampleInterpolation(std::unique_ptr<InterpolableValue> start,
                       std::unique_ptr<InterpolableValue> end)
-      : Interpolation(std::move(start), std::move(end)) {}
+      : LegacyStyleInterpolation(std::move(start),
+                                 std::move(end),
+                                 CSSPropertyBackgroundColor) {}
 };
 
 const double duration = 1.0;
diff --git a/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.h b/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.h
index 7f7cc0d0..bdacb92 100644
--- a/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.h
+++ b/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.h
@@ -40,7 +40,7 @@
   InvalidatableInterpolation(PropertyHandle property,
                              PassRefPtr<PropertySpecificKeyframe> startKeyframe,
                              PassRefPtr<PropertySpecificKeyframe> endKeyframe)
-      : Interpolation(nullptr, nullptr),
+      : Interpolation(),
         m_property(property),
         m_interpolationTypes(nullptr),
         m_interpolationTypesVersion(0),
@@ -51,6 +51,11 @@
 
   using ConversionCheckers = InterpolationType::ConversionCheckers;
 
+  InterpolableValue* getCachedValueForTesting() const final {
+    // TODO(suzyh): Add meaningful implementation here
+    NOTREACHED();
+    return nullptr;
+  }
   std::unique_ptr<TypedInterpolationValue> maybeConvertUnderlyingValue(
       const InterpolationEnvironment&) const;
   const TypedInterpolationValue* ensureValidConversion(
diff --git a/third_party/WebKit/Source/core/animation/Interpolation.cpp b/third_party/WebKit/Source/core/animation/LegacyStyleInterpolation.cpp
similarity index 75%
rename from third_party/WebKit/Source/core/animation/Interpolation.cpp
rename to third_party/WebKit/Source/core/animation/LegacyStyleInterpolation.cpp
index fce255a..452696c 100644
--- a/third_party/WebKit/Source/core/animation/Interpolation.cpp
+++ b/third_party/WebKit/Source/core/animation/LegacyStyleInterpolation.cpp
@@ -1,8 +1,8 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
+// 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 "core/animation/Interpolation.h"
+#include "core/animation/LegacyStyleInterpolation.h"
 
 #include <memory>
 
@@ -34,19 +34,21 @@
 
 }  // namespace
 
-Interpolation::Interpolation(std::unique_ptr<InterpolableValue> start,
-                             std::unique_ptr<InterpolableValue> end)
-    : m_start(std::move(start)),
+LegacyStyleInterpolation::LegacyStyleInterpolation(
+    std::unique_ptr<InterpolableValue> start,
+    std::unique_ptr<InterpolableValue> end,
+    CSSPropertyID id)
+    : Interpolation(),
+      m_start(std::move(start)),
       m_end(std::move(end)),
+      m_id(id),
       m_cachedFraction(0),
       m_cachedIteration(0),
       m_cachedValue(m_start ? m_start->clone() : nullptr) {
   RELEASE_ASSERT(typesMatch(m_start.get(), m_end.get()));
 }
 
-Interpolation::~Interpolation() {}
-
-void Interpolation::interpolate(int iteration, double fraction) {
+void LegacyStyleInterpolation::interpolate(int iteration, double fraction) {
   if (m_cachedFraction != fraction || m_cachedIteration != iteration) {
     m_start->interpolate(*m_end, fraction, *m_cachedValue);
     m_cachedIteration = iteration;
diff --git a/third_party/WebKit/Source/core/animation/LegacyStyleInterpolation.h b/third_party/WebKit/Source/core/animation/LegacyStyleInterpolation.h
index ef9d80c..0947a3c 100644
--- a/third_party/WebKit/Source/core/animation/LegacyStyleInterpolation.h
+++ b/third_party/WebKit/Source/core/animation/LegacyStyleInterpolation.h
@@ -48,13 +48,25 @@
 
   PropertyHandle getProperty() const final { return PropertyHandle(id()); }
 
- private:
-  CSSPropertyID m_id;
+  void interpolate(int iteration, double fraction) final;
 
+ protected:
   LegacyStyleInterpolation(std::unique_ptr<InterpolableValue> start,
                            std::unique_ptr<InterpolableValue> end,
-                           CSSPropertyID id)
-      : Interpolation(std::move(start), std::move(end)), m_id(id) {}
+                           CSSPropertyID);
+
+ private:
+  const std::unique_ptr<InterpolableValue> m_start;
+  const std::unique_ptr<InterpolableValue> m_end;
+  CSSPropertyID m_id;
+
+  mutable double m_cachedFraction;
+  mutable int m_cachedIteration;
+  mutable std::unique_ptr<InterpolableValue> m_cachedValue;
+
+  InterpolableValue* getCachedValueForTesting() const final {
+    return m_cachedValue.get();
+  }
 };
 
 DEFINE_TYPE_CASTS(LegacyStyleInterpolation,
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn
index 9ecf1aa..4572592 100644
--- a/third_party/WebKit/Source/core/css/BUILD.gn
+++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -344,6 +344,11 @@
     "parser/SizesAttributeParser.cpp",
     "parser/SizesCalcParser.cpp",
     "properties/CSSPropertyAPI.h",
+    "properties/CSSPropertyAPICaretColor.cpp",
+    "properties/CSSPropertyAPIClip.cpp",
+    "properties/CSSPropertyAPIColumnGap.cpp",
+    "properties/CSSPropertyAPIFlexBasis.cpp",
+    "properties/CSSPropertyAPIFontSizeAdjust.cpp",
     "properties/CSSPropertyAPISize.cpp",
     "properties/CSSPropertyAPITextDecorationColor.cpp",
     "properties/CSSPropertyAPITextDecorationSkip.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.in b/third_party/WebKit/Source/core/css/CSSProperties.in
index f4d6b96..5422ee3 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.in
+++ b/third_party/WebKit/Source/core/css/CSSProperties.in
@@ -166,7 +166,7 @@
 font-family inherited, font, type_name=FontDescription::FamilyDescription, name_for_methods=FamilyDescription, converter=convertFontFamily
 font-kerning inherited, font, type_name=FontDescription::Kerning, name_for_methods=Kerning
 font-size interpolable, inherited, font, name_for_methods=Size, getter=getSize, converter=convertFontSize
-font-size-adjust runtime_flag=CSSFontSizeAdjust, interpolable, inherited, font, name_for_methods=SizeAdjust, converter=convertFontSizeAdjust
+font-size-adjust runtime_flag=CSSFontSizeAdjust, interpolable, inherited, font, name_for_methods=SizeAdjust, converter=convertFontSizeAdjust, api_class
 font-stretch inherited, font, type_name=FontStretch, name_for_methods=Stretch
 font-style inherited, font, type_name=FontStyle, name_for_methods=Style
 font-variant-ligatures inherited, font, type_name=VariantLigatures, name_for_methods=VariantLigatures, converter=convertFontVariantLigatures
@@ -232,9 +232,9 @@
 break-inside type_name=EBreak
 buffered-rendering svg
 caption-side inherited, keyword_only, independent, keywords=[top|bottom|left|right], initial_keyword=top
-caret-color interpolable, inherited, custom_all
+caret-color interpolable, inherited, custom_all, api_class
 clear
-clip interpolable, converter=convertClip, custom_all
+clip interpolable, converter=convertClip, custom_all, api_class
 clip-path interpolable, converter=convertClipPath
 clip-rule inherited, svg, type_name=WindRule
 color-interpolation inherited, svg
@@ -256,7 +256,7 @@
 fill-opacity interpolable, inherited, svg, converter=convertNumberOrPercentage
 fill-rule inherited, svg, type_name=WindRule
 filter interpolable, converter=convertFilterOperations
-flex-basis interpolable, converter=convertLengthOrAuto
+flex-basis interpolable, converter=convertLengthOrAuto, api_class
 flex-direction
 flex-grow interpolable, type_name=float
 flex-shrink interpolable, type_name=float
@@ -417,7 +417,7 @@
 -webkit-box-pack
 -webkit-box-reflect converter=convertBoxReflect
 column-count interpolable, type_name=unsigned short, custom_all
-column-gap interpolable, converter=convertComputedLength<float>, custom_all
+column-gap interpolable, converter=convertComputedLength<float>, custom_all, api_class
 column-rule-color interpolable, custom_all
 column-rule-style type_name=EBorderStyle, initial=initialBorderStyle
 column-rule-width interpolable, converter=convertLineWidth<unsigned short>
@@ -448,7 +448,7 @@
 -webkit-perspective-origin-x interpolable, converter=convertLength
 -webkit-perspective-origin-y interpolable, converter=convertLength
 -webkit-print-color-adjust inherited, independent, keyword_only, keywords=[economy|exact], initial_keyword=economy
--webkit-rtl-ordering inherited, type_name=EOrder, setter=setRtlOrdering, initial=initialRtlOrdering, keyword_only, keywords=[logical|visual], initial_keyword=logical
+-webkit-rtl-ordering inherited, independent, type_name=EOrder, setter=setRtlOrdering, initial=initialRtlOrdering, keyword_only, keywords=[logical|visual], initial_keyword=logical
 -webkit-ruby-position inherited, type_name=RubyPosition
 -webkit-tap-highlight-color inherited, converter=convertColor
 -webkit-text-combine inherited, type_name=TextCombine, name_for_methods=TextCombine
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index b897acdc..1627bc5 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -1003,13 +1003,6 @@
   return consumePositiveInteger(range);
 }
 
-static CSSValue* consumeColumnGap(CSSParserTokenRange& range,
-                                  CSSParserMode cssParserMode) {
-  if (range.peek().id() == CSSValueNormal)
-    return consumeIdent(range);
-  return consumeLength(range, cssParserMode, ValueRangeNonNegative);
-}
-
 static CSSValue* consumeColumnSpan(CSSParserTokenRange& range) {
   return consumeIdent<CSSValueAll, CSSValueNone>(range);
 }
@@ -1879,14 +1872,6 @@
   return consumeUrl(range);
 }
 
-static CSSValue* consumeFlexBasis(CSSParserTokenRange& range,
-                                  CSSParserMode cssParserMode) {
-  // FIXME: Support intrinsic dimensions too.
-  if (range.peek().id() == CSSValueAuto)
-    return consumeIdent(range);
-  return consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative);
-}
-
 static CSSValue* consumeStrokeDasharray(CSSParserTokenRange& range) {
   CSSValueID id = range.peek().id();
   if (id == CSSValueNone)
@@ -2595,12 +2580,6 @@
   return CSSReflectValue::create(direction, offset, mask);
 }
 
-static CSSValue* consumeFontSizeAdjust(CSSParserTokenRange& range) {
-  if (range.peek().id() == CSSValueNone)
-    return consumeIdent(range);
-  return consumeNumber(range, ValueRangeNonNegative);
-}
-
 static CSSValue* consumeImageOrientation(CSSParserTokenRange& range) {
   if (range.peek().id() == CSSValueFromImage)
     return consumeIdent(range);
@@ -3415,8 +3394,6 @@
       return consumeColumnWidth(m_range);
     case CSSPropertyColumnCount:
       return consumeColumnCount(m_range);
-    case CSSPropertyColumnGap:
-      return consumeColumnGap(m_range, m_context.mode());
     case CSSPropertyColumnSpan:
       return consumeColumnSpan(m_range);
     case CSSPropertyAnimationDelay:
@@ -3465,10 +3442,6 @@
     case CSSPropertyColor:
     case CSSPropertyBackgroundColor:
       return consumeColor(m_range, m_context.mode(), inQuirksMode());
-    case CSSPropertyCaretColor:
-      if (m_range.peek().id() == CSSValueAuto)
-        return consumeIdent(m_range);
-      return consumeColor(m_range, m_context.mode());
     case CSSPropertyWebkitBorderStartWidth:
     case CSSPropertyWebkitBorderEndWidth:
     case CSSPropertyWebkitBorderBeforeWidth:
@@ -3553,8 +3526,6 @@
     case CSSPropertyMarkerEnd:
     case CSSPropertyMask:
       return consumeNoneOrURI(m_range);
-    case CSSPropertyFlexBasis:
-      return consumeFlexBasis(m_range, m_context.mode());
     case CSSPropertyFlexGrow:
     case CSSPropertyFlexShrink:
       return consumeNumber(m_range, ValueRangeNonNegative);
@@ -3637,9 +3608,6 @@
       return consumeWebkitBorderImage(property, m_range, m_context);
     case CSSPropertyWebkitBoxReflect:
       return consumeReflect(m_range, m_context);
-    case CSSPropertyFontSizeAdjust:
-      ASSERT(RuntimeEnabledFeatures::cssFontSizeAdjustEnabled());
-      return consumeFontSizeAdjust(m_range);
     case CSSPropertyImageOrientation:
       ASSERT(RuntimeEnabledFeatures::imageOrientationEnabled());
       return consumeImageOrientation(m_range);
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPICaretColor.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPICaretColor.cpp
new file mode 100644
index 0000000..4fcb91cc
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPICaretColor.cpp
@@ -0,0 +1,20 @@
+// 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 "core/css/properties/CSSPropertyAPICaretColor.h"
+
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+
+const CSSValue* CSSPropertyAPICaretColor::parseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context) {
+  if (range.peek().id() == CSSValueAuto)
+    return CSSPropertyParserHelpers::consumeIdent(range);
+  return CSSPropertyParserHelpers::consumeColor(range, context.mode());
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIClip.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIClip.cpp
new file mode 100644
index 0000000..77f0bdc
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIClip.cpp
@@ -0,0 +1,59 @@
+// 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 "core/css/properties/CSSPropertyAPIClip.h"
+
+#include "core/css/CSSQuadValue.h"
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+
+namespace {
+
+CSSValue* consumeClipComponent(CSSParserTokenRange& range,
+                               CSSParserMode cssParserMode) {
+  if (range.peek().id() == CSSValueAuto)
+    return CSSPropertyParserHelpers::consumeIdent(range);
+  return CSSPropertyParserHelpers::consumeLength(
+      range, cssParserMode, ValueRangeAll,
+      CSSPropertyParserHelpers::UnitlessQuirk::Allow);
+}
+
+}  // namespace
+
+const CSSValue* CSSPropertyAPIClip::parseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context) {
+  if (range.peek().id() == CSSValueAuto)
+    return CSSPropertyParserHelpers::consumeIdent(range);
+
+  if (range.peek().functionId() != CSSValueRect)
+    return nullptr;
+
+  CSSParserTokenRange args = CSSPropertyParserHelpers::consumeFunction(range);
+  // rect(t, r, b, l) || rect(t r b l)
+  CSSValue* top = consumeClipComponent(args, context.mode());
+  if (!top)
+    return nullptr;
+  bool needsComma =
+      CSSPropertyParserHelpers::consumeCommaIncludingWhitespace(args);
+  CSSValue* right = consumeClipComponent(args, context.mode());
+  if (!right ||
+      (needsComma &&
+       !CSSPropertyParserHelpers::consumeCommaIncludingWhitespace(args)))
+    return nullptr;
+  CSSValue* bottom = consumeClipComponent(args, context.mode());
+  if (!bottom ||
+      (needsComma &&
+       !CSSPropertyParserHelpers::consumeCommaIncludingWhitespace(args)))
+    return nullptr;
+  CSSValue* left = consumeClipComponent(args, context.mode());
+  if (!left || !args.atEnd())
+    return nullptr;
+  return CSSQuadValue::create(top, right, bottom, left,
+                              CSSQuadValue::SerializeAsRect);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColumnGap.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColumnGap.cpp
new file mode 100644
index 0000000..cc3374b
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIColumnGap.cpp
@@ -0,0 +1,21 @@
+// 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 "core/css/properties/CSSPropertyAPIColumnGap.h"
+
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+
+const CSSValue* CSSPropertyAPIColumnGap::parseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context) {
+  if (range.peek().id() == CSSValueNormal)
+    return CSSPropertyParserHelpers::consumeIdent(range);
+  return CSSPropertyParserHelpers::consumeLength(range, context.mode(),
+                                                 ValueRangeNonNegative);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFlexBasis.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFlexBasis.cpp
new file mode 100644
index 0000000..6ed445b
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFlexBasis.cpp
@@ -0,0 +1,22 @@
+// 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 "core/css/properties/CSSPropertyAPIFlexBasis.h"
+
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+
+const CSSValue* CSSPropertyAPIFlexBasis::parseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context) {
+  // FIXME: Support intrinsic dimensions too.
+  if (range.peek().id() == CSSValueAuto)
+    return CSSPropertyParserHelpers::consumeIdent(range);
+  return CSSPropertyParserHelpers::consumeLengthOrPercent(
+      range, context.mode(), ValueRangeNonNegative);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFontSizeAdjust.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFontSizeAdjust.cpp
new file mode 100644
index 0000000..4851691
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFontSizeAdjust.cpp
@@ -0,0 +1,21 @@
+// 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 "core/css/properties/CSSPropertyAPIFontSizeAdjust.h"
+
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+#include "platform/RuntimeEnabledFeatures.h"
+
+namespace blink {
+
+const CSSValue* CSSPropertyAPIFontSizeAdjust::parseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context) {
+  DCHECK(RuntimeEnabledFeatures::cssFontSizeAdjustEnabled());
+  if (range.peek().id() == CSSValueNone)
+    return CSSPropertyParserHelpers::consumeIdent(range);
+  return CSSPropertyParserHelpers::consumeNumber(range, ValueRangeNonNegative);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 43482a8..d9c8b0f81 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -487,7 +487,7 @@
           TaskRunnerHelper::get(TaskType::UnspecedLoading, this),
           this,
           &Document::didAssociateFormControlsTimerFired),
-      m_timers(TaskRunnerHelper::get(TaskType::Timer, this)->clone()),
+      m_timers(TaskRunnerHelper::get(TaskType::Timer, this)),
       m_hasViewportUnits(false),
       m_parserSyncPolicy(AllowAsynchronousParsing),
       m_nodeCount(0),
@@ -2501,11 +2501,8 @@
     clearImportsController();
   }
 
-  m_timers.setTimerTaskRunner(Platform::current()
-                                  ->currentThread()
-                                  ->scheduler()
-                                  ->timerTaskRunner()
-                                  ->clone());
+  m_timers.setTimerTaskRunner(
+      Platform::current()->currentThread()->scheduler()->timerTaskRunner());
 
   if (m_mediaQueryMatcher)
     m_mediaQueryMatcher->documentDetached();
diff --git a/third_party/WebKit/Source/core/dom/ScriptRunner.cpp b/third_party/WebKit/Source/core/dom/ScriptRunner.cpp
index e13964f2..51ed26c 100644
--- a/third_party/WebKit/Source/core/dom/ScriptRunner.cpp
+++ b/third_party/WebKit/Source/core/dom/ScriptRunner.cpp
@@ -38,8 +38,7 @@
 
 ScriptRunner::ScriptRunner(Document* document)
     : m_document(document),
-      m_taskRunner(
-          TaskRunnerHelper::get(TaskType::Networking, document)->clone()),
+      m_taskRunner(TaskRunnerHelper::get(TaskType::Networking, document)),
       m_numberOfInOrderScriptsWithPendingNotification(0),
       m_isSuspended(false) {
   DCHECK(document);
diff --git a/third_party/WebKit/Source/core/dom/ScriptRunner.h b/third_party/WebKit/Source/core/dom/ScriptRunner.h
index 1758210..e663412 100644
--- a/third_party/WebKit/Source/core/dom/ScriptRunner.h
+++ b/third_party/WebKit/Source/core/dom/ScriptRunner.h
@@ -91,7 +91,7 @@
   HeapDeque<Member<ScriptLoader>> m_asyncScriptsToExecuteSoon;
   HeapDeque<Member<ScriptLoader>> m_inOrderScriptsToExecuteSoon;
 
-  std::unique_ptr<WebTaskRunner> m_taskRunner;
+  RefPtr<WebTaskRunner> m_taskRunner;
 
   int m_numberOfInOrderScriptsWithPendingNotification;
 
diff --git a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp
index 2d0ba638..c7f578b3 100644
--- a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp
+++ b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp
@@ -13,7 +13,7 @@
 
 namespace blink {
 
-WebTaskRunner* TaskRunnerHelper::get(TaskType type, LocalFrame* frame) {
+RefPtr<WebTaskRunner> TaskRunnerHelper::get(TaskType type, LocalFrame* frame) {
   // TODO(haraken): Optimize the mapping from TaskTypes to task runners.
   switch (type) {
     case TaskType::DOMManipulation:
@@ -48,18 +48,20 @@
   return nullptr;
 }
 
-WebTaskRunner* TaskRunnerHelper::get(TaskType type, Document* document) {
+RefPtr<WebTaskRunner> TaskRunnerHelper::get(TaskType type, Document* document) {
   return get(type, document ? document->frame() : nullptr);
 }
 
-WebTaskRunner* TaskRunnerHelper::get(TaskType type,
-                                     ExecutionContext* executionContext) {
+RefPtr<WebTaskRunner> TaskRunnerHelper::get(
+    TaskType type,
+    ExecutionContext* executionContext) {
   return get(type, executionContext && executionContext->isDocument()
                        ? static_cast<Document*>(executionContext)
                        : nullptr);
 }
 
-WebTaskRunner* TaskRunnerHelper::get(TaskType type, ScriptState* scriptState) {
+RefPtr<WebTaskRunner> TaskRunnerHelper::get(TaskType type,
+                                            ScriptState* scriptState) {
   return get(type, scriptState ? scriptState->getExecutionContext() : nullptr);
 }
 
diff --git a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.h b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.h
index af9cda1..0ca15474 100644
--- a/third_party/WebKit/Source/core/dom/TaskRunnerHelper.h
+++ b/third_party/WebKit/Source/core/dom/TaskRunnerHelper.h
@@ -78,10 +78,10 @@
   STATIC_ONLY(TaskRunnerHelper);
 
  public:
-  static WebTaskRunner* get(TaskType, LocalFrame*);
-  static WebTaskRunner* get(TaskType, Document*);
-  static WebTaskRunner* get(TaskType, ExecutionContext*);
-  static WebTaskRunner* get(TaskType, ScriptState*);
+  static RefPtr<WebTaskRunner> get(TaskType, LocalFrame*);
+  static RefPtr<WebTaskRunner> get(TaskType, Document*);
+  static RefPtr<WebTaskRunner> get(TaskType, ExecutionContext*);
+  static RefPtr<WebTaskRunner> get(TaskType, ScriptState*);
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/events/EventTypeNames.in b/third_party/WebKit/Source/core/events/EventTypeNames.in
index 1c81716..458c18e 100644
--- a/third_party/WebKit/Source/core/events/EventTypeNames.in
+++ b/third_party/WebKit/Source/core/events/EventTypeNames.in
@@ -272,7 +272,6 @@
 webkitprerenderload
 webkitprerenderstart
 webkitprerenderstop
-webkitresourcetimingbufferfull
 webkitspeechchange
 webkitvisibilitychange
 wheel
diff --git a/third_party/WebKit/Source/core/fetch/FetchContext.h b/third_party/WebKit/Source/core/fetch/FetchContext.h
index 7711b932..4de8883 100644
--- a/third_party/WebKit/Source/core/fetch/FetchContext.h
+++ b/third_party/WebKit/Source/core/fetch/FetchContext.h
@@ -177,7 +177,7 @@
     return priority;
   }
 
-  virtual WebTaskRunner* loadingTaskRunner() const { return nullptr; }
+  virtual RefPtr<WebTaskRunner> loadingTaskRunner() const { return nullptr; }
 
  protected:
   FetchContext() {}
diff --git a/third_party/WebKit/Source/core/fetch/MockFetchContext.h b/third_party/WebKit/Source/core/fetch/MockFetchContext.h
index b90c0fd..01e52d0 100644
--- a/third_party/WebKit/Source/core/fetch/MockFetchContext.h
+++ b/third_party/WebKit/Source/core/fetch/MockFetchContext.h
@@ -50,7 +50,7 @@
   bool shouldLoadNewResource(Resource::Type) const override {
     return m_loadPolicy == kShouldLoadNewResource;
   }
-  WebTaskRunner* loadingTaskRunner() const override { return m_runner.get(); }
+  RefPtr<WebTaskRunner> loadingTaskRunner() const override { return m_runner; }
 
   void setCachePolicy(CachePolicy policy) { m_policy = policy; }
   CachePolicy getCachePolicy() const override { return m_policy; }
@@ -67,13 +67,13 @@
   MockFetchContext(LoadPolicy loadPolicy)
       : m_loadPolicy(loadPolicy),
         m_policy(CachePolicyVerify),
-        m_runner(WTF::wrapUnique(new scheduler::FakeWebTaskRunner)),
+        m_runner(adoptRef(new scheduler::FakeWebTaskRunner)),
         m_complete(false),
         m_transferSize(-1) {}
 
   enum LoadPolicy m_loadPolicy;
   CachePolicy m_policy;
-  std::unique_ptr<scheduler::FakeWebTaskRunner> m_runner;
+  RefPtr<scheduler::FakeWebTaskRunner> m_runner;
   bool m_complete;
   long long m_transferSize;
 };
diff --git a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
index cd3276d6..449c25fc 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
@@ -88,7 +88,7 @@
   m_loader = WTF::wrapUnique(Platform::current()->createURLLoader());
   DCHECK(m_loader);
   m_loader->setDefersLoading(context().defersLoading());
-  m_loader->setLoadingTaskRunner(context().loadingTaskRunner());
+  m_loader->setLoadingTaskRunner(context().loadingTaskRunner().get());
 
   if (m_isCacheAwareLoadingActivated) {
     // Override cache policy for cache-aware loading. If this request fails, a
diff --git a/third_party/WebKit/Source/core/frame/DOMTimer.cpp b/third_party/WebKit/Source/core/frame/DOMTimer.cpp
index 2b2e2c6..c61ab92 100644
--- a/third_party/WebKit/Source/core/frame/DOMTimer.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMTimer.cpp
@@ -184,7 +184,7 @@
   action->dispose();
 }
 
-WebTaskRunner* DOMTimer::timerTaskRunner() const {
+RefPtr<WebTaskRunner> DOMTimer::timerTaskRunner() const {
   return getExecutionContext()->timers()->timerTaskRunner();
 }
 
diff --git a/third_party/WebKit/Source/core/frame/DOMTimer.h b/third_party/WebKit/Source/core/frame/DOMTimer.h
index 935ce517..d84450a0 100644
--- a/third_party/WebKit/Source/core/frame/DOMTimer.h
+++ b/third_party/WebKit/Source/core/frame/DOMTimer.h
@@ -83,7 +83,7 @@
            int timeoutID);
   void fired() override;
 
-  WebTaskRunner* timerTaskRunner() const override;
+  RefPtr<WebTaskRunner> timerTaskRunner() const override;
 
   int m_timeoutID;
   int m_nestingLevel;
diff --git a/third_party/WebKit/Source/core/frame/DOMTimerCoordinator.cpp b/third_party/WebKit/Source/core/frame/DOMTimerCoordinator.cpp
index cb039a5..7b5c0f1 100644
--- a/third_party/WebKit/Source/core/frame/DOMTimerCoordinator.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMTimerCoordinator.cpp
@@ -11,8 +11,7 @@
 
 namespace blink {
 
-DOMTimerCoordinator::DOMTimerCoordinator(
-    std::unique_ptr<WebTaskRunner> timerTaskRunner)
+DOMTimerCoordinator::DOMTimerCoordinator(RefPtr<WebTaskRunner> timerTaskRunner)
     : m_circularSequentialID(0),
       m_timerNestingLevel(0),
       m_timerTaskRunner(std::move(timerTaskRunner)) {}
@@ -67,7 +66,7 @@
 }
 
 void DOMTimerCoordinator::setTimerTaskRunner(
-    std::unique_ptr<WebTaskRunner> timerTaskRunner) {
+    RefPtr<WebTaskRunner> timerTaskRunner) {
   m_timerTaskRunner = std::move(timerTaskRunner);
 }
 
diff --git a/third_party/WebKit/Source/core/frame/DOMTimerCoordinator.h b/third_party/WebKit/Source/core/frame/DOMTimerCoordinator.h
index 4daceb41..b375d7f7 100644
--- a/third_party/WebKit/Source/core/frame/DOMTimerCoordinator.h
+++ b/third_party/WebKit/Source/core/frame/DOMTimerCoordinator.h
@@ -26,7 +26,7 @@
   WTF_MAKE_NONCOPYABLE(DOMTimerCoordinator);
 
  public:
-  explicit DOMTimerCoordinator(std::unique_ptr<WebTaskRunner>);
+  explicit DOMTimerCoordinator(RefPtr<WebTaskRunner>);
 
   // Creates and installs a new timer. Returns the assigned ID.
   int installNewTimeout(ExecutionContext*,
@@ -51,9 +51,9 @@
   // deeper timer nesting level, see DOMTimer::DOMTimer.
   void setTimerNestingLevel(int level) { m_timerNestingLevel = level; }
 
-  void setTimerTaskRunner(std::unique_ptr<WebTaskRunner>);
+  void setTimerTaskRunner(RefPtr<WebTaskRunner>);
 
-  WebTaskRunner* timerTaskRunner() const { return m_timerTaskRunner.get(); }
+  RefPtr<WebTaskRunner> timerTaskRunner() const { return m_timerTaskRunner; }
 
   DECLARE_TRACE();  // Oilpan.
 
@@ -65,7 +65,7 @@
 
   int m_circularSequentialID;
   int m_timerNestingLevel;
-  std::unique_ptr<WebTaskRunner> m_timerTaskRunner;
+  RefPtr<WebTaskRunner> m_timerTaskRunner;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/Deprecation.cpp b/third_party/WebKit/Source/core/frame/Deprecation.cpp
index bc1957e..f826cc0 100644
--- a/third_party/WebKit/Source/core/frame/Deprecation.cpp
+++ b/third_party/WebKit/Source/core/frame/Deprecation.cpp
@@ -357,18 +357,6 @@
              "https://www.chromestatus.com/features/6750456638341120 for more "
              "details.";
 
-    case UseCounter::PrefixedPerformanceClearResourceTimings:
-      return replacedBy("'Performance.webkitClearResourceTimings'",
-                        "'Performance.clearResourceTimings'");
-
-    case UseCounter::PrefixedPerformanceSetResourceTimingBufferSize:
-      return replacedBy("'Performance.webkitSetResourceTimingBufferSize'",
-                        "'Performance.setResourceTimingBufferSize'");
-
-    case UseCounter::PrefixedPerformanceResourceTimingBufferFull:
-      return replacedBy("'Performance.onwebkitresourcetimingbufferfull'",
-                        "'Performance.onresourcetimingbufferfull'");
-
     case UseCounter::EncryptedMediaAllSelectedContentTypesMissingCodecs:
       return String::format(
           "EME requires that contentType strings accepted by "
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index 976a6f63..483b20d 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -274,7 +274,10 @@
 LocalDOMWindow::LocalDOMWindow(LocalFrame& frame)
     : m_frame(&frame),
       m_visualViewport(DOMVisualViewport::create(this)),
-      m_unusedPreloadsTimer(this, &LocalDOMWindow::warnUnusedPreloads),
+      m_unusedPreloadsTimer(
+          TaskRunnerHelper::get(TaskType::UnspecedTimer, &frame),
+          this,
+          &LocalDOMWindow::warnUnusedPreloads),
       m_shouldPrintWhenFinishedLoading(false),
       m_customElements(this, nullptr) {}
 
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
index 7903760..337297b 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
@@ -263,7 +263,7 @@
   Member<LocalFrame> m_frame;
   Member<Document> m_document;
   Member<DOMVisualViewport> m_visualViewport;
-  Timer<LocalDOMWindow> m_unusedPreloadsTimer;
+  TaskRunnerTimer<LocalDOMWindow> m_unusedPreloadsTimer;
 
   bool m_shouldPrintWhenFinishedLoading;
 
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
index 1907c61..f866542c 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
@@ -148,8 +148,9 @@
 
     // Rasterize upfront, since DragImage::create() is going to do it anyway
     // (SkImage::asLegacyBitmap).
-    sk_sp<SkSurface> surface =
-        SkSurface::MakeRasterN32Premul(m_bounds.width(), m_bounds.height());
+    SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry);
+    sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(
+        m_bounds.width(), m_bounds.height(), &surfaceProps);
     if (!surface)
       return nullptr;
 
diff --git a/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp b/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp
index edf24cf..6000fdc 100644
--- a/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp
+++ b/third_party/WebKit/Source/core/frame/SubresourceIntegrity.cpp
@@ -7,6 +7,7 @@
 #include "core/HTMLNames.h"
 #include "core/dom/Document.h"
 #include "core/dom/Element.h"
+#include "core/dom/ExecutionContext.h"
 #include "core/fetch/Resource.h"
 #include "core/frame/UseCounter.h"
 #include "core/inspector/ConsoleMessage.h"
@@ -38,8 +39,9 @@
   return c >= 0x21 && c <= 0x7e;
 }
 
-static void logErrorToConsole(const String& message, Document& document) {
-  document.addConsoleMessage(ConsoleMessage::create(
+static void logErrorToConsole(const String& message,
+                              ExecutionContext& executionContext) {
+  executionContext.addConsoleMessage(ConsoleMessage::create(
       SecurityMessageSource, ErrorMessageLevel, message));
 }
 
@@ -156,18 +158,18 @@
     const char* content,
     size_t size,
     const KURL& resourceUrl,
-    Document& document,
+    ExecutionContext& executionContext,
     String& errorMessage) {
   IntegrityMetadataSet metadataSet;
-  IntegrityParseResult integrityParseResult =
-      parseIntegrityAttribute(integrityMetadata, metadataSet, &document);
+  IntegrityParseResult integrityParseResult = parseIntegrityAttribute(
+      integrityMetadata, metadataSet, &executionContext);
   // On failed parsing, there's no need to log an error here, as
   // parseIntegrityAttribute() will output an appropriate console message.
   if (integrityParseResult != IntegrityParseValidResult)
     return true;
 
   return CheckSubresourceIntegrity(metadataSet, content, size, resourceUrl,
-                                   document, errorMessage);
+                                   executionContext, errorMessage);
 }
 
 bool SubresourceIntegrity::CheckSubresourceIntegrity(
@@ -175,7 +177,7 @@
     const char* content,
     size_t size,
     const KURL& resourceUrl,
-    Document& document,
+    ExecutionContext& executionContext,
     String& errorMessage) {
   if (!metadataSet.size())
     return true;
@@ -202,7 +204,7 @@
                                  hashVector.size());
 
       if (DigestsEqual(digest, convertedHashVector)) {
-        UseCounter::count(document,
+        UseCounter::count(&executionContext,
                           UseCounter::SRIElementWithMatchingIntegrityAttribute);
         return true;
       }
@@ -226,7 +228,7 @@
         "There was an error computing an integrity value for resource '" +
         resourceUrl.elidedString() + "'. The resource has been blocked.";
   }
-  UseCounter::count(document,
+  UseCounter::count(&executionContext,
                     UseCounter::SRIElementWithNonMatchingIntegrityAttribute);
   return false;
 }
@@ -317,9 +319,10 @@
 }
 
 SubresourceIntegrity::IntegrityParseResult
-SubresourceIntegrity::parseIntegrityAttribute(const WTF::String& attribute,
-                                              IntegrityMetadataSet& metadataSet,
-                                              Document* document) {
+SubresourceIntegrity::parseIntegrityAttribute(
+    const WTF::String& attribute,
+    IntegrityMetadataSet& metadataSet,
+    ExecutionContext* executionContext) {
   Vector<UChar> characters;
   attribute.stripWhiteSpace().appendTo(characters);
   const UChar* position = characters.data();
@@ -351,13 +354,14 @@
       // Unknown hash algorithms are treated as if they're not present,
       // and thus are not marked as an error, they're just skipped.
       skipUntil<UChar, isASCIISpace>(position, end);
-      if (document) {
+      if (executionContext) {
         logErrorToConsole("Error parsing 'integrity' attribute ('" + attribute +
                               "'). The specified hash algorithm must be one of "
                               "'sha256', 'sha384', or 'sha512'.",
-                          *document);
+                          *executionContext);
         UseCounter::count(
-            *document, UseCounter::SRIElementWithUnparsableIntegrityAttribute);
+            executionContext,
+            UseCounter::SRIElementWithUnparsableIntegrityAttribute);
       }
       continue;
     }
@@ -365,14 +369,15 @@
     if (parseResult == AlgorithmUnparsable) {
       error = true;
       skipUntil<UChar, isASCIISpace>(position, end);
-      if (document) {
+      if (executionContext) {
         logErrorToConsole("Error parsing 'integrity' attribute ('" + attribute +
                               "'). The hash algorithm must be one of 'sha256', "
                               "'sha384', or 'sha512', followed by a '-' "
                               "character.",
-                          *document);
+                          *executionContext);
         UseCounter::count(
-            *document, UseCounter::SRIElementWithUnparsableIntegrityAttribute);
+            executionContext,
+            UseCounter::SRIElementWithUnparsableIntegrityAttribute);
       }
       continue;
     }
@@ -382,13 +387,14 @@
     if (!parseDigest(position, currentIntegrityEnd, digest)) {
       error = true;
       skipUntil<UChar, isASCIISpace>(position, end);
-      if (document) {
+      if (executionContext) {
         logErrorToConsole(
             "Error parsing 'integrity' attribute ('" + attribute +
                 "'). The digest must be a valid, base64-encoded value.",
-            *document);
+            *executionContext);
         UseCounter::count(
-            *document, UseCounter::SRIElementWithUnparsableIntegrityAttribute);
+            executionContext,
+            UseCounter::SRIElementWithUnparsableIntegrityAttribute);
       }
       continue;
     }
@@ -400,11 +406,12 @@
     if (skipExactly<UChar>(position, end, '?')) {
       const UChar* begin = position;
       skipWhile<UChar, isValueCharacter>(position, end);
-      if (begin != position && document)
+      if (begin != position && executionContext) {
         logErrorToConsole(
             "Ignoring unrecogized 'integrity' attribute option '" +
                 String(begin, position - begin) + "'.",
-            *document);
+            *executionContext);
+      }
     }
 
     IntegrityMetadata integrityMetadata(digest, algorithm);
diff --git a/third_party/WebKit/Source/core/frame/SubresourceIntegrity.h b/third_party/WebKit/Source/core/frame/SubresourceIntegrity.h
index 1f9bddbe..b42f7b8 100644
--- a/third_party/WebKit/Source/core/frame/SubresourceIntegrity.h
+++ b/third_party/WebKit/Source/core/frame/SubresourceIntegrity.h
@@ -14,8 +14,8 @@
 
 namespace blink {
 
-class Document;
 class Element;
+class ExecutionContext;
 class KURL;
 class Resource;
 
@@ -46,13 +46,13 @@
                                         const char*,
                                         size_t,
                                         const KURL& resourceUrl,
-                                        Document&,
+                                        ExecutionContext&,
                                         WTF::String&);
   static bool CheckSubresourceIntegrity(const IntegrityMetadataSet&,
                                         const char*,
                                         size_t,
                                         const KURL& resourceUrl,
-                                        Document&,
+                                        ExecutionContext&,
                                         WTF::String&);
 
   // The IntegrityMetadataSet arguments are out parameters which contain the
@@ -63,7 +63,7 @@
   static IntegrityParseResult parseIntegrityAttribute(
       const WTF::String& attribute,
       IntegrityMetadataSet&,
-      Document*);
+      ExecutionContext*);
 
  private:
   friend class SubresourceIntegrityTest;
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h
index 0cb7058..ed95a79f 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.h
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -270,8 +270,6 @@
     SelectionSetPosition = 327,
     AnimationFinishEvent = 328,
     SVGSVGElementInXMLDocument = 329,
-    PrefixedPerformanceClearResourceTimings = 341,
-    PrefixedPerformanceSetResourceTimingBufferSize = 342,
     EventSrcElement = 343,
     EventCancelBubble = 344,
     EventPath = 345,
@@ -682,7 +680,6 @@
     LinkRelPrefetch = 917,
     LinkRelPrerender = 918,
     LinkRelNext = 919,
-    PrefixedPerformanceResourceTimingBufferFull = 920,
     CSSValuePrefixedMinContent = 921,
     CSSValuePrefixedMaxContent = 922,
     CSSValuePrefixedFitContent = 923,
diff --git a/third_party/WebKit/Source/core/html/HTMLElement.cpp b/third_party/WebKit/Source/core/html/HTMLElement.cpp
index 729ac0e..deaffb10 100644
--- a/third_party/WebKit/Source/core/html/HTMLElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLElement.cpp
@@ -430,11 +430,14 @@
   Element::attributeChanged(params);
   if (params.reason != AttributeModificationReason::kDirectly)
     return;
-  if (adjustedFocusedElementInTreeScope() != this)
-    return;
+  // adjustedFocusedElementInTreeScope() is not trivial. We should check
+  // attribute names, then call adjustedFocusedElementInTreeScope().
   if (params.name == hiddenAttr && !params.newValue.isNull()) {
-    blur();
+    if (adjustedFocusedElementInTreeScope() == this)
+      blur();
   } else if (params.name == contenteditableAttr) {
+    if (adjustedFocusedElementInTreeScope() != this)
+      return;
     // The attribute change may cause supportsFocus() to return false
     // for the element which had focus.
     //
diff --git a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp
index 152defdd..49b3dbe 100644
--- a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp
+++ b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.cpp
@@ -88,7 +88,7 @@
 
 WeakPtr<BackgroundHTMLParser> BackgroundHTMLParser::create(
     std::unique_ptr<Configuration> config,
-    std::unique_ptr<WebTaskRunner> loadingTaskRunner) {
+    RefPtr<WebTaskRunner> loadingTaskRunner) {
   auto* backgroundParser =
       new BackgroundHTMLParser(std::move(config), std::move(loadingTaskRunner));
   return backgroundParser->m_weakFactory.createWeakPtr();
@@ -109,7 +109,7 @@
 
 BackgroundHTMLParser::BackgroundHTMLParser(
     std::unique_ptr<Configuration> config,
-    std::unique_ptr<WebTaskRunner> loadingTaskRunner)
+    RefPtr<WebTaskRunner> loadingTaskRunner)
     : m_weakFactory(this),
       m_token(WTF::wrapUnique(new HTMLToken)),
       m_tokenizer(HTMLTokenizer::create(config->options)),
diff --git a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h
index 0b4482a1..b201655 100644
--- a/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h
+++ b/third_party/WebKit/Source/core/html/parser/BackgroundHTMLParser.h
@@ -71,7 +71,7 @@
   // thread: it must first be initialized by calling init(), and free by
   // calling stop().
   static WeakPtr<BackgroundHTMLParser> create(std::unique_ptr<Configuration>,
-                                              std::unique_ptr<WebTaskRunner>);
+                                              RefPtr<WebTaskRunner>);
   void init(const KURL& documentURL,
             std::unique_ptr<CachedDocumentParameters>,
             const MediaValuesCached::MediaValuesCachedData&);
@@ -101,8 +101,7 @@
   void forcePlaintextForTextDocument();
 
  private:
-  BackgroundHTMLParser(std::unique_ptr<Configuration>,
-                       std::unique_ptr<WebTaskRunner>);
+  BackgroundHTMLParser(std::unique_ptr<Configuration>, RefPtr<WebTaskRunner>);
   ~BackgroundHTMLParser();
 
   void appendDecodedBytes(const String&);
@@ -140,7 +139,7 @@
   std::unique_ptr<TokenPreloadScanner> m_preloadScanner;
   std::unique_ptr<TextResourceDecoder> m_decoder;
   DocumentEncodingData m_lastSeenEncodingData;
-  std::unique_ptr<WebTaskRunner> m_loadingTaskRunner;
+  RefPtr<WebTaskRunner> m_loadingTaskRunner;
   RefPtr<TokenizedChunkQueue> m_tokenizedChunkQueue;
 
   // Index into |m_pendingTokens| of the last <meta> csp token found. Will be
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
index ab1e39d..d3d8d1e 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.cpp
@@ -133,7 +133,7 @@
                       ? HTMLTokenizer::create(m_options)
                       : nullptr),
       m_loadingTaskRunner(
-          TaskRunnerHelper::get(TaskType::Networking, &document)->clone()),
+          TaskRunnerHelper::get(TaskType::Networking, &document)),
       m_parserScheduler(
           syncPolicy == AllowAsynchronousParsing
               ? HTMLParserScheduler::create(this, m_loadingTaskRunner.get())
@@ -851,8 +851,8 @@
 
   // The background parser is created on the main thread, but may otherwise
   // only be used from the parser thread.
-  m_backgroundParser = BackgroundHTMLParser::create(
-      std::move(config), m_loadingTaskRunner->clone());
+  m_backgroundParser =
+      BackgroundHTMLParser::create(std::move(config), m_loadingTaskRunner);
   // TODO(csharrison): This is a hack to initialize MediaValuesCached on the
   // correct thread. We should get rid of it.
   postTaskToLookaheadParser(
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h
index 108fdac..d7c213e 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h
+++ b/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h
@@ -258,7 +258,7 @@
   // A scanner used only for input provided to the insert() method.
   std::unique_ptr<HTMLPreloadScanner> m_insertionPreloadScanner;
 
-  std::unique_ptr<WebTaskRunner> m_loadingTaskRunner;
+  RefPtr<WebTaskRunner> m_loadingTaskRunner;
   Member<HTMLParserScheduler> m_parserScheduler;
   HTMLSourceTracker m_sourceTracker;
   TextPosition m_textPosition;
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp
index f651555..9802d5a 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.cpp
@@ -56,10 +56,11 @@
   m_processedElementTokens += count;
 }
 
-HTMLParserScheduler::HTMLParserScheduler(HTMLDocumentParser* parser,
-                                         WebTaskRunner* loadingTaskRunner)
+HTMLParserScheduler::HTMLParserScheduler(
+    HTMLDocumentParser* parser,
+    RefPtr<WebTaskRunner> loadingTaskRunner)
     : m_parser(parser),
-      m_loadingTaskRunner(loadingTaskRunner->clone()),
+      m_loadingTaskRunner(std::move(loadingTaskRunner)),
       m_isSuspendedWithActiveTimer(false) {}
 
 HTMLParserScheduler::~HTMLParserScheduler() {}
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.h b/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.h
index c278799..81bfe19 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.h
+++ b/third_party/WebKit/Source/core/html/parser/HTMLParserScheduler.h
@@ -67,8 +67,8 @@
 
  public:
   static HTMLParserScheduler* create(HTMLDocumentParser* parser,
-                                     WebTaskRunner* loadingTaskRunner) {
-    return new HTMLParserScheduler(parser, loadingTaskRunner);
+                                     RefPtr<WebTaskRunner> loadingTaskRunner) {
+    return new HTMLParserScheduler(parser, std::move(loadingTaskRunner));
   }
   ~HTMLParserScheduler();
 
@@ -93,13 +93,13 @@
   DECLARE_TRACE();
 
  private:
-  HTMLParserScheduler(HTMLDocumentParser*, WebTaskRunner*);
+  HTMLParserScheduler(HTMLDocumentParser*, RefPtr<WebTaskRunner>);
 
   bool shouldYield(const SpeculationsPumpSession&, bool startingScript) const;
   void continueParsing();
 
   Member<HTMLDocumentParser> m_parser;
-  std::unique_ptr<WebTaskRunner> m_loadingTaskRunner;
+  RefPtr<WebTaskRunner> m_loadingTaskRunner;
 
   TaskHandle m_cancellableContinueParseTaskHandle;
   bool m_isSuspendedWithActiveTimer;
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp
index bee46e6..2fa3ee2 100644
--- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp
+++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.cpp
@@ -260,20 +260,20 @@
       BackgroundTaskRunner::TaskSizeShortRunningTask;
   if (arrayBuffer->byteLength() >= longTaskByteLengthThreshold)
     taskSize = BackgroundTaskRunner::TaskSizeLongRunningTask;
-  WebTaskRunner* taskRunner =
+  RefPtr<WebTaskRunner> taskRunner =
       Platform::current()->currentThread()->getWebTaskRunner();
   BackgroundTaskRunner::postOnBackgroundThread(
       BLINK_FROM_HERE,
       crossThreadBind(
           &ImageBitmapFactories::ImageBitmapLoader::decodeImageOnDecoderThread,
-          wrapCrossThreadPersistent(this), crossThreadUnretained(taskRunner),
+          wrapCrossThreadPersistent(this), std::move(taskRunner),
           wrapCrossThreadPersistent(arrayBuffer), m_options.premultiplyAlpha(),
           m_options.colorSpaceConversion()),
       taskSize);
 }
 
 void ImageBitmapFactories::ImageBitmapLoader::decodeImageOnDecoderThread(
-    WebTaskRunner* taskRunner,
+    RefPtr<WebTaskRunner> taskRunner,
     DOMArrayBuffer* arrayBuffer,
     const String& premultiplyAlphaOption,
     const String& colorSpaceConversionOption) {
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.h b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.h
index e2aa3fb..7add425 100644
--- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.h
+++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.h
@@ -129,7 +129,7 @@
     void rejectPromise();
 
     void scheduleAsyncImageBitmapDecoding(DOMArrayBuffer*);
-    void decodeImageOnDecoderThread(WebTaskRunner*,
+    void decodeImageOnDecoderThread(RefPtr<WebTaskRunner>,
                                     DOMArrayBuffer*,
                                     const String& premultiplyAlphaOption,
                                     const String& colorSpaceConversionOption);
diff --git a/third_party/WebKit/Source/core/layout/ImageQualityControllerTest.cpp b/third_party/WebKit/Source/core/layout/ImageQualityControllerTest.cpp
index 3fcc3ca5..07834b3 100644
--- a/third_party/WebKit/Source/core/layout/ImageQualityControllerTest.cpp
+++ b/third_party/WebKit/Source/core/layout/ImageQualityControllerTest.cpp
@@ -154,7 +154,7 @@
 
   static std::unique_ptr<MockTimer> create(ImageQualityController* o,
                                            TimerFiredFunction f) {
-    auto taskRunner = WTF::wrapUnique(new scheduler::FakeWebTaskRunner);
+    auto taskRunner = adoptRef(new scheduler::FakeWebTaskRunner);
     return WTF::wrapUnique(new MockTimer(std::move(taskRunner), o, f));
   }
 
@@ -166,13 +166,13 @@
   void setTime(double newTime) { m_taskRunner->setTime(newTime); }
 
  private:
-  MockTimer(std::unique_ptr<scheduler::FakeWebTaskRunner> taskRunner,
+  MockTimer(RefPtr<scheduler::FakeWebTaskRunner> taskRunner,
             ImageQualityController* o,
             TimerFiredFunction f)
-      : TaskRunnerTimer(taskRunner.get(), o, f),
+      : TaskRunnerTimer(taskRunner, o, f),
         m_taskRunner(std::move(taskRunner)) {}
 
-  std::unique_ptr<scheduler::FakeWebTaskRunner> m_taskRunner;
+  RefPtr<scheduler::FakeWebTaskRunner> m_taskRunner;
 
   DISALLOW_COPY_AND_ASSIGN(MockTimer);
 };
diff --git a/third_party/WebKit/Source/core/layout/LayoutTheme.h b/third_party/WebKit/Source/core/layout/LayoutTheme.h
index 598e5a8..9744221 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTheme.h
+++ b/third_party/WebKit/Source/core/layout/LayoutTheme.h
@@ -58,6 +58,10 @@
 
   virtual ThemePainter& painter() = 0;
 
+  // This function is called after associated WebThemeEngine instance
+  // was replaced. This is called only in tests.
+  virtual void didChangeThemeEngine() {}
+
   static void setSizeIfAuto(ComputedStyle&, const IntSize&);
 
   // This method is called whenever style has been computed for an element and
diff --git a/third_party/WebKit/Source/core/layout/LayoutThemeDefault.cpp b/third_party/WebKit/Source/core/layout/LayoutThemeDefault.cpp
index 53356ee..728b3e3 100644
--- a/third_party/WebKit/Source/core/layout/LayoutThemeDefault.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutThemeDefault.cpp
@@ -363,6 +363,10 @@
   return originalSize * style.effectiveZoom();
 }
 
+void LayoutThemeDefault::didChangeThemeEngine() {
+  m_menuListArrowWidthInDIP = 0;
+}
+
 // static
 void LayoutThemeDefault::setDefaultFontSize(int fontSize) {
   LayoutThemeFontProvider::setDefaultFontSize(fontSize);
diff --git a/third_party/WebKit/Source/core/layout/LayoutThemeDefault.h b/third_party/WebKit/Source/core/layout/LayoutThemeDefault.h
index 498edfd..c577078 100644
--- a/third_party/WebKit/Source/core/layout/LayoutThemeDefault.h
+++ b/third_party/WebKit/Source/core/layout/LayoutThemeDefault.h
@@ -147,6 +147,7 @@
 
  private:
   ThemePainter& painter() override { return m_painter; }
+  void didChangeThemeEngine() override;
 
   int menuListInternalPadding(const ComputedStyle&, int padding) const;
 
diff --git a/third_party/WebKit/Source/core/loader/EmptyClients.cpp b/third_party/WebKit/Source/core/loader/EmptyClients.cpp
index c4eb99b5..6fc8717d 100644
--- a/third_party/WebKit/Source/core/loader/EmptyClients.cpp
+++ b/third_party/WebKit/Source/core/loader/EmptyClients.cpp
@@ -73,20 +73,20 @@
  public:
   EmptyFrameScheduler() { DCHECK(isMainThread()); }
   void setFrameVisible(bool) override {}
-  WebTaskRunner* loadingTaskRunner() override;
-  WebTaskRunner* timerTaskRunner() override;
-  WebTaskRunner* unthrottledTaskRunner() override;
+  RefPtr<WebTaskRunner> loadingTaskRunner() override;
+  RefPtr<WebTaskRunner> timerTaskRunner() override;
+  RefPtr<WebTaskRunner> unthrottledTaskRunner() override;
 };
 
-WebTaskRunner* EmptyFrameScheduler::loadingTaskRunner() {
+RefPtr<WebTaskRunner> EmptyFrameScheduler::loadingTaskRunner() {
   return Platform::current()->mainThread()->getWebTaskRunner();
 }
 
-WebTaskRunner* EmptyFrameScheduler::timerTaskRunner() {
+RefPtr<WebTaskRunner> EmptyFrameScheduler::timerTaskRunner() {
   return Platform::current()->mainThread()->getWebTaskRunner();
 }
 
-WebTaskRunner* EmptyFrameScheduler::unthrottledTaskRunner() {
+RefPtr<WebTaskRunner> EmptyFrameScheduler::unthrottledTaskRunner() {
   return Platform::current()->mainThread()->getWebTaskRunner();
 }
 
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
index 355011b..809ae74e 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
@@ -994,7 +994,7 @@
   return priority;
 }
 
-WebTaskRunner* FrameFetchContext::loadingTaskRunner() const {
+RefPtr<WebTaskRunner> FrameFetchContext::loadingTaskRunner() const {
   return frame()->frameScheduler()->loadingTaskRunner();
 }
 
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.h b/third_party/WebKit/Source/core/loader/FrameFetchContext.h
index 19aab59..57a534c 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContext.h
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.h
@@ -155,7 +155,7 @@
   ResourceLoadPriority modifyPriorityForExperiments(
       ResourceLoadPriority) override;
 
-  WebTaskRunner* loadingTaskRunner() const override;
+  RefPtr<WebTaskRunner> loadingTaskRunner() const override;
 
   DECLARE_VIRTUAL_TRACE();
 
diff --git a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
index 372dd6a4..cf094436 100644
--- a/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
+++ b/third_party/WebKit/Source/core/loader/resource/ImageResourceTest.cpp
@@ -182,13 +182,13 @@
     return ResourceRequestBlockedReason::None;
   }
   bool shouldLoadNewResource(Resource::Type) const override { return true; }
-  WebTaskRunner* loadingTaskRunner() const override { return m_runner.get(); }
+  RefPtr<WebTaskRunner> loadingTaskRunner() const override { return m_runner; }
 
  private:
   ImageResourceTestMockFetchContext()
-      : m_runner(WTF::wrapUnique(new scheduler::FakeWebTaskRunner)) {}
+      : m_runner(adoptRef(new scheduler::FakeWebTaskRunner)) {}
 
-  std::unique_ptr<scheduler::FakeWebTaskRunner> m_runner;
+  RefPtr<scheduler::FakeWebTaskRunner> m_runner;
 };
 
 // Convenience class that registers a mocked URL load on construction, and
diff --git a/third_party/WebKit/Source/core/timing/Performance.idl b/third_party/WebKit/Source/core/timing/Performance.idl
index bfe27d5..0140c467 100644
--- a/third_party/WebKit/Source/core/timing/Performance.idl
+++ b/third_party/WebKit/Source/core/timing/Performance.idl
@@ -51,11 +51,6 @@
     void setResourceTimingBufferSize(unsigned long maxSize);
     attribute EventHandler onresourcetimingbufferfull;
 
-    // TODO(ksakamoto): Remove these prefixed APIs.
-    [DeprecateAs=PrefixedPerformanceClearResourceTimings, ImplementedAs=clearResourceTimings] void webkitClearResourceTimings();
-    [DeprecateAs=PrefixedPerformanceSetResourceTimingBufferSize, ImplementedAs=setResourceTimingBufferSize] void webkitSetResourceTimingBufferSize(unsigned long maxSize);
-    [DeprecateAs=PrefixedPerformanceResourceTimingBufferFull] attribute EventHandler onwebkitresourcetimingbufferfull;
-
     // Navigation Timing
     // https://w3c.github.io/navigation-timing/#extensions-to-the-performance-interface
     [SameObject, Measure] readonly attribute PerformanceTiming timing;
diff --git a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
index 320aad6..df50c03 100644
--- a/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
+++ b/third_party/WebKit/Source/core/timing/PerformanceBase.cpp
@@ -222,11 +222,8 @@
 
 void PerformanceBase::setResourceTimingBufferSize(unsigned size) {
   m_resourceTimingBufferSize = size;
-  if (isResourceTimingBufferFull()) {
+  if (isResourceTimingBufferFull())
     dispatchEvent(Event::create(EventTypeNames::resourcetimingbufferfull));
-    dispatchEvent(
-        Event::create(EventTypeNames::webkitresourcetimingbufferfull));
-  }
 }
 
 void PerformanceBase::clearFrameTimings() {
@@ -406,11 +403,8 @@
 void PerformanceBase::addResourceTimingBuffer(PerformanceEntry& entry) {
   m_resourceTimingBuffer.push_back(&entry);
 
-  if (isResourceTimingBufferFull()) {
+  if (isResourceTimingBufferFull())
     dispatchEvent(Event::create(EventTypeNames::resourcetimingbufferfull));
-    dispatchEvent(
-        Event::create(EventTypeNames::webkitresourcetimingbufferfull));
-  }
 }
 
 bool PerformanceBase::isResourceTimingBufferFull() {
diff --git a/third_party/WebKit/Source/core/timing/PerformanceBase.h b/third_party/WebKit/Source/core/timing/PerformanceBase.h
index d455a48..508f492b 100644
--- a/third_party/WebKit/Source/core/timing/PerformanceBase.h
+++ b/third_party/WebKit/Source/core/timing/PerformanceBase.h
@@ -96,7 +96,6 @@
   void setResourceTimingBufferSize(unsigned);
 
   DEFINE_ATTRIBUTE_EVENT_LISTENER(resourcetimingbufferfull);
-  DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitresourcetimingbufferfull);
 
   void clearFrameTimings();
   void setFrameTimingBufferSize(unsigned);
diff --git a/third_party/WebKit/Source/core/workers/ParentFrameTaskRunners.cpp b/third_party/WebKit/Source/core/workers/ParentFrameTaskRunners.cpp
index ad238eeb..e0dd0e4 100644
--- a/third_party/WebKit/Source/core/workers/ParentFrameTaskRunners.cpp
+++ b/third_party/WebKit/Source/core/workers/ParentFrameTaskRunners.cpp
@@ -25,7 +25,7 @@
   }
 }
 
-WebTaskRunner* ParentFrameTaskRunners::get(TaskType type) {
+RefPtr<WebTaskRunner> ParentFrameTaskRunners::get(TaskType type) {
   MutexLocker lock(m_taskRunnersMutex);
   return m_taskRunners.get(type);
 }
diff --git a/third_party/WebKit/Source/core/workers/ParentFrameTaskRunners.h b/third_party/WebKit/Source/core/workers/ParentFrameTaskRunners.h
index 64f4f30..c8bd52f 100644
--- a/third_party/WebKit/Source/core/workers/ParentFrameTaskRunners.h
+++ b/third_party/WebKit/Source/core/workers/ParentFrameTaskRunners.h
@@ -38,13 +38,15 @@
   }
 
   // Might return nullptr for unsupported task types.
-  WebTaskRunner* get(TaskType);
+  RefPtr<WebTaskRunner> get(TaskType);
 
   DECLARE_VIRTUAL_TRACE();
 
  private:
-  using TaskRunnerHashMap =
-      HashMap<TaskType, WebTaskRunner*, WTF::IntHash<TaskType>, TaskTypeTraits>;
+  using TaskRunnerHashMap = HashMap<TaskType,
+                                    RefPtr<WebTaskRunner>,
+                                    WTF::IntHash<TaskType>,
+                                    TaskTypeTraits>;
 
   // LocalFrame could be nullptr if the worker is not associated with a
   // particular local frame.
diff --git a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
index 4ce3ed5..c7a2b074 100644
--- a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
+++ b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
@@ -317,11 +317,8 @@
       m_closing(false),
       m_eventQueue(WorkerEventQueue::create(this)),
       m_workerClients(workerClients),
-      m_timers(Platform::current()
-                   ->currentThread()
-                   ->scheduler()
-                   ->timerTaskRunner()
-                   ->clone()),
+      m_timers(
+          Platform::current()->currentThread()->scheduler()->timerTaskRunner()),
       m_timeOrigin(timeOrigin),
       m_lastPendingErrorEventId(0) {
   InstanceCounters::incrementCounter(
diff --git a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
index e8bba7b..a694352 100644
--- a/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
+++ b/third_party/WebKit/Source/devtools/front_end/screencast/ScreencastView.js
@@ -127,8 +127,10 @@
     }
     dimensions.width *= window.devicePixelRatio;
     dimensions.height *= window.devicePixelRatio;
+    // Note: startScreencast with and height expect to be integers so must be floored.
     this._target.pageAgent().startScreencast(
-        'jpeg', 80, Math.min(maxImageDimension, dimensions.width), Math.min(maxImageDimension, dimensions.height));
+        'jpeg', 80, Math.floor(Math.min(maxImageDimension, dimensions.width)),
+        Math.floor(Math.min(maxImageDimension, dimensions.height)));
     this._target.emulationAgent().setTouchEmulationEnabled(true);
     this._domModel.setHighlighter(this);
   }
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/View.js b/third_party/WebKit/Source/devtools/front_end/ui/View.js
index a0eef03d..1e157e93 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/View.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/View.js
@@ -442,6 +442,13 @@
     this._materializePromise = Promise.all(promises);
     return this._materializePromise;
   }
+
+  /**
+   * @override
+   */
+  wasShown() {
+    this._materialize();
+  }
 };
 
 /**
@@ -709,7 +716,8 @@
     this.appendView(view, insertBefore);
     this._tabbedPane.selectTab(view.viewId());
     this._tabbedPane.focus();
-    return this._materializeWidget(view);
+    var widget = /** @type {!UI.ViewManager._ContainerWidget} */ (this._tabbedPane.tabView(view.viewId()));
+    return widget._materialize();
   }
 
   /**
@@ -737,8 +745,6 @@
     if (!view)
       return;
 
-    this._materializeWidget(view);
-
     if (view.isCloseable()) {
       var tabs = this._closeableTabSetting.get();
       if (!tabs[tabId]) {
@@ -761,15 +767,6 @@
   }
 
   /**
-   * @param {!UI.View} view
-   * @return {!Promise}
-   */
-  _materializeWidget(view) {
-    var widget = /** @type {!UI.ViewManager._ContainerWidget} */ (this._tabbedPane.tabView(view.viewId()));
-    return widget._materialize();
-  }
-
-  /**
    * @param {!Common.Event} event
    */
   _persistTabOrder(event) {
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothAttributeInstanceMap.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothAttributeInstanceMap.cpp
index 5cfa298e..dcc7a52 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothAttributeInstanceMap.cpp
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothAttributeInstanceMap.cpp
@@ -41,7 +41,6 @@
 BluetoothRemoteGATTCharacteristic*
 BluetoothAttributeInstanceMap::getOrCreateRemoteGATTCharacteristic(
     ExecutionContext* context,
-    const String& serviceInstanceId,
     mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr
         remoteGATTCharacteristic,
     BluetoothRemoteGATTService* service) {
@@ -51,8 +50,7 @@
 
   if (!characteristic) {
     characteristic = BluetoothRemoteGATTCharacteristic::create(
-        context, serviceInstanceId, std::move(remoteGATTCharacteristic),
-        service, m_device);
+        context, std::move(remoteGATTCharacteristic), service, m_device);
     m_characteristicIdToObject.add(instanceId, characteristic);
   }
 
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothAttributeInstanceMap.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothAttributeInstanceMap.h
index 65e55a25b..b5bfd9aa 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothAttributeInstanceMap.h
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothAttributeInstanceMap.h
@@ -44,7 +44,6 @@
   // the map.
   BluetoothRemoteGATTCharacteristic* getOrCreateRemoteGATTCharacteristic(
       ExecutionContext*,
-      const String& serviceInstanceId,
       mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr,
       BluetoothRemoteGATTService*);
 
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp
index ee156e5..a39f953 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.cpp
@@ -51,11 +51,10 @@
 BluetoothRemoteGATTCharacteristic*
 BluetoothDevice::getOrCreateRemoteGATTCharacteristic(
     ExecutionContext* context,
-    const String& serviceInstanceId,
     mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr characteristic,
     BluetoothRemoteGATTService* service) {
   return m_attributeInstanceMap->getOrCreateRemoteGATTCharacteristic(
-      context, serviceInstanceId, std::move(characteristic), service);
+      context, std::move(characteristic), service);
 }
 
 bool BluetoothDevice::isValidCharacteristic(
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h
index 317c43e0..a1798b8 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothDevice.h
@@ -53,7 +53,6 @@
 
   BluetoothRemoteGATTCharacteristic* getOrCreateRemoteGATTCharacteristic(
       ExecutionContext*,
-      const String& serviceInstanceId,
       mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr,
       BluetoothRemoteGATTService*);
   bool isValidCharacteristic(const String& characteristicInstanceId);
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
index 9a55773..49afc52 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.cpp
@@ -42,12 +42,10 @@
 
 BluetoothRemoteGATTCharacteristic::BluetoothRemoteGATTCharacteristic(
     ExecutionContext* context,
-    const String& serviceInstanceId,
     mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr characteristic,
     BluetoothRemoteGATTService* service,
     BluetoothDevice* device)
     : ContextLifecycleObserver(context),
-      m_serviceInstanceId(serviceInstanceId),
       m_characteristic(std::move(characteristic)),
       m_service(service),
       m_stopped(false),
@@ -58,12 +56,11 @@
 
 BluetoothRemoteGATTCharacteristic* BluetoothRemoteGATTCharacteristic::create(
     ExecutionContext* context,
-    const String& serviceInstanceId,
     mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr characteristic,
     BluetoothRemoteGATTService* service,
     BluetoothDevice* device) {
   return new BluetoothRemoteGATTCharacteristic(
-      context, serviceInstanceId, std::move(characteristic), service, device);
+      context, std::move(characteristic), service, device);
 }
 
 void BluetoothRemoteGATTCharacteristic::setValue(DOMDataView* domDataView) {
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h
index 01166db..1d05437 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTCharacteristic.h
@@ -42,14 +42,12 @@
  public:
   explicit BluetoothRemoteGATTCharacteristic(
       ExecutionContext*,
-      const String& serviceInstanceId,
       mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr,
       BluetoothRemoteGATTService*,
       BluetoothDevice*);
 
   static BluetoothRemoteGATTCharacteristic* create(
       ExecutionContext*,
-      const String& serviceInstanceId,
       mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr,
       BluetoothRemoteGATTService*,
       BluetoothDevice*);
@@ -106,7 +104,6 @@
   void NotificationsCallback(ScriptPromiseResolver*,
                              mojom::blink::WebBluetoothResult);
 
-  const String m_serviceInstanceId;
   mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr m_characteristic;
   Member<BluetoothRemoteGATTService> m_service;
   bool m_stopped;
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp
index a338fc0..e25183c 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.cpp
@@ -71,7 +71,7 @@
     if (quantity == mojom::blink::WebBluetoothGATTQueryQuantity::SINGLE) {
       DCHECK_EQ(1u, characteristics->size());
       resolver->resolve(device()->getOrCreateRemoteGATTCharacteristic(
-          resolver->getExecutionContext(), serviceInstanceId,
+          resolver->getExecutionContext(),
           std::move(characteristics.value()[0]), this));
       return;
     }
@@ -81,8 +81,8 @@
     for (auto& characteristic : characteristics.value()) {
       gattCharacteristics.push_back(
           device()->getOrCreateRemoteGATTCharacteristic(
-              resolver->getExecutionContext(), serviceInstanceId,
-              std::move(characteristic), this));
+              resolver->getExecutionContext(), std::move(characteristic),
+              this));
     }
     resolver->resolve(gattCharacteristics);
   } else {
diff --git a/third_party/WebKit/Source/modules/fetch/FetchManager.cpp b/third_party/WebKit/Source/modules/fetch/FetchManager.cpp
index c7e01e5..900b1e9 100644
--- a/third_party/WebKit/Source/modules/fetch/FetchManager.cpp
+++ b/third_party/WebKit/Source/modules/fetch/FetchManager.cpp
@@ -215,7 +215,7 @@
       if (r == WebDataConsumerHandle::Done) {
         if (SubresourceIntegrity::CheckSubresourceIntegrity(
                 m_integrityMetadata, m_buffer.data(), m_buffer.size(), m_url,
-                *m_loader->document(), errorMessage)) {
+                *m_loader->executionContext(), errorMessage)) {
           m_updater->update(
               new FormDataBytesConsumer(m_buffer.data(), m_buffer.size()));
           m_loader->m_resolver->resolve(m_response);
@@ -272,6 +272,7 @@
   void failed(const String& message);
   void notifyFinished();
   Document* document() const;
+  ExecutionContext* executionContext() { return m_executionContext; }
   void loadSucceeded();
 
   Member<FetchManager> m_fetchManager;
diff --git a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp
index e5ed5d5..8f4f9a0 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp
@@ -12,8 +12,8 @@
 #include "modules/fetch/Response.h"
 #include "modules/serviceworkers/ServiceWorkerError.h"
 #include "modules/serviceworkers/ServiceWorkerGlobalScope.h"
+#include "public/platform/WebURLResponse.h"
 #include "public/platform/modules/serviceworker/WebServiceWorkerError.h"
-#include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h"
 #include "wtf/PtrUtil.h"
 #include "wtf/RefPtr.h"
 
@@ -107,7 +107,7 @@
 
 void FetchEvent::onNavigationPreloadResponse(
     ScriptState* scriptState,
-    std::unique_ptr<WebServiceWorkerResponse> response,
+    std::unique_ptr<WebURLResponse> response,
     std::unique_ptr<WebDataConsumerHandle> dataConsumeHandle) {
   if (!scriptState->contextIsValid())
     return;
@@ -117,17 +117,17 @@
       new BodyStreamBuffer(scriptState, new BytesConsumerForDataConsumerHandle(
                                             scriptState->getExecutionContext(),
                                             std::move(dataConsumeHandle))));
-  const WebVector<WebURL>& webURLList = response->urlList();
-  // Navigation preload doesn't support redirect.
-  DCHECK_EQ(1u, webURLList.size());
   Vector<KURL> urlList(1);
-  urlList[0] = webURLList[0];
+  urlList[0] = response->url();
   responseData->setURLList(urlList);
-  responseData->setStatus(response->status());
-  responseData->setStatusMessage(response->statusText());
-  responseData->setResponseTime(response->responseTime());
-  for (const auto& header : response->headers())
+  responseData->setStatus(response->httpStatusCode());
+  responseData->setStatusMessage(response->httpStatusText());
+  responseData->setResponseTime(response->toResourceResponse().responseTime());
+  const HTTPHeaderMap& headers(
+      response->toResourceResponse().httpHeaderFields());
+  for (const auto& header : headers) {
     responseData->headerList()->append(header.key, header.value);
+  }
   FetchResponseData* taintedResponse =
       responseData->createBasicFilteredResponse();
   m_preloadResponseProperty->resolve(
diff --git a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.h b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.h
index b2a15213..bddd967f 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.h
+++ b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.h
@@ -25,7 +25,7 @@
 class ScriptState;
 class WebDataConsumerHandle;
 struct WebServiceWorkerError;
-class WebServiceWorkerResponse;
+class WebURLResponse;
 
 // A fetch event is dispatched by the client to a service worker's script
 // context. RespondWithObserver can be used to notify the client about the
@@ -55,7 +55,7 @@
   ScriptPromise preloadResponse(ScriptState*);
 
   void onNavigationPreloadResponse(ScriptState*,
-                                   std::unique_ptr<WebServiceWorkerResponse>,
+                                   std::unique_ptr<WebURLResponse>,
                                    std::unique_ptr<WebDataConsumerHandle>);
   void onNavigationPreloadError(ScriptState*,
                                 std::unique_ptr<WebServiceWorkerError>);
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLQuery.cpp b/third_party/WebKit/Source/modules/webgl/WebGLQuery.cpp
index 6cb8e79..bd3b22ce 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLQuery.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLQuery.cpp
@@ -22,8 +22,7 @@
       m_queryResultAvailable(false),
       m_queryResult(0),
       m_taskRunner(TaskRunnerHelper::get(TaskType::Unthrottled,
-                                         &ctx->canvas()->document())
-                       ->clone()) {
+                                         &ctx->canvas()->document())) {
   GLuint query;
   ctx->contextGL()->GenQueriesEXT(1, &query);
   setObject(query);
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLQuery.h b/third_party/WebKit/Source/modules/webgl/WebGLQuery.h
index 691c385..27a963b 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLQuery.h
+++ b/third_party/WebKit/Source/modules/webgl/WebGLQuery.h
@@ -54,7 +54,7 @@
   bool m_queryResultAvailable;
   GLuint m_queryResult;
 
-  std::unique_ptr<WebTaskRunner> m_taskRunner;
+  RefPtr<WebTaskRunner> m_taskRunner;
   TaskHandle m_taskHandle;
 };
 
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index 0a8867d..8640a99 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -601,7 +601,7 @@
   creationInfo.contextAttributes = contextAttributes;
   creationInfo.glInfo = glInfo;
   creationInfo.url = url;
-  WebTaskRunner* taskRunner =
+  RefPtr<WebTaskRunner> taskRunner =
       Platform::current()->mainThread()->getWebTaskRunner();
   taskRunner->postTask(BLINK_FROM_HERE,
                        crossThreadBind(&createContextProviderOnMainThread,
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp b/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp
index ff104159..49cb26e4 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp
@@ -23,8 +23,7 @@
       m_queryResultAvailable(false),
       m_queryResult(0),
       m_taskRunner(TaskRunnerHelper::get(TaskType::Unthrottled,
-                                         &ctx->canvas()->document())
-                       ->clone()) {
+                                         &ctx->canvas()->document())) {
   context()->contextGL()->GenQueriesEXT(1, &m_queryId);
 }
 
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.h b/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.h
index b07a763..be2e197d 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.h
+++ b/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.h
@@ -52,7 +52,7 @@
   bool m_queryResultAvailable;
   GLuint64 m_queryResult;
 
-  std::unique_ptr<WebTaskRunner> m_taskRunner;
+  RefPtr<WebTaskRunner> m_taskRunner;
   TaskHandle m_taskHandle;
 };
 
diff --git a/third_party/WebKit/Source/platform/Timer.cpp b/third_party/WebKit/Source/platform/Timer.cpp
index 5e056f8..5ca80d54 100644
--- a/third_party/WebKit/Source/platform/Timer.cpp
+++ b/third_party/WebKit/Source/platform/Timer.cpp
@@ -40,10 +40,10 @@
 
 namespace blink {
 
-TimerBase::TimerBase(WebTaskRunner* webTaskRunner)
+TimerBase::TimerBase(RefPtr<WebTaskRunner> webTaskRunner)
     : m_nextFireTime(0),
       m_repeatInterval(0),
-      m_webTaskRunner(webTaskRunner->clone()),
+      m_webTaskRunner(std::move(webTaskRunner)),
 #if DCHECK_IS_ON()
       m_thread(currentThread()),
 #endif
@@ -85,7 +85,7 @@
   return m_nextFireTime - current;
 }
 
-void TimerBase::moveToNewTaskRunner(WebTaskRunner* taskRunner) {
+void TimerBase::moveToNewTaskRunner(RefPtr<WebTaskRunner> taskRunner) {
 #if DCHECK_IS_ON()
   DCHECK_EQ(m_thread, currentThread());
   DCHECK(taskRunner->runsTasksOnCurrentThread());
@@ -98,7 +98,7 @@
 
   bool active = isActive();
   m_weakPtrFactory.revokeAll();
-  m_webTaskRunner = taskRunner->clone();
+  m_webTaskRunner = std::move(taskRunner);
 
   if (!active)
     return;
@@ -111,17 +111,17 @@
 }
 
 // static
-WebTaskRunner* TimerBase::getTimerTaskRunner() {
+RefPtr<WebTaskRunner> TimerBase::getTimerTaskRunner() {
   return Platform::current()->currentThread()->scheduler()->timerTaskRunner();
 }
 
 // static
-WebTaskRunner* TimerBase::getUnthrottledTaskRunner() {
+RefPtr<WebTaskRunner> TimerBase::getUnthrottledTaskRunner() {
   return Platform::current()->currentThread()->getWebTaskRunner();
 }
 
-WebTaskRunner* TimerBase::timerTaskRunner() const {
-  return m_webTaskRunner.get();
+RefPtr<WebTaskRunner> TimerBase::timerTaskRunner() const {
+  return m_webTaskRunner;
 }
 
 void TimerBase::setNextFireTime(double now, double delay) {
diff --git a/third_party/WebKit/Source/platform/Timer.h b/third_party/WebKit/Source/platform/Timer.h
index 1af4cfc..caddaee 100644
--- a/third_party/WebKit/Source/platform/Timer.h
+++ b/third_party/WebKit/Source/platform/Timer.h
@@ -46,7 +46,7 @@
   WTF_MAKE_NONCOPYABLE(TimerBase);
 
  public:
-  explicit TimerBase(WebTaskRunner*);
+  explicit TimerBase(RefPtr<WebTaskRunner>);
   virtual ~TimerBase();
 
   void start(double nextFireInterval,
@@ -75,20 +75,20 @@
     m_repeatInterval += delta;
   }
 
-  void moveToNewTaskRunner(WebTaskRunner*);
+  void moveToNewTaskRunner(RefPtr<WebTaskRunner>);
 
   struct PLATFORM_EXPORT Comparator {
     bool operator()(const TimerBase* a, const TimerBase* b) const;
   };
 
  protected:
-  static WebTaskRunner* getTimerTaskRunner();
-  static WebTaskRunner* getUnthrottledTaskRunner();
+  static RefPtr<WebTaskRunner> getTimerTaskRunner();
+  static RefPtr<WebTaskRunner> getUnthrottledTaskRunner();
 
  private:
   virtual void fired() = 0;
 
-  virtual WebTaskRunner* timerTaskRunner() const;
+  virtual RefPtr<WebTaskRunner> timerTaskRunner() const;
 
   NO_SANITIZE_ADDRESS
   virtual bool canFire() const { return true; }
@@ -102,7 +102,7 @@
   double m_nextFireTime;    // 0 if inactive
   double m_repeatInterval;  // 0 if not repeating
   WebTraceLocation m_location;
-  std::unique_ptr<WebTaskRunner> m_webTaskRunner;
+  RefPtr<WebTaskRunner> m_webTaskRunner;
 
 #if DCHECK_IS_ON()
   ThreadIdentifier m_thread;
@@ -133,10 +133,10 @@
  public:
   using TimerFiredFunction = void (TimerFiredClass::*)(TimerBase*);
 
-  TaskRunnerTimer(WebTaskRunner* webTaskRunner,
+  TaskRunnerTimer(RefPtr<WebTaskRunner> webTaskRunner,
                   TimerFiredClass* o,
                   TimerFiredFunction f)
-      : TimerBase(webTaskRunner), m_object(o), m_function(f) {}
+      : TimerBase(std::move(webTaskRunner)), m_object(o), m_function(f) {}
 
   ~TaskRunnerTimer() override {}
 
diff --git a/third_party/WebKit/Source/platform/TimerTest.cpp b/third_party/WebKit/Source/platform/TimerTest.cpp
index d5ccc0a5..fe471f0 100644
--- a/third_party/WebKit/Source/platform/TimerTest.cpp
+++ b/third_party/WebKit/Source/platform/TimerTest.cpp
@@ -526,10 +526,10 @@
 
   ~TimerForTest() override {}
 
-  TimerForTest(WebTaskRunner* webTaskRunner,
+  TimerForTest(RefPtr<WebTaskRunner> webTaskRunner,
                TimerFiredClass* timerFiredClass,
                TimerFiredFunction timerFiredFunction)
-      : TaskRunnerTimer<TimerFiredClass>(webTaskRunner,
+      : TaskRunnerTimer<TimerFiredClass>(std::move(webTaskRunner),
                                          timerFiredClass,
                                          timerFiredFunction) {}
 };
@@ -538,8 +538,9 @@
   scoped_refptr<scheduler::TaskQueue> taskRunner(
       m_platform.rendererScheduler()->NewTimerTaskRunner(
           scheduler::TaskQueue::QueueType::TEST));
-  scheduler::WebTaskRunnerImpl webTaskRunner(taskRunner);
-  TimerForTest<TimerTest> timer(&webTaskRunner, this, &TimerTest::countingTask);
+  RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner =
+      scheduler::WebTaskRunnerImpl::create(taskRunner);
+  TimerForTest<TimerTest> timer(webTaskRunner, this, &TimerTest::countingTask);
   timer.startOneShot(0, BLINK_FROM_HERE);
 
   // Make sure the task was posted on taskRunner.
@@ -600,9 +601,9 @@
 
 class TaskObserver : public base::MessageLoop::TaskObserver {
  public:
-  TaskObserver(WebTaskRunner* task_runner,
-               std::vector<WebTaskRunner*>* runOrder)
-      : m_taskRunner(task_runner), m_runOrder(runOrder) {}
+  TaskObserver(RefPtr<WebTaskRunner> task_runner,
+               std::vector<RefPtr<WebTaskRunner>>* runOrder)
+      : m_taskRunner(std::move(task_runner)), m_runOrder(runOrder) {}
 
   void WillProcessTask(const base::PendingTask&) {}
 
@@ -611,31 +612,32 @@
   }
 
  private:
-  WebTaskRunner* m_taskRunner;
-  std::vector<WebTaskRunner*>* m_runOrder;
+  RefPtr<WebTaskRunner> m_taskRunner;
+  std::vector<RefPtr<WebTaskRunner>>* m_runOrder;
 };
 
 }  // namespace
 
 TEST_F(TimerTest, MoveToNewTaskRunnerOneShot) {
-  std::vector<WebTaskRunner*> runOrder;
+  std::vector<RefPtr<WebTaskRunner>> runOrder;
 
   scoped_refptr<scheduler::TaskQueue> taskRunner1(
       m_platform.rendererScheduler()->NewTimerTaskRunner(
           scheduler::TaskQueue::QueueType::TEST));
-  scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1);
-  TaskObserver taskObserver1(&webTaskRunner1, &runOrder);
+  RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner1 =
+      scheduler::WebTaskRunnerImpl::create(taskRunner1);
+  TaskObserver taskObserver1(webTaskRunner1, &runOrder);
   taskRunner1->AddTaskObserver(&taskObserver1);
 
   scoped_refptr<scheduler::TaskQueue> taskRunner2(
       m_platform.rendererScheduler()->NewTimerTaskRunner(
           scheduler::TaskQueue::QueueType::TEST));
-  scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2);
-  TaskObserver taskObserver2(&webTaskRunner2, &runOrder);
+  RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner2 =
+      scheduler::WebTaskRunnerImpl::create(taskRunner2);
+  TaskObserver taskObserver2(webTaskRunner2, &runOrder);
   taskRunner2->AddTaskObserver(&taskObserver2);
 
-  TimerForTest<TimerTest> timer(&webTaskRunner1, this,
-                                &TimerTest::countingTask);
+  TimerForTest<TimerTest> timer(webTaskRunner1, this, &TimerTest::countingTask);
 
   double startTime = monotonicallyIncreasingTime();
 
@@ -643,37 +645,38 @@
 
   m_platform.runForPeriodSeconds(0.5);
 
-  timer.moveToNewTaskRunner(&webTaskRunner2);
+  timer.moveToNewTaskRunner(webTaskRunner2);
 
   m_platform.runUntilIdle();
 
   EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0));
 
-  EXPECT_THAT(runOrder, ElementsAre(&webTaskRunner2));
+  EXPECT_THAT(runOrder, ElementsAre(webTaskRunner2));
 
   EXPECT_TRUE(taskRunner1->IsEmpty());
   EXPECT_TRUE(taskRunner2->IsEmpty());
 }
 
 TEST_F(TimerTest, MoveToNewTaskRunnerRepeating) {
-  std::vector<WebTaskRunner*> runOrder;
+  std::vector<RefPtr<WebTaskRunner>> runOrder;
 
   scoped_refptr<scheduler::TaskQueue> taskRunner1(
       m_platform.rendererScheduler()->NewTimerTaskRunner(
           scheduler::TaskQueue::QueueType::TEST));
-  scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1);
-  TaskObserver taskObserver1(&webTaskRunner1, &runOrder);
+  RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner1 =
+      scheduler::WebTaskRunnerImpl::create(taskRunner1);
+  TaskObserver taskObserver1(webTaskRunner1, &runOrder);
   taskRunner1->AddTaskObserver(&taskObserver1);
 
   scoped_refptr<scheduler::TaskQueue> taskRunner2(
       m_platform.rendererScheduler()->NewTimerTaskRunner(
           scheduler::TaskQueue::QueueType::TEST));
-  scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2);
-  TaskObserver taskObserver2(&webTaskRunner2, &runOrder);
+  RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner2 =
+      scheduler::WebTaskRunnerImpl::create(taskRunner2);
+  TaskObserver taskObserver2(webTaskRunner2, &runOrder);
   taskRunner2->AddTaskObserver(&taskObserver2);
 
-  TimerForTest<TimerTest> timer(&webTaskRunner1, this,
-                                &TimerTest::countingTask);
+  TimerForTest<TimerTest> timer(webTaskRunner1, this, &TimerTest::countingTask);
 
   double startTime = monotonicallyIncreasingTime();
 
@@ -681,15 +684,15 @@
 
   m_platform.runForPeriodSeconds(2.5);
 
-  timer.moveToNewTaskRunner(&webTaskRunner2);
+  timer.moveToNewTaskRunner(webTaskRunner2);
 
   m_platform.runForPeriodSeconds(2);
 
   EXPECT_THAT(m_runTimes, ElementsAre(startTime + 1.0, startTime + 2.0,
                                       startTime + 3.0, startTime + 4.0));
 
-  EXPECT_THAT(runOrder, ElementsAre(&webTaskRunner1, &webTaskRunner1,
-                                    &webTaskRunner2, &webTaskRunner2));
+  EXPECT_THAT(runOrder, ElementsAre(webTaskRunner1, webTaskRunner1,
+                                    webTaskRunner2, webTaskRunner2));
 
   EXPECT_TRUE(taskRunner1->IsEmpty());
   EXPECT_FALSE(taskRunner2->IsEmpty());
@@ -701,15 +704,16 @@
   scoped_refptr<scheduler::TaskQueue> taskRunner1(
       m_platform.rendererScheduler()->NewTimerTaskRunner(
           scheduler::TaskQueue::QueueType::TEST));
-  scheduler::WebTaskRunnerImpl webTaskRunner1(taskRunner1);
+  RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner1 =
+      scheduler::WebTaskRunnerImpl::create(taskRunner1);
 
   scoped_refptr<scheduler::TaskQueue> taskRunner2(
       m_platform.rendererScheduler()->NewTimerTaskRunner(
           scheduler::TaskQueue::QueueType::TEST));
-  scheduler::WebTaskRunnerImpl webTaskRunner2(taskRunner2);
+  RefPtr<scheduler::WebTaskRunnerImpl> webTaskRunner2 =
+      scheduler::WebTaskRunnerImpl::create(taskRunner2);
 
-  TimerForTest<TimerTest> timer(&webTaskRunner1, this,
-                                &TimerTest::countingTask);
+  TimerForTest<TimerTest> timer(webTaskRunner1, this, &TimerTest::countingTask);
 
   m_platform.runUntilIdle();
   EXPECT_TRUE(!m_runTimes.size());
diff --git a/third_party/WebKit/Source/platform/WebFrameScheduler.h b/third_party/WebKit/Source/platform/WebFrameScheduler.h
index f6b2d5bc..899d78e6 100644
--- a/third_party/WebKit/Source/platform/WebFrameScheduler.h
+++ b/third_party/WebKit/Source/platform/WebFrameScheduler.h
@@ -5,6 +5,8 @@
 #ifndef WebFrameScheduler_h
 #define WebFrameScheduler_h
 
+#include "wtf/RefPtr.h"
+
 namespace blink {
 
 class WebTaskRunner;
@@ -33,11 +35,11 @@
 
   // Returns the WebTaskRunner for loading tasks.
   // WebFrameScheduler owns the returned WebTaskRunner.
-  virtual WebTaskRunner* loadingTaskRunner() { return nullptr; }
+  virtual RefPtr<WebTaskRunner> loadingTaskRunner() = 0;
 
   // Returns the WebTaskRunner for timer tasks.
   // WebFrameScheduler owns the returned WebTaskRunner.
-  virtual WebTaskRunner* timerTaskRunner() { return nullptr; }
+  virtual RefPtr<WebTaskRunner> timerTaskRunner() = 0;
 
   // Returns the WebTaskRunner for tasks which should never get throttled.
   // This is generally used for executing internal browser tasks which should
@@ -45,7 +47,7 @@
   // are known should be posted to this task runner; for example user
   // JavaScript is discouraged. WebFrameScheduler owns the returned
   // WebTaskRunner.
-  virtual WebTaskRunner* unthrottledTaskRunner() { return nullptr; }
+  virtual RefPtr<WebTaskRunner> unthrottledTaskRunner() = 0;
 
   // Returns the parent WebViewScheduler.
   virtual WebViewScheduler* webViewScheduler() { return nullptr; }
diff --git a/third_party/WebKit/Source/platform/WebTaskRunner.cpp b/third_party/WebKit/Source/platform/WebTaskRunner.cpp
index aa2d254..d7b0d13 100644
--- a/third_party/WebKit/Source/platform/WebTaskRunner.cpp
+++ b/third_party/WebKit/Source/platform/WebTaskRunner.cpp
@@ -155,4 +155,6 @@
   return TaskHandle(runner);
 }
 
+WebTaskRunner::~WebTaskRunner() = default;
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/WebTaskRunner.h b/third_party/WebKit/Source/platform/WebTaskRunner.h
index 073e1ee..2bc0f521 100644
--- a/third_party/WebKit/Source/platform/WebTaskRunner.h
+++ b/third_party/WebKit/Source/platform/WebTaskRunner.h
@@ -56,19 +56,15 @@
 };
 
 // The blink representation of a chromium SingleThreadTaskRunner.
-class BLINK_PLATFORM_EXPORT WebTaskRunner {
+class BLINK_PLATFORM_EXPORT WebTaskRunner
+    : public ThreadSafeRefCounted<WebTaskRunner> {
  public:
-  virtual ~WebTaskRunner() {}
-
   // Schedule a task to be run after |delayMs| on the the associated WebThread.
   // Can be called from any thread.
   virtual void postDelayedTask(const WebTraceLocation&,
                                const base::Closure&,
                                double delayMs) = 0;
 
-  // Returns a clone of the WebTaskRunner.
-  virtual std::unique_ptr<WebTaskRunner> clone() = 0;
-
   // Returns true if the current thread is a thread on which a task may be run.
   // Can be called from any thread.
   virtual bool runsTasksOnCurrentThread() = 0;
@@ -117,6 +113,14 @@
   postDelayedCancellableTask(const WebTraceLocation&,
                              std::unique_ptr<WTF::Closure>,
                              long long delayMs);
+
+ protected:
+  friend ThreadSafeRefCounted<WebTaskRunner>;
+  WebTaskRunner() = default;
+  virtual ~WebTaskRunner();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(WebTaskRunner);
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp b/third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp
index bcff0c11..575bd192 100644
--- a/third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp
+++ b/third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp
@@ -38,60 +38,61 @@
 }  // namespace
 
 TEST(WebTaskRunnerTest, PostCancellableTaskTest) {
-  scheduler::FakeWebTaskRunner taskRunner;
+  RefPtr<scheduler::FakeWebTaskRunner> taskRunner =
+      adoptRef(new scheduler::FakeWebTaskRunner);
 
   // Run without cancellation.
   int count = 0;
-  TaskHandle handle = taskRunner.postCancellableTask(
+  TaskHandle handle = taskRunner->postCancellableTask(
       BLINK_FROM_HERE, WTF::bind(&increment, WTF::unretained(&count)));
   EXPECT_EQ(0, count);
   EXPECT_TRUE(handle.isActive());
-  taskRunner.runUntilIdle();
+  taskRunner->runUntilIdle();
   EXPECT_EQ(1, count);
   EXPECT_FALSE(handle.isActive());
 
   count = 0;
-  handle = taskRunner.postDelayedCancellableTask(
+  handle = taskRunner->postDelayedCancellableTask(
       BLINK_FROM_HERE, WTF::bind(&increment, WTF::unretained(&count)), 1);
   EXPECT_EQ(0, count);
   EXPECT_TRUE(handle.isActive());
-  taskRunner.runUntilIdle();
+  taskRunner->runUntilIdle();
   EXPECT_EQ(1, count);
   EXPECT_FALSE(handle.isActive());
 
   // Cancel a task.
   count = 0;
-  handle = taskRunner.postCancellableTask(
+  handle = taskRunner->postCancellableTask(
       BLINK_FROM_HERE, WTF::bind(&increment, WTF::unretained(&count)));
   handle.cancel();
   EXPECT_EQ(0, count);
   EXPECT_FALSE(handle.isActive());
-  taskRunner.runUntilIdle();
+  taskRunner->runUntilIdle();
   EXPECT_EQ(0, count);
 
   // The task should be cancelled when the handle is dropped.
   {
     count = 0;
-    TaskHandle handle2 = taskRunner.postCancellableTask(
+    TaskHandle handle2 = taskRunner->postCancellableTask(
         BLINK_FROM_HERE, WTF::bind(&increment, WTF::unretained(&count)));
     EXPECT_TRUE(handle2.isActive());
   }
   EXPECT_EQ(0, count);
-  taskRunner.runUntilIdle();
+  taskRunner->runUntilIdle();
   EXPECT_EQ(0, count);
 
   // The task should be cancelled when another TaskHandle is assigned on it.
   count = 0;
-  handle = taskRunner.postCancellableTask(
+  handle = taskRunner->postCancellableTask(
       BLINK_FROM_HERE, WTF::bind(&increment, WTF::unretained(&count)));
-  handle = taskRunner.postCancellableTask(BLINK_FROM_HERE, WTF::bind([] {}));
+  handle = taskRunner->postCancellableTask(BLINK_FROM_HERE, WTF::bind([] {}));
   EXPECT_EQ(0, count);
-  taskRunner.runUntilIdle();
+  taskRunner->runUntilIdle();
   EXPECT_EQ(0, count);
 
   // Self assign should be nop.
   count = 0;
-  handle = taskRunner.postCancellableTask(
+  handle = taskRunner->postCancellableTask(
       BLINK_FROM_HERE, WTF::bind(&increment, WTF::unretained(&count)));
 #if COMPILER(CLANG)
 #pragma GCC diagnostic push
@@ -102,30 +103,31 @@
   handle = std::move(handle);
 #endif  // COMPILER(CLANG)
   EXPECT_EQ(0, count);
-  taskRunner.runUntilIdle();
+  taskRunner->runUntilIdle();
   EXPECT_EQ(1, count);
 
   // handle->isActive() should switch to false before the task starts running.
   bool isActive = false;
-  handle = taskRunner.postCancellableTask(
+  handle = taskRunner->postCancellableTask(
       BLINK_FROM_HERE, WTF::bind(&getIsActive, WTF::unretained(&isActive),
                                  WTF::unretained(&handle)));
   EXPECT_TRUE(handle.isActive());
-  taskRunner.runUntilIdle();
+  taskRunner->runUntilIdle();
   EXPECT_FALSE(isActive);
   EXPECT_FALSE(handle.isActive());
 }
 
 TEST(WebTaskRunnerTest, CancellationCheckerTest) {
-  scheduler::FakeWebTaskRunner taskRunner;
+  RefPtr<scheduler::FakeWebTaskRunner> taskRunner =
+      adoptRef(new scheduler::FakeWebTaskRunner);
 
   int count = 0;
-  TaskHandle handle = taskRunner.postCancellableTask(
+  TaskHandle handle = taskRunner->postCancellableTask(
       BLINK_FROM_HERE, WTF::bind(&increment, WTF::unretained(&count)));
   EXPECT_EQ(0, count);
 
   // TaskHandle::isActive should detect the deletion of posted task.
-  auto queue = taskRunner.takePendingTasksForTesting();
+  auto queue = taskRunner->takePendingTasksForTesting();
   ASSERT_EQ(1u, queue.size());
   EXPECT_FALSE(queue[0].IsCancelled());
   EXPECT_TRUE(handle.isActive());
@@ -135,13 +137,13 @@
 
   count = 0;
   CancellationTestHelper helper;
-  handle = taskRunner.postCancellableTask(
+  handle = taskRunner->postCancellableTask(
       BLINK_FROM_HERE, WTF::bind(&CancellationTestHelper::incrementCounter,
                                  helper.createWeakPtr()));
   EXPECT_EQ(0, helper.counter());
 
   // The cancellation of the posted task should be propagated to TaskHandle.
-  queue = taskRunner.takePendingTasksForTesting();
+  queue = taskRunner->takePendingTasksForTesting();
   ASSERT_EQ(1u, queue.size());
   EXPECT_FALSE(queue[0].IsCancelled());
   EXPECT_TRUE(handle.isActive());
diff --git a/third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp b/third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp
index 2b0a18d9..3cb04fe 100644
--- a/third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp
+++ b/third_party/WebKit/Source/platform/graphics/AcceleratedStaticBitmapImage.cpp
@@ -161,7 +161,7 @@
     WebThread* currentThread = Platform::current()->currentThread();
     m_textureHolder->setWasTransferred(true);
     m_textureHolder->setTextureThreadTaskRunner(
-        currentThread->getWebTaskRunner()->clone());
+        currentThread->getWebTaskRunner());
   }
   m_detachThreadAtNextCheck = true;
 }
diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
index e392678f..984731a 100644
--- a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
+++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasFrameDispatcherImpl.cpp
@@ -169,7 +169,7 @@
 namespace {
 
 void updatePlaceholderImage(WeakPtr<OffscreenCanvasFrameDispatcher> dispatcher,
-                            std::unique_ptr<WebTaskRunner> taskRunner,
+                            RefPtr<WebTaskRunner> taskRunner,
                             int placeholderCanvasId,
                             RefPtr<blink::StaticBitmapImage> image,
                             unsigned resourceId) {
@@ -209,9 +209,6 @@
   cc::TransferableResource resource;
   resource.id = m_nextResourceId;
   resource.format = cc::ResourceFormat::RGBA_8888;
-  // TODO(crbug.com/645590): filter should respect the image-rendering CSS
-  // property of associated canvas element.
-  resource.filter = GL_LINEAR;
   resource.size = gfx::Size(m_width, m_height);
   // TODO(crbug.com/646022): making this overlay-able.
   resource.is_overlay_candidate = false;
@@ -253,8 +250,8 @@
   // After this point, |image| can only be used on the main thread, until
   // it is returned.
   image->transfer();
-  std::unique_ptr<WebTaskRunner> dispatcherTaskRunner =
-      Platform::current()->currentThread()->getWebTaskRunner()->clone();
+  RefPtr<WebTaskRunner> dispatcherTaskRunner =
+      Platform::current()->currentThread()->getWebTaskRunner();
 
   Platform::current()->mainThread()->getWebTaskRunner()->postTask(
       BLINK_FROM_HERE,
@@ -281,6 +278,8 @@
   float vertexOpacity[4] = {1.f, 1.f, 1.f, 1.f};
   // TODO(crbug.com/645994): this should be true when using style
   // "image-rendering: pixelated".
+  // TODO(crbug.com/645590): filter should respect the image-rendering CSS
+  // property of associated canvas element.
   const bool nearestNeighbor = false;
   quad->SetAll(sqs, bounds, bounds, bounds, needsBlending, resource.id,
                gfx::Size(), premultipliedAlpha, uvTopLeft, uvBottomRight,
diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.cpp b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.cpp
index 4e0abe8..d1fa3da 100644
--- a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.cpp
+++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.cpp
@@ -64,7 +64,7 @@
 void OffscreenCanvasPlaceholder::setPlaceholderFrame(
     RefPtr<StaticBitmapImage> newFrame,
     WeakPtr<OffscreenCanvasFrameDispatcher> dispatcher,
-    std::unique_ptr<WebTaskRunner> taskRunner,
+    RefPtr<WebTaskRunner> taskRunner,
     unsigned resourceId) {
   DCHECK(isPlaceholderRegistered());
   DCHECK(newFrame);
diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.h b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.h
index 33b9f625..d5a302e 100644
--- a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.h
+++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.h
@@ -22,7 +22,7 @@
 
   void setPlaceholderFrame(RefPtr<StaticBitmapImage>,
                            WeakPtr<OffscreenCanvasFrameDispatcher>,
-                           std::unique_ptr<WebTaskRunner>,
+                           RefPtr<WebTaskRunner>,
                            unsigned resourceId);
   void releasePlaceholderFrame();
 
@@ -41,7 +41,7 @@
 
   RefPtr<StaticBitmapImage> m_placeholderFrame;
   WeakPtr<OffscreenCanvasFrameDispatcher> m_frameDispatcher;
-  std::unique_ptr<WebTaskRunner> m_frameDispatcherTaskRunner;
+  RefPtr<WebTaskRunner> m_frameDispatcherTaskRunner;
   unsigned m_placeholderFrameResourceId = 0;
 
   enum {
diff --git a/third_party/WebKit/Source/platform/graphics/TextureHolder.h b/third_party/WebKit/Source/platform/graphics/TextureHolder.h
index 19618eb..36eeed67 100644
--- a/third_party/WebKit/Source/platform/graphics/TextureHolder.h
+++ b/third_party/WebKit/Source/platform/graphics/TextureHolder.h
@@ -45,17 +45,15 @@
   }
   virtual void setSharedContextId(unsigned) { NOTREACHED(); }
   virtual void setImageThread(WebThread*) { NOTREACHED(); }
-  virtual void setImageThreadTaskRunner(std::unique_ptr<WebTaskRunner>) {
-    NOTREACHED();
-  }
+  virtual void setImageThreadTaskRunner(RefPtr<WebTaskRunner>) { NOTREACHED(); }
 
   // Methods that have exactly the same impelmentation for all sub-classes
   bool wasTransferred() { return m_wasTransferred; }
-  WebTaskRunner* textureThreadTaskRunner() {
-    return m_textureThreadTaskRunner.get();
+  RefPtr<WebTaskRunner> textureThreadTaskRunner() {
+    return m_textureThreadTaskRunner;
   }
   void setWasTransferred(bool flag) { m_wasTransferred = flag; }
-  void setTextureThreadTaskRunner(std::unique_ptr<WebTaskRunner> taskRunner) {
+  void setTextureThreadTaskRunner(RefPtr<WebTaskRunner> taskRunner) {
     m_textureThreadTaskRunner = std::move(taskRunner);
   }
 
@@ -69,7 +67,7 @@
   // another thread, and the original thread gone out of scope, and that we need
   // to clear the resouces associated with that AcceleratedStaticBitmapImage on
   // the original thread.
-  std::unique_ptr<WebTaskRunner> m_textureThreadTaskRunner;
+  RefPtr<WebTaskRunner> m_textureThreadTaskRunner;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/SharedGpuContext.cpp b/third_party/WebKit/Source/platform/graphics/gpu/SharedGpuContext.cpp
index e119ed7..734e1cb 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/SharedGpuContext.cpp
+++ b/third_party/WebKit/Source/platform/graphics/gpu/SharedGpuContext.cpp
@@ -57,7 +57,7 @@
     // SharedGpuContext encasulates the context provider: so we only have to do
     // this once per thread.
     WaitableEvent waitableEvent;
-    WebTaskRunner* taskRunner =
+    RefPtr<WebTaskRunner> taskRunner =
         Platform::current()->mainThread()->getWebTaskRunner();
     taskRunner->postTask(
         BLINK_FROM_HERE,
diff --git a/third_party/WebKit/Source/platform/heap/GCTaskRunner.h b/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
index 211ff27f..60f7156 100644
--- a/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
+++ b/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
@@ -43,8 +43,8 @@
 
 class MessageLoopInterruptor final : public BlinkGCInterruptor {
  public:
-  explicit MessageLoopInterruptor(WebTaskRunner* taskRunner)
-      : m_taskRunner(taskRunner) {}
+  explicit MessageLoopInterruptor(RefPtr<WebTaskRunner> taskRunner)
+      : m_taskRunner(std::move(taskRunner)) {}
 
   void requestInterrupt() override {
     // GCTask has an empty run() method. Its only purpose is to guarantee
@@ -62,7 +62,7 @@
     // conservatively enters safepoint with pointers on stack.
   }
 
-  WebTaskRunner* m_taskRunner;
+  RefPtr<WebTaskRunner> m_taskRunner;
 };
 
 class GCTaskObserver final : public WebThread::TaskObserver {
diff --git a/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.h b/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.h
index 05e5c9a..64494de 100644
--- a/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.h
+++ b/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.h
@@ -85,7 +85,7 @@
 
   void sendContentAreaScrolledTask();
   TaskHandle m_sendContentAreaScrolledTaskHandle;
-  std::unique_ptr<WebTaskRunner> m_taskRunner;
+  RefPtr<WebTaskRunner> m_taskRunner;
   ScrollOffset m_contentAreaScrolledTimerScrollDelta;
 
   ScrollResult userScroll(ScrollGranularity,
diff --git a/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm b/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm
index 6b2452b..ff066d61 100644
--- a/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm
+++ b/third_party/WebKit/Source/platform/mac/ScrollAnimatorMac.mm
@@ -691,11 +691,8 @@
 
 ScrollAnimatorMac::ScrollAnimatorMac(ScrollableArea* scrollableArea)
     : ScrollAnimatorBase(scrollableArea),
-      m_taskRunner(Platform::current()
-                       ->currentThread()
-                       ->scheduler()
-                       ->timerTaskRunner()
-                       ->clone()),
+      m_taskRunner(
+          Platform::current()->currentThread()->scheduler()->timerTaskRunner()),
       m_haveScrolledSincePageLoad(false),
       m_needsScrollerStyleUpdate(false) {
   m_scrollAnimationHelperDelegate.adoptNS(
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.cc
index 647189a..e2529d0 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.cc
@@ -23,8 +23,8 @@
     : child_scheduler_(child_scheduler),
       idle_task_runner_(idle_task_runner),
       timer_task_runner_(timer_task_runner),
-      loading_web_task_runner_(new WebTaskRunnerImpl(loading_task_runner)),
-      timer_web_task_runner_(new WebTaskRunnerImpl(timer_task_runner)) {}
+      loading_web_task_runner_(WebTaskRunnerImpl::create(loading_task_runner)),
+      timer_web_task_runner_(WebTaskRunnerImpl::create(timer_task_runner)) {}
 
 WebSchedulerImpl::~WebSchedulerImpl() {}
 
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.h
index 201a66d..a802e362 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_scheduler_impl.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/time/time.h"
 #include "public/platform/WebCommon.h"
@@ -55,8 +56,10 @@
   ChildScheduler* child_scheduler_;  // NOT OWNED
   scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
   scoped_refptr<TaskQueue> timer_task_runner_;
-  std::unique_ptr<WebTaskRunnerImpl> loading_web_task_runner_;
-  std::unique_ptr<WebTaskRunnerImpl> timer_web_task_runner_;
+  RefPtr<WebTaskRunnerImpl> loading_web_task_runner_;
+  RefPtr<WebTaskRunnerImpl> timer_web_task_runner_;
+
+  DISALLOW_COPY_AND_ASSIGN(WebSchedulerImpl);
 };
 
 }  // namespace scheduler
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.cc
index 5d8d6c445..e2dc0e49 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.cc
@@ -14,10 +14,10 @@
 namespace blink {
 namespace scheduler {
 
-WebTaskRunnerImpl::WebTaskRunnerImpl(scoped_refptr<TaskQueue> task_queue)
-    : task_queue_(task_queue) {}
-
-WebTaskRunnerImpl::~WebTaskRunnerImpl() {}
+RefPtr<WebTaskRunnerImpl> WebTaskRunnerImpl::create(
+    scoped_refptr<TaskQueue> task_queue) {
+  return adoptRef(new WebTaskRunnerImpl(std::move(task_queue)));
+}
 
 void WebTaskRunnerImpl::postDelayedTask(const WebTraceLocation& location,
                                         const base::Closure& task,
@@ -41,6 +41,11 @@
          static_cast<double>(base::Time::kMicrosecondsPerSecond);
 }
 
+WebTaskRunnerImpl::WebTaskRunnerImpl(scoped_refptr<TaskQueue> task_queue)
+    : task_queue_(std::move(task_queue)) {}
+
+WebTaskRunnerImpl::~WebTaskRunnerImpl() {}
+
 base::TimeTicks WebTaskRunnerImpl::Now() const {
   TimeDomain* time_domain = task_queue_->GetTimeDomain();
   // It's possible task_queue_ has been Unregistered which can lead to a null
@@ -50,10 +55,6 @@
   return time_domain->Now();
 }
 
-std::unique_ptr<blink::WebTaskRunner> WebTaskRunnerImpl::clone() {
-  return base::WrapUnique(new WebTaskRunnerImpl(task_queue_));
-}
-
 base::SingleThreadTaskRunner* WebTaskRunnerImpl::toSingleThreadTaskRunner() {
   return task_queue_.get();
 }
diff --git a/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.h b/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.h
index 2eb7f11..6b5741da 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/child/web_task_runner_impl.h
@@ -19,9 +19,7 @@
 
 class BLINK_PLATFORM_EXPORT WebTaskRunnerImpl : public WebTaskRunner {
  public:
-  explicit WebTaskRunnerImpl(scoped_refptr<TaskQueue> task_queue);
-
-  ~WebTaskRunnerImpl() override;
+  static RefPtr<WebTaskRunnerImpl> create(scoped_refptr<TaskQueue> task_queue);
 
   // WebTaskRunner implementation:
   void postDelayedTask(const WebTraceLocation&,
@@ -30,10 +28,12 @@
   bool runsTasksOnCurrentThread() override;
   double virtualTimeSeconds() const override;
   double monotonicallyIncreasingVirtualTimeSeconds() const override;
-  std::unique_ptr<WebTaskRunner> clone() override;
   base::SingleThreadTaskRunner* toSingleThreadTaskRunner() override;
 
  private:
+  explicit WebTaskRunnerImpl(scoped_refptr<TaskQueue> task_queue);
+  ~WebTaskRunnerImpl() override;
+
   base::TimeTicks Now() const;
 
   scoped_refptr<TaskQueue> task_queue_;
diff --git a/third_party/WebKit/Source/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
index d8e42659..8a1c428 100644
--- a/third_party/WebKit/Source/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
+++ b/third_party/WebKit/Source/platform/scheduler/child/webthread_impl_for_worker_scheduler.cc
@@ -71,7 +71,7 @@
       worker_scheduler_->DefaultTaskRunner(),
       worker_scheduler_->DefaultTaskRunner()));
   base::MessageLoop::current()->AddDestructionObserver(this);
-  web_task_runner_ = base::MakeUnique<WebTaskRunnerImpl>(task_runner_);
+  web_task_runner_ = WebTaskRunnerImpl::create(task_runner_);
   completion->Signal();
 }
 
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
index 13f2f6be..cdd3ee2 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.cc
@@ -102,7 +102,7 @@
   UpdateTimerThrottling(was_throttled);
 }
 
-blink::WebTaskRunner* WebFrameSchedulerImpl::loadingTaskRunner() {
+RefPtr<blink::WebTaskRunner> WebFrameSchedulerImpl::loadingTaskRunner() {
   DCHECK(parent_web_view_scheduler_);
   if (!loading_web_task_runner_) {
     loading_task_queue_ = renderer_scheduler_->NewLoadingTaskRunner(
@@ -111,12 +111,12 @@
     loading_queue_enabled_voter_ =
         loading_task_queue_->CreateQueueEnabledVoter();
     loading_queue_enabled_voter_->SetQueueEnabled(!frame_suspended_);
-    loading_web_task_runner_.reset(new WebTaskRunnerImpl(loading_task_queue_));
+    loading_web_task_runner_ = WebTaskRunnerImpl::create(loading_task_queue_);
   }
-  return loading_web_task_runner_.get();
+  return loading_web_task_runner_;
 }
 
-blink::WebTaskRunner* WebFrameSchedulerImpl::timerTaskRunner() {
+RefPtr<blink::WebTaskRunner> WebFrameSchedulerImpl::timerTaskRunner() {
   DCHECK(parent_web_view_scheduler_);
   if (!timer_web_task_runner_) {
     timer_task_queue_ = renderer_scheduler_->NewTimerTaskRunner(
@@ -136,21 +136,21 @@
       renderer_scheduler_->task_queue_throttler()->IncreaseThrottleRefCount(
           timer_task_queue_.get());
     }
-    timer_web_task_runner_.reset(new WebTaskRunnerImpl(timer_task_queue_));
+    timer_web_task_runner_ = WebTaskRunnerImpl::create(timer_task_queue_);
   }
-  return timer_web_task_runner_.get();
+  return timer_web_task_runner_;
 }
 
-blink::WebTaskRunner* WebFrameSchedulerImpl::unthrottledTaskRunner() {
+RefPtr<blink::WebTaskRunner> WebFrameSchedulerImpl::unthrottledTaskRunner() {
   DCHECK(parent_web_view_scheduler_);
   if (!unthrottled_web_task_runner_) {
     unthrottled_task_queue_ = renderer_scheduler_->NewUnthrottledTaskRunner(
         TaskQueue::QueueType::FRAME_UNTHROTTLED);
     unthrottled_task_queue_->SetBlameContext(blame_context_);
-    unthrottled_web_task_runner_.reset(
-        new WebTaskRunnerImpl(unthrottled_task_queue_));
+    unthrottled_web_task_runner_ =
+        WebTaskRunnerImpl::create(unthrottled_task_queue_);
   }
-  return unthrottled_web_task_runner_.get();
+  return unthrottled_web_task_runner_;
 }
 
 blink::WebViewScheduler* WebFrameSchedulerImpl::webViewScheduler() {
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h
index 9e3a050..1ced35e 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl.h
@@ -42,9 +42,9 @@
   void setPageVisible(bool page_visible) override;
   void setSuspended(bool frame_suspended) override;
   void setCrossOrigin(bool cross_origin) override;
-  WebTaskRunner* loadingTaskRunner() override;
-  WebTaskRunner* timerTaskRunner() override;
-  WebTaskRunner* unthrottledTaskRunner() override;
+  RefPtr<WebTaskRunner> loadingTaskRunner() override;
+  RefPtr<WebTaskRunner> timerTaskRunner() override;
+  RefPtr<WebTaskRunner> unthrottledTaskRunner() override;
   WebViewScheduler* webViewScheduler() override;
   void didStartLoading(unsigned long identifier) override;
   void didStopLoading(unsigned long identifier) override;
@@ -67,9 +67,9 @@
   scoped_refptr<TaskQueue> unthrottled_task_queue_;
   std::unique_ptr<TaskQueue::QueueEnabledVoter> loading_queue_enabled_voter_;
   std::unique_ptr<TaskQueue::QueueEnabledVoter> timer_queue_enabled_voter_;
-  std::unique_ptr<WebTaskRunnerImpl> loading_web_task_runner_;
-  std::unique_ptr<WebTaskRunnerImpl> timer_web_task_runner_;
-  std::unique_ptr<WebTaskRunnerImpl> unthrottled_web_task_runner_;
+  RefPtr<WebTaskRunnerImpl> loading_web_task_runner_;
+  RefPtr<WebTaskRunnerImpl> timer_web_task_runner_;
+  RefPtr<WebTaskRunnerImpl> unthrottled_web_task_runner_;
   RendererSchedulerImpl* renderer_scheduler_;        // NOT OWNED
   WebViewSchedulerImpl* parent_web_view_scheduler_;  // NOT OWNED
   base::trace_event::BlameContext* blame_context_;   // NOT OWNED
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl_unittest.cc
index dcb5dab..60eb0e6 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_frame_scheduler_impl_unittest.cc
@@ -58,19 +58,22 @@
 
 namespace {
 
-void runRepeatingTask(WebTaskRunner* task_runner, int* run_count);
+void runRepeatingTask(RefPtr<WebTaskRunner> task_runner, int* run_count);
 
 std::unique_ptr<WTF::Closure> makeRepeatingTask(
-    blink::WebTaskRunner* task_runner,
+    RefPtr<blink::WebTaskRunner> task_runner,
     int* run_count) {
-  return WTF::bind(&runRepeatingTask, WTF::unretained(task_runner),
+  return WTF::bind(&runRepeatingTask, WTF::passed(std::move(task_runner)),
                    WTF::unretained(run_count));
 }
 
-void runRepeatingTask(WebTaskRunner* task_runner, int* run_count) {
+void runRepeatingTask(RefPtr<WebTaskRunner> task_runner, int* run_count) {
   ++*run_count;
-  task_runner->postDelayedTask(BLINK_FROM_HERE,
-                               makeRepeatingTask(task_runner, run_count), 1.0);
+
+  WebTaskRunner* task_runner_ptr = task_runner.get();
+  task_runner_ptr->postDelayedTask(
+      BLINK_FROM_HERE, makeRepeatingTask(std::move(task_runner), run_count),
+      1.0);
 }
 
 void IncrementCounter(int* counter) {
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc
index 0c94e408..fe4f6fa 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/web_view_scheduler_impl_unittest.cc
@@ -80,19 +80,22 @@
 
 namespace {
 
-void runRepeatingTask(blink::WebTaskRunner* task_runner, int* run_count);
+void runRepeatingTask(RefPtr<blink::WebTaskRunner> task_runner, int* run_count);
 
 std::unique_ptr<WTF::Closure> makeRepeatingTask(
-    blink::WebTaskRunner* task_runner,
+    RefPtr<blink::WebTaskRunner> task_runner,
     int* run_count) {
-  return WTF::bind(&runRepeatingTask, WTF::unretained(task_runner),
+  return WTF::bind(&runRepeatingTask, WTF::passed(std::move(task_runner)),
                    WTF::unretained(run_count));
 }
 
-void runRepeatingTask(blink::WebTaskRunner* task_runner, int* run_count) {
+void runRepeatingTask(RefPtr<blink::WebTaskRunner> task_runner,
+                      int* run_count) {
   ++*run_count;
-  task_runner->postDelayedTask(BLINK_FROM_HERE,
-                               makeRepeatingTask(task_runner, run_count), 1.0);
+  blink::WebTaskRunner* task_runner_ptr = task_runner.get();
+  task_runner_ptr->postDelayedTask(
+      BLINK_FROM_HERE, makeRepeatingTask(std::move(task_runner), run_count),
+      1.0);
 }
 
 }  // namespace
@@ -164,7 +167,7 @@
 namespace {
 
 void runVirtualTimeRecorderTask(base::SimpleTestTickClock* clock,
-                                blink::WebTaskRunner* web_task_runner,
+                                RefPtr<blink::WebTaskRunner> web_task_runner,
                                 std::vector<base::TimeTicks>* out_real_times,
                                 std::vector<size_t>* out_virtual_times_ms) {
   out_real_times->push_back(clock->NowTicks());
@@ -174,11 +177,11 @@
 
 std::unique_ptr<WTF::Closure> makeVirtualTimeRecorderTask(
     base::SimpleTestTickClock* clock,
-    blink::WebTaskRunner* web_task_runner,
+    RefPtr<blink::WebTaskRunner> web_task_runner,
     std::vector<base::TimeTicks>* out_real_times,
     std::vector<size_t>* out_virtual_times_ms) {
   return WTF::bind(&runVirtualTimeRecorderTask, WTF::unretained(clock),
-                   WTF::unretained(web_task_runner),
+                   WTF::passed(std::move(web_task_runner)),
                    WTF::unretained(out_real_times),
                    WTF::unretained(out_virtual_times_ms));
 }
@@ -294,7 +297,7 @@
 }
 
 void delayedRunOrderTask(int index,
-                         blink::WebTaskRunner* task_runner,
+                         RefPtr<blink::WebTaskRunner> task_runner,
                          std::vector<int>* out_run_order) {
   out_run_order->push_back(index);
   task_runner->postTask(
@@ -316,14 +319,14 @@
   web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
       BLINK_FROM_HERE,
       WTF::bind(&delayedRunOrderTask, 1,
-                WTF::unretained(web_frame_scheduler_->timerTaskRunner()),
+                WTF::passed(web_frame_scheduler_->timerTaskRunner()),
                 WTF::unretained(&run_order)),
       2.0);
 
   web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
       BLINK_FROM_HERE,
       WTF::bind(&delayedRunOrderTask, 3,
-                WTF::unretained(web_frame_scheduler_->timerTaskRunner()),
+                WTF::passed(web_frame_scheduler_->timerTaskRunner()),
                 WTF::unretained(&run_order)),
       4.0);
 
@@ -346,14 +349,14 @@
   web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
       BLINK_FROM_HERE,
       WTF::bind(&delayedRunOrderTask, 1,
-                WTF::unretained(web_frame_scheduler_->timerTaskRunner()),
+                WTF::passed(web_frame_scheduler_->timerTaskRunner()),
                 WTF::unretained(&run_order)),
       2.0);
 
   web_frame_scheduler_->timerTaskRunner()->postDelayedTask(
       BLINK_FROM_HERE,
       WTF::bind(&delayedRunOrderTask, 3,
-                WTF::unretained(web_frame_scheduler_->timerTaskRunner()),
+                WTF::passed(web_frame_scheduler_->timerTaskRunner()),
                 WTF::unretained(&run_order)),
       4.0);
 
@@ -437,7 +440,7 @@
 
   WebFrameSchedulerImpl* web_frame_scheduler =
       web_view_scheduler_->createWebFrameSchedulerImpl(nullptr).release();
-  blink::WebTaskRunner* timer_task_runner =
+  RefPtr<blink::WebTaskRunner> timer_task_runner =
       web_frame_scheduler->timerTaskRunner();
 
   int run_count = 0;
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.cc b/third_party/WebKit/Source/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.cc
index 0ee075e..c381200 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.cc
@@ -20,7 +20,8 @@
       idle_task_runner_(scheduler->IdleTaskRunner()),
       scheduler_(scheduler),
       thread_id_(base::PlatformThread::CurrentId()),
-      web_task_runner_(new WebTaskRunnerImpl(scheduler->DefaultTaskRunner())) {}
+      web_task_runner_(
+          WebTaskRunnerImpl::create(scheduler->DefaultTaskRunner())) {}
 
 WebThreadImplForRendererScheduler::~WebThreadImplForRendererScheduler() {}
 
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h b/third_party/WebKit/Source/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h
index f0308e5a..36e207ce 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_WEBTHREAD_IMPL_FOR_RENDERER_SCHEDULER_H_
 
 #include "public/platform/scheduler/child/webthread_base.h"
+#include "wtf/RefPtr.h"
 
 namespace blink {
 class WebScheduler;
@@ -46,7 +47,7 @@
   scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
   RendererSchedulerImpl* scheduler_;  // Not owned.
   PlatformThreadId thread_id_;
-  std::unique_ptr<WebTaskRunnerImpl> web_task_runner_;
+  RefPtr<WebTaskRunnerImpl> web_task_runner_;
 };
 
 }  // namespace scheduler
diff --git a/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc b/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc
index 304d1ade..c9f225cc 100644
--- a/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc
+++ b/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.cc
@@ -78,10 +78,6 @@
   return true;
 }
 
-std::unique_ptr<WebTaskRunner> FakeWebTaskRunner::clone() {
-  return WTF::wrapUnique(new FakeWebTaskRunner(data_, base_task_runner_));
-}
-
 double FakeWebTaskRunner::virtualTimeSeconds() const {
   return data_->time_;
 }
diff --git a/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.h b/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.h
index 2753d2b2..4b3bec2 100644
--- a/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.h
+++ b/third_party/WebKit/Source/platform/scheduler/test/fake_web_task_runner.h
@@ -20,7 +20,6 @@
 class FakeWebTaskRunner : public WebTaskRunner {
  public:
   FakeWebTaskRunner();
-  ~FakeWebTaskRunner() override;
 
   void setTime(double new_time);
 
@@ -29,7 +28,6 @@
                        const base::Closure&,
                        double) override;
   bool runsTasksOnCurrentThread() override;
-  std::unique_ptr<WebTaskRunner> clone() override;
   double virtualTimeSeconds() const override;
   double monotonicallyIncreasingVirtualTimeSeconds() const override;
   SingleThreadTaskRunner* toSingleThreadTaskRunner() override;
@@ -38,6 +36,8 @@
   std::deque<base::Closure> takePendingTasksForTesting();
 
  private:
+  ~FakeWebTaskRunner() override;
+
   class Data;
   class BaseTaskRunner;
   RefPtr<Data> data_;
diff --git a/third_party/WebKit/Source/web/InspectorEmulationAgent.cpp b/third_party/WebKit/Source/web/InspectorEmulationAgent.cpp
index 24f2559..f6615945 100644
--- a/third_party/WebKit/Source/web/InspectorEmulationAgent.cpp
+++ b/third_party/WebKit/Source/web/InspectorEmulationAgent.cpp
@@ -150,7 +150,7 @@
   m_webLocalFrameImpl->view()->scheduler()->enableVirtualTime();
 
   if (budget.isJust()) {
-    WebTaskRunner* taskRunner =
+    RefPtr<WebTaskRunner> taskRunner =
         Platform::current()->currentThread()->getWebTaskRunner();
     long long delayMillis = static_cast<long long>(budget.fromJust());
     m_virtualTimeBudgetExpiredTaskHandle =
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
index 28ac4a83..bba0ca8 100644
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
@@ -64,7 +64,6 @@
 #include "public/platform/modules/notifications/WebNotificationData.h"
 #include "public/platform/modules/serviceworker/WebServiceWorkerEventResult.h"
 #include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h"
-#include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h"
 #include "public/web/WebSerializedScriptValue.h"
 #include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h"
 #include "web/WebEmbeddedWorkerImpl.h"
@@ -200,7 +199,7 @@
 
 void ServiceWorkerGlobalScopeProxy::onNavigationPreloadResponse(
     int fetchEventID,
-    std::unique_ptr<WebServiceWorkerResponse> response,
+    std::unique_ptr<WebURLResponse> response,
     std::unique_ptr<WebDataConsumerHandle> dataConsumeHandle) {
   FetchEvent* fetchEvent = m_pendingPreloadFetchEvents.take(fetchEventID);
   DCHECK(fetchEvent);
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
index bcd80a8..6a7fc61 100644
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
@@ -50,7 +50,7 @@
 class WebServiceWorkerContextClient;
 struct WebServiceWorkerError;
 class WebServiceWorkerRequest;
-class WebServiceWorkerResponse;
+class WebURLResponse;
 
 // This class is created and destructed on the main thread, but live most
 // of its time as a resident of the worker thread.
@@ -113,7 +113,7 @@
   bool hasFetchEventHandler() override;
   void onNavigationPreloadResponse(
       int fetchEventID,
-      std::unique_ptr<WebServiceWorkerResponse>,
+      std::unique_ptr<WebURLResponse>,
       std::unique_ptr<WebDataConsumerHandle>) override;
   void onNavigationPreloadError(
       int fetchEventID,
diff --git a/third_party/WebKit/Source/web/WebKit.cpp b/third_party/WebKit/Source/web/WebKit.cpp
index 33b1f4c..86b3d94 100644
--- a/third_party/WebKit/Source/web/WebKit.cpp
+++ b/third_party/WebKit/Source/web/WebKit.cpp
@@ -35,6 +35,7 @@
 #include "bindings/core/v8/V8GCController.h"
 #include "bindings/core/v8/V8Initializer.h"
 #include "core/animation/AnimationClock.h"
+#include "core/layout/LayoutTheme.h"
 #include "core/page/Page.h"
 #include "core/workers/WorkerBackingThread.h"
 #include "gin/public/v8_platform.h"
@@ -124,6 +125,7 @@
 
 void setMockThemeEnabledForTest(bool value) {
   LayoutTestSupport::setMockThemeEnabledForTest(value);
+  LayoutTheme::theme().didChangeThemeEngine();
 }
 
 void setFontAntialiasingEnabledForTest(bool value) {
diff --git a/third_party/WebKit/public/platform/scheduler/child/webthread_impl_for_worker_scheduler.h b/third_party/WebKit/public/platform/scheduler/child/webthread_impl_for_worker_scheduler.h
index 4a8d687a..953c5c5 100644
--- a/third_party/WebKit/public/platform/scheduler/child/webthread_impl_for_worker_scheduler.h
+++ b/third_party/WebKit/public/platform/scheduler/child/webthread_impl_for_worker_scheduler.h
@@ -6,15 +6,16 @@
 #define THIRD_PARTY_WEBKIT_PUBLIC_PLATFORM_SCHEDULER_CHILD_WEBTHREAD_IMPL_FOR_WORKER_SCHEDULER_H_
 
 #include "base/threading/thread.h"
+#include "public/platform/WebPrivatePtr.h"
 #include "public/platform/scheduler/child/webthread_base.h"
 
 namespace base {
 class WaitableEvent;
-};
+}
 
 namespace blink {
 class WebScheduler;
-};
+}
 
 namespace blink {
 namespace scheduler {
@@ -69,7 +70,7 @@
   scoped_refptr<TaskQueue> task_runner_;
   scoped_refptr<scheduler::SingleThreadIdleTaskRunner> idle_task_runner_;
   scoped_refptr<SchedulerTqmDelegate> task_runner_delegate_;
-  std::unique_ptr<WebTaskRunnerImpl> web_task_runner_;
+  WebPrivatePtr<WebTaskRunnerImpl> web_task_runner_;
 };
 
 }  // namespace scheduler
diff --git a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
index 8cbe7e8d..1028a59 100644
--- a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
+++ b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
@@ -41,12 +41,12 @@
 
 class WebDataConsumerHandle;
 class WebServiceWorkerRequest;
-class WebServiceWorkerResponse;
 class WebString;
 struct WebNotificationData;
 struct WebPaymentAppRequestData;
 struct WebServiceWorkerClientInfo;
 struct WebServiceWorkerError;
+class WebURLResponse;
 
 // A proxy interface to talk to the worker's GlobalScope implementation.
 // All methods of this class must be called on the worker thread.
@@ -102,7 +102,7 @@
 
   virtual void onNavigationPreloadResponse(
       int fetchEventID,
-      std::unique_ptr<WebServiceWorkerResponse>,
+      std::unique_ptr<WebURLResponse>,
       std::unique_ptr<WebDataConsumerHandle>) = 0;
   virtual void onNavigationPreloadError(
       int fetchEventID,
diff --git a/ui/views/controls/md_slider.cc b/ui/views/controls/md_slider.cc
index 201450f..acb97d75f 100644
--- a/ui/views/controls/md_slider.cc
+++ b/ui/views/controls/md_slider.cc
@@ -73,12 +73,14 @@
   gfx::Point thumb_center(x, content.height() / 2);
 
   // Paint the thumb highlight if it exists.
-  if (is_active_ && thumb_highlight_radius_ > kThumbRadius) {
+  const int thumb_highlight_radius =
+      HasFocus() ? kThumbHighlightRadius : thumb_highlight_radius_;
+  if (is_active_ && thumb_highlight_radius > kThumbRadius) {
     SkPaint highlight;
     SkColor kHighlightColor = SkColorSetA(kActiveColor, kHighlightColorAlpha);
     highlight.setColor(kHighlightColor);
     highlight.setFlags(SkPaint::kAntiAlias_Flag);
-    canvas->DrawCircle(thumb_center, thumb_highlight_radius_, highlight);
+    canvas->DrawCircle(thumb_center, thumb_highlight_radius, highlight);
   }
 
   // Paint the thumb of the slider.