diff --git a/DEPS b/DEPS
index 31956234..d2eb95be 100644
--- a/DEPS
+++ b/DEPS
@@ -130,7 +130,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '3ebc2fd9fe647478531367a1a5168631b6f2014d',
+  'catapult_revision': '280aff07f5fcea3aae2be27078648b4660da33b2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -308,7 +308,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '8076c2854d339c96a1b008e72aa3b832e61e0f45',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '009150b7afe1f47dabc5537d0e42649bf7f193a3',
 
   # DevTools node modules. Used on Linux buildbots only.
   'src/third_party/devtools-node-modules': {
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
index c5cb69b..37a37d1 100644
--- a/ash/accelerators/accelerator_controller.cc
+++ b/ash/accelerators/accelerator_controller.cc
@@ -11,6 +11,7 @@
 #include "ash/accelerators/accelerator_controller_delegate.h"
 #include "ash/accelerators/debug_commands.h"
 #include "ash/accessibility/accessibility_controller.h"
+#include "ash/accessibility/accessibility_delegate.h"
 #include "ash/display/display_configuration_controller.h"
 #include "ash/display/display_move_window_util.h"
 #include "ash/focus_cycler.h"
@@ -504,7 +505,7 @@
     // When spoken feedback is enabled, we should neither toggle the list nor
     // consume the key since Search+Shift is one of the shortcuts the a11y
     // feature uses. crbug.com/132296
-    if (Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled())
+    if (Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled())
       return false;
   }
   return true;
@@ -826,10 +827,8 @@
 void HandleToggleSpokenFeedback() {
   base::RecordAction(UserMetricsAction("Accel_Toggle_Spoken_Feedback"));
 
-  AccessibilityController* controller =
-      Shell::Get()->accessibility_controller();
-  controller->SetSpokenFeedbackEnabled(!controller->IsSpokenFeedbackEnabled(),
-                                       A11Y_NOTIFICATION_SHOW);
+  Shell::Get()->accessibility_delegate()->ToggleSpokenFeedback(
+      A11Y_NOTIFICATION_SHOW);
 }
 
 void HandleVolumeDown(mojom::VolumeController* volume_controller,
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index 3c3eac50..0cb5deb5 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "ash/accelerators/accelerator_table.h"
 #include "ash/accessibility/accessibility_controller.h"
+#include "ash/accessibility/accessibility_delegate.h"
 #include "ash/accessibility/test_accessibility_controller_client.h"
 #include "ash/ime/ime_controller.h"
 #include "ash/media_controller.h"
@@ -822,8 +823,7 @@
   app_list::test::TestAppListPresenter test_app_list_presenter;
   Shell::Get()->app_list()->SetAppListPresenter(
       test_app_list_presenter.CreateInterfacePtrAndBind());
-  AccessibilityController* controller =
-      Shell::Get()->accessibility_controller();
+  AccessibilityDelegate* delegate = Shell::Get()->accessibility_delegate();
 
   // The press event should not toggle the AppList, the release should instead.
   EXPECT_FALSE(
@@ -839,14 +839,12 @@
   EXPECT_EQ(ui::VKEY_LWIN, GetPreviousAccelerator().key_code());
 
   // When spoken feedback is on, the AppList should not toggle.
-  controller->SetSpokenFeedbackEnabled(true, A11Y_NOTIFICATION_NONE);
-  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
+  delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE);
   EXPECT_FALSE(
       ProcessInController(ui::Accelerator(ui::VKEY_LWIN, ui::EF_NONE)));
   EXPECT_FALSE(ProcessInController(
       CreateReleaseAccelerator(ui::VKEY_LWIN, ui::EF_NONE)));
-  controller->SetSpokenFeedbackEnabled(false, A11Y_NOTIFICATION_NONE);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE);
   RunAllPendingInMessageLoop();
   EXPECT_EQ(1u, test_app_list_presenter.toggle_count());
 
diff --git a/ash/accelerators/spoken_feedback_toggler.cc b/ash/accelerators/spoken_feedback_toggler.cc
index 5a5ac3d..4a3b243 100644
--- a/ash/accelerators/spoken_feedback_toggler.cc
+++ b/ash/accelerators/spoken_feedback_toggler.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "ash/accelerators/key_hold_detector.h"
-#include "ash/accessibility/accessibility_controller.h"
+#include "ash/accessibility/accessibility_delegate.h"
 #include "ash/public/cpp/accessibility_types.h"
 #include "ash/shell.h"
 #include "ui/events/event.h"
@@ -53,10 +53,8 @@
 void SpokenFeedbackToggler::OnKeyHold(const ui::KeyEvent* event) {
   if (!toggled_) {
     toggled_ = true;
-    AccessibilityController* controller =
-        Shell::Get()->accessibility_controller();
-    controller->SetSpokenFeedbackEnabled(!controller->IsSpokenFeedbackEnabled(),
-                                         A11Y_NOTIFICATION_SHOW);
+    Shell::Get()->accessibility_delegate()->ToggleSpokenFeedback(
+        A11Y_NOTIFICATION_SHOW);
   }
 }
 
diff --git a/ash/accelerators/spoken_feedback_toggler_unittest.cc b/ash/accelerators/spoken_feedback_toggler_unittest.cc
index 9efc979..543cd52 100644
--- a/ash/accelerators/spoken_feedback_toggler_unittest.cc
+++ b/ash/accelerators/spoken_feedback_toggler_unittest.cc
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 #include "ash/accelerators/spoken_feedback_toggler.h"
-#include "ash/accessibility/accessibility_controller.h"
+#include "ash/accessibility/accessibility_delegate.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/window_util.h"
@@ -17,35 +17,34 @@
 
 TEST_F(SpokenFeedbackTogglerTest, Basic) {
   SpokenFeedbackToggler::ScopedEnablerForTest scoped;
-  AccessibilityController* controller =
-      Shell::Get()->accessibility_controller();
+  AccessibilityDelegate* delegate = Shell::Get()->accessibility_delegate();
   ui::test::EventGenerator& generator = GetEventGenerator();
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_FALSE(delegate->IsSpokenFeedbackEnabled());
 
   generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_FALSE(delegate->IsSpokenFeedbackEnabled());
   generator.ReleaseKey(ui::VKEY_F6, 0);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_FALSE(delegate->IsSpokenFeedbackEnabled());
 
   // Click and hold toggles the spoken feedback.
   generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_FALSE(delegate->IsSpokenFeedbackEnabled());
   generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
-  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_TRUE(delegate->IsSpokenFeedbackEnabled());
   generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
-  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_TRUE(delegate->IsSpokenFeedbackEnabled());
   generator.ReleaseKey(ui::VKEY_F6, 0);
-  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_TRUE(delegate->IsSpokenFeedbackEnabled());
 
   // toggle again
   generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
-  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_TRUE(delegate->IsSpokenFeedbackEnabled());
   generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_FALSE(delegate->IsSpokenFeedbackEnabled());
   generator.PressKey(ui::VKEY_F6, ui::EF_SHIFT_DOWN);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_FALSE(delegate->IsSpokenFeedbackEnabled());
   generator.ReleaseKey(ui::VKEY_F6, 0);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  EXPECT_FALSE(delegate->IsSpokenFeedbackEnabled());
 }
 
 TEST_F(SpokenFeedbackTogglerTest, PassThroughEvents) {
diff --git a/ash/accessibility/accessibility_controller.cc b/ash/accessibility/accessibility_controller.cc
index 70010e9c..8da5d7f 100644
--- a/ash/accessibility/accessibility_controller.cc
+++ b/ash/accessibility/accessibility_controller.cc
@@ -29,10 +29,13 @@
 namespace ash {
 namespace {
 
-void NotifyAccessibilityStatusChanged(
-    AccessibilityNotificationVisibility notification_visibility) {
+void NotifyAccessibilityStatusChanged() {
   Shell::Get()->system_tray_notifier()->NotifyAccessibilityStatusChanged(
-      notification_visibility);
+      A11Y_NOTIFICATION_NONE);
+}
+
+PrefService* GetActivePrefService() {
+  return Shell::Get()->session_controller()->GetActivePrefService();
 }
 
 }  // namespace
@@ -61,8 +64,6 @@
     registry->RegisterBooleanPref(prefs::kAccessibilityMonoAudioEnabled, false);
     registry->RegisterBooleanPref(prefs::kAccessibilityScreenMagnifierEnabled,
                                   false);
-    registry->RegisterBooleanPref(prefs::kAccessibilitySpokenFeedbackEnabled,
-                                  false);
     return;
   }
 
@@ -73,7 +74,6 @@
   registry->RegisterForeignPref(prefs::kAccessibilityLargeCursorDipSize);
   registry->RegisterForeignPref(prefs::kAccessibilityMonoAudioEnabled);
   registry->RegisterForeignPref(prefs::kAccessibilityScreenMagnifierEnabled);
-  registry->RegisterForeignPref(prefs::kAccessibilitySpokenFeedbackEnabled);
 }
 
 void AccessibilityController::BindRequest(
@@ -117,22 +117,6 @@
   return mono_audio_enabled_;
 }
 
-void AccessibilityController::SetSpokenFeedbackEnabled(
-    bool enabled,
-    AccessibilityNotificationVisibility notify) {
-  PrefService* prefs = GetActivePrefService();
-  if (!prefs)
-    return;
-  spoken_feedback_notification_ = notify;
-  prefs->SetBoolean(prefs::kAccessibilitySpokenFeedbackEnabled, enabled);
-  prefs->CommitPendingWrite();
-  spoken_feedback_notification_ = A11Y_NOTIFICATION_NONE;
-}
-
-bool AccessibilityController::IsSpokenFeedbackEnabled() const {
-  return spoken_feedback_enabled_;
-}
-
 void AccessibilityController::TriggerAccessibilityAlert(
     mojom::AccessibilityAlert alert) {
   if (client_)
@@ -154,11 +138,6 @@
   ObservePrefs(prefs);
 }
 
-void AccessibilityController::SetPrefServiceForTest(PrefService* prefs) {
-  pref_service_for_test_ = prefs;
-  ObservePrefs(prefs);
-}
-
 void AccessibilityController::FlushMojoForTest() {
   client_.FlushForTesting();
 }
@@ -183,22 +162,11 @@
       prefs::kAccessibilityMonoAudioEnabled,
       base::Bind(&AccessibilityController::UpdateMonoAudioFromPref,
                  base::Unretained(this)));
-  pref_change_registrar_->Add(
-      prefs::kAccessibilitySpokenFeedbackEnabled,
-      base::Bind(&AccessibilityController::UpdateSpokenFeedbackFromPref,
-                 base::Unretained(this)));
 
   // Load current state.
   UpdateHighContrastFromPref();
   UpdateLargeCursorFromPref();
   UpdateMonoAudioFromPref();
-  UpdateSpokenFeedbackFromPref();
-}
-
-PrefService* AccessibilityController::GetActivePrefService() const {
-  if (pref_service_for_test_)
-    return pref_service_for_test_;
-  return Shell::Get()->session_controller()->GetActivePrefService();
 }
 
 void AccessibilityController::UpdateHighContrastFromPref() {
@@ -211,7 +179,7 @@
 
   high_contrast_enabled_ = enabled;
 
-  NotifyAccessibilityStatusChanged(A11Y_NOTIFICATION_NONE);
+  NotifyAccessibilityStatusChanged();
 
   // Under mash the UI service (window server) handles high contrast mode.
   if (Shell::GetAshConfig() == Config::MASH) {
@@ -243,7 +211,7 @@
   large_cursor_enabled_ = enabled;
   large_cursor_size_in_dip_ = size;
 
-  NotifyAccessibilityStatusChanged(A11Y_NOTIFICATION_NONE);
+  NotifyAccessibilityStatusChanged();
 
   ShellPort::Get()->SetCursorSize(
       large_cursor_enabled_ ? ui::CursorSize::kLarge : ui::CursorSize::kNormal);
@@ -260,24 +228,8 @@
 
   mono_audio_enabled_ = enabled;
 
-  NotifyAccessibilityStatusChanged(A11Y_NOTIFICATION_NONE);
+  NotifyAccessibilityStatusChanged();
   chromeos::CrasAudioHandler::Get()->SetOutputMonoEnabled(enabled);
 }
 
-void AccessibilityController::UpdateSpokenFeedbackFromPref() {
-  PrefService* prefs = GetActivePrefService();
-  const bool enabled =
-      prefs->GetBoolean(prefs::kAccessibilitySpokenFeedbackEnabled);
-
-  if (spoken_feedback_enabled_ == enabled)
-    return;
-
-  spoken_feedback_enabled_ = enabled;
-
-  NotifyAccessibilityStatusChanged(spoken_feedback_notification_);
-  // TODO(warx): Chrome observes prefs change and turns on/off spoken feedback.
-  // Define a mojo call to control toggling spoken feedback (ChromeVox) once
-  // prefs ownership and registration is moved to ash.
-}
-
 }  // namespace ash
diff --git a/ash/accessibility/accessibility_controller.h b/ash/accessibility/accessibility_controller.h
index 9c14335..be6c88b2 100644
--- a/ash/accessibility/accessibility_controller.h
+++ b/ash/accessibility/accessibility_controller.h
@@ -9,7 +9,6 @@
 
 #include "ash/ash_constants.h"
 #include "ash/ash_export.h"
-#include "ash/public/cpp/accessibility_types.h"
 #include "ash/public/interfaces/accessibility_controller.mojom.h"
 #include "ash/session/session_observer.h"
 #include "base/macros.h"
@@ -50,10 +49,6 @@
   void SetMonoAudioEnabled(bool enabled);
   bool IsMonoAudioEnabled() const;
 
-  void SetSpokenFeedbackEnabled(bool enabled,
-                                AccessibilityNotificationVisibility notify);
-  bool IsSpokenFeedbackEnabled() const;
-
   // Triggers an accessibility alert to give the user feedback.
   void TriggerAccessibilityAlert(mojom::AccessibilityAlert alert);
 
@@ -64,9 +59,6 @@
   void OnSigninScreenPrefServiceInitialized(PrefService* prefs) override;
   void OnActiveUserPrefServiceChanged(PrefService* prefs) override;
 
-  // TODO(warx): remove this method for browser tests (crbug.com/789285).
-  void SetPrefServiceForTest(PrefService* prefs);
-
   // Test helpers:
   void FlushMojoForTest();
 
@@ -75,14 +67,9 @@
   // initial settings.
   void ObservePrefs(PrefService* prefs);
 
-  // Returns |pref_service_for_test_| if not null, otherwise return
-  // SessionController::GetActivePrefService().
-  PrefService* GetActivePrefService() const;
-
   void UpdateHighContrastFromPref();
   void UpdateLargeCursorFromPref();
   void UpdateMonoAudioFromPref();
-  void UpdateSpokenFeedbackFromPref();
 
   service_manager::Connector* connector_ = nullptr;
   std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
@@ -97,12 +84,6 @@
   bool large_cursor_enabled_ = false;
   int large_cursor_size_in_dip_ = kDefaultLargeCursorSize;
   bool mono_audio_enabled_ = false;
-  bool spoken_feedback_enabled_ = false;
-
-  AccessibilityNotificationVisibility spoken_feedback_notification_ =
-      A11Y_NOTIFICATION_NONE;
-
-  PrefService* pref_service_for_test_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(AccessibilityController);
 };
diff --git a/ash/accessibility/accessibility_controller_unittest.cc b/ash/accessibility/accessibility_controller_unittest.cc
index 5f1e64e..b441e91 100644
--- a/ash/accessibility/accessibility_controller_unittest.cc
+++ b/ash/accessibility/accessibility_controller_unittest.cc
@@ -23,15 +23,10 @@
   // AccessibilityObserver:
   void OnAccessibilityStatusChanged(
       AccessibilityNotificationVisibility notify) override {
-    if (notify == A11Y_NOTIFICATION_NONE) {
-      ++notification_none_changed_;
-    } else if (notify == A11Y_NOTIFICATION_SHOW) {
-      ++notification_show_changed_;
-    }
+    changed_++;
   }
 
-  int notification_none_changed_ = 0;
-  int notification_show_changed_ = 0;
+  int changed_ = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TestAccessibilityObserver);
@@ -48,8 +43,6 @@
   EXPECT_TRUE(prefs->FindPreference(prefs::kAccessibilityMonoAudioEnabled));
   EXPECT_TRUE(
       prefs->FindPreference(prefs::kAccessibilityScreenMagnifierEnabled));
-  EXPECT_TRUE(
-      prefs->FindPreference(prefs::kAccessibilitySpokenFeedbackEnabled));
 }
 
 TEST_F(AccessibilityControllerTest, SetHighContrastEnabled) {
@@ -59,15 +52,15 @@
 
   TestAccessibilityObserver observer;
   Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(&observer);
-  EXPECT_EQ(0, observer.notification_none_changed_);
+  EXPECT_EQ(0, observer.changed_);
 
   controller->SetHighContrastEnabled(true);
   EXPECT_TRUE(controller->IsHighContrastEnabled());
-  EXPECT_EQ(1, observer.notification_none_changed_);
+  EXPECT_EQ(1, observer.changed_);
 
   controller->SetHighContrastEnabled(false);
   EXPECT_FALSE(controller->IsHighContrastEnabled());
-  EXPECT_EQ(2, observer.notification_none_changed_);
+  EXPECT_EQ(2, observer.changed_);
 
   Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(&observer);
 }
@@ -79,15 +72,15 @@
 
   TestAccessibilityObserver observer;
   Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(&observer);
-  EXPECT_EQ(0, observer.notification_none_changed_);
+  EXPECT_EQ(0, observer.changed_);
 
   controller->SetLargeCursorEnabled(true);
   EXPECT_TRUE(controller->IsLargeCursorEnabled());
-  EXPECT_EQ(1, observer.notification_none_changed_);
+  EXPECT_EQ(1, observer.changed_);
 
   controller->SetLargeCursorEnabled(false);
   EXPECT_FALSE(controller->IsLargeCursorEnabled());
-  EXPECT_EQ(2, observer.notification_none_changed_);
+  EXPECT_EQ(2, observer.changed_);
 
   Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(&observer);
 }
@@ -116,38 +109,15 @@
 
   TestAccessibilityObserver observer;
   Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(&observer);
-  EXPECT_EQ(0, observer.notification_none_changed_);
+  EXPECT_EQ(0, observer.changed_);
 
   controller->SetMonoAudioEnabled(true);
   EXPECT_TRUE(controller->IsMonoAudioEnabled());
-  EXPECT_EQ(1, observer.notification_none_changed_);
+  EXPECT_EQ(1, observer.changed_);
 
   controller->SetMonoAudioEnabled(false);
   EXPECT_FALSE(controller->IsMonoAudioEnabled());
-  EXPECT_EQ(2, observer.notification_none_changed_);
-
-  Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(&observer);
-}
-
-TEST_F(AccessibilityControllerTest, SetSpokenFeedbackEnabled) {
-  AccessibilityController* controller =
-      Shell::Get()->accessibility_controller();
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
-
-  TestAccessibilityObserver observer;
-  Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(&observer);
-  EXPECT_EQ(0, observer.notification_none_changed_);
-  EXPECT_EQ(0, observer.notification_show_changed_);
-
-  controller->SetSpokenFeedbackEnabled(true, A11Y_NOTIFICATION_SHOW);
-  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
-  EXPECT_EQ(0, observer.notification_none_changed_);
-  EXPECT_EQ(1, observer.notification_show_changed_);
-
-  controller->SetSpokenFeedbackEnabled(false, A11Y_NOTIFICATION_NONE);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
-  EXPECT_EQ(1, observer.notification_none_changed_);
-  EXPECT_EQ(1, observer.notification_show_changed_);
+  EXPECT_EQ(2, observer.changed_);
 
   Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(&observer);
 }
diff --git a/ash/accessibility/accessibility_delegate.h b/ash/accessibility/accessibility_delegate.h
index 8e8deb0..15870f0b 100644
--- a/ash/accessibility/accessibility_delegate.h
+++ b/ash/accessibility/accessibility_delegate.h
@@ -21,6 +21,13 @@
  public:
   virtual ~AccessibilityDelegate() {}
 
+  // Invoked to toggle spoken feedback for accessibility
+  virtual void ToggleSpokenFeedback(
+      AccessibilityNotificationVisibility notify) = 0;
+
+  // Returns true if spoken feedback is enabled.
+  virtual bool IsSpokenFeedbackEnabled() const = 0;
+
   // Invoked to enable the screen magnifier.
   virtual void SetMagnifierEnabled(bool enabled) = 0;
 
diff --git a/ash/accessibility/default_accessibility_delegate.cc b/ash/accessibility/default_accessibility_delegate.cc
index 2da9584..f3e6183 100644
--- a/ash/accessibility/default_accessibility_delegate.cc
+++ b/ash/accessibility/default_accessibility_delegate.cc
@@ -15,6 +15,10 @@
 
 DefaultAccessibilityDelegate::~DefaultAccessibilityDelegate() = default;
 
+bool DefaultAccessibilityDelegate::IsSpokenFeedbackEnabled() const {
+  return spoken_feedback_enabled_;
+}
+
 void DefaultAccessibilityDelegate::SetMagnifierEnabled(bool enabled) {
   screen_magnifier_enabled_ = enabled;
 }
@@ -98,7 +102,7 @@
 bool DefaultAccessibilityDelegate::ShouldShowAccessibilityMenu() const {
   AccessibilityController* controller =
       Shell::Get()->accessibility_controller();
-  return controller->IsSpokenFeedbackEnabled() || screen_magnifier_enabled_ ||
+  return spoken_feedback_enabled_ || screen_magnifier_enabled_ ||
          autoclick_enabled_ || virtual_keyboard_enabled_ ||
          controller->IsMonoAudioEnabled() ||
          controller->IsLargeCursorEnabled() ||
@@ -111,6 +115,11 @@
 
 void DefaultAccessibilityDelegate::SilenceSpokenFeedback() const {}
 
+void DefaultAccessibilityDelegate::ToggleSpokenFeedback(
+    AccessibilityNotificationVisibility notify) {
+  spoken_feedback_enabled_ = !spoken_feedback_enabled_;
+}
+
 void DefaultAccessibilityDelegate::SaveScreenMagnifierScale(double scale) {}
 
 double DefaultAccessibilityDelegate::GetSavedScreenMagnifierScale() {
diff --git a/ash/accessibility/default_accessibility_delegate.h b/ash/accessibility/default_accessibility_delegate.h
index 71fe6946..74ca6f193 100644
--- a/ash/accessibility/default_accessibility_delegate.h
+++ b/ash/accessibility/default_accessibility_delegate.h
@@ -17,6 +17,7 @@
   DefaultAccessibilityDelegate();
   ~DefaultAccessibilityDelegate() override;
 
+  bool IsSpokenFeedbackEnabled() const override;
   void SetMagnifierEnabled(bool enabled) override;
   bool IsMagnifierEnabled() const override;
   void SetAutoclickEnabled(bool enabled) override;
@@ -40,6 +41,8 @@
   bool ShouldShowAccessibilityMenu() const override;
   bool IsBrailleDisplayConnected() const override;
   void SilenceSpokenFeedback() const override;
+  void ToggleSpokenFeedback(
+      AccessibilityNotificationVisibility notify) override;
   void SaveScreenMagnifierScale(double scale) override;
   double GetSavedScreenMagnifierScale() override;
   bool ShouldToggleSpokenFeedbackViaTouch() override;
@@ -49,6 +52,7 @@
   void HandleAccessibilityGesture(ui::AXGesture gesture) override;
 
  private:
+  bool spoken_feedback_enabled_ = false;
   bool screen_magnifier_enabled_ = false;
   bool autoclick_enabled_ = false;
   bool virtual_keyboard_enabled_ = false;
diff --git a/ash/ash_touch_exploration_manager_chromeos.cc b/ash/ash_touch_exploration_manager_chromeos.cc
index c090a49b..a453885 100644
--- a/ash/ash_touch_exploration_manager_chromeos.cc
+++ b/ash/ash_touch_exploration_manager_chromeos.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <vector>
 
-#include "ash/accessibility/accessibility_controller.h"
 #include "ash/accessibility/accessibility_delegate.h"
 #include "ash/accessibility/accessibility_focus_ring_controller.h"
 #include "ash/keyboard/keyboard_observer_register.h"
@@ -68,7 +67,7 @@
 }
 
 void AshTouchExplorationManager::SilenceSpokenFeedback() {
-  if (Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled())
+  if (Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled())
     Shell::Get()->accessibility_delegate()->SilenceSpokenFeedback();
 }
 
@@ -136,12 +135,8 @@
 
 void AshTouchExplorationManager::ToggleSpokenFeedback() {
   AccessibilityDelegate* delegate = Shell::Get()->accessibility_delegate();
-  if (delegate->ShouldToggleSpokenFeedbackViaTouch()) {
-    AccessibilityController* controller =
-        Shell::Get()->accessibility_controller();
-    controller->SetSpokenFeedbackEnabled(!controller->IsSpokenFeedbackEnabled(),
-                                         ash::A11Y_NOTIFICATION_SHOW);
-  }
+  if (delegate->ShouldToggleSpokenFeedbackViaTouch())
+    delegate->ToggleSpokenFeedback(ash::A11Y_NOTIFICATION_SHOW);
 }
 
 void AshTouchExplorationManager::OnWindowActivated(
@@ -185,7 +180,7 @@
           aura::client::kAccessibilityTouchExplorationPassThrough);
 
   const bool spoken_feedback_enabled =
-      Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled();
+      Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled();
 
   if (!touch_accessibility_enabler_) {
     // Always enable gesture to toggle spoken feedback.
diff --git a/ash/frame/custom_frame_view_ash.cc b/ash/frame/custom_frame_view_ash.cc
index 6b85e86..23e918d 100644
--- a/ash/frame/custom_frame_view_ash.cc
+++ b/ash/frame/custom_frame_view_ash.cc
@@ -162,25 +162,6 @@
 
 }  // namespace
 
-////////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAshBase, public:
-
-CustomFrameViewAshBase::CustomFrameViewAshBase() {
-  Shell::Get()->AddShellObserver(this);
-}
-
-CustomFrameViewAshBase::~CustomFrameViewAshBase() {
-  Shell::Get()->RemoveShellObserver(this);
-}
-
-void CustomFrameViewAshBase::OnOverviewModeStarting() {
-  SetShouldPaintHeader(false);
-}
-
-void CustomFrameViewAshBase::OnOverviewModeEnded() {
-  SetShouldPaintHeader(true);
-}
-
 // static
 bool CustomFrameViewAsh::use_empty_minimum_size_for_test_ = false;
 
@@ -285,7 +266,7 @@
   int onscreen_height = header_height_
                             ? *header_height_
                             : header_view_->GetPreferredOnScreenHeight();
-  if (onscreen_height == 0) {
+  if (onscreen_height == 0 || !enabled()) {
     header_view_->SetVisible(false);
   } else {
     const int height =
@@ -340,9 +321,12 @@
         new CustomFrameViewAshWindowStateDelegate(window_state, this,
                                                   enable_immersive)));
   }
+  Shell::Get()->AddShellObserver(this);
 }
 
-CustomFrameViewAsh::~CustomFrameViewAsh() = default;
+CustomFrameViewAsh::~CustomFrameViewAsh() {
+  Shell::Get()->RemoveShellObserver(this);
+}
 
 void CustomFrameViewAsh::InitImmersiveFullscreenControllerForView(
     ImmersiveFullscreenController* immersive_fullscreen_controller) {
@@ -428,6 +412,8 @@
 }
 
 void CustomFrameViewAsh::Layout() {
+  if (!enabled())
+    return;
   views::NonClientFrameView::Layout();
   aura::Window* frame_window = frame_->GetNativeWindow();
   frame_window->SetProperty(aura::client::kTopViewInset,
@@ -439,7 +425,7 @@
 }
 
 gfx::Size CustomFrameViewAsh::GetMinimumSize() const {
-  if (use_empty_minimum_size_for_test_)
+  if (use_empty_minimum_size_for_test_ || !enabled())
     return gfx::Size();
 
   gfx::Size min_client_view_size(frame_->client_view()->GetMinimumSize());
@@ -495,6 +481,14 @@
   header_view_->SetShouldPaintHeader(paint);
 }
 
+void CustomFrameViewAsh::OnOverviewModeStarting() {
+  SetShouldPaintHeader(false);
+}
+
+void CustomFrameViewAsh::OnOverviewModeEnded() {
+  SetShouldPaintHeader(true);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // CustomFrameViewAsh, private:
 
@@ -513,9 +507,9 @@
 }
 
 int CustomFrameViewAsh::NonClientTopBorderHeight() const {
-  // The frame should not occupy the window area when it's not visible
-  // or in fullscreen.
-  if (frame_->IsFullscreen() || !visible())
+  // The frame should not occupy the window area when it's in fullscreen,
+  // not visible or disabled.
+  if (frame_->IsFullscreen() || !visible() || !enabled())
     return 0;
 
   const bool should_hide_titlebar_in_tablet_mode =
diff --git a/ash/frame/custom_frame_view_ash.h b/ash/frame/custom_frame_view_ash.h
index 1863663..ee408094 100644
--- a/ash/frame/custom_frame_view_ash.h
+++ b/ash/frame/custom_frame_view_ash.h
@@ -32,30 +32,14 @@
   kVisibleDisabled,
 };
 
-// A base class for v2 and ARC apps to hide header in overview mode.
-class ASH_EXPORT CustomFrameViewAshBase : public views::NonClientFrameView,
-                                          public ash::ShellObserver {
- public:
-  CustomFrameViewAshBase();
-  ~CustomFrameViewAshBase() override;
-
-  // ash::ShellObserver:
-  void OnOverviewModeStarting() override;
-  void OnOverviewModeEnded() override;
-
-  // If |paint| is false, we should not paint the header. Used for overview mode
-  // with OnOverviewModeStarting() and OnOverviewModeEnded() to hide/show the
-  // header of v2 and ARC apps.
-  virtual void SetShouldPaintHeader(bool paint) {}
-};
-
 // A NonClientFrameView used for packaged apps, dialogs and other non-browser
 // windows. It supports immersive fullscreen. When in immersive fullscreen, the
 // client view takes up the entire widget and the window header is an overlay.
 // The window header overlay slides onscreen when the user hovers the mouse at
 // the top of the screen. See also views::CustomFrameView and
 // BrowserNonClientFrameViewAsh.
-class ASH_EXPORT CustomFrameViewAsh : public CustomFrameViewAshBase {
+class ASH_EXPORT CustomFrameViewAsh : public views::NonClientFrameView,
+                                      public ash::ShellObserver {
  public:
   // Internal class name.
   static const char kViewClassName[];
@@ -116,8 +100,14 @@
   void SchedulePaintInRect(const gfx::Rect& r) override;
   void SetVisible(bool visible) override;
 
-  // ash::CustomFrameViewAshBase:
-  void SetShouldPaintHeader(bool paint) override;
+  // If |paint| is false, we should not paint the header. Used for overview mode
+  // with OnOverviewModeStarting() and OnOverviewModeEnded() to hide/show the
+  // header of v2 and ARC apps.
+  virtual void SetShouldPaintHeader(bool paint);
+
+  // ash::ShellObserver:
+  void OnOverviewModeStarting() override;
+  void OnOverviewModeEnded() override;
 
   const views::View* GetAvatarIconViewForTest() const;
 
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc
index 72d58e9..a6946d5 100644
--- a/ash/system/ime_menu/ime_menu_tray.cc
+++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -4,7 +4,6 @@
 
 #include "ash/system/ime_menu/ime_menu_tray.h"
 
-#include "ash/accessibility/accessibility_controller.h"
 #include "ash/accessibility/accessibility_delegate.h"
 #include "ash/ash_constants.h"
 #include "ash/ime/ime_controller.h"
@@ -509,7 +508,7 @@
 }
 
 bool ImeMenuTray::ShouldEnableExtraKeyboardAccessibility() {
-  return Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled();
+  return Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled();
 }
 
 void ImeMenuTray::HideBubble(const views::TrayBubbleView* bubble_view) {
diff --git a/ash/system/palette/palette_tray.cc b/ash/system/palette/palette_tray.cc
index bb8aab1..fcf09663 100644
--- a/ash/system/palette/palette_tray.cc
+++ b/ash/system/palette/palette_tray.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "ash/accessibility/accessibility_controller.h"
+#include "ash/accessibility/accessibility_delegate.h"
 #include "ash/public/cpp/ash_pref_names.h"
 #include "ash/public/cpp/config.h"
 #include "ash/public/cpp/stylus_utils.h"
@@ -333,7 +333,7 @@
 }
 
 bool PaletteTray::ShouldEnableExtraKeyboardAccessibility() {
-  return Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled();
+  return Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled();
 }
 
 void PaletteTray::HideBubble(const views::TrayBubbleView* bubble_view) {
diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc
index 62f1e1a..df22319b 100644
--- a/ash/system/tray/system_tray.cc
+++ b/ash/system/tray/system_tray.cc
@@ -9,7 +9,6 @@
 #include <memory>
 #include <vector>
 
-#include "ash/accessibility/accessibility_controller.h"
 #include "ash/login_status.h"
 #include "ash/metrics/user_metrics_recorder.h"
 #include "ash/public/cpp/ash_switches.h"
@@ -622,7 +621,7 @@
   // e.g. volume slider. Persistent system bubble is a bubble which is not
   // closed even if user clicks outside of the bubble.
   return system_bubble_ && !system_bubble_->is_persistent() &&
-         Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled();
+         Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled();
 }
 
 void SystemTray::HideBubble(const TrayBubbleView* bubble_view) {
diff --git a/ash/system/tray_accessibility.cc b/ash/system/tray_accessibility.cc
index bf37398..4ca6c379 100644
--- a/ash/system/tray_accessibility.cc
+++ b/ash/system/tray_accessibility.cc
@@ -63,7 +63,7 @@
   AccessibilityController* controller =
       Shell::Get()->accessibility_controller();
   uint32_t state = A11Y_NONE;
-  if (controller->IsSpokenFeedbackEnabled())
+  if (delegate->IsSpokenFeedbackEnabled())
     state |= A11Y_SPOKEN_FEEDBACK;
   if (controller->IsHighContrastEnabled())
     state |= A11Y_HIGH_CONTRAST;
@@ -157,7 +157,7 @@
   AccessibilityController* controller =
       Shell::Get()->accessibility_controller();
 
-  spoken_feedback_enabled_ = controller->IsSpokenFeedbackEnabled();
+  spoken_feedback_enabled_ = delegate->IsSpokenFeedbackEnabled();
   TrayPopupUtils::UpdateCheckMarkVisibility(spoken_feedback_view_,
                                             spoken_feedback_enabled_);
 
@@ -215,7 +215,7 @@
   AccessibilityController* controller =
       Shell::Get()->accessibility_controller();
 
-  spoken_feedback_enabled_ = controller->IsSpokenFeedbackEnabled();
+  spoken_feedback_enabled_ = delegate->IsSpokenFeedbackEnabled();
   spoken_feedback_view_ = AddScrollListCheckableItem(
       kSystemMenuAccessibilityChromevoxIcon,
       l10n_util::GetStringUTF16(
@@ -304,11 +304,10 @@
   using base::RecordAction;
   using base::UserMetricsAction;
   if (view == spoken_feedback_view_) {
-    bool new_state = !controller->IsSpokenFeedbackEnabled();
-    RecordAction(new_state
-                     ? UserMetricsAction("StatusArea_SpokenFeedbackEnabled")
-                     : UserMetricsAction("StatusArea_SpokenFeedbackDisabled"));
-    controller->SetSpokenFeedbackEnabled(new_state, A11Y_NOTIFICATION_NONE);
+    RecordAction(delegate->IsSpokenFeedbackEnabled()
+                     ? UserMetricsAction("StatusArea_SpokenFeedbackDisabled")
+                     : UserMetricsAction("StatusArea_SpokenFeedbackEnabled"));
+    delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE);
   } else if (view == high_contrast_view_) {
     bool new_state = !controller->IsHighContrastEnabled();
     RecordAction(new_state
diff --git a/ash/system/tray_accessibility_unittest.cc b/ash/system/tray_accessibility_unittest.cc
index 2940a63..26f1347 100644
--- a/ash/system/tray_accessibility_unittest.cc
+++ b/ash/system/tray_accessibility_unittest.cc
@@ -12,11 +12,7 @@
 #include "ash/system/tray/system_tray_notifier.h"
 #include "ash/system/tray/system_tray_test_api.h"
 #include "ash/test/ash_test_base.h"
-#include "base/strings/utf_string_conversions.h"
 #include "components/prefs/pref_service.h"
-#include "ui/message_center/message_center.h"
-
-using message_center::MessageCenter;
 
 namespace ash {
 namespace {
@@ -70,27 +66,5 @@
   EXPECT_FALSE(tray_item->tray_view()->visible());
 }
 
-TEST_F(TrayAccessibilityTest, ShowNotificationOnSpokenFeedback) {
-  const base::string16 kChromeVoxEnabledTitle =
-      base::ASCIIToUTF16("ChromeVox enabled");
-  const base::string16 kChromeVoxEnabled =
-      base::ASCIIToUTF16("Press Ctrl + Alt + Z to disable spoken feedback.");
-  AccessibilityController* controller =
-      Shell::Get()->accessibility_controller();
-
-  // Enabling spoken feedback should show the notification.
-  controller->SetSpokenFeedbackEnabled(true, A11Y_NOTIFICATION_SHOW);
-  message_center::NotificationList::Notifications notifications =
-      MessageCenter::Get()->GetVisibleNotifications();
-  EXPECT_EQ(1u, notifications.size());
-  EXPECT_EQ(kChromeVoxEnabledTitle, (*notifications.begin())->title());
-  EXPECT_EQ(kChromeVoxEnabled, (*notifications.begin())->message());
-
-  // Disabling spoken feedback should not show any notification.
-  controller->SetSpokenFeedbackEnabled(false, A11Y_NOTIFICATION_SHOW);
-  notifications = MessageCenter::Get()->GetVisibleNotifications();
-  EXPECT_EQ(0u, notifications.size());
-}
-
 }  // namespace
 }  // namespace ash
diff --git a/ash/system/web_notification/web_notification_tray.cc b/ash/system/web_notification/web_notification_tray.cc
index 73cf1d3..6f9a0ee 100644
--- a/ash/system/web_notification/web_notification_tray.cc
+++ b/ash/system/web_notification/web_notification_tray.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "ash/accessibility/accessibility_controller.h"
+#include "ash/accessibility/accessibility_delegate.h"
 #include "ash/message_center/message_center_bubble.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/resources/vector_icons/vector_icons.h"
@@ -489,7 +489,7 @@
 }
 
 bool WebNotificationTray::ShouldEnableExtraKeyboardAccessibility() {
-  return Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled();
+  return Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled();
 }
 
 void WebNotificationTray::HideBubble(const views::TrayBubbleView* bubble_view) {
diff --git a/ash/wm/client_controlled_state.cc b/ash/wm/client_controlled_state.cc
index a02c978..b402b92 100644
--- a/ash/wm/client_controlled_state.cc
+++ b/ash/wm/client_controlled_state.cc
@@ -45,7 +45,7 @@
       return;
     }
     mojom::WindowStateType next_state_type = GetStateForTransitionEvent(event);
-    delegate_->HandleWindowStateRequest(state_type_, next_state_type);
+    delegate_->HandleWindowStateRequest(window_state, next_state_type);
     mojom::WindowStateType old_state_type = state_type_;
 
     bool was_pinned = window_state->IsPinned();
@@ -74,7 +74,7 @@
       VLOG(1) << "Processing State Transtion: event=" << event->type()
               << ", state=" << state_type_ << ", next_state=" << next_state;
       // Then ask delegate to handle the window state change.
-      delegate_->HandleWindowStateRequest(state_type_, next_state);
+      delegate_->HandleWindowStateRequest(window_state, next_state);
       break;
     }
     case WM_EVENT_SHOW_INACTIVE:
@@ -152,7 +152,7 @@
         // In pinned state, it should ignore the SetBounds from window manager
         // or user.
       } else {
-        delegate_->HandleBoundsRequest(window_state->GetStateType(),
+        delegate_->HandleBoundsRequest(window_state,
                                        set_bounds_event->requested_bounds());
       }
       break;
diff --git a/ash/wm/client_controlled_state.h b/ash/wm/client_controlled_state.h
index cdfe54c..ea88e02 100644
--- a/ash/wm/client_controlled_state.h
+++ b/ash/wm/client_controlled_state.h
@@ -30,16 +30,16 @@
   class Delegate {
    public:
     virtual ~Delegate() = default;
-    // Handles the state change from |current_state| to |requested_state|.
+    // Handles the state change of |window_state| to |requested_state|.
     // Delegate may decide to ignore the state change, proceed with the state
     // change, or can move to a different state.
     virtual void HandleWindowStateRequest(
-        mojom::WindowStateType current_state,
+        WindowState* window_state,
         mojom::WindowStateType requested_state) = 0;
-    // Handles the bounds change request. |current_state| specifies the current
-    // window state. Delegate may choose to ignore the request, set the given
-    // bounds, or set the different bounds.
-    virtual void HandleBoundsRequest(mojom::WindowStateType current_state,
+    // Handles the bounds change request for |window_state|.  Delegate
+    // may choose to ignore the request, set the given bounds, or set
+    // the different bounds.
+    virtual void HandleBoundsRequest(WindowState* window_state,
                                      const gfx::Rect& requested_bounds) = 0;
   };
 
diff --git a/ash/wm/client_controlled_state_unittest.cc b/ash/wm/client_controlled_state_unittest.cc
index c4fd7a920..e1d2f8e 100644
--- a/ash/wm/client_controlled_state_unittest.cc
+++ b/ash/wm/client_controlled_state_unittest.cc
@@ -25,13 +25,13 @@
   TestClientControlledStateDelegate() = default;
   ~TestClientControlledStateDelegate() override = default;
 
-  void HandleWindowStateRequest(mojom::WindowStateType current_state,
+  void HandleWindowStateRequest(WindowState* window_state,
                                 mojom::WindowStateType next_state) override {
-    old_state_ = current_state;
+    old_state_ = window_state->GetStateType();
     new_state_ = next_state;
   }
 
-  void HandleBoundsRequest(mojom::WindowStateType current_state,
+  void HandleBoundsRequest(WindowState* window_state,
                            const gfx::Rect& bounds) override {
     requested_bounds_ = bounds;
   }
diff --git a/ash/wm/workspace/backdrop_controller.cc b/ash/wm/workspace/backdrop_controller.cc
index 39b8418..87785864c 100644
--- a/ash/wm/workspace/backdrop_controller.cc
+++ b/ash/wm/workspace/backdrop_controller.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "ash/accessibility/accessibility_controller.h"
 #include "ash/accessibility/accessibility_delegate.h"
 #include "ash/public/cpp/app_types.h"
 #include "ash/public/cpp/shell_window_ids.h"
@@ -191,7 +190,7 @@
     return;
 
   bool enabled =
-      Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled();
+      Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled();
   if (enabled) {
     if (!backdrop_event_handler_) {
       backdrop_event_handler_ = std::make_unique<BackdropEventHandler>();
@@ -229,7 +228,7 @@
   if (window->GetProperty(aura::client::kAppType) ==
           static_cast<int>(AppType::ARC_APP) &&
       wm::IsActiveWindow(window) &&
-      Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled()) {
+      Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled()) {
     return true;
   }
 
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc
index 9b1b30f5..a2d2763 100644
--- a/ash/wm/workspace/workspace_layout_manager_unittest.cc
+++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -7,7 +7,6 @@
 #include <string>
 #include <utility>
 
-#include "ash/accessibility/accessibility_controller.h"
 #include "ash/accessibility/test_accessibility_delegate.h"
 #include "ash/app_list/test_app_list_presenter_impl.h"
 #include "ash/frame/custom_frame_view_ash.h"
@@ -25,6 +24,7 @@
 #include "ash/shell.h"
 #include "ash/shell_observer.h"
 #include "ash/shell_test_api.h"
+#include "ash/system/tray/system_tray_notifier.h"
 #include "ash/test/ash_test_base.h"
 #include "ash/wm/fullscreen_window_finder.h"
 #include "ash/wm/overview/window_selector_controller.h"
@@ -1325,10 +1325,12 @@
   EXPECT_EQ(kNoSoundKey, accessibility_delegate->GetPlayedEarconAndReset());
 
   // Enable spoken feedback.
-  AccessibilityController* controller =
-      Shell::Get()->accessibility_controller();
-  controller->SetSpokenFeedbackEnabled(true, A11Y_NOTIFICATION_NONE);
-  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
+  Shell::Get()->accessibility_delegate()->ToggleSpokenFeedback(
+      ash::A11Y_NOTIFICATION_NONE);
+  Shell::Get()->system_tray_notifier()->NotifyAccessibilityStatusChanged(
+      ash::A11Y_NOTIFICATION_NONE);
+  EXPECT_TRUE(
+      Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled());
 
   generator.MoveMouseTo(300, 300);
   generator.ClickLeftButton();
@@ -1340,8 +1342,12 @@
   EXPECT_EQ(kNoSoundKey, accessibility_delegate->GetPlayedEarconAndReset());
 
   // Disable spoken feedback. Shadow underlay is restored.
-  controller->SetSpokenFeedbackEnabled(false, A11Y_NOTIFICATION_NONE);
-  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+  Shell::Get()->accessibility_delegate()->ToggleSpokenFeedback(
+      A11Y_NOTIFICATION_NONE);
+  Shell::Get()->system_tray_notifier()->NotifyAccessibilityStatusChanged(
+      A11Y_NOTIFICATION_NONE);
+  EXPECT_FALSE(
+      Shell::Get()->accessibility_delegate()->IsSpokenFeedbackEnabled());
 
   generator.MoveMouseTo(300, 300);
   generator.ClickLeftButton();
@@ -1435,11 +1441,11 @@
   TestAccessibilityDelegate* accessibility_delegate =
       static_cast<TestAccessibilityDelegate*>(
           Shell::Get()->accessibility_delegate());
-  AccessibilityController* controller =
-      Shell::Get()->accessibility_controller();
 
-  controller->SetSpokenFeedbackEnabled(true, A11Y_NOTIFICATION_NONE);
-  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
+  accessibility_delegate->ToggleSpokenFeedback(A11Y_NOTIFICATION_NONE);
+  Shell::Get()->system_tray_notifier()->NotifyAccessibilityStatusChanged(
+      A11Y_NOTIFICATION_NONE);
+  EXPECT_TRUE(accessibility_delegate->IsSpokenFeedbackEnabled());
 
   aura::test::TestWindowDelegate delegate;
   std::unique_ptr<aura::Window> window_arc(CreateTestWindowInShellWithDelegate(
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 6239096..28ebd2c 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2759,11 +2759,12 @@
       "test/android/javatests/src/org/chromium/base/test/params/ParameterAnnotations.java",
       "test/android/javatests/src/org/chromium/base/test/params/ParameterProvider.java",
       "test/android/javatests/src/org/chromium/base/test/util/AdvancedMockContext.java",
-      "test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessor.java",
+      "test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java",
       "test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java",
       "test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java",
       "test/android/javatests/src/org/chromium/base/test/util/DisableIf.java",
       "test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java",
+      "test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java",
       "test/android/javatests/src/org/chromium/base/test/util/DisabledTest.java",
       "test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java",
       "test/android/javatests/src/org/chromium/base/test/util/Feature.java",
@@ -2822,6 +2823,7 @@
       "android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java",
       "test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java",
       "test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java",
+      "test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java",
       "test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java",
       "test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java",
       "test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java",
@@ -2836,6 +2838,7 @@
       ":base_java_process_launcher_test_support",
       ":base_java_test_support",
       "//third_party/android_support_test_runner:runner_java",
+      "//third_party/hamcrest:hamcrest_java",
     ]
     srcjar_deps = [ ":base_build_config_gen" ]
   }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java
new file mode 100644
index 0000000..d335412
--- /dev/null
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java
@@ -0,0 +1,259 @@
+// 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.
+
+package org.chromium.base.test.util;
+
+import android.support.annotation.Nullable;
+
+import org.junit.runner.Description;
+
+import org.chromium.base.VisibleForTesting;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Set;
+
+/**
+ * Utility class to help with processing annotations, going around the code to collect them, etc.
+ */
+public abstract class AnnotationProcessingUtils {
+    /**
+     * Returns the closest instance of the requested annotation or null if there is none.
+     * See {@link AnnotationExtractor} for context of "closest".
+     */
+    @SuppressWarnings("unchecked")
+    public static <A extends Annotation> A getAnnotation(Description description, Class<A> clazz) {
+        AnnotationExtractor extractor = new AnnotationExtractor(clazz);
+        return (A) extractor.getClosest(extractor.getMatchingAnnotations(description));
+    }
+
+    /**
+     * Returns the closest instance of the requested annotation or null if there is none.
+     * See {@link AnnotationExtractor} for context of "closest".
+     */
+    @SuppressWarnings("unchecked")
+    public static <A extends Annotation> A getAnnotation(AnnotatedElement element, Class<A> clazz) {
+        AnnotationExtractor extractor = new AnnotationExtractor(clazz);
+        return (A) extractor.getClosest(extractor.getMatchingAnnotations(element));
+    }
+
+    /** See {@link AnnotationExtractor} for details about the output sorting order. */
+    @SuppressWarnings("unchecked")
+    public static <A extends Annotation> List<A> getAnnotations(
+            Description description, Class<A> annotationType) {
+        return (List<A>) new AnnotationExtractor(annotationType)
+                .getMatchingAnnotations(description);
+    }
+
+    /** See {@link AnnotationExtractor} for details about the output sorting order. */
+    @SuppressWarnings("unchecked")
+    public static <A extends Annotation> List<A> getAnnotations(
+            AnnotatedElement annotatedElement, Class<A> annotationType) {
+        return (List<A>) new AnnotationExtractor(annotationType)
+                .getMatchingAnnotations(annotatedElement);
+    }
+
+    private static boolean isChromiumAnnotation(Annotation annotation) {
+        Package pkg = annotation.annotationType().getPackage();
+        return pkg != null && pkg.getName().startsWith("org.chromium");
+    }
+
+    /**
+     * Processes various types of annotated elements ({@link Class}es, {@link Annotation}s,
+     * {@link Description}s, etc.) and extracts the targeted annotations from it. The output will be
+     * sorted in BFS-like order.
+     *
+     * For example, for a method we would get in reverse order:
+     * - the method annotations
+     * - the meta-annotations present on the method annotations,
+     * - the class annotations
+     * - the meta-annotations present on the class annotations,
+     * - the annotations present on the super class,
+     * - the meta-annotations present on the super class annotations,
+     * - etc.
+     *
+     * When multiple annotations are targeted, if more than one is picked up at a given level (for
+     * example directly on the method), they will be returned in the reverse order that they were
+     * provided to the constructor.
+     *
+     * Note: We return the annotations in reverse order because we assume that if some processing
+     * is going to be made on related annotations, the later annotations would likely override
+     * modifications made by the former.
+     *
+     * Note: While resolving meta annotations, we don't expand the explorations to annotations types
+     * that have already been visited. Please file a bug and assign to dgn@ if you think it caused
+     * an issue.
+     */
+    public static class AnnotationExtractor {
+        private final List<Class<? extends Annotation>> mAnnotationTypes;
+        private final Comparator<Class<? extends Annotation>> mAnnotationTypeComparator;
+        private final Comparator<Annotation> mAnnotationComparator;
+
+        @SafeVarargs
+        public AnnotationExtractor(Class<? extends Annotation>... additionalTypes) {
+            this(Arrays.asList(additionalTypes));
+        }
+
+        public AnnotationExtractor(List<Class<? extends Annotation>> additionalTypes) {
+            assert !additionalTypes.isEmpty();
+            mAnnotationTypes = Collections.unmodifiableList(additionalTypes);
+            mAnnotationTypeComparator =
+                    (t1, t2) -> mAnnotationTypes.indexOf(t1) - mAnnotationTypes.indexOf(t2);
+            mAnnotationComparator = (t1, t2)
+                    -> mAnnotationTypeComparator.compare(t1.annotationType(), t2.annotationType());
+        }
+
+        public List<Annotation> getMatchingAnnotations(Description description) {
+            return getMatchingAnnotations(new AnnotatedNode.DescriptionNode(description));
+        }
+
+        public List<Annotation> getMatchingAnnotations(AnnotatedElement annotatedElement) {
+            AnnotatedNode annotatedNode;
+            if (annotatedElement instanceof Method) {
+                annotatedNode = new AnnotatedNode.MethodNode((Method) annotatedElement);
+            } else if (annotatedElement instanceof Class) {
+                annotatedNode = new AnnotatedNode.ClassNode((Class) annotatedElement);
+            } else {
+                throw new IllegalArgumentException("Unsupported type for " + annotatedElement);
+            }
+
+            return getMatchingAnnotations(annotatedNode);
+        }
+
+        /**
+         * For a given list obtained from the extractor, returns the {@link Annotation} that would
+         * be closest from the extraction point, or {@code null} if the list is empty.
+         */
+        @Nullable
+        public Annotation getClosest(List<Annotation> annotationList) {
+            return annotationList.isEmpty() ? null : annotationList.get(annotationList.size() - 1);
+        }
+
+        @VisibleForTesting
+        Comparator<Class<? extends Annotation>> getTypeComparator() {
+            return mAnnotationTypeComparator;
+        }
+
+        private List<Annotation> getMatchingAnnotations(AnnotatedNode annotatedNode) {
+            List<Annotation> collectedAnnotations = new ArrayList<>();
+            Queue<Annotation> workingSet = new LinkedList<>();
+            Set<Class<? extends Annotation>> visited = new HashSet<>();
+
+            AnnotatedNode currentAnnotationLayer = annotatedNode;
+            while (currentAnnotationLayer != null) {
+                queueAnnotations(currentAnnotationLayer.getAnnotations(), workingSet);
+
+                while (!workingSet.isEmpty()) {
+                    sweepAnnotations(collectedAnnotations, workingSet, visited);
+                }
+
+                currentAnnotationLayer = currentAnnotationLayer.getParent();
+            }
+
+            return collectedAnnotations;
+        }
+
+        private void queueAnnotations(List<Annotation> annotations, Queue<Annotation> workingSet) {
+            Collections.sort(annotations, mAnnotationComparator);
+            workingSet.addAll(annotations);
+        }
+
+        private void sweepAnnotations(List<Annotation> collectedAnnotations,
+                Queue<Annotation> workingSet, Set<Class<? extends Annotation>> visited) {
+            // 1. Grab node at the front of the working set.
+            Annotation annotation = workingSet.remove();
+
+            // 2. If it's an annotation of interest, put it aside for the output.
+            if (mAnnotationTypes.contains(annotation.annotationType())) {
+                collectedAnnotations.add(0, annotation);
+            }
+
+            // 3. Check if we can get skip some redundant iterations and avoid cycles.
+            if (!visited.add(annotation.annotationType())) return;
+            if (!isChromiumAnnotation(annotation)) return;
+
+            // 4. Expand the working set
+            queueAnnotations(Arrays.asList(annotation.annotationType().getDeclaredAnnotations()),
+                    workingSet);
+        }
+    }
+
+    /**
+     * Abstraction to hide differences between Class, Method and Description with regards to their
+     * annotations and what should be analyzed next.
+     */
+    private static abstract class AnnotatedNode {
+        @Nullable
+        abstract AnnotatedNode getParent();
+
+        abstract List<Annotation> getAnnotations();
+
+        static class DescriptionNode extends AnnotatedNode {
+            final Description mDescription;
+
+            DescriptionNode(Description description) {
+                mDescription = description;
+            }
+
+            @Nullable
+            @Override
+            AnnotatedNode getParent() {
+                return new ClassNode(mDescription.getTestClass());
+            }
+
+            @Override
+            List<Annotation> getAnnotations() {
+                return new ArrayList<>(mDescription.getAnnotations());
+            }
+        }
+
+        static class ClassNode extends AnnotatedNode {
+            final Class<?> mClass;
+
+            ClassNode(Class<?> clazz) {
+                mClass = clazz;
+            }
+
+            @Nullable
+            @Override
+            AnnotatedNode getParent() {
+                Class<?> superClass = mClass.getSuperclass();
+                return superClass == null ? null : new ClassNode(superClass);
+            }
+
+            @Override
+            List<Annotation> getAnnotations() {
+                return Arrays.asList(mClass.getDeclaredAnnotations());
+            }
+        }
+
+        static class MethodNode extends AnnotatedNode {
+            final Method mMethod;
+
+            MethodNode(Method method) {
+                mMethod = method;
+            }
+
+            @Nullable
+            @Override
+            AnnotatedNode getParent() {
+                return new ClassNode(mMethod.getDeclaringClass());
+            }
+
+            @Override
+            List<Annotation> getAnnotations() {
+                return Arrays.asList(mMethod.getDeclaredAnnotations());
+            }
+        }
+    }
+}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessor.java b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessor.java
deleted file mode 100644
index 6286dea..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessor.java
+++ /dev/null
@@ -1,83 +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.
-
-package org.chromium.base.test.util;
-
-import android.support.annotation.Nullable;
-
-import org.junit.rules.ExternalResource;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-
-import java.lang.annotation.Annotation;
-
-/**
- * Test rule that is activated when a test or its class has a specific annotation.
- * It allows to run some code before the test (and the {@link org.junit.Before}) runs,
- * and guarantees to also run code after.
- *
- * Usage:
- *
- * <pre>
- * public class Test {
- *    &#64;Rule
- *    public AnnotationProcessor<Foo> rule = new AnnotationProcessor(Foo.class) {
- *          &#64;Override
- *          protected void before() { ... }
- *
- *          &#64;Override
- *          protected void after() { ... }
- *    };
- *
- *    &#64;Test
- *    &#64;Foo
- *    public void myTest() { ... }
- * }
- * </pre>
- *
- * @param <T> type of the annotation to match on the test case.
- */
-public abstract class AnnotationProcessor<T extends Annotation> extends ExternalResource {
-    private final Class<T> mAnnotationClass;
-    private Description mTestDescription;
-
-    @Nullable
-    private T mClassAnnotation;
-
-    @Nullable
-    private T mTestAnnotation;
-
-    public AnnotationProcessor(Class<T> annotationClass) {
-        mAnnotationClass = annotationClass;
-    }
-
-    @Override
-    public Statement apply(Statement base, Description description) {
-        mTestDescription = description;
-        mClassAnnotation = description.getTestClass().getAnnotation(mAnnotationClass);
-        mTestAnnotation = description.getAnnotation(mAnnotationClass);
-
-        if (mClassAnnotation == null && mTestAnnotation == null) return base;
-
-        // Return the wrapped statement to execute before() and after().
-        return super.apply(base, description);
-    }
-
-    /** @return {@link Description} of the current test. */
-    protected Description getTestDescription() {
-        return mTestDescription;
-    }
-
-    /** @return the annotation on the test class. */
-    @Nullable
-    protected T getClassAnnotation() {
-        return mClassAnnotation;
-    }
-
-    /** @return the annotation on the test method. */
-    @Nullable
-    protected T getTestAnnotation() {
-        return mTestAnnotation;
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java
new file mode 100644
index 0000000..9780e5eb
--- /dev/null
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java
@@ -0,0 +1,134 @@
+// 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.
+
+package org.chromium.base.test.util;
+
+import org.junit.rules.ExternalResource;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * Test rule that is activated when a test or its class has a specific annotation.
+ * It allows to run some code before the test (and the {@link org.junit.Before}) runs,
+ * and guarantees to also run code after.
+ *
+ * Usage:
+ *
+ * <pre>
+ * public class Test {
+ *    &#64;Rule
+ *    public AnnotationRule rule = new AnnotationRule(Foo.class) {
+ *          &#64;Override
+ *          protected void before() { ... }
+ *
+ *          &#64;Override
+ *          protected void after() { ... }
+ *    };
+ *
+ *    &#64;Test
+ *    &#64;Foo
+ *    public void myTest() { ... }
+ * }
+ * </pre>
+ *
+ * It can also be used to trigger for multiple annotations:
+ *
+ * <pre>
+ * &#64;DisableFoo
+ * public class Test {
+ *    &#64;Rule
+ *    public AnnotationRule rule = new AnnotationRule(EnableFoo.class, DisableFoo.class) {
+ *          &#64;Override
+ *          protected void before() {
+ *            // Loops through all the picked up annotations. For myTest(), it would process
+ *            // DisableFoo first, then EnableFoo.
+ *            for (Annotation annotation : getAnnotations()) {
+ *                if (annotation instanceof EnableFoo) { ... }
+ *                else if (annotation instanceof DisableFoo) { ... }
+ *            }
+ *          }
+ *
+ *          &#64;Override
+ *          protected void after() {
+ *            // For myTest(), would return EnableFoo as it's directly set on the method.
+ *            Annotation a = getClosestAnnotation();
+ *            ...
+ *          }
+ *    };
+ *
+ *    &#64;Test
+ *    &#64;EnableFoo
+ *    public void myTest() { ... }
+ * }
+ * </pre>
+ *
+ * @see AnnotationProcessingUtils.AnnotationExtractor
+ */
+public abstract class AnnotationRule extends ExternalResource {
+    private final AnnotationProcessingUtils.AnnotationExtractor mAnnotationExtractor;
+    private List<Annotation> mCollectedAnnotations;
+    private Description mTestDescription;
+
+    @SafeVarargs
+    public AnnotationRule(Class<? extends Annotation> firstAnnotationType,
+            Class<? extends Annotation>... additionalTypes) {
+        List<Class<? extends Annotation>> mAnnotationTypes = new ArrayList<>();
+        mAnnotationTypes.add(firstAnnotationType);
+        mAnnotationTypes.addAll(Arrays.asList(additionalTypes));
+        mAnnotationExtractor = new AnnotationProcessingUtils.AnnotationExtractor(mAnnotationTypes);
+    }
+
+    @Override
+    public Statement apply(Statement base, Description description) {
+        mTestDescription = description;
+
+        mCollectedAnnotations = mAnnotationExtractor.getMatchingAnnotations(description);
+        if (mCollectedAnnotations.isEmpty()) return base;
+
+        // Return the wrapped statement to execute before() and after().
+        return super.apply(base, description);
+    }
+
+    /** @return {@link Description} of the current test. */
+    protected Description getTestDescription() {
+        return mTestDescription;
+    }
+
+    /**
+     * @return The collected annotations that match the declared type(s).
+     * @throws NullPointerException if this is called before annotations have been collected,
+     * which happens when the rule is applied to the {@link Statement}.
+     */
+    protected List<Annotation> getAnnotations() {
+        return Collections.unmodifiableList(mCollectedAnnotations);
+    }
+
+    /**
+     * @return The closest annotation matching the provided type, or {@code null} if there is none.
+     */
+    @SuppressWarnings("unchecked")
+    protected <A extends Annotation> A getAnnotation(Class<A> annnotationType) {
+        ListIterator<Annotation> iteratorFromEnd =
+                mCollectedAnnotations.listIterator(mCollectedAnnotations.size());
+        while (iteratorFromEnd.hasPrevious()) {
+            Annotation annotation = iteratorFromEnd.previous();
+            if (annnotationType.isAssignableFrom(annotation.annotationType())) {
+                return (A) annotation;
+            }
+        }
+        return null;
+    }
+
+    protected Annotation getClosestAnnotation() {
+        assert !mCollectedAnnotations.isEmpty() : "The rule should not trigger without match.";
+        return mCollectedAnnotations.get(mCollectedAnnotations.size() - 1);
+    }
+}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java
index cbcbd5ab..e46b9799 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java
@@ -24,7 +24,8 @@
     @Override
     public boolean shouldSkip(FrameworkMethod method) {
         if (method == null) return true;
-        for (DisableIf.Build v : getAnnotations(method, DisableIf.Build.class)) {
+        for (DisableIf.Build v : AnnotationProcessingUtils.getAnnotations(
+                     method.getMethod(), DisableIf.Build.class)) {
             if (abi(v) && hardware(v) && product(v) && sdk(v)) {
                 if (!v.message().isEmpty()) {
                     Log.i(TAG, "%s is disabled: %s", method.getName(), v.message());
@@ -33,7 +34,8 @@
             }
         }
 
-        for (DisableIf.Device d : getAnnotations(method, DisableIf.Device.class)) {
+        for (DisableIf.Device d : AnnotationProcessingUtils.getAnnotations(
+                     method.getMethod(), DisableIf.Device.class)) {
             for (String deviceType : d.type()) {
                 if (deviceTypeApplies(deviceType)) {
                     Log.i(TAG, "Test " + method.getDeclaringClass().getName() + "#"
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java
index 99bd1acf..8b07c0f1 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java
@@ -27,7 +27,8 @@
     @Override
     public boolean shouldSkip(FrameworkMethod frameworkMethod) {
         int minSdkLevel = 0;
-        for (MinAndroidSdkLevel m : getAnnotations(frameworkMethod, MinAndroidSdkLevel.class)) {
+        for (MinAndroidSdkLevel m : AnnotationProcessingUtils.getAnnotations(
+                     frameworkMethod.getMethod(), MinAndroidSdkLevel.class)) {
             minSdkLevel = Math.max(minSdkLevel, m.value());
         }
         if (Build.VERSION.SDK_INT < minSdkLevel) {
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java
index 377a1ee..a27dd1f 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java
@@ -35,7 +35,8 @@
     public boolean shouldSkip(FrameworkMethod frameworkMethod) {
         if (frameworkMethod == null) return true;
 
-        for (Restriction restriction : getAnnotations(frameworkMethod, Restriction.class)) {
+        for (Restriction restriction : AnnotationProcessingUtils.getAnnotations(
+                     frameworkMethod.getMethod(), Restriction.class)) {
             for (String restrictionVal : restriction.value()) {
                 if (restrictionApplies(restrictionVal)) {
                     Log.i(TAG, "Test " + frameworkMethod.getDeclaringClass().getName() + "#"
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java
index 33dea83..d1dd7be 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java
@@ -10,11 +10,7 @@
 
 import org.chromium.base.Log;
 
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * Check whether a test case should be skipped.
@@ -49,23 +45,5 @@
             return false;
         }
     }
-
-    protected static <T extends Annotation> List<T> getAnnotations(FrameworkMethod frameworkMethod,
-            Class<T> annotationClass) {
-        return getAnnotations(frameworkMethod.getMethod(), annotationClass);
-    }
-
-    protected static <T extends Annotation> List<T> getAnnotations(AnnotatedElement element,
-            Class<T> annotationClass) {
-        AnnotatedElement parent = (element instanceof Method)
-                ? ((Method) element).getDeclaringClass()
-                : ((Class) element).getSuperclass();
-        List<T> annotations = (parent == null)
-                ? new ArrayList<T>()
-                : getAnnotations(parent, annotationClass);
-        T annotation = element.getAnnotation(annotationClass);
-        if (annotation != null) annotations.add(annotation);
-        return annotations;
-    }
 }
 
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java b/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java
new file mode 100644
index 0000000..dc4ade7
--- /dev/null
+++ b/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java
@@ -0,0 +1,375 @@
+// 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.
+
+package org.chromium.base.test.util;
+
+import static org.hamcrest.Matchers.contains;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.junit.runner.Description.createTestDescription;
+
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runner.RunWith;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+
+import org.chromium.base.test.util.AnnotationProcessingUtils.AnnotationExtractor;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+/** Test for {@link AnnotationProcessingUtils}. */
+@RunWith(BlockJUnit4ClassRunner.class)
+public class AnnotationProcessingUtilsTest {
+    @Test
+    public void testGetTargetAnnotation_NotOnClassNorMethod() {
+        TargetAnnotation retrievedAnnotation;
+
+        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
+                createTestDescription(
+                        ClassWithoutTargetAnnotation.class, "methodWithoutAnnotation"),
+                TargetAnnotation.class);
+        assertNull(retrievedAnnotation);
+    }
+
+    @Test
+    public void testGetTargetAnnotation_NotOnClassButOnMethod() {
+        TargetAnnotation retrievedAnnotation;
+
+        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
+                getTest(ClassWithoutTargetAnnotation.class, "methodWithTargetAnnotation"),
+                TargetAnnotation.class);
+        assertNotNull(retrievedAnnotation);
+    }
+
+    @Test
+    public void testGetTargetAnnotation_NotOnClassDifferentOneOnMethod() {
+        TargetAnnotation retrievedAnnotation;
+
+        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
+                getTest(ClassWithoutTargetAnnotation.class, "methodWithAnnotatedAnnotation"),
+                TargetAnnotation.class);
+        assertNull(retrievedAnnotation);
+    }
+
+    @Test
+    public void testGetTargetAnnotation_OnClassButNotOnMethod() {
+        TargetAnnotation retrievedAnnotation;
+
+        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
+                getTest(ClassWithAnnotation.class, "methodWithoutAnnotation"),
+                TargetAnnotation.class);
+        assertNotNull(retrievedAnnotation);
+        assertEquals(Location.Class, retrievedAnnotation.value());
+    }
+
+    @Test
+    public void testGetTargetAnnotation_OnClassAndMethod() {
+        TargetAnnotation retrievedAnnotation;
+
+        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
+                getTest(ClassWithAnnotation.class, "methodWithTargetAnnotation"),
+                TargetAnnotation.class);
+        assertNotNull(retrievedAnnotation);
+        assertEquals(Location.Method, retrievedAnnotation.value());
+    }
+
+    @Test
+    @Ignore("Rules not supported yet.")
+    public void testGetTargetAnnotation_OnRuleButNotOnMethod() {
+        TargetAnnotation retrievedAnnotation;
+
+        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
+                getTest(ClassWithRule.class, "methodWithoutAnnotation"), TargetAnnotation.class);
+        assertNotNull(retrievedAnnotation);
+        assertEquals(Location.Rule, retrievedAnnotation.value());
+    }
+
+    @Test
+    @Ignore("Rules not supported yet.")
+    public void testGetTargetAnnotation_OnRuleAndMethod() {
+        TargetAnnotation retrievedAnnotation;
+
+        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
+                getTest(ClassWithRule.class, "methodWithTargetAnnotation"), TargetAnnotation.class);
+        assertNotNull(retrievedAnnotation);
+        assertEquals(Location.Method, retrievedAnnotation.value());
+    }
+
+    @Test
+    public void testGetMetaAnnotation_Indirectly() {
+        MetaAnnotation retrievedAnnotation;
+
+        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
+                getTest(ClassWithoutTargetAnnotation.class, "methodWithAnnotatedAnnotation"),
+                MetaAnnotation.class);
+        assertNotNull(retrievedAnnotation);
+    }
+
+    @Test
+    public void testGetAllTargetAnnotations() {
+        List<TargetAnnotation> retrievedAnnotations;
+
+        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
+                getTest(ClassWithAnnotation.class, "methodWithTargetAnnotation"),
+                TargetAnnotation.class);
+        assertEquals(2, retrievedAnnotations.size());
+        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
+        assertEquals(Location.Method, retrievedAnnotations.get(1).value());
+    }
+
+    @Test
+    public void testGetAllTargetAnnotations_OnParentClass() {
+        List<TargetAnnotation> retrievedAnnotations;
+
+        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
+                getTest(DerivedClassWithoutAnnotation.class, "newMethodWithoutAnnotation"),
+                TargetAnnotation.class);
+        assertEquals(1, retrievedAnnotations.size());
+        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
+    }
+
+    @Test
+    public void testGetAllTargetAnnotations_OnDerivedMethodAndParentClass() {
+        List<TargetAnnotation> retrievedAnnotations;
+
+        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
+                getTest(DerivedClassWithoutAnnotation.class, "newMethodWithTargetAnnotation"),
+                TargetAnnotation.class);
+        assertEquals(2, retrievedAnnotations.size());
+        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
+        assertEquals(Location.DerivedMethod, retrievedAnnotations.get(1).value());
+    }
+
+    @Test
+    public void testGetAllTargetAnnotations_OnDerivedMethodAndParentClassAndMethod() {
+        List<TargetAnnotation> retrievedAnnotations;
+
+        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
+                getTest(DerivedClassWithoutAnnotation.class, "methodWithTargetAnnotation"),
+                TargetAnnotation.class);
+        // We should not look at the base implementation of the method. Mostly it should not happen
+        // in the context of tests.
+        assertEquals(2, retrievedAnnotations.size());
+        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
+        assertEquals(Location.DerivedMethod, retrievedAnnotations.get(1).value());
+    }
+
+    @Test
+    public void testGetAllTargetAnnotations_OnDerivedParentAndParentClass() {
+        List<TargetAnnotation> retrievedAnnotations;
+
+        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
+                getTest(DerivedClassWithAnnotation.class, "methodWithoutAnnotation"),
+                TargetAnnotation.class);
+        assertEquals(2, retrievedAnnotations.size());
+        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
+        assertEquals(Location.DerivedClass, retrievedAnnotations.get(1).value());
+    }
+
+    @Test
+    public void testGetAllAnnotations() {
+        List<Annotation> annotations;
+
+        AnnotationExtractor annotationExtractor = new AnnotationExtractor(
+                TargetAnnotation.class, MetaAnnotation.class, AnnotatedAnnotation.class);
+        annotations = annotationExtractor.getMatchingAnnotations(
+                getTest(DerivedClassWithAnnotation.class, "methodWithTwoAnnotations"));
+        assertEquals(5, annotations.size());
+
+        // Retrieved annotation order:
+        // On Parent Class
+        assertEquals(TargetAnnotation.class, annotations.get(0).annotationType());
+        assertEquals(Location.Class, ((TargetAnnotation) annotations.get(0)).value());
+
+        // On Class
+        assertEquals(TargetAnnotation.class, annotations.get(1).annotationType());
+        assertEquals(Location.DerivedClass, ((TargetAnnotation) annotations.get(1)).value());
+
+        // Meta-annotations from method
+        assertEquals(MetaAnnotation.class, annotations.get(2).annotationType());
+
+        // On Method
+        assertEquals(AnnotatedAnnotation.class, annotations.get(3).annotationType());
+        assertEquals(TargetAnnotation.class, annotations.get(4).annotationType());
+        assertEquals(Location.DerivedMethod, ((TargetAnnotation) annotations.get(4)).value());
+    }
+
+    @Test
+    public void testAnnotationExtractorSortOrder_UnknownAnnotations() {
+        AnnotationExtractor annotationExtractor = new AnnotationExtractor(Target.class);
+        Comparator<Class<? extends Annotation>> comparator =
+                annotationExtractor.getTypeComparator();
+        List<Class<? extends Annotation>> testList =
+                Arrays.asList(Rule.class, Test.class, Override.class, Target.class, Rule.class);
+        testList.sort(comparator);
+        assertThat("Unknown annotations should not be reordered and come before the known ones.",
+                testList,
+                contains(Rule.class, Test.class, Override.class, Rule.class, Target.class));
+    }
+
+    @Test
+    public void testAnnotationExtractorSortOrder_KnownAnnotations() {
+        AnnotationExtractor annotationExtractor =
+                new AnnotationExtractor(Test.class, Target.class, Rule.class);
+        Comparator<Class<? extends Annotation>> comparator =
+                annotationExtractor.getTypeComparator();
+        List<Class<? extends Annotation>> testList =
+                Arrays.asList(Rule.class, Test.class, Override.class, Target.class, Rule.class);
+        testList.sort(comparator);
+        assertThat(
+                "Known annotations should be sorted in the same order as provided to the extractor",
+                testList,
+                contains(Override.class, Test.class, Target.class, Rule.class, Rule.class));
+    }
+
+    private static Description getTest(Class<?> klass, String testName) {
+        Description description = null;
+        try {
+            description = new DummyTestRunner(klass).describe(testName);
+        } catch (InitializationError initializationError) {
+            initializationError.printStackTrace();
+            fail("DummyTestRunner initialization failed:" + initializationError.getMessage());
+        }
+        if (description == null) {
+            fail("Not test named '" + testName + "' in class" + klass.getSimpleName());
+        }
+        return description;
+    }
+
+    // region Test Data: Annotations and dummy test classes
+    private enum Location { Unspecified, Class, Method, Rule, DerivedClass, DerivedMethod }
+
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.TYPE, ElementType.METHOD})
+    private @interface TargetAnnotation {
+        Location value() default Location.Unspecified;
+    }
+
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD})
+    private @interface MetaAnnotation {}
+
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.TYPE, ElementType.METHOD})
+    @MetaAnnotation
+    private @interface AnnotatedAnnotation {}
+
+    private @interface SimpleAnnotation {}
+
+    @SimpleAnnotation
+    private static class ClassWithoutTargetAnnotation {
+        @Test
+        public void methodWithoutAnnotation() {}
+
+        @Test
+        @TargetAnnotation
+        public void methodWithTargetAnnotation() {}
+
+        @Test
+        @AnnotatedAnnotation
+        public void methodWithAnnotatedAnnotation() {}
+    }
+
+    @TargetAnnotation(Location.Class)
+    private static class ClassWithAnnotation {
+        @Test
+        public void methodWithoutAnnotation() {}
+
+        @Test
+        @TargetAnnotation(Location.Method)
+        public void methodWithTargetAnnotation() {}
+
+        @Test
+        @MetaAnnotation
+        public void methodWithMetaAnnotation() {}
+
+        @Test
+        @AnnotatedAnnotation
+        public void methodWithAnnotatedAnnotation() {}
+    }
+
+    private static class DerivedClassWithoutAnnotation extends ClassWithAnnotation {
+        @Test
+        public void newMethodWithoutAnnotation() {}
+
+        @Test
+        @TargetAnnotation(Location.DerivedMethod)
+        public void newMethodWithTargetAnnotation() {}
+
+        @Test
+        @Override
+        @TargetAnnotation(Location.DerivedMethod)
+        public void methodWithTargetAnnotation() {}
+    }
+
+    @TargetAnnotation(Location.DerivedClass)
+    private static class DerivedClassWithAnnotation extends ClassWithAnnotation {
+        @Test
+        public void newMethodWithoutAnnotation() {}
+
+        @Test
+        @AnnotatedAnnotation
+        @TargetAnnotation(Location.DerivedMethod)
+        public void methodWithTwoAnnotations() {}
+    }
+
+    private static class ClassWithRule {
+        @Rule
+        Rule1 mRule = new Rule1();
+
+        @Test
+        public void methodWithoutAnnotation() {}
+
+        @Test
+        @TargetAnnotation
+        public void methodWithTargetAnnotation() {}
+    }
+
+    @TargetAnnotation(Location.Rule)
+    @MetaAnnotation
+    private static class Rule1 implements TestRule {
+        @Override
+        public Statement apply(Statement statement, Description description) {
+            return null;
+        }
+    }
+
+    private static class DummyTestRunner extends BlockJUnit4ClassRunner {
+        public DummyTestRunner(Class<?> klass) throws InitializationError {
+            super(klass);
+        }
+
+        @Override
+        protected void collectInitializationErrors(List<Throwable> errors) {
+            // Do nothing. BlockJUnit4ClassRunner requires the class to be public, but we don't
+            // want/need it.
+        }
+
+        public Description describe(String testName) {
+            List<FrameworkMethod> tests = getTestClass().getAnnotatedMethods(Test.class);
+            for (FrameworkMethod testMethod : tests) {
+                if (testMethod.getName().equals(testName)) return describeChild(testMethod);
+            }
+            return null;
+        }
+    }
+
+    // endregion
+    }
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java
index a749184..56cbdaf 100644
--- a/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java
+++ b/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java
@@ -10,7 +10,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.model.FrameworkMethod;
-
 import org.robolectric.annotation.Config;
 
 import org.chromium.testing.local.LocalRobolectricTestRunner;
@@ -30,7 +29,7 @@
     private static class TestableSkipCheck extends SkipCheck {
         public static <T extends Annotation> List<T> getAnnotationsForTesting(
                 AnnotatedElement element, Class<T> annotationClass) {
-            return getAnnotations(element, annotationClass);
+            return AnnotationProcessingUtils.getAnnotations(element, annotationClass);
         }
 
         @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java
index ed953ca..7f911e5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java
@@ -250,6 +250,10 @@
         // Get the <meta-data> from this app's manifest.
         // Throws NameNotFoundException if the application is not installed.
         ApplicationInfo appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
+        if (appInfo == null || appInfo.metaData == null) {
+            return new JSONArray();
+        }
+
         int identifier = appInfo.metaData.getInt(ASSET_STATEMENTS_KEY);
         if (identifier == 0) {
             return new JSONArray();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
index 90ddcf7c..7e944c1 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
@@ -438,6 +438,19 @@
         verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps);
     }
 
+    /** One related Android app; Android app is not mutually related (has no asset_statements). */
+    @Test
+    @Feature({"InstalledApp"})
+    public void testOneRelatedAppNoAssetStatementsNullMetadata() {
+        RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
+                createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
+
+        FakeResources resources = new FakeResources(0x4321, null);
+        setMetaDataAndResourcesForTest(PACKAGE_NAME_1, null, resources);
+        RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplication[] {};
+        verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps);
+    }
+
     /**
      * One related Android app; Android app is related to other origins.
      *
diff --git a/chrome/app/media_router_strings.grdp b/chrome/app/media_router_strings.grdp
index 47032ef..fd375e4 100644
--- a/chrome/app/media_router_strings.grdp
+++ b/chrome/app/media_router_strings.grdp
@@ -184,6 +184,15 @@
   <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_ALWAYS_USE_MIRRORING_TITLE" desc="The title for a toggle setting to choose whether video should always be mirrored (played locally and remotely), or played only remotely.">
     Always use mirroring
   </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_FULLSCREEN_VIDEOS_DROPDOWN_TITLE" desc="The title for a toggle setting to choose whether fullscreen videos should always be mirrored (played locally and remotely), or played only remotely.">
+    Show fullscreen videos on:
+  </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_FULLSCREEN_VIDEOS_BOTH_SCREENS" desc="Settings option to play fullscreen videos both locally and remotely.">
+    Both screens
+  </message>
+  <message name="IDS_MEDIA_ROUTER_ROUTE_DETAILS_FULLSCREEN_VIDEOS_REMOTE_SCREEN" desc="Settings option to play fullscreen videos only remotely.">
+    Remote screen
+  </message>
 
   <!-- Sink List -->
   <message name="IDS_MEDIA_ROUTER_DESTINATION_MISSING" desc="Link to display when no Cast destinations are found which, on click, opens a page to the Chromecast help center explaining possible reasons why none are detected.">
diff --git a/chrome/browser/autocomplete/autocomplete_classifier_factory.cc b/chrome/browser/autocomplete/autocomplete_classifier_factory.cc
index 546f574..0d758c8 100644
--- a/chrome/browser/autocomplete/autocomplete_classifier_factory.cc
+++ b/chrome/browser/autocomplete/autocomplete_classifier_factory.cc
@@ -39,12 +39,14 @@
 std::unique_ptr<KeyedService> AutocompleteClassifierFactory::BuildInstanceFor(
     content::BrowserContext* context) {
   Profile* profile = static_cast<Profile*>(context);
+  auto provider_client =
+      base::MakeUnique<ChromeAutocompleteProviderClient>(profile);
+  auto controller = base::WrapUnique(new AutocompleteController(
+      std::move(provider_client), NULL,
+      AutocompleteClassifier::DefaultOmniboxProviders()));
   return base::MakeUnique<AutocompleteClassifier>(
-      base::WrapUnique(new AutocompleteController(
-          base::WrapUnique(new ChromeAutocompleteProviderClient(profile)), NULL,
-          AutocompleteClassifier::DefaultOmniboxProviders())),
-      std::unique_ptr<AutocompleteSchemeClassifier>(
-          new ChromeAutocompleteSchemeClassifier(profile)));
+      std::move(controller),
+      base::MakeUnique<ChromeAutocompleteSchemeClassifier>(profile));
 }
 
 AutocompleteClassifierFactory::AutocompleteClassifierFactory()
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index 3e814722..2923b0a 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -1000,8 +1000,8 @@
   profile_.BlockUntilHistoryProcessesPendingRequests();
 
   AutocompleteController controller(
-      base::WrapUnique(new ChromeAutocompleteProviderClient(&profile_)),
-      nullptr, AutocompleteProvider::TYPE_SEARCH);
+      base::MakeUnique<ChromeAutocompleteProviderClient>(&profile_), nullptr,
+      AutocompleteProvider::TYPE_SEARCH);
   AutocompleteInput input(ASCIIToUTF16("k t"),
                           metrics::OmniboxEventProto::OTHER,
                           ChromeAutocompleteSchemeClassifier(&profile_));
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
index b3467932..eac1f79 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
@@ -241,6 +241,7 @@
       switch_access_pref_handler_(
           ash::prefs::kAccessibilitySwitchAccessEnabled),
       sticky_keys_enabled_(false),
+      spoken_feedback_enabled_(false),
       autoclick_enabled_(false),
       autoclick_delay_ms_(ash::AutoclickController::GetDefaultAutoclickDelay()),
       virtual_keyboard_enabled_(false),
@@ -444,7 +445,7 @@
   spoken_feedback_notification_ = ash::A11Y_NOTIFICATION_NONE;
 }
 
-void AccessibilityManager::OnSpokenFeedbackChanged() {
+void AccessibilityManager::UpdateSpokenFeedbackFromPref() {
   if (!profile_)
     return;
 
@@ -457,6 +458,11 @@
                              weak_ptr_factory_.GetWeakPtr()));
   }
 
+  if (spoken_feedback_enabled_ == enabled)
+    return;
+
+  spoken_feedback_enabled_ = enabled;
+
   AccessibilityStatusEventDetails details(ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK,
                                           enabled,
                                           spoken_feedback_notification_);
@@ -477,8 +483,12 @@
 }
 
 bool AccessibilityManager::IsSpokenFeedbackEnabled() const {
-  return profile_ && profile_->GetPrefs()->GetBoolean(
-                         ash::prefs::kAccessibilitySpokenFeedbackEnabled);
+  return spoken_feedback_enabled_;
+}
+
+void AccessibilityManager::ToggleSpokenFeedback(
+    ash::AccessibilityNotificationVisibility notify) {
+  EnableSpokenFeedback(!IsSpokenFeedbackEnabled(), notify);
 }
 
 void AccessibilityManager::EnableHighContrast(bool enabled) {
@@ -1036,7 +1046,7 @@
                 extension_ime_util::kBrailleImeEngineId);
   bool is_enabled = (it != preload_engines.end());
   bool should_be_enabled =
-      (IsSpokenFeedbackEnabled() && braille_display_connected_);
+      (spoken_feedback_enabled_ && braille_display_connected_);
   if (is_enabled == should_be_enabled)
     return;
   if (should_be_enabled)
@@ -1113,7 +1123,7 @@
                    base::Unretained(this)));
     pref_change_registrar_->Add(
         ash::prefs::kAccessibilitySpokenFeedbackEnabled,
-        base::Bind(&AccessibilityManager::OnSpokenFeedbackChanged,
+        base::Bind(&AccessibilityManager::UpdateSpokenFeedbackFromPref,
                    base::Unretained(this)));
     pref_change_registrar_->Add(
         ash::prefs::kAccessibilityHighContrastEnabled,
@@ -1201,6 +1211,7 @@
     UpdateBrailleImeState();
   UpdateAlwaysShowMenuFromPref();
   UpdateStickyKeysFromPref();
+  UpdateSpokenFeedbackFromPref();
   UpdateAutoclickFromPref();
   UpdateAutoclickDelayFromPref();
   UpdateVirtualKeyboardFromPref();
@@ -1263,8 +1274,7 @@
   if (details.notification_type != ACCESSIBILITY_MANAGER_SHUTDOWN &&
       details.notification_type != ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE &&
       details.notification_type != ACCESSIBILITY_TOGGLE_LARGE_CURSOR &&
-      details.notification_type != ACCESSIBILITY_TOGGLE_MONO_AUDIO &&
-      details.notification_type != ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK) {
+      details.notification_type != ACCESSIBILITY_TOGGLE_MONO_AUDIO) {
     ash::Shell::Get()->system_tray_notifier()->NotifyAccessibilityStatusChanged(
         details.notify);
   }
@@ -1366,13 +1376,7 @@
     const DisplayState& display_state) {
   braille_display_connected_ = display_state.available;
   if (braille_display_connected_) {
-    // TODO(crbug.com/594887): Fix for mash by moving notifying accessibility
-    // status change to ash for BrailleDisplayStateChanged.
-    if (GetAshConfig() == ash::Config::MASH)
-      return;
-
-    ash::Shell::Get()->accessibility_controller()->SetSpokenFeedbackEnabled(
-        true, ash::A11Y_NOTIFICATION_SHOW);
+    EnableSpokenFeedback(true, ash::A11Y_NOTIFICATION_SHOW);
   }
   UpdateBrailleImeState();
 
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.h b/chrome/browser/chromeos/accessibility/accessibility_manager.h
index 9d91757..728c8a7 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_manager.h
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager.h
@@ -147,6 +147,9 @@
   // Returns true if spoken feedback is enabled, or false if not.
   bool IsSpokenFeedbackEnabled() const;
 
+  // Toggles whether Chrome OS spoken feedback is on or off.
+  void ToggleSpokenFeedback(ash::AccessibilityNotificationVisibility notify);
+
   // Enables or disables the high contrast mode for Chrome.
   void EnableHighContrast(bool enabled);
 
@@ -309,7 +312,7 @@
   void UpdateAlwaysShowMenuFromPref();
   void OnLargeCursorChanged();
   void UpdateStickyKeysFromPref();
-  void OnSpokenFeedbackChanged();
+  void UpdateSpokenFeedbackFromPref();
   void OnHighContrastChanged();
   void UpdateAutoclickFromPref();
   void UpdateAutoclickDelayFromPref();
@@ -385,6 +388,7 @@
   PrefHandler switch_access_pref_handler_;
 
   bool sticky_keys_enabled_;
+  bool spoken_feedback_enabled_;
   bool autoclick_enabled_;
   base::TimeDelta autoclick_delay_ms_;
   bool virtual_keyboard_enabled_;
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager_browsertest.cc b/chrome/browser/chromeos/accessibility/accessibility_manager_browsertest.cc
index 778060ba..a7369eb 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_manager_browsertest.cc
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager_browsertest.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 
-#include "ash/accessibility/accessibility_controller.h"
 #include "ash/magnifier/magnification_controller.h"
 #include "ash/public/cpp/accessibility_types.h"
 #include "ash/public/cpp/ash_pref_names.h"
@@ -177,10 +176,8 @@
 // Simulates how UserSessionManager starts a user session by loading user
 // profile and marking session as started.
 void StartUserSession(const AccountId& account_id) {
-  Profile* profile = ProfileHelper::GetProfileByUserIdHashForTest(
+  ProfileHelper::GetProfileByUserIdHashForTest(
       user_manager::UserManager::Get()->FindUser(account_id)->username_hash());
-  ash::Shell::Get()->accessibility_controller()->SetPrefServiceForTest(
-      profile->GetPrefs());
 
   session_manager::SessionManager::Get()->SessionStarted();
 }
@@ -283,10 +280,8 @@
 
   void SetUpOnMainThread() override {
     // Sets the login-screen profile.
-    Profile* profile = ProfileHelper::GetSigninProfile();
-    AccessibilityManager::Get()->SetProfileForTest(profile);
-    ash::Shell::Get()->accessibility_controller()->SetPrefServiceForTest(
-        profile->GetPrefs());
+    AccessibilityManager::Get()->SetProfileForTest(
+        ProfileHelper::GetSigninProfile());
     default_autoclick_delay_ = GetAutoclickDelay();
   }
 
diff --git a/chrome/browser/chromeos/accessibility/touch_exploration_controller_browsertest.cc b/chrome/browser/chromeos/accessibility/touch_exploration_controller_browsertest.cc
index 9b1b5b6..61cf0a2 100644
--- a/chrome/browser/chromeos/accessibility/touch_exploration_controller_browsertest.cc
+++ b/chrome/browser/chromeos/accessibility/touch_exploration_controller_browsertest.cc
@@ -12,7 +12,6 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
-#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -57,8 +56,10 @@
   }
 
   void SwitchTouchExplorationMode(bool on) {
-    chromeos::AccessibilityManager::Get()->EnableSpokenFeedback(
-        on, ash::A11Y_NOTIFICATION_NONE);
+    ash::AccessibilityDelegate* delegate =
+        ash::Shell::Get()->accessibility_delegate();
+    if (on != delegate->IsSpokenFeedbackEnabled())
+      delegate->ToggleSpokenFeedback(ash::A11Y_NOTIFICATION_NONE);
   }
 
   base::TimeTicks Now() { return simulated_clock_->NowTicks(); }
diff --git a/chrome/browser/chromeos/extensions/external_cache.cc b/chrome/browser/chromeos/extensions/external_cache.cc
index 40a2a5904..cef9a02 100644
--- a/chrome/browser/chromeos/extensions/external_cache.cc
+++ b/chrome/browser/chromeos/extensions/external_cache.cc
@@ -26,6 +26,7 @@
 #include "extensions/browser/notification_types.h"
 #include "extensions/browser/updater/extension_downloader.h"
 #include "extensions/common/extension.h"
+#include "content/public/common/service_manager_connection.h"
 #include "extensions/common/extension_urls.h"
 #include "net/url_request/url_request_context_getter.h"
 
@@ -218,6 +219,11 @@
   return false;
 }
 
+service_manager::Connector* ExternalCache::GetConnector() {
+  return content::ServiceManagerConnection::GetForProcess()->GetConnector();
+
+}
+
 void ExternalCache::UpdateExtensionLoader() {
   VLOG(1) << "Notify ExternalCache delegate about cache update";
   if (delegate_)
@@ -231,7 +237,7 @@
   // If request_context_ is missing we can't download anything.
   if (request_context_.get()) {
     downloader_ = ChromeExtensionDownloaderFactory::CreateForRequestContext(
-        request_context_.get(), this);
+        request_context_.get(), this, GetConnector());
   }
 
   cached_extensions_->Clear();
diff --git a/chrome/browser/chromeos/extensions/external_cache.h b/chrome/browser/chromeos/extensions/external_cache.h
index 9f53962..2b33d492c 100644
--- a/chrome/browser/chromeos/extensions/external_cache.h
+++ b/chrome/browser/chromeos/extensions/external_cache.h
@@ -31,6 +31,10 @@
 class URLRequestContextGetter;
 }
 
+namespace service_manager {
+class Connector;
+}
+
 namespace chromeos {
 
 // The ExternalCache manages a cache for external extensions.
@@ -136,6 +140,10 @@
 
   void set_flush_on_put(bool flush_on_put) { flush_on_put_ = flush_on_put; }
 
+ protected:
+  // Overridden in tests.
+  virtual service_manager::Connector* GetConnector();
+
  private:
   // Notifies the that the cache has been updated, providing
   // extensions loader with an updated list of extensions.
diff --git a/chrome/browser/chromeos/extensions/external_cache_unittest.cc b/chrome/browser/chromeos/extensions/external_cache_unittest.cc
index 30779f6c..a6caf830 100644
--- a/chrome/browser/chromeos/extensions/external_cache_unittest.cc
+++ b/chrome/browser/chromeos/extensions/external_cache_unittest.cc
@@ -40,6 +40,27 @@
 
 namespace chromeos {
 
+class TestExternalCache : public ExternalCache {
+ public:
+  TestExternalCache(const base::FilePath& cache_dir,
+                    net::URLRequestContextGetter* request_context,
+                const scoped_refptr<base::SequencedTaskRunner>&
+                    backend_task_runner,
+                Delegate* delegate,
+                bool always_check_updates,
+                bool wait_for_cache_initialization)
+    : ExternalCache(cache_dir, request_context, backend_task_runner, delegate,
+                    always_check_updates, wait_for_cache_initialization) {}
+
+ protected:
+  service_manager::Connector* GetConnector() override {
+    return nullptr;
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestExternalCache);
+};
+
 class ExternalCacheTest : public testing::Test,
                           public ExternalCache::Delegate {
  public:
@@ -141,7 +162,7 @@
 
 TEST_F(ExternalCacheTest, Basic) {
   base::FilePath cache_dir(CreateCacheDir(false));
-  ExternalCache external_cache(
+  TestExternalCache external_cache(
       cache_dir, request_context_getter(),
       base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()}), this, true,
       false);
@@ -264,7 +285,7 @@
 
 TEST_F(ExternalCacheTest, PreserveInstalled) {
   base::FilePath cache_dir(CreateCacheDir(false));
-  ExternalCache external_cache(
+  TestExternalCache external_cache(
       cache_dir, request_context_getter(),
       base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()}), this, true,
       false);
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc
index 972c8083..d21804a 100644
--- a/chrome/browser/chromeos/preferences.cc
+++ b/chrome/browser/chromeos/preferences.cc
@@ -203,7 +203,7 @@
                                 ash::kDefaultLargeCursorSize,
                                 PrefRegistry::PUBLIC);
   registry->RegisterBooleanPref(ash::prefs::kAccessibilitySpokenFeedbackEnabled,
-                                false, PrefRegistry::PUBLIC);
+                                false);
   registry->RegisterBooleanPref(
       ash::prefs::kAccessibilityHighContrastEnabled, false,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF | PrefRegistry::PUBLIC);
diff --git a/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc b/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc
index 2d21fcb4..5b6dea9 100644
--- a/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc
+++ b/chrome/browser/chromeos/system/tray_accessibility_browsertest.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/accessibility/accessibility_controller.h"
 #include "ash/login_status.h"
 #include "ash/public/cpp/accessibility_types.h"
 #include "ash/public/cpp/ash_pref_names.h"
@@ -971,6 +970,8 @@
 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowNotification) {
   const base::string16 BRAILLE_CONNECTED =
       base::ASCIIToUTF16("Braille display connected.");
+  const base::string16 CHROMEVOX_ENABLED_TITLE =
+      base::ASCIIToUTF16("ChromeVox enabled");
   const base::string16 CHROMEVOX_ENABLED =
       base::ASCIIToUTF16("Press Ctrl + Alt + Z to disable spoken feedback.");
   const base::string16 BRAILLE_CONNECTED_AND_CHROMEVOX_ENABLED_TITLE =
@@ -978,17 +979,18 @@
 
   EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
 
-  ash::Shell::Get()->accessibility_controller()->SetSpokenFeedbackEnabled(
-      true, ash::A11Y_NOTIFICATION_SHOW);
-  // Spin the run loop to make sure ash see the change.
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
+  // Enabling spoken feedback should show the notification.
+  EnableSpokenFeedback(true, ash::A11Y_NOTIFICATION_SHOW);
+  message_center::NotificationList::Notifications notifications =
+      MessageCenter::Get()->GetVisibleNotifications();
+  EXPECT_EQ(1u, notifications.size());
+  EXPECT_EQ(CHROMEVOX_ENABLED_TITLE, (*notifications.begin())->title());
+  EXPECT_EQ(CHROMEVOX_ENABLED, (*notifications.begin())->message());
 
   // Connecting a braille display when spoken feedback is already enabled
   // should only show the message about the braille display.
   SetBrailleConnected(true);
-  message_center::NotificationList::Notifications notifications =
-      MessageCenter::Get()->GetVisibleNotifications();
+  notifications = MessageCenter::Get()->GetVisibleNotifications();
   EXPECT_EQ(1u, notifications.size());
   EXPECT_EQ(base::string16(), (*notifications.begin())->title());
   EXPECT_EQ(BRAILLE_CONNECTED, (*notifications.begin())->message());
@@ -999,10 +1001,7 @@
   EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
   notifications = MessageCenter::Get()->GetVisibleNotifications();
   EXPECT_EQ(0u, notifications.size());
-  ash::Shell::Get()->accessibility_controller()->SetSpokenFeedbackEnabled(
-      false, ash::A11Y_NOTIFICATION_SHOW);
-  // Spin the run loop to make sure ash see the change.
-  base::RunLoop().RunUntilIdle();
+  EnableSpokenFeedback(false, ash::A11Y_NOTIFICATION_SHOW);
   notifications = MessageCenter::Get()->GetVisibleNotifications();
   EXPECT_EQ(0u, notifications.size());
   EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
@@ -1010,8 +1009,6 @@
   // Connecting a braille display should enable spoken feedback and show
   // both messages.
   SetBrailleConnected(true);
-  // Spin the run loop to make sure ash see the change.
-  base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
   notifications = MessageCenter::Get()->GetVisibleNotifications();
   EXPECT_EQ(BRAILLE_CONNECTED_AND_CHROMEVOX_ENABLED_TITLE,
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
index 762de52..4b792356 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
@@ -125,8 +125,12 @@
     return false;
   }
 
-  out_info->certificate =
-      net::X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size());
+  // Allow UTF-8 inside PrintableStrings in client certificates. See
+  // crbug.com/770323 and crbug.com/788655.
+  net::X509Certificate::UnsafeCreateOptions options;
+  options.printable_string_is_utf8 = true;
+  out_info->certificate = net::X509Certificate::CreateFromBytesUnsafeOptions(
+      cert_der.data(), cert_der.size(), options);
   if (!out_info->certificate) {
     WriteToConsole(content::CONSOLE_MESSAGE_LEVEL_ERROR, kErrorInvalidX509Cert);
     return false;
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
index 3a0a01a..d20974aad 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
+++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
@@ -142,8 +142,13 @@
     return RespondNow(Error(platform_keys::kErrorInvalidToken));
 
   const std::vector<char>& cert_der = params->certificate;
+  // Allow UTF-8 inside PrintableStrings in client certificates. See
+  // crbug.com/770323 and crbug.com/788655.
+  net::X509Certificate::UnsafeCreateOptions options;
+  options.printable_string_is_utf8 = true;
   scoped_refptr<net::X509Certificate> cert_x509 =
-      net::X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size());
+      net::X509Certificate::CreateFromBytesUnsafeOptions(
+          cert_der.data(), cert_der.size(), options);
   if (!cert_x509.get())
     return RespondNow(Error(kErrorInvalidX509Cert));
 
@@ -180,8 +185,13 @@
     return RespondNow(Error(platform_keys::kErrorInvalidToken));
 
   const std::vector<char>& cert_der = params->certificate;
+  // Allow UTF-8 inside PrintableStrings in client certificates. See
+  // crbug.com/770323 and crbug.com/788655.
+  net::X509Certificate::UnsafeCreateOptions options;
+  options.printable_string_is_utf8 = true;
   scoped_refptr<net::X509Certificate> cert_x509 =
-      net::X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size());
+      net::X509Certificate::CreateFromBytesUnsafeOptions(
+          cert_der.data(), cert_der.size(), options);
   if (!cert_x509.get())
     return RespondNow(Error(kErrorInvalidX509Cert));
 
diff --git a/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc b/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
index 4372d80..7fd7ef4d 100644
--- a/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
+++ b/chrome/browser/extensions/api/platform_keys/platform_keys_api.cc
@@ -131,8 +131,13 @@
   const std::vector<char>& cert_der = params->certificate;
   if (cert_der.empty())
     return RespondNow(Error(platform_keys::kErrorInvalidX509Cert));
+  // Allow UTF-8 inside PrintableStrings in client certificates. See
+  // crbug.com/770323 and crbug.com/788655.
+  net::X509Certificate::UnsafeCreateOptions options;
+  options.printable_string_is_utf8 = true;
   scoped_refptr<net::X509Certificate> cert_x509 =
-      net::X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size());
+      net::X509Certificate::CreateFromBytesUnsafeOptions(
+          cert_der.data(), cert_der.size(), options);
   if (!cert_x509)
     return RespondNow(Error(platform_keys::kErrorInvalidX509Cert));
 
@@ -206,9 +211,13 @@
          *params->details.client_certs) {
       if (client_cert_der.empty())
         return RespondNow(Error(platform_keys::kErrorInvalidX509Cert));
+      // Allow UTF-8 inside PrintableStrings in client certificates. See
+      // crbug.com/770323 and crbug.com/788655.
+      net::X509Certificate::UnsafeCreateOptions options;
+      options.printable_string_is_utf8 = true;
       scoped_refptr<net::X509Certificate> client_cert_x509 =
-          net::X509Certificate::CreateFromBytes(client_cert_der.data(),
-                                                client_cert_der.size());
+          net::X509Certificate::CreateFromBytesUnsafeOptions(
+              client_cert_der.data(), client_cert_der.size(), options);
       if (!client_cert_x509)
         return RespondNow(Error(platform_keys::kErrorInvalidX509Cert));
       client_certs->push_back(client_cert_x509);
diff --git a/chrome/browser/extensions/updater/chrome_extension_downloader_factory.cc b/chrome/browser/extensions/updater/chrome_extension_downloader_factory.cc
index 4881e6c..f1c5d73 100644
--- a/chrome/browser/extensions/updater/chrome_extension_downloader_factory.cc
+++ b/chrome/browser/extensions/updater/chrome_extension_downloader_factory.cc
@@ -7,7 +7,6 @@
 #include <string>
 #include <utility>
 
-
 #include "base/command_line.h"
 #include "chrome/browser/google/google_brand.h"
 #include "chrome/browser/profiles/profile.h"
@@ -19,6 +18,7 @@
 #include "components/update_client/update_query_params.h"
 #include "extensions/browser/updater/extension_downloader.h"
 #include "google_apis/gaia/identity_provider.h"
+#include "content/public/common/service_manager_connection.h"
 
 using extensions::ExtensionDownloader;
 using extensions::ExtensionDownloaderDelegate;
@@ -31,9 +31,10 @@
 std::unique_ptr<ExtensionDownloader>
 ChromeExtensionDownloaderFactory::CreateForRequestContext(
     net::URLRequestContextGetter* request_context,
-    ExtensionDownloaderDelegate* delegate) {
+    ExtensionDownloaderDelegate* delegate,
+    service_manager::Connector* connector) {
   std::unique_ptr<ExtensionDownloader> downloader(
-      new ExtensionDownloader(delegate, request_context));
+      new ExtensionDownloader(delegate, request_context, connector));
 #if defined(GOOGLE_CHROME_BUILD)
   std::string brand;
   google_brand::GetBrand(&brand);
@@ -61,8 +62,11 @@
           SigninManagerFactory::GetForProfile(profile),
           ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
           LoginUIServiceFactory::GetShowLoginPopupCallbackForProfile(profile)));
+  service_manager::Connector* connector =
+      content::ServiceManagerConnection::GetForProcess()->GetConnector();
   std::unique_ptr<ExtensionDownloader> downloader =
-      CreateForRequestContext(profile->GetRequestContext(), delegate);
+      CreateForRequestContext(profile->GetRequestContext(), delegate,
+        connector);
   downloader->SetWebstoreIdentityProvider(std::move(identity_provider));
   return downloader;
 }
diff --git a/chrome/browser/extensions/updater/chrome_extension_downloader_factory.h b/chrome/browser/extensions/updater/chrome_extension_downloader_factory.h
index 2f3a787a..4426256b 100644
--- a/chrome/browser/extensions/updater/chrome_extension_downloader_factory.h
+++ b/chrome/browser/extensions/updater/chrome_extension_downloader_factory.h
@@ -18,6 +18,10 @@
 class URLRequestContextGetter;
 }
 
+namespace service_manager {
+class Connector;
+}
+
 // This provides a simple static interface for constructing an
 // ExtensionDownloader suitable for use from within Chrome.
 class ChromeExtensionDownloaderFactory {
@@ -26,7 +30,8 @@
   // is associated with this downloader.
   static std::unique_ptr<extensions::ExtensionDownloader>
   CreateForRequestContext(net::URLRequestContextGetter* request_context,
-                          extensions::ExtensionDownloaderDelegate* delegate);
+                          extensions::ExtensionDownloaderDelegate* delegate,
+                          service_manager::Connector* connector);
 
   // Creates a downloader for a given Profile. This downloader will be able
   // to authenticate as the signed-in user in the event that it's asked to
diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc
index fe637a2..e873c40 100644
--- a/chrome/browser/extensions/updater/extension_updater_unittest.cc
+++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
@@ -74,6 +74,7 @@
 #include "net/http/http_request_headers.h"
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "net/url_request/url_request_status.h"
+#include "services/data_decoder/public/cpp/test_data_decoder_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/third_party/mozilla/url_parse.h"
@@ -377,7 +378,8 @@
         ChromeExtensionDownloaderFactory::CreateForRequestContext(
             request_context(), downloader_delegate_override_
                                    ? downloader_delegate_override_
-                                   : delegate);
+                                   : delegate,
+            /*connector=*/nullptr);
     return downloader;
   }
 
@@ -679,8 +681,8 @@
   void AddParseResult(const std::string& id,
                       const std::string& version,
                       const std::string& url,
-                      UpdateManifest::Results* results) {
-    UpdateManifest::Result result;
+                      UpdateManifestResults* results) {
+    UpdateManifestResult result;
     result.extension_id = id;
     result.version = version;
     result.crx_url = GURL(url);
@@ -820,7 +822,8 @@
 
     MockService service(prefs_.get());
     MockExtensionDownloaderDelegate delegate;
-    ExtensionDownloader downloader(&delegate, service.request_context());
+    ExtensionDownloader downloader(&delegate, service.request_context(),
+                                   data_decoder_service_connector());
     ExtensionList extensions;
 
     service.CreateTestExtensions(1, num_extensions, &extensions, &update_url,
@@ -909,12 +912,13 @@
   void TestDetermineUpdates() {
     TestingProfile profile;
     MockExtensionDownloaderDelegate delegate;
-    ExtensionDownloader downloader(&delegate, profile.GetRequestContext());
+    ExtensionDownloader downloader(&delegate, profile.GetRequestContext(),
+                                   data_decoder_service_connector());
 
     // Check passing an empty list of parse results to DetermineUpdates
     std::unique_ptr<ManifestFetchData> fetch_data(
         CreateManifestFetchData(GURL("http://localhost/foo")));
-    UpdateManifest::Results updates;
+    UpdateManifestResults updates;
     std::vector<int> updateable;
     downloader.DetermineUpdates(*fetch_data, updates, &updateable);
     EXPECT_TRUE(updateable.empty());
@@ -955,11 +959,12 @@
 
     TestingProfile profile;
     MockExtensionDownloaderDelegate delegate;
-    ExtensionDownloader downloader(&delegate, profile.GetRequestContext());
+    ExtensionDownloader downloader(&delegate, profile.GetRequestContext(),
+                                   data_decoder_service_connector());
 
     std::unique_ptr<ManifestFetchData> fetch_data(
         CreateManifestFetchData(GURL("http://localhost/foo")));
-    UpdateManifest::Results updates;
+    UpdateManifestResults updates;
 
     std::list<std::string> ids_for_update_check;
     pending_extension_manager->GetPendingIdsForUpdateCheck(
@@ -993,7 +998,8 @@
     net::TestURLFetcher* fetcher = NULL;
     MockService service(prefs_.get());
     MockExtensionDownloaderDelegate delegate;
-    ExtensionDownloader downloader(&delegate, service.request_context());
+    ExtensionDownloader downloader(&delegate, service.request_context(),
+                                   data_decoder_service_connector());
     downloader.manifests_queue_.set_backoff_policy(&kNoBackoffPolicy);
 
     GURL kUpdateUrl("http://localhost/manifest1");
@@ -1141,7 +1147,8 @@
     NotificationsObserver observer;
     MockService service(prefs_.get());
     MockExtensionDownloaderDelegate delegate;
-    ExtensionDownloader downloader(&delegate, service.request_context());
+    ExtensionDownloader downloader(&delegate, service.request_context(),
+                                   data_decoder_service_connector());
     downloader.manifests_queue_.set_backoff_policy(&kNoBackoffPolicy);
 
     GURL kUpdateUrl("http://localhost/manifest1");
@@ -1843,15 +1850,18 @@
                              &kNeverPingedData, kEmptyUpdateUrlData,
                              std::string(),
                              ManifestFetchData::FetchPriority::BACKGROUND);
-    UpdateManifest::Results results;
-    results.daystart_elapsed_seconds = 750;
+    auto results = std::make_unique<UpdateManifestResults>();
+    constexpr int kDaystartElapsedSeconds = 750;
+    results->daystart_elapsed_seconds = kDaystartElapsedSeconds;
 
-    updater.downloader_->HandleManifestResults(fetch_data.get(), &results);
+    updater.downloader_->HandleManifestResults(
+        std::move(fetch_data), std::move(results),
+        /*error=*/base::Optional<std::string>());
     Time last_ping_day =
         service.extension_prefs()->LastPingDay(extension->id());
     EXPECT_FALSE(last_ping_day.is_null());
     int64_t seconds_diff = (Time::Now() - last_ping_day).InSeconds();
-    EXPECT_LT(seconds_diff - results.daystart_elapsed_seconds, 5);
+    EXPECT_LT(seconds_diff - kDaystartElapsedSeconds, 5);
   }
 
   // This lets us run a test with some enabled and some disabled
@@ -1993,10 +2003,15 @@
         update_url, ManifestFetchData::FetchPriority::BACKGROUND);
   }
 
+  service_manager::Connector* data_decoder_service_connector() const {
+    return test_data_decoder_service_.connector();
+  }
+
  private:
   content::TestBrowserThreadBundle thread_bundle_;
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper_;
   ScopedTestingLocalState testing_local_state_;
+  data_decoder::TestDataDecoderService test_data_decoder_service_;
 
 #if defined OS_CHROMEOS
   chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
@@ -2231,8 +2246,8 @@
   net::TestURLFetcherFactory factory;
   MockService service(prefs_.get());
   MockExtensionDownloaderDelegate delegate;
-  std::unique_ptr<ExtensionDownloader> downloader(
-      new ExtensionDownloader(&delegate, service.request_context()));
+  std::unique_ptr<ExtensionDownloader> downloader(new ExtensionDownloader(
+      &delegate, service.request_context(), data_decoder_service_connector()));
   EXPECT_EQ(0u, ManifestFetchersCount(downloader.get()));
 
   // First, verify that adding valid extensions does invoke the callbacks on
@@ -2265,8 +2280,8 @@
   // converted from user scripts are rejected.
 
   // Reset the ExtensionDownloader so that it drops the current fetcher.
-  downloader.reset(
-      new ExtensionDownloader(&delegate, service.request_context()));
+  downloader.reset(new ExtensionDownloader(&delegate, service.request_context(),
+                                           data_decoder_service_connector()));
   EXPECT_EQ(0u, ManifestFetchersCount(downloader.get()));
 
   // Extensions with empty update URLs should have a default one
@@ -2288,7 +2303,8 @@
   net::TestURLFetcherFactory factory;
   MockService service(prefs_.get());
   MockExtensionDownloaderDelegate delegate;
-  ExtensionDownloader downloader(&delegate, service.request_context());
+  ExtensionDownloader downloader(&delegate, service.request_context(),
+                                 data_decoder_service_connector());
 
   StartUpdateCheck(&downloader,
                    CreateManifestFetchData(GURL("http://localhost/foo")));
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc
index 043f1e6c..61b1598e 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.cc
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc
@@ -103,6 +103,17 @@
     ash::Shell::Get()->RemoveShellObserver(AccessibilityManager::Get());
   }
 
+  bool IsSpokenFeedbackEnabled() const override {
+    DCHECK(AccessibilityManager::Get());
+    return AccessibilityManager::Get()->IsSpokenFeedbackEnabled();
+  }
+
+  void ToggleSpokenFeedback(
+      ash::AccessibilityNotificationVisibility notify) override {
+    DCHECK(AccessibilityManager::Get());
+    AccessibilityManager::Get()->ToggleSpokenFeedback(notify);
+  }
+
   void SetMagnifierEnabled(bool enabled) override {
     DCHECK(chromeos::MagnificationManager::Get());
     return chromeos::MagnificationManager::Get()->SetMagnifierEnabled(enabled);
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index d88dd81f..33dcfaa 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -98,7 +98,8 @@
   }
 }
 
-CoreOobeHandler::~CoreOobeHandler() {}
+CoreOobeHandler::~CoreOobeHandler() {
+}
 
 void CoreOobeHandler::DeclareLocalizedValues(
     ::login::LocalizedValuesBuilder* builder) {
@@ -152,13 +153,16 @@
 }
 
 void CoreOobeHandler::RegisterMessages() {
-  AddCallback("screenStateInitialize", &CoreOobeHandler::HandleInitialized);
+  AddCallback("screenStateInitialize",
+              &CoreOobeHandler::HandleInitialized);
   AddCallback("skipUpdateEnrollAfterEula",
               &CoreOobeHandler::HandleSkipUpdateEnrollAfterEula);
   AddCallback("updateCurrentScreen",
               &CoreOobeHandler::HandleUpdateCurrentScreen);
-  AddCallback("enableHighContrast", &CoreOobeHandler::HandleEnableHighContrast);
-  AddCallback("enableLargeCursor", &CoreOobeHandler::HandleEnableLargeCursor);
+  AddCallback("enableHighContrast",
+              &CoreOobeHandler::HandleEnableHighContrast);
+  AddCallback("enableLargeCursor",
+              &CoreOobeHandler::HandleEnableLargeCursor);
   AddCallback("enableVirtualKeyboard",
               &CoreOobeHandler::HandleEnableVirtualKeyboard);
   AddCallback("enableScreenMagnifier",
@@ -167,14 +171,17 @@
               &CoreOobeHandler::HandleEnableSpokenFeedback);
   AddCallback("setDeviceRequisition",
               &CoreOobeHandler::HandleSetDeviceRequisition);
-  AddCallback("screenAssetsLoaded", &CoreOobeHandler::HandleScreenAssetsLoaded);
+  AddCallback("screenAssetsLoaded",
+              &CoreOobeHandler::HandleScreenAssetsLoaded);
   AddRawCallback("skipToLoginForTesting",
                  &CoreOobeHandler::HandleSkipToLoginForTesting);
-  AddCallback("launchHelpApp", &CoreOobeHandler::HandleLaunchHelpApp);
+  AddCallback("launchHelpApp",
+              &CoreOobeHandler::HandleLaunchHelpApp);
   AddCallback("toggleResetScreen", &CoreOobeHandler::HandleToggleResetScreen);
   AddCallback("toggleEnableDebuggingScreen",
               &CoreOobeHandler::HandleEnableDebuggingScreen);
-  AddCallback("headerBarVisible", &CoreOobeHandler::HandleHeaderBarVisible);
+  AddCallback("headerBarVisible",
+              &CoreOobeHandler::HandleHeaderBarVisible);
   AddCallback("raiseTabKeyEvent", &CoreOobeHandler::HandleRaiseTabKeyEvent);
   AddCallback("setOobeBootstrappingSlave",
               &CoreOobeHandler::HandleSetOobeBootstrappingSlave);
@@ -186,8 +193,8 @@
     const std::string& help_link_text,
     HelpAppLauncher::HelpTopic help_topic_id) {
   LOG(ERROR) << "CoreOobeHandler::ShowSignInError: error_text=" << error_text;
-  CallJSOrDefer("showSignInError", login_attempts, error_text, help_link_text,
-                static_cast<int>(help_topic_id));
+  CallJSOrDefer("showSignInError", login_attempts, error_text,
+         help_link_text, static_cast<int>(help_topic_id));
 }
 
 void CoreOobeHandler::ShowTpmError() {
@@ -227,7 +234,8 @@
 
 void CoreOobeHandler::ShowEnableDebuggingScreen() {
   // Don't recreate WizardController if it already exists.
-  WizardController* wizard_controller = WizardController::default_controller();
+  WizardController* wizard_controller =
+      WizardController::default_controller();
   if (wizard_controller && !wizard_controller->login_screen_started()) {
     wizard_controller->AdvanceToScreen(
         OobeScreen::SCREEN_OOBE_ENABLE_DEBUGGING);
@@ -341,9 +349,8 @@
 void CoreOobeHandler::HandleEnableSpokenFeedback(bool /* enabled */) {
   // Checkbox is initialized on page init and updates when spoken feedback
   // setting is changed so just toggle spoken feedback here.
-  AccessibilityManager* manager = AccessibilityManager::Get();
-  manager->EnableSpokenFeedback(!manager->IsSpokenFeedbackEnabled(),
-                                ash::A11Y_NOTIFICATION_NONE);
+  AccessibilityManager::Get()->ToggleSpokenFeedback(
+      ash::A11Y_NOTIFICATION_NONE);
 }
 
 void CoreOobeHandler::HandleSetDeviceRequisition(
@@ -364,7 +371,7 @@
 
   // Exit Chrome to force the restart as soon as a new requisition is set.
   if (initial_requisition !=
-      connector->GetDeviceCloudPolicyManager()->GetDeviceRequisition()) {
+          connector->GetDeviceCloudPolicyManager()->GetDeviceRequisition()) {
     chrome::AttemptRestart();
   }
 }
@@ -374,10 +381,11 @@
   oobe_ui_->OnScreenAssetsLoaded(screen_async_load_id);
 }
 
-void CoreOobeHandler::HandleSkipToLoginForTesting(const base::ListValue* args) {
+void CoreOobeHandler::HandleSkipToLoginForTesting(
+    const base::ListValue* args) {
   LoginScreenContext context(args);
   if (WizardController::default_controller())
-    WizardController::default_controller()->SkipToLoginForTesting(context);
+      WizardController::default_controller()->SkipToLoginForTesting(context);
 }
 
 void CoreOobeHandler::HandleToggleResetScreen() {
@@ -427,8 +435,8 @@
 void CoreOobeHandler::UpdateOobeUIVisibility() {
   const std::string& display = oobe_ui_->display_type();
   CallJSOrDefer("showAPIKeysNotice", !google_apis::HasKeysConfigured() &&
-                                         (display == OobeUI::kOobeDisplay ||
-                                          display == OobeUI::kLoginDisplay));
+                                  (display == OobeUI::kOobeDisplay ||
+                                   display == OobeUI::kLoginDisplay));
 
   // Don't show version label on the stable channel by default.
   bool should_show_version = true;
@@ -448,8 +456,8 @@
   UpdateLabel("version", os_version_label_text);
 }
 
-void CoreOobeHandler::OnEnterpriseInfoUpdated(const std::string& message_text,
-                                              const std::string& asset_id) {
+void CoreOobeHandler::OnEnterpriseInfoUpdated(
+    const std::string& message_text, const std::string& asset_id) {
   CallJSOrDefer("setEnterpriseInfo", message_text, asset_id);
 }
 
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/ChromeHome.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/ChromeHome.java
index c203327..94f8391 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/ChromeHome.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/ChromeHome.java
@@ -11,13 +11,12 @@
 import android.text.TextUtils;
 
 import org.chromium.base.CommandLine;
-import org.chromium.base.test.util.AnnotationProcessor;
+import org.chromium.base.test.util.AnnotationRule;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 
 import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
@@ -29,7 +28,6 @@
  * @see ChromeHome.Processor
  * @see FeatureUtilities#isChromeHomeEnabled()
  */
-@Inherited
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.METHOD, ElementType.TYPE})
 public @interface ChromeHome {
@@ -43,7 +41,7 @@
      * used by explicitly calling methods ({@link #setPrefs(boolean)} and {@link #clearTestState()})
      * or by using the {@link ChromeHome} annotation on tests.
      */
-    class Processor extends AnnotationProcessor<ChromeHome> {
+    class Processor extends AnnotationRule {
         private Boolean mOldState;
 
         public Processor() {
@@ -52,7 +50,7 @@
 
         @Override
         protected void before() throws Throwable {
-            boolean enabled = getRequestedState();
+            boolean enabled = getAnnotation(ChromeHome.class).value();
             if (enabled) {
                 Features.getInstance().enable(ChromeFeatureList.CHROME_HOME);
             } else {
@@ -108,12 +106,5 @@
 
             commandLine.appendSwitch(ENABLE_FLAGS);
         }
-
-        private boolean getRequestedState() {
-            if (getTestAnnotation() != null) return getTestAnnotation().value();
-            if (getClassAnnotation() != null) return getClassAnnotation().value();
-
-            throw new IllegalStateException("Rule called with no annotation");
-        }
     }
 }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/Features.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/Features.java
index f2980e7..a67843a 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/Features.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/Features.java
@@ -7,13 +7,11 @@
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
 
-import org.junit.rules.ExternalResource;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-
 import org.chromium.base.CommandLine;
+import org.chromium.base.test.util.AnnotationRule;
 import org.chromium.chrome.browser.ChromeFeatureList;
 
+import java.lang.annotation.Annotation;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Collections;
@@ -151,23 +149,14 @@
      * to enable, or get rid of exceptions when the production code tries to check for enabled
      * features.
      */
-    private static abstract class Processor extends ExternalResource {
-        private Description mDescription;
-
-        @Override
-        public Statement apply(Statement base, Description description) {
-            mDescription = description;
-            return super.apply(base, description);
+    private static abstract class Processor extends AnnotationRule {
+        public Processor() {
+            super(EnableFeatures.class, DisableFeatures.class);
         }
 
         @Override
         protected void before() throws Throwable {
-            collectDisabledFeatures(
-                    mDescription.getTestClass().getAnnotation(DisableFeatures.class));
-            collectEnabledFeatures(mDescription.getTestClass().getAnnotation(EnableFeatures.class));
-            collectDisabledFeatures(mDescription.getAnnotation(DisableFeatures.class));
-            collectEnabledFeatures(mDescription.getAnnotation(EnableFeatures.class));
-
+            collectFeatures();
             applyFeatures();
         }
 
@@ -178,12 +167,14 @@
 
         abstract protected void applyFeatures();
 
-        private void collectEnabledFeatures(@Nullable EnableFeatures annotation) {
-            if (annotation != null) getInstance().enable(annotation.value());
-        }
-
-        private void collectDisabledFeatures(@Nullable DisableFeatures annotation) {
-            if (annotation != null) getInstance().disable(annotation.value());
+        private void collectFeatures() {
+            for (Annotation annotation : getAnnotations()) {
+                if (annotation instanceof EnableFeatures) {
+                    getInstance().enable(((EnableFeatures) annotation).value());
+                } else if (annotation instanceof DisableFeatures) {
+                    getInstance().disable(((DisableFeatures) annotation).value());
+                }
+            }
         }
     }
 }
diff --git a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
index ef54268..88c2d02 100644
--- a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
+++ b/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
@@ -67,3 +67,23 @@
 TEST_F('PrintPreviewSettingsSectionsTest', 'Layout', function() {
   this.runMochaTest(settings_sections_tests.TestNames.Layout);
 });
+
+TEST_F('PrintPreviewSettingsSectionsTest', 'Color', function() {
+  this.runMochaTest(settings_sections_tests.TestNames.Color);
+});
+
+TEST_F('PrintPreviewSettingsSectionsTest', 'MediaSize', function() {
+  this.runMochaTest(settings_sections_tests.TestNames.MediaSize);
+});
+
+TEST_F('PrintPreviewSettingsSectionsTest', 'Margins', function() {
+  this.runMochaTest(settings_sections_tests.TestNames.Margins);
+});
+
+TEST_F('PrintPreviewSettingsSectionsTest', 'Dpi', function() {
+  this.runMochaTest(settings_sections_tests.TestNames.Dpi);
+});
+
+TEST_F('PrintPreviewSettingsSectionsTest', 'Scaling', function() {
+  this.runMochaTest(settings_sections_tests.TestNames.Scaling);
+});
diff --git a/chrome/test/data/webui/print_preview/settings_section_test.js b/chrome/test/data/webui/print_preview/settings_section_test.js
index 7edcd59..deddf1a 100644
--- a/chrome/test/data/webui/print_preview/settings_section_test.js
+++ b/chrome/test/data/webui/print_preview/settings_section_test.js
@@ -7,6 +7,11 @@
   const TestNames = {
     Copies: 'copies',
     Layout: 'layout',
+    Color: 'color',
+    MediaSize: 'media size',
+    Margins: 'margins',
+    Dpi: 'dpi',
+    Scaling: 'scaling',
   };
 
   const suiteName = 'SettingsSectionsTests';
@@ -73,9 +78,27 @@
       };
     }
 
+    /** @param {boolean} isPdf Whether the document should be a PDF. */
+    function setPdfDocument(isPdf) {
+      const info = new print_preview.DocumentInfo();
+      info.init(!isPdf, 'title', false);
+      page.set('documentInfo', info);
+    }
+
+    function setPdfDestination() {
+      const saveAsPdfDestination = new print_preview.Destination(
+          print_preview.Destination.GooglePromotedId.SAVE_AS_PDF,
+          print_preview.DestinationType.LOCAL,
+          print_preview.DestinationOrigin.LOCAL,
+          loadTimeData.getString('printToPDF'), false /*isRecent*/,
+          print_preview.DestinationConnectionStatus.ONLINE);
+      saveAsPdfDestination.capabilities = getCdd();
+      page.set('destination', saveAsPdfDestination);
+    }
+
     test(assert(TestNames.Copies), function() {
       const copiesElement = page.$$('print-preview-copies-settings');
-      assertEquals(false, copiesElement.hidden);
+      expectEquals(false, copiesElement.hidden);
 
       // Remove copies capability.
       const capabilities = getCdd();
@@ -83,17 +106,15 @@
 
       // Copies section should now be hidden.
       page.set('destination.capabilities', capabilities);
-      assertEquals(true, copiesElement.hidden);
+      expectEquals(true, copiesElement.hidden);
     });
 
     test(assert(TestNames.Layout), function() {
       const layoutElement = page.$$('print-preview-layout-settings');
 
       // Set up with HTML document.
-      const htmlInfo = new print_preview.DocumentInfo();
-      htmlInfo.init(true, 'title', false);
-      page.set('documentInfo', htmlInfo);
-      assertEquals(false, layoutElement.hidden);
+      setPdfDocument(false);
+      expectEquals(false, layoutElement.hidden);
 
       // Remove layout capability.
       let capabilities = getCdd();
@@ -105,22 +126,140 @@
         {option: [{ type: 'PORTRAIT', is_default: true }]},
         {option: [{ type: 'LANDSCAPE', is_default: true}]},
       ].forEach(layoutCap => {
+        capabilities = getCdd();
         capabilities.printer.page_orientation = layoutCap;
         // Layout section should now be hidden.
         page.set('destination.capabilities', capabilities);
-        assertEquals(true, layoutElement.hidden);
+        expectEquals(true, layoutElement.hidden);
       });
 
       // Reset full capabilities
       capabilities = getCdd();
       page.set('destination.capabilities', capabilities);
-      assertEquals(false, layoutElement.hidden);
+      expectEquals(false, layoutElement.hidden);
 
       // Test with PDF - should be hidden.
-      const pdfInfo = new print_preview.DocumentInfo();
-      pdfInfo.init(false, 'title', false);
-      page.set('documentInfo', pdfInfo);
-      assertEquals(true, layoutElement.hidden);
+      setPdfDocument(true);
+      expectEquals(true, layoutElement.hidden);
+    });
+
+    test(assert(TestNames.Color), function() {
+      const colorElement = page.$$('print-preview-color-settings');
+      expectEquals(false, colorElement.hidden);
+
+      // Remove color capability.
+      let capabilities = getCdd();
+      delete capabilities.printer.color;
+
+      // Each of these settings should not show the capability.
+      [
+        null,
+        {option: [{ type: 'STANDARD_COLOR', is_default: true }]},
+        {option: [{ type: 'STANDARD_COLOR', is_default: true },
+                  { type: 'CUSTOM_COLOR'}]},
+        {option: [{ type: 'STANDARD_MONOCHROME', is_default: true },
+                  { type: 'CUSTOM_MONOCHROME' }]},
+        {option: [{ type: 'STANDARD_MONOCHROME', is_default: true}]},
+      ].forEach(colorCap => {
+        capabilities = getCdd();
+        capabilities.printer.color = colorCap;
+        // Layout section should now be hidden.
+        page.set('destination.capabilities', capabilities);
+        expectEquals(true, colorElement.hidden);
+      });
+
+      // Custom color and monochrome options should make the section visible.
+      capabilities = getCdd();
+      capabilities.printer.color =
+        {option: [{ type: 'CUSTOM_COLOR', is_default: true },
+                  { type: 'CUSTOM_MONOCHROME' }]};
+      page.set('destination.capabilities', capabilities);
+      expectEquals(false, colorElement.hidden);
+    });
+
+    test(assert(TestNames.MediaSize), function() {
+      const mediaSizeElement = page.$$('print-preview-media-size-settings');
+      expectEquals(false, mediaSizeElement.hidden);
+
+      // Remove capability.
+      let capabilities = getCdd();
+      delete capabilities.printer.media_size;
+
+      // Section should now be hidden.
+      page.set('destination.capabilities', capabilities);
+      expectEquals(true, mediaSizeElement.hidden);
+
+      // Reset
+      capabilities = getCdd();
+      page.set('destination.capabilities', capabilities);
+
+      // Set PDF document type.
+      setPdfDocument(true);
+      expectEquals(false, mediaSizeElement.hidden);
+
+      // Set save as PDF. This should hide the settings section.
+      setPdfDestination();
+      expectEquals(true, mediaSizeElement.hidden);
+
+      // Set HTML document type, should now show the section.
+      setPdfDocument(false);
+      expectEquals(false, mediaSizeElement.hidden);
+    });
+
+    test(assert(TestNames.Margins), function() {
+      const marginsElement = page.$$('print-preview-margins-settings');
+
+      // Section is available for HTML (modifiable) documents
+      setPdfDocument(false);
+      expectEquals(false, marginsElement.hidden);
+
+      // Unavailable for PDFs.
+      setPdfDocument(true);
+      expectEquals(true, marginsElement.hidden);
+    });
+
+    test(assert(TestNames.Dpi), function() {
+      const dpiElement = page.$$('print-preview-dpi-settings');
+      expectEquals(false, dpiElement.hidden);
+
+      // Remove capability.
+      let capabilities = getCdd();
+      delete capabilities.printer.dpi;
+
+      // Section should now be hidden.
+      page.set('destination.capabilities', capabilities);
+      expectEquals(true, dpiElement.hidden);
+
+      // Does not show up for only 1 option.
+      capabilities = getCdd();
+      capabilities.printer.dpi.option.pop();
+      page.set('destination.capabilities', capabilities);
+      expectEquals(true, dpiElement.hidden);
+    });
+
+    test(assert(TestNames.Scaling), function() {
+      const scalingElement = page.$$('print-preview-scaling-settings');
+      expectEquals(false, scalingElement.hidden);
+
+      // HTML to non-PDF destination -> only input shown
+      setPdfDocument(false);
+      const fitToPageContainer = scalingElement.$$('#fit-to-page-container');
+      const scalingInput =
+          scalingElement.$$('print-preview-number-settings-section')
+              .$$('.user-value');
+      expectEquals(false, scalingElement.hidden);
+      expectEquals(true, fitToPageContainer.hidden);
+      expectEquals(false, scalingInput.hidden);
+
+      // PDF to non-PDF destination -> checkbox and input shown.
+      setPdfDocument(true);
+      expectEquals(false, scalingElement.hidden);
+      expectEquals(false, fitToPageContainer.hidden);
+      expectEquals(false, scalingInput.hidden);
+
+      // PDF to PDF destination -> section disappears.
+      setPdfDestination();
+      expectEquals(true, scalingElement.hidden);
     });
   });
 
diff --git a/components/app_modal/javascript_dialog_manager.cc b/components/app_modal/javascript_dialog_manager.cc
index a1875d14..bfe42fe 100644
--- a/components/app_modal/javascript_dialog_manager.cc
+++ b/components/app_modal/javascript_dialog_manager.cc
@@ -105,20 +105,49 @@
   return GetTitleImpl(web_contents->GetURL(), alerting_frame_url);
 }
 
+namespace {
+
+// Unwraps an URL to get to an embedded URL.
+GURL UnwrapURL(const GURL& url) {
+  // GURL will unwrap filesystem:// URLs so ask it to do so.
+  const GURL* unwrapped_url = url.inner_url();
+  if (unwrapped_url)
+    return *unwrapped_url;
+
+  // GURL::inner_url() should unwrap blob: URLs but doesn't do so
+  // (https://crbug.com/690091). Therefore, do it manually.
+  //
+  // https://url.spec.whatwg.org/#origin defines the origin of a blob:// URL as
+  // the origin of the URL which results from parsing the "path", which boils
+  // down to everything after the scheme. GURL's 'GetContent()' gives us exactly
+  // that. See url::Origin()'s constructor.
+  if (url.SchemeIsBlob())
+    return GURL(url.GetContent());
+
+  return url;
+}
+
+}  // namespace
+
 // static
 base::string16 JavaScriptDialogManager::GetTitleImpl(
     const GURL& parent_frame_url,
     const GURL& alerting_frame_url) {
+  GURL unwrapped_parent_frame_url = UnwrapURL(parent_frame_url);
+  GURL unwrapped_alerting_frame_url = UnwrapURL(alerting_frame_url);
+
   bool is_same_origin_as_main_frame =
-      (parent_frame_url.GetOrigin() == alerting_frame_url.GetOrigin());
-  if (alerting_frame_url.IsStandard() && !alerting_frame_url.SchemeIsFile() &&
-      !alerting_frame_url.SchemeIsFileSystem()) {
+      (unwrapped_parent_frame_url.GetOrigin() ==
+       unwrapped_alerting_frame_url.GetOrigin());
+  if (unwrapped_alerting_frame_url.IsStandard() &&
+      !unwrapped_alerting_frame_url.SchemeIsFile()) {
 #if defined(OS_ANDROID)
     base::string16 url_string = url_formatter::FormatUrlForSecurityDisplay(
-        alerting_frame_url, url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS);
+        unwrapped_alerting_frame_url,
+        url_formatter::SchemeDisplay::OMIT_HTTP_AND_HTTPS);
 #else
     base::string16 url_string = url_formatter::ElideHost(
-        alerting_frame_url, gfx::FontList(), kUrlElideWidth);
+        unwrapped_alerting_frame_url, gfx::FontList(), kUrlElideWidth);
 #endif
     return l10n_util::GetStringFUTF16(
         is_same_origin_as_main_frame ? IDS_JAVASCRIPT_MESSAGEBOX_TITLE
diff --git a/components/app_modal/javascript_dialog_manager_unittest.cc b/components/app_modal/javascript_dialog_manager_unittest.cc
index ec96db9..c4974de1 100644
--- a/components/app_modal/javascript_dialog_manager_unittest.cc
+++ b/components/app_modal/javascript_dialog_manager_unittest.cc
@@ -32,73 +32,72 @@
        "An embedded page at bar.com says", "An embedded page at bar.com says"},
 
       // file:
-      // -main frame:
+      // - main frame:
       {"file:///path/to/page.html", "file:///path/to/page.html",
        "This Page Says", "This page says", "This page says"},
-      // -subframe:
+      // - subframe:
       {"http://foo.com/", "file:///path/to/page.html",
        "An Embedded Page on This Page Says",
        "An embedded page on this page says",
        "An embedded page on this page says"},
 
       // ftp:
-      // -main frame:
+      // - main frame:
       {"ftp://foo.com/path/to/page.html", "ftp://foo.com/path/to/page.html",
        "foo.com Says", "foo.com says", "ftp://foo.com says"},
-      // -subframe:
+      // - subframe:
       {"http://foo.com/", "ftp://foo.com/path/to/page.html",
        "An Embedded Page at foo.com Says", "An embedded page at foo.com says",
        "An embedded page at ftp://foo.com says"},
 
       // data:
-      // -main frame:
+      // - main frame:
       {"data:blahblah", "data:blahblah", "This Page Says", "This page says",
        "This page says"},
-      // -subframe:
+      // - subframe:
       {"http://foo.com/", "data:blahblah", "An Embedded Page on This Page Says",
        "An embedded page on this page says",
        "An embedded page on this page says"},
 
       // javascript:
-      // -main frame:
+      // - main frame:
       {"javascript:abc", "javascript:abc", "This Page Says", "This page says",
        "This page says"},
-      // -subframe:
+      // - subframe:
       {"http://foo.com/", "javascript:abc",
        "An Embedded Page on This Page Says",
        "An embedded page on this page says",
        "An embedded page on this page says"},
 
       // about:
-      // -main frame:
+      // - main frame:
       {"about:blank", "about:blank", "This Page Says", "This page says",
        "This page says"},
-      // -subframe:
+      // - subframe:
       {"http://foo.com/", "about:blank", "An Embedded Page on This Page Says",
        "An embedded page on this page says",
        "An embedded page on this page says"},
 
       // blob:
-      // -main frame:
+      // - main frame:
       {"blob:http://foo.com/66666666-6666-6666-6666-666666666666",
        "blob:http://foo.com/66666666-6666-6666-6666-666666666666",
-       "This Page Says", "This page says", "This page says"},
-      // -subframe:
-      {"http://foo.com/",
+       "foo.com Says", "foo.com says", "foo.com says"},
+      // - subframe:
+      {"http://bar.com/",
        "blob:http://foo.com/66666666-6666-6666-6666-666666666666",
-       "An Embedded Page on This Page Says",
-       "An embedded page on this page says",
-       "An embedded page on this page says"},
+       "An Embedded Page at foo.com Says", "An embedded page at foo.com says",
+       "An embedded page at foo.com says"},
 
       // filesystem:
-      // -main frame:
-      {"filesystem:http://foo.com/", "filesystem:http://foo.com/",
-       "This Page Says", "This page says", "This page says"},
-      // -subframe:
-      {"http://foo.com/", "filesystem:http://foo.com/",
-       "An Embedded Page on This Page Says",
-       "An embedded page on this page says",
-       "An embedded page on this page says"},
+      // - main frame:
+      {"filesystem:http://foo.com/bar.html",
+       "filesystem:http://foo.com/bar.html", "foo.com Says", "foo.com says",
+       "foo.com says"},
+      // - subframe:
+      {"http://bar.com/", "filesystem:http://foo.com/bar.html",
+       "An Embedded Page at foo.com Says", "An embedded page at foo.com says",
+       "An embedded page at foo.com says"},
   };
 
   for (const auto& test_case : cases) {
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc
index 9820981..6d125e9 100644
--- a/components/exo/shell_surface.cc
+++ b/components/exo/shell_surface.cc
@@ -15,6 +15,7 @@
 #include "ash/wm/drag_window_resizer.h"
 #include "ash/wm/window_resizer.h"
 #include "ash/wm/window_state.h"
+#include "ash/wm/window_state_delegate.h"
 #include "ash/wm/window_util.h"
 #include "base/logging.h"
 #include "base/macros.h"
@@ -67,16 +68,26 @@
     {ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN},
     {ui::VKEY_F4, ui::EF_ALT_DOWN}};
 
-class CustomFrameView : public ash::CustomFrameViewAshBase {
+class CustomFrameView : public ash::CustomFrameViewAsh {
  public:
   using ShapeRects = std::vector<gfx::Rect>;
 
-  explicit CustomFrameView(views::Widget* widget) : widget_(widget) {}
+  CustomFrameView(views::Widget* widget, bool enabled)
+      : CustomFrameViewAsh(widget) {
+    SetEnabled(enabled);
+    if (!enabled)
+      CustomFrameViewAsh::SetShouldPaintHeader(false);
+  }
+
   ~CustomFrameView() override {}
 
   // Overridden from ash::CustomFrameViewAshBase:
   void SetShouldPaintHeader(bool paint) override {
-    aura::Window* window = widget_->GetNativeWindow();
+    if (enabled()) {
+      CustomFrameViewAsh::SetShouldPaintHeader(paint);
+      return;
+    }
+    aura::Window* window = GetWidget()->GetNativeWindow();
     ui::Layer* layer = window->layer();
     if (paint) {
       if (layer->alpha_shape()) {
@@ -99,23 +110,46 @@
   }
 
   // Overridden from views::NonClientFrameView:
-  gfx::Rect GetBoundsForClientView() const override { return bounds(); }
+  gfx::Rect GetBoundsForClientView() const override {
+    if (enabled())
+      return ash::CustomFrameViewAsh::GetBoundsForClientView();
+    return bounds();
+  }
   gfx::Rect GetWindowBoundsForClientBounds(
       const gfx::Rect& client_bounds) const override {
+    if (enabled()) {
+      return ash::CustomFrameViewAsh::GetWindowBoundsForClientBounds(
+          client_bounds);
+    }
     return client_bounds;
   }
   int NonClientHitTest(const gfx::Point& point) override {
-    return widget_->client_view()->NonClientHitTest(point);
+    if (enabled())
+      return ash::CustomFrameViewAsh::NonClientHitTest(point);
+    return GetWidget()->client_view()->NonClientHitTest(point);
   }
-  void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask) override {}
-  void ResetWindowControls() override {}
-  void UpdateWindowIcon() override {}
-  void UpdateWindowTitle() override {}
-  void SizeConstraintsChanged() override {}
+  void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask) override {
+    if (enabled())
+      return ash::CustomFrameViewAsh::GetWindowMask(size, window_mask);
+  }
+  void ResetWindowControls() override {
+    if (enabled())
+      return ash::CustomFrameViewAsh::ResetWindowControls();
+  }
+  void UpdateWindowIcon() override {
+    if (enabled())
+      return ash::CustomFrameViewAsh::ResetWindowControls();
+  }
+  void UpdateWindowTitle() override {
+    if (enabled())
+      return ash::CustomFrameViewAsh::UpdateWindowTitle();
+  }
+  void SizeConstraintsChanged() override {
+    if (enabled())
+      return ash::CustomFrameViewAsh::SizeConstraintsChanged();
+  }
 
  private:
-  views::Widget* const widget_;
-
   DISALLOW_COPY_AND_ASSIGN(CustomFrameView);
 };
 
@@ -172,6 +206,26 @@
   DISALLOW_COPY_AND_ASSIGN(ShellSurfaceWidget);
 };
 
+// A place holder to disable default implementation created by
+// ash::CustomFrameViewAsh, which triggers immersive fullscreen etc, which
+// we don't need.
+class CustomWindowStateDelegate : public ash::wm::WindowStateDelegate {
+ public:
+  CustomWindowStateDelegate() {}
+  ~CustomWindowStateDelegate() override {}
+
+  // Overridden from ash::wm::WindowStateDelegate:
+  bool ToggleFullscreen(ash::wm::WindowState* window_state) override {
+    return false;
+  }
+  bool RestoreAlwaysOnTop(ash::wm::WindowState* window_state) override {
+    return false;
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CustomWindowStateDelegate);
+};
+
 }  // namespace
 
 // Surface state associated with each configure request.
@@ -799,10 +853,11 @@
   aura::Window* window = widget_->GetNativeWindow();
   // ShellSurfaces always use immersive mode.
   window->SetProperty(aura::client::kImmersiveFullscreenKey, true);
-  if (frame_enabled_)
-    return new ash::CustomFrameViewAsh(widget);
-
-  return new CustomFrameView(widget);
+  if (!frame_enabled_) {
+    ash::wm::WindowState* window_state = ash::wm::GetWindowState(window);
+    window_state->SetDelegate(std::make_unique<CustomWindowStateDelegate>());
+  }
+  return new CustomFrameView(widget, frame_enabled_);
 }
 
 bool ShellSurface::WidgetHasHitTestMask() const {
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index ee720ecf..0fbb762 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -3496,19 +3496,20 @@
     int64_t microseconds =
         presentation_time_us % base::Time::kMicrosecondsPerSecond;
     static_assert(
-        static_cast<uint32_t>(gfx::PresentationFlags::kVSync) ==
+        static_cast<uint32_t>(gfx::PresentationFeedback::Flags::kVSync) ==
             static_cast<uint32_t>(WP_PRESENTATION_FEEDBACK_KIND_VSYNC),
         "gfx::PresentationFlags::VSync don't match!");
     static_assert(
-        static_cast<uint32_t>(gfx::PresentationFlags::kHWClock) ==
+        static_cast<uint32_t>(gfx::PresentationFeedback::Flags::kHWClock) ==
             static_cast<uint32_t>(WP_PRESENTATION_FEEDBACK_KIND_HW_CLOCK),
         "gfx::PresentationFlags::HWClock don't match!");
     static_assert(
-        static_cast<uint32_t>(gfx::PresentationFlags::kHWCompletion) ==
+        static_cast<uint32_t>(
+            gfx::PresentationFeedback::Flags::kHWCompletion) ==
             static_cast<uint32_t>(WP_PRESENTATION_FEEDBACK_KIND_HW_COMPLETION),
         "gfx::PresentationFlags::HWCompletion don't match!");
     static_assert(
-        static_cast<uint32_t>(gfx::PresentationFlags::kZeroCopy) ==
+        static_cast<uint32_t>(gfx::PresentationFeedback::Flags::kZeroCopy) ==
             static_cast<uint32_t>(WP_PRESENTATION_FEEDBACK_KIND_ZERO_COPY),
         "gfx::PresentationFlags::ZeroCopy don't match!");
     wp_presentation_feedback_send_presented(
diff --git a/components/omnibox/browser/suggestion_answer.cc b/components/omnibox/browser/suggestion_answer.cc
index 9f4458d..00d3c666 100644
--- a/components/omnibox/browser/suggestion_answer.cc
+++ b/components/omnibox/browser/suggestion_answer.cc
@@ -195,7 +195,7 @@
 // static
 std::unique_ptr<SuggestionAnswer> SuggestionAnswer::ParseAnswer(
     const base::DictionaryValue* answer_json) {
-  auto result = base::WrapUnique(new SuggestionAnswer);
+  auto result = base::MakeUnique<SuggestionAnswer>();
 
   const base::ListValue* lines_json;
   if (!answer_json->GetList(kAnswerJsonLines, &lines_json) ||
diff --git a/components/omnibox/browser/suggestion_answer_unittest.cc b/components/omnibox/browser/suggestion_answer_unittest.cc
index d0a3553f..5f154a2 100644
--- a/components/omnibox/browser/suggestion_answer_unittest.cc
+++ b/components/omnibox/browser/suggestion_answer_unittest.cc
@@ -35,7 +35,7 @@
   SuggestionAnswer answer1;
   EXPECT_TRUE(answer1.Equals(SuggestionAnswer(answer1)));
 
-  auto answer2 = base::WrapUnique(new SuggestionAnswer);
+  auto answer2 = base::MakeUnique<SuggestionAnswer>();
   answer2->set_type(832345);
   EXPECT_TRUE(answer2->Equals(SuggestionAnswer(*answer2)));
 
diff --git a/content/gpu/gpu_sandbox_hook_linux.cc b/content/gpu/gpu_sandbox_hook_linux.cc
index 1ccff94..c0ea362 100644
--- a/content/gpu/gpu_sandbox_hook_linux.cc
+++ b/content/gpu/gpu_sandbox_hook_linux.cc
@@ -342,9 +342,7 @@
   if (!LoadLibrariesForGpu(options))
     return false;
 
-  // TODO(tsepez): enable once we can proxy the stat(), readlink() syscalls.
-  if (!IsChromeOS() || !options.use_amd_specific_policies)
-    instance->EngageNamespaceSandbox(false /* from_zygote */);
+  // TODO(tsepez): enable namspace sandbox here once crashes are understood.
 
   errno = 0;
   return true;
diff --git a/extensions/BUILD.gn b/extensions/BUILD.gn
index 7659aff..c11f618 100644
--- a/extensions/BUILD.gn
+++ b/extensions/BUILD.gn
@@ -217,6 +217,8 @@
     "//extensions/renderer:unit_tests",
     "//extensions/shell:unit_tests",
     "//extensions/utility:unit_tests",
+    "//services/data_decoder:lib",
+    "//services/service_manager/public/cpp/test:test_support",
     "//ui/gl:test_support",
   ]
 
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index ddcf4e8..c052d184 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -557,6 +557,7 @@
     "requirements_checker_unittest.cc",
     "runtime_data_unittest.cc",
     "sandboxed_unpacker_unittest.cc",
+    "updater/safe_manifest_parser_unittest.cc",
     "updater/update_service_unittest.cc",
     "value_store/leveldb_scoped_database_unittest.cc",
     "value_store/leveldb_value_store_unittest.cc",
@@ -595,6 +596,7 @@
     "//extensions/features",
     "//ipc:test_support",
     "//net:test_support",
+    "//services/data_decoder/public/cpp:test_support",
     "//services/device/public/interfaces",
     "//storage/browser:test_support",
     "//third_party/leveldatabase",
diff --git a/extensions/browser/DEPS b/extensions/browser/DEPS
index 10aca03b..ef0d6ac8 100644
--- a/extensions/browser/DEPS
+++ b/extensions/browser/DEPS
@@ -23,6 +23,7 @@
   "+net",
   # This directory contains build flags and does not pull all of PPAPI in.
   "+ppapi/features",
+  "+services/data_decoder/public/cpp",
   "+services/network/public/cpp",
   "+services/preferences/public/cpp",
   "+services/service_manager/public/cpp",
diff --git a/extensions/browser/updater/BUILD.gn b/extensions/browser/updater/BUILD.gn
index 12590472..fb43114 100644
--- a/extensions/browser/updater/BUILD.gn
+++ b/extensions/browser/updater/BUILD.gn
@@ -41,5 +41,6 @@
   deps = [
     "//extensions/common",
     "//extensions/strings",
+    "//services/data_decoder/public/cpp",
   ]
 }
diff --git a/extensions/browser/updater/extension_downloader.cc b/extensions/browser/updater/extension_downloader.cc
index be85f4d6..aedf07d 100644
--- a/extensions/browser/updater/extension_downloader.cc
+++ b/extensions/browser/updater/extension_downloader.cc
@@ -30,7 +30,6 @@
 #include "extensions/browser/updater/extension_cache.h"
 #include "extensions/browser/updater/extension_downloader_test_delegate.h"
 #include "extensions/browser/updater/request_queue_impl.h"
-#include "extensions/browser/updater/safe_manifest_parser.h"
 #include "extensions/common/extension_urls.h"
 #include "extensions/common/manifest_url_handlers.h"
 #include "google_apis/gaia/identity_provider.h"
@@ -196,10 +195,12 @@
 
 ExtensionDownloader::ExtensionDownloader(
     ExtensionDownloaderDelegate* delegate,
-    net::URLRequestContextGetter* request_context)
+    net::URLRequestContextGetter* request_context,
+    service_manager::Connector* connector)
     : OAuth2TokenService::Consumer(kTokenServiceConsumerId),
       delegate_(delegate),
       request_context_(request_context),
+      connector_(connector),
       manifests_queue_(&kDefaultBackoffPolicy,
                        base::Bind(&ExtensionDownloader::CreateManifestFetcher,
                                   base::Unretained(this))),
@@ -578,11 +579,10 @@
                     manifests_queue_.active_request_failure_count(),
                     url);
     VLOG(2) << "beginning manifest parse for " << url;
-    auto callback = base::Bind(
-        &ExtensionDownloader::HandleManifestResults,
-        weak_ptr_factory_.GetWeakPtr(),
-        base::Owned(manifests_queue_.reset_active_request().release()));
-    ParseUpdateManifest(data, callback);
+    auto callback = base::BindOnce(&ExtensionDownloader::HandleManifestResults,
+                                   weak_ptr_factory_.GetWeakPtr(),
+                                   manifests_queue_.reset_active_request());
+    ParseUpdateManifest(connector_, data, std::move(callback));
   } else {
     VLOG(1) << "Failed to fetch manifest '" << url.possibly_invalid_spec()
             << "' response code:" << response_code;
@@ -607,8 +607,9 @@
 }
 
 void ExtensionDownloader::HandleManifestResults(
-    const ManifestFetchData* fetch_data,
-    const UpdateManifest::Results* results) {
+    std::unique_ptr<ManifestFetchData> fetch_data,
+    std::unique_ptr<UpdateManifestResults> results,
+    const base::Optional<std::string>& error) {
   // Keep a list of extensions that will not be updated, so that the |delegate_|
   // can be notified once we're done here.
   std::set<std::string> not_updated(fetch_data->extension_ids());
@@ -627,7 +628,7 @@
   std::vector<int> updates;
   DetermineUpdates(*fetch_data, *results, &updates);
   for (size_t i = 0; i < updates.size(); i++) {
-    const UpdateManifest::Result* update = &(results->list.at(updates[i]));
+    const UpdateManifestResult* update = &(results->list.at(updates[i]));
     const std::string& id = update->extension_id;
     not_updated.erase(id);
 
@@ -679,10 +680,10 @@
 
 void ExtensionDownloader::DetermineUpdates(
     const ManifestFetchData& fetch_data,
-    const UpdateManifest::Results& possible_updates,
+    const UpdateManifestResults& possible_updates,
     std::vector<int>* result) {
   for (size_t i = 0; i < possible_updates.list.size(); i++) {
-    const UpdateManifest::Result* update = &possible_updates.list[i];
+    const UpdateManifestResult* update = &possible_updates.list[i];
     const std::string& id = update->extension_id;
 
     if (!fetch_data.Includes(id)) {
diff --git a/extensions/browser/updater/extension_downloader.h b/extensions/browser/updater/extension_downloader.h
index d0dffbcc..bac0601d 100644
--- a/extensions/browser/updater/extension_downloader.h
+++ b/extensions/browser/updater/extension_downloader.h
@@ -19,8 +19,8 @@
 #include "extensions/browser/updater/extension_downloader_delegate.h"
 #include "extensions/browser/updater/manifest_fetch_data.h"
 #include "extensions/browser/updater/request_queue.h"
+#include "extensions/browser/updater/safe_manifest_parser.h"
 #include "extensions/common/extension.h"
-#include "extensions/common/update_manifest.h"
 #include "google_apis/gaia/oauth2_token_service.h"
 #include "net/url_request/url_fetcher_delegate.h"
 #include "url/gurl.h"
@@ -33,6 +33,10 @@
 class URLRequestStatus;
 }
 
+namespace service_manager {
+class Connector;
+}
+
 namespace extensions {
 
 struct UpdateDetails {
@@ -63,7 +67,8 @@
   // |delegate| is stored as a raw pointer and must outlive the
   // ExtensionDownloader.
   ExtensionDownloader(ExtensionDownloaderDelegate* delegate,
-                      net::URLRequestContextGetter* request_context);
+                      net::URLRequestContextGetter* request_context,
+                      service_manager::Connector* connector);
   ~ExtensionDownloader() override;
 
   // Adds |extension| to the list of extensions to check for updates.
@@ -237,13 +242,14 @@
 
   // Once a manifest is parsed, this starts fetches of any relevant crx files.
   // If |results| is null, it means something went wrong when parsing it.
-  void HandleManifestResults(const ManifestFetchData* fetch_data,
-                             const UpdateManifest::Results* results);
+  void HandleManifestResults(std::unique_ptr<ManifestFetchData> fetch_data,
+                             std::unique_ptr<UpdateManifestResults> results,
+                             const base::Optional<std::string>& error);
 
   // Given a list of potential updates, returns the indices of the ones that are
   // applicable (are actually a new version, etc.) in |result|.
   void DetermineUpdates(const ManifestFetchData& fetch_data,
-                        const UpdateManifest::Results& possible_updates,
+                        const UpdateManifestResults& possible_updates,
                         std::vector<int>* result);
 
   // Begins (or queues up) download of an updated extension.
@@ -311,6 +317,9 @@
   // The request context to use for the URLFetchers.
   scoped_refptr<net::URLRequestContextGetter> request_context_;
 
+  // The connector to the ServiceManager.
+  service_manager::Connector* connector_;
+
   // Collects UMA samples that are reported when ReportStats() is called.
   URLStats url_stats_;
 
diff --git a/extensions/browser/updater/safe_manifest_parser.cc b/extensions/browser/updater/safe_manifest_parser.cc
index 7e2731c..b13c755 100644
--- a/extensions/browser/updater/safe_manifest_parser.cc
+++ b/extensions/browser/updater/safe_manifest_parser.cc
@@ -8,45 +8,220 @@
 
 #include "base/bind.h"
 #include "base/optional.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "base/version.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/utility_process_mojo_client.h"
-#include "extensions/common/manifest_parser.mojom.h"
-#include "extensions/strings/grit/extensions_strings.h"
-#include "ui/base/l10n/l10n_util.h"
+#include "services/data_decoder/public/cpp/safe_xml_parser.h"
+
+namespace extensions {
+
+using data_decoder::GetXmlElementAttribute;
+using data_decoder::GetXmlElementChildWithTag;
+using data_decoder::GetXmlElementNamespacePrefix;
+using data_decoder::GetXmlQualifiedName;
+using data_decoder::IsXmlElementNamed;
 
 namespace {
 
-using UtilityProcess =
-    content::UtilityProcessMojoClient<extensions::mojom::ManifestParser>;
+constexpr char kExpectedGupdateProtocol[] = "2.0";
+constexpr char kExpectedGupdateXmlns[] =
+    "http://www.google.com/update2/response";
 
-using ResultCallback = base::Callback<void(const UpdateManifest::Results*)>;
+void ReportError(ParseUpdateManifestCallback callback,
+                 const std::string& error) {
+  std::move(callback).Run(/*results=*/nullptr, error);
+}
 
-void ParseDone(std::unique_ptr<UtilityProcess> /* utility_process */,
-               const ResultCallback& callback,
-               const base::Optional<UpdateManifest::Results>& results) {
+// Helper function that reads in values for a single <app> tag. It returns a
+// boolean indicating success or failure. On failure, it writes a error message
+// into |error_detail|.
+bool ParseSingleAppTag(const base::Value& app_element,
+                       const std::string& xml_namespace,
+                       UpdateManifestResult* result,
+                       std::string* error_detail) {
+  // Read the extension id.
+  result->extension_id = GetXmlElementAttribute(app_element, "appid");
+  if (result->extension_id.empty()) {
+    *error_detail = "Missing appid on app node";
+    return false;
+  }
+
+  // Get the updatecheck node.
+  std::string updatecheck_name =
+      GetXmlQualifiedName(xml_namespace, "updatecheck");
+  int updatecheck_count =
+      data_decoder::GetXmlElementChildrenCount(app_element, updatecheck_name);
+  if (updatecheck_count != 1) {
+    *error_detail = updatecheck_count == 0
+                        ? "Too many updatecheck tags on app (expecting only 1)."
+                        : "Missing updatecheck on app.";
+    return false;
+  }
+
+  const base::Value* updatecheck =
+      data_decoder::GetXmlElementChildWithTag(app_element, updatecheck_name);
+
+  if (GetXmlElementAttribute(*updatecheck, "status") == "noupdate")
+    return true;
+
+  // Find the url to the crx file.
+  result->crx_url = GURL(GetXmlElementAttribute(*updatecheck, "codebase"));
+  if (!result->crx_url.is_valid()) {
+    *error_detail = "Invalid codebase url: '";
+    *error_detail += result->crx_url.possibly_invalid_spec();
+    *error_detail += "'.";
+    return false;
+  }
+
+  // Get the version.
+  result->version = GetXmlElementAttribute(*updatecheck, "version");
+  if (result->version.empty()) {
+    *error_detail = "Missing version for updatecheck.";
+    return false;
+  }
+  base::Version version(result->version);
+  if (!version.IsValid()) {
+    *error_detail = "Invalid version: '";
+    *error_detail += result->version;
+    *error_detail += "'.";
+    return false;
+  }
+
+  // Get the optional minimum browser version.
+  result->browser_min_version =
+      GetXmlElementAttribute(*updatecheck, "prodversionmin");
+  if (!result->browser_min_version.empty()) {
+    base::Version browser_min_version(result->browser_min_version);
+    if (!browser_min_version.IsValid()) {
+      *error_detail = "Invalid prodversionmin: '";
+      *error_detail += result->browser_min_version;
+      *error_detail += "'.";
+      return false;
+    }
+  }
+
+  // package_hash is optional. It is a sha256 hash of the package in hex format.
+  result->package_hash = GetXmlElementAttribute(*updatecheck, "hash_sha256");
+
+  int size = 0;
+  if (base::StringToInt(GetXmlElementAttribute(*updatecheck, "size"), &size)) {
+    result->size = size;
+  }
+
+  // package_fingerprint is optional. It identifies the package, preferably
+  // with a modified sha256 hash of the package in hex format.
+  result->package_fingerprint = GetXmlElementAttribute(*updatecheck, "fp");
+
+  // Differential update information is optional.
+  result->diff_crx_url =
+      GURL(GetXmlElementAttribute(*updatecheck, "codebasediff"));
+  result->diff_package_hash = GetXmlElementAttribute(*updatecheck, "hashdiff");
+  int sizediff = 0;
+  if (base::StringToInt(GetXmlElementAttribute(*updatecheck, "sizediff"),
+                        &sizediff)) {
+    result->diff_size = sizediff;
+  }
+
+  return true;
+}
+
+void ParseXmlDone(ParseUpdateManifestCallback callback,
+                  std::unique_ptr<base::Value> root,
+                  const base::Optional<std::string>& error) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  callback.Run(results ? &results.value() : nullptr);
+  if (error) {
+    ReportError(std::move(callback), "Failed to parse XML: " + *error);
+    return;
+  }
+
+  auto results = std::make_unique<UpdateManifestResults>();
+  if (!root) {
+    ReportError(std::move(callback), "Empty XML");
+    return;
+  }
+
+  // Look for the required namespace declaration.
+  std::string gupdate_ns;
+  if (!GetXmlElementNamespacePrefix(*root, kExpectedGupdateXmlns,
+                                    &gupdate_ns)) {
+    ReportError(std::move(callback),
+                "Missing or incorrect xmlns on gupdate tag");
+    return;
+  }
+
+  if (!IsXmlElementNamed(*root, GetXmlQualifiedName(gupdate_ns, "gupdate"))) {
+    ReportError(std::move(callback), "Missing gupdate tag");
+    return;
+  }
+
+  // Check for the gupdate "protocol" attribute.
+  if (GetXmlElementAttribute(*root, "protocol") != kExpectedGupdateProtocol) {
+    ReportError(std::move(callback),
+                std::string("Missing/incorrect protocol on gupdate tag "
+                            "(expected '") +
+                    kExpectedGupdateProtocol + "')");
+    return;
+  }
+
+  // Parse the first <daystart> if it's present.
+  const base::Value* daystart = GetXmlElementChildWithTag(
+      *root, GetXmlQualifiedName(gupdate_ns, "daystart"));
+  if (daystart) {
+    std::string elapsed_seconds =
+        GetXmlElementAttribute(*daystart, "elapsed_seconds");
+    int parsed_elapsed = kNoDaystart;
+    if (base::StringToInt(elapsed_seconds, &parsed_elapsed)) {
+      results->daystart_elapsed_seconds = parsed_elapsed;
+    }
+  }
+
+  // Parse each of the <app> tags.
+  std::vector<const base::Value*> apps;
+  data_decoder::GetAllXmlElementChildrenWithTag(
+      *root, GetXmlQualifiedName(gupdate_ns, "app"), &apps);
+  std::string error_msg;
+  for (const auto* app : apps) {
+    UpdateManifestResult result;
+    std::string app_error;
+    if (!ParseSingleAppTag(*app, gupdate_ns, &result, &app_error)) {
+      if (!error_msg.empty())
+        error_msg += "\r\n";  // Should we have an OS specific EOL?
+      error_msg += app_error;
+    } else {
+      results->list.push_back(result);
+    }
+  }
+
+  std::move(callback).Run(
+      results->list.empty() ? nullptr : std::move(results),
+      error_msg.empty() ? base::Optional<std::string>() : error_msg);
 }
 
 }  // namespace
 
-namespace extensions {
+UpdateManifestResult::UpdateManifestResult() = default;
 
-void ParseUpdateManifest(const std::string& xml,
-                         const ResultCallback& callback) {
+UpdateManifestResult::UpdateManifestResult(const UpdateManifestResult& other) =
+    default;
+
+UpdateManifestResult::~UpdateManifestResult() = default;
+
+UpdateManifestResults::UpdateManifestResults() = default;
+
+UpdateManifestResults::UpdateManifestResults(
+    const UpdateManifestResults& other) = default;
+
+UpdateManifestResults::~UpdateManifestResults() = default;
+
+void ParseUpdateManifest(service_manager::Connector* connector,
+                         const std::string& xml,
+                         ParseUpdateManifestCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(callback);
-
-  auto process = std::make_unique<UtilityProcess>(
-      l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_MANIFEST_PARSER_NAME));
-  auto* utility_process = process.get();
-  auto done = base::Bind(&ParseDone, base::Passed(&process), callback);
-  utility_process->set_error_callback(base::Bind(done, base::nullopt));
-
-  utility_process->Start();
-
-  utility_process->service()->Parse(xml, done);
+  data_decoder::ParseXml(connector, xml,
+                         base::BindOnce(&ParseXmlDone, std::move(callback)));
 }
 
 }  // namespace extensions
diff --git a/extensions/browser/updater/safe_manifest_parser.h b/extensions/browser/updater/safe_manifest_parser.h
index b3e953e..5415588 100644
--- a/extensions/browser/updater/safe_manifest_parser.h
+++ b/extensions/browser/updater/safe_manifest_parser.h
@@ -5,19 +5,90 @@
 #ifndef EXTENSIONS_BROWSER_UPDATER_SAFE_MANIFEST_PARSER_H_
 #define EXTENSIONS_BROWSER_UPDATER_SAFE_MANIFEST_PARSER_H_
 
+#include <memory>
 #include <string>
+#include <vector>
 
 #include "base/callback_forward.h"
-#include "extensions/common/update_manifest.h"
+#include "base/optional.h"
+#include "url/gurl.h"
+
+namespace service_manager {
+class Connector;
+}
 
 namespace extensions {
 
+struct UpdateManifestResult {
+  UpdateManifestResult();
+  UpdateManifestResult(const UpdateManifestResult& other);
+  ~UpdateManifestResult();
+
+  std::string extension_id;
+  std::string version;
+  std::string browser_min_version;
+
+  // Attributes for the full update.
+  GURL crx_url;
+  std::string package_hash;
+  int size = 0;
+  std::string package_fingerprint;
+
+  // Attributes for the differential update.
+  GURL diff_crx_url;
+  std::string diff_package_hash;
+  int diff_size = 0;
+};
+
+constexpr int kNoDaystart = -1;
+struct UpdateManifestResults {
+  UpdateManifestResults();
+  UpdateManifestResults(const UpdateManifestResults& other);
+  UpdateManifestResults& operator=(const UpdateManifestResults& other);
+  ~UpdateManifestResults();
+
+  std::vector<UpdateManifestResult> list;
+  // This will be >= 0, or kNoDaystart if the <daystart> tag was not present.
+  int daystart_elapsed_seconds = kNoDaystart;
+};
+
 // Parses an update manifest |xml| safely in a utility process and calls
 // |callback| with the results, which will be null on failure. Runs on
 // the UI thread.
-void ParseUpdateManifest(
-    const std::string& xml,
-    const base::Callback<void(const UpdateManifest::Results*)>& callback);
+//
+// An update manifest looks like this:
+//
+// <?xml version="1.0" encoding="UTF-8"?>
+// <gupdate xmlns="http://www.google.com/update2/response" protocol="2.0">
+//  <daystart elapsed_seconds="300" />
+//  <app appid="12345" status="ok">
+//   <updatecheck codebase="http://example.com/extension_1.2.3.4.crx"
+//                hash="12345" size="9854" status="ok" version="1.2.3.4"
+//                prodversionmin="2.0.143.0"
+//                codebasediff="http://example.com/diff_1.2.3.4.crx"
+//                hashdiff="123" sizediff="101"
+//                fp="1.123" />
+//  </app>
+// </gupdate>
+//
+// The <daystart> tag contains a "elapsed_seconds" attribute which refers to
+// the server's notion of how many seconds it has been since midnight.
+//
+// The "appid" attribute of the <app> tag refers to the unique id of the
+// extension. The "codebase" attribute of the <updatecheck> tag is the url to
+// fetch the updated crx file, and the "prodversionmin" attribute refers to
+// the minimum version of the chrome browser that the update applies to.
+
+// The diff data members correspond to the differential update package, if
+// a differential update is specified in the response.
+
+// The result of parsing one <app> tag in an xml update check manifest.
+using ParseUpdateManifestCallback =
+    base::OnceCallback<void(std::unique_ptr<UpdateManifestResults> results,
+                            const base::Optional<std::string>& error)>;
+void ParseUpdateManifest(service_manager::Connector* connector,
+                         const std::string& xml,
+                         ParseUpdateManifestCallback callback);
 
 }  // namespace extensions
 
diff --git a/extensions/browser/updater/safe_manifest_parser_unittest.cc b/extensions/browser/updater/safe_manifest_parser_unittest.cc
new file mode 100644
index 0000000..2d7df9f
--- /dev/null
+++ b/extensions/browser/updater/safe_manifest_parser_unittest.cc
@@ -0,0 +1,241 @@
+// Copyright (c) 2011 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 "extensions/browser/updater/safe_manifest_parser.h"
+
+#include "base/run_loop.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/browser/updater/safe_manifest_parser.h"
+#include "services/data_decoder/public/cpp/test_data_decoder_service.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace extensions {
+
+namespace {
+
+class ExtensionUpdateManifestTest : public testing::Test {
+ public:
+  void TestParseUpdateManifest(const std::string& xml) {
+    base::RunLoop run_loop;
+    ParseUpdateManifest(
+        test_data_decoder_service_.connector(), xml,
+        base::BindOnce(&ExtensionUpdateManifestTest::OnUpdateManifestParsed,
+                       base::Unretained(this), run_loop.QuitClosure()));
+    run_loop.Run();
+  }
+
+ protected:
+  UpdateManifestResults* results() const { return results_.get(); }
+  const base::Optional<std::string>& error() const { return error_; }
+
+  void ExpectNoError() {
+    EXPECT_FALSE(error_) << "Unexpected error: '" << *error_;
+  }
+
+ private:
+  void OnUpdateManifestParsed(base::Closure quit_loop,
+                              std::unique_ptr<UpdateManifestResults> results,
+                              const base::Optional<std::string>& error) {
+    results_ = std::move(results);
+    error_ = error;
+    std::move(quit_loop).Run();
+  }
+
+  content::TestBrowserThreadBundle browser_thread_bundle_;
+  std::unique_ptr<UpdateManifestResults> results_;
+  base::Optional<std::string> error_;
+  data_decoder::TestDataDecoderService test_data_decoder_service_;
+};
+
+}  // namespace
+
+TEST_F(ExtensionUpdateManifestTest, InvalidXml) {
+  TestParseUpdateManifest(std::string());
+  EXPECT_FALSE(results());
+  EXPECT_TRUE(error());
+}
+
+TEST_F(ExtensionUpdateManifestTest, MissingAppId) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <app>"
+      "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
+      "               version='1.2.3.4' />"
+      " </app>"
+      "</gupdate>");
+  EXPECT_FALSE(results());
+  EXPECT_TRUE(error());
+}
+
+TEST_F(ExtensionUpdateManifestTest, InvalidCodebase) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <app appid='12345' status='ok'>"
+      "  <updatecheck codebase='example.com/extension_1.2.3.4.crx'"
+      "               version='1.2.3.4' />"
+      " </app>"
+      "</gupdate>");
+  EXPECT_FALSE(results());
+  EXPECT_TRUE(error());
+}
+
+TEST_F(ExtensionUpdateManifestTest, MissingVersion) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <app appid='12345' status='ok'>"
+      "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx' />"
+      " </app>"
+      "</gupdate>");
+  EXPECT_FALSE(results());
+  EXPECT_TRUE(error());
+}
+
+TEST_F(ExtensionUpdateManifestTest, InvalidVersion) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <app appid='12345' status='ok'>"
+      "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx' "
+      "               version='1.2.3.a'/>"
+      " </app>"
+      "</gupdate>");
+  EXPECT_FALSE(results());
+  EXPECT_TRUE(error());
+}
+
+TEST_F(ExtensionUpdateManifestTest, ValidXml) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0' encoding='UTF-8'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <app appid='12345'>"
+      "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
+      "               version='1.2.3.4' prodversionmin='2.0.143.0' />"
+      " </app>"
+      "</gupdate>");
+  ExpectNoError();
+  ASSERT_TRUE(results());
+  EXPECT_EQ(1U, results()->list.size());
+  const UpdateManifestResult& first_result = results()->list.at(0);
+  EXPECT_EQ(GURL("http://example.com/extension_1.2.3.4.crx"),
+            first_result.crx_url);
+  EXPECT_EQ("1.2.3.4", first_result.version);
+  EXPECT_EQ("2.0.143.0", first_result.browser_min_version);
+}
+
+TEST_F(ExtensionUpdateManifestTest, ValidXmlWithNamespacePrefix) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0' encoding='UTF-8'?>"
+      "<g:gupdate xmlns:g='http://www.google.com/update2/response'"
+      "           protocol='2.0'>"
+      " <g:app appid='12345'>"
+      "  <g:updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
+      "               version='1.2.3.4' prodversionmin='2.0.143.0' />"
+      " </g:app>"
+      "</g:gupdate>");
+  ExpectNoError();
+  ASSERT_TRUE(results());
+  EXPECT_EQ(1U, results()->list.size());
+  const UpdateManifestResult& first_result = results()->list.at(0);
+  EXPECT_EQ(GURL("http://example.com/extension_1.2.3.4.crx"),
+            first_result.crx_url);
+  EXPECT_EQ("1.2.3.4", first_result.version);
+  EXPECT_EQ("2.0.143.0", first_result.browser_min_version);
+}
+
+TEST_F(ExtensionUpdateManifestTest, SimilarTagnames) {
+  // Includes unrelated <app> tags from other xml namespaces.
+  // This should not cause problems, the unrelated app tags should be ignored.
+  TestParseUpdateManifest(
+      "<?xml version='1.0' encoding='UTF-8'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response'"
+      "         xmlns:a='http://a' protocol='2.0'>"
+      " <a:app/>"
+      " <b:app xmlns:b='http://b' />"
+      " <app appid='12345'>"
+      "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
+      "               version='1.2.3.4' prodversionmin='2.0.143.0' />"
+      " </app>"
+      " <a:app appid='12345'>"
+      "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
+      "               version='1.2.3.4' prodversionmin='2.0.143.0' />"
+      " </a:app>"
+      "</gupdate>");
+  ExpectNoError();
+  ASSERT_TRUE(results());
+  // We should still have parsed the gupdate app tag.
+  EXPECT_EQ(1U, results()->list.size());
+  EXPECT_EQ(GURL("http://example.com/extension_1.2.3.4.crx"),
+            results()->list.at(0).crx_url);
+}
+
+TEST_F(ExtensionUpdateManifestTest, XmlWithHash) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0' encoding='UTF-8'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <app appid='12345'>"
+      "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
+      "               version='1.2.3.4' prodversionmin='2.0.143.0' "
+      "               hash_sha256='1234'/>"
+      " </app>"
+      "</gupdate>");
+  ExpectNoError();
+  ASSERT_TRUE(results());
+  EXPECT_EQ(1U, results()->list.size());
+  const UpdateManifestResult& first_result = results()->list.at(0);
+  EXPECT_EQ("1234", first_result.package_hash);
+}
+
+TEST_F(ExtensionUpdateManifestTest, XmlWithDaystart) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0' encoding='UTF-8'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <daystart elapsed_seconds='456' />"
+      " <app appid='12345'>"
+      "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
+      "               version='1.2.3.4' prodversionmin='2.0.143.0' />"
+      " </app>"
+      "</gupdate>");
+  ExpectNoError();
+  ASSERT_TRUE(results());
+  EXPECT_EQ(results()->daystart_elapsed_seconds, 456);
+}
+
+TEST_F(ExtensionUpdateManifestTest, NoUpdateResponse) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0' encoding='UTF-8'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <app appid='12345'>"
+      "  <updatecheck status='noupdate' />"
+      " </app>"
+      "</gupdate>");
+  ExpectNoError();
+  ASSERT_TRUE(results());
+  ASSERT_FALSE(results()->list.empty());
+  const UpdateManifestResult& first_result = results()->list.at(0);
+  EXPECT_EQ(first_result.extension_id, "12345");
+  EXPECT_TRUE(first_result.version.empty());
+}
+
+TEST_F(ExtensionUpdateManifestTest, TwoAppsOneError) {
+  TestParseUpdateManifest(
+      "<?xml version='1.0' encoding='UTF-8'?>"
+      "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
+      " <app appid='aaaaaaaa' status='error-unknownApplication'>"
+      "  <updatecheck status='error-unknownapplication'/>"
+      " </app>"
+      " <app appid='bbbbbbbb'>"
+      "  <updatecheck codebase='http://example.com/b_3.1.crx' version='3.1'/>"
+      " </app>"
+      "</gupdate>");
+  EXPECT_TRUE(error());
+  ASSERT_TRUE(results());
+  EXPECT_EQ(1U, results()->list.size());
+  const UpdateManifestResult& first_result = results()->list.at(0);
+  EXPECT_EQ(first_result.extension_id, "bbbbbbbb");
+}
+
+}  // namespace extensions
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn
index 9b2bfe9..521f0f8 100644
--- a/extensions/common/BUILD.gn
+++ b/extensions/common/BUILD.gn
@@ -24,7 +24,6 @@
   mojom("mojo") {
     sources = [
       "extension_unpacker.mojom",
-      "manifest_parser.mojom",
       "mojo/app_window.mojom",
       "mojo/keep_alive.mojom",
     ]
@@ -263,8 +262,6 @@
       "stack_frame.h",
       "switches.cc",
       "switches.h",
-      "update_manifest.cc",
-      "update_manifest.h",
       "url_pattern.cc",
       "url_pattern.h",
       "url_pattern_set.cc",
@@ -313,7 +310,6 @@
       "//net",
       "//third_party/boringssl",
       "//third_party/icu",
-      "//third_party/libxml",
       "//third_party/re2",
       "//ui/base",
       "//ui/gfx/geometry",
@@ -390,7 +386,6 @@
       "permissions/socket_permission_unittest.cc",
       "permissions/usb_device_permission_unittest.cc",
       "stack_frame_unittest.cc",
-      "update_manifest_unittest.cc",
       "url_pattern_set_unittest.cc",
       "url_pattern_unittest.cc",
       "user_script_unittest.cc",
diff --git a/extensions/common/manifest_parser.mojom b/extensions/common/manifest_parser.mojom
deleted file mode 100644
index be0aa78..0000000
--- a/extensions/common/manifest_parser.mojom
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Secure chrome extension update manifest parser provided by the utility
-// process and exposed by mojo policy to the chrome browser process.
-
-module extensions.mojom;
-
-import "url/mojo/url.mojom";
-
-interface ManifestParser {
-  // Parse an extensions update manifest |xml| document and return the
-  // |results|, or null if parsing fails.
-  Parse(string xml) => (UpdateManifestResults? results);
-};
-
-struct UpdateManifestResults {
-  array<UpdateManifestResult> list;
-  int32 daystart_elapsed_seconds;
-};
-
-struct UpdateManifestResult {
-  string extension_id;
-  string version;
-  string browser_min_version;
-
-  url.mojom.Url crx_url;
-  string package_hash;
-  int32 size;
-  string package_fingerprint;
-
-  url.mojom.Url diff_crx_url;
-  string diff_package_hash;
-  int32 diff_size;
-};
diff --git a/extensions/common/manifest_parser.typemap b/extensions/common/manifest_parser.typemap
deleted file mode 100644
index 82cb2b0..0000000
--- a/extensions/common/manifest_parser.typemap
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//extensions/common/manifest_parser.mojom"
-
-public_headers = [ "//extensions/common/update_manifest.h" ]
-
-traits_headers = [ "//extensions/common/manifest_parser_struct_traits.h" ]
-
-sources = [
-  "//extensions/common/manifest_parser_struct_traits.cc",
-]
-
-type_mappings = [
-  "extensions.mojom.UpdateManifestResults=::UpdateManifest::Results",
-  "extensions.mojom.UpdateManifestResult=::UpdateManifest::Result",
-]
diff --git a/extensions/common/manifest_parser_struct_traits.cc b/extensions/common/manifest_parser_struct_traits.cc
deleted file mode 100644
index ddce9a53..0000000
--- a/extensions/common/manifest_parser_struct_traits.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "extensions/common/manifest_parser_struct_traits.h"
-#include "url/mojo/url_gurl_struct_traits.h"
-
-namespace mojo {
-
-// static
-bool StructTraits<::extensions::mojom::UpdateManifestResults::DataView,
-                  ::UpdateManifest::Results>::
-    Read(::extensions::mojom::UpdateManifestResults::DataView input,
-         ::UpdateManifest::Results* output) {
-  if (!input.ReadList(&output->list))
-    return false;
-  output->daystart_elapsed_seconds = input.daystart_elapsed_seconds();
-  return true;
-}
-
-// static
-bool StructTraits<::extensions::mojom::UpdateManifestResult::DataView,
-                  ::UpdateManifest::Result>::
-    Read(::extensions::mojom::UpdateManifestResult::DataView input,
-         ::UpdateManifest::Result* output) {
-  if (!input.ReadExtensionId(&output->extension_id))
-    return false;
-  if (!input.ReadVersion(&output->version))
-    return false;
-  if (!input.ReadBrowserMinVersion(&output->browser_min_version))
-    return false;
-  if (!input.ReadCrxUrl(&output->crx_url))
-    return false;
-  if (!input.ReadPackageHash(&output->package_hash))
-    return false;
-  output->size = input.size();
-  if (!input.ReadPackageFingerprint(&output->package_fingerprint))
-    return false;
-  if (!input.ReadDiffCrxUrl(&output->diff_crx_url))
-    return false;
-  if (!input.ReadDiffPackageHash(&output->diff_package_hash))
-    return false;
-  output->diff_size = input.diff_size();
-  return true;
-}
-
-}  // namespace mojo
diff --git a/extensions/common/manifest_parser_struct_traits.h b/extensions/common/manifest_parser_struct_traits.h
deleted file mode 100644
index abe4c65..0000000
--- a/extensions/common/manifest_parser_struct_traits.h
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef EXTENSIONS_COMMON_MANIFEST_PARSER_STRUCT_TRAITS_H
-#define EXTENSIONS_COMMON_MANIFEST_PARSER_STRUCT_TRAITS_H
-
-#include "extensions/common/manifest_parser.mojom.h"
-#include "extensions/common/update_manifest.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<::extensions::mojom::UpdateManifestResults::DataView,
-                    ::UpdateManifest::Results> {
-  static const std::vector<::UpdateManifest::Result>& list(
-      const ::UpdateManifest::Results& input) {
-    return input.list;
-  }
-
-  static int daystart_elapsed_seconds(const ::UpdateManifest::Results& input) {
-    return input.daystart_elapsed_seconds;
-  }
-
-  static bool Read(::extensions::mojom::UpdateManifestResults::DataView input,
-                   ::UpdateManifest::Results* output);
-};
-
-template <>
-struct StructTraits<::extensions::mojom::UpdateManifestResult::DataView,
-                    ::UpdateManifest::Result> {
-  static const std::string& extension_id(
-      const ::UpdateManifest::Result& input) {
-    return input.extension_id;
-  }
-
-  static const std::string& version(const ::UpdateManifest::Result& input) {
-    return input.version;
-  }
-
-  static const std::string& browser_min_version(
-      const ::UpdateManifest::Result& input) {
-    return input.browser_min_version;
-  }
-
-  static const GURL& crx_url(const ::UpdateManifest::Result& input) {
-    return input.crx_url;
-  }
-
-  static const std::string& package_hash(
-      const ::UpdateManifest::Result& input) {
-    return input.package_hash;
-  }
-
-  static int size(const ::UpdateManifest::Result& input) { return input.size; }
-
-  static const std::string& package_fingerprint(
-      const ::UpdateManifest::Result& input) {
-    return input.package_fingerprint;
-  }
-
-  static const GURL& diff_crx_url(const ::UpdateManifest::Result& input) {
-    return input.diff_crx_url;
-  }
-
-  static const std::string& diff_package_hash(
-      const ::UpdateManifest::Result& input) {
-    return input.diff_package_hash;
-  }
-
-  static int diff_size(const ::UpdateManifest::Result& input) {
-    return input.diff_size;
-  }
-
-  static bool Read(::extensions::mojom::UpdateManifestResult::DataView input,
-                   ::UpdateManifest::Result* output);
-};
-
-}  // namespace mojo
-
-#endif  // EXTENSIONS_COMMON_MANIFEST_PARSER_STRUCT_TRAITS_H
diff --git a/extensions/common/typemaps.gni b/extensions/common/typemaps.gni
index 9f9b8cb..bb19434 100644
--- a/extensions/common/typemaps.gni
+++ b/extensions/common/typemaps.gni
@@ -2,7 +2,4 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-typemaps = [
-  "//extensions/common/extension_unpacker.typemap",
-  "//extensions/common/manifest_parser.typemap",
-]
+typemaps = [ "//extensions/common/extension_unpacker.typemap" ]
diff --git a/extensions/common/update_manifest.cc b/extensions/common/update_manifest.cc
deleted file mode 100644
index 22c36746..0000000
--- a/extensions/common/update_manifest.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "extensions/common/update_manifest.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/version.h"
-#include "libxml/tree.h"
-#include "third_party/libxml/chromium/libxml_utils.h"
-
-static const char* kExpectedGupdateProtocol = "2.0";
-static const char* kExpectedGupdateXmlns =
-    "http://www.google.com/update2/response";
-
-UpdateManifest::Result::Result() : size(0), diff_size(0) {}
-
-UpdateManifest::Result::Result(const Result& other) = default;
-
-UpdateManifest::Result::~Result() = default;
-
-UpdateManifest::Results::Results() : daystart_elapsed_seconds(kNoDaystart) {}
-
-UpdateManifest::Results::Results(const Results& other) = default;
-
-UpdateManifest::Results& UpdateManifest::Results::operator=(
-    const Results& other) = default;
-
-UpdateManifest::Results::~Results() = default;
-
-UpdateManifest::UpdateManifest() = default;
-
-UpdateManifest::~UpdateManifest() = default;
-
-void UpdateManifest::ParseError(const char* details, ...) {
-  va_list args;
-  va_start(args, details);
-
-  if (errors_.length() > 0) {
-    // TODO(asargent) make a platform abstracted newline?
-    errors_ += "\r\n";
-  }
-  base::StringAppendV(&errors_, details, args);
-  va_end(args);
-}
-
-// Checks whether a given node's name matches |expected_name| and
-// |expected_namespace|.
-static bool TagNameEquals(const xmlNode* node, const char* expected_name,
-                          const xmlNs* expected_namespace) {
-  if (node->ns != expected_namespace) {
-    return false;
-  }
-  return 0 == strcmp(expected_name, reinterpret_cast<const char*>(node->name));
-}
-
-// Returns child nodes of |root| with name |name| in namespace |xml_namespace|.
-static std::vector<xmlNode*> GetChildren(xmlNode* root, xmlNs* xml_namespace,
-                                         const char* name) {
-  std::vector<xmlNode*> result;
-  for (xmlNode* child = root->children; child != NULL; child = child->next) {
-    if (!TagNameEquals(child, name, xml_namespace)) {
-      continue;
-    }
-    result.push_back(child);
-  }
-  return result;
-}
-
-// Returns the value of a named attribute, or the empty string.
-static std::string GetAttribute(xmlNode* node, const char* attribute_name) {
-  const xmlChar* name = reinterpret_cast<const xmlChar*>(attribute_name);
-  for (xmlAttr* attr = node->properties; attr != NULL; attr = attr->next) {
-    if (!xmlStrcmp(attr->name, name) && attr->children &&
-        attr->children->content) {
-      return std::string(reinterpret_cast<const char*>(
-          attr->children->content));
-    }
-  }
-  return std::string();
-}
-
-// This is used for the xml parser to report errors. This assumes the context
-// is a pointer to a std::string where the error message should be appended.
-static void XmlErrorFunc(void *context, const char *message, ...) {
-  va_list args;
-  va_start(args, message);
-  std::string* error = static_cast<std::string*>(context);
-  base::StringAppendV(error, message, args);
-  va_end(args);
-}
-
-// Utility class for cleaning up the xml document when leaving a scope.
-class ScopedXmlDocument {
- public:
-  explicit ScopedXmlDocument(xmlDocPtr document) : document_(document) {}
-  ~ScopedXmlDocument() {
-    if (document_)
-      xmlFreeDoc(document_);
-  }
-
-  xmlDocPtr get() {
-    return document_;
-  }
-
- private:
-  xmlDocPtr document_;
-};
-
-// Returns a pointer to the xmlNs on |node| with the |expected_href|, or
-// NULL if there isn't one with that href.
-static xmlNs* GetNamespace(xmlNode* node, const char* expected_href) {
-  const xmlChar* href = reinterpret_cast<const xmlChar*>(expected_href);
-  for (xmlNs* ns = node->ns; ns != NULL; ns = ns->next) {
-    if (ns->href && !xmlStrcmp(ns->href, href)) {
-      return ns;
-    }
-  }
-  return NULL;
-}
-
-
-// Helper function that reads in values for a single <app> tag. It returns a
-// boolean indicating success or failure. On failure, it writes a error message
-// into |error_detail|.
-static bool ParseSingleAppTag(xmlNode* app_node, xmlNs* xml_namespace,
-                              UpdateManifest::Result* result,
-                              std::string *error_detail) {
-  // Read the extension id.
-  result->extension_id = GetAttribute(app_node, "appid");
-  if (result->extension_id.length() == 0) {
-    *error_detail = "Missing appid on app node";
-    return false;
-  }
-
-  // Get the updatecheck node.
-  std::vector<xmlNode*> updates = GetChildren(app_node, xml_namespace,
-                                              "updatecheck");
-  if (updates.size() > 1) {
-    *error_detail = "Too many updatecheck tags on app (expecting only 1).";
-    return false;
-  }
-  if (updates.empty()) {
-    *error_detail = "Missing updatecheck on app.";
-    return false;
-  }
-  xmlNode *updatecheck = updates[0];
-
-  if (GetAttribute(updatecheck, "status") == "noupdate") {
-    return true;
-  }
-
-  // Find the url to the crx file.
-  result->crx_url = GURL(GetAttribute(updatecheck, "codebase"));
-  if (!result->crx_url.is_valid()) {
-    *error_detail = "Invalid codebase url: '";
-    *error_detail += result->crx_url.possibly_invalid_spec();
-    *error_detail += "'.";
-    return false;
-  }
-
-  // Get the version.
-  result->version = GetAttribute(updatecheck, "version");
-  if (result->version.length() == 0) {
-    *error_detail = "Missing version for updatecheck.";
-    return false;
-  }
-  base::Version version(result->version);
-  if (!version.IsValid()) {
-    *error_detail = "Invalid version: '";
-    *error_detail += result->version;
-    *error_detail += "'.";
-    return false;
-  }
-
-  // Get the minimum browser version (not required).
-  result->browser_min_version = GetAttribute(updatecheck, "prodversionmin");
-  if (result->browser_min_version.length()) {
-    base::Version browser_min_version(result->browser_min_version);
-    if (!browser_min_version.IsValid()) {
-      *error_detail = "Invalid prodversionmin: '";
-      *error_detail += result->browser_min_version;
-      *error_detail += "'.";
-      return false;
-    }
-  }
-
-  // package_hash is optional. It is a sha256 hash of the package in hex
-  // format.
-  result->package_hash = GetAttribute(updatecheck, "hash_sha256");
-
-  int size = 0;
-  if (base::StringToInt(GetAttribute(updatecheck, "size"), &size)) {
-    result->size = size;
-  }
-
-  // package_fingerprint is optional. It identifies the package, preferably
-  // with a modified sha256 hash of the package in hex format.
-  result->package_fingerprint = GetAttribute(updatecheck, "fp");
-
-  // Differential update information is optional.
-  result->diff_crx_url = GURL(GetAttribute(updatecheck, "codebasediff"));
-  result->diff_package_hash = GetAttribute(updatecheck, "hashdiff");
-  int sizediff = 0;
-  if (base::StringToInt(GetAttribute(updatecheck, "sizediff"), &sizediff)) {
-    result->diff_size = sizediff;
-  }
-
-  return true;
-}
-
-
-bool UpdateManifest::Parse(const std::string& manifest_xml) {
-  results_.list.resize(0);
-  results_.daystart_elapsed_seconds = kNoDaystart;
-  errors_ = "";
-
-  if (manifest_xml.length() < 1) {
-     ParseError("Empty xml");
-    return false;
-  }
-
-  std::string xml_errors;
-  ScopedXmlErrorFunc error_func(&xml_errors, &XmlErrorFunc);
-
-  // Start up the xml parser with the manifest_xml contents.
-  ScopedXmlDocument document(xmlParseDoc(
-      reinterpret_cast<const xmlChar*>(manifest_xml.c_str())));
-  if (!document.get()) {
-    ParseError("%s", xml_errors.c_str());
-    return false;
-  }
-
-  xmlNode *root = xmlDocGetRootElement(document.get());
-  if (!root) {
-    ParseError("Missing root node");
-    return false;
-  }
-
-  // Look for the required namespace declaration.
-  xmlNs* gupdate_ns = GetNamespace(root, kExpectedGupdateXmlns);
-  if (!gupdate_ns) {
-    ParseError("Missing or incorrect xmlns on gupdate tag");
-    return false;
-  }
-
-  if (!TagNameEquals(root, "gupdate", gupdate_ns)) {
-    ParseError("Missing gupdate tag");
-    return false;
-  }
-
-  // Check for the gupdate "protocol" attribute.
-  if (GetAttribute(root, "protocol") != kExpectedGupdateProtocol) {
-    ParseError("Missing/incorrect protocol on gupdate tag "
-        "(expected '%s')", kExpectedGupdateProtocol);
-    return false;
-  }
-
-  // Parse the first <daystart> if it's present.
-  std::vector<xmlNode*> daystarts = GetChildren(root, gupdate_ns, "daystart");
-  if (!daystarts.empty()) {
-    xmlNode* first = daystarts[0];
-    std::string elapsed_seconds = GetAttribute(first, "elapsed_seconds");
-    int parsed_elapsed = kNoDaystart;
-    if (base::StringToInt(elapsed_seconds, &parsed_elapsed)) {
-      results_.daystart_elapsed_seconds = parsed_elapsed;
-    }
-  }
-
-  // Parse each of the <app> tags.
-  std::vector<xmlNode*> apps = GetChildren(root, gupdate_ns, "app");
-  for (unsigned int i = 0; i < apps.size(); i++) {
-    Result current;
-    std::string error;
-    if (!ParseSingleAppTag(apps[i], gupdate_ns, &current, &error)) {
-      ParseError("%s", error.c_str());
-    } else {
-      results_.list.push_back(current);
-    }
-  }
-
-  return true;
-}
diff --git a/extensions/common/update_manifest.h b/extensions/common/update_manifest.h
deleted file mode 100644
index d98586e2..0000000
--- a/extensions/common/update_manifest.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef EXTENSIONS_COMMON_UPDATE_MANIFEST_H_
-#define EXTENSIONS_COMMON_UPDATE_MANIFEST_H_
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "url/gurl.h"
-
-class UpdateManifest {
- public:
-  // An update manifest looks like this:
-  //
-  // <?xml version="1.0" encoding="UTF-8"?>
-  // <gupdate xmlns="http://www.google.com/update2/response" protocol="2.0">
-  //  <daystart elapsed_seconds="300" />
-  //  <app appid="12345" status="ok">
-  //   <updatecheck codebase="http://example.com/extension_1.2.3.4.crx"
-  //                hash="12345" size="9854" status="ok" version="1.2.3.4"
-  //                prodversionmin="2.0.143.0"
-  //                codebasediff="http://example.com/diff_1.2.3.4.crx"
-  //                hashdiff="123" sizediff="101"
-  //                fp="1.123" />
-  //  </app>
-  // </gupdate>
-  //
-  // The <daystart> tag contains a "elapsed_seconds" attribute which refers to
-  // the server's notion of how many seconds it has been since midnight.
-  //
-  // The "appid" attribute of the <app> tag refers to the unique id of the
-  // extension. The "codebase" attribute of the <updatecheck> tag is the url to
-  // fetch the updated crx file, and the "prodversionmin" attribute refers to
-  // the minimum version of the chrome browser that the update applies to.
-
-  // The diff data members correspond to the differential update package, if
-  // a differential update is specified in the response.
-
-  // The result of parsing one <app> tag in an xml update check manifest.
-  // TODO(crbug.com/692120): consider removing struct Result and Results and
-  // using the corresponding mojo type instead. This would also remove the
-  // need for the Mojo struct traits that are currently defined / used to
-  // cart these Result/Results structs over Mojo IPC.
-  struct Result {
-    Result();
-    Result(const Result& other);
-    ~Result();
-
-    std::string extension_id;
-    std::string version;
-    std::string browser_min_version;
-
-    // Attributes for the full update.
-    GURL crx_url;
-    std::string package_hash;
-    int size;
-    std::string package_fingerprint;
-
-    // Attributes for the differential update.
-    GURL diff_crx_url;
-    std::string diff_package_hash;
-    int diff_size;
-  };
-
-  static const int kNoDaystart = -1;
-  struct Results {
-    Results();
-    Results(const Results& other);
-    Results& operator=(const Results& other);
-    ~Results();
-
-    std::vector<Result> list;
-    // This will be >= 0, or kNoDaystart if the <daystart> tag was not present.
-    int daystart_elapsed_seconds;
-  };
-
-  UpdateManifest();
-  ~UpdateManifest();
-
-  // Parses an update manifest xml string into Result data. Returns a bool
-  // indicating success or failure. On success, the results are available by
-  // calling results(). The details for any failures are available by calling
-  // errors().
-  bool Parse(const std::string& manifest_xml);
-
-  const Results& results() { return results_; }
-  const std::string& errors() { return errors_; }
-
- private:
-  Results results_;
-  std::string errors_;
-
-  // Helper function that adds parse error details to our errors_ string.
-  void ParseError(const char* details, ...);
-
-  DISALLOW_COPY_AND_ASSIGN(UpdateManifest);
-};
-
-#endif  // EXTENSIONS_COMMON_UPDATE_MANIFEST_H_
diff --git a/extensions/common/update_manifest_unittest.cc b/extensions/common/update_manifest_unittest.cc
deleted file mode 100644
index 02beb677..0000000
--- a/extensions/common/update_manifest_unittest.cc
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright (c) 2011 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 "extensions/common/update_manifest.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-static const char kValidXml[] =
-"<?xml version='1.0' encoding='UTF-8'?>"
-"<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-" <app appid='12345'>"
-"  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
-"               version='1.2.3.4' prodversionmin='2.0.143.0' />"
-" </app>"
-"</gupdate>";
-
-static const char valid_xml_with_hash[] =
-    "<?xml version='1.0' encoding='UTF-8'?>"
-    "<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-    " <app appid='12345'>"
-    "  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
-    "               version='1.2.3.4' prodversionmin='2.0.143.0' "
-    "               hash_sha256='1234'/>"
-    " </app>"
-    "</gupdate>";
-
-static const char kMissingAppId[] =
-"<?xml version='1.0'?>"
-"<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-" <app>"
-"  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
-"               version='1.2.3.4' />"
-" </app>"
-"</gupdate>";
-
-static const char kInvalidCodebase[] =
-"<?xml version='1.0'?>"
-"<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-" <app appid='12345' status='ok'>"
-"  <updatecheck codebase='example.com/extension_1.2.3.4.crx'"
-"               version='1.2.3.4' />"
-" </app>"
-"</gupdate>";
-
-static const char kMissingVersion[] =
-"<?xml version='1.0'?>"
-"<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-" <app appid='12345' status='ok'>"
-"  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx' />"
-" </app>"
-"</gupdate>";
-
-static const char kInvalidVersion[] =
-"<?xml version='1.0'?>"
-"<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-" <app appid='12345' status='ok'>"
-"  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx' "
-"               version='1.2.3.a'/>"
-" </app>"
-"</gupdate>";
-
-static const char kUsesNamespacePrefix[] =
-"<?xml version='1.0' encoding='UTF-8'?>"
-"<g:gupdate xmlns:g='http://www.google.com/update2/response' protocol='2.0'>"
-" <g:app appid='12345'>"
-"  <g:updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
-"               version='1.2.3.4' prodversionmin='2.0.143.0' />"
-" </g:app>"
-"</g:gupdate>";
-
-// Includes unrelated <app> tags from other xml namespaces - this should
-// not cause problems.
-static const char kSimilarTagnames[] =
-"<?xml version='1.0' encoding='UTF-8'?>"
-"<gupdate xmlns='http://www.google.com/update2/response'"
-"         xmlns:a='http://a' protocol='2.0'>"
-" <a:app/>"
-" <b:app xmlns:b='http://b' />"
-" <app appid='12345'>"
-"  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
-"               version='1.2.3.4' prodversionmin='2.0.143.0' />"
-" </app>"
-"</gupdate>";
-
-// Includes a <daystart> tag.
-static const char kWithDaystart[] =
-"<?xml version='1.0' encoding='UTF-8'?>"
-"<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-" <daystart elapsed_seconds='456' />"
-" <app appid='12345'>"
-"  <updatecheck codebase='http://example.com/extension_1.2.3.4.crx'"
-"               version='1.2.3.4' prodversionmin='2.0.143.0' />"
-" </app>"
-"</gupdate>";
-
-// Indicates no updates available - this should not be a parse error.
-static const char kNoUpdate[] =
-"<?xml version='1.0' encoding='UTF-8'?>"
-"<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-" <app appid='12345'>"
-"  <updatecheck status='noupdate' />"
-" </app>"
-"</gupdate>";
-
-// Includes two <app> tags, one with an error.
-static const char kTwoAppsOneError[] =
-"<?xml version='1.0' encoding='UTF-8'?>"
-"<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>"
-" <app appid='aaaaaaaa' status='error-unknownApplication'>"
-"  <updatecheck status='error-unknownapplication'/>"
-" </app>"
-" <app appid='bbbbbbbb'>"
-"  <updatecheck codebase='http://example.com/b_3.1.crx' version='3.1'/>"
-" </app>"
-"</gupdate>";
-
-TEST(ExtensionUpdateManifestTest, TestUpdateManifest) {
-  UpdateManifest parser;
-
-  // Test parsing of a number of invalid xml cases
-  EXPECT_FALSE(parser.Parse(std::string()));
-  EXPECT_FALSE(parser.errors().empty());
-
-  EXPECT_TRUE(parser.Parse(kMissingAppId));
-  EXPECT_TRUE(parser.results().list.empty());
-  EXPECT_FALSE(parser.errors().empty());
-
-  EXPECT_TRUE(parser.Parse(kInvalidCodebase));
-  EXPECT_TRUE(parser.results().list.empty());
-  EXPECT_FALSE(parser.errors().empty());
-
-  EXPECT_TRUE(parser.Parse(kMissingVersion));
-  EXPECT_TRUE(parser.results().list.empty());
-  EXPECT_FALSE(parser.errors().empty());
-
-  EXPECT_TRUE(parser.Parse(kInvalidVersion));
-  EXPECT_TRUE(parser.results().list.empty());
-  EXPECT_FALSE(parser.errors().empty());
-
-  // Parse some valid XML, and check that all params came out as expected
-  EXPECT_TRUE(parser.Parse(kValidXml));
-  EXPECT_TRUE(parser.errors().empty());
-  EXPECT_FALSE(parser.results().list.empty());
-  const UpdateManifest::Result* firstResult = &parser.results().list.at(0);
-  EXPECT_EQ(GURL("http://example.com/extension_1.2.3.4.crx"),
-            firstResult->crx_url);
-
-  EXPECT_EQ("1.2.3.4", firstResult->version);
-  EXPECT_EQ("2.0.143.0", firstResult->browser_min_version);
-
-  // Parse some xml that uses namespace prefixes.
-  EXPECT_TRUE(parser.Parse(kUsesNamespacePrefix));
-  EXPECT_TRUE(parser.errors().empty());
-  EXPECT_TRUE(parser.Parse(kSimilarTagnames));
-  EXPECT_TRUE(parser.errors().empty());
-
-  // Parse xml with hash value
-  EXPECT_TRUE(parser.Parse(valid_xml_with_hash));
-  EXPECT_TRUE(parser.errors().empty());
-  EXPECT_FALSE(parser.results().list.empty());
-  firstResult = &parser.results().list.at(0);
-  EXPECT_EQ("1234", firstResult->package_hash);
-
-  // Parse xml with a <daystart> element.
-  EXPECT_TRUE(parser.Parse(kWithDaystart));
-  EXPECT_TRUE(parser.errors().empty());
-  EXPECT_FALSE(parser.results().list.empty());
-  EXPECT_EQ(parser.results().daystart_elapsed_seconds, 456);
-
-  // Parse a no-update response.
-  EXPECT_TRUE(parser.Parse(kNoUpdate));
-  EXPECT_TRUE(parser.errors().empty());
-  EXPECT_FALSE(parser.results().list.empty());
-  firstResult = &parser.results().list.at(0);
-  EXPECT_EQ(firstResult->extension_id, "12345");
-  EXPECT_EQ(firstResult->version, "");
-
-  // Parse xml with one error and one success <app> tag.
-  EXPECT_TRUE(parser.Parse(kTwoAppsOneError));
-  EXPECT_FALSE(parser.errors().empty());
-  EXPECT_EQ(1u, parser.results().list.size());
-  firstResult = &parser.results().list.at(0);
-  EXPECT_EQ(firstResult->extension_id, "bbbbbbbb");
-}
diff --git a/extensions/utility/utility_handler.cc b/extensions/utility/utility_handler.cc
index 33902dd..9ffdbbc9 100644
--- a/extensions/utility/utility_handler.cc
+++ b/extensions/utility/utility_handler.cc
@@ -19,9 +19,6 @@
 #include "extensions/common/extensions_client.h"
 #include "extensions/common/features/feature_channel.h"
 #include "extensions/common/features/feature_session_type.h"
-#include "extensions/common/manifest.h"
-#include "extensions/common/manifest_parser.mojom.h"
-#include "extensions/common/update_manifest.h"
 #include "extensions/strings/grit/extensions_strings.h"
 #include "extensions/utility/unpacker.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -167,30 +164,6 @@
   DISALLOW_COPY_AND_ASSIGN(ExtensionUnpackerImpl);
 };
 
-class ManifestParserImpl : public extensions::mojom::ManifestParser {
- public:
-  ManifestParserImpl() = default;
-  ~ManifestParserImpl() override = default;
-
-  static void Create(extensions::mojom::ManifestParserRequest request) {
-    mojo::MakeStrongBinding(std::make_unique<ManifestParserImpl>(),
-                            std::move(request));
-  }
-
- private:
-  void Parse(const std::string& xml, ParseCallback callback) override {
-    UpdateManifest manifest;
-    if (manifest.Parse(xml)) {
-      std::move(callback).Run(manifest.results());
-    } else {
-      LOG(WARNING) << "Error parsing update manifest:\n" << manifest.errors();
-      std::move(callback).Run(base::nullopt);
-    }
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(ManifestParserImpl);
-};
-
 }  // namespace
 
 namespace utility_handler {
@@ -211,8 +184,6 @@
 
   registry->AddInterface(base::Bind(&ExtensionUnpackerImpl::Create),
                          base::ThreadTaskRunnerHandle::Get());
-  registry->AddInterface(base::Bind(&ManifestParserImpl::Create),
-                         base::ThreadTaskRunnerHandle::Get());
 }
 
 }  // namespace utility_handler
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder.mm b/ios/chrome/browser/metrics/tab_usage_recorder.mm
index 073624a..fb242bf 100644
--- a/ios/chrome/browser/metrics/tab_usage_recorder.mm
+++ b/ios/chrome/browser/metrics/tab_usage_recorder.mm
@@ -451,8 +451,17 @@
 }
 
 void TabUsageRecorder::RenderProcessGone(web::WebState* web_state) {
-  RendererTerminated(web_state, web_state->IsVisible(),
-                     [UIApplication sharedApplication].applicationState);
+  bool is_active;
+  switch ([UIApplication sharedApplication].applicationState) {
+    case UIApplicationStateActive:
+      is_active = true;
+      break;
+    case UIApplicationStateInactive:
+    case UIApplicationStateBackground:
+      is_active = false;
+      break;
+  }
+  RendererTerminated(web_state, web_state->IsVisible(), is_active);
 }
 
 void TabUsageRecorder::WebStateDestroyed(web::WebState* web_state) {
diff --git a/ios/chrome/browser/ui/toolbar/clean/BUILD.gn b/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
index 26eb7f1..7f73e696 100644
--- a/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
@@ -43,6 +43,7 @@
     "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/ui/voice",
     "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/common",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/voice",
     "//ios/third_party/material_components_ios",
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
index f564129..e39d0e25 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator.mm
@@ -43,6 +43,7 @@
 #import "ios/chrome/browser/ui/voice/text_to_speech_player.h"
 #import "ios/chrome/browser/ui/voice/voice_search_notification_names.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
+#import "ios/chrome/common/material_timing.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 #import "ios/web/public/navigation_item.h"
@@ -330,16 +331,12 @@
 
 - (void)locationBarHasBecomeFirstResponder {
   [self.delegate locationBarDidBecomeFirstResponder];
-  if (@available(iOS 10, *)) {
-    [self.toolbarViewController expandOmniboxAnimated:YES];
-  }
+  [self expandOmniboxAnimated:YES];
 }
 
 - (void)locationBarHasResignedFirstResponder {
   [self.delegate locationBarDidResignFirstResponder];
-  if (@available(iOS 10, *)) {
-    [self.toolbarViewController contractOmnibox];
-  }
+  [self contractOmnibox];
 }
 
 - (void)locationBarBeganEdit {
@@ -379,7 +376,7 @@
     model->OnSetFocus(false);
     model->SetCaretVisibility(false);
   } else {
-    [self.toolbarViewController expandOmniboxAnimated:NO];
+    [self expandOmniboxAnimated:NO];
   }
 
   [self focusOmnibox];
@@ -521,4 +518,37 @@
   }
 }
 
+// Animates |_toolbar| and |_locationBarView| for omnibox expansion. If
+// |animated| is NO the animation will happen instantly.
+- (void)expandOmniboxAnimated:(BOOL)animated {
+  // There's no Toolbar expanding on iPad.
+  if (IsIPadIdiom())
+    return;
+  NSTimeInterval duration = animated ? ios::material::kDuration1 : 0;
+
+  UIViewPropertyAnimator* animator = [[UIViewPropertyAnimator alloc]
+      initWithDuration:duration
+                 curve:UIViewAnimationCurveEaseInOut
+            animations:^{
+            }];
+  [self.locationBarView addExpandOmniboxAnimations:animator];
+  [self.toolbarViewController addToolbarExpansionAnimations:animator];
+  [animator startAnimation];
+}
+
+// Animates |_toolbar| and |_locationBarView| for omnibox contraction.
+- (void)contractOmnibox {
+  // There's no Toolbar expanding on iPad, thus no need to contract.
+  if (IsIPadIdiom())
+    return;
+  UIViewPropertyAnimator* animator = [[UIViewPropertyAnimator alloc]
+      initWithDuration:ios::material::kDuration1
+                 curve:UIViewAnimationCurveEaseInOut
+            animations:^{
+            }];
+  [self.locationBarView addContractOmniboxAnimations:animator];
+  [self.toolbarViewController addToolbarContractionAnimations:animator];
+  [animator startAnimation];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h
index c1c6513..fbbda99 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.h
@@ -42,10 +42,12 @@
 // The ToolsMenu button.
 @property(nonatomic, strong, readonly) ToolbarToolsMenuButton* toolsMenuButton;
 
-// Animates the toolbar so the omnibox is shrinking to its standard state.
-- (void)contractOmnibox;
-// Expands the omnibox to its expanded state, |animated| or not.
-- (void)expandOmniboxAnimated:(BOOL)animated;
+// Adds the toolbar expanded state animations to |animator|, and changes the
+// toolbar constraints in preparation for the animation.
+- (void)addToolbarExpansionAnimations:(UIViewPropertyAnimator*)animator;
+// Adds the toolbar contracted state animations to |animator|, and changes the
+// toolbar constraints in preparation for the animation.
+- (void)addToolbarContractionAnimations:(UIViewPropertyAnimator*)animator;
 // Updates the view so a snapshot can be taken. It needs to be adapted,
 // depending on if it is a snapshot displayed |onNTP| or not.
 - (void)updateForSideSwipeSnapshotOnNTP:(BOOL)onNTP;
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
index 1975030..3ab2948 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
@@ -49,6 +49,15 @@
 @property(nonatomic, strong) UIView* backgroundView;
 // Whether a page is loading.
 @property(nonatomic, assign, getter=isLoading) BOOL loading;
+// Constraints used for the regular/contracted Toolbar state.
+@property(nonatomic, strong) NSMutableArray* regularToolbarConstraints;
+// Constraints used to layout the Toolbar to its expanded state. If these are
+// active the locationBarContainer will expand to the size of this VC's view.
+// The locationBarView will only expand up to the VC's view safeAreaLayoutGuide.
+@property(nonatomic, strong) NSArray* expandedToolbarConstraints;
+// Top anchor at the bottom of the safeAreaLayoutGuide. Used so views don't
+// overlap with the Status Bar.
+@property(nonatomic, strong) NSLayoutYAxisAnchor* topSafeAnchor;
 @end
 
 @implementation ToolbarViewController
@@ -71,6 +80,9 @@
 @synthesize bookmarkButton = _bookmarkButton;
 @synthesize voiceSearchEnabled = _voiceSearchEnabled;
 @synthesize progressBar = _progressBar;
+@synthesize expandedToolbarConstraints = _expandedToolbarConstraints;
+@synthesize topSafeAnchor = _topSafeAnchor;
+@synthesize regularToolbarConstraints = _regularToolbarConstraints;
 
 #pragma mark - Properties accessor
 
@@ -105,12 +117,20 @@
   return self;
 }
 
-- (void)contractOmnibox {
-  // TODO(crbug.com/785210): Implement this.
+- (void)addToolbarExpansionAnimations:(UIViewPropertyAnimator*)animator {
+  [NSLayoutConstraint deactivateConstraints:self.regularToolbarConstraints];
+  [NSLayoutConstraint activateConstraints:self.expandedToolbarConstraints];
+  [animator addAnimations:^{
+    [self.view layoutIfNeeded];
+  }];
 }
 
-- (void)expandOmniboxAnimated:(BOOL)animated {
-  // TODO(crbug.com/785210): Implement this.
+- (void)addToolbarContractionAnimations:(UIViewPropertyAnimator*)animator {
+  [NSLayoutConstraint deactivateConstraints:self.expandedToolbarConstraints];
+  [NSLayoutConstraint activateConstraints:self.regularToolbarConstraints];
+  [animator addAnimations:^{
+    [self.view layoutIfNeeded];
+  }];
 }
 
 - (void)updateForSideSwipeSnapshotOnNTP:(BOOL)onNTP {
@@ -153,8 +173,22 @@
 
   [self setUpToolbarStackView];
   if (self.locationBarView) {
+    NSLayoutConstraint* locationBarTopAnchorConstraint =
+        [self.locationBarView.topAnchor
+            constraintEqualToAnchor:self.locationBarContainer.topAnchor];
     [self.locationBarContainer addSubview:self.locationBarView];
-    AddSameConstraints(self.locationBarContainer, self.locationBarView);
+    NSArray* locationBarViewConstraints = @[
+      [self.locationBarView.leadingAnchor
+          constraintEqualToAnchor:self.locationBarContainer.leadingAnchor],
+      [self.locationBarView.trailingAnchor
+          constraintEqualToAnchor:self.locationBarContainer.trailingAnchor],
+      [self.locationBarView.bottomAnchor
+          constraintEqualToAnchor:self.locationBarContainer.bottomAnchor],
+      locationBarTopAnchorConstraint,
+    ];
+    // Adds
+    [self.regularToolbarConstraints addObject:locationBarTopAnchorConstraint];
+    [NSLayoutConstraint activateConstraints:locationBarViewConstraints];
   }
   [self.locationBarContainer addSubview:self.bookmarkButton];
   [self.locationBarContainer addSubview:self.voiceSearchButton];
@@ -183,15 +217,23 @@
 }
 
 - (void)setConstraints {
-  // Top anchor so Toolbar content never overlaps with the Status Bar.
-  NSLayoutYAxisAnchor* topAnchor;
-  if (@available(iOS 11, *)) {
-    topAnchor = self.view.safeAreaLayoutGuide.topAnchor;
-  } else {
-    topAnchor = self.topLayoutGuide.bottomAnchor;
-  }
-
   self.view.translatesAutoresizingMaskIntoConstraints = NO;
+  [self.view.bottomAnchor constraintEqualToAnchor:self.topSafeAnchor
+                                         constant:kToolbarHeight]
+      .active = YES;
+
+  NSArray* progressBarConstraints = @[
+    [self.progressBar.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor],
+    [self.progressBar.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    [self.progressBar.bottomAnchor
+        constraintEqualToAnchor:self.view.bottomAnchor],
+    [self.progressBar.heightAnchor
+        constraintEqualToConstant:kProgressBarHeight],
+  ];
+  [NSLayoutConstraint activateConstraints:progressBarConstraints];
+
   NSArray* constraints = @[
     [self.stackView.heightAnchor
         constraintEqualToConstant:kToolbarHeight - 2 * kVerticalMargin],
@@ -203,14 +245,6 @@
     [self.stackView.trailingAnchor
         constraintEqualToAnchor:self.view.trailingAnchor
                        constant:-kHorizontalMargin],
-    [self.progressBar.leadingAnchor
-        constraintEqualToAnchor:self.view.leadingAnchor],
-    [self.progressBar.trailingAnchor
-        constraintEqualToAnchor:self.view.trailingAnchor],
-    [self.progressBar.bottomAnchor
-        constraintEqualToAnchor:self.view.bottomAnchor],
-    [self.progressBar.heightAnchor
-        constraintEqualToConstant:kProgressBarHeight],
     [self.bookmarkButton.centerYAnchor
         constraintEqualToAnchor:self.locationBarContainer.centerYAnchor],
     [self.voiceSearchButton.centerYAnchor
@@ -219,10 +253,8 @@
         constraintEqualToAnchor:self.locationBarContainer.trailingAnchor],
     [self.bookmarkButton.trailingAnchor
         constraintEqualToAnchor:self.voiceSearchButton.leadingAnchor],
-    [self.view.bottomAnchor constraintEqualToAnchor:topAnchor
-                                           constant:kToolbarHeight],
   ];
-
+  [self.regularToolbarConstraints addObjectsFromArray:constraints];
   [NSLayoutConstraint activateConstraints:constraints];
 }
 
@@ -343,6 +375,7 @@
   self.buttonUpdater.forwardButton = self.forwardButton;
   self.buttonUpdater.voiceSearchButton = self.voiceSearchButton;
 
+  [self.regularToolbarConstraints addObjectsFromArray:buttonConstraints];
   [NSLayoutConstraint activateConstraints:buttonConstraints];
 }
 
@@ -546,6 +579,44 @@
   [self.voiceSearchButton updateHiddenInCurrentSizeClass];
 }
 
+#pragma mark - Setters & Getters.
+
+- (NSLayoutYAxisAnchor*)topSafeAnchor {
+  if (!_topSafeAnchor) {
+    if (@available(iOS 11, *)) {
+      _topSafeAnchor = self.view.safeAreaLayoutGuide.topAnchor;
+    } else {
+      _topSafeAnchor = self.topLayoutGuide.bottomAnchor;
+    }
+  }
+  return _topSafeAnchor;
+}
+
+- (NSMutableArray*)regularToolbarConstraints {
+  if (!_regularToolbarConstraints) {
+    _regularToolbarConstraints = [[NSMutableArray alloc] init];
+  }
+  return _regularToolbarConstraints;
+}
+
+- (NSArray*)expandedToolbarConstraints {
+  if (!_expandedToolbarConstraints) {
+    _expandedToolbarConstraints = @[
+      [self.locationBarContainer.topAnchor
+          constraintEqualToAnchor:self.view.topAnchor],
+      [self.locationBarContainer.bottomAnchor
+          constraintEqualToAnchor:self.view.bottomAnchor],
+      [self.locationBarContainer.leadingAnchor
+          constraintEqualToAnchor:self.view.leadingAnchor],
+      [self.locationBarContainer.trailingAnchor
+          constraintEqualToAnchor:self.view.trailingAnchor],
+      [self.locationBarView.topAnchor constraintEqualToAnchor:self.topSafeAnchor
+                                                     constant:kVerticalMargin],
+    ];
+  }
+  return _expandedToolbarConstraints;
+}
+
 #pragma mark - Private
 
 // Sets the progress of the progressBar to 1 then hides it.
diff --git a/ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h b/ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h
index ca269a2b..e3605b2 100644
--- a/ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h
+++ b/ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h
@@ -42,6 +42,7 @@
     UIPanGestureRecognizer* panGestureRecognizer;
 // Returns the scrollview's gesture recognizers.
 @property(weak, nonatomic, readonly) NSArray* gestureRecognizers;
+@property(nonatomic, readonly, copy) NSArray<__kindof UIView*>* subviews;
 
 - (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer;
 - (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer;
diff --git a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy.mm b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy.mm
index ec2f09e..6941cfb 100644
--- a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy.mm
+++ b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy.mm
@@ -203,6 +203,10 @@
   return [_scrollView gestureRecognizers];
 }
 
+- (NSArray<__kindof UIView*>*)subviews {
+  return _scrollView ? [_scrollView subviews] : @[];
+}
+
 #pragma mark -
 #pragma mark UIScrollViewDelegate callbacks
 
diff --git a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm
index 223f9d9..127571d 100644
--- a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm
@@ -126,6 +126,10 @@
   [[[mockScrollView_ expect] andReturnValue:@NO] scrollsToTop];
   EXPECT_FALSE([webViewScrollViewProxy_ scrollsToTop]);
 
+  NSArray<__kindof UIView*>* subviews = [NSArray array];
+  [[[mockScrollView_ expect] andReturn:subviews] subviews];
+  EXPECT_EQ(subviews, [webViewScrollViewProxy_ subviews]);
+
   if (@available(iOS 11, *)) {
     [[[mockScrollView_ expect]
         andReturnValue:@(UIScrollViewContentInsetAdjustmentAutomatic)]
@@ -159,6 +163,7 @@
   EXPECT_FALSE([webViewScrollViewProxy_ isDragging]);
   EXPECT_FALSE([webViewScrollViewProxy_ isTracking]);
   EXPECT_FALSE([webViewScrollViewProxy_ scrollsToTop]);
+  EXPECT_EQ((NSUInteger)0, [webViewScrollViewProxy_ subviews].count);
   if (@available(iOS 11, *)) {
     EXPECT_EQ(UIScrollViewContentInsetAdjustmentAutomatic,
               [webViewScrollViewProxy_ contentInsetAdjustmentBehavior]);
diff --git a/ios/web_view/internal/cwv_scroll_view.mm b/ios/web_view/internal/cwv_scroll_view.mm
index 7219b8b..693df0ca 100644
--- a/ios/web_view/internal/cwv_scroll_view.mm
+++ b/ios/web_view/internal/cwv_scroll_view.mm
@@ -89,6 +89,10 @@
   return _proxy.panGestureRecognizer;
 }
 
+- (NSArray<__kindof UIView*>*)subviews {
+  return _proxy.subviews;
+}
+
 - (UIEdgeInsets)contentInset {
   return _proxy.contentInset;
 }
diff --git a/ios/web_view/public/cwv_scroll_view.h b/ios/web_view/public/cwv_scroll_view.h
index 6e9a9f7..4e273b1 100644
--- a/ios/web_view/public/cwv_scroll_view.h
+++ b/ios/web_view/public/cwv_scroll_view.h
@@ -36,6 +36,7 @@
     UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior
         API_AVAILABLE(ios(11.0));
 @property(nonatomic, readonly) UIPanGestureRecognizer* panGestureRecognizer;
+@property(nonatomic, readonly, copy) NSArray<__kindof UIView*>* subviews;
 
 // KVO compliant.
 @property(nonatomic, readonly) CGSize contentSize;
diff --git a/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java b/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
index 8a8c6921..dfa8ab2 100644
--- a/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
+++ b/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
@@ -117,8 +117,10 @@
                     case CodecProfileLevel.VP9Profile1:
                         return VideoCodecProfile.VP9PROFILE_PROFILE1;
                     case CodecProfileLevel.VP9Profile2:
+                    case CodecProfileLevel.VP9Profile2HDR:
                         return VideoCodecProfile.VP9PROFILE_PROFILE2;
                     case CodecProfileLevel.VP9Profile3:
+                    case CodecProfileLevel.VP9Profile3HDR:
                         return VideoCodecProfile.VP9PROFILE_PROFILE3;
                     default:
                         throw new UnsupportedCodecProfileException();
@@ -128,9 +130,8 @@
                     case CodecProfileLevel.HEVCProfileMain:
                         return VideoCodecProfile.HEVCPROFILE_MAIN;
                     case CodecProfileLevel.HEVCProfileMain10:
-                        return VideoCodecProfile.HEVCPROFILE_MAIN10;
                     case CodecProfileLevel.HEVCProfileMain10HDR10:
-                        return VideoCodecProfile.HEVCPROFILE_MAIN_STILL_PICTURE;
+                        return VideoCodecProfile.HEVCPROFILE_MAIN10;
                     default:
                         throw new UnsupportedCodecProfileException();
                 }
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
index 7777468..e0ea4ad 100644
--- a/media/ffmpeg/ffmpeg_common.cc
+++ b/media/ffmpeg/ffmpeg_common.cc
@@ -502,6 +502,11 @@
       format = PIXEL_FORMAT_I420;
       profile = AV1PROFILE_PROFILE0;
       break;
+#if BUILDFLAG(ENABLE_HEVC_DEMUXING)
+    case kCodecHEVC:
+      profile = HEVCPROFILE_MAIN;
+      break;
+#endif
     case kCodecTheora:
       profile = THEORAPROFILE_ANY;
       break;
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc
index 5eb772e..8b1d8cf 100644
--- a/media/filters/gpu_video_decoder.cc
+++ b/media/filters/gpu_video_decoder.cc
@@ -207,7 +207,8 @@
   needs_all_picture_buffers_to_decode_ =
       capabilities.flags &
       VideoDecodeAccelerator::Capabilities::NEEDS_ALL_PICTURE_BUFFERS_TO_DECODE;
-  needs_bitstream_conversion_ = (config.codec() == kCodecH264);
+  needs_bitstream_conversion_ =
+      (config.codec() == kCodecH264) || (config.codec() == kCodecHEVC);
   requires_texture_copy_ =
       !!(capabilities.flags &
          VideoDecodeAccelerator::Capabilities::REQUIRES_TEXTURE_COPY);
diff --git a/net/cert/root_cert_list_generated.h b/net/cert/root_cert_list_generated.h
index d97a6b2..26c4b55 100644
--- a/net/cert/root_cert_list_generated.h
+++ b/net/cert/root_cert_list_generated.h
@@ -454,6 +454,12 @@
      },
      163},
     {{
+         0x28, 0x2F, 0xB5, 0xCF, 0xBA, 0xF0, 0x15, 0x18, 0xD9, 0x70, 0x4D,
+         0xE7, 0x88, 0x4D, 0x7A, 0x25, 0xFF, 0x01, 0xCF, 0x88, 0x2E, 0x99,
+         0x42, 0x90, 0xD5, 0x99, 0x5D, 0x5E, 0xB6, 0xC4, 0x49, 0x88,
+     },
+     489},
+    {{
          0x28, 0x33, 0x10, 0x81, 0x9F, 0x5E, 0x09, 0x20, 0x49, 0x95, 0xD8,
          0xAD, 0x9F, 0xF6, 0xFC, 0x10, 0x74, 0x62, 0x97, 0xB5, 0xC0, 0xAE,
          0x06, 0xBD, 0xD1, 0xE1, 0x12, 0x4B, 0x10, 0xA0, 0xD7, 0xAD,
@@ -2716,6 +2722,12 @@
      },
      9},
     {{
+         0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC, 0x1C, 0x14, 0x9A, 0xFB, 0xF4,
+         0xC8, 0x99, 0x6F, 0xB9, 0x24, 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B,
+         0x93, 0x4C, 0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55,
+     },
+     488},
+    {{
          0xE4, 0x2F, 0x24, 0xBD, 0x4D, 0x37, 0xF4, 0xAA, 0x2E, 0x56, 0xB9,
          0x79, 0xD8, 0x3D, 0x1E, 0x65, 0x21, 0x9F, 0xE0, 0xE9, 0xE3, 0xA3,
          0x82, 0xA1, 0xB3, 0xCB, 0x66, 0xC9, 0x39, 0x55, 0xDE, 0x75,
@@ -2926,6 +2938,12 @@
      },
      28},
     {{
+         0xFD, 0x37, 0x1B, 0xEA, 0x97, 0x55, 0xFF, 0x60, 0xC8, 0x82, 0x8C,
+         0x84, 0x9B, 0x8E, 0x52, 0x15, 0xDE, 0x53, 0x2D, 0x61, 0xB0, 0x09,
+         0x85, 0x5F, 0xA0, 0xAD, 0x63, 0x0D, 0x90, 0xEE, 0xF8, 0x2E,
+     },
+     490},
+    {{
          0xFD, 0x87, 0x2D, 0x17, 0x66, 0x17, 0xE5, 0x0C, 0x26, 0x61, 0x19,
          0xD0, 0xFD, 0xB0, 0x47, 0xB0, 0x73, 0x2D, 0xA2, 0x04, 0x8B, 0x12,
          0x1A, 0xF7, 0xB9, 0x86, 0x0C, 0xA3, 0xE2, 0xF2, 0xF2, 0xBE,
diff --git a/net/cert/x509_certificate.cc b/net/cert/x509_certificate.cc
index ef7da40c..370d4abb 100644
--- a/net/cert/x509_certificate.cc
+++ b/net/cert/x509_certificate.cc
@@ -233,12 +233,20 @@
 scoped_refptr<X509Certificate> X509Certificate::CreateFromBytes(
     const char* data,
     size_t length) {
+  return CreateFromBytesUnsafeOptions(data, length, {});
+}
+
+// static
+scoped_refptr<X509Certificate> X509Certificate::CreateFromBytesUnsafeOptions(
+    const char* data,
+    size_t length,
+    UnsafeCreateOptions options) {
   OSCertHandle cert_handle = CreateOSCertHandleFromBytes(data, length);
   if (!cert_handle)
     return NULL;
 
   scoped_refptr<X509Certificate> cert =
-      CreateFromHandle(cert_handle, OSCertHandles());
+      CreateFromHandleUnsafeOptions(cert_handle, {}, options);
   FreeOSCertHandle(cert_handle);
   return cert;
 }
diff --git a/net/cert/x509_certificate.h b/net/cert/x509_certificate.h
index 38c9c66..70cc20c 100644
--- a/net/cert/x509_certificate.h
+++ b/net/cert/x509_certificate.h
@@ -112,6 +112,13 @@
   static scoped_refptr<X509Certificate> CreateFromBytes(const char* data,
                                                         size_t length);
 
+  // Create an X509Certificate with non-standard parsing options.
+  // Do not use without consulting //net owners.
+  static scoped_refptr<X509Certificate> CreateFromBytesUnsafeOptions(
+      const char* data,
+      size_t length,
+      UnsafeCreateOptions options);
+
   // Create an X509Certificate from the representation stored in the given
   // pickle.  The data for this object is found relative to the given
   // pickle_iter, which should be passed to the pickle's various Read* methods.
diff --git a/net/data/ssl/root_stores/root_stores.json b/net/data/ssl/root_stores/root_stores.json
index d2e53ea..c2d141e 100644
--- a/net/data/ssl/root_stores/root_stores.json
+++ b/net/data/ssl/root_stores/root_stores.json
@@ -29,7 +29,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "007e452fd5cf838946696dfe37a2db2ef3991436d27bcbab45922053c15a87a8": [
       "windows/080328202117", 
@@ -77,7 +78,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "00ab444abd6bdba33da8de569ac4ecde326d1be1a61442d5eec3975a0c243f04": [
       "windows/070201011524", 
@@ -130,7 +132,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5": [
       "android/kitkat-cts-release", 
@@ -185,7 +188,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "03458b6abeecc214953d97149af45391691de9f9cdcc2647863a3d67c95c243b": [
       "android/kitkat-cts-release", 
@@ -295,7 +299,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0378b202ccabba99a12e569a11a077db1edb39482061c75d0073059d9ab5b513": [
       "windows/071219233937", 
@@ -379,7 +384,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "04048028bf1f2864d48f9ad4d83294366a828856553f3b14303f90147f5d40ef": [
       "android/kitkat-cts-release", 
@@ -452,7 +458,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "04acfb3b24793f300f67ef87e44dd72cb9b28b204f389a7cd5ae28785c7d42cd": [
       "macos/10.10.0", 
@@ -511,13 +518,15 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "04f1bec36951bc1454a904ce32890c5da3cde1356b7900f6e62dfa2041ebad51": [
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0536801fbb443b3e905fd6d70d8c81eb88551be8061299110d2b4f82e64cade1": [
       "windows/100719231554", 
@@ -555,7 +564,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "058a40323ec8c46262c3052a5d357b91ac24d3da26351b3ff4407e99f7a4e9b4": [
       "windows/070201011524", 
@@ -608,7 +618,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "05d38c2a70bfc500ccb0cb509159b46b065c6ac9cb42d2e6f16167841434572a": [
       "windows/120223022238", 
@@ -636,7 +647,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "063e4afac491dfd332f3089b8542e94617d893d7fe944e10a7937ee29d9693c0": [
       "android/kitkat-cts-release", 
@@ -711,7 +723,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0687260331a72403d909f105e69bcf0d32e1bd2493ffc6d9206d11bcd6770739": [
       "android/kitkat-cts-release", 
@@ -798,7 +811,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "06a2c9a3379ab3c156159a27ca9ecdbd4ef75309b409cf70aeca9a12330f380e": [
       "macos/10.9.0", 
@@ -869,7 +883,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "07453d53793bf41819a5251c69f88e2bb344b59ca828b5a543781599eaf3d602": [
       "windows/070109202240", 
@@ -915,7 +930,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "075bfcca2d55ae6e35742c32afd0ca8ea4c958feefc23224999541c033d69c8d": [
       "windows/120125230451", 
@@ -944,7 +960,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0771920c8cb874d5c5a4dc0d6a51a2d495d38c4de2cd5b83d2a06faa051935f6": [
       "windows/121102212406", 
@@ -970,7 +987,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0791ca0749b20782aad3c7d7bd0cdfc9485835843eb2d7996009ce43ab6c6927": [
       "android/kitkat-cts-release", 
@@ -1066,7 +1084,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b": [
       "android/kitkat-cts-release", 
@@ -1138,7 +1157,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0b5eed4e846403cf55e065848440ed2a82758bf5b9aa1f253d4613cfa080ff3f": [
       "android/kitkat-cts-release", 
@@ -1238,7 +1258,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0c0b6b2bd1edd7b27fead157f8e846b335b784a39f06c47216c8746f64c5ceda": [
       "windows/140912180251", 
@@ -1256,7 +1277,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0c258a12a5674aef25f28ba7dcfaeceea348e541e6f5cc4ee63b71b361606ac3": [
       "android/kitkat-cts-release", 
@@ -1343,7 +1365,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0c2cd63df7806fa399ede809116b575bf87989f06518f9808c860503178baf66": [
       "android/kitkat-cts-release", 
@@ -1455,7 +1478,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0ed3ffab6c149c8b4e71058e8668d429abfda681c2fff508207641f0d751a3e5": [
       "macos/10.10.0", 
@@ -1541,7 +1565,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "0f993c8aef97baaf5687140ed59ad1821bb4afacf0aa9a58b5d57a338a3afbcb": [
       "android/kitkat-cts-release", 
@@ -1628,7 +1653,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "126bf01c1094d2f0ca2e352380b3c724294546ccc65597bef7f12d8a171f1984": [
       "macos/10.10.0", 
@@ -1664,7 +1690,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "12d480c1a3c664781b99d9df0e9faf3f1cacee1b3c30c3123a337a4a454ffed2": [
       "windows/071219233937", 
@@ -1713,7 +1740,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "136335439334a7698016a0d324de72284e079d7b5220bb8fbd747816eebebaca": [
       "android/kitkat-cts-release", 
@@ -1788,7 +1816,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1465fa205397b876faa6f0a9958e5590e40fcc7faa4fb7c2c8677521fb5fb658": [
       "android/kitkat-cts-release", 
@@ -1875,7 +1904,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1501f89c5c4dcf36cf588a17c9fd7cfceb9ee01e8729be355e25de80eb6284b4": [
       "windows/160414222039", 
@@ -1884,7 +1914,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "152a402bfcdf2cd548054d2275b39c7fca3ec0978078b0f0ea76e561a6c7433e": [
       "android/nougat-mr1-cts-release", 
@@ -1908,7 +1939,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1594cb5b826c315de3bc932c56895ff23a3a988b5dc1f034d214dfd858d89ee8": [
       "windows/070109202240", 
@@ -1949,7 +1981,8 @@
       "windows/150122021939"
     ], 
     "15d5b8774619ea7d54ce1ca6d0b0c403e037a917f131e8a04e1e6b7a71babce5": [
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "15f0ba00a3ac7af3ac884c072b1011a077bd77c097f40164b2f8598abd83860c": [
       "android/kitkat-cts-release", 
@@ -2094,7 +2127,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1793927a0614549789adce2f8f34f7f0b66d0f3ae3a3b84d21ec15dbba4fadc7": [
       "android/kitkat-cts-release", 
@@ -2160,7 +2194,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "179fbc148a3dd00fd24ea13458cc43bfa7f59c8182d783a513f6ebec100c8924": [
       "android/lollipop-mr1-cts-release", 
@@ -2211,7 +2246,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "18ce6cfe7bf14e60b2e347b8dfe868cb31d02ebb3ada271569f50343b46db3a4": [
       "android/oreo-cts-release", 
@@ -2228,7 +2264,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "18f1fc7f205df8adddeb7fe007dd57e3af375a9c4d8d73546bf4f1fed1e18d35": [
       "android/kitkat-cts-release", 
@@ -2315,11 +2352,13 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "19abcdff3a74402fa8f0ca206bf7fab0dffff3ae2bbd719584d21090a4353207": [
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1a0d20445de5ba1862d19ef880858cbce50102b36e8f0a040c3c69e74522fe6e": [
       "windows/110919210309", 
@@ -2350,7 +2389,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1a2512cda6744abea11432a2fdc9f8c088db5a98c89e13352574cde4d9e80cdd": [
       "windows/140912180251", 
@@ -2368,7 +2408,8 @@
       "windows/161112005943", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1aa980c8c0d316f25029978982f033cbb3a3f4188d669f2de6a8d84ee00a1575": [
       "windows/080328202117", 
@@ -2416,7 +2457,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1ba5b2aa8c65401a82960118f80bec4f62304d83cec4713a19c39c011ea46db4": [
       "android/oreo-cts-release", 
@@ -2433,7 +2475,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1ba622b36325544ae922afc22ef9d367943794f6e16874f368a733c65c9d5279": [
       "windows/111018233154", 
@@ -2463,7 +2506,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1c01c6f4dbb2fefc22558b2bca32563f49844acfc32b7be4b0ff599f9e8c7af7": [
       "android/kitkat-cts-release", 
@@ -2521,7 +2565,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1d4f0596fca2611d09f84c78f2ea565ef2eab9cfc272a1718bd336e6e0ae021a": [
       "windows/070109202240", 
@@ -2588,7 +2633,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1e49ac5dc69e86d0565da2c1305c419330b0b781bfec50e54a1b35af7fddd501": [
       "macos/10.11.0", 
@@ -2633,7 +2679,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1e51942b84fd467bf77d1c89da241c04254dc8f3ef4c22451fe7a89978bdcd4f": [
       "windows/160916174005", 
@@ -2641,7 +2688,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "1e910b40c08184c0ca20468e824502ff2485163f77b03bb73296823f03885621": [
       "windows/111018233154", 
@@ -2671,19 +2719,22 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "209e956af04df3996507c887d356230d6eb49fdbdd2d8a058ff50b8f80f690aa": [
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2193cfea381211a1aeaa2de984e630643a87160b1208118145eafb8e1bc69958": [
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "21db20123660bb2ed418205da11ee7a85a65e2bc6e55b5af7e7899c8a266d92e": [
       "android/kitkat-cts-release", 
@@ -2768,7 +2819,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "229ccc196d32c98421cc119e78486eebef603aecd525c6b88b47abb740692b96": [
       "windows/150618202535", 
@@ -2784,7 +2836,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8": [
       "mozilla/2.18", 
@@ -2793,7 +2846,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "22e0d11dc9207e16c92b2ee18cfdb2c2e940626847921fc528cedd2f7932f714": [
       "windows/070109202240", 
@@ -2892,7 +2946,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2399561127a57125de8cefea610ddf2fa078b5c8067f4e828290bfb860e84b3c": [
       "android/kitkat-cts-release", 
@@ -2966,7 +3021,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "248302a977f40f7dd6a2b770586adfaac3eb1e85fd1a102dbd7863c72b8f8ef2": [
       "macos/10.10.0", 
@@ -2979,7 +3035,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f": [
       "android/kitkat-cts-release", 
@@ -3096,7 +3153,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "27995829fe6a7515c1bfe848f9c4761db16c225929257bf40d0894f29ea8baf2": [
       "android/nougat-mr1-cts-release", 
@@ -3120,7 +3178,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2834991cf677466d22baac3b0055e5b911d9a9e55f5b85ba02dc566782c30e8a": [
       "macos/10.10.0", 
@@ -3205,7 +3264,8 @@
       "windows/150122021939"
     ], 
     "2a575471e31340bc21581cbd2cf13e158463203ece94bcf9d3cc196bf09a5472": [
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2a8da2f8d23e0cd3b5871ecfb0f42276ca73230667f474eede71c5ee32cc3ec6": [
       "windows/160414222039", 
@@ -3214,7 +3274,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2a99f5bc1174b73cbb1d620884e01c34e51ccb3978da125f0e33268883bf4158": [
       "android/marshmallow-cts-release", 
@@ -3259,10 +3320,12 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2cabeafe37d06ca22aba7391c0033d25982952c453647349763a3ab5ad6ccf69": [
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5": [
       "android/kitkat-cts-release", 
@@ -3334,7 +3397,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2d47437de17951215a12f3c58e51c729a58026ef1fcc0a5fb3d9dc012f600d19": [
       "android/kitkat-cts-release", 
@@ -3411,7 +3475,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2d66a702ae81ba03af8cff55ab318afa919039d9f31b4d64388680f81311b65a": [
       "windows/110919210309", 
@@ -3442,7 +3507,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2dc62c3f6c0cc9020bba77e1c511511024b943ee598856da5a22e222b7277a20": [
       "macos/10.9.0", 
@@ -3510,7 +3576,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2dfcbacadf22a6ff107a51fd3e8b9e17858028879b13f7c3b57b3e1bd2315809": [
       "windows/070109202240", 
@@ -3552,7 +3619,8 @@
     ], 
     "2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c": [
       "mozilla/2.18", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "2f1062f8bf84e7eb83a0f64c98d891fbe2c811b17ffac0bce1a6dc9c7c3dcbb7": [
       "macos/10.9.0", 
@@ -3680,7 +3748,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0": [
       "android/lollipop-cts-release", 
@@ -3731,7 +3800,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "31eace9b4c9c71734a185680bc24866ca6cbd82b3cb61bcc8706261b59ce1073": [
       "windows/070109202240", 
@@ -3891,7 +3961,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "3417bb06cc6007da1b961c920b8ab4ce3fad820e4aa30b9acbc4a74ebdcebc65": [
       "mozilla/2.18", 
@@ -3900,7 +3971,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "341de98b1392abf7f4ab90a960cf25d4bd6ec65b9a51ce6ed067d00ec7ce9b7f": [
       "macos/10.10.0", 
@@ -3929,7 +4001,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "35ae5bddd8f7ae635cffba5682a8f00b95f48462c7108ee9a0e5292b074aafb2": [
       "android/kitkat-cts-release", 
@@ -4006,7 +4079,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "363f3c849eab03b0a2a0f636d7b86d04d3ac7fcfe26a0a9121ab9795f6e176df": [
       "macos/10.10.0", 
@@ -4075,7 +4149,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "37d51006c512eaab626421f1ec8c92013fc5f82ae98ee533eb4619b8deb4d06c": [
       "android/kitkat-cts-release", 
@@ -4162,7 +4237,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "37d8dc8af7867845da3344a6b1bade448d8a80e47b5579f96bf631768f9f30f6": [
       "windows/070201011524", 
@@ -4411,7 +4487,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "3c4fb0b95ab8b30032f432b86f535fe172c185d0fd39865837cf36187fa6f428": [
       "android/marshmallow-cts-release", 
@@ -4452,7 +4529,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "3c5f81fea5fab82c64bfa2eaecafcde8e077fc8620a7cae537163df36edbf378": [
       "android/kitkat-cts-release", 
@@ -4520,7 +4598,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "3ccc3ccfe45496d07b620dbf1328e8a1490018f48633c8a28a995ca60408b0be": [
       "windows/070109202240", 
@@ -4574,7 +4653,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "3cfc3c14d1f684ff17e38c43ca440c00b967ec933e8bfe064ca1d72c90f2adb0": [
       "mozilla/2.10", 
@@ -4660,7 +4740,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "3e9099b5015e8f486c00bcea9d111ee721faba355a89bcf1df69561e3dc6325c": [
       "android/kitkat-cts-release", 
@@ -4747,7 +4828,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "3f06e55681d496f5be169eb5389f9f2b8ff61e1708df6881724849cd5d27cb69": [
       "android/kitkat-cts-release", 
@@ -4897,7 +4979,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "417dcf3180f4ed1a3747acf1179316cd48cb05c5788435168aed98c98cdcb615": [
       "windows/121102212406", 
@@ -4923,7 +5006,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "41c923866ab4cad6b7ad578081582e020797a6cbdf4fff78ce8396b38937d7f5": [
       "android/kitkat-cts-release", 
@@ -5009,7 +5093,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "41d4f6dcf130b9843a3b9a9530953e925fdd84e8b7aeb8f205b8fae39352617d": [
       "macos/10.10.0", 
@@ -5105,7 +5190,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "4210f199499a9ac33c8de02ba6dbaa14408bdd8a6e324689c1922d069715a332": [
       "windows/100503224537", 
@@ -5144,7 +5230,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "42143a511a3afcdd80d555debb4191ec6bb285ee66e62ec657ed20adf7d55faa": [
       "windows/090825180842", 
@@ -5186,7 +5273,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "4348a0e9444c78cb265e058d5e8944b4d84f9662bd26db257f8934a443c70161": [
       "android/kitkat-cts-release", 
@@ -5273,7 +5361,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339": [
       "android/kitkat-cts-release", 
@@ -5347,7 +5436,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "43f257412d440d627476974f877da8f1fc2444565a367ae60eddc27a412531ae": [
       "macos/10.10.0", 
@@ -5498,7 +5588,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "45140b3247eb9cc8c5b4f0d7b53091f73292089e6e5a63e2749dd3aca9198eda": [
       "android/kitkat-cts-release", 
@@ -5570,7 +5661,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "46273285615d96e52da9fc2ed8c036f10af3d9f6280f8d288706c52b2011b4da": [
       "windows/090501224247", 
@@ -5613,7 +5705,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "46edc3689046d53a453fb3104ab80dcaec658b2660ea1629dd7e867990648716": [
       "mozilla/2.14", 
@@ -5624,7 +5717,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "488e134f30c5db56b76473e608086842bf21af8ab3cd7ac67ebdf125d531834e": [
       "windows/090825180842", 
@@ -5666,7 +5760,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "488fca189eaadf54a3f920ed39e587183ba512232999fae3e4a285fe98e298d1": [
       "windows/150122021939", 
@@ -5757,7 +5852,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "49c8175a9815e08bef129a929de1bacad04e4db67a8c839293953e5031c81ca0": [
       "windows/070109202240", 
@@ -5855,7 +5951,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "49f74f824f2e059fe99c98af3219ec0d9a004d1b64dd2fd1452616318ab806c0": [
       "windows/070109202240", 
@@ -5967,7 +6064,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "4b22d5a6aec99f3cdb79aa5ec06838479cd5ecba7164f7f22dc1d65f63d85708": [
       "android/lollipop-cts-release", 
@@ -6001,7 +6099,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "4bdb7418bdf7ffe33ba0884afa7c0c61fd85a153972f65f7d01cb3ec7eb4073c": [
       "windows/070109202240", 
@@ -6070,7 +6169,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a": [
       "android/marshmallow-cts-release", 
@@ -6116,7 +6216,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "4d9ebb28825c9643ab15d54e5f9614f13cb3e95de3cf4eac971301f320f9226e": [
       "windows/090825180842", 
@@ -6158,7 +6259,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "4dbb0157a691fa7382289d65c0332ddb1dcb640b40ad10f010a43e20f3afed1e": [
       "windows/070109202240", 
@@ -6288,7 +6390,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "507941c74460a0b47086220d4e9932572ab5d1b5bbcb8980ab1cb17651a844d2": [
       "android/kitkat-cts-release", 
@@ -6365,7 +6468,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "513b2cecb810d4cde5dd85391adfc6c2dd60d87bb736d2b521484aa47a0ebef6": [
       "android/kitkat-cts-release", 
@@ -6438,7 +6542,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "51847c8cbd2e9a72c91e292d2ae247d7de1e3fd270547a20ef7d610f38b8842c": [
       "macos/10.10.0", 
@@ -6587,7 +6692,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "53dfdfa4e297fcfe07594e8c62d5b8ab06b32c7549f38a163094fd6429d5da43": [
       "macos/10.10.0", 
@@ -6624,7 +6730,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "54455f7129c20b1447c418f997168f24c58fc5023bf5da5be2eb6e1dd8902ed5": [
       "android/oreo-cts-release", 
@@ -6637,7 +6744,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "54ae8a683fe2d78ff1ef0e0b3f58425092953ba08c67fe4a95595d1cebcdcb30": [
       "windows/140912180251", 
@@ -6655,7 +6763,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "54b4fc43d44aa4ca9fc03ca7e9949fbae267a064d02da21852412a381b5d1537": [
       "windows/140912180251", 
@@ -6675,7 +6784,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "552f7bdcf1a7af9e6ce672017f4f12abf77240c78e761ac203d1d9d20ac89988": [
       "android/lollipop-cts-release", 
@@ -6726,7 +6836,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5533a0401f612c688ebce5bf53f2ec14a734eb178bfae00e50e85dae6723078a": [
       "windows/131003230417", 
@@ -6748,7 +6859,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "55926084ec963a64b96e2abe01ce0ba86a64fbfebcc7aab5afc155b37fd76066": [
       "android/kitkat-cts-release", 
@@ -6809,7 +6921,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5607e260163f49c8ea4175a1c0a53b13195cb7d07845611e943a2ff507036834": [
       "windows/070522004642", 
@@ -6861,7 +6974,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "568d6905a2c88708a4b3025190edcfedb1974a606a13c6e5290fcb2ae63edab5": [
       "android/kitkat-cts-release", 
@@ -6933,7 +7047,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "56c77128d98c18d91b4cfdffbc25ee9103d4758ea2abad826a90f3457d460eb4": [
       "android/nougat-mr1-cts-release", 
@@ -6957,7 +7072,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "56ce347cc6df4c35943dfdeaee023f9739a3f1cedeee0cd88dc2386bc8a91eaf": [
       "windows/070109202240", 
@@ -7108,7 +7224,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "59b3829f1ff443344958fae8bff621b684c848cfbf7ead6b63a6ca50f2794f89": [
       "macos/10.11.0", 
@@ -7153,7 +7270,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5a1b5d6bc65523b40a6deffa45b48e4288ae8dd86dd70a5b858d4a5affc94f71": [
       "windows/071219233937", 
@@ -7202,7 +7320,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5a885db19c01d912c5759388938cafbbdf031ab2d48e91ee15589b42971d039c": [
       "mozilla/2.18", 
@@ -7212,7 +7331,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5adfa25013bed3710831572de51c4b9a21171c00313249c4cb4719d37fbb8d20": [
       "windows/160916174005", 
@@ -7220,7 +7340,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5b1d9d24de0afea8b35ba04a1c3e25d0812cdf7c4625de0a89af9fe4bbd1bb15": [
       "windows/110919210309", 
@@ -7251,7 +7372,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5b38bd129e83d5a0cad23921089490d50d4aae370428f8ddfffffa4c1564e184": [
       "macos/10.10.0", 
@@ -7336,7 +7458,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd": [
       "android/marshmallow-cts-release", 
@@ -7376,7 +7499,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5d56499be4d2e08bcfcad08a3e38723d50503bde706948e42f55603019e528ae": [
       "android/marshmallow-cts-release", 
@@ -7419,7 +7543,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5e3571f33f45a7df1537a68b5ffb9e036af9d2f5bc4c9717130dc43d7175aac7": [
       "windows/070201011524", 
@@ -7471,7 +7596,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5edb7ac43b82a06a8761e8d7be4979ebf2611f7dd79bf91c1c6b566a219ed766": [
       "android/kitkat-cts-release", 
@@ -7545,7 +7671,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5f0b62eab5e353ea6521651658fbb65359f443280a4afbd104d77d10f9f04c07": [
       "android/kitkat-cts-release", 
@@ -7609,7 +7736,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "5f960eebd716dbcb4d8a78b996e680ec2547441e69b4e44e98a595502e28a002": [
       "android/kitkat-mr1-release", 
@@ -7664,7 +7792,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "604d32d036895aed3bfefaeb727c009ec0f2b3cdfa42a1c71730e6a72c3be9d4": [
       "windows/150618202535", 
@@ -7680,7 +7809,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "606223d9db80df3939601e74b7e828e2800cce4273f76f276aa62db0a8e3b6c1": [
       "windows/071219233937", 
@@ -7849,7 +7979,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95": [
       "android/kitkat-cts-release", 
@@ -7935,7 +8066,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "62f240278c564c4dd8bf7d9d4f6f366ea894d22f5f34d989a983acec2fffed50": [
       "android/kitkat-cts-release", 
@@ -8072,7 +8204,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "63343abfb89a6a03ebb57e9b3f5fa7be7c4f5c756f3017b3a8c488c3653e9179": [
       "macos/10.10.0", 
@@ -8115,7 +8248,8 @@
       "windows/150223195544"
     ], 
     "65353833cf234c79562164f90849c0d104dbabf8ee41064d83e8cbe03ba1c5a5": [
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6639d13cab85df1ad9a23c443b3a60901e2b138d456fa71183578108884ec6bf": [
       "macos/10.10.0", 
@@ -8209,7 +8343,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "67ec2059fbf52d2e6ab51a5a9b3fc2e1dcd658a1ef3a8f31107bc98028b494a2": [
       "windows/070109202240", 
@@ -8398,7 +8533,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "68ad50909b04363c605ef13581a939ff2c96372e3f12325b0a6861e1d59f6603": [
       "windows/100927165108", 
@@ -8435,7 +8571,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "69ddd7ea90bb57c93e135dc85ea6fcd5480b603239bdc454fc758b2a26cf7f79": [
       "android/kitkat-cts-release", 
@@ -8509,7 +8646,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "69fac9bd55fb0ac78d53bbee5cf1d597989fd0aaab20a25151bdf1733ee7d122": [
       "android/kitkat-cts-release", 
@@ -8596,7 +8734,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6b9c08e86eb0f767cfad65cd98b62149e5494a67f5845e7bd1ed019f27b86bd6": [
       "android/nougat-cts-release", 
@@ -8622,7 +8761,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6baf50ae3467eff3c35fefdc76a02a97fab6267723eda91e99f1b3dc2b28f82e": [
       "windows/090825180842", 
@@ -8664,7 +8804,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98": [
       "android/kitkat-cts-release", 
@@ -8741,7 +8882,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6cc05041e6445e74696c4cfbc9f80f543b7eabbb44b4ce6f787c6a9971c42f17": [
       "android/nougat-mr1-cts-release", 
@@ -8765,7 +8907,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6ccfd302fc44bf4599329b9750878ea44e7e8566564bcbd586169762dd10c74e": [
       "windows/130626232015", 
@@ -8788,7 +8931,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6cf5f658436d10507eba9df463987480bc8560a8e26ef4691e1d3c9a878a0952": [
       "macos/10.10.0", 
@@ -8878,7 +9022,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6dea86a1e66620a040c3c5943cb215d2ca87fb6ac09b59707e29d2facbd66b4e": [
       "android/kitkat-mr1-release", 
@@ -9034,7 +9179,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6ec6614e9a8efd47d6318ffdfd0bf65b493a141f77c38d0b319be1bbbc053dd2": [
       "windows/110919210309", 
@@ -9065,7 +9211,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6f2bc4cb632c24eae6782c0f39758932d1e1dc9b3e070f9303073fff38b288e2": [
       "macos/10.9.0"
@@ -9140,7 +9287,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "6fff78e400a70c11011cd85977c459fb5af96a3df0540820d0f4b8607875e58f": [
       "macos/10.10.0", 
@@ -9229,7 +9377,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "70b922bfda0e3f4a342e4ee22d579ae598d071cc5ec9c30f123680340388aea5": [
       "macos/10.10.0", 
@@ -9262,10 +9411,12 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "71cca5391f9e794b04802530b363e121da8a3043bb26662fea4dca7fc951a4bd": [
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7286ce249fe9e32bd4752257c17cd8f6991a9c1e6f1a3cc73304ed023e6ae4eb": [
       "windows/131003230417", 
@@ -9287,7 +9438,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "730b619eaa759863c65360b7412e1457eca96844ef2f16d91fcf2efe46a647e9": [
       "windows/070109202240", 
@@ -9372,7 +9524,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c": [
       "android/kitkat-cts-release", 
@@ -9459,7 +9612,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7431e5f4c3c1ce4690774f0b61e05440883ba9a01ed00ba6abd7806ed3b118cf": [
       "android/kitkat-cts-release", 
@@ -9546,7 +9700,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "744b1147b4a9a69c32785e9e37c3323241ef29f63e76f1603d6761a783d8a0fe": [
       "windows/150122021939", 
@@ -9605,7 +9760,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "75c9d4361cb96e993abd9620cf043be9407a4633f202f0f4c0e17851cc6089cd": [
       "macos/10.10.0", 
@@ -9725,7 +9881,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "767c955a76412c89af688e90a1c70f556cfd6b6025dbea10416d7eb6831f8c40": [
       "android/kitkat-cts-release", 
@@ -9812,7 +9969,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "76ef4762e573206006cbc338b17ca4bc200574a11928d90c3ef31c5e803e6c6f": [
       "windows/070109202240", 
@@ -9944,7 +10102,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "77e04c9a751c73f23e2a1336112ec8d5153d382a152fed89d7532c3102771f3c": [
       "windows/090501224247", 
@@ -9987,7 +10146,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "781d64dfa77b00f2c006700b1fda86bf68b865a603c7a656f92e90c042ca2873": [
       "windows/080328202117", 
@@ -10033,7 +10193,8 @@
       "windows/160916174005", 
       "windows/161112005943", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7908b40314c138100b518d0735807ffbfcf8518a0095337105ba386b153dd927": [
       "android/kitkat-cts-release", 
@@ -10120,7 +10281,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "793cbf4559b9fde38ab22df16869f69881ae14c4b0139ac788a78a1afcca02fb": [
       "android/kitkat-cts-release", 
@@ -10259,7 +10421,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7af6ea9f753a1e709bd64d0beb867c11e8c295a56e24a6e0471459dccdaa1558": [
       "macos/10.11.0", 
@@ -10304,7 +10467,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7afc9d01a62f03a2de9637936d4afe68090d2de18d03f29c88cfb0b1ba63587f": [
       "macos/10.10.0", 
@@ -10469,7 +10633,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7d2bf3489ebc9ad3448b8b0827715a3cbfe3d523e3b56a9b5fc1d2a2da2f20fe": [
       "windows/100503224537", 
@@ -10508,7 +10673,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7d3b465a6014e526c0affcee2127d2311727ad811c26842d006af37306cc80bd": [
       "android/kitkat-cts-release", 
@@ -10612,7 +10778,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7e37cb8b4c47090cab36551ba6f45db840680fba166a952db100717f43053fc2": [
       "android/lollipop-cts-release", 
@@ -10663,7 +10830,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "7f12cd5f7e5e290ec7d85179d5b72c20a5be7508ffdb5bf81ab9684a7fc9f667": [
       "android/kitkat-cts-release", 
@@ -10737,7 +10905,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8095210805db4bbc355e4428d8fd6ec2cde3ab5fb97a9942988eb8f4dcd06016": [
       "android/kitkat-cts-release", 
@@ -10818,7 +10987,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "81c2568503eb3be5eec366653960e6d1be9448915e4605b793fbeb34ccb2470f": [
       "windows/120223022238", 
@@ -10846,7 +11016,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "82d42db3d657f1944e65c192b1dd58db8df8417b89165b045f5c6a70c5f8939e": [
       "windows/130626232015", 
@@ -10922,7 +11093,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "83ce3c1229688a593d485f81973c0f9195431eda37cc5e36430e79c7a888638b": [
       "android/kitkat-cts-release", 
@@ -10986,7 +11158,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "847df6a78497943f27fc72eb93f9a637320a02b561d0a91b09e87a7807ed7c61": [
       "windows/110919210309", 
@@ -11017,7 +11190,11 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
+    ], 
+    "8560f91c3624daba9570b5fea0dbe36ff11a8323be9486854fb3f34a5571198d": [
+      "windows/171121202507"
     ], 
     "85666a562ee0be5ce925c1d8890a6f76a87ec16d4d7d5f29ea7419cf20123b69": [
       "mozilla/2.18", 
@@ -11026,7 +11203,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "85a0dd7dd720adb7ff05f83d542b209dc7ff4528f7d677b18389fea5e5c49e86": [
       "android/kitkat-cts-release", 
@@ -11112,7 +11290,8 @@
       "windows/161112005943", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "85e0dfae3e55a843195f8b08c8349050e4689372f6e133ad0d199af96e95cc08": [
       "windows/070109202240", 
@@ -11231,7 +11410,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "87c678bfb8b25f38f7e97b336956bbcf144bbacaa53647e61a2325bc1055316b": [
       "android/kitkat-cts-release", 
@@ -11338,7 +11518,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "885de64c340e3ea70658f01e1145f957fcda27aabeea1ab9faa9fdb0102d4077": [
       "windows/070109202240", 
@@ -11392,7 +11573,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "88ef81de202eb018452e43f864725cea5fbd1fc2d9d205730709c5d8b8690f46": [
       "android/lollipop-cts-release", 
@@ -11440,7 +11622,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "894ce6ddb012cb3f736954668de63f436080e95f17b7a81bd924eb21bee9e440": [
       "windows/071219233937", 
@@ -11489,7 +11672,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "894ebc0b23da2a50c0186b7f8f25ef1f6b2935af32a94584ef80aaf877a3a06e": [
       "macos/10.10.0", 
@@ -11540,7 +11724,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8a866fd1b276b57e578e921c65828a2bed58e9f2f288054134b7f1f4bfc9cc74": [
       "android/lollipop-cts-release", 
@@ -11588,7 +11773,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8a968aadd88b20519672a452a3d6e31eacb71c26bcaf65b32f9793bf2ffa54a9": [
       "macos/10.10.0", 
@@ -11621,7 +11807,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8b45da1c06f791eb0cabf26be588f5fb23165c2e614bf885562d0dce50b29b02": [
       "android/nougat-cts-release", 
@@ -11645,7 +11832,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8ba1bd9c88efb3947e60ebe21137f81df7f09994cef27f097055018b8194c634": [
       "windows/140912180251", 
@@ -11663,7 +11851,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8c4edfd04348f322969e7e29a4cd4dca004655061c16e1b076422ef342ad630e": [
       "android/kitkat-cts-release", 
@@ -11728,7 +11917,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8c7209279ac04e275e16d07fd3b775e80154b5968046e31f52dd25766324e9a7": [
       "android/kitkat-cts-release", 
@@ -11847,7 +12037,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8da084fcf99ce07722f89b3205939806fa5cb811e1c813f6a108c7d336b3408e": [
       "android/kitkat-cts-release", 
@@ -11951,7 +12142,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8dbb5a7c06c20ef62dd912a36740992ff6e1e8583d42ede257c3affd7c769399": [
       "windows/070109202240", 
@@ -12019,7 +12211,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8e8c6ebf77dc73db3e38e93f4803e62b6b5933beb51ee4152f68d7aa14426b31": [
       "windows/090825180842", 
@@ -12043,7 +12236,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8f1ecdaf29bcd56eddd6b5d56a07fcac2b74d4bcd179179144a0365c27dcf14b": [
       "windows/121102212406", 
@@ -12123,7 +12317,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "8f9e2751dcd574e9ba90e744ea92581fd0af640ae86ac1ce2198c90f96b44823": [
       "windows/070109202240", 
@@ -12252,7 +12447,8 @@
       "windows/161112005943", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "90f3e05396995ff20922c44592db62d7845e1bf64aef512cca75bc669caa2479": [
       "windows/070702210503", 
@@ -12303,7 +12499,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9111240747e1f652f66d1f712a11f698963b491702e312f7513da3d0fc1e5a28": [
       "windows/150122021939", 
@@ -12366,7 +12563,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "92a9d9833fe1944db366e8bfae7a95b6480c2d6c6c2a1be65d4236b608fca1bb": [
       "macos/10.10.0", 
@@ -12448,7 +12646,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "92d8092ee77bc9208f0897dc05271894e63ef27933ae537fb983eef0eae3eec8": [
       "macos/10.10.0", 
@@ -12524,7 +12723,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "940ef46536713d8e2eb4b501e80b6abd8eb4e9928dba44784ce7d7e98595dfe8": [
       "macos/10.9.0"
@@ -12579,7 +12779,8 @@
     "958abbaeff760f4fbf66ff0f2c2708f4739b2c686127239a2c4ec87a68a984c8": [
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "959dc5880c457cd92e5447aaa5609db09ed47bd02c17a0edefdc819e756c74e5": [
       "macos/10.10.0", 
@@ -12659,7 +12860,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9676f287356c89a12683d65234098cb77c4f1c18f23c0e541de0e196725b7ebe": [
       "macos/10.10.0", 
@@ -12763,7 +12965,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "97f654859cbde586fd90311e82ec7902c238cba0d6e529564c9c88f44895ec50": [
       "windows/160916174005", 
@@ -12771,7 +12974,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9806ab8509e2f35e192f275f0c308b9409b42512f90c659598c22be613962272": [
       "windows/070109202240", 
@@ -12813,7 +13017,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48": [
       "android/kitkat-cts-release", 
@@ -12875,7 +13080,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9a6ec012e1a7da9dbe34194d478ad7c0db1822fb071df12981496ed104384113": [
       "android/kitkat-cts-release", 
@@ -12917,7 +13123,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9a73929a500f1a0bf49dcb046e8039169696557345e9f813f10ff9380db22695": [
       "macos/10.10.0", 
@@ -13021,7 +13228,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9b14e8f5f6ea167666e76dcd6becc190861d5e8970b99a9470f0231236049704": [
       "windows/131003230417", 
@@ -13039,7 +13247,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9cefb0cb7b74e642932532831e0dc8f4d68ad414261fc3f474b795e72a164e57": [
       "windows/150618202535", 
@@ -13055,7 +13264,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "9d190b2e314566685be8a889e27aa8c7d7ae1d8aaddba3c1ecf9d24863cd34b9": [
       "macos/10.10.0", 
@@ -13259,7 +13469,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a040929a02ce53b4acf4f2ffc6981ce4496f755e6d45fe0b2a692bcd52523f36": [
       "android/nougat-mr1-cts-release", 
@@ -13280,7 +13491,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a0459b9f63b22559f5fa5d4c6db3f9f72ff19342033578f073bf1d1b46cbb912": [
       "android/kitkat-cts-release", 
@@ -13352,7 +13564,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a1339d33281a0b56e557d3d32b1ce7f9367eb094bd5fa72a7e5004c8ded7cafe": [
       "android/nougat-cts-release", 
@@ -13367,7 +13580,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a1b2dbeb64e706c6169e3c4118b23baa09018a8427666d8bf0e28891ec051950": [
       "windows/110919210309", 
@@ -13398,7 +13612,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a1f05ccb80c2d710ec7d479abdcbb879e58d7edb7149fe78a87884e3d0bad0f9": [
       "macos/10.10.0", 
@@ -13458,7 +13673,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a22dba681e97376e2d397d728aae3a9b6296b9fdba60bc2e11f647f2c675fb37": [
       "android/kitkat-cts-release", 
@@ -13542,7 +13758,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a31f093053bd12c1f5c3c6efd498023fd2914d7758d05d698ce084b50626e0e5": [
       "macos/10.10.0", 
@@ -13605,7 +13822,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a3cc68595dfe7e86d8ad1772a8b5284add54ace3b8a798df47bccafb1fdb84df": [
       "windows/160414222039", 
@@ -13614,7 +13832,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a3d7435a18c46b23b6a4f8929cd59050c9168b03a7fad532626f297cac5356e4": [
       "windows/110919210309", 
@@ -13645,7 +13864,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a4310d50af18a6447190372a86afaf8b951ffb431d837f1e5688b45971ed1557": [
       "android/kitkat-cts-release", 
@@ -13720,7 +13940,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a45ede3bbbf09c8ae15c72efc07268d693a21c996fd51e67ca079460fd6d8873": [
       "android/kitkat-cts-release", 
@@ -13807,7 +14028,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a4b6b3996fc2f306b3fd8681bd63413d8c5009cc4fa329c2ccf0e2fa1b140305": [
       "android/kitkat-cts-release", 
@@ -13916,7 +14138,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a6c51e0da5ca0a9309d2e4c0e40c2af9107aae8203857fe198e3e769e343085c": [
       "android/kitkat-cts-release", 
@@ -14031,7 +14254,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a73563e859cbcfa173cf3285debf2578ede15d47a3bee385861ab7a4fb6d7b6e": [
       "windows/130420010442", 
@@ -14055,7 +14279,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "a798a1c70e9b6d50eaa5724a26fac7991848edc61bf48d79816bcafb66972128": [
       "windows/070109202240", 
@@ -14154,7 +14379,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "aad9ceed5aa6b1cea28596a8e4e1abed9386d6ebc9d4aad9acde0fa36ba069d0": [
       "macos/10.10.0", 
@@ -14211,7 +14437,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ab7036365c7154aa29c2c29f5d4191163b162a2225011357d56d07ffa7bc1f72": [
       "macos/10.10.0", 
@@ -14270,7 +14497,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ad016f958050e0e7e46fae7dcc50197ed8e3ff0a4b262e5ddcdb3edddc7d6578": [
       "windows/100503224537", 
@@ -14309,7 +14537,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ad7539e5cdc985fa95244055a9202d63460ec921467d034cfdbe87ec6d00fedc": [
       "windows/130626232015", 
@@ -14332,7 +14561,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ae2fec829118a2455ad6a415e71823eb9b7b6e3578a51ac8a51446eadbb0979c": [
       "windows/070109202240", 
@@ -14414,7 +14644,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ae92e90000541a9ebc101b70b6c33a62f5a53a55ba815e81d31abddf03507f5d": [
       "windows/070109202240", 
@@ -14468,7 +14699,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "af6d08eef3cac4e1584abc63c8a9472ac529af99f3f791319a43776063f58dca": [
       "windows/070109202240", 
@@ -14522,7 +14754,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "af71a3bca322e5224df546895696ce449a8bd2bd130f7a7ae457767f5c23d8f8": [
       "windows/070109202240", 
@@ -14642,7 +14875,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "afe80a97ea11159190e927e08ec2e60c59a40559483a3fee838a85321b3aeaad": [
       "windows/090825180842", 
@@ -14684,7 +14918,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b04d708f1ae0456265dd1b66907a2691a28680b853e031df3df9083af71614d7": [
       "windows/070109202240", 
@@ -14791,7 +15026,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b0b1730ecbc7ff4505142c49f1295e6eda6bcaed7e2c68c5be91b5a11001f024": [
       "macos/10.10.0", 
@@ -14861,7 +15097,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b2259996fff735ab35014ef63f3d413190079dd03a0962432635a8695f995305": [
       "windows/100927165108", 
@@ -14919,7 +15156,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b32396746453442f353e616292bb20bbaa5d23b546450fdb9c54b8386167d529": [
       "macos/10.10.0", 
@@ -14956,7 +15194,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b3c962d34019fb38ab9fe9c62399742ab26c43c2d18ce3f2b13c14321e52964b": [
       "windows/070109202240", 
@@ -15109,7 +15348,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b478b812250df878635c2aa7ec7d155eaa625ee82916e2cd294361886cd1fbd4": [
       "android/kitkat-cts-release", 
@@ -15183,7 +15423,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b5bd2cb79cbd1907298d6bdf4842e516d8c78fa6fc96d25f71af814e16cc245e": [
       "windows/080828200829", 
@@ -15229,7 +15470,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b6191a50d0c3977f7da99bcdaac86a227daeb9679ec70ba3b0c9d92271c170d3": [
       "android/kitkat-cts-release", 
@@ -15316,7 +15558,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b644d955fff29b74e3b5687e908ee7c3c9197ba3336cc6328531f6c057d677fd": [
       "windows/100927165108", 
@@ -15353,7 +15596,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804": [
       "android/nougat-cts-release", 
@@ -15374,7 +15618,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b7a7ec419454411761225ecf30d99585f851356077bf83274b11588fd05521b8": [
       "macos/10.9.0"
@@ -15456,7 +15701,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "b8bbe523bfca3b11d50f73f7f10b3ec8ec958aa1dc86f66d9541907ff1a110ef": [
       "windows/090203164005", 
@@ -15550,7 +15796,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ba7f1136389075b8e86c53c095fa14f5c83b6b017a0244ed7637114620d3a3b1": [
       "macos/10.9.0", 
@@ -15612,7 +15859,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "bc23f98a313cb92de3bbfc3a5a9f4461ac39494c4ae15a9e9df131e99b73019a": [
       "android/kitkat-cts-release", 
@@ -15781,7 +16029,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "bd81ce3b4f6591d11a67b5fc7a47fdef25521bf9aa4e18b9e3df2e34a7803be8": [
       "android/kitkat-cts-release", 
@@ -15895,7 +16144,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "bebce57dcb85f60a93bfa5019edb1a294bf6d81f82d9b4e71f502f0b15a1fc08": [
       "windows/160916174005", 
@@ -15903,7 +16153,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "bec94911c2955676db6c0a550986d76e3ba005667c442c9762b4fbb773de228c": [
       "android/lollipop-mr1-cts-release", 
@@ -15954,7 +16205,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "bf0feefb9e3a581ad5f9e9db7589985743d261085c4d314f6f5d7259aa421612": [
       "android/kitkat-cts-release", 
@@ -16084,7 +16336,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "bfff8fd04433487d6a8aa60c1a29767a9fc2bbb05e420f713a13b992891d3893": [
       "mozilla/2.18", 
@@ -16101,7 +16354,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c0a6f4dc63a24bfdcf54ef2a6a082a0a72de35803e2ff5ff527ae5d87206dfd5": [
       "android/kitkat-cts-release", 
@@ -16181,7 +16435,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c0c05a8d8da55eaf27aa9b910b0a6ef0d8bbded346928db872e182c2073e9802": [
       "macos/10.10.0", 
@@ -16257,6 +16512,9 @@
       "windows/150820181119", 
       "windows/151119231843"
     ], 
+    "c1727f3b673e6ae7f12f23d789a7be38b918223ef6911c592da1f583444a547e": [
+      "windows/171121202507"
+    ], 
     "c1b12f480020336e5b04f520bc19c2e2e10ab42c9d9235f05cbec33ffa4d4dea": [
       "windows/070109202240", 
       "windows/070201011524", 
@@ -16309,7 +16567,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c1b48299aba5208fe9630ace55ca68a03eda5a519c8802a0d3a673be8f8e557d": [
       "android/kitkat-cts-release", 
@@ -16395,7 +16654,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c1cf0b52096435e3f1b71daaec455a2311c8404f5583a9e213c69d857d943305": [
       "android/kitkat-mr1-release", 
@@ -16440,7 +16700,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c2157309d9aee17bf34f4df5e88dbaeba57e0361eb814cbc239f4d54d329a38d": [
       "windows/140912180251", 
@@ -16460,7 +16721,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c2959db8339e8dbcf6409ca92a66c49fd2e32494940a901143bd7eb72827dec2": [
       "windows/070109202240", 
@@ -16533,7 +16795,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c34c5df53080078ffe45b21a7f600469917204f4f0293f1d7209393e5265c04f": [
       "windows/150723231635", 
@@ -16548,7 +16811,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4": [
       "android/kitkat-cts-release", 
@@ -16635,7 +16899,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c38dcb38959393358691ea4d4f3ce495ce748996e64ed1891d897a0fc4dd55c6": [
       "android/kitkat-mr1-release", 
@@ -16702,7 +16967,8 @@
       "windows/160916174005"
     ], 
     "c45d7bb08e6d67e62e4235110b564e5f78fd92ef058c840aea4e6455d7585c60": [
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c470cf547e2302b977fb29dd71a89a7b6c1f60777b0329f56017f328bf4f6be6": [
       "android/kitkat-cts-release", 
@@ -16872,7 +17138,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c57bacf238f9336c3dfba62d12bcf5823603e5842c44e62f5448cc7e5f4cad59": [
       "macos/10.9.0"
@@ -16949,7 +17216,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c795ff8ff20c966688f064a1e091421d3110a3456c17ec2404b998738741f622": [
       "windows/150618202535", 
@@ -16965,7 +17233,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "c7ba6567de93a798ae1faa791e712d378fae1f93c4397fea441bb7cbe6fd5995": [
       "android/kitkat-cts-release", 
@@ -17019,7 +17288,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ca2d82a08677072f8ab6764ff035676cfe3e5e325e012172df3f92096db79b85": [
       "android/kitkat-cts-release", 
@@ -17089,7 +17359,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ca42dd41745fd0b81eb902362cf9d8bf719da1bd1b1efc946f5b4c99f42c1b9e": [
       "android/kitkat-cts-release", 
@@ -17175,7 +17446,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ca7a5e68c53d2c51f72f6b465d3ed753f5903ec7901c8d0f55d868337c81975a": [
       "windows/110125205412", 
@@ -17211,7 +17483,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "cb3ccbb76031e5e0138f8dd39a23f9de47ffc35e43c1144cea27d46a5ab1cb5f": [
       "android/lollipop-cts-release", 
@@ -17262,7 +17535,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "cb627d18b58ad56dde331a30456bc65c601a4e9b18dedcea08e7daaa07815ff0": [
       "macos/10.10.0", 
@@ -17359,7 +17633,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "cbb5af185e942a2402f9eacbc0ed5bb876eea3c1223623d00447e4f3ba554b65": [
       "macos/10.10.0", 
@@ -17416,7 +17691,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ccc89489371bad111c90619bea240a2e6dadd99f9f6e1d4d41e58ed6de3d0285": [
       "windows/070109202240", 
@@ -17470,7 +17746,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "cd0b3b2aa174b55f18c7502f3c3a76f2198175ce45637370cf4f48b9c2ce4fbf": [
       "windows/090825180842", 
@@ -17512,7 +17789,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "cd201256fe5ced0bfff8df595fff36b1416d5313a999f532ef4a9915df96dee0": [
       "windows/090825180842", 
@@ -17554,7 +17832,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "cd808284cf746ff2fd6eb58aa1d59c4ad4b3ca56fdc6274a8926a7835f32313d": [
       "macos/10.10.0", 
@@ -17624,7 +17903,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "cecddc905099d8dadfc5b1d209b737cbe2c18cfb2c10c0ff0bcf0d3286fc1aa2": [
       "android/kitkat-cts-release", 
@@ -17711,7 +17991,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "cf56ff46a4a186109dd96584b5eeb58a510c4275b0e5f94f40bbae865e19f673": [
       "android/kitkat-cts-release", 
@@ -17774,7 +18055,8 @@
     ], 
     "d1a0319098034e3aec729a0b5c3111229d9d26e3e623e8c5e6843fa06ee8e2e4": [
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d1c339ea2784eb870f934fc5634e4aa9ad5505016401f26465d37a574663359f": [
       "macos/10.10.0", 
@@ -17819,7 +18101,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d40e9c86cd8fe468c1776959f49ea774fa548684b6c406f3909261f4dce2575c": [
       "mozilla/2.18", 
@@ -17828,7 +18111,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d41d829e8c1659822af93fce62bffcde264fc84e8b950c5ff275d052354695a3": [
       "android/kitkat-cts-release", 
@@ -17901,14 +18185,16 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d43af9b35473755c9684fc06d7d8cb70ee5c28e773fb294eb41ee71722924d24": [
       "windows/161112005943", 
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d487a56f83b07482e85e963394c1ecc2c9e51d0903ee946b02c301581ed99e16": [
       "android/nougat-cts-release", 
@@ -17932,7 +18218,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d48d3d23eedb50a459e55197601c27774b9d7b18c94d5a059511a10250b93168": [
       "windows/160414222039", 
@@ -17941,7 +18228,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d68f7730b1ec2b3fb698c96d76540c9997415a25737dcd61d44960db77d2723d": [
       "macos/10.9.0"
@@ -17978,7 +18266,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d7a7a0fb5d7e2731d771e9484ebcdef71d5f0c3e0a2948782bc83ee0ea699ef4": [
       "android/kitkat-cts-release", 
@@ -18065,10 +18354,12 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d7ba3f4ff8ad05633451470dda3378a3491b90005e5c687d2b68d53647cfdd66": [
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d80fef910ae3f104723b045cec2d019f441ce6213adf156791e70c1790110a31": [
       "windows/150618202535", 
@@ -18083,7 +18374,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d8e0febc1db2e38d00940f37d27d41344d993e734b99d5656d9778d4d8143624": [
       "android/kitkat-cts-release", 
@@ -18169,7 +18461,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "d95fea3ca4eedce74cd76e75fc6d1ff62c441f0fa8bc77f034b19e5db258015d": [
       "android/kitkat-cts-release", 
@@ -18221,7 +18514,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "da98f640194df128c7888bc8e3479a9dd31795ff087c649052fbafb02eaef184": [
       "macos/10.10.0", 
@@ -18300,13 +18594,15 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ddbf149733bc2bf8a09d7f012b01a6dea11d7bae26713783ef6407a2495bf189": [
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ddff53ecd7743b60bb7b2795ff5732fa785f9a14df1120fb40a38cf84ca2a566": [
       "windows/070201011524", 
@@ -18359,7 +18655,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "df545bf919a2439c36983b54cdfc903dfa4f37d3996d8d84b4c31eec6f3c163e": [
       "windows/100719231554", 
@@ -18397,7 +18694,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e0e17aea06cf9ce12aae8190345a2c59720130a7d8ff72f3745ad75dbaa365b6": [
       "windows/140912180251", 
@@ -18417,7 +18715,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e17890ee09a3fbf4f48b9c414a17d637b7a50647e9bc752322727fcc1742a911": [
       "android/kitkat-cts-release", 
@@ -18503,7 +18802,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e28393773da845a679f2080cc7fb44a3b7a1c3792cb7eb7729fdcb6a8d99aea7": [
       "android/kitkat-cts-release", 
@@ -18566,7 +18866,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e3268f6106ba8b665a1a962ddea1459d2a46972f1f2440329b390b895749ad45": [
       "macos/10.10.3", 
@@ -18595,7 +18896,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e389360d0fdbaeb3d250584b4730314e222f39c156a020144e8d960561791506": [
       "android/kitkat-cts-release", 
@@ -18660,6 +18962,9 @@
       "windows/150723231635", 
       "windows/150820181119"
     ], 
+    "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": [
+      "windows/110901174705"
+    ], 
     "e3b6a2db2ed7ce48842f7ac53241c7b71d54144bfb40c11f3f1d0b42f5eea12d": [
       "android/kitkat-cts-release", 
       "android/kitkat-mr1-release", 
@@ -18739,7 +19044,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e3efb6118a92e3b858fd806f690e31d46b95ca1bd756da2b3037fe2f87cc9137": [
       "macos/10.9.0", 
@@ -18826,7 +19132,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e57210ab812c8df308267cb4291b98e956597ca36ec2b95189ef1723396bcac8": [
       "windows/070109202240", 
@@ -18981,7 +19288,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e6b8f8766485f807ae7f8dac1670461f07c0a13eef3a1ff717538d7abad391b4": [
       "android/kitkat-cts-release", 
@@ -19090,13 +19398,15 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e74fbda55bd564c473a36b441aa799c8a68e077440e8288b9fa1e50e4bbaca11": [
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e75e72ed9f560eec6eb4800073a43fc3ad19195a392282017895974a99026b6c": [
       "android/kitkat-cts-release", 
@@ -19183,7 +19493,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e7685634efacf69ace939a6b255b7b4fabef42935b50a265acb5cb6027e44e70": [
       "macos/10.10.0", 
@@ -19242,7 +19553,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e793c9b02fd8aa13e21c31228accb08119643b749c898964b1746d46c3d4cbd2": [
       "android/lollipop-mr1-cts-release", 
@@ -19296,7 +19608,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "e873d4082a7b4632934f48a5cc1ee500932f661e56c3467c5c84d31447476b0c": [
       "windows/070109202240", 
@@ -19562,7 +19875,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "eac0220c5c9fecc5121d3720872d06707b5266be25d4ebb56ab804bbbf85fe03": [
       "macos/10.10.0", 
@@ -19621,7 +19935,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "eb04cf5eb1f39afa762f2bb120f296cba520c1b97db1589565b81cb9a17b7244": [
       "android/kitkat-cts-release", 
@@ -19708,7 +20023,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "eb7e05aa58e7bd328a282bf8867033f3c035342b516ee85c01673dffffbbfe58": [
       "windows/090203164005", 
@@ -19752,7 +20068,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ebc5570c29018c4d67b1aa127baf12f703b4611ebc17b7dab5573894179b93fa": [
       "android/oreo-cts-release", 
@@ -19760,7 +20077,8 @@
       "mozilla/2.14", 
       "mozilla/2.16", 
       "mozilla/2.18", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99": [
       "android/kitkat-cts-release", 
@@ -19841,7 +20159,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ebf3c02a8789b1fb7d511995d663b72906d913ce0d5e10568a8a77e2586167e7": [
       "android/kitkat-cts-release", 
@@ -19976,7 +20295,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d": [
       "android/kitkat-cts-release", 
@@ -20038,7 +20358,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881": [
       "android/kitkat-cts-release", 
@@ -20098,7 +20419,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "eefca888db442cea1f03fac5de5b1af210ae03f5e1658ddb880c645e78624546": [
       "windows/091013033632", 
@@ -20210,7 +20532,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "efb5157e9c66caa1dcc63c9fac0127cde83b7a426c4579b7b43a41ba46a56deb": [
       "windows/111018233154", 
@@ -20240,7 +20563,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f00355eef101c7df4e46cce6417dffce3db82dbb1369c3b439c4e33bee445c42": [
       "windows/070201011524", 
@@ -20293,7 +20617,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f008733ec500dc498763cc9264c6fcea40ec22000e927d053ce9c90bfa046cb2": [
       "macos/10.10.0", 
@@ -20360,7 +20685,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f09b122c7114f4a09bd4ea4f4a99d558b46e4c25cd81140d29c05613914c3841": [
       "android/kitkat-cts-release", 
@@ -20418,7 +20744,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f1b13f5c9a326403b0f31bbe7699cd17c7d1c0b981586dd1a7b219c52508fe99": [
       "windows/070702210503", 
@@ -20469,7 +20796,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73": [
       "android/kitkat-cts-release", 
@@ -20556,7 +20884,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f1f3cc207a6d47947b8cb9c30422229de0d71fb867e0b9a3eda08e0e1736bc28": [
       "windows/070109202240", 
@@ -20612,7 +20941,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474": [
       "android/kitkat-cts-release", 
@@ -20663,7 +20993,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f375e2f77a108bacc4234894a9af308edeca1acd8fbde0e7aaa9634e9daf7e1c": [
       "windows/091029013045", 
@@ -20744,7 +21075,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f4336bc2ac75950beccf1c1f2f9da6dddafd1f41161ca71f59c76889bd474033": [
       "windows/110919210309", 
@@ -20775,7 +21107,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f4c149551a3013a35bc7bffe17a7f3449bc1ab5b5a0ae74b06c23b90004c0104": [
       "android/kitkat-cts-release", 
@@ -20882,7 +21215,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f773bc65659f1bc59087bf214eead864010d5887cd2cd84e4f1ba7523fe55640": [
       "windows/070109202240", 
@@ -20973,7 +21307,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "f9e67d336c51002ac054c632022d66dda2e7e3fff10ad061ed31d8bbb410cfb2": [
       "android/kitkat-cts-release", 
@@ -21060,7 +21395,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "fabcf5197cdd7f458ac33832d3284021db2425fd6bea7a2e69b7486e8f51f9cc": [
       "macos/10.10.0", 
@@ -21096,12 +21432,14 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "fad540811afae0dc767cdf6572a088fa3ce8493dd82b3b869a67d10aab4e8124": [
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "fb47d92a9909fd4fa9bec02737543e1f3514ced747407a8d9cfa397b0915067c": [
       "windows/120223022238", 
@@ -21129,7 +21467,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "fc0a0fe27c9dc13c81238a5913a1daf8184168beb7e5a4512a771fd4f453651d": [
       "windows/070109202240", 
@@ -21169,7 +21508,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "fcbfe2886206f72b27593c8b070297e12d769ed10ed7930705a8098effc14d17": [
       "android/kitkat-cts-release", 
@@ -21237,7 +21577,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd": [
       "android/kitkat-cts-release", 
@@ -21300,7 +21641,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "fe7114d07a147759891ff37b4f53eb43568296bc3bf89bc12cafb186985ef28d": [
       "windows/071219233937", 
@@ -21349,7 +21691,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "fe863d0822fe7a2353fa484d5924e875656d3dc9fb58771f6f616f9d571bc592": [
       "macos/10.10.0", 
@@ -21451,7 +21794,8 @@
       "windows/170228174808", 
       "windows/170419224008", 
       "windows/170613190204", 
-      "windows/170922155710"
+      "windows/170922155710", 
+      "windows/171121202507"
     ], 
     "ffcef2224e29b0b36ec8314e686822f3ac0f1c5e0c2d5c0eb2484ce7e2540fd0": [
       "windows/070109202240", 
@@ -21498,7 +21842,7 @@
       "windows/151119231843"
     ]
   }, 
-  "last_spki_id": 487, 
+  "last_spki_id": 490, 
   "spkis": {
     "004124ad6037fd5f3319e7a23d4d9c811f5598d66c4754155b0aaa9e8f00621f": {
       "fingerprints": [
@@ -21931,6 +22275,12 @@
       ], 
       "id": 163
     }, 
+    "282fb5cfbaf01518d9704de7884d7a25ff01cf882e994290d5995d5eb6c44988": {
+      "fingerprints": [
+        "c1727f3b673e6ae7f12f23d789a7be38b918223ef6911c592da1f583444a547e"
+      ], 
+      "id": 489
+    }, 
     "283310819f5e09204995d8ad9ff6fc10746297b5c0ae06bdd1e1124b10a0d7ad": {
       "fingerprints": [
         "956057517ff3bb35049342288c1c9dce852daca652b465e9747253b5f93b1f5e"
@@ -24216,6 +24566,12 @@
       ], 
       "id": 9
     }, 
+    "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": {
+      "fingerprints": [
+        "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+      ], 
+      "id": 488
+    }, 
     "e42f24bd4d37f4aa2e56b979d83d1e65219fe0e9e3a382a1b3cb66c93955de75": {
       "fingerprints": [
         "c766a9bef2d4071c863a31aa4920e813b2d198608cb7b7cfe21143b836df09ea", 
@@ -24432,6 +24788,12 @@
       ], 
       "id": 28
     }, 
+    "fd371bea9755ff60c8828c849b8e5215de532d61b009855fa0ad630d90eef82e": {
+      "fingerprints": [
+        "8560f91c3624daba9570b5fea0dbe36ff11a8323be9486854fb3f34a5571198d"
+      ], 
+      "id": 490
+    }, 
     "fd872d176617e50c266119d0fdb047b0732da2048b121af7b9860ca3e2f2f2be": {
       "fingerprints": [
         "a6c51e0da5ca0a9309d2e4c0e40c2af9107aae8203857fe198e3e769e343085c"
diff --git a/net/filter/filter_source_stream.cc b/net/filter/filter_source_stream.cc
index 7ecf53b..cf9b46e 100644
--- a/net/filter/filter_source_stream.cc
+++ b/net/filter/filter_source_stream.cc
@@ -36,7 +36,7 @@
   DCHECK(upstream_);
 }
 
-FilterSourceStream::~FilterSourceStream() {}
+FilterSourceStream::~FilterSourceStream() = default;
 
 int FilterSourceStream::Read(IOBuffer* read_buffer,
                              int read_buffer_size,
diff --git a/net/filter/gzip_header.cc b/net/filter/gzip_header.cc
index 36a1c866..3792f0c 100644
--- a/net/filter/gzip_header.cc
+++ b/net/filter/gzip_header.cc
@@ -17,8 +17,7 @@
   Reset();
 }
 
-GZipHeader::~GZipHeader() {
-}
+GZipHeader::~GZipHeader() = default;
 
 void GZipHeader::Reset() {
   state_        = IN_HEADER_ID1;
diff --git a/net/filter/source_stream.cc b/net/filter/source_stream.cc
index e2c4e6e2..f3981964 100644
--- a/net/filter/source_stream.cc
+++ b/net/filter/source_stream.cc
@@ -8,7 +8,7 @@
 
 SourceStream::SourceStream(SourceType type) : type_(type) {}
 
-SourceStream::~SourceStream() {}
+SourceStream::~SourceStream() = default;
 
 std::string SourceStream::Description() const {
   return "";
diff --git a/net/ftp/ftp_auth_cache.cc b/net/ftp/ftp_auth_cache.cc
index 370cee5..7bebd110 100644
--- a/net/ftp/ftp_auth_cache.cc
+++ b/net/ftp/ftp_auth_cache.cc
@@ -18,11 +18,11 @@
       credentials(credentials) {
 }
 
-FtpAuthCache::Entry::~Entry() {}
+FtpAuthCache::Entry::~Entry() = default;
 
-FtpAuthCache::FtpAuthCache() {}
+FtpAuthCache::FtpAuthCache() = default;
 
-FtpAuthCache::~FtpAuthCache() {}
+FtpAuthCache::~FtpAuthCache() = default;
 
 FtpAuthCache::Entry* FtpAuthCache::Lookup(const GURL& origin) {
   for (EntryList::iterator it = entries_.begin(); it != entries_.end(); ++it) {
diff --git a/net/ftp/ftp_ctrl_response_buffer.cc b/net/ftp/ftp_ctrl_response_buffer.cc
index f2cc5f5..274a0ae 100644
--- a/net/ftp/ftp_ctrl_response_buffer.cc
+++ b/net/ftp/ftp_ctrl_response_buffer.cc
@@ -23,12 +23,12 @@
 
 FtpCtrlResponse::FtpCtrlResponse(const FtpCtrlResponse& other) = default;
 
-FtpCtrlResponse::~FtpCtrlResponse() {}
+FtpCtrlResponse::~FtpCtrlResponse() = default;
 
 FtpCtrlResponseBuffer::FtpCtrlResponseBuffer(const NetLogWithSource& net_log)
     : multiline_(false), net_log_(net_log) {}
 
-FtpCtrlResponseBuffer::~FtpCtrlResponseBuffer() {}
+FtpCtrlResponseBuffer::~FtpCtrlResponseBuffer() = default;
 
 int FtpCtrlResponseBuffer::ConsumeData(const char* data, int data_length) {
   buffer_.append(data, data_length);
diff --git a/net/ftp/ftp_network_layer.cc b/net/ftp/ftp_network_layer.cc
index 6780723..9cb3b286 100644
--- a/net/ftp/ftp_network_layer.cc
+++ b/net/ftp/ftp_network_layer.cc
@@ -17,8 +17,7 @@
   DCHECK(host_resolver);
 }
 
-FtpNetworkLayer::~FtpNetworkLayer() {
-}
+FtpNetworkLayer::~FtpNetworkLayer() = default;
 
 std::unique_ptr<FtpTransaction> FtpNetworkLayer::CreateTransaction() {
   if (suspended_)
diff --git a/net/ftp/ftp_network_session.cc b/net/ftp/ftp_network_session.cc
index 37a7cbe..9de9796b 100644
--- a/net/ftp/ftp_network_session.cc
+++ b/net/ftp/ftp_network_session.cc
@@ -9,6 +9,6 @@
 FtpNetworkSession::FtpNetworkSession(HostResolver* host_resolver)
     : host_resolver_(host_resolver) {}
 
-FtpNetworkSession::~FtpNetworkSession() {}
+FtpNetworkSession::~FtpNetworkSession() = default;
 
 }  // namespace net
diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc
index 74caf028..566bbe4 100644
--- a/net/ftp/ftp_network_transaction.cc
+++ b/net/ftp/ftp_network_transaction.cc
@@ -234,8 +234,7 @@
       next_state_(STATE_NONE),
       state_after_data_connect_complete_(STATE_NONE) {}
 
-FtpNetworkTransaction::~FtpNetworkTransaction() {
-}
+FtpNetworkTransaction::~FtpNetworkTransaction() = default;
 
 int FtpNetworkTransaction::Stop(int error) {
   if (command_sent_ == COMMAND_QUIT) {
diff --git a/net/ftp/ftp_network_transaction_unittest.cc b/net/ftp/ftp_network_transaction_unittest.cc
index cfbd262..9ca3f5e 100644
--- a/net/ftp/ftp_network_transaction_unittest.cc
+++ b/net/ftp/ftp_network_transaction_unittest.cc
@@ -63,7 +63,7 @@
         data_type_('I') {
     Init();
   }
-  ~FtpSocketDataProvider() override {}
+  ~FtpSocketDataProvider() override = default;
 
   // SocketDataProvider implementation.
   MockRead OnRead() override {
@@ -243,8 +243,8 @@
 
 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider {
  public:
-  FtpSocketDataProviderDirectoryListing() {}
-  ~FtpSocketDataProviderDirectoryListing() override {}
+  FtpSocketDataProviderDirectoryListing() = default;
+  ~FtpSocketDataProviderDirectoryListing() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -270,8 +270,8 @@
 class FtpSocketDataProviderDirectoryListingWithPasvFallback
     : public FtpSocketDataProviderDirectoryListing {
  public:
-  FtpSocketDataProviderDirectoryListingWithPasvFallback() {}
-  ~FtpSocketDataProviderDirectoryListingWithPasvFallback() override {}
+  FtpSocketDataProviderDirectoryListingWithPasvFallback() = default;
+  ~FtpSocketDataProviderDirectoryListingWithPasvFallback() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -295,8 +295,8 @@
 
 class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider {
  public:
-  FtpSocketDataProviderVMSDirectoryListing() {}
-  ~FtpSocketDataProviderVMSDirectoryListing() override {}
+  FtpSocketDataProviderVMSDirectoryListing() = default;
+  ~FtpSocketDataProviderVMSDirectoryListing() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -330,8 +330,8 @@
 class FtpSocketDataProviderVMSDirectoryListingRootDirectory
     : public FtpSocketDataProvider {
  public:
-  FtpSocketDataProviderVMSDirectoryListingRootDirectory() {}
-  ~FtpSocketDataProviderVMSDirectoryListingRootDirectory() override {}
+  FtpSocketDataProviderVMSDirectoryListingRootDirectory() = default;
+  ~FtpSocketDataProviderVMSDirectoryListingRootDirectory() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -366,8 +366,8 @@
 class FtpSocketDataProviderFileDownloadWithFileTypecode
     : public FtpSocketDataProvider {
  public:
-  FtpSocketDataProviderFileDownloadWithFileTypecode() {}
-  ~FtpSocketDataProviderFileDownloadWithFileTypecode() override {}
+  FtpSocketDataProviderFileDownloadWithFileTypecode() = default;
+  ~FtpSocketDataProviderFileDownloadWithFileTypecode() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -389,8 +389,8 @@
 
 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider {
  public:
-  FtpSocketDataProviderFileDownload() {}
-  ~FtpSocketDataProviderFileDownload() override {}
+  FtpSocketDataProviderFileDownload() = default;
+  ~FtpSocketDataProviderFileDownload() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -416,8 +416,8 @@
 class FtpSocketDataProviderPathSeparatorsNotUnescaped
     : public FtpSocketDataProvider {
  public:
-  FtpSocketDataProviderPathSeparatorsNotUnescaped() {}
-  ~FtpSocketDataProviderPathSeparatorsNotUnescaped() override {}
+  FtpSocketDataProviderPathSeparatorsNotUnescaped() = default;
+  ~FtpSocketDataProviderPathSeparatorsNotUnescaped() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -444,8 +444,8 @@
 
 class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider {
  public:
-  FtpSocketDataProviderFileNotFound() {}
-  ~FtpSocketDataProviderFileNotFound() override {}
+  FtpSocketDataProviderFileNotFound() = default;
+  ~FtpSocketDataProviderFileNotFound() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -473,8 +473,8 @@
 class FtpSocketDataProviderFileDownloadWithPasvFallback
     : public FtpSocketDataProviderFileDownload {
  public:
-  FtpSocketDataProviderFileDownloadWithPasvFallback() {}
-  ~FtpSocketDataProviderFileDownloadWithPasvFallback() override {}
+  FtpSocketDataProviderFileDownloadWithPasvFallback() = default;
+  ~FtpSocketDataProviderFileDownloadWithPasvFallback() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -498,8 +498,8 @@
 class FtpSocketDataProviderFileDownloadZeroSize
     : public FtpSocketDataProviderFileDownload {
  public:
-  FtpSocketDataProviderFileDownloadZeroSize() {}
-  ~FtpSocketDataProviderFileDownloadZeroSize() override {}
+  FtpSocketDataProviderFileDownloadZeroSize() = default;
+  ~FtpSocketDataProviderFileDownloadZeroSize() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -524,8 +524,8 @@
 class FtpSocketDataProviderFileDownloadCWD451
     : public FtpSocketDataProviderFileDownload {
  public:
-  FtpSocketDataProviderFileDownloadCWD451() {}
-  ~FtpSocketDataProviderFileDownloadCWD451() override {}
+  FtpSocketDataProviderFileDownloadCWD451() = default;
+  ~FtpSocketDataProviderFileDownloadCWD451() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -546,8 +546,8 @@
 
 class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider {
  public:
-  FtpSocketDataProviderVMSFileDownload() {}
-  ~FtpSocketDataProviderVMSFileDownload() override {}
+  FtpSocketDataProviderVMSFileDownload() = default;
+  ~FtpSocketDataProviderVMSFileDownload() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -582,8 +582,8 @@
 
 class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload {
  public:
-  FtpSocketDataProviderEscaping() {}
-  ~FtpSocketDataProviderEscaping() override {}
+  FtpSocketDataProviderEscaping() = default;
+  ~FtpSocketDataProviderEscaping() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -611,8 +611,8 @@
 class FtpSocketDataProviderFileDownloadInvalidResponse
     : public FtpSocketDataProviderFileDownload {
  public:
-  FtpSocketDataProviderFileDownloadInvalidResponse() {}
-  ~FtpSocketDataProviderFileDownloadInvalidResponse() override {}
+  FtpSocketDataProviderFileDownloadInvalidResponse() = default;
+  ~FtpSocketDataProviderFileDownloadInvalidResponse() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -648,7 +648,7 @@
         epsv_response_length_(epsv_response_length),
         expected_state_(expected_state) {}
 
-  ~FtpSocketDataProviderEvilEpsv() override {}
+  ~FtpSocketDataProviderEvilEpsv() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -677,7 +677,7 @@
       : pasv_response_(pasv_response),
         expected_state_(expected_state) {
   }
-  ~FtpSocketDataProviderEvilPasv() override {}
+  ~FtpSocketDataProviderEvilPasv() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -703,7 +703,7 @@
       : size_response_(size_response),
         expected_state_(expected_state) {
   }
-  ~FtpSocketDataProviderEvilSize() override {}
+  ~FtpSocketDataProviderEvilSize() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -731,7 +731,7 @@
       : expected_user_(expected_user),
         expected_password_(expected_password) {
   }
-  ~FtpSocketDataProviderEvilLogin() override {}
+  ~FtpSocketDataProviderEvilLogin() override = default;
 
   MockWriteResult OnWrite(const std::string& data) override {
     if (InjectFault())
@@ -773,7 +773,7 @@
     }
     host_resolver_->set_rules(rules.get());
   }
-  ~FtpNetworkTransactionTest() override {}
+  ~FtpNetworkTransactionTest() override = default;
 
   // Sets up an FtpNetworkTransaction and MocketClientSocketFactory, replacing
   // the default one. Only needs to be called if a test runs multiple
diff --git a/net/ftp/ftp_response_info.cc b/net/ftp/ftp_response_info.cc
index ddbd1ed..51b3c0e 100644
--- a/net/ftp/ftp_response_info.cc
+++ b/net/ftp/ftp_response_info.cc
@@ -12,6 +12,6 @@
       is_directory_listing(false) {
 }
 
-FtpResponseInfo::~FtpResponseInfo() {}
+FtpResponseInfo::~FtpResponseInfo() = default;
 
 }  // namespace net
diff --git a/net/http/bidirectional_stream.cc b/net/http/bidirectional_stream.cc
index e13e3f7d..3c72898a 100644
--- a/net/http/bidirectional_stream.cc
+++ b/net/http/bidirectional_stream.cc
@@ -59,9 +59,9 @@
 
 }  // namespace
 
-BidirectionalStream::Delegate::Delegate() {}
+BidirectionalStream::Delegate::Delegate() = default;
 
-BidirectionalStream::Delegate::~Delegate() {}
+BidirectionalStream::Delegate::~Delegate() = default;
 
 BidirectionalStream::BidirectionalStream(
     std::unique_ptr<BidirectionalStreamRequestInfo> request_info,
diff --git a/net/http/bidirectional_stream_impl.cc b/net/http/bidirectional_stream_impl.cc
index 6cbf69f..b8d11dbc 100644
--- a/net/http/bidirectional_stream_impl.cc
+++ b/net/http/bidirectional_stream_impl.cc
@@ -6,12 +6,12 @@
 
 namespace net {
 
-BidirectionalStreamImpl::Delegate::Delegate() {}
+BidirectionalStreamImpl::Delegate::Delegate() = default;
 
-BidirectionalStreamImpl::Delegate::~Delegate() {}
+BidirectionalStreamImpl::Delegate::~Delegate() = default;
 
-BidirectionalStreamImpl::BidirectionalStreamImpl() {}
+BidirectionalStreamImpl::BidirectionalStreamImpl() = default;
 
-BidirectionalStreamImpl::~BidirectionalStreamImpl() {}
+BidirectionalStreamImpl::~BidirectionalStreamImpl() = default;
 
 }  // namespace net
diff --git a/net/http/bidirectional_stream_request_info.cc b/net/http/bidirectional_stream_request_info.cc
index 309606e7..e79c16b 100644
--- a/net/http/bidirectional_stream_request_info.cc
+++ b/net/http/bidirectional_stream_request_info.cc
@@ -9,6 +9,6 @@
 BidirectionalStreamRequestInfo::BidirectionalStreamRequestInfo()
     : priority(LOW), end_stream_on_headers(false) {}
 
-BidirectionalStreamRequestInfo::~BidirectionalStreamRequestInfo() {}
+BidirectionalStreamRequestInfo::~BidirectionalStreamRequestInfo() = default;
 
 }  // namespace net
diff --git a/net/http/bidirectional_stream_unittest.cc b/net/http/bidirectional_stream_unittest.cc
index 1d1cfe7..7ea853b 100644
--- a/net/http/bidirectional_stream_unittest.cc
+++ b/net/http/bidirectional_stream_unittest.cc
@@ -106,7 +106,7 @@
         run_until_completion_(false),
         not_expect_callback_(false) {}
 
-  ~TestDelegateBase() override {}
+  ~TestDelegateBase() override = default;
 
   void OnStreamReady(bool request_headers_sent) override {
     // Request headers should always be sent in H2's case, because the
@@ -312,7 +312,7 @@
 
   DeleteStreamDelegate(IOBuffer* buf, int buf_len, Phase phase)
       : TestDelegateBase(buf, buf_len), phase_(phase) {}
-  ~DeleteStreamDelegate() override {}
+  ~DeleteStreamDelegate() override = default;
 
   void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override {
     TestDelegateBase::OnHeadersReceived(response_headers);
@@ -370,7 +370,7 @@
 class MockTimer : public base::MockTimer {
  public:
   MockTimer() : base::MockTimer(false, false) {}
-  ~MockTimer() override {}
+  ~MockTimer() override = default;
 
   void Start(const base::Location& posted_from,
              base::TimeDelta delay,
diff --git a/net/http/broken_alternative_services.cc b/net/http/broken_alternative_services.cc
index 2cb8cca8..0c42626f 100644
--- a/net/http/broken_alternative_services.cc
+++ b/net/http/broken_alternative_services.cc
@@ -39,7 +39,7 @@
   DCHECK(clock_);
 }
 
-BrokenAlternativeServices::~BrokenAlternativeServices() {}
+BrokenAlternativeServices::~BrokenAlternativeServices() = default;
 
 void BrokenAlternativeServices::Clear() {
   expiration_timer_.Stop();
diff --git a/net/http/failing_http_transaction_factory.cc b/net/http/failing_http_transaction_factory.cc
index d6202bf..ec8d9d0f 100644
--- a/net/http/failing_http_transaction_factory.cc
+++ b/net/http/failing_http_transaction_factory.cc
@@ -82,7 +82,7 @@
   DCHECK_LT(error, OK);
 }
 
-FailingHttpTransaction::~FailingHttpTransaction() {}
+FailingHttpTransaction::~FailingHttpTransaction() = default;
 
 int FailingHttpTransaction::Start(const HttpRequestInfo* request_info,
                                   const CompletionCallback& callback,
@@ -197,7 +197,7 @@
   DCHECK_LT(error, OK);
 }
 
-FailingHttpTransactionFactory::~FailingHttpTransactionFactory() {}
+FailingHttpTransactionFactory::~FailingHttpTransactionFactory() = default;
 
 // HttpTransactionFactory:
 int FailingHttpTransactionFactory::CreateTransaction(
diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc
index 75f794d..57c1fe6 100644
--- a/net/http/http_auth_cache.cc
+++ b/net/http/http_auth_cache.cc
@@ -72,11 +72,9 @@
 
 namespace net {
 
-HttpAuthCache::HttpAuthCache() {
-}
+HttpAuthCache::HttpAuthCache() = default;
 
-HttpAuthCache::~HttpAuthCache() {
-}
+HttpAuthCache::~HttpAuthCache() = default;
 
 // Performance: O(n), where n is the number of realm entries.
 HttpAuthCache::Entry* HttpAuthCache::Lookup(const GURL& origin,
@@ -183,8 +181,7 @@
 
 HttpAuthCache::Entry::Entry(const Entry& other) = default;
 
-HttpAuthCache::Entry::~Entry() {
-}
+HttpAuthCache::Entry::~Entry() = default;
 
 void HttpAuthCache::Entry::UpdateStaleChallenge(
     const std::string& auth_challenge) {
diff --git a/net/http/http_auth_cache_unittest.cc b/net/http/http_auth_cache_unittest.cc
index 6ab67c4c..da2be13 100644
--- a/net/http/http_auth_cache_unittest.cc
+++ b/net/http/http_auth_cache_unittest.cc
@@ -53,7 +53,7 @@
 
 
  private:
-  ~MockAuthHandler() override {}
+  ~MockAuthHandler() override = default;
 };
 
 const char kRealm1[] = "Realm1";
diff --git a/net/http/http_auth_challenge_tokenizer.cc b/net/http/http_auth_challenge_tokenizer.cc
index 75c2d673..7ccd60b2 100644
--- a/net/http/http_auth_challenge_tokenizer.cc
+++ b/net/http/http_auth_challenge_tokenizer.cc
@@ -20,8 +20,7 @@
   Init(begin, end);
 }
 
-HttpAuthChallengeTokenizer::~HttpAuthChallengeTokenizer() {
-}
+HttpAuthChallengeTokenizer::~HttpAuthChallengeTokenizer() = default;
 
 HttpUtil::NameValuePairsIterator HttpAuthChallengeTokenizer::param_pairs()
     const {
diff --git a/net/http/http_auth_filter.cc b/net/http/http_auth_filter.cc
index 53d81ea..4d92591 100644
--- a/net/http/http_auth_filter.cc
+++ b/net/http/http_auth_filter.cc
@@ -21,8 +21,7 @@
   SetWhitelist(server_whitelist);
 }
 
-HttpAuthFilterWhitelist::~HttpAuthFilterWhitelist() {
-}
+HttpAuthFilterWhitelist::~HttpAuthFilterWhitelist() = default;
 
 // Add a new domain |filter| to the whitelist, if it's not already there
 bool HttpAuthFilterWhitelist::AddFilter(const std::string& filter,
diff --git a/net/http/http_auth_gssapi_posix.cc b/net/http/http_auth_gssapi_posix.cc
index 98385718..2ca0859 100644
--- a/net/http/http_auth_gssapi_posix.cc
+++ b/net/http/http_auth_gssapi_posix.cc
@@ -667,8 +667,7 @@
   DCHECK(library_);
 }
 
-HttpAuthGSSAPI::~HttpAuthGSSAPI() {
-}
+HttpAuthGSSAPI::~HttpAuthGSSAPI() = default;
 
 bool HttpAuthGSSAPI::Init() {
   if (!library_)
diff --git a/net/http/http_auth_handler.cc b/net/http/http_auth_handler.cc
index 3b0a4dce..5f035e0c 100644
--- a/net/http/http_auth_handler.cc
+++ b/net/http/http_auth_handler.cc
@@ -20,8 +20,7 @@
       properties_(-1) {
 }
 
-HttpAuthHandler::~HttpAuthHandler() {
-}
+HttpAuthHandler::~HttpAuthHandler() = default;
 
 bool HttpAuthHandler::InitFromChallenge(HttpAuthChallengeTokenizer* challenge,
                                         HttpAuth::Target target,
diff --git a/net/http/http_auth_handler_basic.cc b/net/http/http_auth_handler_basic.cc
index f756f05..ffec236 100644
--- a/net/http/http_auth_handler_basic.cc
+++ b/net/http/http_auth_handler_basic.cc
@@ -101,11 +101,9 @@
   return OK;
 }
 
-HttpAuthHandlerBasic::Factory::Factory() {
-}
+HttpAuthHandlerBasic::Factory::Factory() = default;
 
-HttpAuthHandlerBasic::Factory::~Factory() {
-}
+HttpAuthHandlerBasic::Factory::~Factory() = default;
 
 int HttpAuthHandlerBasic::Factory::CreateAuthHandler(
     HttpAuthChallengeTokenizer* challenge,
diff --git a/net/http/http_auth_handler_digest.cc b/net/http/http_auth_handler_digest.cc
index 39015ae7..58350701 100644
--- a/net/http/http_auth_handler_digest.cc
+++ b/net/http/http_auth_handler_digest.cc
@@ -49,14 +49,11 @@
 // auth-int |          | req-method:req-uri:MD5(req-entity-body)  |
 //=====================+==========================================+
 
-HttpAuthHandlerDigest::NonceGenerator::NonceGenerator() {
-}
+HttpAuthHandlerDigest::NonceGenerator::NonceGenerator() = default;
 
-HttpAuthHandlerDigest::NonceGenerator::~NonceGenerator() {
-}
+HttpAuthHandlerDigest::NonceGenerator::~NonceGenerator() = default;
 
-HttpAuthHandlerDigest::DynamicNonceGenerator::DynamicNonceGenerator() {
-}
+HttpAuthHandlerDigest::DynamicNonceGenerator::DynamicNonceGenerator() = default;
 
 std::string HttpAuthHandlerDigest::DynamicNonceGenerator::GenerateNonce()
     const {
@@ -82,8 +79,7 @@
     : nonce_generator_(new DynamicNonceGenerator()) {
 }
 
-HttpAuthHandlerDigest::Factory::~Factory() {
-}
+HttpAuthHandlerDigest::Factory::~Factory() = default;
 
 void HttpAuthHandlerDigest::Factory::set_nonce_generator(
     const NonceGenerator* nonce_generator) {
@@ -169,8 +165,7 @@
   DCHECK(nonce_generator_);
 }
 
-HttpAuthHandlerDigest::~HttpAuthHandlerDigest() {
-}
+HttpAuthHandlerDigest::~HttpAuthHandlerDigest() = default;
 
 // The digest challenge header looks like:
 //   WWW-Authenticate: Digest
diff --git a/net/http/http_auth_handler_factory.cc b/net/http/http_auth_handler_factory.cc
index 97f3f2f7..c04ed23 100644
--- a/net/http/http_auth_handler_factory.cc
+++ b/net/http/http_auth_handler_factory.cc
@@ -104,11 +104,9 @@
 
 }  // namespace
 
-HttpAuthHandlerRegistryFactory::HttpAuthHandlerRegistryFactory() {
-}
+HttpAuthHandlerRegistryFactory::HttpAuthHandlerRegistryFactory() = default;
 
-HttpAuthHandlerRegistryFactory::~HttpAuthHandlerRegistryFactory() {
-}
+HttpAuthHandlerRegistryFactory::~HttpAuthHandlerRegistryFactory() = default;
 
 void HttpAuthHandlerRegistryFactory::SetHttpAuthPreferences(
     const std::string& scheme,
diff --git a/net/http/http_auth_handler_factory_unittest.cc b/net/http/http_auth_handler_factory_unittest.cc
index a0e6bafd..277a776 100644
--- a/net/http/http_auth_handler_factory_unittest.cc
+++ b/net/http/http_auth_handler_factory_unittest.cc
@@ -29,7 +29,7 @@
  public:
   explicit MockHttpAuthHandlerFactory(int return_code) :
       return_code_(return_code) {}
-  ~MockHttpAuthHandlerFactory() override {}
+  ~MockHttpAuthHandlerFactory() override = default;
 
   int CreateAuthHandler(HttpAuthChallengeTokenizer* challenge,
                         HttpAuth::Target target,
diff --git a/net/http/http_auth_handler_mock.cc b/net/http/http_auth_handler_mock.cc
index 061f99b..c908100 100644
--- a/net/http/http_auth_handler_mock.cc
+++ b/net/http/http_auth_handler_mock.cc
@@ -50,8 +50,7 @@
       allows_explicit_credentials_(true),
       weak_factory_(this) {}
 
-HttpAuthHandlerMock::~HttpAuthHandlerMock() {
-}
+HttpAuthHandlerMock::~HttpAuthHandlerMock() = default;
 
 void HttpAuthHandlerMock::SetResolveExpectation(Resolve resolve) {
   EXPECT_EQ(RESOLVE_INIT, resolve_);
@@ -203,8 +202,7 @@
   // TODO(cbentzel): Default do_init_from_challenge_ to true.
 }
 
-HttpAuthHandlerMock::Factory::~Factory() {
-}
+HttpAuthHandlerMock::Factory::~Factory() = default;
 
 void HttpAuthHandlerMock::Factory::AddMockHandler(
     HttpAuthHandler* handler, HttpAuth::Target target) {
diff --git a/net/http/http_auth_handler_negotiate.cc b/net/http/http_auth_handler_negotiate.cc
index afe8c00..cfce66fb4 100644
--- a/net/http/http_auth_handler_negotiate.cc
+++ b/net/http/http_auth_handler_negotiate.cc
@@ -49,8 +49,7 @@
       is_unsupported_(false) {
 }
 
-HttpAuthHandlerNegotiate::Factory::~Factory() {
-}
+HttpAuthHandlerNegotiate::Factory::~Factory() = default;
 
 void HttpAuthHandlerNegotiate::Factory::set_host_resolver(
     HostResolver* resolver) {
@@ -139,8 +138,7 @@
       http_auth_preferences_(prefs) {
 }
 
-HttpAuthHandlerNegotiate::~HttpAuthHandlerNegotiate() {
-}
+HttpAuthHandlerNegotiate::~HttpAuthHandlerNegotiate() = default;
 
 std::string HttpAuthHandlerNegotiate::CreateSPN(const AddressList& address_list,
                                                 const GURL& origin) {
diff --git a/net/http/http_auth_handler_ntlm_portable.cc b/net/http/http_auth_handler_ntlm_portable.cc
index 2251b49..140bf6c 100644
--- a/net/http/http_auth_handler_ntlm_portable.cc
+++ b/net/http/http_auth_handler_ntlm_portable.cc
@@ -59,7 +59,7 @@
   return OK;
 }
 
-HttpAuthHandlerNTLM::~HttpAuthHandlerNTLM() {}
+HttpAuthHandlerNTLM::~HttpAuthHandlerNTLM() = default;
 
 // static
 HttpAuthHandlerNTLM::GetMSTimeProc HttpAuthHandlerNTLM::SetGetMSTimeProc(
@@ -85,9 +85,9 @@
   return old_proc;
 }
 
-HttpAuthHandlerNTLM::Factory::Factory() {}
+HttpAuthHandlerNTLM::Factory::Factory() = default;
 
-HttpAuthHandlerNTLM::Factory::~Factory() {}
+HttpAuthHandlerNTLM::Factory::~Factory() = default;
 
 ntlm::Buffer HttpAuthHandlerNTLM::GetNextToken(const ntlm::Buffer& in_token) {
   // If in_token is non-empty, then assume it contains a challenge message,
diff --git a/net/http/http_auth_preferences.cc b/net/http/http_auth_preferences.cc
index 64171d2..90848be 100644
--- a/net/http/http_auth_preferences.cc
+++ b/net/http/http_auth_preferences.cc
@@ -54,7 +54,7 @@
       security_manager_(URLSecurityManager::Create()) {
 }
 
-HttpAuthPreferences::~HttpAuthPreferences() {}
+HttpAuthPreferences::~HttpAuthPreferences() = default;
 
 bool HttpAuthPreferences::IsSupportedScheme(const std::string& scheme) const {
   return base::ContainsKey(auth_schemes_, scheme);
diff --git a/net/http/http_basic_state.cc b/net/http/http_basic_state.cc
index 90a2212c..0690de6 100644
--- a/net/http/http_basic_state.cc
+++ b/net/http/http_basic_state.cc
@@ -26,7 +26,7 @@
       http_09_on_non_default_ports_enabled_(
           http_09_on_non_default_ports_enabled) {}
 
-HttpBasicState::~HttpBasicState() {}
+HttpBasicState::~HttpBasicState() = default;
 
 int HttpBasicState::Initialize(const HttpRequestInfo* request_info,
                                RequestPriority priority,
diff --git a/net/http/http_basic_stream.cc b/net/http/http_basic_stream.cc
index d47e3f3..2fc6c4e5 100644
--- a/net/http/http_basic_stream.cc
+++ b/net/http/http_basic_stream.cc
@@ -21,7 +21,7 @@
              using_proxy,
              http_09_on_non_default_ports_enabled) {}
 
-HttpBasicStream::~HttpBasicStream() {}
+HttpBasicStream::~HttpBasicStream() = default;
 
 int HttpBasicStream::InitializeStream(const HttpRequestInfo* request_info,
                                       RequestPriority priority,
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index 7caf85c..0653b25 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -63,7 +63,7 @@
       path_(path),
       max_bytes_(max_bytes) {}
 
-HttpCache::DefaultBackend::~DefaultBackend() {}
+HttpCache::DefaultBackend::~DefaultBackend() = default;
 
 // static
 std::unique_ptr<HttpCache::BackendFactory> HttpCache::DefaultBackend::InMemory(
@@ -127,7 +127,7 @@
 // open cache entries or the backend itself.
 struct HttpCache::PendingOp {
   PendingOp() : disk_entry(NULL) {}
-  ~PendingOp() {}
+  ~PendingOp() = default;
 
   // Returns the estimate of dynamically allocated memory in bytes.
   size_t EstimateMemoryUsage() const {
@@ -172,7 +172,7 @@
         entry_(NULL),
         callback_(cb),
         backend_(backend) {}
-  ~WorkItem() {}
+  ~WorkItem() = default;
 
   // Calls back the transaction with the result of the operation.
   void NotifyTransaction(int result, ActiveEntry* entry) {
@@ -222,7 +222,7 @@
   explicit MetadataWriter(HttpCache::Transaction* trans)
       : verified_(false), buf_len_(0), transaction_(trans) {}
 
-  ~MetadataWriter() {}
+  ~MetadataWriter() = default;
 
   // Implements the bulk of HttpCache::WriteMetadata.
   void Write(const GURL& url,
diff --git a/net/http/http_cache_lookup_manager.cc b/net/http/http_cache_lookup_manager.cc
index 804c384..d3f1ef53 100644
--- a/net/http/http_cache_lookup_manager.cc
+++ b/net/http/http_cache_lookup_manager.cc
@@ -33,7 +33,7 @@
           net_log,
           NetLogSourceType::SERVER_PUSH_LOOKUP_TRANSACTION)) {}
 
-HttpCacheLookupManager::LookupTransaction::~LookupTransaction() {}
+HttpCacheLookupManager::LookupTransaction::~LookupTransaction() = default;
 
 int HttpCacheLookupManager::LookupTransaction::StartLookup(
     HttpCache* cache,
@@ -62,7 +62,7 @@
 HttpCacheLookupManager::HttpCacheLookupManager(HttpCache* http_cache)
     : http_cache_(http_cache), weak_factory_(this) {}
 
-HttpCacheLookupManager::~HttpCacheLookupManager() {}
+HttpCacheLookupManager::~HttpCacheLookupManager() = default;
 
 void HttpCacheLookupManager::OnPush(
     std::unique_ptr<ServerPushHelper> push_helper,
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc
index 883575c..4a6fbe8 100644
--- a/net/http/http_cache_unittest.cc
+++ b/net/http/http_cache_unittest.cc
@@ -341,7 +341,7 @@
   FastTransactionServer() {
     no_store = false;
   }
-  ~FastTransactionServer() {}
+  ~FastTransactionServer() = default;
 
   void set_no_store(bool value) { no_store = value; }
 
@@ -639,7 +639,7 @@
 class FakeWebSocketHandshakeStreamCreateHelper
     : public WebSocketHandshakeStreamBase::CreateHelper {
  public:
-  ~FakeWebSocketHandshakeStreamCreateHelper() override {}
+  ~FakeWebSocketHandshakeStreamCreateHelper() override = default;
   std::unique_ptr<WebSocketHandshakeStreamBase> CreateBasicStream(
       std::unique_ptr<ClientSocketHandle> connect,
       bool using_proxy) override {
diff --git a/net/http/http_cache_writers.cc b/net/http/http_cache_writers.cc
index 7c348381..0fcf1c6a 100644
--- a/net/http/http_cache_writers.cc
+++ b/net/http/http_cache_writers.cc
@@ -50,7 +50,7 @@
 HttpCache::Writers::Writers(HttpCache* cache, HttpCache::ActiveEntry* entry)
     : cache_(cache), entry_(entry), weak_factory_(this) {}
 
-HttpCache::Writers::~Writers() {}
+HttpCache::Writers::~Writers() = default;
 
 int HttpCache::Writers::Read(scoped_refptr<IOBuffer> buf,
                              int buf_len,
@@ -323,7 +323,7 @@
   DCHECK(!consumer_callback.is_null());
 }
 
-HttpCache::Writers::WaitingForRead::~WaitingForRead() {}
+HttpCache::Writers::WaitingForRead::~WaitingForRead() = default;
 HttpCache::Writers::WaitingForRead::WaitingForRead(const WaitingForRead&) =
     default;
 
diff --git a/net/http/http_cache_writers_unittest.cc b/net/http/http_cache_writers_unittest.cc
index 911cd2b2..cb05ec4 100644
--- a/net/http/http_cache_writers_unittest.cc
+++ b/net/http/http_cache_writers_unittest.cc
@@ -33,7 +33,8 @@
  public:
   TestHttpCacheTransaction(RequestPriority priority, HttpCache* cache)
       : HttpCache::Transaction(priority, cache){};
-  ~TestHttpCacheTransaction() override{};
+  ~TestHttpCacheTransaction() override = default;
+  ;
 
   Transaction::Mode mode() const override { return Transaction::READ_WRITE; }
 };
diff --git a/net/http/http_content_disposition.cc b/net/http/http_content_disposition.cc
index 05f3e193..da72593 100644
--- a/net/http/http_content_disposition.cc
+++ b/net/http/http_content_disposition.cc
@@ -339,8 +339,7 @@
   Parse(header, referrer_charset);
 }
 
-HttpContentDisposition::~HttpContentDisposition() {
-}
+HttpContentDisposition::~HttpContentDisposition() = default;
 
 std::string::const_iterator HttpContentDisposition::ConsumeDispositionType(
     std::string::const_iterator begin, std::string::const_iterator end) {
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 3d8b9d51..bcced4e 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -138,7 +138,7 @@
 
 HttpNetworkSession::Params::Params(const Params& other) = default;
 
-HttpNetworkSession::Params::~Params() {}
+HttpNetworkSession::Params::~Params() = default;
 
 HttpNetworkSession::Context::Context()
     : client_socket_factory(nullptr),
@@ -162,7 +162,7 @@
 
 HttpNetworkSession::Context::Context(const Context& other) = default;
 
-HttpNetworkSession::Context::~Context() {}
+HttpNetworkSession::Context::~Context() = default;
 
 // TODO(mbelshe): Move the socket factories into HttpStreamFactory.
 HttpNetworkSession::HttpNetworkSession(const Params& params,
diff --git a/net/http/http_network_session_peer.cc b/net/http/http_network_session_peer.cc
index 4a42dc2..9b33d98 100644
--- a/net/http/http_network_session_peer.cc
+++ b/net/http/http_network_session_peer.cc
@@ -17,7 +17,7 @@
 HttpNetworkSessionPeer::HttpNetworkSessionPeer(HttpNetworkSession* session)
     : session_(session) {}
 
-HttpNetworkSessionPeer::~HttpNetworkSessionPeer() {}
+HttpNetworkSessionPeer::~HttpNetworkSessionPeer() = default;
 
 void HttpNetworkSessionPeer::SetClientSocketPoolManager(
     std::unique_ptr<ClientSocketPoolManager> socket_pool_manager) {
diff --git a/net/http/http_network_transaction_ssl_unittest.cc b/net/http/http_network_transaction_ssl_unittest.cc
index b61a1e2..76f5e8c8 100644
--- a/net/http/http_network_transaction_ssl_unittest.cc
+++ b/net/http/http_network_transaction_ssl_unittest.cc
@@ -46,7 +46,7 @@
   void GetSSLConfig(SSLConfig* config) override { *config = ssl_config_; }
 
  private:
-  ~TokenBindingSSLConfigService() override {}
+  ~TokenBindingSSLConfigService() override = default;
 
   SSLConfig ssl_config_;
 };
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index dc821cf..615019cc 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -10183,8 +10183,8 @@
 TEST_F(HttpNetworkTransactionTest, CancelDuringInitRequestBody) {
   class FakeUploadElementReader : public UploadElementReader {
    public:
-    FakeUploadElementReader() {}
-    ~FakeUploadElementReader() override {}
+    FakeUploadElementReader() = default;
+    ~FakeUploadElementReader() override = default;
 
     const CompletionCallback& callback() const { return callback_; }
 
@@ -11513,8 +11513,8 @@
 
 class CapturingProxyResolver : public ProxyResolver {
  public:
-  CapturingProxyResolver() {}
-  ~CapturingProxyResolver() override {}
+  CapturingProxyResolver() = default;
+  ~CapturingProxyResolver() override = default;
 
   int GetProxyForURL(const GURL& url,
                      ProxyInfo* results,
@@ -13061,7 +13061,7 @@
  public:
   explicit UrlRecordingHttpAuthHandlerMock(GURL* url) : url_(url) {}
 
-  ~UrlRecordingHttpAuthHandlerMock() override {}
+  ~UrlRecordingHttpAuthHandlerMock() override = default;
 
  protected:
   int GenerateAuthTokenImpl(const AuthCredentials* credentials,
@@ -14263,7 +14263,7 @@
  public:
   explicit OneTimeCachingHostResolver(const HostPortPair& host_port)
       : MockHostResolverBase(/* use_caching = */ true), host_port_(host_port) {}
-  ~OneTimeCachingHostResolver() override {}
+  ~OneTimeCachingHostResolver() override = default;
 
   int ResolveFromCache(const RequestInfo& info,
                        AddressList* addresses,
@@ -15425,7 +15425,7 @@
                    public base::SupportsWeakPtr<FakeStream> {
  public:
   explicit FakeStream(RequestPriority priority) : priority_(priority) {}
-  ~FakeStream() override {}
+  ~FakeStream() override = default;
 
   RequestPriority priority() const { return priority_; }
 
@@ -15541,7 +15541,7 @@
         delegate_(delegate),
         websocket_stream_create_helper_(create_helper) {}
 
-  ~FakeStreamRequest() override {}
+  ~FakeStreamRequest() override = default;
 
   RequestPriority priority() const { return priority_; }
 
@@ -15595,8 +15595,8 @@
 // Fake HttpStreamFactory that vends FakeStreamRequests.
 class FakeStreamFactory : public HttpStreamFactory {
  public:
-  FakeStreamFactory() {}
-  ~FakeStreamFactory() override {}
+  FakeStreamFactory() = default;
+  ~FakeStreamFactory() override = default;
 
   // Returns a WeakPtr<> to the last HttpStreamRequest returned by
   // RequestStream() (which may be NULL if it was destroyed already).
@@ -15798,7 +15798,7 @@
         std::move(connection), using_proxy);
   }
 
-  ~FakeWebSocketStreamCreateHelper() override {}
+  ~FakeWebSocketStreamCreateHelper() override = default;
 
   virtual std::unique_ptr<WebSocketStream> Upgrade() {
     NOTREACHED();
diff --git a/net/http/http_proxy_client_socket_pool.cc b/net/http/http_proxy_client_socket_pool.cc
index 6dabad1..ab7bbb3 100644
--- a/net/http/http_proxy_client_socket_pool.cc
+++ b/net/http/http_proxy_client_socket_pool.cc
@@ -115,7 +115,7 @@
   }
 }
 
-HttpProxySocketParams::~HttpProxySocketParams() {}
+HttpProxySocketParams::~HttpProxySocketParams() = default;
 
 HttpProxyConnectJob::HttpProxyConnectJob(
     const std::string& group_name,
@@ -156,7 +156,7 @@
           params->proxy_delegate(),
           this->net_log())) {}
 
-HttpProxyConnectJob::~HttpProxyConnectJob() {}
+HttpProxyConnectJob::~HttpProxyConnectJob() = default;
 
 LoadState HttpProxyConnectJob::GetLoadState() const {
   return client_socket_->GetConnectLoadState();
@@ -285,8 +285,7 @@
     base_.AddLowerLayeredPool(ssl_pool_);
 }
 
-HttpProxyClientSocketPool::~HttpProxyClientSocketPool() {
-}
+HttpProxyClientSocketPool::~HttpProxyClientSocketPool() = default;
 
 int HttpProxyClientSocketPool::RequestSocket(const std::string& group_name,
                                              const void* socket_params,
diff --git a/net/http/http_proxy_client_socket_pool_unittest.cc b/net/http/http_proxy_client_socket_pool_unittest.cc
index 39eb4e14..2cf01c15 100644
--- a/net/http/http_proxy_client_socket_pool_unittest.cc
+++ b/net/http/http_proxy_client_socket_pool_unittest.cc
@@ -92,7 +92,7 @@
     session_ = CreateNetworkSession();
   }
 
-  virtual ~HttpProxyClientSocketPoolTest() {}
+  virtual ~HttpProxyClientSocketPoolTest() = default;
 
   // Initializes the field trial paramters for the field trial that determines
   // connection timeout based on the network quality.
diff --git a/net/http/http_proxy_client_socket_wrapper_unittest.cc b/net/http/http_proxy_client_socket_wrapper_unittest.cc
index bff691c..63398086 100644
--- a/net/http/http_proxy_client_socket_wrapper_unittest.cc
+++ b/net/http/http_proxy_client_socket_wrapper_unittest.cc
@@ -43,12 +43,12 @@
 
 class MockSSLConfigService : public SSLConfigService {
  public:
-  MockSSLConfigService() {}
+  MockSSLConfigService() = default;
 
   void GetSSLConfig(SSLConfig* config) override { *config = config_; }
 
  private:
-  ~MockSSLConfigService() override {}
+  ~MockSSLConfigService() override = default;
 
   SSLConfig config_;
 };
diff --git a/net/http/http_request_headers.cc b/net/http/http_request_headers.cc
index cf9433e..49881ea 100644
--- a/net/http/http_request_headers.cc
+++ b/net/http/http_request_headers.cc
@@ -44,8 +44,7 @@
 const char HttpRequestHeaders::kTokenBinding[] = "Sec-Token-Binding";
 const char HttpRequestHeaders::kUserAgent[] = "User-Agent";
 
-HttpRequestHeaders::HeaderKeyValuePair::HeaderKeyValuePair() {
-}
+HttpRequestHeaders::HeaderKeyValuePair::HeaderKeyValuePair() = default;
 
 HttpRequestHeaders::HeaderKeyValuePair::HeaderKeyValuePair(
     const base::StringPiece& key, const base::StringPiece& value)
@@ -58,7 +57,7 @@
       curr_(headers.headers_.begin()),
       end_(headers.headers_.end()) {}
 
-HttpRequestHeaders::Iterator::~Iterator() {}
+HttpRequestHeaders::Iterator::~Iterator() = default;
 
 bool HttpRequestHeaders::Iterator::GetNext() {
   if (!started_) {
@@ -73,10 +72,10 @@
   return curr_ != end_;
 }
 
-HttpRequestHeaders::HttpRequestHeaders() {}
+HttpRequestHeaders::HttpRequestHeaders() = default;
 HttpRequestHeaders::HttpRequestHeaders(const HttpRequestHeaders& other) =
     default;
-HttpRequestHeaders::~HttpRequestHeaders() {}
+HttpRequestHeaders::~HttpRequestHeaders() = default;
 
 bool HttpRequestHeaders::GetHeader(const base::StringPiece& key,
                                    std::string* out) const {
diff --git a/net/http/http_request_info.cc b/net/http/http_request_info.cc
index d51d3d0..8b0c010c 100644
--- a/net/http/http_request_info.cc
+++ b/net/http/http_request_info.cc
@@ -15,6 +15,6 @@
 
 HttpRequestInfo::HttpRequestInfo(const HttpRequestInfo& other) = default;
 
-HttpRequestInfo::~HttpRequestInfo() {}
+HttpRequestInfo::~HttpRequestInfo() = default;
 
 }  // namespace net
diff --git a/net/http/http_response_body_drainer.cc b/net/http/http_response_body_drainer.cc
index 4091c85..d6ad2a4 100644
--- a/net/http/http_response_body_drainer.cc
+++ b/net/http/http_response_body_drainer.cc
@@ -20,7 +20,7 @@
       total_read_(0),
       session_(NULL) {}
 
-HttpResponseBodyDrainer::~HttpResponseBodyDrainer() {}
+HttpResponseBodyDrainer::~HttpResponseBodyDrainer() = default;
 
 void HttpResponseBodyDrainer::Start(HttpNetworkSession* session) {
   read_buf_ = new IOBuffer(kDrainBodyBufferSize);
diff --git a/net/http/http_response_body_drainer_unittest.cc b/net/http/http_response_body_drainer_unittest.cc
index 422b5b9..9c5dfa8 100644
--- a/net/http/http_response_body_drainer_unittest.cc
+++ b/net/http/http_response_body_drainer_unittest.cc
@@ -84,7 +84,7 @@
         is_complete_(false),
         can_reuse_connection_(true),
         weak_factory_(this) {}
-  ~MockHttpStream() override {}
+  ~MockHttpStream() override = default;
 
   // HttpStream implementation.
   int InitializeStream(const HttpRequestInfo* request_info,
@@ -243,7 +243,7 @@
         mock_stream_(new MockHttpStream(&result_waiter_)),
         drainer_(new HttpResponseBodyDrainer(mock_stream_)) {}
 
-  ~HttpResponseBodyDrainerTest() override {}
+  ~HttpResponseBodyDrainerTest() override = default;
 
   HttpNetworkSession* CreateNetworkSession() {
     HttpNetworkSession::Context context;
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
index 85d321d2..59a8dd9 100644
--- a/net/http/http_response_headers.cc
+++ b/net/http/http_response_headers.cc
@@ -582,8 +582,7 @@
   return FindHeader(0, name) != std::string::npos;
 }
 
-HttpResponseHeaders::~HttpResponseHeaders() {
-}
+HttpResponseHeaders::~HttpResponseHeaders() = default;
 
 // Note: this implementation implicitly assumes that line_end points at a valid
 // sentinel character (such as '\0').
diff --git a/net/http/http_response_info.cc b/net/http/http_response_info.cc
index 21dd793a..35993f3 100644
--- a/net/http/http_response_info.cc
+++ b/net/http/http_response_info.cc
@@ -120,56 +120,12 @@
       unused_since_prefetch(false),
       connection_info(CONNECTION_INFO_UNKNOWN) {}
 
-HttpResponseInfo::HttpResponseInfo(const HttpResponseInfo& rhs)
-    : was_cached(rhs.was_cached),
-      cache_entry_status(rhs.cache_entry_status),
-      server_data_unavailable(rhs.server_data_unavailable),
-      network_accessed(rhs.network_accessed),
-      was_fetched_via_spdy(rhs.was_fetched_via_spdy),
-      was_alpn_negotiated(rhs.was_alpn_negotiated),
-      was_fetched_via_proxy(rhs.was_fetched_via_proxy),
-      proxy_server(rhs.proxy_server),
-      did_use_http_auth(rhs.did_use_http_auth),
-      unused_since_prefetch(rhs.unused_since_prefetch),
-      socket_address(rhs.socket_address),
-      alpn_negotiated_protocol(rhs.alpn_negotiated_protocol),
-      connection_info(rhs.connection_info),
-      request_time(rhs.request_time),
-      response_time(rhs.response_time),
-      auth_challenge(rhs.auth_challenge),
-      cert_request_info(rhs.cert_request_info),
-      ssl_info(rhs.ssl_info),
-      headers(rhs.headers),
-      vary_data(rhs.vary_data),
-      metadata(rhs.metadata) {}
+HttpResponseInfo::HttpResponseInfo(const HttpResponseInfo& rhs) = default;
 
-HttpResponseInfo::~HttpResponseInfo() {
-}
+HttpResponseInfo::~HttpResponseInfo() = default;
 
-HttpResponseInfo& HttpResponseInfo::operator=(const HttpResponseInfo& rhs) {
-  was_cached = rhs.was_cached;
-  cache_entry_status = rhs.cache_entry_status;
-  server_data_unavailable = rhs.server_data_unavailable;
-  network_accessed = rhs.network_accessed;
-  was_fetched_via_spdy = rhs.was_fetched_via_spdy;
-  proxy_server = rhs.proxy_server;
-  was_alpn_negotiated = rhs.was_alpn_negotiated;
-  was_fetched_via_proxy = rhs.was_fetched_via_proxy;
-  did_use_http_auth = rhs.did_use_http_auth;
-  unused_since_prefetch = rhs.unused_since_prefetch;
-  socket_address = rhs.socket_address;
-  alpn_negotiated_protocol = rhs.alpn_negotiated_protocol;
-  connection_info = rhs.connection_info;
-  request_time = rhs.request_time;
-  response_time = rhs.response_time;
-  auth_challenge = rhs.auth_challenge;
-  cert_request_info = rhs.cert_request_info;
-  ssl_info = rhs.ssl_info;
-  headers = rhs.headers;
-  vary_data = rhs.vary_data;
-  metadata = rhs.metadata;
-  return *this;
-}
+HttpResponseInfo& HttpResponseInfo::operator=(const HttpResponseInfo& rhs) =
+    default;
 
 bool HttpResponseInfo::InitFromPickle(const base::Pickle& pickle,
                                       bool* response_truncated) {
diff --git a/net/http/http_server_properties.cc b/net/http/http_server_properties.cc
index b28084586..7abba85 100644
--- a/net/http/http_server_properties.cc
+++ b/net/http/http_server_properties.cc
@@ -101,7 +101,7 @@
 
 AlternativeServiceInfo::AlternativeServiceInfo() : alternative_service_() {}
 
-AlternativeServiceInfo::~AlternativeServiceInfo() {}
+AlternativeServiceInfo::~AlternativeServiceInfo() = default;
 
 AlternativeServiceInfo::AlternativeServiceInfo(
     const AlternativeService& alternative_service,
diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc
index c7bb25b..38948714 100644
--- a/net/http/http_server_properties_manager.cc
+++ b/net/http/http_server_properties_manager.cc
@@ -91,7 +91,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 //  HttpServerPropertiesManager
 
-HttpServerPropertiesManager::PrefDelegate::~PrefDelegate() {}
+HttpServerPropertiesManager::PrefDelegate::~PrefDelegate() = default;
 
 HttpServerPropertiesManager::HttpServerPropertiesManager(
     std::unique_ptr<PrefDelegate> pref_delegate,
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc
index 0c5484da..e5eea96 100644
--- a/net/http/http_server_properties_manager_unittest.cc
+++ b/net/http/http_server_properties_manager_unittest.cc
@@ -39,8 +39,8 @@
 
 class MockPrefDelegate : public net::HttpServerPropertiesManager::PrefDelegate {
  public:
-  MockPrefDelegate() {}
-  ~MockPrefDelegate() override {}
+  MockPrefDelegate() = default;
+  ~MockPrefDelegate() override = default;
 
   // HttpServerPropertiesManager::PrefDelegate implementation.
   const base::DictionaryValue* GetServerProperties() const override {
diff --git a/net/http/http_stream_factory.cc b/net/http/http_stream_factory.cc
index 6a8cfa6..077ec56c 100644
--- a/net/http/http_stream_factory.cc
+++ b/net/http/http_stream_factory.cc
@@ -22,7 +22,7 @@
 
 namespace net {
 
-HttpStreamFactory::~HttpStreamFactory() {}
+HttpStreamFactory::~HttpStreamFactory() = default;
 
 void HttpStreamFactory::ProcessAlternativeServices(
     HttpNetworkSession* session,
@@ -84,7 +84,7 @@
       RewriteHost(http_server), alternative_service_info_vector);
 }
 
-HttpStreamFactory::HttpStreamFactory() {}
+HttpStreamFactory::HttpStreamFactory() = default;
 
 url::SchemeHostPort HttpStreamFactory::RewriteHost(
     const url::SchemeHostPort& server) {
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
index e344d9b..8b1a2a4 100644
--- a/net/http/http_stream_factory_impl_job.cc
+++ b/net/http/http_stream_factory_impl_job.cc
@@ -1456,9 +1456,9 @@
   delegate_->AddConnectionAttemptsToRequest(this, socket_attempts);
 }
 
-HttpStreamFactoryImpl::JobFactory::JobFactory() {}
+HttpStreamFactoryImpl::JobFactory::JobFactory() = default;
 
-HttpStreamFactoryImpl::JobFactory::~JobFactory() {}
+HttpStreamFactoryImpl::JobFactory::~JobFactory() = default;
 
 std::unique_ptr<HttpStreamFactoryImpl::Job>
 HttpStreamFactoryImpl::JobFactory::CreateMainJob(
diff --git a/net/http/http_stream_factory_impl_job_controller_unittest.cc b/net/http/http_stream_factory_impl_job_controller_unittest.cc
index 43c03f7f..ac8124de 100644
--- a/net/http/http_stream_factory_impl_job_controller_unittest.cc
+++ b/net/http/http_stream_factory_impl_job_controller_unittest.cc
@@ -91,7 +91,7 @@
 class FailingHostResolver : public MockHostResolverBase {
  public:
   FailingHostResolver() : MockHostResolverBase(false /*use_caching*/) {}
-  ~FailingHostResolver() override {}
+  ~FailingHostResolver() override = default;
 
   int Resolve(const RequestInfo& info,
               RequestPriority priority,
@@ -108,7 +108,7 @@
 class HangingResolver : public MockHostResolverBase {
  public:
   HangingResolver() : MockHostResolverBase(false /*use_caching*/) {}
-  ~HangingResolver() override {}
+  ~HangingResolver() override = default;
 
   int Resolve(const RequestInfo& info,
               RequestPriority priority,
@@ -123,8 +123,8 @@
 // A mock HttpServerProperties that always returns false for IsInitialized().
 class MockHttpServerProperties : public HttpServerPropertiesImpl {
  public:
-  MockHttpServerProperties() {}
-  ~MockHttpServerProperties() override {}
+  MockHttpServerProperties() = default;
+  ~MockHttpServerProperties() override = default;
   bool IsInitialized() const override { return false; }
 };
 
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc
index 5c3a0a0..b6a1a48 100644
--- a/net/http/http_stream_factory_impl_unittest.cc
+++ b/net/http/http_stream_factory_impl_unittest.cc
@@ -91,7 +91,7 @@
 
   explicit MockWebSocketHandshakeStream(StreamType type) : type_(type) {}
 
-  ~MockWebSocketHandshakeStream() override {}
+  ~MockWebSocketHandshakeStream() override = default;
 
   StreamType type() const {
     return type_;
@@ -318,7 +318,7 @@
 class WebSocketStreamCreateHelper
     : public WebSocketHandshakeStreamBase::CreateHelper {
  public:
-  ~WebSocketStreamCreateHelper() override {}
+  ~WebSocketStreamCreateHelper() override = default;
 
   std::unique_ptr<WebSocketHandshakeStreamBase> CreateBasicStream(
       std::unique_ptr<ClientSocketHandle> connection,
@@ -835,7 +835,7 @@
  public:
   MockQuicData() : packet_number_(0) {}
 
-  ~MockQuicData() {}
+  ~MockQuicData() = default;
 
   void AddRead(std::unique_ptr<QuicEncryptedPacket> packet) {
     reads_.push_back(
diff --git a/net/http/http_stream_factory_test_util.cc b/net/http/http_stream_factory_test_util.cc
index fff12f7..264030e 100644
--- a/net/http/http_stream_factory_test_util.cc
+++ b/net/http/http_stream_factory_test_util.cc
@@ -11,9 +11,9 @@
 using ::testing::_;
 
 namespace net {
-MockHttpStreamRequestDelegate::MockHttpStreamRequestDelegate() {}
+MockHttpStreamRequestDelegate::MockHttpStreamRequestDelegate() = default;
 
-MockHttpStreamRequestDelegate::~MockHttpStreamRequestDelegate() {}
+MockHttpStreamRequestDelegate::~MockHttpStreamRequestDelegate() = default;
 
 MockHttpStreamFactoryImplJob::MockHttpStreamFactoryImplJob(
     HttpStreamFactoryImpl::Job::Delegate* delegate,
@@ -49,14 +49,14 @@
   DCHECK(!is_waiting());
 }
 
-MockHttpStreamFactoryImplJob::~MockHttpStreamFactoryImplJob() {}
+MockHttpStreamFactoryImplJob::~MockHttpStreamFactoryImplJob() = default;
 
 TestJobFactory::TestJobFactory()
     : main_job_(nullptr),
       alternative_job_(nullptr),
       override_main_job_url_(false) {}
 
-TestJobFactory::~TestJobFactory() {}
+TestJobFactory::~TestJobFactory() = default;
 
 std::unique_ptr<HttpStreamFactoryImpl::Job> TestJobFactory::CreateMainJob(
     HttpStreamFactoryImpl::Job::Delegate* delegate,
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc
index 1d5dec49..ced3da36 100644
--- a/net/http/http_stream_parser.cc
+++ b/net/http/http_stream_parser.cc
@@ -211,8 +211,7 @@
                             weak_ptr_factory_.GetWeakPtr());
 }
 
-HttpStreamParser::~HttpStreamParser() {
-}
+HttpStreamParser::~HttpStreamParser() = default;
 
 int HttpStreamParser::SendRequest(const std::string& request_line,
                                   const HttpRequestHeaders& headers,
diff --git a/net/http/http_transaction_test_util.cc b/net/http/http_transaction_test_util.cc
index 8a481e0..9ab28f7 100644
--- a/net/http/http_transaction_test_util.cc
+++ b/net/http/http_transaction_test_util.cc
@@ -189,8 +189,7 @@
   ++quit_counter_;
 }
 
-TestTransactionConsumer::~TestTransactionConsumer() {
-}
+TestTransactionConsumer::~TestTransactionConsumer() = default;
 
 void TestTransactionConsumer::Start(const HttpRequestInfo* request,
                                     const NetLogWithSource& net_log) {
@@ -558,7 +557,7 @@
       clock_(nullptr) {
 }
 
-MockNetworkLayer::~MockNetworkLayer() {}
+MockNetworkLayer::~MockNetworkLayer() = default;
 
 void MockNetworkLayer::TransactionDoneReading() {
   CHECK(!done_reading_called_);
diff --git a/net/http/http_util.cc b/net/http/http_util.cc
index 0bf40c3..9361272 100644
--- a/net/http/http_util.cc
+++ b/net/http/http_util.cc
@@ -870,8 +870,7 @@
     : lines_(headers_begin, headers_end, line_delimiter) {
 }
 
-HttpUtil::HeadersIterator::~HeadersIterator() {
-}
+HttpUtil::HeadersIterator::~HeadersIterator() = default;
 
 bool HttpUtil::HeadersIterator::GetNext() {
   while (lines_.GetNext()) {
@@ -929,8 +928,7 @@
 
 HttpUtil::ValuesIterator::ValuesIterator(const ValuesIterator& other) = default;
 
-HttpUtil::ValuesIterator::~ValuesIterator() {
-}
+HttpUtil::ValuesIterator::~ValuesIterator() = default;
 
 bool HttpUtil::ValuesIterator::GetNext() {
   while (values_.GetNext()) {
@@ -977,7 +975,7 @@
 HttpUtil::NameValuePairsIterator::NameValuePairsIterator(
     const NameValuePairsIterator& other) = default;
 
-HttpUtil::NameValuePairsIterator::~NameValuePairsIterator() {}
+HttpUtil::NameValuePairsIterator::~NameValuePairsIterator() = default;
 
 // We expect properties to be formatted as one of:
 //   name="value"
diff --git a/net/http/mock_allow_http_auth_preferences.cc b/net/http/mock_allow_http_auth_preferences.cc
index 12a4867..12ccfe2 100644
--- a/net/http/mock_allow_http_auth_preferences.cc
+++ b/net/http/mock_allow_http_auth_preferences.cc
@@ -7,9 +7,9 @@
 
 namespace net {
 
-MockAllowHttpAuthPreferences::MockAllowHttpAuthPreferences() {}
+MockAllowHttpAuthPreferences::MockAllowHttpAuthPreferences() = default;
 
-MockAllowHttpAuthPreferences::~MockAllowHttpAuthPreferences() {}
+MockAllowHttpAuthPreferences::~MockAllowHttpAuthPreferences() = default;
 
 bool MockAllowHttpAuthPreferences::CanUseDefaultCredentials(
     const GURL& auth_origin) const {
diff --git a/net/http/mock_gssapi_library_posix.cc b/net/http/mock_gssapi_library_posix.cc
index 2e4c3c11..b129f2e 100644
--- a/net/http/mock_gssapi_library_posix.cc
+++ b/net/http/mock_gssapi_library_posix.cc
@@ -229,13 +229,11 @@
 MockGSSAPILibrary::SecurityContextQuery::SecurityContextQuery(
     const SecurityContextQuery& other) = default;
 
-MockGSSAPILibrary::SecurityContextQuery::~SecurityContextQuery() {}
+MockGSSAPILibrary::SecurityContextQuery::~SecurityContextQuery() = default;
 
-MockGSSAPILibrary::MockGSSAPILibrary() {
-}
+MockGSSAPILibrary::MockGSSAPILibrary() = default;
 
-MockGSSAPILibrary::~MockGSSAPILibrary() {
-}
+MockGSSAPILibrary::~MockGSSAPILibrary() = default;
 
 void MockGSSAPILibrary::ExpectSecurityContext(
     const std::string& expected_package,
diff --git a/net/http/mock_http_cache.cc b/net/http/mock_http_cache.cc
index f1cb3a27..8c940f3 100644
--- a/net/http/mock_http_cache.cc
+++ b/net/http/mock_http_cache.cc
@@ -328,8 +328,7 @@
     StoreAndDeliverCallbacks(false, NULL, CompletionCallback(), 0);
 }
 
-MockDiskEntry::~MockDiskEntry() {
-}
+MockDiskEntry::~MockDiskEntry() = default;
 
 // Unlike the callbacks for MockHttpTransaction, we want this one to run even
 // if the consumer called Close on the MockDiskEntry.  We achieve that by
@@ -779,8 +778,7 @@
       fail_(false) {
 }
 
-MockBlockingBackendFactory::~MockBlockingBackendFactory() {
-}
+MockBlockingBackendFactory::~MockBlockingBackendFactory() = default;
 
 int MockBlockingBackendFactory::CreateBackend(
     NetLog* net_log,
diff --git a/net/http/partial_data.cc b/net/http/partial_data.cc
index dceea25b..7243fcf 100644
--- a/net/http/partial_data.cc
+++ b/net/http/partial_data.cc
@@ -43,8 +43,7 @@
       weak_factory_(this) {
 }
 
-PartialData::~PartialData() {
-}
+PartialData::~PartialData() = default;
 
 bool PartialData::Init(const HttpRequestHeaders& headers) {
   std::string range_header;
diff --git a/net/http/proxy_connect_redirect_http_stream.cc b/net/http/proxy_connect_redirect_http_stream.cc
index 26e5b6a..2fc8eb8 100644
--- a/net/http/proxy_connect_redirect_http_stream.cc
+++ b/net/http/proxy_connect_redirect_http_stream.cc
@@ -18,7 +18,7 @@
     load_timing_info_ = *load_timing_info;
 }
 
-ProxyConnectRedirectHttpStream::~ProxyConnectRedirectHttpStream() {}
+ProxyConnectRedirectHttpStream::~ProxyConnectRedirectHttpStream() = default;
 
 int ProxyConnectRedirectHttpStream::InitializeStream(
     const HttpRequestInfo* request_info,
diff --git a/net/http/transport_security_persister_unittest.cc b/net/http/transport_security_persister_unittest.cc
index b742353..3ad2988 100644
--- a/net/http/transport_security_persister_unittest.cc
+++ b/net/http/transport_security_persister_unittest.cc
@@ -27,8 +27,7 @@
 
 class TransportSecurityPersisterTest : public testing::Test {
  public:
-  TransportSecurityPersisterTest() {
-  }
+  TransportSecurityPersisterTest() = default;
 
   ~TransportSecurityPersisterTest() override {
     EXPECT_TRUE(base::MessageLoopForIO::IsCurrent());
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc
index 425b387..a433afd 100644
--- a/net/http/transport_security_state.cc
+++ b/net/http/transport_security_state.cc
@@ -1775,8 +1775,7 @@
     : upgrade_mode(MODE_DEFAULT), include_subdomains(false) {
 }
 
-TransportSecurityState::STSState::~STSState() {
-}
+TransportSecurityState::STSState::~STSState() = default;
 
 bool TransportSecurityState::STSState::ShouldUpgradeToSSL() const {
   return upgrade_mode == MODE_FORCE_HTTPS;
@@ -1788,20 +1787,18 @@
       end_(state.enabled_sts_hosts_.end()) {
 }
 
-TransportSecurityState::STSStateIterator::~STSStateIterator() {
-}
+TransportSecurityState::STSStateIterator::~STSStateIterator() = default;
 
 TransportSecurityState::PKPState::PKPState() : include_subdomains(false) {
 }
 
 TransportSecurityState::PKPState::PKPState(const PKPState& other) = default;
 
-TransportSecurityState::PKPState::~PKPState() {
-}
+TransportSecurityState::PKPState::~PKPState() = default;
 
 TransportSecurityState::ExpectCTState::ExpectCTState() : enforce(false) {}
 
-TransportSecurityState::ExpectCTState::~ExpectCTState() {}
+TransportSecurityState::ExpectCTState::~ExpectCTState() = default;
 
 TransportSecurityState::ExpectCTStateIterator::ExpectCTStateIterator(
     const TransportSecurityState& state)
@@ -1810,12 +1807,13 @@
   state.AssertCalledOnValidThread();
 }
 
-TransportSecurityState::ExpectCTStateIterator::~ExpectCTStateIterator() {}
+TransportSecurityState::ExpectCTStateIterator::~ExpectCTStateIterator() =
+    default;
 
 TransportSecurityState::ExpectStapleState::ExpectStapleState()
     : include_subdomains(false) {}
 
-TransportSecurityState::ExpectStapleState::~ExpectStapleState() {}
+TransportSecurityState::ExpectStapleState::~ExpectStapleState() = default;
 
 bool TransportSecurityState::PKPState::CheckPublicKeyPins(
     const HashValueVector& hashes,
@@ -1862,7 +1860,6 @@
       end_(state.enabled_pkp_hosts_.end()) {
 }
 
-TransportSecurityState::PKPStateIterator::~PKPStateIterator() {
-}
+TransportSecurityState::PKPStateIterator::~PKPStateIterator() = default;
 
 }  // namespace net
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc
index 373e176..d7a0df2 100644
--- a/net/http/transport_security_state_unittest.cc
+++ b/net/http/transport_security_state_unittest.cc
@@ -113,8 +113,8 @@
 class MockCertificateReportSender
     : public TransportSecurityState::ReportSenderInterface {
  public:
-  MockCertificateReportSender() {}
-  ~MockCertificateReportSender() override {}
+  MockCertificateReportSender() = default;
+  ~MockCertificateReportSender() override = default;
 
   void Send(const GURL& report_uri,
             base::StringPiece content_type,
@@ -148,7 +148,7 @@
     : public TransportSecurityState::ReportSenderInterface {
  public:
   MockFailingCertificateReportSender() : net_error_(ERR_CONNECTION_FAILED) {}
-  ~MockFailingCertificateReportSender() override {}
+  ~MockFailingCertificateReportSender() override = default;
 
   int net_error() { return net_error_; }
 
@@ -172,7 +172,7 @@
 class MockExpectCTReporter : public TransportSecurityState::ExpectCTReporter {
  public:
   MockExpectCTReporter() : num_failures_(0) {}
-  ~MockExpectCTReporter() override {}
+  ~MockExpectCTReporter() override = default;
 
   void OnExpectCTFailed(const HostPortPair& host_port_pair,
                         const GURL& report_uri,
diff --git a/net/http/url_security_manager.cc b/net/http/url_security_manager.cc
index 0d992919..9c94243 100644
--- a/net/http/url_security_manager.cc
+++ b/net/http/url_security_manager.cc
@@ -10,9 +10,9 @@
 
 namespace net {
 
-URLSecurityManagerWhitelist::URLSecurityManagerWhitelist() {}
+URLSecurityManagerWhitelist::URLSecurityManagerWhitelist() = default;
 
-URLSecurityManagerWhitelist::~URLSecurityManagerWhitelist() {}
+URLSecurityManagerWhitelist::~URLSecurityManagerWhitelist() = default;
 
 bool URLSecurityManagerWhitelist::CanUseDefaultCredentials(
     const GURL& auth_origin) const  {
diff --git a/net/network_error_logging/network_error_logging_service.cc b/net/network_error_logging/network_error_logging_service.cc
index bb2b152..b1773129 100644
--- a/net/network_error_logging/network_error_logging_service.cc
+++ b/net/network_error_logging/network_error_logging_service.cc
@@ -134,7 +134,7 @@
   return base::WrapUnique(new NetworkErrorLoggingService());
 }
 
-NetworkErrorLoggingService::~NetworkErrorLoggingService() {}
+NetworkErrorLoggingService::~NetworkErrorLoggingService() = default;
 
 void NetworkErrorLoggingService::SetReportingService(
     ReportingService* reporting_service) {
diff --git a/net/network_error_logging/network_error_logging_service_unittest.cc b/net/network_error_logging/network_error_logging_service_unittest.cc
index a41d2b1..e7192e0f 100644
--- a/net/network_error_logging/network_error_logging_service_unittest.cc
+++ b/net/network_error_logging/network_error_logging_service_unittest.cc
@@ -29,7 +29,7 @@
 class TestReportingService : public ReportingService {
  public:
   struct Report {
-    Report() {}
+    Report() = default;
 
     Report(Report&& other)
         : url(other.url),
@@ -43,7 +43,7 @@
            std::unique_ptr<const base::Value> body)
         : url(url), group(group), type(type), body(std::move(body)) {}
 
-    ~Report() {}
+    ~Report() = default;
 
     GURL url;
     std::string group;
@@ -54,13 +54,13 @@
     DISALLOW_COPY(Report);
   };
 
-  TestReportingService() {}
+  TestReportingService() = default;
 
   const std::vector<Report>& reports() const { return reports_; }
 
   // ReportingService implementation:
 
-  ~TestReportingService() override {}
+  ~TestReportingService() override = default;
 
   void QueueReport(const GURL& url,
                    const std::string& group,
diff --git a/net/nqe/cached_network_quality.cc b/net/nqe/cached_network_quality.cc
index 9b78de2..2343a1b 100644
--- a/net/nqe/cached_network_quality.cc
+++ b/net/nqe/cached_network_quality.cc
@@ -30,7 +30,7 @@
 CachedNetworkQuality::CachedNetworkQuality(const CachedNetworkQuality& other) =
     default;
 
-CachedNetworkQuality::~CachedNetworkQuality() {}
+CachedNetworkQuality::~CachedNetworkQuality() = default;
 
 CachedNetworkQuality& CachedNetworkQuality::operator=(
     const CachedNetworkQuality& other) = default;
diff --git a/net/nqe/network_id.cc b/net/nqe/network_id.cc
index 18d08a19..3e5fbe5e 100644
--- a/net/nqe/network_id.cc
+++ b/net/nqe/network_id.cc
@@ -33,9 +33,9 @@
                      const std::string& id)
     : type(type), id(id) {}
 
-NetworkID::NetworkID(const NetworkID& other) : type(other.type), id(other.id) {}
+NetworkID::NetworkID(const NetworkID& other) = default;
 
-NetworkID::~NetworkID() {}
+NetworkID::~NetworkID() = default;
 
 bool NetworkID::operator==(const NetworkID& other) const {
   return type == other.type && id == other.id;
@@ -45,11 +45,7 @@
   return !operator==(other);
 }
 
-NetworkID& NetworkID::operator=(const NetworkID& other) {
-  type = other.type;
-  id = other.id;
-  return *this;
-}
+NetworkID& NetworkID::operator=(const NetworkID& other) = default;
 
 // Overloaded to support ordered collections.
 bool NetworkID::operator<(const NetworkID& other) const {
diff --git a/net/nqe/network_quality.cc b/net/nqe/network_quality.cc
index f54b00b..cff98ab 100644
--- a/net/nqe/network_quality.cc
+++ b/net/nqe/network_quality.cc
@@ -29,7 +29,7 @@
                      other.transport_rtt_,
                      other.downstream_throughput_kbps_) {}
 
-NetworkQuality::~NetworkQuality() {}
+NetworkQuality::~NetworkQuality() = default;
 
 NetworkQuality& NetworkQuality::operator=(const NetworkQuality& other) {
   http_rtt_ = other.http_rtt_;
diff --git a/net/nqe/network_quality_estimator_params.cc b/net/nqe/network_quality_estimator_params.cc
index c63fd8f..c393f54 100644
--- a/net/nqe/network_quality_estimator_params.cc
+++ b/net/nqe/network_quality_estimator_params.cc
@@ -468,8 +468,7 @@
   ObtainConnectionThresholds(params_, connection_thresholds_);
 }
 
-NetworkQualityEstimatorParams::~NetworkQualityEstimatorParams() {
-}
+NetworkQualityEstimatorParams::~NetworkQualityEstimatorParams() = default;
 
 void NetworkQualityEstimatorParams::SetUseSmallResponsesForTesting(
     bool use_small_responses) {
diff --git a/net/nqe/network_quality_estimator_test_util.cc b/net/nqe/network_quality_estimator_test_util.cc
index 9bcfe4d2..d9d21f7 100644
--- a/net/nqe/network_quality_estimator_test_util.cc
+++ b/net/nqe/network_quality_estimator_test_util.cc
@@ -100,7 +100,7 @@
   EXPECT_TRUE(embedded_test_server_.Start());
 }
 
-TestNetworkQualityEstimator::~TestNetworkQualityEstimator() {}
+TestNetworkQualityEstimator::~TestNetworkQualityEstimator() = default;
 
 void TestNetworkQualityEstimator::RunOneRequest() {
   TestDelegate test_delegate;
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc
index 7a1663d..b8854e3 100644
--- a/net/nqe/network_quality_estimator_unittest.cc
+++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -1358,7 +1358,7 @@
 class InvalidExternalEstimateProvider : public ExternalEstimateProvider {
  public:
   InvalidExternalEstimateProvider() : update_count_(0) {}
-  ~InvalidExternalEstimateProvider() override {}
+  ~InvalidExternalEstimateProvider() override = default;
 
   void SetUpdatedEstimateDelegate(UpdatedEstimateDelegate* delegate) override {}
 
@@ -1420,7 +1420,7 @@
         downstream_throughput_kbps_(downstream_throughput_kbps),
         update_count_(0),
         cached_estimate_cleared_(false) {}
-  ~TestExternalEstimateProvider() override {}
+  ~TestExternalEstimateProvider() override = default;
 
   void SetUpdatedEstimateDelegate(UpdatedEstimateDelegate* delegate) override {
     delegate_ = delegate;
@@ -2872,7 +2872,7 @@
       : network_id_(net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
                     std::string()),
         notification_received_(0) {}
-  ~TestNetworkQualitiesCacheObserver() override {}
+  ~TestNetworkQualitiesCacheObserver() override = default;
 
   void OnChangeInCachedNetworkQuality(
       const nqe::internal::NetworkID& network_id,
diff --git a/net/nqe/network_quality_observation.cc b/net/nqe/network_quality_observation.cc
index b7411304..01827d5a 100644
--- a/net/nqe/network_quality_observation.cc
+++ b/net/nqe/network_quality_observation.cc
@@ -34,7 +34,7 @@
 
 Observation& Observation::operator=(const Observation& other) = default;
 
-Observation::~Observation() {}
+Observation::~Observation() = default;
 
 ObservationCategory Observation::GetObservationCategory() const {
   switch (source_) {
diff --git a/net/nqe/observation_buffer.cc b/net/nqe/observation_buffer.cc
index 7101e22e..beb9359 100644
--- a/net/nqe/observation_buffer.cc
+++ b/net/nqe/observation_buffer.cc
@@ -39,7 +39,7 @@
   DCHECK(tick_clock_);
 }
 
-ObservationBuffer::~ObservationBuffer() {}
+ObservationBuffer::~ObservationBuffer() = default;
 
 void ObservationBuffer::AddObservation(const Observation& observation) {
   DCHECK_LE(observations_.size(), params_->observation_buffer_size());
diff --git a/net/nqe/socket_watcher.cc b/net/nqe/socket_watcher.cc
index 98639b7..d10508b 100644
--- a/net/nqe/socket_watcher.cc
+++ b/net/nqe/socket_watcher.cc
@@ -77,7 +77,7 @@
   DCHECK(last_rtt_notification_.is_null());
 }
 
-SocketWatcher::~SocketWatcher() {}
+SocketWatcher::~SocketWatcher() = default;
 
 bool SocketWatcher::ShouldNotifyUpdatedRTT() const {
   DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/net/nqe/socket_watcher_factory.cc b/net/nqe/socket_watcher_factory.cc
index fb8a596..e20cb0c 100644
--- a/net/nqe/socket_watcher_factory.cc
+++ b/net/nqe/socket_watcher_factory.cc
@@ -28,7 +28,7 @@
   DCHECK(tick_clock_);
 }
 
-SocketWatcherFactory::~SocketWatcherFactory() {}
+SocketWatcherFactory::~SocketWatcherFactory() = default;
 
 std::unique_ptr<SocketPerformanceWatcher>
 SocketWatcherFactory::CreateSocketPerformanceWatcher(
diff --git a/net/nqe/throughput_analyzer_unittest.cc b/net/nqe/throughput_analyzer_unittest.cc
index f1913e7..66432232 100644
--- a/net/nqe/throughput_analyzer_unittest.cc
+++ b/net/nqe/throughput_analyzer_unittest.cc
@@ -74,7 +74,7 @@
         throughput_observations_received_(0),
         bits_received_(0) {}
 
-  ~TestThroughputAnalyzer() override {}
+  ~TestThroughputAnalyzer() override = default;
 
   int32_t throughput_observations_received() const {
     return throughput_observations_received_;
diff --git a/net/proxy/proxy_resolver_v8_tracing.cc b/net/proxy/proxy_resolver_v8_tracing.cc
index 43495b3..4e95dcd 100644
--- a/net/proxy/proxy_resolver_v8_tracing.cc
+++ b/net/proxy/proxy_resolver_v8_tracing.cc
@@ -1081,8 +1081,8 @@
   DISALLOW_COPY_AND_ASSIGN(CreateJob);
 };
 
-ProxyResolverV8TracingFactoryImpl::ProxyResolverV8TracingFactoryImpl() {
-}
+ProxyResolverV8TracingFactoryImpl::ProxyResolverV8TracingFactoryImpl() =
+    default;
 
 ProxyResolverV8TracingFactoryImpl::~ProxyResolverV8TracingFactoryImpl() {
   for (auto* job : jobs_) {
diff --git a/net/server/http_connection.cc b/net/server/http_connection.cc
index 092b4e9f4..99324350 100644
--- a/net/server/http_connection.cc
+++ b/net/server/http_connection.cc
@@ -156,8 +156,7 @@
       read_buf_(new ReadIOBuffer()),
       write_buf_(new QueuedWriteIOBuffer()) {}
 
-HttpConnection::~HttpConnection() {
-}
+HttpConnection::~HttpConnection() = default;
 
 void HttpConnection::SetWebSocket(std::unique_ptr<WebSocket> web_socket) {
   DCHECK(!web_socket_);
diff --git a/net/server/http_server.cc b/net/server/http_server.cc
index a647e2ce..142c2e36 100644
--- a/net/server/http_server.cc
+++ b/net/server/http_server.cc
@@ -41,8 +41,7 @@
       base::Bind(&HttpServer::DoAcceptLoop, weak_ptr_factory_.GetWeakPtr()));
 }
 
-HttpServer::~HttpServer() {
-}
+HttpServer::~HttpServer() = default;
 
 void HttpServer::AcceptWebSocket(
     int connection_id,
diff --git a/net/server/http_server_request_info.cc b/net/server/http_server_request_info.cc
index 765ddc0..58021cf 100644
--- a/net/server/http_server_request_info.cc
+++ b/net/server/http_server_request_info.cc
@@ -9,12 +9,12 @@
 
 namespace net {
 
-HttpServerRequestInfo::HttpServerRequestInfo() {}
+HttpServerRequestInfo::HttpServerRequestInfo() = default;
 
 HttpServerRequestInfo::HttpServerRequestInfo(
     const HttpServerRequestInfo& other) = default;
 
-HttpServerRequestInfo::~HttpServerRequestInfo() {}
+HttpServerRequestInfo::~HttpServerRequestInfo() = default;
 
 std::string HttpServerRequestInfo::GetHeaderValue(
     const std::string& header_name) const {
diff --git a/net/server/http_server_response_info.cc b/net/server/http_server_response_info.cc
index 7c195812..7a81025 100644
--- a/net/server/http_server_response_info.cc
+++ b/net/server/http_server_response_info.cc
@@ -18,7 +18,7 @@
 HttpServerResponseInfo::HttpServerResponseInfo(
     const HttpServerResponseInfo& other) = default;
 
-HttpServerResponseInfo::~HttpServerResponseInfo() {}
+HttpServerResponseInfo::~HttpServerResponseInfo() = default;
 
 // static
 HttpServerResponseInfo HttpServerResponseInfo::CreateFor404() {
diff --git a/net/server/http_server_unittest.cc b/net/server/http_server_unittest.cc
index af4ab98..cd60a7f 100644
--- a/net/server/http_server_unittest.cc
+++ b/net/server/http_server_unittest.cc
@@ -61,7 +61,7 @@
 
 class TestHttpClient {
  public:
-  TestHttpClient() {}
+  TestHttpClient() = default;
 
   int ConnectAndWait(const IPEndPoint& address) {
     AddressList addresses(address);
@@ -453,7 +453,7 @@
    public:
     TestURLFetcherDelegate(const base::Closure& quit_loop_func)
         : quit_loop_func_(quit_loop_func) {}
-    ~TestURLFetcherDelegate() override {}
+    ~TestURLFetcherDelegate() override = default;
 
     void OnURLFetchComplete(const URLFetcher* source) override {
       EXPECT_EQ(HTTP_INTERNAL_SERVER_ERROR, source->GetResponseCode());
@@ -624,7 +624,7 @@
   }
 
  private:
-  ~MockStreamSocket() override {}
+  ~MockStreamSocket() override = default;
 
   bool connected_;
   scoped_refptr<IOBuffer> read_buf_;
diff --git a/net/server/web_socket.cc b/net/server/web_socket.cc
index bd3d9e49..59879e6 100644
--- a/net/server/web_socket.cc
+++ b/net/server/web_socket.cc
@@ -54,7 +54,7 @@
 WebSocket::WebSocket(HttpServer* server, HttpConnection* connection)
     : server_(server), connection_(connection), closed_(false) {}
 
-WebSocket::~WebSocket() {}
+WebSocket::~WebSocket() = default;
 
 void WebSocket::Accept(const HttpServerRequestInfo& request) {
   std::string version = request.GetHeaderValue("sec-websocket-version");
diff --git a/net/server/web_socket_encoder.cc b/net/server/web_socket_encoder.cc
index 0240be3..bec3c83 100644
--- a/net/server/web_socket_encoder.cc
+++ b/net/server/web_socket_encoder.cc
@@ -285,7 +285,7 @@
       deflater_(std::move(deflater)),
       inflater_(std::move(inflater)) {}
 
-WebSocketEncoder::~WebSocketEncoder() {}
+WebSocketEncoder::~WebSocketEncoder() = default;
 
 WebSocket::ParseResult WebSocketEncoder::DecodeFrame(
     const base::StringPiece& frame,
diff --git a/net/server/web_socket_encoder_unittest.cc b/net/server/web_socket_encoder_unittest.cc
index 711a852..4a180ab 100644
--- a/net/server/web_socket_encoder_unittest.cc
+++ b/net/server/web_socket_encoder_unittest.cc
@@ -77,7 +77,7 @@
 
 class WebSocketEncoderTest : public testing::Test {
  public:
-  WebSocketEncoderTest() {}
+  WebSocketEncoderTest() = default;
 
   void SetUp() override {
     std::string response_extensions;
diff --git a/net/socket/client_socket_pool.cc b/net/socket/client_socket_pool.cc
index 5d12324..4c9f13d 100644
--- a/net/socket/client_socket_pool.cc
+++ b/net/socket/client_socket_pool.cc
@@ -43,8 +43,8 @@
   g_used_idle_socket_timeout_s = timeout.InSeconds();
 }
 
-ClientSocketPool::ClientSocketPool() {}
+ClientSocketPool::ClientSocketPool() = default;
 
-ClientSocketPool::~ClientSocketPool() {}
+ClientSocketPool::~ClientSocketPool() = default;
 
 }  // namespace net
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc
index 73700ba0..d80dc8e 100644
--- a/net/socket/client_socket_pool_base.cc
+++ b/net/socket/client_socket_pool_base.cc
@@ -225,7 +225,7 @@
 ClientSocketPoolBaseHelper::CallbackResultPair::CallbackResultPair(
     const CallbackResultPair& other) = default;
 
-ClientSocketPoolBaseHelper::CallbackResultPair::~CallbackResultPair() {}
+ClientSocketPoolBaseHelper::CallbackResultPair::~CallbackResultPair() = default;
 
 bool ClientSocketPoolBaseHelper::IsStalled() const {
   // If a lower layer pool is stalled, consider |this| stalled as well.
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index 4911242..41dbccf 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -114,11 +114,11 @@
 
 class TestSocketParams : public base::RefCounted<TestSocketParams> {
  public:
-  explicit TestSocketParams() {}
+  explicit TestSocketParams() = default;
 
  private:
   friend class base::RefCounted<TestSocketParams>;
-  ~TestSocketParams() {}
+  ~TestSocketParams() = default;
 };
 typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase;
 
@@ -451,7 +451,7 @@
         net_log_(net_log) {
   }
 
-  ~TestConnectJobFactory() override {}
+  ~TestConnectJobFactory() override = default;
 
   void set_job_type(TestConnectJob::JobType job_type) { job_type_ = job_type; }
 
@@ -512,7 +512,7 @@
               used_idle_socket_timeout,
               connect_job_factory) {}
 
-  ~TestClientSocketPool() override {}
+  ~TestClientSocketPool() override = default;
 
   int RequestSocket(const std::string& group_name,
                     const void* params,
@@ -656,7 +656,7 @@
  public:
   TestConnectJobDelegate()
       : have_result_(false), waiting_for_result_(false), result_(OK) {}
-  ~TestConnectJobDelegate() override {}
+  ~TestConnectJobDelegate() override = default;
 
   void OnConnectJobComplete(int result, ConnectJob* job) override {
     result_ = result;
@@ -2560,7 +2560,7 @@
                              base::Unretained(this))) {
   }
 
-  ~TestReleasingSocketRequest() override {}
+  ~TestReleasingSocketRequest() override = default;
 
   ClientSocketHandle* handle() { return &handle_; }
 
@@ -2681,7 +2681,7 @@
                              base::Unretained(this))) {
   }
 
-  ~ConnectWithinCallback() override {}
+  ~ConnectWithinCallback() override = default;
 
   int WaitForNestedResult() {
     return nested_callback_.WaitForResult();
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index 81a7fab..ffec16f 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -275,8 +275,8 @@
 
 }  // namespace
 
-ClientSocketPoolManager::ClientSocketPoolManager() {}
-ClientSocketPoolManager::~ClientSocketPoolManager() {}
+ClientSocketPoolManager::ClientSocketPoolManager() = default;
+ClientSocketPoolManager::~ClientSocketPoolManager() = default;
 
 // static
 int ClientSocketPoolManager::max_sockets_per_pool(
diff --git a/net/socket/fuzzed_datagram_client_socket.cc b/net/socket/fuzzed_datagram_client_socket.cc
index 328a1c8..85db485 100644
--- a/net/socket/fuzzed_datagram_client_socket.cc
+++ b/net/socket/fuzzed_datagram_client_socket.cc
@@ -30,7 +30,7 @@
     base::FuzzedDataProvider* data_provider)
     : data_provider_(data_provider), weak_factory_(this) {}
 
-FuzzedDatagramClientSocket::~FuzzedDatagramClientSocket() {}
+FuzzedDatagramClientSocket::~FuzzedDatagramClientSocket() = default;
 
 int FuzzedDatagramClientSocket::Connect(const IPEndPoint& address) {
   CHECK(!connected_);
diff --git a/net/socket/fuzzed_server_socket.cc b/net/socket/fuzzed_server_socket.cc
index 5de7fb6b..d2b84f5 100644
--- a/net/socket/fuzzed_server_socket.cc
+++ b/net/socket/fuzzed_server_socket.cc
@@ -19,7 +19,7 @@
       listen_called_(false),
       weak_factory_(this) {}
 
-FuzzedServerSocket::~FuzzedServerSocket() {}
+FuzzedServerSocket::~FuzzedServerSocket() = default;
 
 int FuzzedServerSocket::Listen(const IPEndPoint& address, int backlog) {
   DCHECK(!listen_called_);
diff --git a/net/socket/fuzzed_socket.cc b/net/socket/fuzzed_socket.cc
index 6c1a75c..08be4bf 100644
--- a/net/socket/fuzzed_socket.cc
+++ b/net/socket/fuzzed_socket.cc
@@ -40,7 +40,7 @@
       remote_address_(IPEndPoint(IPAddress::IPv4Localhost(), 80)),
       weak_factory_(this) {}
 
-FuzzedSocket::~FuzzedSocket() {}
+FuzzedSocket::~FuzzedSocket() = default;
 
 int FuzzedSocket::Read(IOBuffer* buf,
                        int buf_len,
diff --git a/net/socket/fuzzed_socket_factory.cc b/net/socket/fuzzed_socket_factory.cc
index 8e99cb6..55ffd99 100644
--- a/net/socket/fuzzed_socket_factory.cc
+++ b/net/socket/fuzzed_socket_factory.cc
@@ -26,8 +26,8 @@
 // SSLClientSocket implementation that always fails to connect.
 class FailingSSLClientSocket : public SSLClientSocket {
  public:
-  FailingSSLClientSocket() {}
-  ~FailingSSLClientSocket() override {}
+  FailingSSLClientSocket() = default;
+  ~FailingSSLClientSocket() override = default;
 
   // Socket implementation:
   int Read(IOBuffer* buf,
@@ -130,7 +130,7 @@
     base::FuzzedDataProvider* data_provider)
     : data_provider_(data_provider), fuzz_connect_result_(true) {}
 
-FuzzedSocketFactory::~FuzzedSocketFactory() {}
+FuzzedSocketFactory::~FuzzedSocketFactory() = default;
 
 std::unique_ptr<DatagramClientSocket>
 FuzzedSocketFactory::CreateDatagramClientSocket(
diff --git a/net/socket/mock_client_socket_pool_manager.cc b/net/socket/mock_client_socket_pool_manager.cc
index 3c80ac6..a638653 100644
--- a/net/socket/mock_client_socket_pool_manager.cc
+++ b/net/socket/mock_client_socket_pool_manager.cc
@@ -12,8 +12,8 @@
 
 namespace net {
 
-MockClientSocketPoolManager::MockClientSocketPoolManager() {}
-MockClientSocketPoolManager::~MockClientSocketPoolManager() {}
+MockClientSocketPoolManager::MockClientSocketPoolManager() = default;
+MockClientSocketPoolManager::~MockClientSocketPoolManager() = default;
 
 void MockClientSocketPoolManager::SetTransportSocketPool(
     TransportClientSocketPool* pool) {
diff --git a/net/socket/server_socket.cc b/net/socket/server_socket.cc
index f2c2383a..ebf5a22d 100644
--- a/net/socket/server_socket.cc
+++ b/net/socket/server_socket.cc
@@ -10,11 +10,9 @@
 
 namespace net {
 
-ServerSocket::ServerSocket() {
-}
+ServerSocket::ServerSocket() = default;
 
-ServerSocket::~ServerSocket() {
-}
+ServerSocket::~ServerSocket() = default;
 
 int ServerSocket::ListenWithAddressAndPort(const std::string& address_string,
                                            uint16_t port,
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc
index 5c0b0b7..e6b5253 100644
--- a/net/socket/socket_test_util.cc
+++ b/net/socket/socket_test_util.cc
@@ -139,7 +139,7 @@
     peer_addr(addr) {
 }
 
-MockConnect::~MockConnect() {}
+MockConnect::~MockConnect() = default;
 
 void SocketDataProvider::OnEnableTCPFastOpenIfSupported() {}
 
@@ -178,8 +178,7 @@
       write_count_(writes_count) {
 }
 
-StaticSocketDataHelper::~StaticSocketDataHelper() {
-}
+StaticSocketDataHelper::~StaticSocketDataHelper() = default;
 
 const MockRead& StaticSocketDataHelper::PeekRead() const {
   CHECK(!AllReadDataConsumed());
@@ -248,8 +247,7 @@
     : helper_(reads, reads_count, writes, writes_count) {
 }
 
-StaticSocketDataProvider::~StaticSocketDataProvider() {
-}
+StaticSocketDataProvider::~StaticSocketDataProvider() = default;
 
 MockRead StaticSocketDataProvider::OnRead() {
   CHECK(!helper_.AllReadDataConsumed());
@@ -307,8 +305,7 @@
 SSLSocketDataProvider::SSLSocketDataProvider(
     const SSLSocketDataProvider& other) = default;
 
-SSLSocketDataProvider::~SSLSocketDataProvider() {
-}
+SSLSocketDataProvider::~SSLSocketDataProvider() = default;
 
 SequencedSocketData::SequencedSocketData(MockRead* reads,
                                          size_t reads_count,
@@ -693,13 +690,12 @@
   NET_TRACE(1, " *** ") << "Done";
 }
 
-SequencedSocketData::~SequencedSocketData() {
-}
+SequencedSocketData::~SequencedSocketData() = default;
 
 MockClientSocketFactory::MockClientSocketFactory()
     : enable_read_if_ready_(false) {}
 
-MockClientSocketFactory::~MockClientSocketFactory() {}
+MockClientSocketFactory::~MockClientSocketFactory() = default;
 
 void MockClientSocketFactory::AddSocketDataProvider(
     SocketDataProvider* data) {
@@ -855,7 +851,7 @@
   return NULL;
 }
 
-MockClientSocket::~MockClientSocket() {}
+MockClientSocket::~MockClientSocket() = default;
 
 void MockClientSocket::RunCallbackAsync(const CompletionCallback& callback,
                                         int result) {
@@ -1532,8 +1528,7 @@
   DCHECK(completion_count);
 }
 
-TestSocketRequest::~TestSocketRequest() {
-}
+TestSocketRequest::~TestSocketRequest() = default;
 
 void TestSocketRequest::OnComplete(int result) {
   SetResult(result);
@@ -1548,7 +1543,7 @@
 const int ClientSocketPoolTest::kRequestNotFound = -2;
 
 ClientSocketPoolTest::ClientSocketPoolTest() : completion_count_(0) {}
-ClientSocketPoolTest::~ClientSocketPoolTest() {}
+ClientSocketPoolTest::~ClientSocketPoolTest() = default;
 
 int ClientSocketPoolTest::GetOrderOfRequest(size_t index) const {
   index--;
@@ -1588,7 +1583,7 @@
     const CompletionCallback& callback)
     : socket_(std::move(socket)), handle_(handle), user_callback_(callback) {}
 
-MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() {}
+MockTransportClientSocketPool::MockConnectJob::~MockConnectJob() = default;
 
 int MockTransportClientSocketPool::MockConnectJob::Connect() {
   int rv = socket_->Connect(base::Bind(&MockConnectJob::OnConnect,
@@ -1658,7 +1653,7 @@
       release_count_(0),
       cancel_count_(0) {}
 
-MockTransportClientSocketPool::~MockTransportClientSocketPool() {}
+MockTransportClientSocketPool::~MockTransportClientSocketPool() = default;
 
 int MockTransportClientSocketPool::RequestSocket(
     const std::string& group_name,
@@ -1714,7 +1709,7 @@
                             NULL),
       transport_pool_(transport_pool) {}
 
-MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() {}
+MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() = default;
 
 int MockSOCKSClientSocketPool::RequestSocket(const std::string& group_name,
                                              const void* socket_params,
diff --git a/net/socket/socks_client_socket_pool.cc b/net/socket/socks_client_socket_pool.cc
index f2632f3..86b4ac0 100644
--- a/net/socket/socks_client_socket_pool.cc
+++ b/net/socket/socks_client_socket_pool.cc
@@ -33,7 +33,7 @@
       socks_v5_(socks_v5) {
 }
 
-SOCKSSocketParams::~SOCKSSocketParams() {}
+SOCKSSocketParams::~SOCKSSocketParams() = default;
 
 // SOCKSConnectJobs will time out after this many seconds.  Note this is on
 // top of the timeout for the transport socket.
@@ -209,8 +209,7 @@
     base_.AddLowerLayeredPool(transport_pool_);
 }
 
-SOCKSClientSocketPool::~SOCKSClientSocketPool() {
-}
+SOCKSClientSocketPool::~SOCKSClientSocketPool() = default;
 
 int SOCKSClientSocketPool::RequestSocket(const std::string& group_name,
                                          const void* socket_params,
diff --git a/net/socket/socks_client_socket_pool_unittest.cc b/net/socket/socks_client_socket_pool_unittest.cc
index 5331739..eaafb9d9 100644
--- a/net/socket/socks_client_socket_pool_unittest.cc
+++ b/net/socket/socks_client_socket_pool_unittest.cc
@@ -107,7 +107,7 @@
               NULL,
               NULL) {}
 
-  ~SOCKSClientSocketPoolTest() override {}
+  ~SOCKSClientSocketPoolTest() override = default;
 
   int StartRequestV5(const std::string& group_name, RequestPriority priority) {
     return test_base_.StartRequestUsingPool(
diff --git a/net/socket/ssl_client_socket_pool.cc b/net/socket/ssl_client_socket_pool.cc
index bc6960c..8eb860f 100644
--- a/net/socket/ssl_client_socket_pool.cc
+++ b/net/socket/ssl_client_socket_pool.cc
@@ -59,7 +59,7 @@
          (!direct_params_ && !socks_proxy_params_ && http_proxy_params_));
 }
 
-SSLSocketParams::~SSLSocketParams() {}
+SSLSocketParams::~SSLSocketParams() = default;
 
 SSLSocketParams::ConnectionType SSLSocketParams::GetConnectionType() const {
   if (direct_params_.get()) {
@@ -138,8 +138,7 @@
       version_interference_error_(OK),
       version_interference_details_(SSLErrorDetails::kOther) {}
 
-SSLConnectJob::~SSLConnectJob() {
-}
+SSLConnectJob::~SSLConnectJob() = default;
 
 LoadState SSLConnectJob::GetLoadState() const {
   switch (next_state_) {
@@ -564,8 +563,7 @@
       base::TimeDelta::FromSeconds(kSSLHandshakeTimeoutInSeconds);
 }
 
-SSLClientSocketPool::SSLConnectJobFactory::~SSLConnectJobFactory() {
-}
+SSLClientSocketPool::SSLConnectJobFactory::~SSLConnectJobFactory() = default;
 
 SSLClientSocketPool::SSLClientSocketPool(
     int max_sockets,
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index cab4c9ef..d0527ee 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -97,7 +97,7 @@
  public:
   explicit WrappedStreamSocket(std::unique_ptr<StreamSocket> transport)
       : transport_(std::move(transport)) {}
-  ~WrappedStreamSocket() override {}
+  ~WrappedStreamSocket() override = default;
 
   // StreamSocket implementation:
   int Connect(const CompletionCallback& callback) override {
@@ -180,7 +180,7 @@
 class ReadBufferingStreamSocket : public WrappedStreamSocket {
  public:
   explicit ReadBufferingStreamSocket(std::unique_ptr<StreamSocket> transport);
-  ~ReadBufferingStreamSocket() override {}
+  ~ReadBufferingStreamSocket() override = default;
 
   // Socket implementation:
   int Read(IOBuffer* buf,
@@ -338,7 +338,7 @@
  public:
   explicit SynchronousErrorStreamSocket(std::unique_ptr<StreamSocket> transport)
       : WrappedStreamSocket(std::move(transport)) {}
-  ~SynchronousErrorStreamSocket() override {}
+  ~SynchronousErrorStreamSocket() override = default;
 
   // Socket implementation:
   int Read(IOBuffer* buf,
@@ -414,7 +414,7 @@
  public:
   explicit FakeBlockingStreamSocket(std::unique_ptr<StreamSocket> transport)
       : WrappedStreamSocket(std::move(transport)) {}
-  ~FakeBlockingStreamSocket() override {}
+  ~FakeBlockingStreamSocket() override = default;
 
   // Socket implementation:
   int Read(IOBuffer* buf,
@@ -702,7 +702,7 @@
       : WrappedStreamSocket(std::move(transport)),
         read_count_(0),
         write_count_(0) {}
-  ~CountingStreamSocket() override {}
+  ~CountingStreamSocket() override = default;
 
   // Socket implementation:
   int Read(IOBuffer* buf,
@@ -734,7 +734,7 @@
       : socket_(socket),
         callback_(base::Bind(&DeleteSocketCallback::OnComplete,
                              base::Unretained(this))) {}
-  ~DeleteSocketCallback() override {}
+  ~DeleteSocketCallback() override = default;
 
   const CompletionCallback& callback() const { return callback_; }
 
@@ -811,7 +811,7 @@
 class MockExpectCTReporter : public TransportSecurityState::ExpectCTReporter {
  public:
   MockExpectCTReporter() : num_failures_(0) {}
-  ~MockExpectCTReporter() override {}
+  ~MockExpectCTReporter() override = default;
 
   void OnExpectCTFailed(const HostPortPair& host_port_pair,
                         const GURL& report_uri,
diff --git a/net/socket/ssl_server_socket_impl.cc b/net/socket/ssl_server_socket_impl.cc
index da690a46..cba12a6b 100644
--- a/net/socket/ssl_server_socket_impl.cc
+++ b/net/socket/ssl_server_socket_impl.cc
@@ -691,7 +691,7 @@
   }
 }
 
-SSLServerContextImpl::~SSLServerContextImpl() {}
+SSLServerContextImpl::~SSLServerContextImpl() = default;
 
 std::unique_ptr<SSLServerSocket> SSLServerContextImpl::CreateSSLServerSocket(
     std::unique_ptr<StreamSocket> socket) {
diff --git a/net/socket/ssl_server_socket_unittest.cc b/net/socket/ssl_server_socket_unittest.cc
index 102e8033b..73a038d 100644
--- a/net/socket/ssl_server_socket_unittest.cc
+++ b/net/socket/ssl_server_socket_unittest.cc
@@ -222,7 +222,7 @@
              FakeDataChannel* outgoing_channel)
       : incoming_(incoming_channel), outgoing_(outgoing_channel) {}
 
-  ~FakeSocket() override {}
+  ~FakeSocket() override = default;
 
   int Read(IOBuffer* buf,
            int buf_len,
diff --git a/net/socket/stream_socket.cc b/net/socket/stream_socket.cc
index ec5500a..4eb7e14 100644
--- a/net/socket/stream_socket.cc
+++ b/net/socket/stream_socket.cc
@@ -84,6 +84,6 @@
 StreamSocket::SocketMemoryStats::SocketMemoryStats()
     : total_size(0), buffer_size(0), cert_count(0), cert_size(0) {}
 
-StreamSocket::SocketMemoryStats::~SocketMemoryStats() {}
+StreamSocket::SocketMemoryStats::~SocketMemoryStats() = default;
 
 }  // namespace net
diff --git a/net/socket/tcp_client_socket_unittest.cc b/net/socket/tcp_client_socket_unittest.cc
index b3257aa6..1766d7f 100644
--- a/net/socket/tcp_client_socket_unittest.cc
+++ b/net/socket/tcp_client_socket_unittest.cc
@@ -115,7 +115,7 @@
 class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
  public:
   TestSocketPerformanceWatcher() : connection_changed_count_(0u) {}
-  ~TestSocketPerformanceWatcher() override {}
+  ~TestSocketPerformanceWatcher() override = default;
 
   bool ShouldNotifyUpdatedRTT() const override { return true; }
 
diff --git a/net/socket/tcp_server_socket.cc b/net/socket/tcp_server_socket.cc
index 779a24d..2d9c5fd 100644
--- a/net/socket/tcp_server_socket.cc
+++ b/net/socket/tcp_server_socket.cc
@@ -22,8 +22,7 @@
   return socket_.AdoptUnconnectedSocket(socket);
 }
 
-TCPServerSocket::~TCPServerSocket() {
-}
+TCPServerSocket::~TCPServerSocket() = default;
 
 int TCPServerSocket::Listen(const IPEndPoint& address, int backlog) {
   int result = socket_.Open(address.GetFamily());
diff --git a/net/socket/tcp_socket_posix.cc b/net/socket/tcp_socket_posix.cc
index 7e80ab03..b46ccad 100644
--- a/net/socket/tcp_socket_posix.cc
+++ b/net/socket/tcp_socket_posix.cc
@@ -112,7 +112,7 @@
                    base::Unretained(this)));
   }
 
-  ~FastOpenProbe() {}
+  ~FastOpenProbe() = default;
 
   // Checks if the kernel supports TCP FastOpen. Called only once, on startup.
   void DetectTCPFastOpenSupport() {
diff --git a/net/socket/tcp_socket_unittest.cc b/net/socket/tcp_socket_unittest.cc
index 508b2b74..e170f3b 100644
--- a/net/socket/tcp_socket_unittest.cc
+++ b/net/socket/tcp_socket_unittest.cc
@@ -40,7 +40,7 @@
       : should_notify_updated_rtt_(should_notify_updated_rtt),
         connection_changed_count_(0u),
         rtt_notification_count_(0u) {}
-  ~TestSocketPerformanceWatcher() override {}
+  ~TestSocketPerformanceWatcher() override = default;
 
   bool ShouldNotifyUpdatedRTT() const override {
     return should_notify_updated_rtt_;
diff --git a/net/socket/transport_client_socket_pool.cc b/net/socket/transport_client_socket_pool.cc
index 1288c09..53f2c15 100644
--- a/net/socket/transport_client_socket_pool.cc
+++ b/net/socket/transport_client_socket_pool.cc
@@ -62,7 +62,7 @@
     destination_.set_allow_cached_response(false);
 }
 
-TransportSocketParams::~TransportSocketParams() {}
+TransportSocketParams::~TransportSocketParams() = default;
 
 // TODO(eroman): The use of this constant needs to be re-evaluated. The time
 // needed for TCPClientSocketXXX::Connect() can be arbitrarily long, since
@@ -483,7 +483,7 @@
   base_.EnableConnectBackupJobs();
 }
 
-TransportClientSocketPool::~TransportClientSocketPool() {}
+TransportClientSocketPool::~TransportClientSocketPool() = default;
 
 int TransportClientSocketPool::RequestSocket(const std::string& group_name,
                                              const void* params,
diff --git a/net/socket/transport_client_socket_pool_test_util.cc b/net/socket/transport_client_socket_pool_test_util.cc
index 46d352c6..361d7f8 100644
--- a/net/socket/transport_client_socket_pool_test_util.cc
+++ b/net/socket/transport_client_socket_pool_test_util.cc
@@ -360,7 +360,7 @@
       delay_(base::TimeDelta::FromMilliseconds(
           ClientSocketPool::kMaxConnectRetryIntervalMs)) {}
 
-MockTransportClientSocketFactory::~MockTransportClientSocketFactory() {}
+MockTransportClientSocketFactory::~MockTransportClientSocketFactory() = default;
 
 std::unique_ptr<DatagramClientSocket>
 MockTransportClientSocketFactory::CreateDatagramClientSocket(
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc
index cbe31e1..313c5ba1 100644
--- a/net/socket/transport_client_socket_pool_unittest.cc
+++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -492,7 +492,7 @@
                              base::Unretained(this))) {
   }
 
-  ~RequestSocketCallback() override {}
+  ~RequestSocketCallback() override = default;
 
   const CompletionCallback& callback() const { return callback_; }
 
diff --git a/net/socket/transport_client_socket_unittest.cc b/net/socket/transport_client_socket_unittest.cc
index 7db6db4..ba6a76b 100644
--- a/net/socket/transport_client_socket_unittest.cc
+++ b/net/socket/transport_client_socket_unittest.cc
@@ -49,7 +49,7 @@
         socket_factory_(ClientSocketFactory::GetDefaultFactory()),
         close_server_socket_on_next_send_(false) {}
 
-  virtual ~TransportClientSocketTest() {}
+  virtual ~TransportClientSocketTest() = default;
 
   // Testcase hooks
   void SetUp() override;
diff --git a/net/socket/udp_client_socket.cc b/net/socket/udp_client_socket.cc
index 767aa63..aac8ae06 100644
--- a/net/socket/udp_client_socket.cc
+++ b/net/socket/udp_client_socket.cc
@@ -15,8 +15,7 @@
     : socket_(bind_type, rand_int_cb, net_log, source),
       network_(NetworkChangeNotifier::kInvalidNetworkHandle) {}
 
-UDPClientSocket::~UDPClientSocket() {
-}
+UDPClientSocket::~UDPClientSocket() = default;
 
 int UDPClientSocket::Connect(const IPEndPoint& address) {
   int rv = socket_.Open(address.GetFamily());
diff --git a/net/socket/udp_server_socket.cc b/net/socket/udp_server_socket.cc
index 1b2d74e4..d5f107a 100644
--- a/net/socket/udp_server_socket.cc
+++ b/net/socket/udp_server_socket.cc
@@ -15,8 +15,7 @@
       allow_address_reuse_(false),
       allow_broadcast_(false) {}
 
-UDPServerSocket::~UDPServerSocket() {
-}
+UDPServerSocket::~UDPServerSocket() = default;
 
 int UDPServerSocket::Listen(const IPEndPoint& address) {
   int rv = socket_.Open(address.GetFamily());
diff --git a/net/socket/unix_domain_server_socket_posix.cc b/net/socket/unix_domain_server_socket_posix.cc
index 86927c8..2bea30e 100644
--- a/net/socket/unix_domain_server_socket_posix.cc
+++ b/net/socket/unix_domain_server_socket_posix.cc
@@ -42,8 +42,7 @@
   DCHECK(!auth_callback_.is_null());
 }
 
-UnixDomainServerSocket::~UnixDomainServerSocket() {
-}
+UnixDomainServerSocket::~UnixDomainServerSocket() = default;
 
 // static
 bool UnixDomainServerSocket::GetPeerCredentials(SocketDescriptor socket,
diff --git a/net/test/embedded_test_server/default_handlers.cc b/net/test/embedded_test_server/default_handlers.cc
index a1bf86b..a1e984fa 100644
--- a/net/test/embedded_test_server/default_handlers.cc
+++ b/net/test/embedded_test_server/default_handlers.cc
@@ -608,7 +608,7 @@
 // Never returns a response.
 class HungHttpResponse : public HttpResponse {
  public:
-  HungHttpResponse() {}
+  HungHttpResponse() = default;
 
   void SendResponse(const SendBytesCallback& send,
                     const SendCompleteCallback& done) override {}
@@ -626,7 +626,7 @@
 // Return headers, then hangs.
 class HungAfterHeadersHttpResponse : public HttpResponse {
  public:
-  HungAfterHeadersHttpResponse() {}
+  HungAfterHeadersHttpResponse() = default;
 
   void SendResponse(const SendBytesCallback& send,
                     const SendCompleteCallback& done) override {
diff --git a/net/test/embedded_test_server/embedded_test_server_unittest.cc b/net/test/embedded_test_server/embedded_test_server_unittest.cc
index 74b78728..4eec5c5 100644
--- a/net/test/embedded_test_server/embedded_test_server_unittest.cc
+++ b/net/test/embedded_test_server/embedded_test_server_unittest.cc
@@ -78,7 +78,7 @@
         did_read_from_socket_(false),
         task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
 
-  ~TestConnectionListener() override {}
+  ~TestConnectionListener() override = default;
 
   // Get called from the EmbeddedTestServer thread to be notified that
   // a connection was accepted.
@@ -419,8 +419,8 @@
 
 class CancelRequestDelegate : public TestDelegate {
  public:
-  CancelRequestDelegate() {}
-  ~CancelRequestDelegate() override {}
+  CancelRequestDelegate() = default;
+  ~CancelRequestDelegate() override = default;
 
   void OnResponseStarted(URLRequest* request, int net_error) override {
     TestDelegate::OnResponseStarted(request, net_error);
diff --git a/net/test/embedded_test_server/http_request.cc b/net/test/embedded_test_server/http_request.cc
index ecac880..a714157d 100644
--- a/net/test/embedded_test_server/http_request.cc
+++ b/net/test/embedded_test_server/http_request.cc
@@ -36,8 +36,7 @@
 
 HttpRequest::HttpRequest(const HttpRequest& other) = default;
 
-HttpRequest::~HttpRequest() {
-}
+HttpRequest::~HttpRequest() = default;
 
 GURL HttpRequest::GetURL() const {
   if (base_url.is_valid())
@@ -52,8 +51,7 @@
       declared_content_length_(0) {
 }
 
-HttpRequestParser::~HttpRequestParser() {
-}
+HttpRequestParser::~HttpRequestParser() = default;
 
 void HttpRequestParser::ProcessChunk(const base::StringPiece& data) {
   data.AppendToString(&buffer_);
diff --git a/net/test/embedded_test_server/http_response.cc b/net/test/embedded_test_server/http_response.cc
index fd55211..168049e 100644
--- a/net/test/embedded_test_server/http_response.cc
+++ b/net/test/embedded_test_server/http_response.cc
@@ -13,14 +13,13 @@
 namespace net {
 namespace test_server {
 
-HttpResponse::~HttpResponse() {
-}
+HttpResponse::~HttpResponse() = default;
 
 RawHttpResponse::RawHttpResponse(const std::string& headers,
                                  const std::string& contents)
     : headers_(headers), contents_(contents) {}
 
-RawHttpResponse::~RawHttpResponse() {}
+RawHttpResponse::~RawHttpResponse() = default;
 
 void RawHttpResponse::SendResponse(const SendBytesCallback& send,
                                    const SendCompleteCallback& done) {
@@ -47,8 +46,7 @@
 BasicHttpResponse::BasicHttpResponse() : code_(HTTP_OK) {
 }
 
-BasicHttpResponse::~BasicHttpResponse() {
-}
+BasicHttpResponse::~BasicHttpResponse() = default;
 
 std::string BasicHttpResponse::ToResponseString() const {
   // Response line with headers.
diff --git a/net/test/embedded_test_server/simple_connection_listener.cc b/net/test/embedded_test_server/simple_connection_listener.cc
index d2ea1c9..cb36d760 100644
--- a/net/test/embedded_test_server/simple_connection_listener.cc
+++ b/net/test/embedded_test_server/simple_connection_listener.cc
@@ -19,7 +19,7 @@
       allow_additional_connections_(allow_additional_connections),
       run_loop_task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
 
-SimpleConnectionListener::~SimpleConnectionListener() {}
+SimpleConnectionListener::~SimpleConnectionListener() = default;
 
 void SimpleConnectionListener::AcceptedSocket(const StreamSocket& socket) {
   ++seen_connections_;
diff --git a/net/test/scoped_disable_exit_on_dfatal.cc b/net/test/scoped_disable_exit_on_dfatal.cc
index 14821db..4e7b750 100644
--- a/net/test/scoped_disable_exit_on_dfatal.cc
+++ b/net/test/scoped_disable_exit_on_dfatal.cc
@@ -14,7 +14,7 @@
 ScopedDisableExitOnDFatal::ScopedDisableExitOnDFatal()
     : assert_handler_(base::Bind(LogAssertHandler)) {}
 
-ScopedDisableExitOnDFatal::~ScopedDisableExitOnDFatal() {}
+ScopedDisableExitOnDFatal::~ScopedDisableExitOnDFatal() = default;
 
 // static
 void ScopedDisableExitOnDFatal::LogAssertHandler(
diff --git a/net/test/spawned_test_server/base_test_server.cc b/net/test/spawned_test_server/base_test_server.cc
index 69d9403..c720d64 100644
--- a/net/test/spawned_test_server/base_test_server.cc
+++ b/net/test/spawned_test_server/base_test_server.cc
@@ -164,12 +164,12 @@
 
 }  // namespace
 
-BaseTestServer::SSLOptions::SSLOptions() {}
+BaseTestServer::SSLOptions::SSLOptions() = default;
 BaseTestServer::SSLOptions::SSLOptions(ServerCertificate cert)
     : server_certificate(cert) {}
 BaseTestServer::SSLOptions::SSLOptions(const SSLOptions& other) = default;
 
-BaseTestServer::SSLOptions::~SSLOptions() {}
+BaseTestServer::SSLOptions::~SSLOptions() = default;
 
 base::FilePath BaseTestServer::SSLOptions::GetCertificateFile() const {
   switch (server_certificate) {
@@ -257,7 +257,7 @@
   Init(GetHostname(type, ssl_options));
 }
 
-BaseTestServer::~BaseTestServer() {}
+BaseTestServer::~BaseTestServer() = default;
 
 bool BaseTestServer::Start() {
   return StartInBackground() && BlockUntilStarted();
diff --git a/net/test/url_request/ssl_certificate_error_job.cc b/net/test/url_request/ssl_certificate_error_job.cc
index 759d545..d23f9ced 100644
--- a/net/test/url_request/ssl_certificate_error_job.cc
+++ b/net/test/url_request/ssl_certificate_error_job.cc
@@ -23,8 +23,8 @@
 
 class MockJobInterceptor : public URLRequestInterceptor {
  public:
-  MockJobInterceptor() {}
-  ~MockJobInterceptor() override {}
+  MockJobInterceptor() = default;
+  ~MockJobInterceptor() override = default;
 
   // URLRequestJobFactory::ProtocolHandler implementation:
   URLRequestJob* MaybeInterceptRequest(
@@ -62,8 +62,7 @@
   return GURL(base::StringPrintf("https://%s", kMockHostname));
 }
 
-SSLCertificateErrorJob::~SSLCertificateErrorJob() {
-}
+SSLCertificateErrorJob::~SSLCertificateErrorJob() = default;
 
 void SSLCertificateErrorJob::NotifyError() {
   SSLInfo info;
diff --git a/net/test/url_request/url_request_failed_job.cc b/net/test/url_request/url_request_failed_job.cc
index d87e5d3..5417deb6 100644
--- a/net/test/url_request/url_request_failed_job.cc
+++ b/net/test/url_request/url_request_failed_job.cc
@@ -37,8 +37,8 @@
 
 class MockJobInterceptor : public URLRequestInterceptor {
  public:
-  MockJobInterceptor() {}
-  ~MockJobInterceptor() override {}
+  MockJobInterceptor() = default;
+  ~MockJobInterceptor() override = default;
 
   // URLRequestJobFactory::ProtocolHandler implementation:
   URLRequestJob* MaybeInterceptRequest(
@@ -177,8 +177,7 @@
   return GetMockUrl("https", hostname, START, net_error);
 }
 
-URLRequestFailedJob::~URLRequestFailedJob() {
-}
+URLRequestFailedJob::~URLRequestFailedJob() = default;
 
 void URLRequestFailedJob::StartAsync() {
   if (phase_ == START) {
diff --git a/net/test/url_request/url_request_hanging_read_job.cc b/net/test/url_request/url_request_hanging_read_job.cc
index 1e19435..006e7bab 100644
--- a/net/test/url_request/url_request_hanging_read_job.cc
+++ b/net/test/url_request/url_request_hanging_read_job.cc
@@ -27,8 +27,8 @@
 
 class MockJobInterceptor : public URLRequestInterceptor {
  public:
-  MockJobInterceptor() {}
-  ~MockJobInterceptor() override {}
+  MockJobInterceptor() = default;
+  ~MockJobInterceptor() override = default;
 
   // URLRequestInterceptor implementation
   URLRequestJob* MaybeInterceptRequest(
@@ -58,7 +58,7 @@
                             weak_factory_.GetWeakPtr()));
 }
 
-URLRequestHangingReadJob::~URLRequestHangingReadJob() {}
+URLRequestHangingReadJob::~URLRequestHangingReadJob() = default;
 
 int URLRequestHangingReadJob::ReadRawData(IOBuffer* buf, int buf_size) {
   // Make read hang. It never completes.
diff --git a/net/test/url_request/url_request_mock_data_job.cc b/net/test/url_request/url_request_mock_data_job.cc
index 256acf2b..2e71b9c 100644
--- a/net/test/url_request/url_request_mock_data_job.cc
+++ b/net/test/url_request/url_request_mock_data_job.cc
@@ -75,8 +75,8 @@
 
 class MockJobInterceptor : public URLRequestInterceptor {
  public:
-  MockJobInterceptor() {}
-  ~MockJobInterceptor() override {}
+  MockJobInterceptor() = default;
+  ~MockJobInterceptor() override = default;
 
   // URLRequestInterceptor implementation
   URLRequestJob* MaybeInterceptRequest(
@@ -117,8 +117,7 @@
                             weak_factory_.GetWeakPtr()));
 }
 
-URLRequestMockDataJob::~URLRequestMockDataJob() {
-}
+URLRequestMockDataJob::~URLRequestMockDataJob() = default;
 
 int URLRequestMockDataJob::ReadRawData(IOBuffer* buf, int buf_size) {
   int bytes_read =
diff --git a/net/test/url_request/url_request_mock_http_job.cc b/net/test/url_request/url_request_mock_http_job.cc
index f2fb63b..8ca5a69 100644
--- a/net/test/url_request/url_request_mock_http_job.cc
+++ b/net/test/url_request/url_request_mock_http_job.cc
@@ -37,7 +37,7 @@
                      bool map_all_requests_to_base_path)
       : base_path_(base_path),
         map_all_requests_to_base_path_(map_all_requests_to_base_path) {}
-  ~MockJobInterceptor() override {}
+  ~MockJobInterceptor() override = default;
 
   // URLRequestJobFactory::ProtocolHandler implementation
   URLRequestJob* MaybeInterceptRequest(
@@ -133,8 +133,7 @@
                         base::CreateTaskRunnerWithTraits({base::MayBlock()})),
       weak_ptr_factory_(this) {}
 
-URLRequestMockHTTPJob::~URLRequestMockHTTPJob() {
-}
+URLRequestMockHTTPJob::~URLRequestMockHTTPJob() = default;
 
 // Public virtual version.
 void URLRequestMockHTTPJob::GetResponseInfo(HttpResponseInfo* info) {
diff --git a/net/test/url_request/url_request_slow_download_job.cc b/net/test/url_request/url_request_slow_download_job.cc
index 876e54a..dfba97e 100644
--- a/net/test/url_request/url_request_slow_download_job.cc
+++ b/net/test/url_request/url_request_slow_download_job.cc
@@ -37,8 +37,8 @@
 
 class URLRequestSlowDownloadJob::Interceptor : public URLRequestInterceptor {
  public:
-  Interceptor() {}
-  ~Interceptor() override {}
+  Interceptor() = default;
+  ~Interceptor() override = default;
 
   // URLRequestInterceptor implementation:
   URLRequestJob* MaybeInterceptRequest(
diff --git a/net/tools/cachetool/cachetool.cc b/net/tools/cachetool/cachetool.cc
index 0b84790d..2c3207f 100644
--- a/net/tools/cachetool/cachetool.cc
+++ b/net/tools/cachetool/cachetool.cc
@@ -81,7 +81,7 @@
  public:
   explicit CommandMarshal(Backend* cache_backend)
       : command_failed_(false), cache_backend_(cache_backend) {}
-  virtual ~CommandMarshal() {}
+  virtual ~CommandMarshal() = default;
 
   // Reads the next command's name to execute.
   virtual std::string ReadCommandName() = 0;
diff --git a/net/tools/content_decoder_tool/content_decoder_tool.cc b/net/tools/content_decoder_tool/content_decoder_tool.cc
index cf70028..6ff7eb1 100644
--- a/net/tools/content_decoder_tool/content_decoder_tool.cc
+++ b/net/tools/content_decoder_tool/content_decoder_tool.cc
@@ -30,7 +30,7 @@
  public:
   explicit StdinSourceStream(std::istream* input_stream)
       : SourceStream(SourceStream::TYPE_NONE), input_stream_(input_stream) {}
-  ~StdinSourceStream() override {}
+  ~StdinSourceStream() override = default;
 
   // SourceStream implementation.
   int Read(IOBuffer* dest_buffer,
diff --git a/net/tools/gdig/file_net_log.cc b/net/tools/gdig/file_net_log.cc
index 0e55682..c160ae3 100644
--- a/net/tools/gdig/file_net_log.cc
+++ b/net/tools/gdig/file_net_log.cc
@@ -20,8 +20,7 @@
   DCHECK(destination != NULL);
 }
 
-FileNetLogObserver::~FileNetLogObserver() {
-}
+FileNetLogObserver::~FileNetLogObserver() = default;
 
 void FileNetLogObserver::OnAddEntry(const net::NetLogEntry& entry) {
   // Only NetLogWithSources without a NetLog should have an invalid source.
diff --git a/net/tools/get_server_time/get_server_time.cc b/net/tools/get_server_time/get_server_time.cc
index 9582b265a..60efacc6 100644
--- a/net/tools/get_server_time/get_server_time.cc
+++ b/net/tools/get_server_time/get_server_time.cc
@@ -71,9 +71,9 @@
 // URLFetcher synchronous.
 class QuitDelegate : public net::URLFetcherDelegate {
  public:
-  QuitDelegate() {}
+  QuitDelegate() = default;
 
-  ~QuitDelegate() override {}
+  ~QuitDelegate() override = default;
 
   // net::URLFetcherDelegate implementation.
   void OnURLFetchComplete(const net::URLFetcher* source) override {
@@ -101,7 +101,7 @@
 // to the logs.
 class PrintingLogObserver : public net::NetLog::ThreadSafeObserver {
  public:
-  PrintingLogObserver() {}
+  PrintingLogObserver() = default;
 
   ~PrintingLogObserver() override {
     // This is guaranteed to be safe as this program is single threaded.
diff --git a/net/tools/net_watcher/net_watcher.cc b/net/tools/net_watcher/net_watcher.cc
index 53ca175..8f6f61f 100644
--- a/net/tools/net_watcher/net_watcher.cc
+++ b/net/tools/net_watcher/net_watcher.cc
@@ -101,9 +101,9 @@
       public net::NetworkChangeNotifier::NetworkChangeObserver,
       public net::ProxyConfigService::Observer {
  public:
-  NetWatcher() {}
+  NetWatcher() = default;
 
-  ~NetWatcher() override {}
+  ~NetWatcher() override = default;
 
   // net::NetworkChangeNotifier::IPAddressObserver implementation.
   void OnIPAddressChanged() override { LOG(INFO) << "OnIPAddressChanged()"; }
diff --git a/net/tools/quic/chlo_extractor.cc b/net/tools/quic/chlo_extractor.cc
index 078d6a05..38cb989 100644
--- a/net/tools/quic/chlo_extractor.cc
+++ b/net/tools/quic/chlo_extractor.cc
@@ -22,7 +22,7 @@
  public:
   ChloFramerVisitor(QuicFramer* framer, ChloExtractor::Delegate* delegate);
 
-  ~ChloFramerVisitor() override {}
+  ~ChloFramerVisitor() override = default;
 
   // QuicFramerVisitorInterface implementation
   void OnError(QuicFramer* framer) override {}
diff --git a/net/tools/quic/chlo_extractor_test.cc b/net/tools/quic/chlo_extractor_test.cc
index 488b0bd..4fdd591a 100644
--- a/net/tools/quic/chlo_extractor_test.cc
+++ b/net/tools/quic/chlo_extractor_test.cc
@@ -18,8 +18,8 @@
 
 class TestDelegate : public ChloExtractor::Delegate {
  public:
-  TestDelegate() {}
-  ~TestDelegate() override {}
+  TestDelegate() = default;
+  ~TestDelegate() override = default;
 
   // ChloExtractor::Delegate implementation
   void OnChlo(QuicTransportVersion version,
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc
index dc1ff7d..ceeca25d 100644
--- a/net/tools/quic/end_to_end_test.cc
+++ b/net/tools/quic/end_to_end_test.cc
@@ -242,7 +242,7 @@
  public:
   explicit ServerDelegate(QuicDispatcher* dispatcher)
       : dispatcher_(dispatcher) {}
-  ~ServerDelegate() override {}
+  ~ServerDelegate() override = default;
   void OnCanWrite() override { dispatcher_->OnCanWrite(); }
 
  private:
@@ -252,7 +252,7 @@
 class ClientDelegate : public PacketDroppingTestWriter::Delegate {
  public:
   explicit ClientDelegate(QuicClient* client) : client_(client) {}
-  ~ClientDelegate() override {}
+  ~ClientDelegate() override = default;
   void OnCanWrite() override {
     EpollEvent event(EPOLLOUT);
     client_->epoll_network_helper()->OnEvent(client_->GetLatestFD(), &event);
@@ -2214,7 +2214,7 @@
       : QuicSimpleServerStream(id, session, response_cache),
         response_body_(std::move(response_body)) {}
 
-  ~ServerStreamWithErrorResponseBody() override {}
+  ~ServerStreamWithErrorResponseBody() override = default;
 
  protected:
   void SendErrorResponse() override {
@@ -2237,7 +2237,7 @@
   explicit StreamWithErrorFactory(string response_body)
       : response_body_(std::move(response_body)) {}
 
-  ~StreamWithErrorFactory() override {}
+  ~StreamWithErrorFactory() override = default;
 
   QuicSimpleServerStream* CreateStream(
       QuicStreamId id,
@@ -2259,7 +2259,7 @@
                             QuicHttpResponseCache* response_cache)
       : QuicSimpleServerStream(id, session, response_cache) {}
 
-  ~ServerStreamThatDropsBody() override {}
+  ~ServerStreamThatDropsBody() override = default;
 
  protected:
   void OnDataAvailable() override {
@@ -2293,9 +2293,9 @@
 
 class ServerStreamThatDropsBodyFactory : public QuicTestServer::StreamFactory {
  public:
-  ServerStreamThatDropsBodyFactory() {}
+  ServerStreamThatDropsBodyFactory() = default;
 
-  ~ServerStreamThatDropsBodyFactory() override {}
+  ~ServerStreamThatDropsBodyFactory() override = default;
 
   QuicSimpleServerStream* CreateStream(
       QuicStreamId id,
@@ -2315,7 +2315,7 @@
       : QuicSimpleServerStream(id, session, response_cache),
         body_bytes_(body_bytes) {}
 
-  ~ServerStreamThatSendsHugeResponse() override {}
+  ~ServerStreamThatSendsHugeResponse() override = default;
 
  protected:
   void SendResponse() override {
@@ -2338,7 +2338,7 @@
   explicit ServerStreamThatSendsHugeResponseFactory(int64_t body_bytes)
       : body_bytes_(body_bytes) {}
 
-  ~ServerStreamThatSendsHugeResponseFactory() override {}
+  ~ServerStreamThatSendsHugeResponseFactory() override = default;
 
   QuicSimpleServerStream* CreateStream(
       QuicStreamId id,
@@ -2356,7 +2356,7 @@
  public:
   ClientStreamThatDropsBody(QuicStreamId id, QuicSpdyClientSession* session)
       : QuicSpdyClientStream(id, session) {}
-  ~ClientStreamThatDropsBody() override {}
+  ~ClientStreamThatDropsBody() override = default;
 
   void OnDataAvailable() override {
     while (HasBytesToRead()) {
@@ -2387,7 +2387,7 @@
                               crypto_config,
                               push_promise_index) {}
 
-  ~ClientSessionThatDropsBody() override {}
+  ~ClientSessionThatDropsBody() override = default;
 
   std::unique_ptr<QuicSpdyClientStream> CreateClientStream() override {
     return QuicMakeUnique<ClientStreamThatDropsBody>(GetNextOutgoingStreamId(),
@@ -2408,7 +2408,7 @@
                            config,
                            supported_versions,
                            epoll_server) {}
-  ~MockableQuicClientThatDropsBody() override {}
+  ~MockableQuicClientThatDropsBody() override = default;
 
   std::unique_ptr<QuicSession> CreateQuicClientSession(
       QuicConnection* connection) override {
@@ -2435,7 +2435,7 @@
                      PRIVACY_MODE_DISABLED),
         config, supported_versions, epoll_server()));
   }
-  ~QuicTestClientThatDropsBody() override {}
+  ~QuicTestClientThatDropsBody() override = default;
 };
 
 TEST_P(EndToEndTest, EarlyResponseFinRecording) {
diff --git a/net/tools/quic/platform/impl/quic_epoll_clock.cc b/net/tools/quic/platform/impl/quic_epoll_clock.cc
index ce484dc..c44c9dd4 100644
--- a/net/tools/quic/platform/impl/quic_epoll_clock.cc
+++ b/net/tools/quic/platform/impl/quic_epoll_clock.cc
@@ -11,7 +11,7 @@
 QuicEpollClock::QuicEpollClock(EpollServer* epoll_server)
     : epoll_server_(epoll_server) {}
 
-QuicEpollClock::~QuicEpollClock() {}
+QuicEpollClock::~QuicEpollClock() = default;
 
 QuicTime QuicEpollClock::ApproximateNow() const {
   return QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(
diff --git a/net/tools/quic/quic_client.cc b/net/tools/quic/quic_client.cc
index aacb3f0ab..ee4e584 100644
--- a/net/tools/quic/quic_client.cc
+++ b/net/tools/quic/quic_client.cc
@@ -83,7 +83,7 @@
   set_server_address(server_address);
 }
 
-QuicClient::~QuicClient() {}
+QuicClient::~QuicClient() = default;
 
 QuicClientEpollNetworkHelper* QuicClient::epoll_network_helper() {
   return static_cast<QuicClientEpollNetworkHelper*>(network_helper());
diff --git a/net/tools/quic/quic_client_base.cc b/net/tools/quic/quic_client_base.cc
index f664ef9d..0ef9999 100644
--- a/net/tools/quic/quic_client_base.cc
+++ b/net/tools/quic/quic_client_base.cc
@@ -16,7 +16,7 @@
 
 namespace net {
 
-QuicClientBase::NetworkHelper::~NetworkHelper() {}
+QuicClientBase::NetworkHelper::~NetworkHelper() = default;
 
 QuicClientBase::QuicClientBase(
     const QuicServerId& server_id,
@@ -41,7 +41,7 @@
       connected_or_attempting_connect_(false),
       network_helper_(std::move(network_helper)) {}
 
-QuicClientBase::~QuicClientBase() {}
+QuicClientBase::~QuicClientBase() = default;
 
 bool QuicClientBase::Initialize() {
   num_sent_client_hellos_ = 0;
diff --git a/net/tools/quic/quic_client_message_loop_network_helper.cc b/net/tools/quic/quic_client_message_loop_network_helper.cc
index 7930221..6c524fa 100644
--- a/net/tools/quic/quic_client_message_loop_network_helper.cc
+++ b/net/tools/quic/quic_client_message_loop_network_helper.cc
@@ -38,7 +38,8 @@
     QuicClientBase* client)
     : packet_reader_started_(false), clock_(clock), client_(client) {}
 
-QuicClientMessageLooplNetworkHelper::~QuicClientMessageLooplNetworkHelper() {}
+QuicClientMessageLooplNetworkHelper::~QuicClientMessageLooplNetworkHelper() =
+    default;
 
 bool QuicClientMessageLooplNetworkHelper::CreateUDPSocketAndBind(
     QuicSocketAddress server_address,
diff --git a/net/tools/quic/quic_default_packet_writer.cc b/net/tools/quic/quic_default_packet_writer.cc
index e7aa91d..34c1bab 100644
--- a/net/tools/quic/quic_default_packet_writer.cc
+++ b/net/tools/quic/quic_default_packet_writer.cc
@@ -11,7 +11,7 @@
 QuicDefaultPacketWriter::QuicDefaultPacketWriter(int fd)
     : fd_(fd), write_blocked_(false) {}
 
-QuicDefaultPacketWriter::~QuicDefaultPacketWriter() {}
+QuicDefaultPacketWriter::~QuicDefaultPacketWriter() = default;
 
 WriteResult QuicDefaultPacketWriter::WritePacket(
     const char* buffer,
diff --git a/net/tools/quic/quic_dispatcher.cc b/net/tools/quic/quic_dispatcher.cc
index caedc70..3d1188d 100644
--- a/net/tools/quic/quic_dispatcher.cc
+++ b/net/tools/quic/quic_dispatcher.cc
@@ -57,7 +57,7 @@
       : send_buffer_(
             allocator,
             FLAGS_quic_reloadable_flag_quic_allow_multiple_acks_for_data2) {}
-  ~PacketCollector() override {}
+  ~PacketCollector() override = default;
 
   // QuicPacketCreator::DelegateInterface methods:
   void OnSerializedPacket(SerializedPacket* serialized_packet) override {
diff --git a/net/tools/quic/quic_dispatcher_test.cc b/net/tools/quic/quic_dispatcher_test.cc
index 7fd76f7..9fb6b3c 100644
--- a/net/tools/quic/quic_dispatcher_test.cc
+++ b/net/tools/quic/quic_dispatcher_test.cc
@@ -198,7 +198,7 @@
         .WillByDefault(Return(true));
   }
 
-  ~QuicDispatcherTest() override {}
+  ~QuicDispatcherTest() override = default;
 
   MockQuicConnection* connection1() {
     return reinterpret_cast<MockQuicConnection*>(session1_->connection());
diff --git a/net/tools/quic/quic_epoll_alarm_factory.cc b/net/tools/quic/quic_epoll_alarm_factory.cc
index 11e8190a..deb95597 100644
--- a/net/tools/quic/quic_epoll_alarm_factory.cc
+++ b/net/tools/quic/quic_epoll_alarm_factory.cc
@@ -55,7 +55,7 @@
 QuicEpollAlarmFactory::QuicEpollAlarmFactory(EpollServer* epoll_server)
     : epoll_server_(epoll_server) {}
 
-QuicEpollAlarmFactory::~QuicEpollAlarmFactory() {}
+QuicEpollAlarmFactory::~QuicEpollAlarmFactory() = default;
 
 QuicAlarm* QuicEpollAlarmFactory::CreateAlarm(QuicAlarm::Delegate* delegate) {
   return new QuicEpollAlarm(epoll_server_,
diff --git a/net/tools/quic/quic_epoll_connection_helper.cc b/net/tools/quic/quic_epoll_connection_helper.cc
index d72c538a..2c7f9537 100644
--- a/net/tools/quic/quic_epoll_connection_helper.cc
+++ b/net/tools/quic/quic_epoll_connection_helper.cc
@@ -19,7 +19,7 @@
       random_generator_(QuicRandom::GetInstance()),
       allocator_type_(type) {}
 
-QuicEpollConnectionHelper::~QuicEpollConnectionHelper() {}
+QuicEpollConnectionHelper::~QuicEpollConnectionHelper() = default;
 
 const QuicClock* QuicEpollConnectionHelper::GetClock() const {
   return &clock_;
diff --git a/net/tools/quic/quic_http_response_cache.cc b/net/tools/quic/quic_http_response_cache.cc
index 8ad7b7a..90c221a 100644
--- a/net/tools/quic/quic_http_response_cache.cc
+++ b/net/tools/quic/quic_http_response_cache.cc
@@ -41,13 +41,13 @@
 QuicHttpResponseCache::Response::Response()
     : response_type_(REGULAR_RESPONSE) {}
 
-QuicHttpResponseCache::Response::~Response() {}
+QuicHttpResponseCache::Response::~Response() = default;
 
 QuicHttpResponseCache::ResourceFile::ResourceFile(
     const base::FilePath& file_name)
     : file_name_(file_name), file_name_string_(file_name.AsUTF8Unsafe()) {}
 
-QuicHttpResponseCache::ResourceFile::~ResourceFile() {}
+QuicHttpResponseCache::ResourceFile::~ResourceFile() = default;
 
 void QuicHttpResponseCache::ResourceFile::Read() {
   base::ReadFileToString(FilePath(file_name_), &file_contents_);
@@ -227,7 +227,7 @@
                   SpdyHeaderBlock());
 }
 
-QuicHttpResponseCache::QuicHttpResponseCache() {}
+QuicHttpResponseCache::QuicHttpResponseCache() = default;
 
 void QuicHttpResponseCache::InitializeFromDirectory(
     const string& cache_directory) {
diff --git a/net/tools/quic/quic_packet_reader.cc b/net/tools/quic/quic_packet_reader.cc
index e4cbbf34..76de5b2 100644
--- a/net/tools/quic/quic_packet_reader.cc
+++ b/net/tools/quic/quic_packet_reader.cc
@@ -54,7 +54,7 @@
 #endif
 }
 
-QuicPacketReader::~QuicPacketReader() {}
+QuicPacketReader::~QuicPacketReader() = default;
 
 bool QuicPacketReader::ReadAndDispatchPackets(
     int fd,
diff --git a/net/tools/quic/quic_packet_writer_wrapper.cc b/net/tools/quic/quic_packet_writer_wrapper.cc
index 1104e69..42f7d0a 100644
--- a/net/tools/quic/quic_packet_writer_wrapper.cc
+++ b/net/tools/quic/quic_packet_writer_wrapper.cc
@@ -8,9 +8,9 @@
 
 namespace net {
 
-QuicPacketWriterWrapper::QuicPacketWriterWrapper() {}
+QuicPacketWriterWrapper::QuicPacketWriterWrapper() = default;
 
-QuicPacketWriterWrapper::~QuicPacketWriterWrapper() {}
+QuicPacketWriterWrapper::~QuicPacketWriterWrapper() = default;
 
 WriteResult QuicPacketWriterWrapper::WritePacket(
     const char* buffer,
diff --git a/net/tools/quic/quic_per_connection_packet_writer.cc b/net/tools/quic/quic_per_connection_packet_writer.cc
index 0d98cc8..c9d3b514 100644
--- a/net/tools/quic/quic_per_connection_packet_writer.cc
+++ b/net/tools/quic/quic_per_connection_packet_writer.cc
@@ -10,7 +10,7 @@
     QuicPacketWriter* shared_writer)
     : shared_writer_(shared_writer) {}
 
-QuicPerConnectionPacketWriter::~QuicPerConnectionPacketWriter() {}
+QuicPerConnectionPacketWriter::~QuicPerConnectionPacketWriter() = default;
 
 WriteResult QuicPerConnectionPacketWriter::WritePacket(
     const char* buffer,
diff --git a/net/tools/quic/quic_server.cc b/net/tools/quic/quic_server.cc
index b3d7414..bfaefc0 100644
--- a/net/tools/quic/quic_server.cc
+++ b/net/tools/quic/quic_server.cc
@@ -109,7 +109,7 @@
       QuicRandom::GetInstance(), &clock, crypto_config_options_));
 }
 
-QuicServer::~QuicServer() {}
+QuicServer::~QuicServer() = default;
 
 bool QuicServer::CreateUDPSocketAndListen(const QuicSocketAddress& address) {
   fd_ = QuicSocketUtils::CreateUDPSocket(address, &overflow_supported_);
diff --git a/net/tools/quic/quic_server_test.cc b/net/tools/quic/quic_server_test.cc
index e0da5509..1c3451b 100644
--- a/net/tools/quic/quic_server_test.cc
+++ b/net/tools/quic/quic_server_test.cc
@@ -42,7 +42,7 @@
                              std::move(session_helper),
                              std::move(alarm_factory),
                              response_cache) {}
-  ~MockQuicSimpleDispatcher() override {}
+  ~MockQuicSimpleDispatcher() override = default;
 
   MOCK_METHOD0(OnCanWrite, void());
   MOCK_CONST_METHOD0(HasPendingWrites, bool());
@@ -56,7 +56,7 @@
       : QuicServer(crypto_test_utils::ProofSourceForTesting(),
                    &response_cache_) {}
 
-  ~TestQuicServer() override {}
+  ~TestQuicServer() override = default;
 
   MockQuicSimpleDispatcher* mock_dispatcher() { return mock_dispatcher_; }
 
diff --git a/net/tools/quic/quic_simple_crypto_server_stream_helper.cc b/net/tools/quic/quic_simple_crypto_server_stream_helper.cc
index 6f310eb..56afbf82 100644
--- a/net/tools/quic/quic_simple_crypto_server_stream_helper.cc
+++ b/net/tools/quic/quic_simple_crypto_server_stream_helper.cc
@@ -10,7 +10,8 @@
     QuicRandom* random)
     : random_(random) {}
 
-QuicSimpleCryptoServerStreamHelper::~QuicSimpleCryptoServerStreamHelper() {}
+QuicSimpleCryptoServerStreamHelper::~QuicSimpleCryptoServerStreamHelper() =
+    default;
 
 QuicConnectionId
 QuicSimpleCryptoServerStreamHelper::GenerateConnectionIdForReject(
diff --git a/net/tools/quic/quic_simple_dispatcher.cc b/net/tools/quic/quic_simple_dispatcher.cc
index 663783ad..832415c 100644
--- a/net/tools/quic/quic_simple_dispatcher.cc
+++ b/net/tools/quic/quic_simple_dispatcher.cc
@@ -24,7 +24,7 @@
                      std::move(alarm_factory)),
       response_cache_(response_cache) {}
 
-QuicSimpleDispatcher::~QuicSimpleDispatcher() {}
+QuicSimpleDispatcher::~QuicSimpleDispatcher() = default;
 
 int QuicSimpleDispatcher::GetRstErrorCount(
     QuicRstStreamErrorCode error_code) const {
diff --git a/net/tools/quic/quic_simple_per_connection_packet_writer.cc b/net/tools/quic/quic_simple_per_connection_packet_writer.cc
index 4889724a..9046a9b 100644
--- a/net/tools/quic/quic_simple_per_connection_packet_writer.cc
+++ b/net/tools/quic/quic_simple_per_connection_packet_writer.cc
@@ -15,7 +15,8 @@
       connection_(nullptr),
       weak_factory_(this) {}
 
-QuicSimplePerConnectionPacketWriter::~QuicSimplePerConnectionPacketWriter() {}
+QuicSimplePerConnectionPacketWriter::~QuicSimplePerConnectionPacketWriter() =
+    default;
 
 QuicPacketWriter* QuicSimplePerConnectionPacketWriter::shared_writer() const {
   return shared_writer_;
diff --git a/net/tools/quic/quic_simple_server.cc b/net/tools/quic/quic_simple_server.cc
index 9f0f9d15..4ecbf753 100644
--- a/net/tools/quic/quic_simple_server.cc
+++ b/net/tools/quic/quic_simple_server.cc
@@ -86,7 +86,7 @@
       crypto_config_options_));
 }
 
-QuicSimpleServer::~QuicSimpleServer() {}
+QuicSimpleServer::~QuicSimpleServer() = default;
 
 int QuicSimpleServer::Listen(const IPEndPoint& address) {
   std::unique_ptr<UDPServerSocket> socket(
diff --git a/net/tools/quic/quic_simple_server_packet_writer.cc b/net/tools/quic/quic_simple_server_packet_writer.cc
index 575ceca..fa7ece1 100644
--- a/net/tools/quic/quic_simple_server_packet_writer.cc
+++ b/net/tools/quic/quic_simple_server_packet_writer.cc
@@ -23,7 +23,7 @@
       write_blocked_(false),
       weak_factory_(this) {}
 
-QuicSimpleServerPacketWriter::~QuicSimpleServerPacketWriter() {}
+QuicSimpleServerPacketWriter::~QuicSimpleServerPacketWriter() = default;
 
 WriteResult QuicSimpleServerPacketWriter::WritePacketWithCallback(
     const char* buffer,
diff --git a/net/tools/quic/quic_simple_server_session_helper.cc b/net/tools/quic/quic_simple_server_session_helper.cc
index 51a2e42..819553a 100644
--- a/net/tools/quic/quic_simple_server_session_helper.cc
+++ b/net/tools/quic/quic_simple_server_session_helper.cc
@@ -9,7 +9,7 @@
 QuicSimpleServerSessionHelper::QuicSimpleServerSessionHelper(QuicRandom* random)
     : random_(random) {}
 
-QuicSimpleServerSessionHelper::~QuicSimpleServerSessionHelper() {}
+QuicSimpleServerSessionHelper::~QuicSimpleServerSessionHelper() = default;
 
 QuicConnectionId QuicSimpleServerSessionHelper::GenerateConnectionIdForReject(
     QuicConnectionId /*connection_id*/) const {
diff --git a/net/tools/quic/quic_simple_server_session_test.cc b/net/tools/quic/quic_simple_server_session_test.cc
index de80c5e..712fff9e 100644
--- a/net/tools/quic/quic_simple_server_session_test.cc
+++ b/net/tools/quic/quic_simple_server_session_test.cc
@@ -92,7 +92,7 @@
             FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support,
             session,
             helper) {}
-  ~MockQuicCryptoServerStream() override {}
+  ~MockQuicCryptoServerStream() override = default;
 
   MOCK_METHOD1(SendServerConfigUpdate,
                void(const CachedNetworkParameters* cached_network_parameters));
diff --git a/net/tools/quic/quic_simple_server_stream.cc b/net/tools/quic/quic_simple_server_stream.cc
index d7aad712..c0ee02d 100644
--- a/net/tools/quic/quic_simple_server_stream.cc
+++ b/net/tools/quic/quic_simple_server_stream.cc
@@ -30,7 +30,7 @@
       content_length_(-1),
       response_cache_(response_cache) {}
 
-QuicSimpleServerStream::~QuicSimpleServerStream() {}
+QuicSimpleServerStream::~QuicSimpleServerStream() = default;
 
 void QuicSimpleServerStream::OnInitialHeadersComplete(
     bool fin,
diff --git a/net/tools/quic/quic_simple_server_stream_test.cc b/net/tools/quic/quic_simple_server_stream_test.cc
index 222a88b..7a1040d 100644
--- a/net/tools/quic/quic_simple_server_stream_test.cc
+++ b/net/tools/quic/quic_simple_server_stream_test.cc
@@ -43,7 +43,7 @@
                              QuicHttpResponseCache* response_cache)
       : QuicSimpleServerStream(stream_id, session, response_cache) {}
 
-  ~QuicSimpleServerStreamPeer() override {}
+  ~QuicSimpleServerStreamPeer() override = default;
 
   using QuicSimpleServerStream::SendErrorResponse;
   using QuicSimpleServerStream::SendResponse;
@@ -97,7 +97,7 @@
         .WillByDefault(testing::Return(QuicConsumedData(0, false)));
   }
 
-  ~MockQuicSimpleServerSession() override {}
+  ~MockQuicSimpleServerSession() override = default;
 
   MOCK_METHOD3(OnConnectionClosed,
                void(QuicErrorCode error,
diff --git a/net/tools/quic/quic_spdy_client_base.cc b/net/tools/quic/quic_spdy_client_base.cc
index 7eca30d..d285648 100644
--- a/net/tools/quic/quic_spdy_client_base.cc
+++ b/net/tools/quic/quic_spdy_client_base.cc
@@ -28,7 +28,7 @@
     bool fin)
     : headers_(std::move(headers)), body_(body), fin_(fin) {}
 
-QuicSpdyClientBase::QuicDataToResend::~QuicDataToResend() {}
+QuicSpdyClientBase::QuicDataToResend::~QuicDataToResend() = default;
 
 QuicSpdyClientBase::QuicSpdyClientBase(
     const QuicServerId& server_id,
diff --git a/net/tools/quic/quic_spdy_client_session.cc b/net/tools/quic/quic_spdy_client_session.cc
index c823716..78c3880 100644
--- a/net/tools/quic/quic_spdy_client_session.cc
+++ b/net/tools/quic/quic_spdy_client_session.cc
@@ -29,7 +29,7 @@
       crypto_config_(crypto_config),
       respect_goaway_(true) {}
 
-QuicSpdyClientSession::~QuicSpdyClientSession() {}
+QuicSpdyClientSession::~QuicSpdyClientSession() = default;
 
 void QuicSpdyClientSession::Initialize() {
   crypto_stream_ = CreateQuicCryptoStream();
diff --git a/net/tools/quic/quic_spdy_client_stream.cc b/net/tools/quic/quic_spdy_client_stream.cc
index 4b76855..ac0ff0d 100644
--- a/net/tools/quic/quic_spdy_client_stream.cc
+++ b/net/tools/quic/quic_spdy_client_stream.cc
@@ -27,7 +27,7 @@
       session_(session),
       has_preliminary_headers_(false) {}
 
-QuicSpdyClientStream::~QuicSpdyClientStream() {}
+QuicSpdyClientStream::~QuicSpdyClientStream() = default;
 
 void QuicSpdyClientStream::OnInitialHeadersComplete(
     bool fin,
diff --git a/net/tools/quic/quic_spdy_client_stream_test.cc b/net/tools/quic/quic_spdy_client_stream_test.cc
index c2e41176e..361f87e 100644
--- a/net/tools/quic/quic_spdy_client_stream_test.cc
+++ b/net/tools/quic/quic_spdy_client_stream_test.cc
@@ -39,7 +39,7 @@
             &crypto_config_,
             push_promise_index),
         crypto_config_(crypto_test_utils::ProofVerifierForTesting()) {}
-  ~MockQuicSpdyClientSession() override {}
+  ~MockQuicSpdyClientSession() override = default;
 
   MOCK_METHOD1(CloseStream, void(QuicStreamId stream_id));
 
diff --git a/net/tools/quic/quic_time_wait_list_manager.cc b/net/tools/quic/quic_time_wait_list_manager.cc
index f52f66f..9f54816 100644
--- a/net/tools/quic/quic_time_wait_list_manager.cc
+++ b/net/tools/quic/quic_time_wait_list_manager.cc
@@ -319,6 +319,6 @@
 QuicTimeWaitListManager::ConnectionIdData::ConnectionIdData(
     ConnectionIdData&& other) = default;
 
-QuicTimeWaitListManager::ConnectionIdData::~ConnectionIdData() {}
+QuicTimeWaitListManager::ConnectionIdData::~ConnectionIdData() = default;
 
 }  // namespace net
diff --git a/net/tools/quic/quic_time_wait_list_manager_test.cc b/net/tools/quic/quic_time_wait_list_manager_test.cc
index e5d2185b..a157676 100644
--- a/net/tools/quic/quic_time_wait_list_manager_test.cc
+++ b/net/tools/quic/quic_time_wait_list_manager_test.cc
@@ -44,8 +44,8 @@
 
 class FramerVisitorCapturingPublicReset : public NoOpFramerVisitor {
  public:
-  FramerVisitorCapturingPublicReset() {}
-  ~FramerVisitorCapturingPublicReset() override {}
+  FramerVisitorCapturingPublicReset() = default;
+  ~FramerVisitorCapturingPublicReset() override = default;
 
   void OnPublicResetPacket(const QuicPublicResetPacket& public_reset) override {
     public_reset_packet_ = public_reset;
@@ -77,7 +77,7 @@
         client_address_(net::test::TestPeerIPAddress(), kTestPort),
         writer_is_blocked_(false) {}
 
-  ~QuicTimeWaitListManagerTest() override {}
+  ~QuicTimeWaitListManagerTest() override = default;
 
   void SetUp() override {
     EXPECT_CALL(writer_, IsWriteBlocked())
diff --git a/net/tools/quic/stateless_rejector.cc b/net/tools/quic/stateless_rejector.cc
index c2ded3b..668065c 100644
--- a/net/tools/quic/stateless_rejector.cc
+++ b/net/tools/quic/stateless_rejector.cc
@@ -18,7 +18,7 @@
       std::unique_ptr<StatelessRejector::ProcessDoneCallback> cb)
       : rejector_(std::move(rejector)), cb_(std::move(cb)) {}
 
-  ~ValidateCallback() override {}
+  ~ValidateCallback() override = default;
 
   void Run(QuicReferenceCountedPointer<Result> result,
            std::unique_ptr<ProofSource::Details> /* proof_source_details */)
@@ -58,7 +58,7 @@
       signed_config_(new QuicSignedServerConfig),
       params_(new QuicCryptoNegotiatedParameters) {}
 
-StatelessRejector::~StatelessRejector() {}
+StatelessRejector::~StatelessRejector() = default;
 
 void StatelessRejector::OnChlo(QuicTransportVersion version,
                                QuicConnectionId connection_id,
diff --git a/net/tools/quic/synchronous_host_resolver.cc b/net/tools/quic/synchronous_host_resolver.cc
index 165fafe..e9423a2 100644
--- a/net/tools/quic/synchronous_host_resolver.cc
+++ b/net/tools/quic/synchronous_host_resolver.cc
@@ -53,7 +53,7 @@
       rv_(ERR_UNEXPECTED),
       weak_factory_(this) {}
 
-ResolverThread::~ResolverThread() {}
+ResolverThread::~ResolverThread() = default;
 
 void ResolverThread::Run() {
   base::MessageLoopForIO loop;
diff --git a/net/tools/quic/test_tools/limited_mtu_test_writer.cc b/net/tools/quic/test_tools/limited_mtu_test_writer.cc
index 3d2ee877..f37ace7 100644
--- a/net/tools/quic/test_tools/limited_mtu_test_writer.cc
+++ b/net/tools/quic/test_tools/limited_mtu_test_writer.cc
@@ -9,7 +9,7 @@
 
 LimitedMtuTestWriter::LimitedMtuTestWriter(QuicByteCount mtu) : mtu_(mtu) {}
 
-LimitedMtuTestWriter::~LimitedMtuTestWriter() {}
+LimitedMtuTestWriter::~LimitedMtuTestWriter() = default;
 
 WriteResult LimitedMtuTestWriter::WritePacket(
     const char* buffer,
diff --git a/net/tools/quic/test_tools/mock_epoll_server.cc b/net/tools/quic/test_tools/mock_epoll_server.cc
index 11b6ada7..ffca8d98 100644
--- a/net/tools/quic/test_tools/mock_epoll_server.cc
+++ b/net/tools/quic/test_tools/mock_epoll_server.cc
@@ -9,7 +9,7 @@
 
 FakeTimeEpollServer::FakeTimeEpollServer() : now_in_usec_(0) {}
 
-FakeTimeEpollServer::~FakeTimeEpollServer() {}
+FakeTimeEpollServer::~FakeTimeEpollServer() = default;
 
 int64_t FakeTimeEpollServer::NowInUsec() const {
   return now_in_usec_;
@@ -17,7 +17,7 @@
 
 MockEpollServer::MockEpollServer() : until_in_usec_(-1) {}
 
-MockEpollServer::~MockEpollServer() {}
+MockEpollServer::~MockEpollServer() = default;
 
 int MockEpollServer::epoll_wait_impl(int epfd,
                                      struct epoll_event* events,
diff --git a/net/tools/quic/test_tools/mock_quic_session_visitor.cc b/net/tools/quic/test_tools/mock_quic_session_visitor.cc
index ea52f14e..8bca2752 100644
--- a/net/tools/quic/test_tools/mock_quic_session_visitor.cc
+++ b/net/tools/quic/test_tools/mock_quic_session_visitor.cc
@@ -7,13 +7,13 @@
 namespace net {
 namespace test {
 
-MockQuicSessionVisitor::MockQuicSessionVisitor() {}
+MockQuicSessionVisitor::MockQuicSessionVisitor() = default;
 
-MockQuicSessionVisitor::~MockQuicSessionVisitor() {}
+MockQuicSessionVisitor::~MockQuicSessionVisitor() = default;
 
-MockQuicCryptoServerStreamHelper::MockQuicCryptoServerStreamHelper() {}
+MockQuicCryptoServerStreamHelper::MockQuicCryptoServerStreamHelper() = default;
 
-MockQuicCryptoServerStreamHelper::~MockQuicCryptoServerStreamHelper() {}
+MockQuicCryptoServerStreamHelper::~MockQuicCryptoServerStreamHelper() = default;
 
 }  // namespace test
 }  // namespace net
diff --git a/net/tools/quic/test_tools/mock_quic_time_wait_list_manager.cc b/net/tools/quic/test_tools/mock_quic_time_wait_list_manager.cc
index a3de570..33907839 100644
--- a/net/tools/quic/test_tools/mock_quic_time_wait_list_manager.cc
+++ b/net/tools/quic/test_tools/mock_quic_time_wait_list_manager.cc
@@ -26,7 +26,7 @@
                            QuicTimeWaitListManager_AddConnectionIdToTimeWait));
 }
 
-MockTimeWaitListManager::~MockTimeWaitListManager() {}
+MockTimeWaitListManager::~MockTimeWaitListManager() = default;
 
 }  // namespace test
 }  // namespace net
diff --git a/net/tools/quic/test_tools/packet_dropping_test_writer.cc b/net/tools/quic/test_tools/packet_dropping_test_writer.cc
index 3de6dba..815000d90 100644
--- a/net/tools/quic/test_tools/packet_dropping_test_writer.cc
+++ b/net/tools/quic/test_tools/packet_dropping_test_writer.cc
@@ -64,7 +64,7 @@
   simple_random_.set_seed(seed);
 }
 
-PacketDroppingTestWriter::~PacketDroppingTestWriter() {}
+PacketDroppingTestWriter::~PacketDroppingTestWriter() = default;
 
 void PacketDroppingTestWriter::Initialize(QuicConnectionHelperInterface* helper,
                                           QuicAlarmFactory* alarm_factory,
@@ -241,7 +241,7 @@
 // PacketDroppingTestWriter::DelayedWrite::operator=(
 //    PacketDroppingTestWriter::DelayedWrite&& other) = default;
 
-PacketDroppingTestWriter::DelayedWrite::~DelayedWrite() {}
+PacketDroppingTestWriter::DelayedWrite::~DelayedWrite() = default;
 
 }  // namespace test
 }  // namespace net
diff --git a/net/tools/quic/test_tools/packet_reordering_writer.cc b/net/tools/quic/test_tools/packet_reordering_writer.cc
index a5262847..99c965f 100644
--- a/net/tools/quic/test_tools/packet_reordering_writer.cc
+++ b/net/tools/quic/test_tools/packet_reordering_writer.cc
@@ -7,9 +7,9 @@
 namespace net {
 namespace test {
 
-PacketReorderingWriter::PacketReorderingWriter() {}
+PacketReorderingWriter::PacketReorderingWriter() = default;
 
-PacketReorderingWriter::~PacketReorderingWriter() {}
+PacketReorderingWriter::~PacketReorderingWriter() = default;
 
 WriteResult PacketReorderingWriter::WritePacket(
     const char* buffer,
diff --git a/net/tools/quic/test_tools/quic_test_client.cc b/net/tools/quic/test_tools/quic_test_client.cc
index c6320242..83ed299 100644
--- a/net/tools/quic/test_tools/quic_test_client.cc
+++ b/net/tools/quic/test_tools/quic_test_client.cc
@@ -114,7 +114,7 @@
     : public QuicClientEpollNetworkHelper {
  public:
   using QuicClientEpollNetworkHelper::QuicClientEpollNetworkHelper;
-  ~MockableQuicClientEpollNetworkHelper() override {}
+  ~MockableQuicClientEpollNetworkHelper() override = default;
 
   void ProcessPacket(const QuicSocketAddress& self_address,
                      const QuicSocketAddress& peer_address,
@@ -289,7 +289,7 @@
   Initialize();
 }
 
-QuicTestClient::QuicTestClient() {}
+QuicTestClient::QuicTestClient() = default;
 
 QuicTestClient::~QuicTestClient() {
   for (std::pair<QuicStreamId, QuicSpdyClientStream*> stream : open_streams_) {
@@ -760,7 +760,7 @@
       test_client_(test_client),
       ack_listener_(std::move(ack_listener)) {}
 
-QuicTestClient::TestClientDataToResend::~TestClientDataToResend() {}
+QuicTestClient::TestClientDataToResend::~TestClientDataToResend() = default;
 
 void QuicTestClient::TestClientDataToResend::Resend() {
   test_client_->GetOrCreateStreamAndSendRequest(headers_.get(), body_, fin_,
@@ -802,7 +802,7 @@
       bytes_written(bytes_written),
       response_body_size(response_body_size) {}
 
-QuicTestClient::PerStreamState::~PerStreamState() {}
+QuicTestClient::PerStreamState::~PerStreamState() = default;
 
 bool QuicTestClient::PopulateHeaderBlockFromUrl(const string& uri,
                                                 SpdyHeaderBlock* headers) {
diff --git a/net/tools/quic/test_tools/server_thread.cc b/net/tools/quic/test_tools/server_thread.cc
index 22f52ce9..641c5fc 100644
--- a/net/tools/quic/test_tools/server_thread.cc
+++ b/net/tools/quic/test_tools/server_thread.cc
@@ -29,7 +29,7 @@
       port_(0),
       initialized_(false) {}
 
-ServerThread::~ServerThread() {}
+ServerThread::~ServerThread() = default;
 
 void ServerThread::Initialize() {
   if (initialized_) {
diff --git a/net/tools/transport_security_state_generator/bit_writer.cc b/net/tools/transport_security_state_generator/bit_writer.cc
index 82da76a..7f1b8ef 100644
--- a/net/tools/transport_security_state_generator/bit_writer.cc
+++ b/net/tools/transport_security_state_generator/bit_writer.cc
@@ -10,9 +10,9 @@
 
 namespace transport_security_state {
 
-BitWriter::BitWriter() {}
+BitWriter::BitWriter() = default;
 
-BitWriter::~BitWriter() {}
+BitWriter::~BitWriter() = default;
 
 void BitWriter::WriteBits(uint32_t bits, uint8_t number_of_bits) {
   DCHECK(number_of_bits <= 32);
diff --git a/net/tools/transport_security_state_generator/huffman/huffman_builder.cc b/net/tools/transport_security_state_generator/huffman/huffman_builder.cc
index c185c9d..ac625fd 100644
--- a/net/tools/transport_security_state_generator/huffman/huffman_builder.cc
+++ b/net/tools/transport_security_state_generator/huffman/huffman_builder.cc
@@ -24,7 +24,7 @@
         count_(count),
         left_(std::move(left)),
         right_(std::move(right)) {}
-  ~HuffmanNode() {}
+  ~HuffmanNode() = default;
 
   bool IsLeaf() const {
     return left_.get() == nullptr && right_.get() == nullptr;
@@ -49,9 +49,9 @@
 
 }  // namespace
 
-HuffmanBuilder::HuffmanBuilder() {}
+HuffmanBuilder::HuffmanBuilder() = default;
 
-HuffmanBuilder::~HuffmanBuilder() {}
+HuffmanBuilder::~HuffmanBuilder() = default;
 
 void HuffmanBuilder::RecordUsage(uint8_t character) {
   DCHECK(character < 128);
diff --git a/net/tools/transport_security_state_generator/pinset.cc b/net/tools/transport_security_state_generator/pinset.cc
index 03c2d9e4..dffd86c 100644
--- a/net/tools/transport_security_state_generator/pinset.cc
+++ b/net/tools/transport_security_state_generator/pinset.cc
@@ -11,7 +11,7 @@
 Pinset::Pinset(std::string name, std::string report_uri)
     : name_(name), report_uri_(report_uri) {}
 
-Pinset::~Pinset() {}
+Pinset::~Pinset() = default;
 
 void Pinset::AddStaticSPKIHash(const std::string& hash_name) {
   static_spki_hashes_.push_back(hash_name);
diff --git a/net/tools/transport_security_state_generator/pinsets.cc b/net/tools/transport_security_state_generator/pinsets.cc
index a9e7446a..5bf81f2 100644
--- a/net/tools/transport_security_state_generator/pinsets.cc
+++ b/net/tools/transport_security_state_generator/pinsets.cc
@@ -10,9 +10,9 @@
 
 namespace transport_security_state {
 
-Pinsets::Pinsets() {}
+Pinsets::Pinsets() = default;
 
-Pinsets::~Pinsets() {}
+Pinsets::~Pinsets() = default;
 
 void Pinsets::RegisterSPKIHash(base::StringPiece name, const SPKIHash& hash) {
   spki_hashes_.insert(std::pair<std::string, SPKIHash>(name.as_string(), hash));
diff --git a/net/tools/transport_security_state_generator/preloaded_state_generator.cc b/net/tools/transport_security_state_generator/preloaded_state_generator.cc
index a7f6db0..976cb071 100644
--- a/net/tools/transport_security_state_generator/preloaded_state_generator.cc
+++ b/net/tools/transport_security_state_generator/preloaded_state_generator.cc
@@ -124,9 +124,9 @@
 
 }  // namespace
 
-PreloadedStateGenerator::PreloadedStateGenerator() {}
+PreloadedStateGenerator::PreloadedStateGenerator() = default;
 
-PreloadedStateGenerator::~PreloadedStateGenerator() {}
+PreloadedStateGenerator::~PreloadedStateGenerator() = default;
 
 std::string PreloadedStateGenerator::Generate(
     const std::string& preload_template,
diff --git a/net/tools/transport_security_state_generator/spki_hash.cc b/net/tools/transport_security_state_generator/spki_hash.cc
index e7914c3..1fcc61e 100644
--- a/net/tools/transport_security_state_generator/spki_hash.cc
+++ b/net/tools/transport_security_state_generator/spki_hash.cc
@@ -15,9 +15,9 @@
 
 namespace transport_security_state {
 
-SPKIHash::SPKIHash() {}
+SPKIHash::SPKIHash() = default;
 
-SPKIHash::~SPKIHash() {}
+SPKIHash::~SPKIHash() = default;
 
 bool SPKIHash::FromString(base::StringPiece hash_string) {
   base::StringPiece base64_string;
diff --git a/net/tools/transport_security_state_generator/transport_security_state_entry.cc b/net/tools/transport_security_state_generator/transport_security_state_entry.cc
index 0a56beef..ac1c9db 100644
--- a/net/tools/transport_security_state_generator/transport_security_state_entry.cc
+++ b/net/tools/transport_security_state_generator/transport_security_state_entry.cc
@@ -8,8 +8,8 @@
 
 namespace transport_security_state {
 
-TransportSecurityStateEntry::TransportSecurityStateEntry() {}
-TransportSecurityStateEntry::~TransportSecurityStateEntry() {}
+TransportSecurityStateEntry::TransportSecurityStateEntry() = default;
+TransportSecurityStateEntry::~TransportSecurityStateEntry() = default;
 
 }  // namespace transport_security_state
 
diff --git a/net/tools/transport_security_state_generator/trie/trie_bit_buffer.cc b/net/tools/transport_security_state_generator/trie/trie_bit_buffer.cc
index 5add4ea..654efc77 100644
--- a/net/tools/transport_security_state_generator/trie/trie_bit_buffer.cc
+++ b/net/tools/transport_security_state_generator/trie/trie_bit_buffer.cc
@@ -11,9 +11,9 @@
 
 namespace transport_security_state {
 
-TrieBitBuffer::TrieBitBuffer() {}
+TrieBitBuffer::TrieBitBuffer() = default;
 
-TrieBitBuffer::~TrieBitBuffer() {}
+TrieBitBuffer::~TrieBitBuffer() = default;
 
 void TrieBitBuffer::WriteBit(uint8_t bit) {
   current_byte_ |= bit << (7 - used_);
diff --git a/net/tools/transport_security_state_generator/trie/trie_writer.cc b/net/tools/transport_security_state_generator/trie/trie_writer.cc
index 0f92d5b..5d83d8f 100644
--- a/net/tools/transport_security_state_generator/trie/trie_writer.cc
+++ b/net/tools/transport_security_state_generator/trie/trie_writer.cc
@@ -34,7 +34,7 @@
                              const TransportSecurityStateEntry* entry)
     : reversed_name(reversed_name), entry(entry) {}
 
-ReversedEntry::~ReversedEntry() {}
+ReversedEntry::~ReversedEntry() = default;
 
 TrieWriter::TrieWriter(const HuffmanRepresentationTable& huffman_table,
                        const NameIDMap& expect_ct_report_uri_map,
@@ -47,7 +47,7 @@
       pinsets_map_(pinsets_map),
       huffman_builder_(huffman_builder) {}
 
-TrieWriter::~TrieWriter() {}
+TrieWriter::~TrieWriter() = default;
 
 bool TrieWriter::WriteEntries(const TransportSecurityStateEntries& entries,
                               uint32_t* root_position) {
diff --git a/net/url_request/data_protocol_handler.cc b/net/url_request/data_protocol_handler.cc
index c6d9716..3f4d318e 100644
--- a/net/url_request/data_protocol_handler.cc
+++ b/net/url_request/data_protocol_handler.cc
@@ -8,8 +8,7 @@
 
 namespace net {
 
-DataProtocolHandler::DataProtocolHandler() {
-}
+DataProtocolHandler::DataProtocolHandler() = default;
 
 URLRequestJob* DataProtocolHandler::MaybeCreateJob(
     URLRequest* request, NetworkDelegate* network_delegate) const {
diff --git a/net/url_request/file_protocol_handler.cc b/net/url_request/file_protocol_handler.cc
index ff19d16ee..eb15fa2 100644
--- a/net/url_request/file_protocol_handler.cc
+++ b/net/url_request/file_protocol_handler.cc
@@ -19,7 +19,7 @@
     const scoped_refptr<base::TaskRunner>& file_task_runner)
     : file_task_runner_(file_task_runner) {}
 
-FileProtocolHandler::~FileProtocolHandler() {}
+FileProtocolHandler::~FileProtocolHandler() = default;
 
 URLRequestJob* FileProtocolHandler::MaybeCreateJob(
     URLRequest* request, NetworkDelegate* network_delegate) const {
diff --git a/net/url_request/ftp_protocol_handler.cc b/net/url_request/ftp_protocol_handler.cc
index 5a71ecbb..f8b4b56 100644
--- a/net/url_request/ftp_protocol_handler.cc
+++ b/net/url_request/ftp_protocol_handler.cc
@@ -29,8 +29,7 @@
       new FtpProtocolHandler(std::move(ftp_transaction_factory)));
 }
 
-FtpProtocolHandler::~FtpProtocolHandler() {
-}
+FtpProtocolHandler::~FtpProtocolHandler() = default;
 
 URLRequestJob* FtpProtocolHandler::MaybeCreateJob(
     URLRequest* request, NetworkDelegate* network_delegate) const {
diff --git a/net/url_request/network_error_logging_delegate.cc b/net/url_request/network_error_logging_delegate.cc
index 365e759..c9d773a 100644
--- a/net/url_request/network_error_logging_delegate.cc
+++ b/net/url_request/network_error_logging_delegate.cc
@@ -6,22 +6,15 @@
 
 namespace net {
 
-NetworkErrorLoggingDelegate::ErrorDetails::ErrorDetails() {}
+NetworkErrorLoggingDelegate::ErrorDetails::ErrorDetails() = default;
 
 NetworkErrorLoggingDelegate::ErrorDetails::ErrorDetails(
-    const ErrorDetails& other)
-    : uri(other.uri),
-      referrer(other.referrer),
-      server_ip(other.server_ip),
-      protocol(other.protocol),
-      status_code(other.status_code),
-      elapsed_time(other.elapsed_time),
-      type(other.type) {}
+    const ErrorDetails& other) = default;
 
-NetworkErrorLoggingDelegate::ErrorDetails::~ErrorDetails() {}
+NetworkErrorLoggingDelegate::ErrorDetails::~ErrorDetails() = default;
 
 const char NetworkErrorLoggingDelegate::kHeaderName[] = "NEL";
 
-NetworkErrorLoggingDelegate::~NetworkErrorLoggingDelegate() {}
+NetworkErrorLoggingDelegate::~NetworkErrorLoggingDelegate() = default;
 
 }  // namespace net
diff --git a/net/url_request/redirect_info.cc b/net/url_request/redirect_info.cc
index 3df301e..ef4cc2a 100644
--- a/net/url_request/redirect_info.cc
+++ b/net/url_request/redirect_info.cc
@@ -111,7 +111,7 @@
 
 RedirectInfo::RedirectInfo(const RedirectInfo& other) = default;
 
-RedirectInfo::~RedirectInfo() {}
+RedirectInfo::~RedirectInfo() = default;
 
 RedirectInfo RedirectInfo::ComputeRedirectInfo(
     const std::string& original_method,
diff --git a/net/url_request/report_sender.cc b/net/url_request/report_sender.cc
index f41347b..63fc6e38 100644
--- a/net/url_request/report_sender.cc
+++ b/net/url_request/report_sender.cc
@@ -23,7 +23,7 @@
                const net::ReportSender::ErrorCallback& error_callback)
       : success_callback_(success_callback), error_callback_(error_callback) {}
 
-  ~CallbackInfo() override {}
+  ~CallbackInfo() override = default;
 
   const net::ReportSender::SuccessCallback& success_callback() const {
     return success_callback_;
@@ -45,8 +45,7 @@
     : request_context_(request_context),
       traffic_annotation_(traffic_annotation) {}
 
-ReportSender::~ReportSender() {
-}
+ReportSender::~ReportSender() = default;
 
 void ReportSender::Send(const GURL& report_uri,
                         base::StringPiece content_type,
diff --git a/net/url_request/report_sender_unittest.cc b/net/url_request/report_sender_unittest.cc
index c12720b..abf3f5a 100644
--- a/net/url_request/report_sender_unittest.cc
+++ b/net/url_request/report_sender_unittest.cc
@@ -82,7 +82,7 @@
  public:
   MockServerErrorJob(URLRequest* request, NetworkDelegate* network_delegate)
       : URLRequestJob(request, network_delegate) {}
-  ~MockServerErrorJob() override {}
+  ~MockServerErrorJob() override = default;
 
  protected:
   void GetResponseInfo(HttpResponseInfo* info) override {
@@ -99,8 +99,8 @@
 
 class MockServerErrorJobInterceptor : public URLRequestInterceptor {
  public:
-  MockServerErrorJobInterceptor() {}
-  ~MockServerErrorJobInterceptor() override {}
+  MockServerErrorJobInterceptor() = default;
+  ~MockServerErrorJobInterceptor() override = default;
 
   URLRequestJob* MaybeInterceptRequest(
       URLRequest* request,
diff --git a/net/url_request/static_http_user_agent_settings.cc b/net/url_request/static_http_user_agent_settings.cc
index 84f82c4..7cc1847 100644
--- a/net/url_request/static_http_user_agent_settings.cc
+++ b/net/url_request/static_http_user_agent_settings.cc
@@ -13,8 +13,7 @@
       user_agent_(user_agent) {
 }
 
-StaticHttpUserAgentSettings::~StaticHttpUserAgentSettings() {
-}
+StaticHttpUserAgentSettings::~StaticHttpUserAgentSettings() = default;
 
 std::string StaticHttpUserAgentSettings::GetAcceptLanguage() const {
   return accept_language_;
diff --git a/net/url_request/test_url_fetcher_factory.cc b/net/url_request/test_url_fetcher_factory.cc
index 8191bfb..04027fca 100644
--- a/net/url_request/test_url_fetcher_factory.cc
+++ b/net/url_request/test_url_fetcher_factory.cc
@@ -332,7 +332,7 @@
       remove_fetcher_on_delete_(false) {
 }
 
-TestURLFetcherFactory::~TestURLFetcherFactory() {}
+TestURLFetcherFactory::~TestURLFetcherFactory() = default;
 
 std::unique_ptr<URLFetcher> TestURLFetcherFactory::CreateURLFetcher(
     int id,
@@ -392,7 +392,7 @@
   response_bytes_ = response_data.size();
 }
 
-FakeURLFetcher::~FakeURLFetcher() {}
+FakeURLFetcher::~FakeURLFetcher() = default;
 
 void FakeURLFetcher::Start() {
   TestURLFetcher::Start();
@@ -442,7 +442,7 @@
       new FakeURLFetcher(url, delegate, response_data, response_code, status));
 }
 
-FakeURLFetcherFactory::~FakeURLFetcherFactory() {}
+FakeURLFetcherFactory::~FakeURLFetcherFactory() = default;
 
 std::unique_ptr<URLFetcher> FakeURLFetcherFactory::CreateURLFetcher(
     int id,
@@ -485,9 +485,9 @@
   fake_responses_.clear();
 }
 
-URLFetcherImplFactory::URLFetcherImplFactory() {}
+URLFetcherImplFactory::URLFetcherImplFactory() = default;
 
-URLFetcherImplFactory::~URLFetcherImplFactory() {}
+URLFetcherImplFactory::~URLFetcherImplFactory() = default;
 
 std::unique_ptr<URLFetcher> URLFetcherImplFactory::CreateURLFetcher(
     int id,
diff --git a/net/url_request/test_url_request_interceptor.cc b/net/url_request/test_url_request_interceptor.cc
index 063a4b5..56b8d66 100644
--- a/net/url_request/test_url_request_interceptor.cc
+++ b/net/url_request/test_url_request_interceptor.cc
@@ -38,7 +38,7 @@
   }
 
  private:
-  ~TestURLRequestJob() override {}
+  ~TestURLRequestJob() override = default;
 
   DISALLOW_COPY_AND_ASSIGN(TestURLRequestJob);
 };
@@ -59,7 +59,7 @@
         network_task_runner_(network_task_runner),
         worker_task_runner_(worker_task_runner),
         hit_count_(0) {}
-  ~Delegate() override {}
+  ~Delegate() override = default;
 
   void Register() {
     URLRequestFilter::GetInstance()->AddHostnameInterceptor(
diff --git a/net/url_request/url_fetcher.cc b/net/url_request/url_fetcher.cc
index 52d67c8c..e815b57 100644
--- a/net/url_request/url_fetcher.cc
+++ b/net/url_request/url_fetcher.cc
@@ -9,7 +9,7 @@
 
 namespace net {
 
-URLFetcher::~URLFetcher() {}
+URLFetcher::~URLFetcher() = default;
 
 // static
 std::unique_ptr<URLFetcher> URLFetcher::Create(
diff --git a/net/url_request/url_fetcher_core.cc b/net/url_request/url_fetcher_core.cc
index e55d11b..e8254a9 100644
--- a/net/url_request/url_fetcher_core.cc
+++ b/net/url_request/url_fetcher_core.cc
@@ -44,8 +44,8 @@
 
 // URLFetcherCore::Registry ---------------------------------------------------
 
-URLFetcherCore::Registry::Registry() {}
-URLFetcherCore::Registry::~Registry() {}
+URLFetcherCore::Registry::Registry() = default;
+URLFetcherCore::Registry::~Registry() = default;
 
 void URLFetcherCore::Registry::AddURLFetcherCore(URLFetcherCore* core) {
   DCHECK(!base::ContainsKey(fetchers_, core));
diff --git a/net/url_request/url_fetcher_delegate.cc b/net/url_request/url_fetcher_delegate.cc
index 18b9ab1..359b8172 100644
--- a/net/url_request/url_fetcher_delegate.cc
+++ b/net/url_request/url_fetcher_delegate.cc
@@ -16,6 +16,6 @@
                                                   int64_t current,
                                                   int64_t total) {}
 
-URLFetcherDelegate::~URLFetcherDelegate() {}
+URLFetcherDelegate::~URLFetcherDelegate() = default;
 
 }  // namespace net
diff --git a/net/url_request/url_fetcher_impl_unittest.cc b/net/url_request/url_fetcher_impl_unittest.cc
index ea72642..080d1101 100644
--- a/net/url_request/url_fetcher_impl_unittest.cc
+++ b/net/url_request/url_fetcher_impl_unittest.cc
@@ -488,7 +488,7 @@
 // Version of URLFetcherTest that tests bad HTTPS requests.
 class URLFetcherBadHTTPSTest : public URLFetcherTest {
  public:
-  URLFetcherBadHTTPSTest() {}
+  URLFetcherBadHTTPSTest() = default;
 
   // URLFetcherTest:
   void SetUpServer() override {
@@ -933,7 +933,7 @@
  public:
   CheckUploadProgressDelegate()
       : chunk_(1 << 16, 'a'), num_chunks_appended_(0), last_seen_progress_(0) {}
-  ~CheckUploadProgressDelegate() override {}
+  ~CheckUploadProgressDelegate() override = default;
 
   void OnURLFetchUploadProgress(const URLFetcher* source,
                                 int64_t current,
@@ -1000,7 +1000,7 @@
  public:
   CheckDownloadProgressDelegate(int64_t file_size)
       : file_size_(file_size), last_seen_progress_(0) {}
-  ~CheckDownloadProgressDelegate() override {}
+  ~CheckDownloadProgressDelegate() override = default;
 
   void OnURLFetchDownloadProgress(const URLFetcher* source,
                                   int64_t current,
@@ -1050,8 +1050,8 @@
 
 class CancelOnUploadProgressDelegate : public WaitingURLFetcherDelegate {
  public:
-  CancelOnUploadProgressDelegate() {}
-  ~CancelOnUploadProgressDelegate() override {}
+  CancelOnUploadProgressDelegate() = default;
+  ~CancelOnUploadProgressDelegate() override = default;
 
   void OnURLFetchUploadProgress(const URLFetcher* source,
                                 int64_t current,
@@ -1087,8 +1087,8 @@
 
 class CancelOnDownloadProgressDelegate : public WaitingURLFetcherDelegate {
  public:
-  CancelOnDownloadProgressDelegate() {}
-  ~CancelOnDownloadProgressDelegate() override {}
+  CancelOnDownloadProgressDelegate() = default;
+  ~CancelOnDownloadProgressDelegate() override = default;
 
   void OnURLFetchDownloadProgress(const URLFetcher* source,
                                   int64_t current,
@@ -1402,7 +1402,7 @@
       : first_request_complete_(false),
         second_request_context_getter_(second_request_context_getter) {}
 
-  ~ReuseFetcherDelegate() override {}
+  ~ReuseFetcherDelegate() override = default;
 
   void OnURLFetchComplete(const URLFetcher* source) override {
     EXPECT_EQ(fetcher(), source);
diff --git a/net/url_request/url_fetcher_response_writer.cc b/net/url_request/url_fetcher_response_writer.cc
index 3286e675..de0edd5 100644
--- a/net/url_request/url_fetcher_response_writer.cc
+++ b/net/url_request/url_fetcher_response_writer.cc
@@ -23,11 +23,9 @@
   return NULL;
 }
 
-URLFetcherStringWriter::URLFetcherStringWriter() {
-}
+URLFetcherStringWriter::URLFetcherStringWriter() = default;
 
-URLFetcherStringWriter::~URLFetcherStringWriter() {
-}
+URLFetcherStringWriter::~URLFetcherStringWriter() = default;
 
 int URLFetcherStringWriter::Initialize(const CompletionCallback& callback) {
   data_.clear();
diff --git a/net/url_request/url_range_request_job.cc b/net/url_request/url_range_request_job.cc
index cad7b836..68cf156 100644
--- a/net/url_request/url_range_request_job.cc
+++ b/net/url_request/url_range_request_job.cc
@@ -15,8 +15,7 @@
     : URLRequestJob(request, delegate), range_parse_result_(OK) {
 }
 
-URLRangeRequestJob::~URLRangeRequestJob() {
-}
+URLRangeRequestJob::~URLRangeRequestJob() = default;
 
 void URLRangeRequestJob::SetExtraRequestHeaders(
     const HttpRequestHeaders& headers) {
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index fb354c3a..0d566da4 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -71,8 +71,8 @@
 
 class BasicNetworkDelegate : public NetworkDelegateImpl {
  public:
-  BasicNetworkDelegate() {}
-  ~BasicNetworkDelegate() override {}
+  BasicNetworkDelegate() = default;
+  ~BasicNetworkDelegate() override = default;
 
  private:
   int OnBeforeURLRequest(URLRequest* request,
@@ -186,7 +186,7 @@
 URLRequestContextBuilder::HttpCacheParams::HttpCacheParams()
     : type(IN_MEMORY),
       max_size(0) {}
-URLRequestContextBuilder::HttpCacheParams::~HttpCacheParams() {}
+URLRequestContextBuilder::HttpCacheParams::~HttpCacheParams() = default;
 
 URLRequestContextBuilder::URLRequestContextBuilder()
     : enable_brotli_(false),
@@ -215,7 +215,7 @@
 #endif  // !BUILDFLAG(ENABLE_REPORTING)
 }
 
-URLRequestContextBuilder::~URLRequestContextBuilder() {}
+URLRequestContextBuilder::~URLRequestContextBuilder() = default;
 
 void URLRequestContextBuilder::SetHttpNetworkSessionComponents(
     const URLRequestContext* request_context,
diff --git a/net/url_request/url_request_context_builder_unittest.cc b/net/url_request/url_request_context_builder_unittest.cc
index 3987f1a..bb0e450 100644
--- a/net/url_request/url_request_context_builder_unittest.cc
+++ b/net/url_request/url_request_context_builder_unittest.cc
@@ -32,7 +32,7 @@
  public:
   MockHttpAuthHandlerFactory(std::string supported_scheme, int return_code)
       : return_code_(return_code), supported_scheme_(supported_scheme) {}
-  ~MockHttpAuthHandlerFactory() override {}
+  ~MockHttpAuthHandlerFactory() override = default;
 
   int CreateAuthHandler(HttpAuthChallengeTokenizer* challenge,
                         HttpAuth::Target target,
diff --git a/net/url_request/url_request_context_getter.cc b/net/url_request/url_request_context_getter.cc
index 0bad748..028a449 100644
--- a/net/url_request/url_request_context_getter.cc
+++ b/net/url_request/url_request_context_getter.cc
@@ -24,9 +24,9 @@
   observer_list_.RemoveObserver(observer);
 }
 
-URLRequestContextGetter::URLRequestContextGetter() {}
+URLRequestContextGetter::URLRequestContextGetter() = default;
 
-URLRequestContextGetter::~URLRequestContextGetter() {}
+URLRequestContextGetter::~URLRequestContextGetter() = default;
 
 void URLRequestContextGetter::OnDestruct() const {
   scoped_refptr<base::SingleThreadTaskRunner> network_task_runner =
@@ -67,7 +67,7 @@
     : context_(context), main_task_runner_(main_task_runner) {
 }
 
-TrivialURLRequestContextGetter::~TrivialURLRequestContextGetter() {}
+TrivialURLRequestContextGetter::~TrivialURLRequestContextGetter() = default;
 
 URLRequestContext* TrivialURLRequestContextGetter::GetURLRequestContext() {
   return context_;
diff --git a/net/url_request/url_request_context_storage.cc b/net/url_request/url_request_context_storage.cc
index 703bf56..b804e251 100644
--- a/net/url_request/url_request_context_storage.cc
+++ b/net/url_request/url_request_context_storage.cc
@@ -37,7 +37,7 @@
   DCHECK(context);
 }
 
-URLRequestContextStorage::~URLRequestContextStorage() {}
+URLRequestContextStorage::~URLRequestContextStorage() = default;
 
 void URLRequestContextStorage::set_net_log(std::unique_ptr<NetLog> net_log) {
   context_->set_net_log(net_log.get());
diff --git a/net/url_request/url_request_data_job.cc b/net/url_request/url_request_data_job.cc
index 56d243f..a3c7b7b 100644
--- a/net/url_request/url_request_data_job.cc
+++ b/net/url_request/url_request_data_job.cc
@@ -63,7 +63,6 @@
   return BuildResponse(url, mime_type, charset, data, NULL);
 }
 
-URLRequestDataJob::~URLRequestDataJob() {
-}
+URLRequestDataJob::~URLRequestDataJob() = default;
 
 }  // namespace net
diff --git a/net/url_request/url_request_error_job.cc b/net/url_request/url_request_error_job.cc
index 8a6b5c8..85ab61f2 100644
--- a/net/url_request/url_request_error_job.cc
+++ b/net/url_request/url_request_error_job.cc
@@ -20,7 +20,7 @@
       error_(error),
       weak_factory_(this) {}
 
-URLRequestErrorJob::~URLRequestErrorJob() {}
+URLRequestErrorJob::~URLRequestErrorJob() = default;
 
 void URLRequestErrorJob::Start() {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/net/url_request/url_request_file_dir_job.cc b/net/url_request/url_request_file_dir_job.cc
index b34b571..1d44ad6 100644
--- a/net/url_request/url_request_file_dir_job.cc
+++ b/net/url_request/url_request_file_dir_job.cc
@@ -153,7 +153,7 @@
   CompleteRead(list_complete_result_);
 }
 
-URLRequestFileDirJob::~URLRequestFileDirJob() {}
+URLRequestFileDirJob::~URLRequestFileDirJob() = default;
 
 void URLRequestFileDirJob::DidMakeAbsolutePath(
     const base::FilePath& absolute_path) {
diff --git a/net/url_request/url_request_file_dir_job_unittest.cc b/net/url_request/url_request_file_dir_job_unittest.cc
index de0f004a..443766d 100644
--- a/net/url_request/url_request_file_dir_job_unittest.cc
+++ b/net/url_request/url_request_file_dir_job_unittest.cc
@@ -85,7 +85,7 @@
 class TestJobFactory : public URLRequestJobFactory {
  public:
   explicit TestJobFactory(const base::FilePath& path) : path_(path) {}
-  ~TestJobFactory() override {}
+  ~TestJobFactory() override = default;
 
   URLRequestJob* MaybeCreateJobWithProtocolHandler(
       const std::string& scheme,
@@ -125,9 +125,9 @@
 
 class TestDirectoryURLRequestDelegate : public TestDelegate {
  public:
-  TestDirectoryURLRequestDelegate() {}
+  TestDirectoryURLRequestDelegate() = default;
 
-  ~TestDirectoryURLRequestDelegate() override {}
+  ~TestDirectoryURLRequestDelegate() override = default;
 
   void OnResponseStarted(URLRequest* request, int net_error) override {
     got_response_started_ = true;
diff --git a/net/url_request/url_request_file_job.cc b/net/url_request/url_request_file_job.cc
index 8951925..7076a8ca 100644
--- a/net/url_request/url_request_file_job.cc
+++ b/net/url_request/url_request_file_job.cc
@@ -184,8 +184,7 @@
 void URLRequestFileJob::OnReadComplete(IOBuffer* buf, int result) {
 }
 
-URLRequestFileJob::~URLRequestFileJob() {
-}
+URLRequestFileJob::~URLRequestFileJob() = default;
 
 std::unique_ptr<SourceStream> URLRequestFileJob::SetUpSourceStream() {
   std::unique_ptr<SourceStream> source = URLRequestJob::SetUpSourceStream();
diff --git a/net/url_request/url_request_file_job_unittest.cc b/net/url_request/url_request_file_job_unittest.cc
index 7e8cddc3..6033669 100644
--- a/net/url_request/url_request_file_job_unittest.cc
+++ b/net/url_request/url_request_file_job_unittest.cc
@@ -54,7 +54,7 @@
     observed_content_->clear();
   }
 
-  ~TestURLRequestFileJob() override {}
+  ~TestURLRequestFileJob() override = default;
 
  protected:
   void OnOpenComplete(int result) override {
@@ -105,7 +105,7 @@
     CHECK(observed_content_);
   }
 
-  ~TestJobFactory() override {}
+  ~TestJobFactory() override = default;
 
   URLRequestJob* MaybeCreateJobWithProtocolHandler(
       const std::string& scheme,
@@ -219,7 +219,7 @@
   TestDelegate delegate_;
 };
 
-URLRequestFileJobEventsTest::URLRequestFileJobEventsTest() {}
+URLRequestFileJobEventsTest::URLRequestFileJobEventsTest() = default;
 
 void URLRequestFileJobEventsTest::TearDown() {
   // Gives a chance to close the opening file.
diff --git a/net/url_request/url_request_filter_unittest.cc b/net/url_request/url_request_filter_unittest.cc
index 9ee52df..be5e3f6 100644
--- a/net/url_request/url_request_filter_unittest.cc
+++ b/net/url_request/url_request_filter_unittest.cc
@@ -24,7 +24,7 @@
 class TestURLRequestInterceptor : public URLRequestInterceptor {
  public:
   TestURLRequestInterceptor() : job_(nullptr) {}
-  ~TestURLRequestInterceptor() override {}
+  ~TestURLRequestInterceptor() override = default;
 
   // URLRequestInterceptor implementation:
   URLRequestJob* MaybeInterceptRequest(
diff --git a/net/url_request/url_request_ftp_job.cc b/net/url_request/url_request_ftp_job.cc
index e73bac0..8037581 100644
--- a/net/url_request/url_request_ftp_job.cc
+++ b/net/url_request/url_request_ftp_job.cc
@@ -35,7 +35,7 @@
 
 URLRequestFtpJob::AuthData::AuthData() : state(AUTH_STATE_NEED_AUTH) {}
 
-URLRequestFtpJob::AuthData::~AuthData() {}
+URLRequestFtpJob::AuthData::~AuthData() = default;
 
 URLRequestFtpJob::URLRequestFtpJob(
     URLRequest* request,
diff --git a/net/url_request/url_request_ftp_job_unittest.cc b/net/url_request/url_request_ftp_job_unittest.cc
index e3eb668..770c5ab 100644
--- a/net/url_request/url_request_ftp_job_unittest.cc
+++ b/net/url_request/url_request_ftp_job_unittest.cc
@@ -144,7 +144,7 @@
                        FtpTransactionFactory* ftp_factory,
                        FtpAuthCache* ftp_auth_cache)
       : URLRequestFtpJob(request, NULL, ftp_factory, ftp_auth_cache) {}
-  ~TestURLRequestFtpJob() override {}
+  ~TestURLRequestFtpJob() override = default;
 
   using URLRequestFtpJob::SetPriority;
   using URLRequestFtpJob::Start;
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 1b1afc07..3e8d80ad 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -88,6 +88,12 @@
 // last. This complements the per-verification histogram
 // Net.Certificate.TrustAnchor.Verify
 void LogTrustAnchor(const net::HashValueVector& spki_hashes) {
+  // Don't record metrics if there are no hashes; this is true if the HTTP
+  // load did not come from an active network connection, such as the disk
+  // cache or a synthesized response.
+  if (spki_hashes.empty())
+    return;
+
   int32_t id = 0;
   for (const auto& hash : spki_hashes) {
     id = net::GetNetTrustAnchorHistogramIdForSPKI(hash);
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc
index e0820ee..5d5377e 100644
--- a/net/url_request/url_request_http_job_unittest.cc
+++ b/net/url_request/url_request_http_job_unittest.cc
@@ -94,7 +94,7 @@
                           request->context()->http_user_agent_settings()),
         use_null_source_stream_(false) {}
 
-  ~TestURLRequestHttpJob() override {}
+  ~TestURLRequestHttpJob() override = default;
 
   // URLRequestJob implementation:
   std::unique_ptr<SourceStream> SetUpSourceStream() override {
@@ -1017,6 +1017,39 @@
 }
 
 TEST_F(URLRequestHttpJobWithMockSocketsTest,
+       TestHttpJobDoesNotRecordTrustAnchorHistogramsWhenNoNetworkLoad) {
+  SSLSocketDataProvider ssl_socket_data(net::ASYNC, net::OK);
+  ssl_socket_data.ssl_info.cert =
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  // Simulate a request loaded from a non-network source, such as a disk
+  // cache.
+  ssl_socket_data.ssl_info.public_key_hashes.clear();
+
+  socket_factory_.AddSSLSocketDataProvider(&ssl_socket_data);
+
+  MockWrite writes[] = {MockWrite(kSimpleGetMockWrite)};
+  MockRead reads[] = {MockRead("HTTP/1.1 200 OK\r\n"
+                               "Content-Length: 12\r\n\r\n"),
+                      MockRead("Test Content")};
+  StaticSocketDataProvider socket_data(reads, arraysize(reads), writes,
+                                       arraysize(writes));
+  socket_factory_.AddSocketDataProvider(&socket_data);
+
+  base::HistogramTester histograms;
+  histograms.ExpectTotalCount(kTrustAnchorRequestHistogram, 0);
+
+  TestDelegate delegate;
+  std::unique_ptr<URLRequest> request = context_->CreateRequest(
+      GURL("https://www.example.com/"), DEFAULT_PRIORITY, &delegate,
+      TRAFFIC_ANNOTATION_FOR_TESTS);
+  request->Start();
+  base::RunLoop().Run();
+  EXPECT_THAT(delegate.request_status(), IsOk());
+
+  histograms.ExpectTotalCount(kTrustAnchorRequestHistogram, 0);
+}
+
+TEST_F(URLRequestHttpJobWithMockSocketsTest,
        TestHttpJobRecordsMostSpecificTrustAnchorHistograms) {
   SSLSocketDataProvider ssl_socket_data(net::ASYNC, net::OK);
   ssl_socket_data.ssl_info.cert =
diff --git a/net/url_request/url_request_interceptor.cc b/net/url_request/url_request_interceptor.cc
index b93611b..29801d7 100644
--- a/net/url_request/url_request_interceptor.cc
+++ b/net/url_request/url_request_interceptor.cc
@@ -6,11 +6,9 @@
 
 namespace net {
 
-URLRequestInterceptor::URLRequestInterceptor() {
-}
+URLRequestInterceptor::URLRequestInterceptor() = default;
 
-URLRequestInterceptor::~URLRequestInterceptor() {
-}
+URLRequestInterceptor::~URLRequestInterceptor() = default;
 
 URLRequestJob* URLRequestInterceptor::MaybeInterceptRedirect(
     URLRequest* request,
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc
index 706696d..25e971d7 100644
--- a/net/url_request/url_request_job.cc
+++ b/net/url_request/url_request_job.cc
@@ -58,7 +58,7 @@
     DCHECK(job_);
   }
 
-  ~URLRequestJobSourceStream() override {}
+  ~URLRequestJobSourceStream() override = default;
 
   // SourceStream implementation:
   int Read(IOBuffer* dest_buffer,
diff --git a/net/url_request/url_request_job_factory.cc b/net/url_request/url_request_job_factory.cc
index 9895ae1c..7df9291 100644
--- a/net/url_request/url_request_job_factory.cc
+++ b/net/url_request/url_request_job_factory.cc
@@ -6,14 +6,14 @@
 
 namespace net {
 
-URLRequestJobFactory::ProtocolHandler::~ProtocolHandler() {}
+URLRequestJobFactory::ProtocolHandler::~ProtocolHandler() = default;
 
 bool URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget(
     const GURL& location) const {
   return true;
 }
 
-URLRequestJobFactory::URLRequestJobFactory() {}
+URLRequestJobFactory::URLRequestJobFactory() = default;
 
 URLRequestJobFactory::~URLRequestJobFactory() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/net/url_request/url_request_job_factory_impl.cc b/net/url_request/url_request_job_factory_impl.cc
index 9bc8cd48..61187634 100644
--- a/net/url_request/url_request_job_factory_impl.cc
+++ b/net/url_request/url_request_job_factory_impl.cc
@@ -18,9 +18,9 @@
 
 }  // namespace
 
-URLRequestJobFactoryImpl::URLRequestJobFactoryImpl() {}
+URLRequestJobFactoryImpl::URLRequestJobFactoryImpl() = default;
 
-URLRequestJobFactoryImpl::~URLRequestJobFactoryImpl() {}
+URLRequestJobFactoryImpl::~URLRequestJobFactoryImpl() = default;
 
 bool URLRequestJobFactoryImpl::SetProtocolHandler(
     const std::string& scheme,
diff --git a/net/url_request/url_request_job_factory_impl_unittest.cc b/net/url_request/url_request_job_factory_impl_unittest.cc
index 3fc08177..0034152c 100644
--- a/net/url_request/url_request_job_factory_impl_unittest.cc
+++ b/net/url_request/url_request_job_factory_impl_unittest.cc
@@ -40,7 +40,7 @@
   }
 
  protected:
-  ~MockURLRequestJob() override {}
+  ~MockURLRequestJob() override = default;
 
  private:
   void StartAsync() {
diff --git a/net/url_request/url_request_job_manager.cc b/net/url_request/url_request_job_manager.cc
index 7d630ee0..0817a12 100644
--- a/net/url_request/url_request_job_manager.cc
+++ b/net/url_request/url_request_job_manager.cc
@@ -151,9 +151,8 @@
   return false;
 }
 
-URLRequestJobManager::URLRequestJobManager() {
-}
+URLRequestJobManager::URLRequestJobManager() = default;
 
-URLRequestJobManager::~URLRequestJobManager() {}
+URLRequestJobManager::~URLRequestJobManager() = default;
 
 }  // namespace net
diff --git a/net/url_request/url_request_redirect_job.cc b/net/url_request/url_request_redirect_job.cc
index 3ca1ef37..a53e3dc2 100644
--- a/net/url_request/url_request_redirect_job.cc
+++ b/net/url_request/url_request_redirect_job.cc
@@ -38,7 +38,7 @@
   DCHECK(!redirect_reason_.empty());
 }
 
-URLRequestRedirectJob::~URLRequestRedirectJob() {}
+URLRequestRedirectJob::~URLRequestRedirectJob() = default;
 
 void URLRequestRedirectJob::GetResponseInfo(HttpResponseInfo* info) {
   // Should only be called after the URLRequest has been notified there's header
diff --git a/net/url_request/url_request_simple_job.cc b/net/url_request/url_request_simple_job.cc
index df8bca28..3e1dec95 100644
--- a/net/url_request/url_request_simple_job.cc
+++ b/net/url_request/url_request_simple_job.cc
@@ -62,7 +62,7 @@
   return true;
 }
 
-URLRequestSimpleJob::~URLRequestSimpleJob() {}
+URLRequestSimpleJob::~URLRequestSimpleJob() = default;
 
 int URLRequestSimpleJob::ReadRawData(IOBuffer* buf, int buf_size) {
   buf_size = std::min(static_cast<int64_t>(buf_size),
diff --git a/net/url_request/url_request_simple_job_unittest.cc b/net/url_request/url_request_simple_job_unittest.cc
index 69796e6..71ec521 100644
--- a/net/url_request/url_request_simple_job_unittest.cc
+++ b/net/url_request/url_request_simple_job_unittest.cc
@@ -60,7 +60,7 @@
   }
 
  private:
-  ~MockSimpleJob() override {}
+  ~MockSimpleJob() override = default;
 
   const std::string data_;
 
@@ -71,7 +71,7 @@
  public:
   CancelAfterFirstReadURLRequestDelegate() : run_loop_(new base::RunLoop) {}
 
-  ~CancelAfterFirstReadURLRequestDelegate() override {}
+  ~CancelAfterFirstReadURLRequestDelegate() override = default;
 
   void OnResponseStarted(URLRequest* request, int net_error) override {
     DCHECK_NE(ERR_IO_PENDING, net_error);
@@ -101,7 +101,7 @@
     return new MockSimpleJob(request, network_delegate, kTestData);
   }
 
-  ~SimpleJobProtocolHandler() override {}
+  ~SimpleJobProtocolHandler() override = default;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(SimpleJobProtocolHandler);
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index 17cd976..9a34c24e 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -162,7 +162,7 @@
   DCHECK(network_task_runner_.get());
 }
 
-TestURLRequestContextGetter::~TestURLRequestContextGetter() {}
+TestURLRequestContextGetter::~TestURLRequestContextGetter() = default;
 
 TestURLRequestContext* TestURLRequestContextGetter::GetURLRequestContext() {
   if (!context_.get())
@@ -197,7 +197,7 @@
       request_status_(ERR_IO_PENDING),
       buf_(new IOBuffer(kBufferSize)) {}
 
-TestDelegate::~TestDelegate() {}
+TestDelegate::~TestDelegate() = default;
 
 void TestDelegate::ClearFullRequestHeaders() {
   full_request_headers_.Clear();
@@ -667,9 +667,9 @@
   return cancel_request_with_policy_violating_referrer_;
 }
 
-TestJobInterceptor::TestJobInterceptor() {}
+TestJobInterceptor::TestJobInterceptor() = default;
 
-TestJobInterceptor::~TestJobInterceptor() {}
+TestJobInterceptor::~TestJobInterceptor() = default;
 
 URLRequestJob* TestJobInterceptor::MaybeCreateJob(
     URLRequest* request,
diff --git a/net/url_request/url_request_throttler_entry.cc b/net/url_request/url_request_throttler_entry.cc
index f81e1b5..463c0ee5 100644
--- a/net/url_request/url_request_throttler_entry.cc
+++ b/net/url_request/url_request_throttler_entry.cc
@@ -236,8 +236,7 @@
   }
 }
 
-URLRequestThrottlerEntry::~URLRequestThrottlerEntry() {
-}
+URLRequestThrottlerEntry::~URLRequestThrottlerEntry() = default;
 
 void URLRequestThrottlerEntry::Initialize() {
   sliding_window_release_time_ = base::TimeTicks::Now();
diff --git a/net/url_request/url_request_throttler_simulation_unittest.cc b/net/url_request/url_request_throttler_simulation_unittest.cc
index f332084..7041118 100644
--- a/net/url_request/url_request_throttler_simulation_unittest.cc
+++ b/net/url_request/url_request_throttler_simulation_unittest.cc
@@ -70,12 +70,12 @@
  public:
   class Actor {
    public:
-    virtual ~Actor() {}
+    virtual ~Actor() = default;
     virtual void AdvanceTime(const TimeTicks& absolute_time) = 0;
     virtual void PerformAction() = 0;
   };
 
-  DiscreteTimeSimulation() {}
+  DiscreteTimeSimulation() = default;
 
   // Adds an |actor| to the simulation. The client of the simulation maintains
   // ownership of |actor| and must ensure its lifetime exceeds that of the
@@ -322,7 +322,7 @@
   }
 
  protected:
-  ~MockURLRequestThrottlerEntry() override {}
+  ~MockURLRequestThrottlerEntry() override = default;
 
  private:
   mutable TestTickClock fake_clock_;
diff --git a/net/url_request/url_request_throttler_test_support.cc b/net/url_request/url_request_throttler_test_support.cc
index 8d10335..d1ef6ca 100644
--- a/net/url_request/url_request_throttler_test_support.cc
+++ b/net/url_request/url_request_throttler_test_support.cc
@@ -8,11 +8,11 @@
 
 namespace net {
 
-TestTickClock::TestTickClock() {}
+TestTickClock::TestTickClock() = default;
 
 TestTickClock::TestTickClock(base::TimeTicks now) : now_ticks_(now) {}
 
-TestTickClock::~TestTickClock() {}
+TestTickClock::~TestTickClock() = default;
 
 base::TimeTicks TestTickClock::NowTicks() {
   return now_ticks_;
diff --git a/net/url_request/url_request_throttler_unittest.cc b/net/url_request/url_request_throttler_unittest.cc
index 702c1348..c2301e51 100644
--- a/net/url_request/url_request_throttler_unittest.cc
+++ b/net/url_request/url_request_throttler_unittest.cc
@@ -92,7 +92,7 @@
   }
 
  protected:
-  ~MockURLRequestThrottlerEntry() override {}
+  ~MockURLRequestThrottlerEntry() override = default;
 
  private:
   mutable TestTickClock fake_clock_;
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 07a8d4e..1aa782f 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -320,8 +320,8 @@
 // the one in base/ because it insists on bringing its own MessageLoop.
 class TestPowerMonitorSource : public base::PowerMonitorSource {
  public:
-  TestPowerMonitorSource() {}
-  ~TestPowerMonitorSource() override {}
+  TestPowerMonitorSource() = default;
+  ~TestPowerMonitorSource() override = default;
 
   void Suspend() { ProcessPowerEvent(SUSPEND_EVENT); }
 
@@ -736,7 +736,7 @@
     set_network_delegate(delegate);
     Init();
   }
-  ~TestURLRequestContextWithProxy() override {}
+  ~TestURLRequestContextWithProxy() override = default;
 };
 
 // A mock ReportSenderInterface that just remembers the latest report
@@ -744,8 +744,8 @@
 class MockCertificateReportSender
     : public TransportSecurityState::ReportSenderInterface {
  public:
-  MockCertificateReportSender() {}
-  ~MockCertificateReportSender() override {}
+  MockCertificateReportSender() = default;
+  ~MockCertificateReportSender() override = default;
 
   void Send(const GURL& report_uri,
             base::StringPiece content_type,
@@ -880,7 +880,8 @@
 // whitelisted files are allowed.
 class CookieBlockingNetworkDelegate : public TestNetworkDelegate {
  public:
-  CookieBlockingNetworkDelegate(){};
+  CookieBlockingNetworkDelegate() = default;
+  ;
 
   // Adds |directory| to the access white list.
   void AddToWhitelist(const base::FilePath& directory) {
@@ -1499,7 +1500,7 @@
  protected:
   void StartAsync() override { this->NotifyRestartRequired(); }
  private:
-  ~RestartTestJob() override {}
+  ~RestartTestJob() override = default;
 };
 
 class CancelTestJob : public URLRequestTestJob {
@@ -1509,7 +1510,7 @@
  protected:
   void StartAsync() override { request_->Cancel(); }
  private:
-  ~CancelTestJob() override {}
+  ~CancelTestJob() override = default;
 };
 
 class CancelThenRestartTestJob : public URLRequestTestJob {
@@ -1524,7 +1525,7 @@
     this->NotifyRestartRequired();
   }
  private:
-  ~CancelThenRestartTestJob() override {}
+  ~CancelThenRestartTestJob() override = default;
 };
 
 // An Interceptor for use with interceptor tests.
@@ -1569,8 +1570,7 @@
         did_intercept_final_(false), did_cancel_final_(false) {
   }
 
-  ~MockURLRequestInterceptor() override {
-  }
+  ~MockURLRequestInterceptor() override = default;
 
   // URLRequestInterceptor implementation:
   URLRequestJob* MaybeInterceptRequest(
@@ -3398,7 +3398,7 @@
  public:
   explicit FixedDateNetworkDelegate(const std::string& fixed_date)
       : fixed_date_(fixed_date) {}
-  ~FixedDateNetworkDelegate() override {}
+  ~FixedDateNetworkDelegate() override = default;
 
   // NetworkDelegate implementation
   int OnHeadersReceived(
@@ -3749,7 +3749,7 @@
   }
 
  protected:
-  ~TestSSLConfigService() override {}
+  ~TestSSLConfigService() override = default;
 
  private:
   const bool ev_enabled_;
@@ -5231,7 +5231,7 @@
         callback_(callback) {
   }
 
-  ~AsyncDelegateLogger() {}
+  ~AsyncDelegateLogger() = default;
 
   void Start() {
     url_request_->LogBlockedBy(kFirstDelegateInfo);
@@ -5278,8 +5278,8 @@
 // is requested.  Uses AsyncDelegateLogger.
 class AsyncLoggingNetworkDelegate : public TestNetworkDelegate {
  public:
-  AsyncLoggingNetworkDelegate() {}
-  ~AsyncLoggingNetworkDelegate() override {}
+  AsyncLoggingNetworkDelegate() = default;
+  ~AsyncLoggingNetworkDelegate() override = default;
 
   // NetworkDelegate implementation.
   int OnBeforeURLRequest(URLRequest* request,
@@ -5371,7 +5371,7 @@
     else if (cancel_stage == CANCEL_ON_READ_COMPLETED)
       set_cancel_in_received_data(true);
   }
-  ~AsyncLoggingUrlRequestDelegate() override {}
+  ~AsyncLoggingUrlRequestDelegate() override = default;
 
   // URLRequest::Delegate implementation:
   void OnReceivedRedirect(URLRequest* request,
@@ -6783,7 +6783,7 @@
 class MockExpectCTReporter : public TransportSecurityState::ExpectCTReporter {
  public:
   MockExpectCTReporter() : num_failures_(0) {}
-  ~MockExpectCTReporter() override {}
+  ~MockExpectCTReporter() override = default;
 
   void OnExpectCTFailed(const HostPortPair& host_port_pair,
                         const GURL& report_uri,
@@ -6807,7 +6807,7 @@
  public:
   MockCTPolicyEnforcer()
       : default_result_(ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS) {}
-  ~MockCTPolicyEnforcer() override {}
+  ~MockCTPolicyEnforcer() override = default;
 
   ct::CTPolicyCompliance CheckCompliance(
       X509Certificate* cert,
@@ -7023,7 +7023,7 @@
 
   // ReportingService implementation:
 
-  ~TestReportingService() override {}
+  ~TestReportingService() override = default;
 
   void QueueReport(const GURL& url,
                    const std::string& group,
@@ -7155,8 +7155,8 @@
 class TestNetworkErrorLoggingDelegate : public NetworkErrorLoggingDelegate {
  public:
   struct Header {
-    Header() {}
-    ~Header() {}
+    Header() = default;
+    ~Header() = default;
 
     url::Origin origin;
     std::string value;
@@ -7167,7 +7167,7 @@
 
   // NetworkErrorLoggingDelegate implementation:
 
-  ~TestNetworkErrorLoggingDelegate() override {}
+  ~TestNetworkErrorLoggingDelegate() override = default;
 
   void SetReportingService(ReportingService* reporting_service) override {
     NOTREACHED();
@@ -8646,7 +8646,7 @@
   explicit FailingHttpTransactionFactory(HttpNetworkSession* network_session)
       : network_session_(network_session) {}
 
-  ~FailingHttpTransactionFactory() override {}
+  ~FailingHttpTransactionFactory() override = default;
 
   // HttpTransactionFactory methods:
   int CreateTransaction(RequestPriority priority,
@@ -9223,7 +9223,7 @@
 
 class URLRequestTestReferrerPolicy : public URLRequestTest {
  public:
-  URLRequestTestReferrerPolicy() {}
+  URLRequestTestReferrerPolicy() = default;
 
   void InstantiateSameOriginServers(net::EmbeddedTestServer::Type type) {
     origin_server_.reset(new EmbeddedTestServer(type));
@@ -10136,7 +10136,7 @@
         false /* token binding enabled */);
     context_.set_ssl_config_service(ssl_config_service_.get());
   }
-  ~HTTPSFallbackTest() override {}
+  ~HTTPSFallbackTest() override = default;
 
  protected:
   TestSSLConfigService* ssl_config_service() {
@@ -10235,7 +10235,7 @@
     default_context_.set_cert_verifier(&cert_verifier_);
     default_context_.Init();
   }
-  ~HTTPSSessionTest() override {}
+  ~HTTPSSessionTest() override = default;
 
  protected:
   MockCertVerifier cert_verifier_;
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/root-layer-scrolls b/third_party/WebKit/LayoutTests/FlagExpectations/root-layer-scrolls
index 4f0580e8d..531662dd 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/root-layer-scrolls
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/root-layer-scrolls
@@ -4,15 +4,11 @@
 crbug.com/417782 compositing/squashing/squash-above-fixed-1.html [ Failure ]
 crbug.com/417782 compositing/squashing/squash-above-fixed-3.html [ Failure ]
 crbug.com/417782 compositing/visibility/visibility-image-layers-dynamic.html [ Failure ]
-crbug.com/417782 external/wpt/css/css-position/position-sticky-root-scroller.html [ Failure ]
-crbug.com/417782 fast/css/sticky/replaced-sticky.html [ Failure ]
-crbug.com/417782 fast/css/sticky/sticky-style-change.html [ Failure ]
 crbug.com/417782 fast/dom/Window/window-xy-properties.html [ Failure ]
 crbug.com/417782 [ Linux Mac ] fast/dom/horizontal-scrollbar-when-dir-change.html [ Failure ]
 crbug.com/417782 fast/dom/rtl-scroll-to-leftmost-and-resize.html [ Failure ]
 crbug.com/417782 fast/dom/scroll-reveal-left-overflow.html [ Failure ]
 crbug.com/417782 fast/dom/scroll-reveal-top-overflow.html [ Failure ]
-crbug.com/417782 fast/events/autoscroll.html [ Failure ]
 crbug.com/417782 fast/events/clientXY-in-zoom-and-scroll.html [ Failure ]
 crbug.com/417782 fast/events/drag-and-drop-autoscroll-frameset.html [ Timeout ]
 crbug.com/417782 fast/events/drag-and-drop-autoscroll-mainframe.html [ Timeout ]
@@ -79,7 +75,6 @@
 crbug.com/417782 virtual/mojo-loading/http/tests/devtools/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.js [ Failure ]
 crbug.com/417782 virtual/mojo-loading/http/tests/devtools/tracing/timeline-paint/timeline-paint.js [ Failure ]
 crbug.com/417782 virtual/mojo-loading/http/tests/misc/acid3.html [ Failure ]
-crbug.com/417782 virtual/mouseevent_fractional/fast/events/autoscroll.html [ Failure ]
 crbug.com/417782 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-mouse-coords-in-zoom-and-scroll.html [ Failure ]
 crbug.com/417782 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-pen-coords-in-zoom-and-scroll.html [ Failure ]
 crbug.com/417782 virtual/mouseevent_fractional/fast/events/scale-and-scroll-iframe-window.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/fast/events/autoscroll.html b/third_party/WebKit/LayoutTests/fast/events/autoscroll.html
index eccbb72..601fb929 100644
--- a/third_party/WebKit/LayoutTests/fast/events/autoscroll.html
+++ b/third_party/WebKit/LayoutTests/fast/events/autoscroll.html
@@ -1,46 +1,49 @@
-<html>
-    <head>
-        <script>
-            function test()
-            {
-                if (window.testRunner) {
-                    testRunner.waitUntilDone();
-                    setTimeout(autoscrollTestPart1, 0);
-                }
-            }
-            function autoscrollTestPart1()
-            {
-                var ta = document.getElementById('ta');
-                if (window.eventSender) {
-                    ta.scrollIntoView();
-                    var h = ta.offsetTop - document.scrollingElement.scrollTop + 10;
-                    eventSender.dragMode = false;
-                    eventSender.mouseMoveTo(20, h);
-                    eventSender.mouseDown();
-                    eventSender.mouseMoveTo(20, h);
-                    eventSender.mouseMoveTo(100, h);
-                }
-                setTimeout(autoscrollTestPart2, 100);
-            }
-            function autoscrollTestPart2()
-            {
-                if (window.eventSender)
-                    eventSender.mouseUp();
-                if (window.testRunner)
-                    testRunner.notifyDone();
-            }
-            function log(msg)
-            {
-                var res = document.getElementById('res');
-                res.innerHTML = res.innerHTML + msg + "<br>";
-            }
-        </script>
-    </head>
-    <body onload="test()">
-        <p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=12331">bug 12331</a>.</p>
-        <p>To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll back up to the top.</p>
-        <div style="height:3000px"></div>
-        <input id="ta" value="select some of this text"></input>
-        <p>If the bug does not occur, you'll be left down here at the bottom.</p>
-    </body>
-</html>
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script>
+    let originalScrollOffset;
+    let t = async_test("Scroll Offset Hasn't Changed");
+
+    function test()
+    {
+        setTimeout(autoscrollTestPart1, 0);
+    }
+    function autoscrollTestPart1()
+    {
+        var ta = document.getElementById('ta');
+        if (window.eventSender) {
+            ta.scrollIntoView();
+            var h = ta.offsetTop - document.scrollingElement.scrollTop + 10;
+            originalScrollOffset = window.scrollY;
+            eventSender.dragMode = false;
+            eventSender.mouseMoveTo(20, h);
+            eventSender.mouseDown();
+            eventSender.mouseMoveTo(20, h);
+            eventSender.mouseMoveTo(100, h);
+        }
+        setTimeout(autoscrollTestPart2, 100);
+    }
+    function autoscrollTestPart2()
+    {
+        if (window.eventSender)
+            eventSender.mouseUp();
+        t.step(() => {
+          assert_not_equals(window.getSelection().toString(), "");
+          assert_equals(window.scrollY, originalScrollOffset);
+        });
+        t.done();
+    }
+    function log(msg)
+    {
+        var res = document.getElementById('res');
+        res.innerHTML = res.innerHTML + msg + "<br>";
+    }
+
+    addEventListener('load', test);
+</script>
+<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=12331">bug 12331</a>.</p>
+<p>To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll back up to the top.</p>
+<div style="height:3000px"></div>
+<input id="ta" value="select some of this text"></input>
+<p>If the bug does not occur, you'll be left down here at the bottom.</p>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/events/autoscroll-expected.png
deleted file mode 100644
index eefdb91..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/events/autoscroll-expected.txt
deleted file mode 100644
index 803c821e..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2574.00 scrollHeight 3174
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3174 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3174
-    LayoutBlockFlow {BODY} at (8,8) size 769x3150
-      LayoutBlockFlow {P} at (0,0) size 769x20
-        LayoutText {#text} at (0,0) size 52x19
-          text run at (0,0) width 52: "Test for "
-        LayoutInline {A} at (0,0) size 69x19 [color=#0000EE]
-          LayoutText {#text} at (51,0) size 69x19
-            text run at (51,0) width 69: "bug 12331"
-        LayoutText {#text} at (119,0) size 5x19
-          text run at (119,0) width 5: "."
-      LayoutBlockFlow {P} at (0,36) size 769x40
-        LayoutText {#text} at (0,0) size 737x39
-          text run at (0,0) width 737: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,20) width 117: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,92) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3092) size 769x22
-        LayoutTextControl {INPUT} at (0,0) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3130) size 769x20
-        LayoutText {#text} at (0,0) size 404x19
-          text run at (0,0) width 404: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (10,3103) size 150x16 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (2,3) size 150x16
-    LayoutText {#text} at (0,0) size 137x16
-      text run at (0,0) width 137: "select some of this text"
-selection start: position 1 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 15 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2574
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/pointerevent/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/pointerevent/fast/events/autoscroll-expected.png
deleted file mode 100644
index b977b3a5..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/pointerevent/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/pointerevent/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/pointerevent/fast/events/autoscroll-expected.txt
deleted file mode 100644
index a9b15f9..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/pointerevent/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2574.00 scrollHeight 3174
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3174 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3174
-    LayoutBlockFlow {BODY} at (8,8) size 769x3150
-      LayoutBlockFlow {P} at (0,0) size 769x20
-        LayoutText {#text} at (0,0) size 50x19
-          text run at (0,0) width 50: "Test for "
-        LayoutInline {A} at (0,0) size 67x19 [color=#0000EE]
-          LayoutText {#text} at (49,0) size 67x19
-            text run at (49,0) width 67: "bug 12331"
-        LayoutText {#text} at (115,0) size 5x19
-          text run at (115,0) width 5: "."
-      LayoutBlockFlow {P} at (0,36) size 769x40
-        LayoutText {#text} at (0,0) size 763x39
-          text run at (0,0) width 763: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll back up to"
-          text run at (0,20) width 46: "the top."
-      LayoutBlockFlow {DIV} at (0,92) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3092) size 769x22
-        LayoutTextControl {INPUT} at (0,0) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3130) size 769x20
-        LayoutText {#text} at (0,0) size 387x19
-          text run at (0,0) width 387: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (10,3103) size 150x16 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (2,3) size 150x16
-    LayoutText {#text} at (0,0) size 136x16
-      text run at (0,0) width 136: "select some of this text"
-selection start: position 1 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 15 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2574
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png
deleted file mode 100644
index b977b3a5..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
deleted file mode 100644
index a9b15f9..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2574.00 scrollHeight 3174
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3174 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3174
-    LayoutBlockFlow {BODY} at (8,8) size 769x3150
-      LayoutBlockFlow {P} at (0,0) size 769x20
-        LayoutText {#text} at (0,0) size 50x19
-          text run at (0,0) width 50: "Test for "
-        LayoutInline {A} at (0,0) size 67x19 [color=#0000EE]
-          LayoutText {#text} at (49,0) size 67x19
-            text run at (49,0) width 67: "bug 12331"
-        LayoutText {#text} at (115,0) size 5x19
-          text run at (115,0) width 5: "."
-      LayoutBlockFlow {P} at (0,36) size 769x40
-        LayoutText {#text} at (0,0) size 763x39
-          text run at (0,0) width 763: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll back up to"
-          text run at (0,20) width 46: "the top."
-      LayoutBlockFlow {DIV} at (0,92) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3092) size 769x22
-        LayoutTextControl {INPUT} at (0,0) size 154x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3130) size 769x20
-        LayoutText {#text} at (0,0) size 387x19
-          text run at (0,0) width 387: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (10,3103) size 150x16 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (2,3) size 150x16
-    LayoutText {#text} at (0,0) size 136x16
-      text run at (0,0) width 136: "select some of this text"
-selection start: position 1 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 15 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2574
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/events/autoscroll-expected.png
deleted file mode 100644
index a53920e..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/events/autoscroll-expected.txt
deleted file mode 100644
index 0eefd43..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 116x13
-      text run at (0,0) width 116: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 18 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png
deleted file mode 100644
index a53920e..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt
deleted file mode 100644
index 0eefd43..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 116x13
-      text run at (0,0) width 116: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 18 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/pointerevent/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/pointerevent/fast/events/autoscroll-expected.png
deleted file mode 100644
index 8e080964..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/pointerevent/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/pointerevent/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/pointerevent/fast/events/autoscroll-expected.txt
deleted file mode 100644
index 0eefd43..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/pointerevent/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 116x13
-      text run at (0,0) width 116: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 18 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png
deleted file mode 100644
index 8e080964..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
deleted file mode 100644
index 0eefd43..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 116x13
-      text run at (0,0) width 116: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 18 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/events/autoscroll-expected.png
deleted file mode 100644
index 98d2db4..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/events/autoscroll-expected.txt
deleted file mode 100644
index c3d69d6..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 122x13
-      text run at (0,0) width 122: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 17 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png
deleted file mode 100644
index 98d2db4..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt
deleted file mode 100644
index c3d69d6..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 122x13
-      text run at (0,0) width 122: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 17 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/events/autoscroll-expected.png
deleted file mode 100644
index 03b0287..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/events/autoscroll-expected.txt
deleted file mode 100644
index 88c925d..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 123x13
-      text run at (0,0) width 123: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 17 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png
deleted file mode 100644
index 03b0287..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/mouseevent_fractional/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt
deleted file mode 100644
index 88c925d..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/mouseevent_fractional/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 123x13
-      text run at (0,0) width 123: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 17 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/pointerevent/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/pointerevent/fast/events/autoscroll-expected.png
deleted file mode 100644
index d41241d1..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/pointerevent/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/pointerevent/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/pointerevent/fast/events/autoscroll-expected.txt
deleted file mode 100644
index c3d69d6..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/pointerevent/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 122x13
-      text run at (0,0) width 122: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 17 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/mac/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png
deleted file mode 100644
index d41241d1..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
deleted file mode 100644
index c3d69d6..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2563.00 scrollHeight 3163
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3163 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3163
-    LayoutBlockFlow {BODY} at (8,8) size 769x3139
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x18
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x18 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x18
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x18
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 753x36
-          text run at (0,0) width 753: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x19
-        LayoutTextControl {INPUT} at (0,0) size 131x19 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3121) size 769x18
-        LayoutText {#text} at (0,0) size 411x18
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (11,3097) size 125x13 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (3,3) size 125x13
-    LayoutText {#text} at (0,0) size 122x13
-      text run at (0,0) width 122: "select some of this text"
-selection start: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 17 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2563
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/events/autoscroll-expected.png
deleted file mode 100644
index d39affe..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/events/autoscroll-expected.txt
deleted file mode 100644
index ac68136..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2574.00 scrollHeight 3174
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3174 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3174
-    LayoutBlockFlow {BODY} at (8,8) size 769x3150
-      LayoutBlockFlow {P} at (0,0) size 769x20
-        LayoutText {#text} at (0,0) size 50x19
-          text run at (0,0) width 50: "Test for "
-        LayoutInline {A} at (0,0) size 67x19 [color=#0000EE]
-          LayoutText {#text} at (49,0) size 67x19
-            text run at (49,0) width 67: "bug 12331"
-        LayoutText {#text} at (115,0) size 5x19
-          text run at (115,0) width 5: "."
-      LayoutBlockFlow {P} at (0,36) size 769x40
-        LayoutText {#text} at (0,0) size 763x39
-          text run at (0,0) width 763: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll back up to"
-          text run at (0,20) width 46: "the top."
-      LayoutBlockFlow {DIV} at (0,92) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3092) size 769x22
-        LayoutTextControl {INPUT} at (0,0) size 173x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3130) size 769x20
-        LayoutText {#text} at (0,0) size 387x19
-          text run at (0,0) width 387: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (10,3103) size 169x16 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (2,3) size 169x16
-    LayoutText {#text} at (0,0) size 136x16
-      text run at (0,0) width 136: "select some of this text"
-selection start: position 1 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 15 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2574
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/pointerevent/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/pointerevent/fast/events/autoscroll-expected.png
deleted file mode 100644
index 757da13..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/pointerevent/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/pointerevent/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/pointerevent/fast/events/autoscroll-expected.txt
deleted file mode 100644
index aa256c2..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/pointerevent/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2566.00 scrollHeight 3166
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3166 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3166
-    LayoutBlockFlow {BODY} at (8,8) size 769x3142
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x17
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x17 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x17
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x17
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 754x35
-          text run at (0,0) width 754: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x22
-        LayoutTextControl {INPUT} at (0,0) size 173x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3124) size 769x18
-        LayoutText {#text} at (0,0) size 411x17
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (10,3097) size 169x16 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (2,3) size 169x16
-    LayoutText {#text} at (0,0) size 136x16
-      text run at (0,0) width 136: "select some of this text"
-selection start: position 1 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 15 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2566
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png b/third_party/WebKit/LayoutTests/platform/win/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png
deleted file mode 100644
index 757da13..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
deleted file mode 100644
index aa256c2..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/trustedeventsdefaultaction/fast/events/autoscroll-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollY 2566.00 scrollHeight 3166
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 785x3166 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600
-  LayoutBlockFlow {HTML} at (0,0) size 785x3166
-    LayoutBlockFlow {BODY} at (8,8) size 769x3142
-      LayoutBlockFlow {P} at (0,0) size 769x18
-        LayoutText {#text} at (0,0) size 54x17
-          text run at (0,0) width 54: "Test for "
-        LayoutInline {A} at (0,0) size 69x17 [color=#0000EE]
-          LayoutText {#text} at (53,0) size 69x17
-            text run at (53,0) width 69: "bug 12331"
-        LayoutText {#text} at (121,0) size 5x17
-          text run at (121,0) width 5: "."
-      LayoutBlockFlow {P} at (0,34) size 769x36
-        LayoutText {#text} at (0,0) size 754x35
-          text run at (0,0) width 754: "To test manually, scroll down until you find the input element. Select some text. If the bug occurs, the page will scroll"
-          text run at (0,18) width 119: "back up to the top."
-      LayoutBlockFlow {DIV} at (0,86) size 769x3000
-      LayoutBlockFlow (anonymous) at (0,3086) size 769x22
-        LayoutTextControl {INPUT} at (0,0) size 173x22 [bgcolor=#FFFFFF] [border: (2px inset #EEEEEE)]
-        LayoutText {#text} at (0,0) size 0x0
-      LayoutBlockFlow {P} at (0,3124) size 769x18
-        LayoutText {#text} at (0,0) size 411x17
-          text run at (0,0) width 411: "If the bug does not occur, you'll be left down here at the bottom."
-layer at (10,3097) size 169x16 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0
-  LayoutBlockFlow {DIV} at (2,3) size 169x16
-    LayoutText {#text} at (0,0) size 136x16
-      text run at (0,0) width 136: "select some of this text"
-selection start: position 1 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-selection end:   position 15 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body
-scrolled to 0,2566
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
index edcd08fa..9679326a 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8Initializer.cpp
@@ -353,8 +353,10 @@
     v8::Local<v8::Context> context,
     v8::Local<v8::String> source) {
   if (ExecutionContext* execution_context = ToExecutionContext(context)) {
+    DCHECK(execution_context->IsDocument() ||
+           execution_context->IsPaintWorkletGlobalScope());
     if (ContentSecurityPolicy* policy =
-            ToDocument(execution_context)->GetContentSecurityPolicy()) {
+            execution_context->GetContentSecurityPolicy()) {
       v8::String::Value source_str(source);
       UChar snippet[ContentSecurityPolicy::kMaxSampleLength + 1];
       size_t len = std::min((sizeof(snippet) / sizeof(UChar)) - 1,
diff --git a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp
index 9af02a4..7f8ef33 100644
--- a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp
@@ -242,6 +242,13 @@
       context, *world_, global_object, v8::Local<v8::Object>(),
       v8::Local<v8::Function>(), global_interface_template);
 
+  if (!disable_eval_pending_.IsEmpty()) {
+    script_state_->GetContext()->AllowCodeGenerationFromStrings(false);
+    script_state_->GetContext()->SetErrorMessageForCodeGenerationFromStrings(
+        V8String(isolate_, disable_eval_pending_));
+    disable_eval_pending_ = String();
+  }
+
   return true;
 }
 
@@ -260,13 +267,6 @@
 
   ScriptState::Scope scope(script_state_.get());
 
-  if (!disable_eval_pending_.IsEmpty()) {
-    script_state_->GetContext()->AllowCodeGenerationFromStrings(false);
-    script_state_->GetContext()->SetErrorMessageForCodeGenerationFromStrings(
-        V8String(isolate_, disable_eval_pending_));
-    disable_eval_pending_ = String();
-  }
-
   v8::TryCatch block(isolate_);
 
   v8::Local<v8::Script> compiled_script;
diff --git a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
index 37748c5..25a6fea 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalFrameView.cpp
@@ -5446,32 +5446,11 @@
 bool LocalFrameView::HasVisibleSlowRepaintViewportConstrainedObjects() const {
   if (!ViewportConstrainedObjects())
     return false;
-
   for (const LayoutObject* layout_object : *ViewportConstrainedObjects()) {
     DCHECK(layout_object->IsBoxModelObject() && layout_object->HasLayer());
     DCHECK(layout_object->Style()->GetPosition() == EPosition::kFixed ||
            layout_object->Style()->GetPosition() == EPosition::kSticky);
-    PaintLayer* layer = ToLayoutBoxModelObject(layout_object)->Layer();
-
-    // Whether the Layer sticks to the viewport is a tree-depenent
-    // property and our viewportConstrainedObjects collection is maintained
-    // with only LayoutObject-level information.
-    if (!layer->FixedToViewport() && !layer->SticksToScroller())
-      continue;
-
-    // If the whole subtree is invisible, there's no reason to scroll on
-    // the main thread because we don't need to generate invalidations
-    // for invisible content.
-    if (layer->SubtreeIsInvisible())
-      continue;
-
-    // We're only smart enough to scroll viewport-constrainted objects
-    // in the compositor if they have their own backing or they paint
-    // into a grouped back (which necessarily all have the same viewport
-    // constraints).
-    CompositingState compositing_state = layer->GetCompositingState();
-    if (compositing_state != kPaintsIntoOwnBacking &&
-        compositing_state != kPaintsIntoGroupedBacking)
+    if (ToLayoutBoxModelObject(layout_object)->IsSlowRepaintConstrainedObject())
       return true;
   }
   return false;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
index 07e1010..36cb4b6 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
@@ -843,7 +843,8 @@
                       .BoundingBox()
                       .Location());
   LayoutBox* scroll_ancestor =
-      Layer()->AncestorOverflowLayer()->IsRootLayer()
+      Layer()->AncestorOverflowLayer()->IsRootLayer() &&
+              !RuntimeEnabledFeatures::RootLayerScrollingEnabled()
           ? nullptr
           : &ToLayoutBox(Layer()->AncestorOverflowLayer()->GetLayoutObject());
 
@@ -1022,9 +1023,40 @@
   scrollable_area->GetStickyConstraintsMap().Set(Layer(), constraints);
 }
 
+bool LayoutBoxModelObject::IsSlowRepaintConstrainedObject() const {
+  if (!HasLayer() || (Style()->GetPosition() != EPosition::kFixed &&
+                      Style()->GetPosition() != EPosition::kSticky)) {
+    return false;
+  }
+
+  PaintLayer* layer = Layer();
+
+  // Whether the Layer sticks to the viewport is a tree-depenent
+  // property and our viewportConstrainedObjects collection is maintained
+  // with only LayoutObject-level information.
+  if (!layer->FixedToViewport() && !layer->SticksToScroller())
+    return false;
+
+  // If the whole subtree is invisible, there's no reason to scroll on
+  // the main thread because we don't need to generate invalidations
+  // for invisible content.
+  if (layer->SubtreeIsInvisible())
+    return false;
+
+  // We're only smart enough to scroll viewport-constrainted objects
+  // in the compositor if they have their own backing or they paint
+  // into a grouped back (which necessarily all have the same viewport
+  // constraints).
+  return (layer->GetCompositingState() == kNotComposited);
+}
+
 FloatRect LayoutBoxModelObject::ComputeStickyConstrainingRect() const {
-  if (Layer()->AncestorOverflowLayer()->IsRootLayer())
-    return View()->GetFrameView()->VisibleContentRect();
+  if (Layer()->AncestorOverflowLayer()->IsRootLayer()) {
+    return View()
+        ->GetFrameView()
+        ->LayoutViewportScrollableArea()
+        ->VisibleContentRect();
+  }
 
   LayoutBox* enclosing_clipping_box =
       Layer()->AncestorOverflowLayer()->GetLayoutBox();
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
index cb5d1ebd..34a1f1c 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
@@ -145,6 +145,7 @@
   FloatRect ComputeStickyConstrainingRect() const;
   void UpdateStickyPositionConstraints() const;
   LayoutSize StickyPositionOffset() const;
+  bool IsSlowRepaintConstrainedObject() const;
 
   LayoutSize OffsetForInFlowPosition() const;
 
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
index 0cb5247..b2bb849 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -548,6 +548,7 @@
       if (!frame_view->InvalidateViewportConstrainedObjects())
         requires_paint_invalidation = true;
     }
+    InvalidatePaintForStickyDescendants();
   }
 
   if (requires_paint_invalidation)
@@ -1737,6 +1738,25 @@
   }
 }
 
+bool PaintLayerScrollableArea::HasNonCompositedStickyDescendants() const {
+  if (const PaintLayerScrollableAreaRareData* d = RareData()) {
+    for (const PaintLayer* sticky_layer : d->sticky_constraints_map_.Keys()) {
+      if (sticky_layer->GetLayoutObject().IsSlowRepaintConstrainedObject())
+        return true;
+    }
+  }
+  return false;
+}
+
+void PaintLayerScrollableArea::InvalidatePaintForStickyDescendants() {
+  if (PaintLayerScrollableAreaRareData* d = RareData()) {
+    for (PaintLayer* sticky_layer : d->sticky_constraints_map_.Keys()) {
+      sticky_layer->GetLayoutObject()
+          .SetShouldDoFullPaintInvalidationIncludingNonCompositingDescendants();
+    }
+  }
+}
+
 IntSize PaintLayerScrollableArea::OffsetFromResizeCorner(
     const IntPoint& absolute_point) const {
   // Currently the resize corner is either the bottom right corner or the bottom
@@ -1981,6 +2001,8 @@
     if (frame->View()->GetMainThreadScrollingReasons())
       return true;
   }
+  if (HasNonCompositedStickyDescendants())
+    return true;
   return ScrollableArea::ShouldScrollOnMainThread();
 }
 
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h
index 6d1fbd3..2f9134d 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h
@@ -482,6 +482,8 @@
   void InvalidateAllStickyConstraints();
   void InvalidateStickyConstraintsFor(PaintLayer*,
                                       bool needs_compositing_update = true);
+  void InvalidatePaintForStickyDescendants();
+  bool HasNonCompositedStickyDescendants() const;
   uint32_t GetNonCompositedMainThreadScrollingReasons() {
     return non_composited_main_thread_scrolling_reasons_;
   }
@@ -546,6 +548,9 @@
   ScrollingCoordinator* GetScrollingCoordinator() const;
 
   PaintLayerScrollableAreaRareData* RareData() { return rare_data_.get(); }
+  const PaintLayerScrollableAreaRareData* RareData() const {
+    return rare_data_.get();
+  }
 
   PaintLayerScrollableAreaRareData& EnsureRareData() {
     if (!rare_data_)
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.cpp
index 13145444..f7b2eda 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.cpp
@@ -101,18 +101,57 @@
 
 void ResourceLoadScheduler::Request(ResourceLoadSchedulerClient* client,
                                     ThrottleOption option,
+                                    ResourceLoadPriority priority,
+                                    int intra_priority,
                                     ResourceLoadScheduler::ClientId* id) {
   *id = GenerateClientId();
   if (is_shutdown_)
     return;
 
-  if (!is_enabled_ || option == ThrottleOption::kCanNotBeThrottled) {
+  if (!Platform::Current()->IsRendererSideResourceSchedulerEnabled()) {
+    // Prioritization is effectively disabled as we use the constant priority.
+    priority = ResourceLoadPriority::kMedium;
+    intra_priority = 0;
+  }
+
+  if (!is_enabled_ || option == ThrottleOption::kCanNotBeThrottled ||
+      !IsThrottablePriority(priority)) {
     Run(*id, client);
     return;
   }
 
-  pending_request_map_.insert(*id, client);
-  pending_requests_.insert(ClientIdWithPriority(*id));
+  pending_requests_.emplace(*id, priority, intra_priority);
+  pending_request_map_.insert(
+      *id, new ClientWithPriority(client, priority, intra_priority));
+  MaybeRun();
+}
+
+void ResourceLoadScheduler::SetPriority(ClientId client_id,
+                                        ResourceLoadPriority priority,
+                                        int intra_priority) {
+  if (!Platform::Current()->IsRendererSideResourceSchedulerEnabled())
+    return;
+
+  auto client_it = pending_request_map_.find(client_id);
+  if (client_it == pending_request_map_.end())
+    return;
+
+  auto it = pending_requests_.find(ClientIdWithPriority(
+      client_id, client_it->value->priority, client_it->value->intra_priority));
+
+  DCHECK(it != pending_requests_.end());
+  pending_requests_.erase(it);
+
+  client_it->value->priority = priority;
+  client_it->value->intra_priority = intra_priority;
+
+  if (!IsThrottablePriority(priority)) {
+    ResourceLoadSchedulerClient* client = client_it->value->client;
+    pending_request_map_.erase(client_it);
+    Run(client_id, client);
+    return;
+  }
+  pending_requests_.emplace(client_id, priority, intra_priority);
   MaybeRun();
 }
 
@@ -202,6 +241,16 @@
   }
 }
 
+bool ResourceLoadScheduler::IsThrottablePriority(
+    ResourceLoadPriority priority) const {
+  if (Platform::Current()->IsRendererSideResourceSchedulerEnabled()) {
+    if (priority >= ResourceLoadPriority::kMedium)
+      return false;
+  }
+
+  return true;
+}
+
 void ResourceLoadScheduler::OnThrottlingStateChanged(
     WebFrameScheduler::ThrottlingState state) {
   switch (state) {
@@ -246,7 +295,7 @@
     auto found = pending_request_map_.find(id);
     if (found == pending_request_map_.end())
       continue;  // Already released.
-    ResourceLoadSchedulerClient* client = found->value;
+    ResourceLoadSchedulerClient* client = found->value->client;
     pending_request_map_.erase(found);
     Run(id, client);
   }
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.h b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.h
index 4a8fe7f..c05b04af 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadScheduler.h
@@ -11,6 +11,7 @@
 #include "platform/heap/HeapAllocator.h"
 #include "platform/loader/fetch/FetchContext.h"
 #include "platform/loader/fetch/Resource.h"
+#include "platform/loader/fetch/ResourceLoaderOptions.h"
 #include "platform/wtf/HashSet.h"
 
 namespace blink {
@@ -74,7 +75,15 @@
   // ResourceLoadSchedulerClient::Run(), but it is guaranteed that ClientId is
   // populated before ResourceLoadSchedulerClient::Run() is called, so that the
   // caller can call Release() with the assigned ClientId correctly.
-  void Request(ResourceLoadSchedulerClient*, ThrottleOption, ClientId*);
+  void Request(ResourceLoadSchedulerClient*,
+               ThrottleOption,
+               ResourceLoadPriority,
+               int intra_priority,
+               ClientId*);
+
+  // Updates the priority information of the given client. This function may
+  // initiate a new resource loading.
+  void SetPriority(ClientId, ResourceLoadPriority, int intra_priority);
 
   // ResourceLoadSchedulerClient should call this method when the loading is
   // finished, or canceled. This method can be called in a pre-finalization
@@ -86,36 +95,52 @@
 
   void OnNetworkQuiet();
 
+  // Returns whether we can throttle a request with the given priority.
+  // This function returns false when RendererSideResourceScheduler is disabled.
+  bool IsThrottablePriority(ResourceLoadPriority) const;
+
   // WebFrameScheduler::Observer overrides:
   void OnThrottlingStateChanged(WebFrameScheduler::ThrottlingState) override;
 
  private:
   class ClientIdWithPriority {
    public:
+    struct Compare {
+      bool operator()(const ClientIdWithPriority& x,
+                      const ClientIdWithPriority& y) const {
+        if (x.priority != y.priority)
+          return x.priority > y.priority;
+        if (x.intra_priority != y.intra_priority)
+          return x.intra_priority > y.intra_priority;
+        return x.client_id < y.client_id;
+      }
+    };
+
     ClientIdWithPriority(ClientId client_id,
                          WebURLRequest::Priority priority,
                          int intra_priority)
         : client_id(client_id),
           priority(priority),
           intra_priority(intra_priority) {}
-    explicit ClientIdWithPriority(ClientId client_id)
-        : ClientIdWithPriority(client_id,
-                               WebURLRequest::Priority::kUnresolved,
-                               0) {}
-
-    bool operator<(const ClientIdWithPriority& other) const {
-      if (priority != other.priority)
-        return priority < other.priority;
-      if (intra_priority != other.intra_priority)
-        return intra_priority < other.intra_priority;
-      return client_id < other.client_id;
-    }
 
     const ClientId client_id;
     const WebURLRequest::Priority priority;
     const int intra_priority;
   };
 
+  struct ClientWithPriority : public GarbageCollected<ClientWithPriority> {
+    ClientWithPriority(ResourceLoadSchedulerClient* client,
+                       ResourceLoadPriority priority,
+                       int intra_priority)
+        : client(client), priority(priority), intra_priority(intra_priority) {}
+
+    void Trace(blink::Visitor* visitor) { visitor->Trace(client); }
+
+    Member<ResourceLoadSchedulerClient> client;
+    ResourceLoadPriority priority;
+    int intra_priority;
+  };
+
   ResourceLoadScheduler(FetchContext*);
 
   // Generates the next ClientId.
@@ -164,10 +189,10 @@
   ThrottlingHistory throttling_history_ = ThrottlingHistory::kInitial;
 
   // Holds clients that haven't been granted, and are waiting for a grant.
-  HeapHashMap<ClientId, Member<ResourceLoadSchedulerClient>>
-      pending_request_map_;
+  HeapHashMap<ClientId, Member<ClientWithPriority>> pending_request_map_;
   // We use std::set here because WTF doesn't have its counterpart.
-  std::set<ClientIdWithPriority> pending_requests_;
+  std::set<ClientIdWithPriority, ClientIdWithPriority::Compare>
+      pending_requests_;
 
   // Holds FetchContext reference to contact WebFrameScheduler.
   Member<FetchContext> context_;
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadSchedulerTest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadSchedulerTest.cpp
index ba06ef44..0ec38a05 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadSchedulerTest.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoadSchedulerTest.cpp
@@ -6,6 +6,7 @@
 
 #include "platform/loader/testing/MockFetchContext.h"
 #include "platform/runtime_enabled_features.h"
+#include "platform/testing/TestingPlatformSupport.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
@@ -34,6 +35,7 @@
 
 class ResourceLoadSchedulerTest : public ::testing::Test {
  public:
+  using ThrottleOption = ResourceLoadScheduler::ThrottleOption;
   void SetUp() override {
     DCHECK(RuntimeEnabledFeatures::ResourceLoadSchedulerEnabled());
     scheduler_ = ResourceLoadScheduler::Create(
@@ -50,12 +52,45 @@
   Persistent<ResourceLoadScheduler> scheduler_;
 };
 
+class RendererSideResourceSchedulerTest : public ::testing::Test {
+ public:
+  using ThrottleOption = ResourceLoadScheduler::ThrottleOption;
+  class TestingPlatformSupport : public ::blink::TestingPlatformSupport {
+   public:
+    bool IsRendererSideResourceSchedulerEnabled() const override {
+      return true;
+    }
+  };
+
+  void SetUp() override {
+    DCHECK(RuntimeEnabledFeatures::ResourceLoadSchedulerEnabled());
+    scheduler_ = ResourceLoadScheduler::Create(
+        MockFetchContext::Create(MockFetchContext::kShouldNotLoadNewResource));
+    scheduler()->SetOutstandingLimitForTesting(1);
+  }
+  void TearDown() override { scheduler()->Shutdown(); }
+
+  ResourceRequest CreateRequest(ResourceLoadPriority priority) const {
+    ResourceRequest request(KURL("http://www.example.com/"));
+    request.SetPriority(priority);
+    return request;
+  }
+
+  ResourceLoadScheduler* scheduler() { return scheduler_; }
+
+ private:
+  ScopedTestingPlatformSupport<TestingPlatformSupport>
+      testing_platform_support_;
+  Persistent<ResourceLoadScheduler> scheduler_;
+};
+
 TEST_F(ResourceLoadSchedulerTest, Bypass) {
   // A request that disallows throttling should be ran synchronously.
   MockClient* client1 = new MockClient;
   ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client1, ResourceLoadScheduler::ThrottleOption::kCanNotBeThrottled, &id1);
+  scheduler()->Request(client1, ThrottleOption::kCanNotBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id1);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1);
   EXPECT_TRUE(client1->WasRan());
 
@@ -63,8 +98,9 @@
   // the outstanding number reaches to the limit.
   MockClient* client2 = new MockClient;
   ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client2, ResourceLoadScheduler::ThrottleOption::kCanNotBeThrottled, &id2);
+  scheduler()->Request(client2, ThrottleOption::kCanNotBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id2);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2);
   EXPECT_TRUE(client2->WasRan());
 
@@ -92,31 +128,35 @@
   // The first request should be ran synchronously.
   MockClient* client1 = new MockClient;
   ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client1, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id1);
+  scheduler()->Request(client1, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id1);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1);
   EXPECT_TRUE(client1->WasRan());
 
   // Another request should be throttled until the first request calls Release.
   MockClient* client2 = new MockClient;
   ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client2, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id2);
+  scheduler()->Request(client2, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id2);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2);
   EXPECT_FALSE(client2->WasRan());
 
   // Two more requests.
   MockClient* client3 = new MockClient;
   ResourceLoadScheduler::ClientId id3 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client3, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id3);
+  scheduler()->Request(client3, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id3);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id3);
   EXPECT_FALSE(client3->WasRan());
 
   MockClient* client4 = new MockClient;
   ResourceLoadScheduler::ClientId id4 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client4, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id4);
+  scheduler()->Request(client4, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id4);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id4);
   EXPECT_FALSE(client4->WasRan());
 
@@ -143,22 +183,25 @@
   // Push three requests.
   MockClient* client1 = new MockClient;
   ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client1, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id1);
+  scheduler()->Request(client1, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id1);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1);
   EXPECT_TRUE(client1->WasRan());
 
   MockClient* client2 = new MockClient;
   ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client2, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id2);
+  scheduler()->Request(client2, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id2);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2);
   EXPECT_FALSE(client2->WasRan());
 
   MockClient* client3 = new MockClient;
   ResourceLoadScheduler::ClientId id3 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client3, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id3);
+  scheduler()->Request(client3, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id3);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id3);
   EXPECT_FALSE(client3->WasRan());
 
@@ -180,22 +223,25 @@
   // Push three requests.
   MockClient* client1 = new MockClient;
   ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client1, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id1);
+  scheduler()->Request(client1, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id1);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1);
   EXPECT_TRUE(client1->WasRan());
 
   MockClient* client2 = new MockClient;
   ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client2, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id2);
+  scheduler()->Request(client2, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id2);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2);
   EXPECT_FALSE(client2->WasRan());
 
   MockClient* client3 = new MockClient;
   ResourceLoadScheduler::ClientId id3 = ResourceLoadScheduler::kInvalidClientId;
-  scheduler()->Request(
-      client3, ResourceLoadScheduler::ThrottleOption::kCanBeThrottled, &id3);
+  scheduler()->Request(client3, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id3);
   EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id3);
   EXPECT_FALSE(client3->WasRan());
 
@@ -217,5 +263,188 @@
   EXPECT_TRUE(scheduler()->Release(
       id2, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
 }
+
+TEST_F(ResourceLoadSchedulerTest, PriotrityIsNotConsidered) {
+  // Push three requests.
+  MockClient* client1 = new MockClient;
+
+  scheduler()->SetOutstandingLimitForTesting(0);
+
+  ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client1, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kLow, 0 /* intra_priority */,
+                       &id1);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1);
+
+  MockClient* client2 = new MockClient;
+  ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client2, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kMedium, 0 /* intra_priority */,
+                       &id2);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2);
+
+  MockClient* client3 = new MockClient;
+  ResourceLoadScheduler::ClientId id3 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client3, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kHigh, 0 /* intra_priority */,
+                       &id3);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id3);
+
+  EXPECT_FALSE(client1->WasRan());
+  EXPECT_FALSE(client2->WasRan());
+  EXPECT_FALSE(client3->WasRan());
+
+  scheduler()->SetOutstandingLimitForTesting(1);
+
+  EXPECT_TRUE(client1->WasRan());
+  EXPECT_FALSE(client2->WasRan());
+  EXPECT_FALSE(client3->WasRan());
+
+  scheduler()->SetOutstandingLimitForTesting(2);
+
+  EXPECT_TRUE(client1->WasRan());
+  EXPECT_TRUE(client2->WasRan());
+  EXPECT_FALSE(client3->WasRan());
+
+  // Release all.
+  EXPECT_TRUE(scheduler()->Release(
+      id3, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+  EXPECT_TRUE(scheduler()->Release(
+      id2, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+  EXPECT_TRUE(scheduler()->Release(
+      id1, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+}
+
+TEST_F(RendererSideResourceSchedulerTest, PriotrityIsConsidered) {
+  // Push three requests.
+  MockClient* client1 = new MockClient;
+
+  scheduler()->SetOutstandingLimitForTesting(0);
+
+  ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client1, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kLowest, 10 /* intra_priority */,
+                       &id1);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1);
+
+  MockClient* client2 = new MockClient;
+  ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client2, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kLow, 1 /* intra_priority */,
+                       &id2);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2);
+
+  MockClient* client3 = new MockClient;
+  ResourceLoadScheduler::ClientId id3 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client3, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kLow, 3 /* intra_priority */,
+                       &id3);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id3);
+
+  MockClient* client4 = new MockClient;
+  ResourceLoadScheduler::ClientId id4 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client4, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kHigh, 0 /* intra_priority */,
+                       &id4);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id4);
+
+  EXPECT_FALSE(client1->WasRan());
+  EXPECT_FALSE(client2->WasRan());
+  EXPECT_FALSE(client3->WasRan());
+  EXPECT_TRUE(client4->WasRan());
+
+  scheduler()->SetOutstandingLimitForTesting(2);
+
+  EXPECT_FALSE(client1->WasRan());
+  EXPECT_FALSE(client2->WasRan());
+  EXPECT_TRUE(client3->WasRan());
+  EXPECT_TRUE(client4->WasRan());
+
+  scheduler()->SetOutstandingLimitForTesting(3);
+
+  EXPECT_FALSE(client1->WasRan());
+  EXPECT_TRUE(client2->WasRan());
+  EXPECT_TRUE(client3->WasRan());
+  EXPECT_TRUE(client4->WasRan());
+
+  // Release all.
+  EXPECT_TRUE(scheduler()->Release(
+      id4, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+  EXPECT_TRUE(scheduler()->Release(
+      id3, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+  EXPECT_TRUE(scheduler()->Release(
+      id2, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+  EXPECT_TRUE(scheduler()->Release(
+      id1, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+}
+
+TEST_F(RendererSideResourceSchedulerTest, IsThrottablePriority) {
+  EXPECT_TRUE(
+      scheduler()->IsThrottablePriority(ResourceLoadPriority::kVeryLow));
+  EXPECT_TRUE(scheduler()->IsThrottablePriority(ResourceLoadPriority::kLow));
+  EXPECT_FALSE(
+      scheduler()->IsThrottablePriority(ResourceLoadPriority::kMedium));
+  EXPECT_FALSE(scheduler()->IsThrottablePriority(ResourceLoadPriority::kHigh));
+  EXPECT_FALSE(
+      scheduler()->IsThrottablePriority(ResourceLoadPriority::kVeryHigh));
+}
+
+TEST_F(RendererSideResourceSchedulerTest, SetPriority) {
+  // Push three requests.
+  MockClient* client1 = new MockClient;
+
+  scheduler()->SetOutstandingLimitForTesting(0);
+
+  ResourceLoadScheduler::ClientId id1 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client1, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kLowest, 0 /* intra_priority */,
+                       &id1);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id1);
+
+  MockClient* client2 = new MockClient;
+  ResourceLoadScheduler::ClientId id2 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client2, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kLow, 5 /* intra_priority */,
+                       &id2);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id2);
+
+  MockClient* client3 = new MockClient;
+  ResourceLoadScheduler::ClientId id3 = ResourceLoadScheduler::kInvalidClientId;
+  scheduler()->Request(client3, ThrottleOption::kCanBeThrottled,
+                       ResourceLoadPriority::kLow, 10 /* intra_priority */,
+                       &id3);
+  EXPECT_NE(ResourceLoadScheduler::kInvalidClientId, id3);
+
+  EXPECT_FALSE(client1->WasRan());
+  EXPECT_FALSE(client2->WasRan());
+  EXPECT_FALSE(client3->WasRan());
+
+  scheduler()->SetPriority(id1, ResourceLoadPriority::kHigh, 0);
+
+  EXPECT_TRUE(client1->WasRan());
+  EXPECT_FALSE(client2->WasRan());
+  EXPECT_FALSE(client3->WasRan());
+
+  scheduler()->SetPriority(id3, ResourceLoadPriority::kLow, 2);
+
+  EXPECT_TRUE(client1->WasRan());
+  EXPECT_FALSE(client2->WasRan());
+  EXPECT_FALSE(client3->WasRan());
+
+  scheduler()->SetOutstandingLimitForTesting(2);
+
+  EXPECT_TRUE(client1->WasRan());
+  EXPECT_TRUE(client2->WasRan());
+  EXPECT_FALSE(client3->WasRan());
+
+  // Release all.
+  EXPECT_TRUE(scheduler()->Release(
+      id3, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+  EXPECT_TRUE(scheduler()->Release(
+      id2, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+  EXPECT_TRUE(scheduler()->Release(
+      id1, ResourceLoadScheduler::ReleaseOption::kReleaseOnly));
+}
+
 }  // namespace
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
index d46eb27..636d65d 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceLoader.cpp
@@ -102,17 +102,19 @@
   ActivateCacheAwareLoadingIfNeeded(request);
   loader_ =
       Context().CreateURLLoader(request, GetTaskRunnerFor(request, Context()));
+  DCHECK_EQ(ResourceLoadScheduler::kInvalidClientId, scheduler_client_id_);
+  auto throttle_option = ResourceLoadScheduler::ThrottleOption::kCanBeThrottled;
 
   // Synchronous requests should not work with a throttling. Also, tentatively
   // disables throttling for fetch requests that could keep on holding an active
   // connection until data is read by JavaScript.
-  ResourceLoadScheduler::ThrottleOption option =
-      (resource_->Options().synchronous_policy == kRequestSynchronously ||
-       request.GetRequestContext() == WebURLRequest::kRequestContextFetch)
-          ? ResourceLoadScheduler::ThrottleOption::kCanNotBeThrottled
-          : ResourceLoadScheduler::ThrottleOption::kCanBeThrottled;
-  DCHECK_EQ(ResourceLoadScheduler::kInvalidClientId, scheduler_client_id_);
-  scheduler_->Request(this, option, &scheduler_client_id_);
+  if (resource_->Options().synchronous_policy == kRequestSynchronously ||
+      request.GetRequestContext() == WebURLRequest::kRequestContextFetch) {
+    throttle_option = ResourceLoadScheduler::ThrottleOption::kCanNotBeThrottled;
+  }
+
+  scheduler_->Request(this, throttle_option, request.Priority(),
+                      request.IntraPriorityValue(), &scheduler_client_id_);
 }
 
 void ResourceLoader::Run() {
@@ -176,6 +178,8 @@
         static_cast<WebURLRequest::Priority>(load_priority),
         intra_priority_value);
   }
+  scheduler_->SetPriority(scheduler_client_id_, load_priority,
+                          intra_priority_value);
 }
 
 void ResourceLoader::ScheduleCancel() {
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.cpp
index 8fd3cc55..a8987e4 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.cpp
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.cpp
@@ -351,6 +351,10 @@
   return priority_;
 }
 
+int ResourceRequest::IntraPriorityValue() const {
+  return intra_priority_value_;
+}
+
 void ResourceRequest::SetPriority(ResourceLoadPriority priority,
                                   int intra_priority_value) {
   priority_ = priority;
diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.h b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.h
index a93c720e..f46d60a8 100644
--- a/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.h
+++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceRequest.h
@@ -178,7 +178,9 @@
   bool AllowStoredCredentials() const;
   void SetAllowStoredCredentials(bool allow_credentials);
 
+  // TODO(yhirano): Describe what Priority and IntraPriorityValue are.
   ResourceLoadPriority Priority() const;
+  int IntraPriorityValue() const;
   void SetPriority(ResourceLoadPriority, int intra_priority_value = 0);
 
   bool IsConditional() const;
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 2fede9d..1c58782 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -29716,7 +29716,11 @@
   <int value="487"
       label="682747f8ba621b87cdd3bc295ed5cabce722a1c0c0363d1d68b38928d2787f1e"/>
   <int value="488"
-      label="682747f8ba621b87cdd3bc295ed5cabce722a1c0c0363d1d68b38928d2787f1e"/>
+      label="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"/>
+  <int value="489"
+      label="282fb5cfbaf01518d9704de7884d7a25ff01cf882e994290d5995d5eb6c44988"/>
+  <int value="490"
+      label="fd371bea9755ff60c8828c849b8e5215de532d61b009855fa0ad630d90eef82e"/>
 </enum>
 
 <enum name="Network3GGobiError">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 0d6952c1..c57454a 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -45733,7 +45733,7 @@
   </summary>
 </histogram>
 
-<histogram name="Net.RequestTime2Success.MainFrame">
+<histogram name="Net.RequestTime2Success.MainFrame" units="ms">
   <owner>csharrison@chromium.org</owner>
   <summary>
     The amount of time between request initiation and request completion for
@@ -45741,7 +45741,7 @@
   </summary>
 </histogram>
 
-<histogram name="Net.RequestTime2Success.Subresource">
+<histogram name="Net.RequestTime2Success.Subresource" units="ms">
   <owner>csharrison@chromium.org</owner>
   <summary>
     The amount of time between request initiation and request completion for
diff --git a/ui/gfx/presentation_feedback.h b/ui/gfx/presentation_feedback.h
index a587f85..6e6cfa6 100644
--- a/ui/gfx/presentation_feedback.h
+++ b/ui/gfx/presentation_feedback.h
@@ -11,26 +11,6 @@
 
 namespace gfx {
 
-// Bitmask of flags in |PresentationCallback|.
-enum class PresentationFlags {
-  // The presentation was synchronized to VSYNC.
-  kVSync = 1 << 0,
-
-  // The presentation |timestamp| is converted from hardware clock by driver.
-  // Sampling a clock in user space is not acceptable for this flag.
-  kHWClock = 1 << 1,
-
-  // The display hardware signalled that it started using the new content. The
-  // opposite of this is e.g. a timer being used to guess when the display
-  // hardware has switched to the new image content.
-  kHWCompletion = 1 << 2,
-
-  // The presentation of this update was done zero-copy. Possible zero-copy
-  // cases include direct scanout of a fullscreen surface and a surface on a
-  // hardware overlay.
-  kZeroCopy = 1 << 3,
-};
-
 // The feedback for gl::GLSurface methods |SwapBuffers|, |SwapBuffersAsync|,
 // |SwapBuffersWithBounds|, |PostSubBuffer|, |PostSubBufferAsync|,
 // |CommitOverlayPlanes|,|CommitOverlayPlanesAsync|, etc.
@@ -48,8 +28,26 @@
   // An estimated interval from the |timestamp| to the next refresh.
   base::TimeDelta interval;
 
-  // A combination of |PresentationFlags|. It indicates the kind of the
-  // |timestamp|.
+  enum Flags {
+    // The presentation was synchronized to VSYNC.
+    kVSync = 1 << 0,
+
+    // The presentation |timestamp| is converted from hardware clock by driver.
+    // Sampling a clock in user space is not acceptable for this flag.
+    kHWClock = 1 << 1,
+
+    // The display hardware signalled that it started using the new content. The
+    // opposite of this is e.g. a timer being used to guess when the display
+    // hardware has switched to the new image content.
+    kHWCompletion = 1 << 2,
+
+    // The presentation of this update was done zero-copy. Possible zero-copy
+    // cases include direct scanout of a fullscreen surface and a surface on a
+    // hardware overlay.
+    kZeroCopy = 1 << 3,
+  };
+
+  // A combination of Flags. It indicates the kind of the |timestamp|.
   uint32_t flags = 0;
 };