diff --git a/ash/ash_switches.cc b/ash/ash_switches.cc
index 3db6f13..664c269 100644
--- a/ash/ash_switches.cc
+++ b/ash/ash_switches.cc
@@ -110,6 +110,30 @@
 // enables the IME service (i.e. InputMethodMus) instead.
 const char kUseIMEService[] = "use-ime-service";
 
+// Number of recent accelerometer samples to examine to determine if a power
+// button event was spurious.
+const char kSpuriousPowerButtonWindow[] = "spurious-power-button-window";
+
+// Number of recent acceleration samples that must meet or exceed the threshold
+// in order for a power button event to be considered spurious.
+const char kSpuriousPowerButtonAccelCount[] =
+    "spurious-power-button-accel-count";
+
+// Threshold (in m/s^2, disregarding gravity) that screen acceleration must meet
+// or exceed for a power button event to be considered spurious.
+const char kSpuriousPowerButtonScreenAccel[] =
+    "spurious-power-button-screen-accel";
+
+// Threshold (in m/s^2, disregarding gravity) that keyboard acceleration must
+// meet or exceed for a power button event to be considered spurious.
+const char kSpuriousPowerButtonKeyboardAccel[] =
+    "spurious-power-button-keyboard-accel";
+
+// Change in lid angle (i.e. hinge between keyboard and screen) that must be
+// exceeded for a power button event to be considered spurious.
+const char kSpuriousPowerButtonLidAngleChange[] =
+    "spurious-power-button-lid-angle-change";
+
 // Constrains the pointer movement within a root window on desktop.
 bool ConstrainPointerToRoot() {
   const char kAshConstrainPointerToRoot[] = "ash-constrain-pointer-to-root";
diff --git a/ash/ash_switches.h b/ash/ash_switches.h
index e3e7337..66f8266 100644
--- a/ash/ash_switches.h
+++ b/ash/ash_switches.h
@@ -47,6 +47,11 @@
 ASH_EXPORT extern const char kAshShelfColorSchemeDarkVibrant[];
 ASH_EXPORT extern const char kAshTouchHud[];
 ASH_EXPORT extern const char kAuraLegacyPowerButton[];
+ASH_EXPORT extern const char kSpuriousPowerButtonWindow[];
+ASH_EXPORT extern const char kSpuriousPowerButtonAccelCount[];
+ASH_EXPORT extern const char kSpuriousPowerButtonScreenAccel[];
+ASH_EXPORT extern const char kSpuriousPowerButtonKeyboardAccel[];
+ASH_EXPORT extern const char kSpuriousPowerButtonLidAngleChange[];
 ASH_EXPORT extern const char kUseIMEService[];
 
 // True if the pointer (cursor) position should be kept inside root windows.
diff --git a/ash/system/power/tablet_power_button_controller.cc b/ash/system/power/tablet_power_button_controller.cc
index 0f8dea77..fafda54 100644
--- a/ash/system/power/tablet_power_button_controller.cc
+++ b/ash/system/power/tablet_power_button_controller.cc
@@ -5,13 +5,19 @@
 #include "ash/system/power/tablet_power_button_controller.h"
 
 #include "ash/accessibility_delegate.h"
+#include "ash/ash_switches.h"
 #include "ash/session/session_controller.h"
 #include "ash/shell.h"
 #include "ash/shell_delegate.h"
 #include "ash/wm/lock_state_controller.h"
 #include "ash/wm/maximize_mode/maximize_mode_controller.h"
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
 #include "base/time/default_tick_clock.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "ui/chromeos/accelerometer/accelerometer_util.h"
 #include "ui/events/devices/input_device_manager.h"
 #include "ui/events/devices/stylus_state.h"
 #include "ui/events/event.h"
@@ -55,6 +61,36 @@
          maximize_mode_controller->IsMaximizeModeWindowManagerEnabled();
 }
 
+// Returns the value for the command-line switch identified by |name|. Returns 0
+// if the switch was unset or contained a non-float value.
+double GetNumSwitch(const base::CommandLine& command_line,
+                    const std::string& name) {
+  std::string str = command_line.GetSwitchValueASCII(name);
+  if (str.empty())
+    return 0.0;
+
+  double value = 0.0;
+  if (!base::StringToDouble(str, &value)) {
+    LOG(WARNING) << "Failed to parse value \"" << str << "\" from switch "
+                 << "--" << name << " as float";
+    return 0.0;
+  }
+  return value;
+}
+
+// Computes the lid angle based on readings from accelerometers in the screen
+// and keyboard panels.
+float GetLidAngle(const gfx::Vector3dF& screen,
+                  const gfx::Vector3dF& keyboard) {
+  constexpr gfx::Vector3dF kHingeVector(1.0f, 0.0f, 0.0f);
+  float lid_angle = 180.0f - gfx::ClockwiseAngleBetweenVectorsInDegrees(
+                                 keyboard, screen, kHingeVector);
+  if (lid_angle < 0.0f)
+    lid_angle += 360.0f;
+
+  return lid_angle;
+}
+
 }  // namespace
 
 TabletPowerButtonController::TestApi::TestApi(
@@ -73,10 +109,26 @@
   controller_->shutdown_timer_.Stop();
 }
 
+bool TabletPowerButtonController::TestApi::IsObservingAccelerometerReader(
+    chromeos::AccelerometerReader* reader) const {
+  DCHECK(reader);
+  return controller_->accelerometer_scoped_observer_.IsObserving(reader);
+}
+
+void TabletPowerButtonController::TestApi::ParseSpuriousPowerButtonSwitches(
+    const base::CommandLine& command_line) {
+  controller_->ParseSpuriousPowerButtonSwitches(command_line);
+}
+
+bool TabletPowerButtonController::TestApi::IsSpuriousPowerButtonEvent() const {
+  return controller_->IsSpuriousPowerButtonEvent();
+}
+
 TabletPowerButtonController::TabletPowerButtonController(
     LockStateController* controller)
     : tick_clock_(new base::DefaultTickClock()),
       controller_(controller),
+      accelerometer_scoped_observer_(this),
       weak_ptr_factory_(this) {
   chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
       this);
@@ -87,6 +139,7 @@
     ui::InputDeviceManager::GetInstance()->AddObserver(this);
   Shell::Get()->PrependPreTargetHandler(this);
 
+  ParseSpuriousPowerButtonSwitches(*base::CommandLine::ForCurrentProcess());
   GetInitialBacklightsForcedOff();
 }
 
@@ -107,6 +160,11 @@
     bool down,
     const base::TimeTicks& timestamp) {
   if (down) {
+    if ((power_button_down_was_spurious_ = IsSpuriousPowerButtonEvent())) {
+      LOG(WARNING) << "Ignoring spurious power button down event";
+      return;
+    }
+
     force_off_on_button_up_ = true;
     // When the system resumes in response to the power button being pressed,
     // Chrome receives powerd's SuspendDone signal and notification that the
@@ -121,6 +179,10 @@
     SetDisplayForcedOff(false);
     StartShutdownTimer();
   } else {
+    // Don't process the up event if we previously ignored the down event.
+    if (power_button_down_was_spurious_)
+      return;
+
     // When power button is released, cancel shutdown animation whenever it is
     // still cancellable.
     if (controller_->CanCancelShutdownAnimation())
@@ -145,6 +207,25 @@
   }
 }
 
+void TabletPowerButtonController::OnAccelerometerUpdated(
+    scoped_refptr<const chromeos::AccelerometerUpdate> update) {
+  const gfx::Vector3dF screen = ui::ConvertAccelerometerReadingToVector3dF(
+      update->get(chromeos::ACCELEROMETER_SOURCE_SCREEN));
+  const gfx::Vector3dF keyboard = ui::ConvertAccelerometerReadingToVector3dF(
+      update->get(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD));
+
+  DCHECK_GT(max_accelerometer_samples_, 0u);
+  if (accelerometer_samples_.size() < max_accelerometer_samples_) {
+    accelerometer_samples_.push_back(std::make_pair(screen, keyboard));
+    last_accelerometer_sample_index_ = accelerometer_samples_.size() - 1;
+  } else {
+    last_accelerometer_sample_index_ =
+        (last_accelerometer_sample_index_ + 1) % max_accelerometer_samples_;
+    accelerometer_samples_[last_accelerometer_sample_index_] =
+        std::make_pair(screen, keyboard);
+  }
+}
+
 void TabletPowerButtonController::PowerManagerRestarted() {
   chromeos::DBusThreadManager::Get()
       ->GetPowerManagerClient()
@@ -213,6 +294,114 @@
   tick_clock_ = std::move(tick_clock);
 }
 
+void TabletPowerButtonController::ParseSpuriousPowerButtonSwitches(
+    const base::CommandLine& command_line) {
+  // Support being called multiple times from tests.
+  max_accelerometer_samples_ = 0;
+  accelerometer_samples_.clear();
+  accelerometer_scoped_observer_.RemoveAll();
+
+  int window = static_cast<int>(
+      GetNumSwitch(command_line, switches::kSpuriousPowerButtonWindow));
+  if (window <= 0)
+    return;
+
+  max_accelerometer_samples_ = static_cast<size_t>(window);
+  accelerometer_samples_.reserve(max_accelerometer_samples_);
+  accelerometer_scoped_observer_.Add(
+      chromeos::AccelerometerReader::GetInstance());
+
+  spurious_accel_count_ = static_cast<size_t>(
+      GetNumSwitch(command_line, switches::kSpuriousPowerButtonAccelCount));
+  spurious_screen_accel_ =
+      GetNumSwitch(command_line, switches::kSpuriousPowerButtonScreenAccel);
+  spurious_keyboard_accel_ =
+      GetNumSwitch(command_line, switches::kSpuriousPowerButtonKeyboardAccel);
+  spurious_lid_angle_change_ =
+      GetNumSwitch(command_line, switches::kSpuriousPowerButtonLidAngleChange);
+}
+
+bool TabletPowerButtonController::IsSpuriousPowerButtonEvent() const {
+  if (max_accelerometer_samples_ <= 0)
+    return false;
+
+  // Number of screen and keyboard accelerations exceeding the threshold.
+  size_t num_big_screen_accels = 0;
+  size_t num_big_keyboard_accels = 0;
+
+  // The last lid angle that we saw.
+  float last_angle = 0.0f;
+  // The current distance (in degrees) that we've traveled from the starting
+  // angle and the max distance that we've seen so far.
+  float cur_angle_dist = 0.0f, max_angle_dist = 0.0f;
+
+  std::string screen_debug, keyboard_debug, angle_debug;
+
+  // Get the index of the oldest pair of samples.
+  const size_t start =
+      accelerometer_samples_.size() == max_accelerometer_samples_
+          ? (last_accelerometer_sample_index_ + 1) % max_accelerometer_samples_
+          : 0;
+  for (size_t i = 0; i < accelerometer_samples_.size(); ++i) {
+    const auto& pair =
+        accelerometer_samples_[(start + i) % max_accelerometer_samples_];
+    const gfx::Vector3dF& screen = pair.first;
+    const gfx::Vector3dF& keyboard = pair.second;
+
+    const float screen_accel = std::abs(screen.Length() - kGravity);
+    if (spurious_screen_accel_ > 0 && screen_accel >= spurious_screen_accel_)
+      num_big_screen_accels++;
+
+    const float keyboard_accel = std::abs(keyboard.Length() - kGravity);
+    if (spurious_keyboard_accel_ > 0 &&
+        keyboard_accel >= spurious_keyboard_accel_) {
+      num_big_keyboard_accels++;
+    }
+
+    float angle = GetLidAngle(screen, keyboard);
+    if (i > 0u) {
+      // Lid angle readings are computed based on the screen and keyboard
+      // acceleration vectors and can be noisy. Compute the minimum angle
+      // difference between the previous reading and the current one and use it
+      // to maintain a running total of how far the lid has traveled, also
+      // keeping track of the max distance from the start that we've seen.
+      float min_diff = angle - last_angle;
+      if (min_diff < -180.0f)
+        min_diff += 360.0f;
+      else if (min_diff > 180.0f)
+        min_diff -= 360.0f;
+
+      cur_angle_dist += min_diff;
+      max_angle_dist =
+          std::min(std::max(max_angle_dist, std::abs(cur_angle_dist)), 360.0f);
+    }
+    last_angle = angle;
+
+    if (VLOG_IS_ON(1)) {
+      screen_debug = base::StringPrintf("%0.1f", screen_accel) +
+                     (screen_debug.empty() ? "" : " " + screen_debug);
+      keyboard_debug = base::StringPrintf("%0.1f", keyboard_accel) +
+                       (keyboard_debug.empty() ? "" : " " + keyboard_debug);
+      angle_debug = base::IntToString(static_cast<int>(angle + 0.5)) +
+                    (angle_debug.empty() ? "" : " " + angle_debug);
+    }
+  }
+
+  VLOG(1) << "Screen accelerations (" << num_big_screen_accels << " big): "
+          << "[" << screen_debug << "]";
+  VLOG(1) << "Keyboard accelerations (" << num_big_keyboard_accels << " big): "
+          << "[" << keyboard_debug << "]";
+  VLOG(1) << "Lid angles (" << base::StringPrintf("%0.1f", max_angle_dist)
+          << " degrees): [" << angle_debug << "]";
+
+  return (spurious_screen_accel_ > 0 &&
+          num_big_screen_accels >= spurious_accel_count_) ||
+         (spurious_keyboard_accel_ > 0 &&
+          num_big_keyboard_accels >= spurious_accel_count_) ||
+         (spurious_lid_angle_change_ > 0 &&
+          max_angle_dist >= spurious_lid_angle_change_);
+}
+
 void TabletPowerButtonController::SetDisplayForcedOff(bool forced_off) {
   if (backlights_forced_off_ == forced_off)
     return;
diff --git a/ash/system/power/tablet_power_button_controller.h b/ash/system/power/tablet_power_button_controller.h
index 69d32cc1..ab89f72 100644
--- a/ash/system/power/tablet_power_button_controller.h
+++ b/ash/system/power/tablet_power_button_controller.h
@@ -6,17 +6,26 @@
 #define ASH_SYSTEM_POWER_TABLET_POWER_BUTTON_CONTROLLER_H_
 
 #include <memory>
+#include <utility>
 
 #include "ash/ash_export.h"
 #include "ash/shell_observer.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "chromeos/accelerometer/accelerometer_reader.h"
+#include "chromeos/accelerometer/accelerometer_types.h"
 #include "chromeos/dbus/power_manager_client.h"
 #include "ui/events/devices/input_device_event_observer.h"
 #include "ui/events/event_handler.h"
+#include "ui/gfx/geometry/vector3d_f.h"
+
+namespace base {
+class CommandLine;
+}  // namespace base
 
 namespace ash {
 
@@ -25,7 +34,8 @@
 // Handles power button events on convertible/tablet device. This class is
 // instantiated and used in PowerButtonController.
 class ASH_EXPORT TabletPowerButtonController
-    : public chromeos::PowerManagerClient::Observer,
+    : public chromeos::AccelerometerReader::Observer,
+      public chromeos::PowerManagerClient::Observer,
       public ShellObserver,
       public ui::EventHandler,
       public ui::InputDeviceEventObserver {
@@ -42,12 +52,26 @@
     // Emulates |shutdown_timer_| timeout.
     void TriggerShutdownTimeout();
 
+    // Returns true if |controller_| is observing |reader|.
+    bool IsObservingAccelerometerReader(
+        chromeos::AccelerometerReader* reader) const;
+
+    // Calls |controller_|'s ParseSpuriousPowerButtonSwitches() method.
+    void ParseSpuriousPowerButtonSwitches(
+        const base::CommandLine& command_line);
+
+    // Calls |controller_|'s IsSpuriousPowerButtonEvent() method.
+    bool IsSpuriousPowerButtonEvent() const;
+
    private:
     TabletPowerButtonController* controller_;  // Not owned.
 
     DISALLOW_COPY_AND_ASSIGN(TestApi);
   };
 
+  // Public for tests.
+  static constexpr float kGravity = 9.80665f;
+
   explicit TabletPowerButtonController(LockStateController* controller);
   ~TabletPowerButtonController() override;
 
@@ -58,6 +82,10 @@
   // Handles a power button event.
   void OnPowerButtonEvent(bool down, const base::TimeTicks& timestamp);
 
+  // Overridden from chromeos::AccelerometerReader::Observer:
+  void OnAccelerometerUpdated(
+      scoped_refptr<const chromeos::AccelerometerUpdate> update) override;
+
   // Overridden from chromeos::PowerManagerClient::Observer:
   void PowerManagerRestarted() override;
   void BrightnessChanged(int level, bool user_initiated) override;
@@ -80,6 +108,15 @@
   void SetTickClockForTesting(std::unique_ptr<base::TickClock> tick_clock);
 
  private:
+  // Parses command-line switches that provide settings used to attempt to
+  // ignore accidental power button presses by looking at accelerometer data.
+  void ParseSpuriousPowerButtonSwitches(const base::CommandLine& command_line);
+
+  // Returns true if the device's accelerometers have reported enough recent
+  // movement that we should consider a power button event that was just
+  // received to be accidental and ignore it.
+  bool IsSpuriousPowerButtonEvent() const;
+
   // Updates the power manager's backlights-forced-off state and enables or
   // disables the touchscreen. No-op if |backlights_forced_off_| already equals
   // |forced_off|.
@@ -116,6 +153,10 @@
   // True if the screen was off when the power button was pressed.
   bool screen_off_when_power_button_down_ = false;
 
+  // True if the last power button down event was deemed spurious and ignored as
+  // a result.
+  bool power_button_down_was_spurious_ = false;
+
   // Time source for performed action times.
   std::unique_ptr<base::TickClock> tick_clock_;
 
@@ -135,6 +176,30 @@
 
   LockStateController* controller_;  // Not owned.
 
+  ScopedObserver<chromeos::AccelerometerReader, TabletPowerButtonController>
+      accelerometer_scoped_observer_;
+
+  // Number of recent screen and keyboard accelerometer samples to retain.
+  size_t max_accelerometer_samples_ = 0;
+
+  // Circular buffer of recent (screen, keyboard) accelerometer samples.
+  std::vector<std::pair<gfx::Vector3dF, gfx::Vector3dF>> accelerometer_samples_;
+  size_t last_accelerometer_sample_index_ = 0;
+
+  // Number of acceleration readings in |accelerometer_samples_| that must
+  // exceed the threshold in order for a power button event to be considered
+  // spurious.
+  size_t spurious_accel_count_ = 0;
+
+  // Thresholds for screen and keyboard accelerations (excluding gravity). See
+  // |spurious_accel_count_|.
+  float spurious_screen_accel_ = 0;
+  float spurious_keyboard_accel_ = 0;
+
+  // Threshold for the lid angle change seen within |accelerometer_samples_|
+  // in order for a power button event to be considered spurious.
+  float spurious_lid_angle_change_ = 0;
+
   base::WeakPtrFactory<TabletPowerButtonController> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(TabletPowerButtonController);
diff --git a/ash/system/power/tablet_power_button_controller_unittest.cc b/ash/system/power/tablet_power_button_controller_unittest.cc
index 526c9349..f3f0ffc 100644
--- a/ash/system/power/tablet_power_button_controller_unittest.cc
+++ b/ash/system/power/tablet_power_button_controller_unittest.cc
@@ -35,6 +35,18 @@
 // A non-zero brightness used for test.
 constexpr int kNonZeroBrightness = 10;
 
+// Vector pointing up (e.g. keyboard in clamshell).
+constexpr gfx::Vector3dF kUpVector = {0, 0,
+                                      TabletPowerButtonController::kGravity};
+
+// Vector pointing down (e.g. keyboard in tablet sitting on table).
+constexpr gfx::Vector3dF kDownVector = {0, 0,
+                                        -TabletPowerButtonController::kGravity};
+
+// Vector pointing sideways (e.g. screen in 90-degree clamshell).
+constexpr gfx::Vector3dF kSidewaysVector = {
+    0, TabletPowerButtonController::kGravity, 0};
+
 void CopyResult(bool* dest, bool src) {
   *dest = src;
 }
@@ -57,7 +69,7 @@
     AshTestBase::SetUp();
     // Trigger an accelerometer update so that |tablet_controller_| can be
     // initialized.
-    SendAccelerometerUpdate();
+    SendAccelerometerUpdate(kSidewaysVector, kUpVector);
     tablet_controller_ = Shell::Get()
                              ->power_button_controller()
                              ->tablet_power_button_controller_for_test();
@@ -87,11 +99,23 @@
   }
 
  protected:
-  void SendAccelerometerUpdate() {
+  // Sends an update with screen and keyboard accelerometer readings to
+  // PowerButtonController, and also |tablet_controller_| if it's non-null and
+  // has registered as an observer.
+  void SendAccelerometerUpdate(const gfx::Vector3dF& screen,
+                               const gfx::Vector3dF& keyboard) {
     scoped_refptr<chromeos::AccelerometerUpdate> update(
         new chromeos::AccelerometerUpdate());
-    update->Set(chromeos::ACCELEROMETER_SOURCE_SCREEN, 1.0f, 0.0f, 0.0f);
+    update->Set(chromeos::ACCELEROMETER_SOURCE_SCREEN, screen.x(), screen.y(),
+                screen.z());
+    update->Set(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, keyboard.x(),
+                keyboard.y(), keyboard.z());
+
     Shell::Get()->power_button_controller()->OnAccelerometerUpdated(update);
+
+    if (test_api_ && test_api_->IsObservingAccelerometerReader(
+                         chromeos::AccelerometerReader::GetInstance()))
+      tablet_controller_->OnAccelerometerUpdated(update);
   }
 
   void PressPowerButton() {
@@ -134,14 +158,14 @@
   }
 
   // Ownership is passed on to chromeos::DBusThreadManager.
-  chromeos::FakePowerManagerClient* power_manager_client_;
+  chromeos::FakePowerManagerClient* power_manager_client_ = nullptr;
 
-  LockStateController* lock_state_controller_;      // Not owned.
-  TabletPowerButtonController* tablet_controller_;  // Not owned.
+  LockStateController* lock_state_controller_ = nullptr;      // Not owned.
+  TabletPowerButtonController* tablet_controller_ = nullptr;  // Not owned.
   std::unique_ptr<TabletPowerButtonController::TestApi> test_api_;
   std::unique_ptr<LockStateControllerTestApi> lock_state_test_api_;
-  base::SimpleTestTickClock* tick_clock_;  // Not owned.
-  TestShellDelegate* shell_delegate_;      // Not owned.
+  base::SimpleTestTickClock* tick_clock_ = nullptr;  // Not owned.
+  TestShellDelegate* shell_delegate_ = nullptr;      // Not owned.
   ui::test::EventGenerator* generator_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(TabletPowerButtonControllerTest);
@@ -530,7 +554,7 @@
   Shell::Get()
       ->power_button_controller()
       ->ResetTabletPowerButtonControllerForTest();
-  SendAccelerometerUpdate();
+  SendAccelerometerUpdate(kSidewaysVector, kSidewaysVector);
 
   // Check that the local state of touchscreen enabled state is in line with
   // backlights forced off state.
@@ -550,13 +574,91 @@
                            ->tablet_power_button_controller_for_test();
   EXPECT_FALSE(tablet_controller_);
 
-  SendAccelerometerUpdate();
+  SendAccelerometerUpdate(kSidewaysVector, kSidewaysVector);
   tablet_controller_ = Shell::Get()
                            ->power_button_controller()
                            ->tablet_power_button_controller_for_test();
   EXPECT_TRUE(tablet_controller_);
 }
 
+TEST_F(TabletPowerButtonControllerTest, IgnoreSpuriousEventsForAcceleration) {
+  base::CommandLine cl(base::CommandLine::NO_PROGRAM);
+  cl.AppendSwitchASCII(switches::kSpuriousPowerButtonWindow, "3");
+  cl.AppendSwitchASCII(switches::kSpuriousPowerButtonAccelCount, "2");
+  cl.AppendSwitchASCII(switches::kSpuriousPowerButtonKeyboardAccel, "4.5");
+  cl.AppendSwitchASCII(switches::kSpuriousPowerButtonScreenAccel, "8.0");
+  test_api_->ParseSpuriousPowerButtonSwitches(cl);
+  ASSERT_FALSE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // Vectors with varying amounts of acceleration beyond gravity.
+  static constexpr gfx::Vector3dF kVector0 = {
+      0, 0, TabletPowerButtonController::kGravity};
+  static constexpr gfx::Vector3dF kVector3 = {
+      0, 0, TabletPowerButtonController::kGravity + 3};
+  static constexpr gfx::Vector3dF kVector5 = {
+      0, 0, TabletPowerButtonController::kGravity + 5};
+  static constexpr gfx::Vector3dF kVector9 = {
+      0, 0, TabletPowerButtonController::kGravity + 9};
+
+  // Send two keyboard readings with vectors that exceed the threshold after
+  // subtracting gravity.
+  SendAccelerometerUpdate(kVector0, kVector5);
+  SendAccelerometerUpdate(kVector0, kVector9);
+  EXPECT_TRUE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // Now send two more keyboard readings that are close to gravity. We only have
+  // one large reading saved now, so we should permit power button events again.
+  SendAccelerometerUpdate(kVector0, kVector0);
+  SendAccelerometerUpdate(kVector0, kVector0);
+  EXPECT_FALSE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // Send a few large screen vectors and check that the button is again blocked.
+  SendAccelerometerUpdate(kVector9, kVector0);
+  SendAccelerometerUpdate(kVector9, kVector0);
+  EXPECT_TRUE(test_api_->IsSpuriousPowerButtonEvent());
+}
+
+TEST_F(TabletPowerButtonControllerTest, IgnoreSpuriousEventsForLidAngle) {
+  base::CommandLine cl(base::CommandLine::NO_PROGRAM);
+  cl.AppendSwitchASCII(switches::kSpuriousPowerButtonWindow, "5");
+  cl.AppendSwitchASCII(switches::kSpuriousPowerButtonLidAngleChange, "200");
+  test_api_->ParseSpuriousPowerButtonSwitches(cl);
+  ASSERT_FALSE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // Send two updates in tablet mode with the screen facing up and the keyboard
+  // facing down (i.e. 360 degrees between the two).
+  SendAccelerometerUpdate(kUpVector, kDownVector);
+  SendAccelerometerUpdate(kUpVector, kDownVector);
+  EXPECT_FALSE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // Now keep the screen facing up and report the keyboard as being sideways, as
+  // if it's been rotated 90 degrees.
+  SendAccelerometerUpdate(kUpVector, kSidewaysVector);
+  EXPECT_FALSE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // Make the keyboard also face up (180 degrees from start).
+  SendAccelerometerUpdate(kUpVector, kUpVector);
+  EXPECT_FALSE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // Now make the screen face sideways, completing the 270-degree change to
+  // a clamshell orientation. We've exceeded the threshold over the last four
+  // samples, so events should be ignored.
+  SendAccelerometerUpdate(kSidewaysVector, kUpVector);
+  EXPECT_TRUE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // Make the screen travel 90 more degrees so the lid is closed (360 degrees
+  // from start).
+  SendAccelerometerUpdate(kDownVector, kUpVector);
+  EXPECT_TRUE(test_api_->IsSpuriousPowerButtonEvent());
+
+  // After two more closed samples, the 5-sample buffer just contains a
+  // 180-degree transition, so events should be accepted again.
+  SendAccelerometerUpdate(kDownVector, kUpVector);
+  EXPECT_TRUE(test_api_->IsSpuriousPowerButtonEvent());
+  SendAccelerometerUpdate(kDownVector, kUpVector);
+  EXPECT_FALSE(test_api_->IsSpuriousPowerButtonEvent());
+}
+
 // Tests that when backlights get forced off due to tablet power button, media
 // sessions should be suspended.
 TEST_F(TabletPowerButtonControllerTest, SuspendMediaSessions) {
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 9ec24e72..13ea874 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -508,6 +508,45 @@
      cc::switches::kCompositedLayerBorders},
     {flag_descriptions::kUiShowCompositedLayerBordersAll,
      cc::switches::kUIShowCompositedLayerBorders, ""}};
+
+const FeatureEntry::Choice kSpuriousPowerButtonWindowChoices[] = {
+    {"0", "", ""},
+    {"5", ash::switches::kSpuriousPowerButtonWindow, "5"},
+    {"10", ash::switches::kSpuriousPowerButtonWindow, "10"},
+    {"15", ash::switches::kSpuriousPowerButtonWindow, "15"},
+    {"20", ash::switches::kSpuriousPowerButtonWindow, "20"},
+};
+const FeatureEntry::Choice kSpuriousPowerButtonAccelCountChoices[] = {
+    {"0", "", ""},
+    {"1", ash::switches::kSpuriousPowerButtonAccelCount, "1"},
+    {"2", ash::switches::kSpuriousPowerButtonAccelCount, "2"},
+    {"3", ash::switches::kSpuriousPowerButtonAccelCount, "3"},
+    {"4", ash::switches::kSpuriousPowerButtonAccelCount, "4"},
+    {"5", ash::switches::kSpuriousPowerButtonAccelCount, "5"},
+};
+const FeatureEntry::Choice kSpuriousPowerButtonScreenAccelChoices[] = {
+    {"0", "", ""},
+    {"0.2", ash::switches::kSpuriousPowerButtonScreenAccel, "0.2"},
+    {"0.4", ash::switches::kSpuriousPowerButtonScreenAccel, "0.4"},
+    {"0.6", ash::switches::kSpuriousPowerButtonScreenAccel, "0.6"},
+    {"0.8", ash::switches::kSpuriousPowerButtonScreenAccel, "0.8"},
+    {"1.0", ash::switches::kSpuriousPowerButtonScreenAccel, "1.0"},
+};
+const FeatureEntry::Choice kSpuriousPowerButtonKeyboardAccelChoices[] = {
+    {"0", "", ""},
+    {"0.2", ash::switches::kSpuriousPowerButtonKeyboardAccel, "0.2"},
+    {"0.4", ash::switches::kSpuriousPowerButtonKeyboardAccel, "0.4"},
+    {"0.6", ash::switches::kSpuriousPowerButtonKeyboardAccel, "0.6"},
+    {"0.8", ash::switches::kSpuriousPowerButtonKeyboardAccel, "0.8"},
+    {"1.0", ash::switches::kSpuriousPowerButtonKeyboardAccel, "1.0"},
+};
+const FeatureEntry::Choice kSpuriousPowerButtonLidAngleChangeChoices[] = {
+    {"0", "", ""},
+    {"45", ash::switches::kSpuriousPowerButtonLidAngleChange, "45"},
+    {"90", ash::switches::kSpuriousPowerButtonLidAngleChange, "90"},
+    {"135", ash::switches::kSpuriousPowerButtonLidAngleChange, "135"},
+    {"180", ash::switches::kSpuriousPowerButtonLidAngleChange, "180"},
+};
 #endif  // OS_CHROMEOS
 
 const FeatureEntry::Choice kV8CacheOptionsChoices[] = {
@@ -1341,6 +1380,26 @@
      kOsCrOS,
      SINGLE_VALUE_TYPE(
          proximity_auth::switches::kEnableBluetoothLowEnergyDiscovery)},
+    {"spurious-power-button-window",
+     flag_descriptions::kSpuriousPowerButtonWindowName,
+     flag_descriptions::kSpuriousPowerButtonWindowDescription, kOsCrOS,
+     MULTI_VALUE_TYPE(kSpuriousPowerButtonWindowChoices)},
+    {"spurious-power-button-accel-count",
+     flag_descriptions::kSpuriousPowerButtonAccelCountName,
+     flag_descriptions::kSpuriousPowerButtonAccelCountDescription, kOsCrOS,
+     MULTI_VALUE_TYPE(kSpuriousPowerButtonAccelCountChoices)},
+    {"spurious-power-button-screen-accel",
+     flag_descriptions::kSpuriousPowerButtonScreenAccelName,
+     flag_descriptions::kSpuriousPowerButtonScreenAccelDescription, kOsCrOS,
+     MULTI_VALUE_TYPE(kSpuriousPowerButtonScreenAccelChoices)},
+    {"spurious-power-button-keyboard-accel",
+     flag_descriptions::kSpuriousPowerButtonKeyboardAccelName,
+     flag_descriptions::kSpuriousPowerButtonKeyboardAccelDescription, kOsCrOS,
+     MULTI_VALUE_TYPE(kSpuriousPowerButtonKeyboardAccelChoices)},
+    {"spurious-power-button-lid-angle-change",
+     flag_descriptions::kSpuriousPowerButtonLidAngleChangeName,
+     flag_descriptions::kSpuriousPowerButtonLidAngleChangeDescription, kOsCrOS,
+     MULTI_VALUE_TYPE(kSpuriousPowerButtonLidAngleChangeChoices)},
 #endif  // OS_CHROMEOS
 #if defined(USE_ASH)
     {"ash-disable-night-light", flag_descriptions::kDisableNightLightName,
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index e88f4d37..0714a23 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3049,6 +3049,37 @@
     "If enabled and the device supports ARC, the user will be asked to update "
     "the encryption of user data when the user signs in.";
 
+// Spurious power button detection
+
+const char kSpuriousPowerButtonWindowName[] = "Spurious power button window";
+const char kSpuriousPowerButtonWindowDescription[] =
+    "Number of recent accelerometer samples to examine to determine if a power "
+    "button event was spurious.";
+
+const char kSpuriousPowerButtonAccelCountName[] =
+    "Spurious power button acceleration count";
+const char kSpuriousPowerButtonAccelCountDescription[] =
+    "Number of recent acceleration samples that must meet or exceed exceed the "
+    "threshold in order for a power button event to be considered spurious.";
+
+const char kSpuriousPowerButtonScreenAccelName[] =
+    "Spurious power button screen acceleration threshold";
+const char kSpuriousPowerButtonScreenAccelDescription[] =
+    "Threshold (in m/s^2, disregarding gravity) that screen acceleration must "
+    "meet or exceed for a power button event to be considered spurious.";
+
+const char kSpuriousPowerButtonKeyboardAccelName[] =
+    "Spurious power button keyboard acceleration threshold";
+const char kSpuriousPowerButtonKeyboardAccelDescription[] =
+    "Threshold (in m/s^2, disregarding gravity) that keyboard acceleration "
+    "must meet or exceed for a power button event to be considered spurious.";
+
+const char kSpuriousPowerButtonLidAngleChangeName[] =
+    "Spurious power button lid angle change threshold";
+const char kSpuriousPowerButtonLidAngleChangeDescription[] =
+    "Change in lid angle (i.e. hinge between keyboard and screen) that must be "
+    "met or exceeded for a power button event to be considered spurious.";
+
 #endif  // #if defined(OS_CHROMEOS)
 
 #if defined(OS_ANDROID)
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 89342fc..e5a1429 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1367,6 +1367,17 @@
 extern const char kSmartVirtualKeyboardName[];
 extern const char kSmartVirtualKeyboardDescription[];
 
+extern const char kSpuriousPowerButtonWindowName[];
+extern const char kSpuriousPowerButtonWindowDescription[];
+extern const char kSpuriousPowerButtonAccelCountName[];
+extern const char kSpuriousPowerButtonAccelCountDescription[];
+extern const char kSpuriousPowerButtonScreenAccelName[];
+extern const char kSpuriousPowerButtonScreenAccelDescription[];
+extern const char kSpuriousPowerButtonKeyboardAccelName[];
+extern const char kSpuriousPowerButtonKeyboardAccelDescription[];
+extern const char kSpuriousPowerButtonLidAngleChangeName[];
+extern const char kSpuriousPowerButtonLidAngleChangeDescription[];
+
 extern const char kTeamDrivesName[];
 extern const char kTeamDrivesDescription[];
 
diff --git a/chrome/browser/media/router/mojo/media_route_provider_util_win.cc b/chrome/browser/media/router/mojo/media_route_provider_util_win.cc
index 8560ff7..3ffe767 100644
--- a/chrome/browser/media/router/mojo/media_route_provider_util_win.cc
+++ b/chrome/browser/media/router/mojo/media_route_provider_util_win.cc
@@ -8,40 +8,37 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/path_service.h"
+#include "base/task_runner_util.h"
+#include "base/task_scheduler/post_task.h"
 #include "chrome/installer/util/browser_distribution.h"
 #include "chrome/installer/util/firewall_manager_win.h"
-#include "content/public/browser/browser_thread.h"
 
 namespace media_router {
 
 namespace {
 
-void DoCanFirewallUseLocalPorts(const base::Callback<void(bool)>& callback) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
+bool DoCanFirewallUseLocalPorts() {
   base::FilePath exe_path;
-  bool can_use_local_ports = false;
   if (!base::PathService::Get(base::FILE_EXE, &exe_path)) {
     LOG(WARNING) << "Couldn't get path of current executable.";
-    return;
+    return false;
   }
   auto firewall_manager = installer::FirewallManager::Create(
       BrowserDistribution::GetDistribution(), exe_path);
   if (!firewall_manager) {
     LOG(WARNING) << "Couldn't get FirewallManager instance.";
-    return;
+    return false;
   }
-  can_use_local_ports = firewall_manager->CanUseLocalPorts();
-  content::BrowserThread::PostTask(
-      content::BrowserThread::UI, FROM_HERE,
-      base::Bind(callback, can_use_local_ports));
+  return firewall_manager->CanUseLocalPorts();
 }
 
 }  // namespace
 
-void CanFirewallUseLocalPorts(const base::Callback<void(bool)>& callback) {
-  content::BrowserThread::PostTask(
-      content::BrowserThread::FILE, FROM_HERE,
-      base::Bind(&DoCanFirewallUseLocalPorts, callback));
+void CanFirewallUseLocalPorts(base::OnceCallback<void(bool)> callback) {
+  auto task_runner = base::CreateCOMSTATaskRunnerWithTraits({base::MayBlock()});
+  base::PostTaskAndReplyWithResult(task_runner.get(), FROM_HERE,
+                                   base::BindOnce(&DoCanFirewallUseLocalPorts),
+                                   std::move(callback));
 }
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/mojo/media_route_provider_util_win.h b/chrome/browser/media/router/mojo/media_route_provider_util_win.h
index d82d09140..49709ef 100644
--- a/chrome/browser/media/router/mojo/media_route_provider_util_win.h
+++ b/chrome/browser/media/router/mojo/media_route_provider_util_win.h
@@ -12,7 +12,7 @@
 // Asynchronously checks whether there will be a firewall prompt for using local
 // ports on Windows. |callback| will be called with the result where |true|
 // means that local ports can be used without triggering a firewall prompt.
-void CanFirewallUseLocalPorts(const base::Callback<void(bool)>& callback);
+void CanFirewallUseLocalPorts(base::OnceCallback<void(bool)> callback);
 
 }  // namespace media_router
 
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
index 39acd69c..63a0931 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -75,8 +75,8 @@
 #if defined(OS_WIN)
   if (check_firewall == FirewallCheck::RUN) {
     CanFirewallUseLocalPorts(
-        base::Bind(&MediaRouterMojoImpl::OnFirewallCheckComplete,
-                   weak_factory_.GetWeakPtr()));
+        base::BindOnce(&MediaRouterMojoImpl::OnFirewallCheckComplete,
+                       weak_factory_.GetWeakPtr()));
   }
 #endif
 }
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
index 8bd5b218..ea5764be 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -313,8 +313,16 @@
 }
 
 void BrowserTabStripController::UpdateLoadingAnimations() {
-  for (int i = 0, tab_count = tabstrip_->tab_count(); i < tab_count; ++i)
-    tabstrip_->tab_at(i)->StepLoadingAnimation();
+  // Don't use the model count here as it's possible for this to be invoked
+  // before we've applied an update from the model (Browser::TabInsertedAt may
+  // be processed before us and invokes this).
+  for (int i = 0, tab_count = tabstrip_->tab_count(); i < tab_count; ++i) {
+    if (model_->ContainsIndex(i)) {
+      Tab* tab = tabstrip_->tab_at(i);
+      WebContents* contents = model_->GetWebContentsAt(i);
+      tab->UpdateLoadingAnimation(TabContentsNetworkState(contents));
+    }
+  }
 }
 
 int BrowserTabStripController::HasAvailableDragActions() const {
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc
index 19c62f0..babe43fc 100644
--- a/chrome/browser/ui/views/tabs/tab.cc
+++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -13,7 +13,6 @@
 #include "base/macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
 #include "build/build_config.h"
 #include "cc/paint/paint_flags.h"
 #include "cc/paint/paint_recorder.h"
@@ -98,11 +97,6 @@
 
 const char kTabCloseButtonName[] = "TabCloseButton";
 
-bool ShouldShowThrobber(TabRendererData::NetworkState state) {
-  return state != TabRendererData::NETWORK_STATE_NONE &&
-         state != TabRendererData::NETWORK_STATE_ERROR;
-}
-
 ////////////////////////////////////////////////////////////////////////////////
 // Drawing and utility functions
 
@@ -367,10 +361,11 @@
   // Resets the times tracking when the throbber changes state.
   void ResetStartTimes();
 
+ private:
   // views::View:
+  bool CanProcessEventsWithinSubtree() const override;
   void OnPaint(gfx::Canvas* canvas) override;
 
- private:
   Tab* owner_;  // Weak. Owns |this|.
 
   // The point in time when the tab icon was first painted in the waiting state.
@@ -385,9 +380,7 @@
   DISALLOW_COPY_AND_ASSIGN(ThrobberView);
 };
 
-Tab::ThrobberView::ThrobberView(Tab* owner) : owner_(owner) {
-  set_can_process_events_within_subtree(false);
-}
+Tab::ThrobberView::ThrobberView(Tab* owner) : owner_(owner) {}
 
 void Tab::ThrobberView::ResetStartTimes() {
   waiting_start_time_ = base::TimeTicks();
@@ -395,9 +388,15 @@
   waiting_state_ = gfx::ThrobberWaitingState();
 }
 
+bool Tab::ThrobberView::CanProcessEventsWithinSubtree() const {
+  return false;
+}
+
 void Tab::ThrobberView::OnPaint(gfx::Canvas* canvas) {
   const TabRendererData::NetworkState state = owner_->data().network_state;
-  CHECK(ShouldShowThrobber(state));
+  if (state == TabRendererData::NETWORK_STATE_NONE ||
+      state == TabRendererData::NETWORK_STATE_ERROR)
+    return;
 
   const ui::ThemeProvider* tp = GetThemeProvider();
   const gfx::Rect bounds = GetLocalBounds();
@@ -535,8 +534,8 @@
     return;
 
   TabRendererData old(data_);
+  UpdateLoadingAnimation(data.network_state);
   data_ = data;
-  UpdateThrobber(old);
 
   base::string16 title = data_.title;
   if (title.empty()) {
@@ -570,11 +569,17 @@
   SchedulePaint();
 }
 
-void Tab::StepLoadingAnimation() {
-  if (!throbber_->visible())
+void Tab::UpdateLoadingAnimation(TabRendererData::NetworkState state) {
+  if (state == data_.network_state &&
+      (state == TabRendererData::NETWORK_STATE_NONE ||
+       state == TabRendererData::NETWORK_STATE_ERROR)) {
+    // If the network state is none or is a network error and hasn't changed,
+    // do nothing. Otherwise we need to advance the animation frame.
     return;
+  }
 
-  RefreshThrobber();
+  data_.network_state = state;
+  AdvanceLoadingAnimation();
 }
 
 void Tab::StartPulse() {
@@ -1268,8 +1273,10 @@
     return;
 
   // Throbber will do its own painting.
-  if (throbber_->visible())
+  if (data().network_state != TabRendererData::NETWORK_STATE_NONE &&
+      data().network_state != TabRendererData::NETWORK_STATE_ERROR) {
     return;
+  }
   // Ensure that |favicon_| is created.
   if (favicon_.isNull()) {
     ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
@@ -1299,31 +1306,10 @@
   }
 }
 
-void Tab::UpdateThrobber(const TabRendererData& old) {
-  const bool should_show = ShouldShowThrobber(data_.network_state);
-  const bool is_showing = throbber_->visible();
-
-  // Delay the switch to showing the throbber for short duration resource
-  // loading that occurs after the initial navigation. See crbug.com/734104
-  if (!is_showing && should_show && old.url == data_.url) {
-    if (!delayed_throbber_show_timer_.IsRunning()) {
-      delayed_throbber_show_timer_.Start(FROM_HERE,
-                                         base::TimeDelta::FromSeconds(3), this,
-                                         &Tab::RefreshThrobber);
-    }
-    return;
-  }
-
-  delayed_throbber_show_timer_.Stop();
-
-  if (!is_showing && !should_show)
-    return;
-
-  RefreshThrobber();
-}
-
-void Tab::RefreshThrobber() {
-  if (!ShouldShowThrobber(data().network_state)) {
+void Tab::AdvanceLoadingAnimation() {
+  const TabRendererData::NetworkState state = data().network_state;
+  if (state == TabRendererData::NETWORK_STATE_NONE ||
+      state == TabRendererData::NETWORK_STATE_ERROR) {
     throbber_->ResetStartTimes();
     throbber_->SetVisible(false);
     ScheduleIconPaint();
diff --git a/chrome/browser/ui/views/tabs/tab.h b/chrome/browser/ui/views/tabs/tab.h
index d06e74b..573ea77 100644
--- a/chrome/browser/ui/views/tabs/tab.h
+++ b/chrome/browser/ui/views/tabs/tab.h
@@ -12,7 +12,6 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/timer/timer.h"
 #include "cc/paint/paint_record.h"
 #include "chrome/browser/ui/views/tabs/tab_renderer_data.h"
 #include "ui/base/layout.h"
@@ -95,8 +94,8 @@
   void SetData(const TabRendererData& data);
   const TabRendererData& data() const { return data_; }
 
-  // Redraws the loading animation if one is visible. Otherwise, no-op.
-  void StepLoadingAnimation();
+  // Sets the network state.
+  void UpdateLoadingAnimation(TabRendererData::NetworkState state);
 
   // Starts/Stops a pulse animation.
   void StartPulse();
@@ -260,11 +259,8 @@
   // Paints the favicon, mirrored for RTL if needed.
   void PaintIcon(gfx::Canvas* canvas);
 
-  // Updates the throbber.
-  void UpdateThrobber(const TabRendererData& old);
-
-  // Sets the throbber visibility according to the state in |data_|.
-  void RefreshThrobber();
+  // Invoked if data_.network_state changes, or the network_state is not none.
+  void AdvanceLoadingAnimation();
 
   // Returns the number of favicon-size elements that can fit in the tab's
   // current size.
@@ -367,11 +363,6 @@
   // and thus may be null.
   gfx::ImageSkia favicon_;
 
-  // This timer allows us to delay updating the visibility of the loading
-  // indicator so that state changes of a very brief duration aren't visually
-  // apparent to the user.
-  base::OneShotTimer delayed_throbber_show_timer_;
-
   class BackgroundCache {
    public:
     BackgroundCache();
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc
index 1b9d686..c751379 100644
--- a/chrome/browser/ui/views/tabs/tab_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -233,13 +233,6 @@
     }
   }
 
-  void FastForwardThrobberStateTimer(Tab* tab) {
-    EXPECT_TRUE(tab->delayed_throbber_show_timer_.IsRunning());
-    auto closure = tab->delayed_throbber_show_timer_.user_task();
-    tab->delayed_throbber_show_timer_.Stop();
-    closure.Run();
-  }
-
  protected:
   void InitWidget(Widget* widget) {
     Widget::InitParams params(CreateParams(Widget::InitParams::TYPE_WINDOW));
@@ -449,68 +442,47 @@
   tab.SetBoundsRect(gfx::Rect(Tab::GetStandardSize()));
 
   views::View* throbber = GetThrobberView(tab);
-  TabRendererData data;
-  data.url = GURL("http://example.com");
   EXPECT_FALSE(throbber->visible());
   EXPECT_EQ(TabRendererData::NETWORK_STATE_NONE, tab.data().network_state);
   EXPECT_EQ(throbber->bounds(), GetFaviconBounds(tab));
 
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_NONE);
+  EXPECT_FALSE(throbber->visible());
+
   // Simulate a "normal" tab load: should paint to a layer.
-  data.network_state = TabRendererData::NETWORK_STATE_WAITING;
-  tab.SetData(data);
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_WAITING);
   EXPECT_TRUE(tab_controller.CanPaintThrobberToLayer());
   EXPECT_TRUE(throbber->visible());
   EXPECT_TRUE(throbber->layer());
-  data.network_state = TabRendererData::NETWORK_STATE_LOADING;
-  tab.SetData(data);
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_LOADING);
   EXPECT_TRUE(throbber->visible());
   EXPECT_TRUE(throbber->layer());
-  data.network_state = TabRendererData::NETWORK_STATE_NONE;
-  tab.SetData(data);
-  EXPECT_FALSE(throbber->visible());
-
-  // After loading is done, simulate another resource starting to load. The
-  // throbber shouldn't immediately become visible again.
-  data.network_state = TabRendererData::NETWORK_STATE_WAITING;
-  tab.SetData(data);
-  EXPECT_FALSE(throbber->visible());
-  FastForwardThrobberStateTimer(&tab);
-  EXPECT_TRUE(throbber->visible());
-
-  // Reset.
-  data.network_state = TabRendererData::NETWORK_STATE_NONE;
-  tab.SetData(data);
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_NONE);
   EXPECT_FALSE(throbber->visible());
 
   // Simulate a drag started and stopped during a load: layer painting stops
   // temporarily.
-  data.network_state = TabRendererData::NETWORK_STATE_WAITING;
-  tab.SetData(data);
-  FastForwardThrobberStateTimer(&tab);
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_WAITING);
   EXPECT_TRUE(throbber->visible());
   EXPECT_TRUE(throbber->layer());
   tab_controller.set_paint_throbber_to_layer(false);
-  tab.StepLoadingAnimation();
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_WAITING);
   EXPECT_TRUE(throbber->visible());
   EXPECT_FALSE(throbber->layer());
   tab_controller.set_paint_throbber_to_layer(true);
-  tab.StepLoadingAnimation();
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_WAITING);
   EXPECT_TRUE(throbber->visible());
   EXPECT_TRUE(throbber->layer());
-  data.network_state = TabRendererData::NETWORK_STATE_NONE;
-  tab.SetData(data);
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_NONE);
   EXPECT_FALSE(throbber->visible());
 
   // Simulate a tab load starting and stopping during tab dragging (or with
   // stacked tabs): no layer painting.
   tab_controller.set_paint_throbber_to_layer(false);
-  data.network_state = TabRendererData::NETWORK_STATE_WAITING;
-  tab.SetData(data);
-  FastForwardThrobberStateTimer(&tab);
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_WAITING);
   EXPECT_TRUE(throbber->visible());
   EXPECT_FALSE(throbber->layer());
-  data.network_state = TabRendererData::NETWORK_STATE_NONE;
-  tab.SetData(data);
+  tab.UpdateLoadingAnimation(TabRendererData::NETWORK_STATE_NONE);
   EXPECT_FALSE(throbber->visible());
 }
 
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 5a5cd912..06b8b7a 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -553,7 +553,6 @@
     "//rlz/features",
   ]
   deps = [
-    ":channel_info",
     ":version_header",
     "//base",
     "//base/third_party/dynamic_annotations",
diff --git a/chrome/common/channel_info.h b/chrome/common/channel_info.h
index 010de41..a633722 100644
--- a/chrome/common/channel_info.h
+++ b/chrome/common/channel_info.h
@@ -41,13 +41,6 @@
 void SetChannel(const std::string& channel);
 #endif
 
-#if defined(OS_POSIX) && defined(GOOGLE_CHROME_BUILD)
-// Returns a channel-specific suffix to use when constructing the path of the
-// default user data directory, allowing multiple channels to run side-by-side.
-// In the stable channel, this returns the empty string.
-std::string GetChannelSuffixForDataDir();
-#endif
-
 }  // namespace chrome
 
 #endif  // CHROME_COMMON_CHANNEL_INFO_H_
diff --git a/chrome/common/channel_info_posix.cc b/chrome/common/channel_info_posix.cc
index 2b4e9792..ff55d20 100644
--- a/chrome/common/channel_info_posix.cc
+++ b/chrome/common/channel_info_posix.cc
@@ -15,11 +15,9 @@
 // Helper function to return both the channel enum and modifier string.
 // Implements both together to prevent their behavior from diverging, which has
 // happened multiple times in the past.
-version_info::Channel GetChannelImpl(std::string* modifier_out,
-                                     std::string* data_dir_suffix_out) {
+version_info::Channel GetChannelImpl(std::string* modifier_out) {
   version_info::Channel channel = version_info::Channel::UNKNOWN;
   std::string modifier;
-  std::string data_dir_suffix;
 
   char* env = getenv("CHROME_VERSION_EXTRA");
   if (env)
@@ -34,10 +32,8 @@
     modifier = "";
   } else if (modifier == "dev") {
     channel = version_info::Channel::DEV;
-    data_dir_suffix = "-unstable";
   } else if (modifier == "beta") {
     channel = version_info::Channel::BETA;
-    data_dir_suffix = "-beta";
   } else {
     modifier = "unknown";
   }
@@ -45,8 +41,6 @@
 
   if (modifier_out)
     modifier_out->swap(modifier);
-  if (data_dir_suffix_out)
-    data_dir_suffix_out->swap(data_dir_suffix);
 
   return channel;
 }
@@ -55,20 +49,12 @@
 
 std::string GetChannelString() {
   std::string modifier;
-  GetChannelImpl(&modifier, nullptr);
+  GetChannelImpl(&modifier);
   return modifier;
 }
 
-#if defined(GOOGLE_CHROME_BUILD)
-std::string GetChannelSuffixForDataDir() {
-  std::string data_dir_suffix;
-  GetChannelImpl(nullptr, &data_dir_suffix);
-  return data_dir_suffix;
-}
-#endif  // defined(GOOGLE_CHROME_BUILD)
-
 version_info::Channel GetChannel() {
-  return GetChannelImpl(nullptr, nullptr);
+  return GetChannelImpl(nullptr);
 }
 
 }  // namespace chrome
diff --git a/chrome/common/chrome_paths_linux.cc b/chrome/common/chrome_paths_linux.cc
index 1527b89..aa26cc9b 100644
--- a/chrome/common/chrome_paths_linux.cc
+++ b/chrome/common/chrome_paths_linux.cc
@@ -12,7 +12,6 @@
 #include "base/nix/xdg_util.h"
 #include "base/path_service.h"
 #include "build/build_config.h"
-#include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_paths_internal.h"
 
 namespace chrome {
@@ -57,29 +56,18 @@
 
 }  // namespace
 
-// This returns <config-home>/<product>, where
-//   <config-home> is:
-//     $XDG_CONFIG_HOME if set
-//     otherwise ~/.config
-//   and <product> is:
-//     "chromium" for Chromium
-//     "google-chrome" for stable channel official build
-//     "google-chrome-beta" for beta channel official build
-//     "google-chrome-unstable" for dev channel official build
-//
-// (Note that ChromeMainDelegate will override the value returned by this
-// function if $CHROME_USER_DATA_DIR or --user-data-dir is set.)
-//
 // See http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
-// for a spec on where config files go.  Using ~/.config also helps us sidestep
-// issues with other apps grabbing ~/.chromium .
+// for a spec on where config files go.  The net effect for most
+// systems is we use ~/.config/chromium/ for Chromium and
+// ~/.config/google-chrome/ for official builds.
+// (This also helps us sidestep issues with other apps grabbing ~/.chromium .)
 bool GetDefaultUserDataDirectory(base::FilePath* result) {
   std::unique_ptr<base::Environment> env(base::Environment::Create());
   base::FilePath config_dir(GetXDGDirectory(env.get(),
                                             kXdgConfigHomeEnvVar,
                                             kDotConfigDir));
 #if defined(GOOGLE_CHROME_BUILD)
-  *result = config_dir.Append("google-chrome" + GetChannelSuffixForDataDir());
+  *result = config_dir.Append("google-chrome");
 #else
   *result = config_dir.Append("chromium");
 #endif
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index e3b001c..9ab90132 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -299,8 +299,7 @@
       new MockServiceWorkerDatabaseTaskManager(
           base::ThreadTaskRunnerHandle::Get()));
   wrapper_->InitInternal(user_data_directory, std::move(database_task_manager),
-                         base::ThreadTaskRunnerHandle::Get(), nullptr, nullptr,
-                         nullptr, nullptr);
+                         base::ThreadTaskRunnerHandle::Get(), nullptr, nullptr);
   wrapper_->process_manager()->SetProcessIdForTest(mock_render_process_id());
   wrapper_->process_manager()->SetNewProcessIdForTest(new_render_process_id());
 
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index 9933f3c..751da4a 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -33,13 +33,11 @@
 #include "content/browser/service_worker/service_worker_registration.h"
 #include "content/browser/service_worker/service_worker_storage.h"
 #include "content/browser/service_worker/service_worker_version.h"
-#include "content/browser/url_loader_factory_getter.h"
 #include "content/common/service_worker/service_worker_utils.h"
 #include "content/public/browser/browser_thread.h"
 #include "ipc/ipc_message.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
-#include "storage/browser/blob/blob_storage_context.h"
 #include "storage/browser/quota/quota_manager_proxy.h"
 #include "url/gurl.h"
 
@@ -241,16 +239,12 @@
     const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread,
     storage::QuotaManagerProxy* quota_manager_proxy,
     storage::SpecialStoragePolicy* special_storage_policy,
-    base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
-    URLLoaderFactoryGetter* url_loader_factory_getter,
     base::ObserverListThreadSafe<ServiceWorkerContextCoreObserver>*
         observer_list,
     ServiceWorkerContextWrapper* wrapper)
     : wrapper_(wrapper),
       providers_(base::MakeUnique<ProcessToProviderMap>()),
       provider_by_uuid_(base::MakeUnique<ProviderByClientUUIDMap>()),
-      blob_storage_context_(std::move(blob_storage_context)),
-      loader_factory_getter_(url_loader_factory_getter),
       force_update_on_page_load_(false),
       next_handle_id_(0),
       next_registration_handle_id_(0),
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index 62d6a42..29120b0 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -35,7 +35,6 @@
 }
 
 namespace storage {
-class BlobStorageContext;
 class QuotaManagerProxy;
 class SpecialStoragePolicy;
 }
@@ -52,7 +51,6 @@
 class ServiceWorkerProviderHost;
 class ServiceWorkerRegistration;
 class ServiceWorkerStorage;
-class URLLoaderFactoryGetter;
 
 // This class manages data associated with service workers.
 // The class is single threaded and should only be used on the IO thread.
@@ -113,8 +111,6 @@
   // ServiceWorkerContextWrapper. When Notify() of |observer_list| is called in
   // ServiceWorkerContextCore, the methods of ServiceWorkerContextCoreObserver
   // will be called on the thread which called AddObserver() of |observer_list|.
-  // |blob_context| and |url_loader_factory_getter| are used only
-  // when IsServicificationEnabled is true.
   ServiceWorkerContextCore(
       const base::FilePath& user_data_directory,
       std::unique_ptr<ServiceWorkerDatabaseTaskManager>
@@ -122,8 +118,6 @@
       const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread,
       storage::QuotaManagerProxy* quota_manager_proxy,
       storage::SpecialStoragePolicy* special_storage_policy,
-      base::WeakPtr<storage::BlobStorageContext> blob_context,
-      URLLoaderFactoryGetter* url_loader_factory_getter,
       base::ObserverListThreadSafe<ServiceWorkerContextCoreObserver>*
           observer_list,
       ServiceWorkerContextWrapper* wrapper);
@@ -313,14 +307,6 @@
       int service_worker_provider_id,
       mojom::ServiceWorkerWorkerClientAssociatedPtrInfo client_ptr_info);
 
-  base::WeakPtr<storage::BlobStorageContext> blob_storage_context() {
-    return blob_storage_context_;
-  }
-
-  URLLoaderFactoryGetter* loader_factory_getter() {
-    return loader_factory_getter_.get();
-  }
-
   base::WeakPtr<ServiceWorkerContextCore> AsWeakPtr() {
     return weak_factory_.GetWeakPtr();
   }
@@ -394,10 +380,6 @@
   std::map<int, ServiceWorkerNavigationHandleCore*>
       navigation_handle_cores_map_;
 
-  // IsServicificationEnabled
-  base::WeakPtr<storage::BlobStorageContext> blob_storage_context_;
-  scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_;
-
   bool force_update_on_page_load_;
   int next_handle_id_;
   int next_registration_handle_id_;
diff --git a/content/browser/service_worker/service_worker_context_request_handler.cc b/content/browser/service_worker/service_worker_context_request_handler.cc
index 13b4c483..364e41f7 100644
--- a/content/browser/service_worker/service_worker_context_request_handler.cc
+++ b/content/browser/service_worker/service_worker_context_request_handler.cc
@@ -21,6 +21,26 @@
 
 namespace content {
 
+namespace {
+
+bool IsInstalled(const ServiceWorkerVersion* version) {
+  switch (version->status()) {
+    case ServiceWorkerVersion::NEW:
+    case ServiceWorkerVersion::INSTALLING:
+      return false;
+    case ServiceWorkerVersion::INSTALLED:
+    case ServiceWorkerVersion::ACTIVATING:
+    case ServiceWorkerVersion::ACTIVATED:
+      return true;
+    case ServiceWorkerVersion::REDUNDANT:
+      return false;
+  }
+  NOTREACHED();
+  return false;
+}
+
+}  // namespace
+
 ServiceWorkerContextRequestHandler::ServiceWorkerContextRequestHandler(
     base::WeakPtr<ServiceWorkerContextCore> context,
     base::WeakPtr<ServiceWorkerProviderHost> provider_host,
@@ -90,8 +110,7 @@
       MaybeCreateJobImpl(request, network_delegate, &status);
   const bool is_main_script = resource_type_ == RESOURCE_TYPE_SERVICE_WORKER;
   ServiceWorkerMetrics::RecordContextRequestHandlerStatus(
-      status, ServiceWorkerVersion::IsInstalled(version_->status()),
-      is_main_script);
+      status, IsInstalled(version_.get()), is_main_script);
   if (job)
     return job;
 
@@ -151,7 +170,7 @@
   int resource_id =
       version_->script_cache_map()->LookupResourceId(request->url());
   if (resource_id != kInvalidServiceWorkerResourceId) {
-    if (ServiceWorkerVersion::IsInstalled(version_->status())) {
+    if (IsInstalled(version_.get())) {
       // An installed worker is loading a stored script.
       if (is_main_script)
         version_->embedded_worker()->OnURLJobCreatedForMainScript();
@@ -167,7 +186,7 @@
   }
 
   // An installed worker is importing a non-stored script.
-  if (ServiceWorkerVersion::IsInstalled(version_->status())) {
+  if (IsInstalled(version_.get())) {
     DCHECK(!is_main_script);
     *out_status = CreateJobStatus::ERROR_UNINSTALLED_SCRIPT_IMPORT;
     return nullptr;
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index a25c00c..fbb00d4fc 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -31,7 +31,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/service_worker_context_observer.h"
 #include "net/base/url_util.h"
-#include "storage/browser/blob/blob_storage_context.h"
 #include "storage/browser/quota/quota_manager_proxy.h"
 #include "storage/browser/quota/special_storage_policy.h"
 
@@ -149,9 +148,7 @@
 void ServiceWorkerContextWrapper::Init(
     const base::FilePath& user_data_directory,
     storage::QuotaManagerProxy* quota_manager_proxy,
-    storage::SpecialStoragePolicy* special_storage_policy,
-    ChromeBlobStorageContext* blob_context,
-    URLLoaderFactoryGetter* loader_factory_getter) {
+    storage::SpecialStoragePolicy* special_storage_policy) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   is_incognito_ = user_data_directory.empty();
@@ -161,8 +158,7 @@
   scoped_refptr<base::SingleThreadTaskRunner> disk_cache_thread =
       BrowserThread::GetTaskRunnerForThread(BrowserThread::CACHE);
   InitInternal(user_data_directory, std::move(database_task_manager),
-               disk_cache_thread, quota_manager_proxy, special_storage_policy,
-               blob_context, loader_factory_getter);
+               disk_cache_thread, quota_manager_proxy, special_storage_policy);
 }
 
 void ServiceWorkerContextWrapper::Shutdown() {
@@ -793,18 +789,14 @@
     std::unique_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager,
     const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread,
     storage::QuotaManagerProxy* quota_manager_proxy,
-    storage::SpecialStoragePolicy* special_storage_policy,
-    ChromeBlobStorageContext* blob_context,
-    URLLoaderFactoryGetter* loader_factory_getter) {
+    storage::SpecialStoragePolicy* special_storage_policy) {
   if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
     BrowserThread::PostTask(
         BrowserThread::IO, FROM_HERE,
         base::Bind(&ServiceWorkerContextWrapper::InitInternal, this,
                    user_data_directory, base::Passed(&database_task_manager),
                    disk_cache_thread, base::RetainedRef(quota_manager_proxy),
-                   base::RetainedRef(special_storage_policy),
-                   base::RetainedRef(blob_context),
-                   base::RetainedRef(loader_factory_getter)));
+                   base::RetainedRef(special_storage_policy)));
     return;
   }
   // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed.
@@ -815,15 +807,10 @@
   if (quota_manager_proxy) {
     quota_manager_proxy->RegisterClient(new ServiceWorkerQuotaClient(this));
   }
-
-  base::WeakPtr<storage::BlobStorageContext> blob_storage_context =
-      blob_context && blob_context->context()
-          ? blob_context->context()->AsWeakPtr()
-          : nullptr;
   context_core_.reset(new ServiceWorkerContextCore(
       user_data_directory, std::move(database_task_manager), disk_cache_thread,
-      quota_manager_proxy, special_storage_policy, blob_storage_context,
-      loader_factory_getter, core_observer_list_.get(), this));
+      quota_manager_proxy, special_storage_policy, core_observer_list_.get(),
+      this));
 }
 
 void ServiceWorkerContextWrapper::ShutdownOnIO() {
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index ea9b7b3..a41d245 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -34,11 +34,9 @@
 namespace content {
 
 class BrowserContext;
-class ChromeBlobStorageContext;
 class ResourceContext;
 class ServiceWorkerContextObserver;
 class StoragePartitionImpl;
-class URLLoaderFactoryGetter;
 
 // A refcounted wrapper class for our core object. Higher level content lib
 // classes keep references to this class on mutliple threads. The inner core
@@ -63,13 +61,9 @@
 
   // Init and Shutdown are for use on the UI thread when the profile,
   // storagepartition is being setup and torn down.
-  // |blob_context| and |url_loader_factory_getter| are used only
-  // when IsServicificationEnabled is true.
   void Init(const base::FilePath& user_data_directory,
             storage::QuotaManagerProxy* quota_manager_proxy,
-            storage::SpecialStoragePolicy* special_storage_policy,
-            ChromeBlobStorageContext* blob_context,
-            URLLoaderFactoryGetter* url_loader_factory_getter);
+            storage::SpecialStoragePolicy* special_storage_policy);
   void Shutdown();
 
   // Must be called on the IO thread.
@@ -271,9 +265,7 @@
       std::unique_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager,
       const scoped_refptr<base::SingleThreadTaskRunner>& disk_cache_thread,
       storage::QuotaManagerProxy* quota_manager_proxy,
-      storage::SpecialStoragePolicy* special_storage_policy,
-      ChromeBlobStorageContext* blob_context,
-      URLLoaderFactoryGetter* url_loader_factory_getter);
+      storage::SpecialStoragePolicy* special_storage_policy);
   void ShutdownOnIO();
 
   void DidFindRegistrationForFindReady(
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.h b/content/browser/service_worker/service_worker_dispatcher_host.h
index 32029b3..2d6be54 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host.h
+++ b/content/browser/service_worker/service_worker_dispatcher_host.h
@@ -55,8 +55,6 @@
       int render_process_id,
       ResourceContext* resource_context);
 
-  // |blob_storage_context| and |loader_factory_getter| are used only
-  // if IsServicificationEnabled is true.
   void Init(ServiceWorkerContextWrapper* context_wrapper);
 
   // BrowserMessageFilter implementation
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc
index 0f5c67b..5de525ed 100644
--- a/content/browser/service_worker/service_worker_provider_host.cc
+++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -19,7 +19,6 @@
 #include "content/browser/service_worker/service_worker_handle.h"
 #include "content/browser/service_worker/service_worker_registration_handle.h"
 #include "content/browser/service_worker/service_worker_version.h"
-#include "content/browser/url_loader_factory_getter.h"
 #include "content/common/resource_request_body_impl.h"
 #include "content/common/service_worker/service_worker_messages.h"
 #include "content/common/service_worker/service_worker_types.h"
@@ -32,7 +31,6 @@
 #include "content/public/common/origin_util.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
 #include "net/base/url_util.h"
-#include "storage/browser/blob/blob_storage_context.h"
 
 namespace content {
 
@@ -100,210 +98,6 @@
   context->RemoveProviderHost(process_id, provider_id);
 }
 
-// Used by a Service Worker for script loading only during the installation
-// time. For now this is just a proxy loader for the network loader.
-// Eventually this should replace the existing URLRequestJob-based request
-// interception for script loading, namely ServiceWorkerWriteToCacheJob.
-// TODO(kinuko): Implement this.
-class ScriptURLLoader : public mojom::URLLoader, public mojom::URLLoaderClient {
- public:
-  ScriptURLLoader(
-      int32_t routing_id,
-      int32_t request_id,
-      uint32_t options,
-      const ResourceRequest& resource_request,
-      mojom::URLLoaderClientPtr client,
-      base::WeakPtr<ServiceWorkerContextCore> context,
-      base::WeakPtr<ServiceWorkerProviderHost> provider_host,
-      base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
-      scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter,
-      const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
-      : network_client_binding_(this),
-        forwarding_client_(std::move(client)),
-        provider_host_(provider_host) {
-    mojom::URLLoaderClientPtr network_client;
-    network_client_binding_.Bind(mojo::MakeRequest(&network_client));
-    loader_factory_getter->GetNetworkFactory()->get()->CreateLoaderAndStart(
-        mojo::MakeRequest(&network_loader_), routing_id, request_id, options,
-        resource_request, std::move(network_client), traffic_annotation);
-  }
-  ~ScriptURLLoader() override {}
-
-  // mojom::URLLoader:
-  void FollowRedirect() override { network_loader_->FollowRedirect(); }
-  void SetPriority(net::RequestPriority priority,
-                   int32_t intra_priority_value) override {
-    network_loader_->SetPriority(priority, intra_priority_value);
-  }
-
-  // mojom::URLLoaderClient for simply proxying network:
-  void OnReceiveResponse(
-      const ResourceResponseHead& response_head,
-      const base::Optional<net::SSLInfo>& ssl_info,
-      mojom::DownloadedTempFilePtr downloaded_file) override {
-    if (provider_host_) {
-      // We don't have complete info here, but fill in what we have now.
-      // At least we need headers and SSL info.
-      net::HttpResponseInfo response_info;
-      response_info.headers = response_head.headers;
-      if (ssl_info.has_value())
-        response_info.ssl_info = *ssl_info;
-      response_info.was_fetched_via_spdy = response_head.was_fetched_via_spdy;
-      response_info.was_alpn_negotiated = response_head.was_alpn_negotiated;
-      response_info.alpn_negotiated_protocol =
-          response_head.alpn_negotiated_protocol;
-      response_info.connection_info = response_head.connection_info;
-      response_info.socket_address = response_head.socket_address;
-
-      DCHECK(provider_host_->IsHostToRunningServiceWorker());
-      provider_host_->running_hosted_version()->SetMainScriptHttpResponseInfo(
-          response_info);
-    }
-    forwarding_client_->OnReceiveResponse(response_head, ssl_info,
-                                          std::move(downloaded_file));
-  }
-  void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
-                         const ResourceResponseHead& response_head) override {
-    forwarding_client_->OnReceiveRedirect(redirect_info, response_head);
-  }
-  void OnDataDownloaded(int64_t data_len, int64_t encoded_data_len) override {
-    forwarding_client_->OnDataDownloaded(data_len, encoded_data_len);
-  }
-  void OnUploadProgress(int64_t current_position,
-                        int64_t total_size,
-                        OnUploadProgressCallback ack_callback) override {
-    forwarding_client_->OnUploadProgress(current_position, total_size,
-                                         std::move(ack_callback));
-  }
-  void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {
-    forwarding_client_->OnReceiveCachedMetadata(data);
-  }
-  void OnTransferSizeUpdated(int32_t transfer_size_diff) override {
-    forwarding_client_->OnTransferSizeUpdated(transfer_size_diff);
-  }
-  void OnStartLoadingResponseBody(
-      mojo::ScopedDataPipeConsumerHandle body) override {
-    forwarding_client_->OnStartLoadingResponseBody(std::move(body));
-  }
-  void OnComplete(const ResourceRequestCompletionStatus& status) override {
-    forwarding_client_->OnComplete(status);
-  }
-
- private:
-  mojom::URLLoaderAssociatedPtr network_loader_;
-  mojo::Binding<mojom::URLLoaderClient> network_client_binding_;
-  mojom::URLLoaderClientPtr forwarding_client_;
-  base::WeakPtr<ServiceWorkerProviderHost> provider_host_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScriptURLLoader);
-};
-
-// Created per one controller worker for script loading (only during
-// installation, eventually). This is kept alive while
-// ServiceWorkerNetworkProvider in the renderer process is alive.
-// Used only when IsServicificationEnabled is true.
-class ScriptURLLoaderFactory : public mojom::URLLoaderFactory {
- public:
-  ScriptURLLoaderFactory(
-      base::WeakPtr<ServiceWorkerContextCore> context,
-      base::WeakPtr<ServiceWorkerProviderHost> provider_host,
-      base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
-      scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter)
-      : context_(context),
-        provider_host_(provider_host),
-        blob_storage_context_(blob_storage_context),
-        loader_factory_getter_(loader_factory_getter) {}
-  ~ScriptURLLoaderFactory() override {}
-
-  // mojom::URLLoaderFactory:
-  void CreateLoaderAndStart(mojom::URLLoaderAssociatedRequest request,
-                            int32_t routing_id,
-                            int32_t request_id,
-                            uint32_t options,
-                            const ResourceRequest& resource_request,
-                            mojom::URLLoaderClientPtr client,
-                            const net::MutableNetworkTrafficAnnotationTag&
-                                traffic_annotation) override {
-    if (!ShouldHandleScriptRequest(resource_request)) {
-      // If the request should not be handled by ScriptURLLoader, just
-      // fallback to the network.
-      // TODO(kinuko): Record the reason like what we do with netlog in
-      // ServiceWorkerContextRequestHandler.
-      loader_factory_getter_->GetNetworkFactory()->get()->CreateLoaderAndStart(
-          std::move(request), routing_id, request_id, options, resource_request,
-          std::move(client), traffic_annotation);
-      return;
-    }
-    mojo::MakeStrongAssociatedBinding(
-        base::MakeUnique<ScriptURLLoader>(
-            routing_id, request_id, options, resource_request,
-            std::move(client), context_, provider_host_, blob_storage_context_,
-            loader_factory_getter_, traffic_annotation),
-        std::move(request));
-  }
-
-  void SyncLoad(int32_t routing_id,
-                int32_t request_id,
-                const ResourceRequest& request,
-                SyncLoadCallback callback) override {
-    NOTREACHED();
-  }
-
- private:
-  bool ShouldHandleScriptRequest(const ResourceRequest& resource_request) {
-    if (!context_ || !provider_host_)
-      return false;
-
-    // We only use the script cache for main script loading and
-    // importScripts(), even if a cached script is xhr'd, we don't
-    // retrieve it from the script cache.
-    if (resource_request.resource_type != RESOURCE_TYPE_SERVICE_WORKER &&
-        resource_request.resource_type != RESOURCE_TYPE_SCRIPT) {
-      // TODO: Record bad message, we shouldn't come here for other
-      // request types.
-      return false;
-    }
-
-    scoped_refptr<ServiceWorkerVersion> version =
-        provider_host_->running_hosted_version();
-
-    // This could happen if browser-side has set the status to redundant but
-    // the worker has not yet stopped. The worker is already doomed so just
-    // reject the request. Handle it specially here because otherwise it'd be
-    // unclear whether "REDUNDANT" should count as installed or not installed
-    // when making decisions about how to handle the request and logging UMA.
-    if (!version || version->status() == ServiceWorkerVersion::REDUNDANT)
-      return false;
-
-    // TODO: Make sure we don't handle the redirected request.
-
-    // For installed worker we fallback to the network for now.
-    // TODO: Make sure we don't come here for installed worker once
-    // script streaming is enabled.
-    if (ServiceWorkerVersion::IsInstalled(version->status()))
-      return false;
-
-    // TODO: Make sure we come here only for new / unknown scripts
-    // once script streaming manager in the renderer side stops sending
-    // resource requests for the known script URLs, i.e. add DCHECK for
-    // version->script_cache_map()->LookupResourceId(url) ==
-    // kInvalidServiceWorkerResourceId.
-    //
-    // Currently this could be false for the installing worker that imports
-    // the same script twice (e.g. importScripts('dupe.js');
-    // importScripts('dupe.js');).
-
-    // Request should be served by ScriptURLLoader.
-    return true;
-  }
-
-  base::WeakPtr<ServiceWorkerContextCore> context_;
-  base::WeakPtr<ServiceWorkerProviderHost> provider_host_;
-  base::WeakPtr<storage::BlobStorageContext> blob_storage_context_;
-  scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_;
-  DISALLOW_COPY_AND_ASSIGN(ScriptURLLoaderFactory);
-};
-
 }  // anonymous namespace
 
 ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback(
@@ -785,7 +579,6 @@
 std::unique_ptr<ServiceWorkerProviderHost>
 ServiceWorkerProviderHost::PrepareForCrossSiteTransfer() {
   DCHECK(!IsBrowserSideNavigationEnabled());
-  DCHECK(!ServiceWorkerUtils::IsServicificationEnabled());
   DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_);
   DCHECK_NE(MSG_ROUTING_NONE, info_.route_id);
   DCHECK_EQ(kDocumentMainThreadId, render_thread_id_);
@@ -819,7 +612,6 @@
 void ServiceWorkerProviderHost::CompleteCrossSiteTransfer(
     ServiceWorkerProviderHost* provisional_host) {
   DCHECK(!IsBrowserSideNavigationEnabled());
-  DCHECK(!ServiceWorkerUtils::IsServicificationEnabled());
   DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id_);
   DCHECK_NE(ChildProcessHost::kInvalidUniqueID, provisional_host->process_id());
   DCHECK_NE(MSG_ROUTING_NONE, provisional_host->frame_id());
@@ -917,18 +709,6 @@
   provider_info->attributes = std::move(attrs);
   provider_info->registration = std::move(info);
   provider_info->client_request = mojo::MakeRequest(&provider_);
-
-  mojom::URLLoaderFactoryAssociatedPtrInfo loader_factory_ptr_info;
-  if (ServiceWorkerUtils::IsServicificationEnabled()) {
-    mojo::MakeStrongAssociatedBinding(
-        base::MakeUnique<ScriptURLLoaderFactory>(
-            context_, AsWeakPtr(), context_->blob_storage_context(),
-            context_->loader_factory_getter()),
-        mojo::MakeRequest(&loader_factory_ptr_info));
-    provider_info->script_loader_factory_ptr_info =
-        std::move(loader_factory_ptr_info);
-  }
-
   binding_.Bind(mojo::MakeRequest(&provider_info->host_ptr_info));
   binding_.set_connection_error_handler(
       base::Bind(&RemoveProviderHost, context_, process_id, provider_id()));
diff --git a/content/browser/service_worker/service_worker_provider_host.h b/content/browser/service_worker/service_worker_provider_host.h
index 27844dd..b5de3f2 100644
--- a/content/browser/service_worker/service_worker_provider_host.h
+++ b/content/browser/service_worker/service_worker_provider_host.h
@@ -30,7 +30,6 @@
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/strong_associated_binding_set.h"
 
 namespace storage {
 class BlobStorageContext;
diff --git a/content/browser/service_worker/service_worker_url_loader_job.cc b/content/browser/service_worker/service_worker_url_loader_job.cc
index efa00756..70e925b9 100644
--- a/content/browser/service_worker/service_worker_url_loader_job.cc
+++ b/content/browser/service_worker/service_worker_url_loader_job.cc
@@ -182,7 +182,9 @@
 void ServiceWorkerURLLoaderJob::CommitResponseHeaders() {
   DCHECK_EQ(Status::kStarted, status_);
   status_ = Status::kSentHeader;
-  url_loader_client_->OnReceiveResponse(response_head_, ssl_info_, nullptr);
+  url_loader_client_->OnReceiveResponse(
+      response_head_, base::nullopt /* TODO(scottmg): ssl info */,
+      mojom::DownloadedTempFilePtr());
 }
 
 void ServiceWorkerURLLoaderJob::CommitCompleted(int error_code) {
@@ -245,15 +247,6 @@
     return;
   }
 
-  // Creates a new HttpResponseInfo using the the ServiceWorker script's
-  // HttpResponseInfo to show HTTPS padlock.
-  // TODO(horo): When we support mixed-content (HTTP) no-cors requests from a
-  // ServiceWorker, we have to check the security level of the responses.
-  const net::HttpResponseInfo* main_script_http_info =
-      version->GetMainScriptHttpResponseInfo();
-  DCHECK(main_script_http_info);
-  ssl_info_ = main_script_http_info->ssl_info;
-
   std::move(loader_callback_)
       .Run(base::Bind(&ServiceWorkerURLLoaderJob::StartResponse,
                       weak_factory_.GetWeakPtr(), response,
diff --git a/content/browser/service_worker/service_worker_url_loader_job.h b/content/browser/service_worker/service_worker_url_loader_job.h
index c876820..df84f4e2 100644
--- a/content/browser/service_worker/service_worker_url_loader_job.h
+++ b/content/browser/service_worker/service_worker_url_loader_job.h
@@ -156,7 +156,6 @@
 
   bool did_navigation_preload_ = false;
   ResourceResponseHead response_head_;
-  base::Optional<net::SSLInfo> ssl_info_;
 
   // URLLoaderClient binding for loading a blob.
   mojo::Binding<mojom::URLLoaderClient> blob_client_binding_;
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 8767d26..c7fac32 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -135,6 +135,21 @@
   *time = base::TimeTicks();
 }
 
+bool IsInstalled(ServiceWorkerVersion::Status status) {
+  switch (status) {
+    case ServiceWorkerVersion::NEW:
+    case ServiceWorkerVersion::INSTALLING:
+    case ServiceWorkerVersion::REDUNDANT:
+      return false;
+    case ServiceWorkerVersion::INSTALLED:
+    case ServiceWorkerVersion::ACTIVATING:
+    case ServiceWorkerVersion::ACTIVATED:
+      return true;
+  }
+  NOTREACHED() << "Unexpected status: " << status;
+  return false;
+}
+
 std::string VersionStatusToString(ServiceWorkerVersion::Status status) {
   switch (status) {
     case ServiceWorkerVersion::NEW:
@@ -899,7 +914,14 @@
 }
 
 void ServiceWorkerVersion::OnScriptLoaded() {
-  DCHECK(GetMainScriptHttpResponseInfo());
+  DCHECK(GetMainScriptHttpResponseInfo() ||
+         // TODO(scottmg|falken): This DCHECK is currently triggered in
+         // --network-service because ServiceWorkerReadFromCacheJob isn't being
+         // used to retrieve the service worker js. This should be removed once
+         // that's done.
+         (IsBrowserSideNavigationEnabled() &&
+          base::CommandLine::ForCurrentProcess()->HasSwitch(
+              switches::kEnableNetworkService)));
   if (IsInstalled(status()))
     UMA_HISTOGRAM_BOOLEAN("ServiceWorker.ScriptLoadSuccess", true);
 }
@@ -1061,21 +1083,6 @@
     provider_host_by_uuid.second->CountFeature(feature);
 }
 
-bool ServiceWorkerVersion::IsInstalled(ServiceWorkerVersion::Status status) {
-  switch (status) {
-    case ServiceWorkerVersion::NEW:
-    case ServiceWorkerVersion::INSTALLING:
-    case ServiceWorkerVersion::REDUNDANT:
-      return false;
-    case ServiceWorkerVersion::INSTALLED:
-    case ServiceWorkerVersion::ACTIVATING:
-    case ServiceWorkerVersion::ACTIVATED:
-      return true;
-  }
-  NOTREACHED() << "Unexpected status: " << status;
-  return false;
-}
-
 void ServiceWorkerVersion::OnOpenNewTab(int request_id, const GURL& url) {
   OnOpenWindow(request_id, url, WindowOpenDisposition::NEW_FOREGROUND_TAB);
 }
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index 9e03f59..5ed49bf 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -403,8 +403,6 @@
   }
   const std::set<uint32_t>& used_features() const { return used_features_; }
 
-  static bool IsInstalled(ServiceWorkerVersion::Status status);
-
  private:
   friend class base::RefCounted<ServiceWorkerVersion>;
   friend class ServiceWorkerReadFromCacheJobTest;
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 446cce0..3af33049 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -496,6 +496,8 @@
   partition->cache_storage_context_->Init(path, quota_manager_proxy);
 
   partition->service_worker_context_ = new ServiceWorkerContextWrapper(context);
+  partition->service_worker_context_->Init(path, quota_manager_proxy.get(),
+                                           context->GetSpecialStoragePolicy());
   partition->service_worker_context_->set_storage_partition(partition.get());
 
   partition->appcache_service_ =
@@ -527,9 +529,6 @@
 
   partition->bluetooth_allowed_devices_map_ = new BluetoothAllowedDevicesMap();
 
-  scoped_refptr<ChromeBlobStorageContext> blob_context =
-      ChromeBlobStorageContext::GetFor(context);
-
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kEnableNetworkService)) {
     mojom::NetworkServicePtr network_service;
@@ -543,6 +542,8 @@
     network_service->CreateNetworkContext(
         MakeRequest(&partition->network_context_), std::move(context_params));
 
+    scoped_refptr<ChromeBlobStorageContext> blob_context =
+        ChromeBlobStorageContext::GetFor(context);
     BlobURLLoaderFactory::BlobContextGetter blob_getter =
         base::BindOnce(&BlobStorageContextGetter, blob_context);
     partition->blob_url_loader_factory_ = new BlobURLLoaderFactory(
@@ -552,10 +553,6 @@
     partition->url_loader_factory_getter_->Initialize(partition.get());
   }
 
-  partition->service_worker_context_->Init(
-      path, quota_manager_proxy.get(), context->GetSpecialStoragePolicy(),
-      blob_context.get(), partition->url_loader_factory_getter_.get());
-
   return partition;
 }
 
diff --git a/content/child/service_worker/service_worker_network_provider.cc b/content/child/service_worker/service_worker_network_provider.cc
index e31fb56..19c50777ed 100644
--- a/content/child/service_worker/service_worker_network_provider.cc
+++ b/content/child/service_worker/service_worker_network_provider.cc
@@ -216,10 +216,6 @@
       std::move(info->client_request),
       ChildThreadImpl::current()->thread_safe_sender());
 
-  if (info->script_loader_factory_ptr_info.is_valid())
-    script_loader_factory_.Bind(
-        std::move(info->script_loader_factory_ptr_info));
-
   ServiceWorkerDispatcher* dispatcher =
       ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance(
           ChildThreadImpl::current()->thread_safe_sender(),
diff --git a/content/child/service_worker/service_worker_network_provider.h b/content/child/service_worker/service_worker_network_provider.h
index bd3fcba..1ca07d96 100644
--- a/content/child/service_worker/service_worker_network_provider.h
+++ b/content/child/service_worker/service_worker_network_provider.h
@@ -72,10 +72,6 @@
   int provider_id() const { return provider_id_; }
   ServiceWorkerProviderContext* context() const { return context_.get(); }
 
-  mojom::URLLoaderFactory* script_loader_factory() {
-    return script_loader_factory_.get();
-  }
-
   bool IsControlledByServiceWorker() const;
 
  private:
@@ -83,8 +79,6 @@
   scoped_refptr<ServiceWorkerProviderContext> context_;
   mojom::ServiceWorkerDispatcherHostAssociatedPtr dispatcher_host_;
   mojom::ServiceWorkerProviderHostAssociatedPtr provider_host_;
-  mojom::URLLoaderFactoryAssociatedPtr script_loader_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerNetworkProvider);
 };
 
diff --git a/content/common/service_worker/service_worker_provider.mojom b/content/common/service_worker/service_worker_provider.mojom
index f095729..b01b1cf2 100644
--- a/content/common/service_worker/service_worker_provider.mojom
+++ b/content/common/service_worker/service_worker_provider.mojom
@@ -6,7 +6,6 @@
 
 import "content/common/service_worker/service_worker_provider_interfaces.mojom";
 import "content/common/service_worker/service_worker_types.mojom";
-import "content/common/url_loader_factory.mojom";
 
 // A container object carried from the browser to the renderer process.
 // This contains the params for the constructor of ServiceWorkerNetworkProvider
@@ -20,7 +19,6 @@
 
   associated ServiceWorkerProviderHost host_ptr_info;
   associated ServiceWorkerProvider& client_request;
-  associated URLLoaderFactory? script_loader_factory_ptr_info;
 };
 
 // A container object carried from the renderer to the browser process.
@@ -34,4 +32,4 @@
   bool is_parent_frame_secure;
   associated ServiceWorkerProviderHost& host_request;
   associated ServiceWorkerProvider client_ptr_info;
-};
+};
\ No newline at end of file
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index 623827f..c2372e0 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -11,6 +11,7 @@
 #include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
@@ -310,7 +311,7 @@
 // is not modified.
 std::unique_ptr<const char* []> StringVectorToArgArray(
     const std::vector<std::string>& vector) {
-  std::unique_ptr<const char* []> array(new const char*[vector.size()]);
+  auto array = base::MakeUnique<const char* []>(vector.size());
   for (size_t i = 0; i < vector.size(); ++i)
     array[i] = vector[i].c_str();
   return array;
@@ -444,7 +445,7 @@
   if (finished_loading_)
     return;
 
-  error_.reset(new WebURLError(error));
+  error_ = base::MakeUnique<WebURLError>(error);
 }
 
 PepperPluginInstanceImpl::GamepadImpl::GamepadImpl()
@@ -524,7 +525,7 @@
       isolate_(v8::Isolate::GetCurrent()),
       is_deleted_(false),
       initialized_(false),
-      audio_controller_(new PepperAudioController(this)),
+      audio_controller_(base::MakeUnique<PepperAudioController>(this)),
       view_change_weak_ptr_factory_(this),
       weak_factory_(this) {
   pp_instance_ = HostGlobals::Get()->AddInstance(this);
@@ -848,6 +849,7 @@
   }
 
   message_channel_ = MessageChannel::Create(this, &message_channel_object_);
+  DCHECK(message_channel_);
 
   full_frame_ = full_frame;
 
@@ -878,17 +880,11 @@
   //
   // A host for external plugins will call ResetAsProxied later, at which point
   // we can Start() the MessageChannel.
-  if (success && (!module_->renderer_ppapi_host()->IsExternalPluginHost())) {
-    if (message_channel_)
-      message_channel_->Start();
-  }
+  if (success && !module_->renderer_ppapi_host()->IsExternalPluginHost())
+    message_channel_->Start();
 
-  if (success &&
-      render_frame_ &&
-      render_frame_->render_accessibility() &&
-      LoadPdfInterface()) {
-    plugin_pdf_interface_->EnableAccessibility(pp_instance());
-  }
+  if (success)
+    AccessibilityModeChanged();
 
   initialized_ = success;
   return success;
@@ -901,7 +897,7 @@
     // The external proxy isn't available, so save the response and record
     // document load notifications for later replay.
     external_document_response_ = response;
-    external_document_loader_.reset(new ExternalDocumentLoader());
+    external_document_loader_ = base::MakeUnique<ExternalDocumentLoader>();
     document_loader_ = external_document_loader_.get();
     return true;
   }
@@ -919,19 +915,16 @@
   // PPP_Instance.HandleDocumentLoad call below, since this may reentrantly
   // call into the instance and expect it to be valid.
   RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host();
-  PepperURLLoaderHost* loader_host =
-      new PepperURLLoaderHost(host_impl, true, pp_instance(), 0);
+  auto loader_host =
+      base::MakeUnique<PepperURLLoaderHost>(host_impl, true, pp_instance(), 0);
   // TODO(teravest): Remove set_document_loader() from instance and clean up
   // this relationship.
-  set_document_loader(loader_host);
+  set_document_loader(loader_host.get());
   loader_host->DidReceiveResponse(response);
 
   // This host will be pending until the resource object attaches to it.
-  //
-  // PpapiHost now owns the pointer to loader_host, so we don't have to worry
-  // about managing it.
   int pending_host_id = host_impl->GetPpapiHost()->AddPendingResourceHost(
-      std::unique_ptr<ppapi::host::ResourceHost>(loader_host));
+      std::unique_ptr<ppapi::host::ResourceHost>(std::move(loader_host)));
   DCHECK(pending_host_id);
 
   DataFromWebURLResponse(
@@ -1127,9 +1120,8 @@
       result |= HandleInputEvent(event.CoalescedEvent(i), cursor_info);
     }
     return result;
-  } else {
-    return HandleInputEvent(event.Event(), cursor_info);
   }
+  return HandleInputEvent(event.Event(), cursor_info);
 }
 
 bool PepperPluginInstanceImpl::HandleInputEvent(
@@ -1998,11 +1990,7 @@
   if (fullscreen == IsFullscreenOrPending())
     return false;
 
-  if (!render_frame_)
-    return false;
-  if (fullscreen && !render_frame_->render_view()
-                         ->renderer_preferences()
-                         .plugin_fullscreen_allowed)
+  if (!SetFullscreenCommon(fullscreen))
     return false;
 
   // Check whether we are trying to switch while the state is in transition.
@@ -2011,9 +1999,6 @@
   if (view_data_.is_fullscreen != desired_fullscreen_state_)
     return false;
 
-  if (fullscreen && !IsProcessingUserGesture())
-    return false;
-
   DVLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off");
   desired_fullscreen_state_ = fullscreen;
 
@@ -2154,8 +2139,7 @@
       texture_layer_->SetFlipped(false);
     }
 
-    std::unique_ptr<cc_blink::WebLayerImpl> layer(
-        new cc_blink::WebLayerImpl(texture_layer_));
+    auto layer = base::MakeUnique<cc_blink::WebLayerImpl>(texture_layer_);
     // Ignore transparency in fullscreen, since that's what Flash always
     // wants to do, and that lets it not recreate a context if
     // wmode=transparent was specified.
@@ -2165,7 +2149,7 @@
     web_layer_ = std::move(layer);
   } else if (want_compositor_layer) {
     compositor_layer_ = bound_compositor_->layer();
-    web_layer_.reset(new cc_blink::WebLayerImpl(compositor_layer_));
+    web_layer_ = base::MakeUnique<cc_blink::WebLayerImpl>(compositor_layer_);
   }
 
   if (web_layer_) {
@@ -2231,7 +2215,7 @@
   live_plugin_objects_.erase(plugin_object);
 }
 
-bool PepperPluginInstanceImpl::IsProcessingUserGesture() {
+bool PepperPluginInstanceImpl::IsProcessingUserGesture() const {
   PP_TimeTicks now = ppapi::TimeTicksToPPTimeTicks(base::TimeTicks::Now());
   // Give a lot of slack so tests won't be flaky.
   const PP_TimeTicks kUserGestureDurationInSeconds = 10.0;
@@ -2348,10 +2332,10 @@
       static_cast<const PPP_ContentDecryptor_Private*>(
           module_->GetPluginInterface(PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE));
   if (!plugin_decryption_interface)
-    return NULL;
+    return nullptr;
 
-  content_decryptor_delegate_.reset(
-      new ContentDecryptorDelegate(pp_instance_, plugin_decryption_interface));
+  content_decryptor_delegate_ = base::MakeUnique<ContentDecryptorDelegate>(
+      pp_instance_, plugin_decryption_interface);
   return content_decryptor_delegate_.get();
 }
 
@@ -2830,7 +2814,8 @@
     return PP_FALSE;
 
   if (type != PP_MOUSECURSOR_TYPE_CUSTOM) {
-    DoSetCursor(new WebCursorInfo(static_cast<WebCursorInfo::Type>(type)));
+    DoSetCursor(base::MakeUnique<WebCursorInfo>(
+        static_cast<WebCursorInfo::Type>(type)));
     return PP_TRUE;
   }
 
@@ -2844,8 +2829,8 @@
   if (!auto_mapper.is_valid())
     return PP_FALSE;
 
-  std::unique_ptr<WebCursorInfo> custom_cursor(
-      new WebCursorInfo(WebCursorInfo::kTypeCustom));
+  auto custom_cursor =
+      base::MakeUnique<WebCursorInfo>(WebCursorInfo::kTypeCustom);
   custom_cursor->hot_spot.x = hot_spot->x;
   custom_cursor->hot_spot.y = hot_spot->y;
 
@@ -2858,7 +2843,7 @@
     return PP_FALSE;
   }
 
-  DoSetCursor(custom_cursor.release());
+  DoSetCursor(std::move(custom_cursor));
   return PP_TRUE;
 }
 
@@ -3035,7 +3020,7 @@
 
   // For NaCl instances, remember the NaCl plugin instance interface, so we
   // can shut it down by calling its DidDestroy in our Delete() method.
-  original_instance_interface_.reset(instance_interface_.release());
+  original_instance_interface_ = std::move(instance_interface_);
 
   base::Callback<const void*(const char*)> get_plugin_interface_func =
       base::Bind(&PluginModule::GetPluginInterface, module_);
@@ -3085,7 +3070,7 @@
     external_document_response_ = blink::WebURLResponse();
     // Replay any document load events we've received to the real loader.
     external_document_loader_->ReplayReceivedData(document_loader_);
-    external_document_loader_.reset(NULL);
+    external_document_loader_.reset();
   }
 
   return PP_EXTERNAL_PLUGIN_OK;
@@ -3178,13 +3163,13 @@
   always_on_top_ = on_top;
 }
 
-void PepperPluginInstanceImpl::DoSetCursor(WebCursorInfo* cursor) {
-  cursor_.reset(cursor);
-  if (fullscreen_container_) {
-    fullscreen_container_->PepperDidChangeCursor(*cursor);
-  } else if (render_frame_) {
-    render_frame_->PepperDidChangeCursor(this, *cursor);
-  }
+void PepperPluginInstanceImpl::DoSetCursor(
+    std::unique_ptr<WebCursorInfo> cursor) {
+  cursor_ = std::move(cursor);
+  if (fullscreen_container_)
+    fullscreen_container_->PepperDidChangeCursor(*cursor_);
+  else if (render_frame_)
+    render_frame_->PepperDidChangeCursor(this, *cursor_);
 }
 
 bool PepperPluginInstanceImpl::IsFullPagePlugin() {
@@ -3209,14 +3194,7 @@
   if (fullscreen == FlashIsFullscreenOrPending())
     return true;
 
-  if (!render_frame_)
-    return false;
-  if (fullscreen && !render_frame_->render_view()
-                         ->renderer_preferences()
-                         .plugin_fullscreen_allowed)
-    return false;
-
-  if (fullscreen && !IsProcessingUserGesture())
+  if (!SetFullscreenCommon(fullscreen))
     return false;
 
   // Unbind current 2D or 3D graphics context.
@@ -3380,6 +3358,23 @@
   element.SetAttribute(WebString::FromUTF8(kStyle), style_before_fullscreen_);
 }
 
+bool PepperPluginInstanceImpl::SetFullscreenCommon(bool fullscreen) const {
+  if (!render_frame_)
+    return false;
+
+  if (fullscreen) {
+    if (!render_frame_->render_view()
+             ->renderer_preferences()
+             .plugin_fullscreen_allowed) {
+      return false;
+    }
+
+    if (!IsProcessingUserGesture())
+      return false;
+  }
+  return true;
+}
+
 bool PepperPluginInstanceImpl::IsMouseLocked() {
   return GetMouseLockDispatcher()->IsMouseLockedTo(
       GetOrCreateLockTargetAdapter());
@@ -3391,9 +3386,8 @@
 
 MouseLockDispatcher::LockTarget*
 PepperPluginInstanceImpl::GetOrCreateLockTargetAdapter() {
-  if (!lock_target_.get()) {
-    lock_target_.reset(new PluginInstanceLockTarget(this));
-  }
+  if (!lock_target_)
+    lock_target_ = base::MakeUnique<PluginInstanceLockTarget>(this);
   return lock_target_.get();
 }
 
@@ -3402,14 +3396,14 @@
     RenderWidgetFullscreenPepper* container =
         static_cast<RenderWidgetFullscreenPepper*>(fullscreen_container_);
     return container->mouse_lock_dispatcher();
-  } else if (render_frame_) {
-    return render_frame_->render_view()->mouse_lock_dispatcher();
   }
-  return NULL;
+  if (render_frame_)
+    return render_frame_->render_view()->mouse_lock_dispatcher();
+  return nullptr;
 }
 
 void PepperPluginInstanceImpl::UnSetAndDeleteLockTargetAdapter() {
-  if (lock_target_.get()) {
+  if (lock_target_) {
     GetMouseLockDispatcher()->OnLockTargetDestroyed(lock_target_.get());
     lock_target_.reset();
   }
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.h b/content/renderer/pepper/pepper_plugin_instance_impl.h
index 6a2b67a..660f3a37 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.h
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.h
@@ -351,7 +351,7 @@
                              ppapi::ScopedPPVar* result);
 
   // Returns true if the plugin is processing a user gesture.
-  bool IsProcessingUserGesture();
+  bool IsProcessingUserGesture() const;
 
   // Returns the user gesture token to use for creating a WebScopedUserGesture,
   // if IsProcessingUserGesture returned true.
@@ -595,6 +595,8 @@
     std::list<std::string> data_;
     bool finished_loading_;
     std::unique_ptr<blink::WebURLError> error_;
+
+    DISALLOW_COPY_AND_ASSIGN(ExternalDocumentLoader);
   };
 
   // Implements PPB_Gamepad_API. This is just to avoid having an excessive
@@ -672,7 +674,7 @@
                        int num_ranges,
                        printing::PdfMetafileSkia* metafile);
 
-  void DoSetCursor(blink::WebCursorInfo* cursor);
+  void DoSetCursor(std::unique_ptr<blink::WebCursorInfo> cursor);
 
   // Internal helper functions for HandleCompositionXXX().
   bool SendCompositionEventToPlugin(PP_InputEvent_Type type,
@@ -701,6 +703,9 @@
   void SetSizeAttributesForFullscreen();
   void ResetSizeAttributesAfterFullscreen();
 
+  // Shared code between SetFullscreen() and FlashSetFullscreen().
+  bool SetFullscreenCommon(bool fullscreen) const;
+
   bool IsMouseLocked();
   bool LockMouse();
   MouseLockDispatcher* GetMouseLockDispatcher();
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 20489a66..a1e97f3 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -75,8 +75,6 @@
 #include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h"
 #include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h"
 
-using blink::WebURLRequest;
-
 namespace content {
 
 namespace {
@@ -95,30 +93,19 @@
 
   // Blink calls this method for each request starting with the main script,
   // we tag them with the provider id.
-  void WillSendRequest(WebURLRequest& request) override {
+  void WillSendRequest(blink::WebURLRequest& request) override {
     std::unique_ptr<RequestExtraData> extra_data(new RequestExtraData);
     extra_data->set_service_worker_provider_id(provider_->provider_id());
     extra_data->set_originated_from_service_worker(true);
     // Service workers are only available in secure contexts, so all requests
     // are initiated in a secure context.
     extra_data->set_initiated_in_secure_context(true);
-    if (IsScriptRequest(request)) {
-      extra_data->set_url_loader_factory_override(
-          provider_->script_loader_factory());
-    }
     request.SetExtraData(extra_data.release());
   }
 
   int GetProviderID() const override { return provider_->provider_id(); }
 
  private:
-  static bool IsScriptRequest(const WebURLRequest& request) {
-    auto request_context = request.GetRequestContext();
-    return request_context == WebURLRequest::kRequestContextServiceWorker ||
-           request_context == WebURLRequest::kRequestContextScript ||
-           request_context == WebURLRequest::kRequestContextImport;
-  }
-
   std::unique_ptr<ServiceWorkerNetworkProvider> provider_;
 };
 
@@ -150,28 +137,31 @@
   return SERVICE_WORKER_ERROR_FAILED;
 }
 
-WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode(
+blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode(
     FetchRequestMode mode) {
-  return static_cast<WebURLRequest::FetchRequestMode>(mode);
+  return static_cast<blink::WebURLRequest::FetchRequestMode>(mode);
 }
 
-WebURLRequest::FetchCredentialsMode GetBlinkFetchCredentialsMode(
+blink::WebURLRequest::FetchCredentialsMode GetBlinkFetchCredentialsMode(
     FetchCredentialsMode credentials_mode) {
-  return static_cast<WebURLRequest::FetchCredentialsMode>(credentials_mode);
+  return static_cast<blink::WebURLRequest::FetchCredentialsMode>(
+      credentials_mode);
 }
 
-WebURLRequest::FetchRedirectMode GetBlinkFetchRedirectMode(
+blink::WebURLRequest::FetchRedirectMode GetBlinkFetchRedirectMode(
     FetchRedirectMode redirect_mode) {
-  return static_cast<WebURLRequest::FetchRedirectMode>(redirect_mode);
+  return static_cast<blink::WebURLRequest::FetchRedirectMode>(redirect_mode);
 }
 
-WebURLRequest::RequestContext GetBlinkRequestContext(
+blink::WebURLRequest::RequestContext GetBlinkRequestContext(
     RequestContextType request_context_type) {
-  return static_cast<WebURLRequest::RequestContext>(request_context_type);
+  return static_cast<blink::WebURLRequest::RequestContext>(
+      request_context_type);
 }
 
-WebURLRequest::FrameType GetBlinkFrameType(RequestContextFrameType frame_type) {
-  return static_cast<WebURLRequest::FrameType>(frame_type);
+blink::WebURLRequest::FrameType GetBlinkFrameType(
+    RequestContextFrameType frame_type) {
+  return static_cast<blink::WebURLRequest::FrameType>(frame_type);
 }
 
 blink::WebServiceWorkerClientInfo
diff --git a/content/test/gpu/gpu_tests/pixel_expectations.py b/content/test/gpu/gpu_tests/pixel_expectations.py
index 21f3d08a..39781d9 100644
--- a/content/test/gpu/gpu_tests/pixel_expectations.py
+++ b/content/test/gpu/gpu_tests/pixel_expectations.py
@@ -34,6 +34,7 @@
     # TODO(ccameron): These changed when forcing the display to sRGB, and will
     # need rebaseline.
     self.Fail('Pixel_Video_VP9', bug=734255)
+    self.Fail('Pixel_Video_MP4', bug=734255)
     self.Fail('Pixel_DirectComposition_Video_VP9', bug=734255)
 
     # TODO(vmiura) check / generate reference images for Android devices
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py
index 200876a..10dde26 100644
--- a/content/test/gpu/gpu_tests/pixel_test_pages.py
+++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -141,7 +141,7 @@
       'pixel_video_mp4.html',
       base_name + '_Video_MP4',
       test_rect=[0, 0, 300, 300],
-      revision=3),
+      revision=4),
 
     PixelTestPage(
       'pixel_video_vp9.html',
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc b/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
index 626c2433..95263dc 100644
--- a/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
+++ b/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
@@ -6,7 +6,6 @@
 
 #include <stddef.h>
 
-#include <algorithm>
 #include <utility>
 #include <vector>
 
@@ -14,6 +13,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
@@ -182,7 +182,7 @@
   if (!(request_data.stage & GetStages()))
     return false;
   const auto resource_type = GetWebRequestResourceType(request_data.request);
-  return std::find(types_.begin(), types_.end(), resource_type) != types_.end();
+  return base::ContainsValue(types_, resource_type);
 }
 
 WebRequestConditionAttribute::Type
@@ -266,11 +266,9 @@
       content_type, &mime_type, &charset, &had_charset, NULL);
 
   if (inclusive_) {
-    return std::find(content_types_.begin(), content_types_.end(),
-                     mime_type) != content_types_.end();
+    return base::ContainsValue(content_types_, mime_type);
   } else {
-    return std::find(content_types_.begin(), content_types_.end(),
-                     mime_type) == content_types_.end();
+    return !base::ContainsValue(content_types_, mime_type);
   }
 }
 
diff --git a/extensions/browser/api/document_scan/document_scan_api.cc b/extensions/browser/api/document_scan/document_scan_api.cc
index a89dbb7..317199f 100644
--- a/extensions/browser/api/document_scan/document_scan_api.cc
+++ b/extensions/browser/api/document_scan/document_scan_api.cc
@@ -4,8 +4,7 @@
 
 #include "extensions/browser/api/document_scan/document_scan_api.h"
 
-#include <algorithm>
-
+#include "base/stl_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extension_system.h"
 
@@ -67,8 +66,7 @@
   if (params_->options.mime_types) {
     std::vector<std::string>& mime_types = *params_->options.mime_types;
     for (; scanner_i != scanner_descriptions.end(); ++scanner_i) {
-      if (std::find(mime_types.begin(), mime_types.end(),
-                    scanner_i->image_mime_type) != mime_types.end()) {
+      if (base::ContainsValue(mime_types, scanner_i->image_mime_type)) {
         break;
       }
     }
diff --git a/extensions/browser/api/management/management_api.cc b/extensions/browser/api/management/management_api.cc
index c9bf619..57cbbd3 100644
--- a/extensions/browser/api/management/management_api.cc
+++ b/extensions/browser/api/management/management_api.cc
@@ -17,6 +17,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram.h"
 #include "base/single_thread_task_runner.h"
+#include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -706,8 +707,7 @@
       GetAvailableLaunchTypes(*extension, delegate);
 
   management::LaunchType app_launch_type = params->launch_type;
-  if (std::find(available_launch_types.begin(), available_launch_types.end(),
-                app_launch_type) == available_launch_types.end()) {
+  if (!base::ContainsValue(available_launch_types, app_launch_type)) {
     return RespondNow(Error(keys::kLaunchTypeNotAvailableError));
   }
 
diff --git a/extensions/browser/api/socket/udp_socket.cc b/extensions/browser/api/socket/udp_socket.cc
index 90aefe7..d4100af 100644
--- a/extensions/browser/api/socket/udp_socket.cc
+++ b/extensions/browser/api/socket/udp_socket.cc
@@ -8,6 +8,7 @@
 
 #include "base/callback_helpers.h"
 #include "base/lazy_instance.h"
+#include "base/stl_util.h"
 #include "extensions/browser/api/api_resource.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
@@ -260,9 +261,7 @@
     return net::ERR_ADDRESS_INVALID;
 
   std::string normalized_address = ip.ToString();
-  std::vector<std::string>::iterator find_result = std::find(
-      multicast_groups_.begin(), multicast_groups_.end(), normalized_address);
-  if (find_result != multicast_groups_.end())
+  if (base::ContainsValue(multicast_groups_, normalized_address))
     return net::ERR_ADDRESS_INVALID;
 
   int rv = socket_.JoinGroup(ip);
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 400b02f..d898c33 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -19,6 +19,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
+#include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -1488,8 +1489,7 @@
     }
 
     const std::vector<WebRequestResourceType>& types = listener->filter.types;
-    if (!types.empty() &&
-        std::find(types.begin(), types.end(), resource_type) == types.end()) {
+    if (!types.empty() && !base::ContainsValue(types, resource_type)) {
       continue;
     }
 
diff --git a/extensions/browser/app_window/app_window_registry.cc b/extensions/browser/app_window/app_window_registry.cc
index bd259b0b..1eb972f 100644
--- a/extensions/browser/app_window/app_window_registry.cc
+++ b/extensions/browser/app_window/app_window_registry.cc
@@ -7,6 +7,7 @@
 #include <string>
 #include <vector>
 
+#include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "content/public/browser/browser_context.h"
@@ -188,9 +189,7 @@
 }
 
 void AppWindowRegistry::AddAppWindowToList(AppWindow* app_window) {
-  const AppWindowList::iterator it =
-      std::find(app_windows_.begin(), app_windows_.end(), app_window);
-  if (it != app_windows_.end())
+  if (base::ContainsValue(app_windows_, app_window))
     return;
   app_windows_.push_back(app_window);
 }
diff --git a/extensions/common/extension_l10n_util.cc b/extensions/common/extension_l10n_util.cc
index ac0ac641..1255725 100644
--- a/extensions/common/extension_l10n_util.cc
+++ b/extensions/common/extension_l10n_util.cc
@@ -6,7 +6,6 @@
 
 #include <stddef.h>
 
-#include <algorithm>
 #include <set>
 #include <string>
 #include <vector>
@@ -16,6 +15,7 @@
 #include "base/json/json_file_value_serializer.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -444,7 +444,7 @@
   if (subdir.empty())
     return true;  // Non-ASCII.
 
-  if (std::find(subdir.begin(), subdir.end(), '.') != subdir.end())
+  if (base::ContainsValue(subdir, '.'))
     return true;
 
   if (all_locales.find(subdir) == all_locales.end())
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc
index 96e8269..835e278 100644
--- a/extensions/common/permissions/permissions_data.cc
+++ b/extensions/common/permissions/permissions_data.cc
@@ -4,12 +4,12 @@
 
 #include "extensions/common/permissions/permissions_data.h"
 
-#include <algorithm>
 #include <utility>
 
 #include "base/command_line.h"
 #include "base/lazy_instance.h"
 #include "base/macros.h"
+#include "base/stl_util.h"
 #include "content/public/common/url_constants.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/error_utils.h"
@@ -84,8 +84,7 @@
   const ExtensionsClient::ScriptingWhitelist& whitelist =
       ExtensionsClient::Get()->GetScriptingWhitelist();
 
-  return std::find(whitelist.begin(), whitelist.end(), extension->id()) !=
-         whitelist.end();
+  return base::ContainsValue(whitelist, extension->id());
 }
 
 // static
diff --git a/extensions/common/url_pattern_set_unittest.cc b/extensions/common/url_pattern_set_unittest.cc
index bbb72aa7..86e4a4d 100644
--- a/extensions/common/url_pattern_set_unittest.cc
+++ b/extensions/common/url_pattern_set_unittest.cc
@@ -8,6 +8,7 @@
 
 #include <sstream>
 
+#include "base/stl_util.h"
 #include "base/values.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
@@ -467,13 +468,8 @@
 
   EXPECT_EQ(2UL, string_vector->size());
 
-  const auto begin = string_vector->begin();
-  const auto end = string_vector->end();
-
-  auto it = std::find(begin, end, "https://google.com/");
-  EXPECT_NE(it, end);
-  it = std::find(begin, end, "https://yahoo.com/");
-  EXPECT_NE(it, end);
+  EXPECT_TRUE(base::ContainsValue(*string_vector, "https://google.com/"));
+  EXPECT_TRUE(base::ContainsValue(*string_vector, "https://yahoo.com/"));
 }
 
 }  // namespace extensions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index cd880c9..a9f9b685 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -7525,11 +7525,10 @@
 void GLES2DecoderImpl::DoFramebufferRenderbuffer(
     GLenum target, GLenum attachment, GLenum renderbuffertarget,
     GLuint client_renderbuffer_id) {
+  const char* func_name = "glFramebufferRenderbuffer";
   Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
   if (!framebuffer) {
-    LOCAL_SET_GL_ERROR(
-        GL_INVALID_OPERATION,
-        "glFramebufferRenderbuffer", "no framebuffer bound");
+    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, "no framebuffer bound");
     return;
   }
   GLuint service_id = 0;
@@ -7537,9 +7536,13 @@
   if (client_renderbuffer_id) {
     renderbuffer = GetRenderbuffer(client_renderbuffer_id);
     if (!renderbuffer) {
-      LOCAL_SET_GL_ERROR(
-          GL_INVALID_OPERATION,
-          "glFramebufferRenderbuffer", "unknown renderbuffer");
+      LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
+                         "unknown renderbuffer");
+      return;
+    }
+    if (!renderbuffer->IsValid()) {
+      LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
+                         "renderbuffer never bound or deleted");
       return;
     }
     service_id = renderbuffer->service_id();
@@ -7551,11 +7554,11 @@
   } else {
     attachments.push_back(attachment);
   }
-  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glFramebufferRenderbuffer");
+  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(func_name);
   for (GLenum attachment_point : attachments) {
     glFramebufferRenderbufferEXT(
         target, attachment_point, renderbuffertarget, service_id);
-    GLenum error = LOCAL_PEEK_GL_ERROR("glFramebufferRenderbuffer");
+    GLenum error = LOCAL_PEEK_GL_ERROR(func_name);
     if (error == GL_NO_ERROR) {
       framebuffer->AttachRenderbuffer(attachment_point, renderbuffer);
     }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc
index 7a0d658..0cbd66e 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc
@@ -133,6 +133,8 @@
     bool valid) {
   DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
                     kServiceFramebufferId);
+  DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
+                     kServiceRenderbufferId);
   if (valid) {
     EXPECT_CALL(*gl_, GetError())
         .WillOnce(Return(GL_NO_ERROR))
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
index 03a1d02..b07b2c0 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc
@@ -355,6 +355,8 @@
 TEST_P(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithRenderbuffer) {
   DoBindFramebuffer(
       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
+  DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
+                     kServiceRenderbufferId);
   EXPECT_CALL(*gl_, GetError())
       .WillRepeatedly(Return(GL_NO_ERROR));
   EXPECT_CALL(*gl_,
@@ -1489,6 +1491,8 @@
 TEST_P(GLES2DecoderTest, FramebufferRenderbufferClearColor) {
   DoBindFramebuffer(
       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
+  DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
+                     kServiceRenderbufferId);
   ClearColor color_cmd;
   ColorMask color_mask_cmd;
   Enable enable_cmd;
@@ -1527,6 +1531,8 @@
 TEST_P(GLES2DecoderTest, FramebufferRenderbufferClearDepth) {
   DoBindFramebuffer(
       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
+  DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
+                     kServiceRenderbufferId);
   ClearDepthf depth_cmd;
   DepthMask depth_mask_cmd;
   FramebufferRenderbuffer cmd;
@@ -1559,6 +1565,8 @@
 TEST_P(GLES2DecoderTest, FramebufferRenderbufferClearStencil) {
   DoBindFramebuffer(
       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
+  DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
+                     kServiceRenderbufferId);
   ClearStencil stencil_cmd;
   StencilMaskSeparate stencil_mask_separate_cmd;
   FramebufferRenderbuffer cmd;
@@ -1591,6 +1599,8 @@
 TEST_P(GLES3DecoderTest, FramebufferRenderbufferClearDepthStencil) {
   DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
                     kServiceFramebufferId);
+  DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
+                     kServiceRenderbufferId);
   ClearDepthf depth_cmd;
   ClearStencil stencil_cmd;
   FramebufferRenderbuffer cmd;
@@ -2008,6 +2018,14 @@
 TEST_P(GLES2DecoderTest, FramebufferRenderbufferGLError) {
   DoBindFramebuffer(
       GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId);
+  FramebufferRenderbuffer cmd;
+  cmd.Init(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
+           client_renderbuffer_id_);
+  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+  EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+
+  DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_,
+                     kServiceRenderbufferId);
   EXPECT_CALL(*gl_, GetError())
       .WillOnce(Return(GL_NO_ERROR))
       .WillOnce(Return(GL_OUT_OF_MEMORY))
@@ -2019,11 +2037,6 @@
                                          kServiceRenderbufferId))
       .Times(1)
       .RetiresOnSaturation();
-  FramebufferRenderbuffer cmd;
-  cmd.Init(GL_FRAMEBUFFER,
-           GL_COLOR_ATTACHMENT0,
-           GL_RENDERBUFFER,
-           client_renderbuffer_id_);
   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
   EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError());
 }
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
index 8d87baa4..49ac9b68 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
@@ -374,6 +374,28 @@
   NOTREACHED();
 }
 
+- (void)updateFakeOmniboxForScrollView:(UIScrollView*)scrollView {
+  [self.delegate updateNtpBarShadowForPanelController:self];
+
+  // Unfocus the omnibox when the scroll view is scrolled below the pinned
+  // offset.
+  CGFloat pinnedOffsetY = [self pinnedOffsetY];
+  if (self.headerController.omniboxFocused && scrollView.dragging &&
+      scrollView.contentOffset.y < pinnedOffsetY) {
+    [self.dispatcher cancelOmniboxEdit];
+  }
+
+  if (IsIPadIdiom()) {
+    return;
+  }
+
+  if (self.animateHeader) {
+    [self.headerController
+        updateSearchFieldForOffset:self.suggestionsViewController.collectionView
+                                       .contentOffset.y];
+  }
+}
+
 #pragma mark - NewTabPagePanelProtocol
 
 - (CGFloat)alphaForBottomShadow {
@@ -468,4 +490,18 @@
   [MDCSnackbarManager showMessage:message];
 }
 
+// Returns the Y value to use for the scroll view's contentOffset when scrolling
+// the omnibox to the top of the screen.
+- (CGFloat)pinnedOffsetY {
+  CGFloat headerHeight = content_suggestions::heightForLogoHeader(
+      self.headerController.logoIsShowing,
+      [self.contentSuggestionsMediator notificationPromo]->CanShow());
+  CGFloat offsetY =
+      headerHeight - ntp_header::kScrolledToTopOmniboxBottomMargin;
+  if (!IsIPadIdiom())
+    offsetY -= ntp_header::kToolbarHeight;
+
+  return offsetY;
+}
+
 @end
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
index 52764808..44f79970 100644
--- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -10,6 +10,8 @@
     "content_suggestions_data_sink.h",
     "content_suggestions_data_source.h",
     "content_suggestions_image_fetcher.h",
+    "content_suggestions_layout.h",
+    "content_suggestions_layout.mm",
     "content_suggestions_view_controller.h",
     "content_suggestions_view_controller.mm",
   ]
@@ -23,6 +25,7 @@
     "//ios/chrome/browser/ui/content_suggestions/cells:cells_ui",
     "//ios/chrome/browser/ui/content_suggestions/identifier",
     "//ios/chrome/browser/ui/favicon:favicon_ui",
+    "//ios/chrome/browser/ui/ntp:ntp_header",
     "//ui/base",
   ]
   public_deps = [
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h
index 73a45824..b4ad979 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h
@@ -30,6 +30,8 @@
 - (void)dismissContextMenu;
 // Handles the actions following a tap on the promo.
 - (void)handlePromoTapped;
+// Updates the fake omnibox to adapt to the current scrolling.
+- (void)updateFakeOmniboxForScrollView:(nonnull UIScrollView*)scrollView;
 
 @end
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h
new file mode 100644
index 0000000..860a65736
--- /dev/null
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h
@@ -0,0 +1,14 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_LAYOUT_H_
+#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_LAYOUT_H_
+
+#import "ios/third_party/material_components_ios/src/components/Collections/src/MDCCollectionViewFlowLayout.h"
+
+@interface ContentSuggestionsLayout : MDCCollectionViewFlowLayout
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_LAYOUT_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm
new file mode 100644
index 0000000..16c1aad
--- /dev/null
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.mm
@@ -0,0 +1,99 @@
+// 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.
+
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h"
+
+#import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h"
+#include "ios/chrome/browser/ui/ui_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation ContentSuggestionsLayout
+
+- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
+  NSMutableArray* layoutAttributes =
+      [[super layoutAttributesForElementsInRect:rect] mutableCopy];
+  UICollectionViewLayoutAttributes* fixedHeaderAttributes = nil;
+  NSIndexPath* fixedHeaderIndexPath =
+      [NSIndexPath indexPathForItem:0 inSection:0];
+
+  for (UICollectionViewLayoutAttributes* attributes in layoutAttributes) {
+    if ([attributes.representedElementKind
+            isEqualToString:UICollectionElementKindSectionHeader] &&
+        attributes.indexPath.section == fixedHeaderIndexPath.section) {
+      fixedHeaderAttributes = [self
+          layoutAttributesForSupplementaryViewOfKind:
+              UICollectionElementKindSectionHeader
+                                         atIndexPath:fixedHeaderIndexPath];
+      attributes.zIndex = fixedHeaderAttributes.zIndex;
+      attributes.frame = fixedHeaderAttributes.frame;
+    }
+  }
+
+  // The fixed header's attributes are not updated if the header's default frame
+  // is far enough away from |rect|, which can occur when the NTP is scrolled
+  // up.
+  if (!fixedHeaderAttributes && !IsIPadIdiom()) {
+    UICollectionViewLayoutAttributes* fixedHeaderAttributes =
+        [self layoutAttributesForSupplementaryViewOfKind:
+                  UICollectionElementKindSectionHeader
+                                             atIndexPath:fixedHeaderIndexPath];
+    [layoutAttributes addObject:fixedHeaderAttributes];
+  }
+
+  return layoutAttributes;
+}
+
+- (UICollectionViewLayoutAttributes*)
+layoutAttributesForSupplementaryViewOfKind:(NSString*)kind
+                               atIndexPath:(NSIndexPath*)indexPath {
+  UICollectionViewLayoutAttributes* attributes =
+      [super layoutAttributesForSupplementaryViewOfKind:kind
+                                            atIndexPath:indexPath];
+  if ([kind isEqualToString:UICollectionElementKindSectionHeader] &&
+      indexPath.section == 0) {
+    UICollectionView* collectionView = self.collectionView;
+    CGPoint contentOffset = collectionView.contentOffset;
+    CGFloat headerHeight = CGRectGetHeight(attributes.frame);
+    CGPoint origin = attributes.frame.origin;
+
+    // Keep the header in front of all other views.
+    attributes.zIndex = 1000;
+
+    // Prevent the fake omnibox from scrolling up off of the screen.
+    CGFloat minY = headerHeight - ntp_header::kMinHeaderHeight;
+    if (contentOffset.y > minY)
+      origin.y = contentOffset.y - minY;
+    attributes.frame = {origin, attributes.frame.size};
+  }
+  return attributes;
+}
+
+- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBound {
+  return YES;
+}
+
+- (CGSize)collectionViewContentSize {
+  CGFloat collectionViewHeight = self.collectionView.bounds.size.height;
+  CGFloat headerHeight = [self headerReferenceSize].height;
+
+  // The minimum height for the collection view content should be the height of
+  // the header plus the height of the collection view minus the height of the
+  // NTP bottom bar. This allows the Most Visited cells to be scrolled up to the
+  // top of the screen.
+  CGFloat minimumHeight = collectionViewHeight + headerHeight -
+                          ntp_header::kScrolledToTopOmniboxBottomMargin;
+  if (!IsIPadIdiom())
+    minimumHeight -= ntp_header::kToolbarHeight;
+
+  CGSize contentSize = [super collectionViewContentSize];
+  if (contentSize.height < minimumHeight) {
+    contentSize.height = minimumHeight;
+  }
+  return contentSize;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
index 86a4ca92..9d205307 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -12,6 +12,7 @@
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_commands.h"
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_layout.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -50,7 +51,7 @@
 
 - (instancetype)initWithStyle:(CollectionViewControllerStyle)style
                    dataSource:(id<ContentSuggestionsDataSource>)dataSource {
-  UICollectionViewLayout* layout = [[MDCCollectionViewFlowLayout alloc] init];
+  UICollectionViewLayout* layout = [[ContentSuggestionsLayout alloc] init];
   self = [super initWithLayout:layout style:style];
   if (self) {
     _collectionUpdater = [[ContentSuggestionsCollectionUpdater alloc]
@@ -169,6 +170,7 @@
         UIEdgeInsetsMake(0, self.cardStyleMargin, 0, self.cardStyleMargin);
   }
   [self.collectionUpdater updateMostVisitedForSize:size];
+  [self.collectionView.collectionViewLayout invalidateLayout];
 }
 
 - (void)willTransitionToTraitCollection:(UITraitCollection*)newCollection
@@ -278,6 +280,14 @@
   return nil;
 }
 
+- (MDCCollectionViewCellStyle)collectionView:(UICollectionView*)collectionView
+                         cellStyleForSection:(NSInteger)section {
+  if ([self.collectionUpdater isHeaderSection:section]) {
+    return MDCCollectionViewCellStyleDefault;
+  }
+  return [super collectionView:collectionView cellStyleForSection:section];
+}
+
 - (UIColor*)collectionView:(nonnull UICollectionView*)collectionView
     cellBackgroundColorAtIndexPath:(nonnull NSIndexPath*)indexPath {
   if ([self.collectionUpdater
@@ -351,6 +361,13 @@
   [self dismissEntryAtIndexPath:indexPath];
 }
 
+#pragma mark - UIScrollViewDelegate Methods.
+
+- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
+  [super scrollViewDidScroll:scrollView];
+  [self.suggestionCommandHandler updateFakeOmniboxForScrollView:scrollView];
+}
+
 #pragma mark - Private
 
 - (void)handleLongPress:(UILongPressGestureRecognizer*)gestureRecognizer {
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index d367787..2b283d7f 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -526,7 +526,6 @@
 crbug.com/591099 bindings/location-lifetime.html [ Crash ]
 crbug.com/591099 bluetooth/requestDevice/request-from-iframe.html [ Crash ]
 crbug.com/591099 bluetooth/server/getPrimaryService/two-iframes-from-same-origin.html [ Crash ]
-crbug.com/591099 compositing/3d-corners.html [ Crash Failure Pass ]
 crbug.com/591099 compositing/absolute-inside-out-of-view-fixed.html [ Failure Pass ]
 crbug.com/591099 compositing/animation/busy-indicator.html [ Failure ]
 crbug.com/591099 compositing/animation/hidden-composited.html [ Failure ]
@@ -561,7 +560,6 @@
 crbug.com/591099 compositing/filters/sw-shadow-overlaps-hw-layer.html [ Failure Pass ]
 crbug.com/591099 compositing/filters/sw-shadow-overlaps-hw-shadow.html [ Failure Pass ]
 crbug.com/591099 compositing/fixed-position-changed-to-absolute.html [ Failure ]
-crbug.com/591099 compositing/fixed-position-scroll-offset-history-restore.html [ Failure Pass ]
 crbug.com/591099 compositing/framesets/composited-frame-alignment.html [ Failure ]
 crbug.com/591099 compositing/generated-content.html [ Failure Pass ]
 crbug.com/591099 compositing/geometry/abs-position-inside-opacity.html [ Failure ]
@@ -623,7 +621,6 @@
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-overflowing-text-crash.html [ Failure ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-pixel-rotated-link.html [ Failure ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-shadow-tree.html [ Failure ]
-crbug.com/591099 compositing/gestures/gesture-tapHighlight-skew-matrix.html [ Failure Pass ]
 crbug.com/591099 compositing/gestures/gesture-tapHighlight-with-box-shadow.html [ Failure ]
 crbug.com/591099 compositing/iframes/become-composited-nested-iframes.html [ Failure ]
 crbug.com/591099 compositing/iframes/become-overlapped-iframe.html [ Failure ]
@@ -668,7 +665,6 @@
 crbug.com/591099 compositing/layer-creation/fixed-position-no-content.html [ Failure Pass ]
 crbug.com/591099 compositing/layer-creation/fixed-position-nonscrollable-body-mismatch-containers.html [ Failure ]
 crbug.com/591099 compositing/layer-creation/fixed-position-nonscrollable-body-overlap.html [ Failure ]
-crbug.com/591099 compositing/layer-creation/fixed-position-nonscrollable-body.html [ Failure Pass ]
 crbug.com/591099 compositing/layer-creation/fixed-position-nonscrollable-iframes-in-scrollable-page.html [ Failure ]
 crbug.com/591099 compositing/layer-creation/fixed-position-out-of-view-positioning.html [ Failure ]
 crbug.com/591099 compositing/layer-creation/fixed-position-out-of-view-scaled-scroll.html [ Failure ]
@@ -676,7 +672,6 @@
 crbug.com/591099 compositing/layer-creation/fixed-position-out-of-view-with-backdrop-filter.html [ Failure Pass ]
 crbug.com/591099 compositing/layer-creation/fixed-position-out-of-view.html [ Failure Pass ]
 crbug.com/591099 compositing/layer-creation/fixed-position-under-transform.html [ Failure ]
-crbug.com/591099 compositing/layer-creation/main-thread-scrolling-for-non-composited-fixed-position-if-overflow-hidden.html [ Failure Pass ]
 crbug.com/591099 compositing/layer-creation/no-compositing-for-fixed-position-under-transform.html [ Failure Pass ]
 crbug.com/591099 compositing/layer-creation/no-compositing-for-preserve-3d.html [ Failure Pass ]
 crbug.com/591099 compositing/layer-creation/overflow-scroll-overlap.html [ Failure ]
@@ -746,14 +741,11 @@
 crbug.com/591099 compositing/overflow/overflow-clip-with-accelerated-scrolling-ancestor.html [ Failure ]
 crbug.com/591099 compositing/overflow/overflow-compositing-descendant.html [ Failure ]
 crbug.com/591099 compositing/overflow/overflow-positioning.html [ Failure Pass ]
-crbug.com/591099 compositing/overflow/overflow-scroll-background-fractional-offset.html [ Failure Pass ]
 crbug.com/591099 compositing/overflow/overflow-scroll-background-opaque-to-transparent.html [ Failure ]
 crbug.com/591099 compositing/overflow/overflow-scroll-background-transparent-to-opaque.html [ Failure ]
-crbug.com/591099 compositing/overflow/overflow-scroll-content-fractional-offset.html [ Failure Pass ]
 crbug.com/591099 compositing/overflow/overflow-scroll-with-pointer-events-toggle.html [ Failure ]
 crbug.com/591099 compositing/overflow/overflow-scroll.html [ Failure ]
 crbug.com/591099 compositing/overflow/overflow-scrollbar-layers.html [ Failure ]
-crbug.com/591099 compositing/overflow/paint-neg-z-order-descendants-into-scrolling-contents-layer.html [ Failure Pass ]
 crbug.com/591099 compositing/overflow/parent-overflow.html [ Failure ]
 crbug.com/591099 compositing/overflow/remove-overflow-crash2.html [ Failure ]
 crbug.com/591099 compositing/overflow/reparented-scrollbars-non-sc-anc.html [ Failure ]
@@ -1029,7 +1021,6 @@
 crbug.com/591099 css-parser/color3_hsla_1.html [ Timeout ]
 crbug.com/591099 css-parser/color3_hsla_2.html [ Timeout ]
 crbug.com/591099 css-parser/color3_keywords.html [ Timeout ]
-crbug.com/591099 css1/basic/class_as_selector.html [ Crash Failure Pass ]
 crbug.com/591099 css1/basic/comments.html [ Failure ]
 crbug.com/591099 css1/basic/containment.html [ Crash Failure ]
 crbug.com/591099 css1/basic/contextual_selectors.html [ Crash Failure ]
@@ -1183,7 +1174,6 @@
 crbug.com/591099 css2.1/20110323/table-caption-optional-002.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/table-height-algorithm-023.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/table-height-algorithm-024.htm [ Failure ]
-crbug.com/591099 css2.1/20110323/text-indent-intrinsic-001.htm [ Failure Pass ]
 crbug.com/591099 css2.1/20110323/text-indent-intrinsic-002.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/text-indent-intrinsic-003.htm [ Failure ]
 crbug.com/591099 css2.1/20110323/text-indent-intrinsic-004.htm [ Failure ]
@@ -1804,16 +1794,12 @@
 crbug.com/591099 css3/filters/simple-filter-rendering.html [ Failure ]
 crbug.com/591099 css3/flexbox/alignContent-applies-with-flexWrap-wrap-with-single-line.html [ Failure ]
 crbug.com/591099 css3/flexbox/assert-generated-new-flexbox.html [ Failure ]
-crbug.com/591099 css3/flexbox/auto-height-column-with-border-and-padding.html [ Failure Pass ]
 crbug.com/591099 css3/flexbox/box-orient-button.html [ Crash ]
 crbug.com/591099 css3/flexbox/bug527039.html [ Failure ]
 crbug.com/591099 css3/flexbox/bug633212.html [ Crash ]
 crbug.com/591099 css3/flexbox/button.html [ Failure ]
 crbug.com/591099 css3/flexbox/child-overflow.html [ Failure Pass ]
-crbug.com/591099 css3/flexbox/columns-auto-size.html [ Failure Pass ]
-crbug.com/591099 css3/flexbox/content-height-with-scrollbars.html [ Failure Pass ]
 crbug.com/591099 css3/flexbox/crash-removing-out-of-flow-child.html [ Failure ]
-crbug.com/591099 css3/flexbox/cross-axis-scrollbar.html [ Failure Pass ]
 crbug.com/591099 css3/flexbox/css-properties.html [ Failure ]
 crbug.com/591099 css3/flexbox/definite-cross-sizes.html [ Failure ]
 crbug.com/591099 css3/flexbox/display-flexbox-set-get.html [ Crash ]
@@ -1838,7 +1824,6 @@
 crbug.com/591099 css3/flexbox/flex-property-parsing.html [ Failure ]
 crbug.com/591099 css3/flexbox/flexbox-baseline-margins.html [ Failure ]
 crbug.com/591099 css3/flexbox/flexbox-baseline.html [ Failure ]
-crbug.com/591099 css3/flexbox/flexbox-height-with-overflow-auto.html [ Failure Pass ]
 crbug.com/591099 css3/flexbox/flexbox-wordwrap.html [ Failure ]
 crbug.com/591099 css3/flexbox/floated-flexbox.html [ Failure ]
 crbug.com/591099 css3/flexbox/floated-flexitem.html [ Failure ]
@@ -3781,6 +3766,7 @@
 crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-mixed.html [ Failure ]
 crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl.html [ Failure ]
 crbug.com/591099 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping.html [ Failure ]
+crbug.com/591099 editing/selection/double_click_and_modify.html [ Failure ]
 crbug.com/591099 editing/selection/doubleclick-beside-cr-span.html [ Failure Timeout ]
 crbug.com/591099 editing/selection/doubleclick-inline-first-last-contenteditable.html [ Failure ]
 crbug.com/591099 editing/selection/doubleclick-whitespace-img-crash.html [ Crash ]
@@ -4203,14 +4189,6 @@
 crbug.com/591099 external/wpt/cors/remote-origin.htm [ Crash ]
 crbug.com/591099 external/wpt/css/CSS2/abspos/abspos-containing-block-initial-001.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/abspos/abspos-containing-block-initial-009a.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/clear-applies-to-001.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/clear-applies-to-002.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/clear-applies-to-003.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/clear-applies-to-004.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/clear-applies-to-005.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/clear-applies-to-006.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/clear-applies-to-007.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/clear-applies-to-015.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/float-replaced-height-001.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/float-replaced-width-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-001.xht [ Failure Pass ]
@@ -4218,11 +4196,8 @@
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-026.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-027.xht [ Crash Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-029.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-038.xht [ Failure Pass ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-039.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-101.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-132.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-138.xht [ Failure Pass ]
+crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-132.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-141.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-143.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/floats-144.xht [ Failure ]
@@ -4284,9 +4259,9 @@
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-block-non-replaced-height-002.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-block-valign-001.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-block-valign-002.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-012.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-013.xht [ Failure ]
-crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-015.xht [ Failure ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-012.xht [ Failure Pass ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-013.xht [ Failure Pass ]
+crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-replaced-width-015.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/inline-table-zorder-005.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/inlines-013.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/max-height-percentage-002.xht [ Failure ]
@@ -4667,6 +4642,9 @@
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-box/shape-outside-box-007.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-box/shape-outside-box-008.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/gradients/shape-outside-linear-gradient-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/gradients/shape-outside-linear-gradient-002.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/gradients/shape-outside-linear-gradient-003.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/gradients/shape-outside-linear-gradient-004.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/gradients/shape-outside-radial-gradient-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/gradients/shape-outside-radial-gradient-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/gradients/shape-outside-radial-gradient-003.html [ Failure ]
@@ -4685,6 +4663,9 @@
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-012.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-013.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-014.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-015.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-016.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-017.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-018.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-019.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/shape-image/shape-image-020.html [ Failure ]
@@ -4736,6 +4717,8 @@
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/supported-shapes/polygon/shape-outside-polygon-009.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/supported-shapes/polygon/shape-outside-polygon-010.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/supported-shapes/polygon/shape-outside-polygon-011.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/supported-shapes/polygon/shape-outside-polygon-012.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/supported-shapes/polygon/shape-outside-polygon-013.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/supported-shapes/polygon/shape-outside-polygon-014.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/supported-shapes/polygon/shape-outside-polygon-015.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/shape-outside/supported-shapes/polygon/shape-outside-polygon-016.html [ Failure ]
@@ -4761,11 +4744,11 @@
 crbug.com/591099 external/wpt/css/css-shapes-1/spec-examples/shape-outside-017.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/spec-examples/shape-outside-018.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-shapes-1/spec-examples/shape-outside-019.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/overflow-wrap-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/overflow-wrap-002.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/overflow-wrap-break-word-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/word-wrap-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/word-wrap-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/overflow-wrap-001.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/overflow-wrap-002.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/overflow-wrap-break-word-001.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/word-wrap-001.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-text-3/overflow-wrap/word-wrap-002.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/css-text-decor-3/text-emphasis-color-001.xht [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-text-decor-3/text-emphasis-position-above-left-002.xht [ Crash Failure ]
 crbug.com/591099 external/wpt/css/css-text-decor-3/text-emphasis-position-above-right-002.xht [ Crash Failure ]
@@ -5126,16 +5109,20 @@
 crbug.com/591099 external/wpt/css/css-writing-modes-3/percent-padding-vrl-006.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-003.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-007.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-008.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-009.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-013.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-015.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-019.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-020.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vlr-021.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-003.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-007.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-008.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-009.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-015.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-019.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-020.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-htb-in-vrl-021.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vlr-003.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes-3/sizing-orthog-prct-htb-in-vlr-007.xht [ Failure ]
@@ -5228,8 +5215,6 @@
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-mbp-horiz-002b.xhtml [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-003.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-004.html [ Failure ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-003.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-width-auto-004.html [ Failure Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-overflow-horiz-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-overflow-vert-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-paint-ordering-001.xhtml [ Failure ]
@@ -6587,9 +6572,6 @@
 crbug.com/591099 fast/backgrounds/size/scaled-sprited-background.html [ Failure Pass ]
 crbug.com/591099 fast/backgrounds/size/zero.html [ Failure ]
 crbug.com/591099 fast/backgrounds/svg-as-mask.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/transformed-body-background.html [ Failure Pass ]
-crbug.com/591099 fast/backgrounds/transformed-body-html-background.html [ Crash Failure Pass ]
-crbug.com/591099 fast/backgrounds/transformed-html-body-background.html [ Crash Failure Pass ]
 crbug.com/591099 fast/beacon/beacon-basic.html [ Failure ]
 crbug.com/591099 fast/block/abspos-child-container-changes-from-relative-to-static.html [ Failure ]
 crbug.com/591099 fast/block/align-inverted-direction.html [ Failure ]
@@ -6606,7 +6588,6 @@
 crbug.com/591099 fast/block/basic/quirk-height.html [ Failure ]
 crbug.com/591099 fast/block/basic/quirk-percent-height-grandchild.html [ Failure ]
 crbug.com/591099 fast/block/basic/text-indent-rtl.html [ Failure ]
-crbug.com/591099 fast/block/basic/truncation-rtl.html [ Failure Pass ]
 crbug.com/591099 fast/block/basic/white-space-pre-wraps.html [ Failure ]
 crbug.com/591099 fast/block/block-not-removed-from-parent-lineboxes-crash.html [ Crash ]
 crbug.com/591099 fast/block/block-parent-with-zero-width-child.html [ Failure ]
@@ -6622,12 +6603,11 @@
 crbug.com/591099 fast/block/float/008.html [ Failure ]
 crbug.com/591099 fast/block/float/010.html [ Failure ]
 crbug.com/591099 fast/block/float/012.html [ Failure ]
-crbug.com/591099 fast/block/float/013.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/014.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/015.html [ Failure ]
 crbug.com/591099 fast/block/float/017.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/018.html [ Failure ]
-crbug.com/591099 fast/block/float/019.html [ Failure ]
+crbug.com/591099 fast/block/float/019.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/020.html [ Failure ]
 crbug.com/591099 fast/block/float/021.html [ Failure ]
 crbug.com/591099 fast/block/float/022.html [ Failure ]
@@ -6652,24 +6632,20 @@
 crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top-5.html [ Failure ]
 crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top-6.html [ Failure ]
 crbug.com/591099 fast/block/float/avoid-floats-when-negative-margin-top.html [ Failure ]
-crbug.com/591099 fast/block/float/avoidance-percent-width-compat.html [ Failure Pass ]
-crbug.com/591099 fast/block/float/avoidance-percent-width-strict.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/avoidance-rtl.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/avoiding-float-centered.html [ Failure ]
 crbug.com/591099 fast/block/float/block-with-negative-margin-clears-float.html [ Failure ]
 crbug.com/591099 fast/block/float/br-with-clear-2.html [ Failure ]
 crbug.com/591099 fast/block/float/centered-float-avoidance-complexity.html [ Failure ]
 crbug.com/591099 fast/block/float/checkbox-and-radio-avoid-floats.html [ Failure ]
-crbug.com/591099 fast/block/float/clear-element-too-wide-for-containing-block.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/clear-intruding-floats-when-moving-to-inline-parent-3.html [ Crash Failure Pass ]
-crbug.com/591099 fast/block/float/clear-to-fit.html [ Crash Failure Pass ]
 crbug.com/591099 fast/block/float/containing-block-change-compositing.html [ Failure ]
 crbug.com/591099 fast/block/float/crash-on-absolute-positioning.html [ Failure ]
 crbug.com/591099 fast/block/float/crash-replaced-display-block.html [ Failure ]
 crbug.com/591099 fast/block/float/dynamic-unfloat-pref-width.html [ Failure ]
 crbug.com/591099 fast/block/float/editable-text-overlapping-float.html [ Failure ]
 crbug.com/591099 fast/block/float/element-clears-float-without-clearance.html [ Failure ]
-crbug.com/591099 fast/block/float/fit_line_below_floats.html [ Failure ]
+crbug.com/591099 fast/block/float/fit_line_below_floats.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/float-at-start-of-clean-lines-that-are-subsequently-dirtied-vertical-rl.html [ Failure ]
 crbug.com/591099 fast/block/float/float-at-start-of-clean-lines-that-are-subsequently-dirtied.html [ Failure ]
 crbug.com/591099 fast/block/float/float-avoidance.html [ Failure ]
@@ -6707,8 +6683,8 @@
 crbug.com/591099 fast/block/float/floats-wrap-inside-inline-007.html [ Failure ]
 crbug.com/591099 fast/block/float/formatting-context-changes.html [ Crash Failure ]
 crbug.com/591099 fast/block/float/independent-align-positioning.html [ Failure ]
-crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position.html [ Failure ]
-crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position2.html [ Crash Failure ]
+crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position.html [ Failure Pass ]
+crbug.com/591099 fast/block/float/intruding-float-add-in-sibling-block-on-static-position2.html [ Crash Failure Pass ]
 crbug.com/591099 fast/block/float/intruding-painted-twice.html [ Failure ]
 crbug.com/591099 fast/block/float/logical-bottom-exceeds-layoutunit-max.html [ Failure ]
 crbug.com/591099 fast/block/float/margin-top-changes.html [ Crash ]
@@ -6721,8 +6697,8 @@
 crbug.com/591099 fast/block/float/nested-floats-expand-formatting-context.html [ Failure ]
 crbug.com/591099 fast/block/float/nopaint-after-layer-destruction.html [ Failure ]
 crbug.com/591099 fast/block/float/nopaint-after-layer-destruction2.html [ Failure ]
-crbug.com/591099 fast/block/float/overhanging-float-add-in-static-position-block.html [ Crash Failure ]
-crbug.com/591099 fast/block/float/overhanging-float-add-in-static-position-block2.html [ Crash Failure ]
+crbug.com/591099 fast/block/float/overhanging-float-add-in-static-position-block.html [ Crash Failure Pass ]
+crbug.com/591099 fast/block/float/overhanging-float-add-in-static-position-block2.html [ Crash Failure Pass ]
 crbug.com/591099 fast/block/float/overhanging-float-container-add-compositing.html [ Failure ]
 crbug.com/591099 fast/block/float/overhanging-float-crashes-when-sibling-becomes-formatting-context.html [ Failure Pass ]
 crbug.com/591099 fast/block/float/overhanging-float-remove-from-fixed-position-block.html [ Failure ]
@@ -6761,7 +6737,6 @@
 crbug.com/591099 fast/block/margin-collapse/044.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/057.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/101.html [ Failure ]
-crbug.com/591099 fast/block/margin-collapse/102.html [ Failure Pass ]
 crbug.com/591099 fast/block/margin-collapse/103.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/bfc-beside-float-complex-margin-collapsing.html [ Failure ]
 crbug.com/591099 fast/block/margin-collapse/block-inside-inline/002.html [ Failure Pass ]
@@ -6858,7 +6833,6 @@
 crbug.com/591099 fast/block/positioning/offsetLeft-relative-iframe.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/offsetLeft-relative-td.html [ Crash Failure ]
 crbug.com/591099 fast/block/positioning/padding-percent.html [ Crash Failure ]
-crbug.com/591099 fast/block/positioning/percent-top-left-on-relative-position.html [ Failure Pass ]
 crbug.com/591099 fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block.html [ Failure ]
 crbug.com/591099 fast/block/positioning/positioned-container-changes-block-direction-border-with-positioned-descendant.html [ Failure ]
 crbug.com/591099 fast/block/positioning/positioned-layout-in-line.html [ Crash ]
@@ -7041,7 +7015,6 @@
 crbug.com/591099 fast/box-shadow/shadow-tiling-artifact.html [ Failure ]
 crbug.com/591099 fast/box-shadow/single-pixel-shadow.html [ Failure Pass ]
 crbug.com/591099 fast/box-shadow/spread-multiple-inset.html [ Failure ]
-crbug.com/591099 fast/box-shadow/spread-multiple-normal.html [ Failure Pass ]
 crbug.com/591099 fast/box-shadow/spread.html [ Failure ]
 crbug.com/591099 fast/box-shadow/transform-fringing.html [ Failure ]
 crbug.com/591099 fast/box-sizing/box-sizing.html [ Failure ]
@@ -7148,7 +7121,6 @@
 crbug.com/591099 fast/canvas/canvas-hit-regions-transform-test.html [ Crash ]
 crbug.com/591099 fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ]
 crbug.com/591099 fast/canvas/canvas-imageSmoothingQuality.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-incremental-repaint.html [ Failure Pass ]
 crbug.com/591099 fast/canvas/canvas-invalid-fillstyle.html [ Crash ]
 crbug.com/591099 fast/canvas/canvas-invalid-strokestyle.html [ Crash ]
 crbug.com/591099 fast/canvas/canvas-invalid-video.html [ Failure ]
@@ -7188,7 +7160,6 @@
 crbug.com/591099 fast/canvas/canvas-strokePath-shadow.html [ Crash ]
 crbug.com/591099 fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ]
 crbug.com/591099 fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ]
-crbug.com/591099 fast/canvas/canvas-text-alignment.html [ Failure Pass ]
 crbug.com/591099 fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ]
 crbug.com/591099 fast/canvas/canvas-text-space-characters.html [ Crash ]
 crbug.com/591099 fast/canvas/canvas-textMetrics-width.html [ Failure ]
@@ -7828,7 +7799,6 @@
 crbug.com/591099 fast/css/first-letter-recalculation.html [ Failure Pass ]
 crbug.com/591099 fast/css/first-letter-removed-added.html [ Failure ]
 crbug.com/591099 fast/css/first-letter-set-text.html [ Failure ]
-crbug.com/591099 fast/css/first-letter-to-non-block-container.html [ Crash Failure Pass ]
 crbug.com/591099 fast/css/first-letter-visibility.html [ Failure ]
 crbug.com/591099 fast/css/first-line-change-color-direct.html [ Crash Failure ]
 crbug.com/591099 fast/css/first-line-parent-style-different.html [ Failure ]
@@ -8150,7 +8120,6 @@
 crbug.com/591099 fast/css/negative-text-indent-in-inline-block.html [ Failure ]
 crbug.com/591099 fast/css/nested-at-rules.html [ Failure ]
 crbug.com/591099 fast/css/nested-floating-relative-position-percentages.html [ Failure ]
-crbug.com/591099 fast/css/nested-percent-height-on-replaced.html [ Failure Pass ]
 crbug.com/591099 fast/css/nested-rounded-corners.html [ Failure ]
 crbug.com/591099 fast/css/next-sibling-changed.html [ Failure ]
 crbug.com/591099 fast/css/non-empty-span.html [ Failure ]
@@ -8327,7 +8296,6 @@
 crbug.com/591099 fast/css/sticky/nested/sticky-nested-inline.html [ Failure ]
 crbug.com/591099 fast/css/sticky/overflow-layer-removed-crash.html [ Failure ]
 crbug.com/591099 fast/css/sticky/remove-inline-sticky-crash.html [ Failure ]
-crbug.com/591099 fast/css/sticky/sticky-position-works-with-scroll-apis.html [ Failure Pass ]
 crbug.com/591099 fast/css/sticky/sticky-top-overflow-scroll-by-fragment.html [ Failure ]
 crbug.com/591099 fast/css/string-quote-binary.html [ Failure ]
 crbug.com/591099 fast/css/style-and-stylesheet-important.html [ Failure ]
@@ -8442,7 +8410,7 @@
 crbug.com/591099 fast/css3-text/css3-text-justify/text-justify-distribute.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-word-break/css3-word-break-keep-all.html [ Failure Pass ]
 crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-rtl.html [ Failure ]
-crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-wrap-with-100percent-floats.html [ Failure ]
+crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-wrap-with-100percent-floats.html [ Failure Pass ]
 crbug.com/591099 fast/css3-text/css3-word-break/word-break-all-wrap-with-floats.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-word-break/word-break-break-all-in-span.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-word-break/word-break-break-word-fit-content.html [ Failure Pass ]
@@ -9975,7 +9943,6 @@
 crbug.com/591099 fast/events/middleClickAutoscroll-click-hyperlink.html [ Failure ]
 crbug.com/591099 fast/events/middleClickAutoscroll-drag-scrollable-iframe-div.html [ Failure ]
 crbug.com/591099 fast/events/middleClickAutoscroll-in-iframe.html [ Timeout ]
-crbug.com/591099 fast/events/middleClickAutoscroll-latching.html [ Pass Timeout ]
 crbug.com/591099 fast/events/middleClickAutoscroll-modal-scrollable-iframe-div.html [ Failure ]
 crbug.com/591099 fast/events/middleClickAutoscroll-nested-divs-forbidden.html [ Timeout ]
 crbug.com/591099 fast/events/mouse-click-events-pseudo-element.html [ Failure ]
@@ -10116,7 +10083,6 @@
 crbug.com/591099 fast/events/scroll-event-phase.html [ Failure ]
 crbug.com/591099 fast/events/scroll-event-raf-timing.html [ Failure ]
 crbug.com/591099 fast/events/scroll-to-anchor-in-overflow-hidden.html [ Failure ]
-crbug.com/591099 fast/events/scrollbar-double-click.html [ Failure Pass ]
 crbug.com/591099 fast/events/select-element.html [ Timeout ]
 crbug.com/591099 fast/events/select-onchange-crash.html [ Crash ]
 crbug.com/591099 fast/events/select-onchange-mouse-released-outside.html [ Crash ]
@@ -10487,9 +10453,6 @@
 crbug.com/591099 fast/forms/color/color-no-event-during-detach.html [ Crash ]
 crbug.com/591099 fast/forms/color/color-setrangetext.html [ Failure ]
 crbug.com/591099 fast/forms/color/color-suggestion-picker-appearance-zoom125.html [ Failure ]
-crbug.com/591099 fast/forms/color/color-suggestion-picker-appearance.html [ Failure Pass ]
-crbug.com/591099 fast/forms/color/color-suggestion-picker-one-row-appearance.html [ Failure Pass ]
-crbug.com/591099 fast/forms/color/color-suggestion-picker-two-row-appearance.html [ Failure Pass ]
 crbug.com/591099 fast/forms/color/color-type-change-on-close.html [ Crash Failure ]
 crbug.com/591099 fast/forms/color/color-value-sanitization.html [ Failure ]
 crbug.com/591099 fast/forms/color/input-appearance-color.html [ Failure ]
@@ -11098,7 +11061,7 @@
 crbug.com/591099 fast/forms/select/select-change-popup-to-listbox-roundtrip.html [ Crash ]
 crbug.com/591099 fast/forms/select/select-change-popup-to-listbox.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-change-type-on-focus.html [ Crash ]
-crbug.com/591099 fast/forms/select/select-change-type-on-mousedown-focus.html [ Failure ]
+crbug.com/591099 fast/forms/select/select-change-type-on-mousedown-focus.html [ Crash Failure ]
 crbug.com/591099 fast/forms/select/select-clientheight-large-size.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-clientheight-with-multiple-attr.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-dirty-parent-pref-widths.html [ Failure Pass ]
@@ -11196,7 +11159,6 @@
 crbug.com/591099 fast/forms/submit/submit-appearance-basic.html [ Failure ]
 crbug.com/591099 fast/forms/suggested-value-after-setvalue.html [ Crash ]
 crbug.com/591099 fast/forms/suggested-value.html [ Crash ]
-crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl.html [ Crash Failure Pass ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom125.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-appearance-zoom200.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-key-operations.html [ Crash Failure Timeout ]
@@ -11204,11 +11166,9 @@
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-reset-value-after-reload.html [ Crash ]
 crbug.com/591099 fast/forms/suggestion-picker/date-suggestion-picker-step-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew.html [ Crash Failure Timeout ]
-crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar.html [ Crash Failure Pass ]
 crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-min-max-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-reset-value-after-reload.html [ Crash ]
 crbug.com/591099 fast/forms/suggestion-picker/datetimelocal-suggestion-picker-step-attribute.html [ Crash Failure ]
-crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl.html [ Crash Failure Pass ]
 crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-key-operations.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-min-max-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/month-suggestion-picker-reset-value-after-reload.html [ Crash ]
@@ -11218,7 +11178,6 @@
 crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-appearance-with-scroll-bar.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-min-max-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/time-suggestion-picker-step-attribute.html [ Crash Failure ]
-crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl.html [ Crash Failure Pass Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-key-operations.html [ Crash Failure Timeout ]
 crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-min-max-attribute.html [ Crash Failure ]
 crbug.com/591099 fast/forms/suggestion-picker/week-suggestion-picker-reset-value-after-reload.html [ Crash ]
@@ -11255,7 +11214,6 @@
 crbug.com/591099 fast/forms/text/input-no-renderer.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-paste-undo.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-placeholder-paint-order.html [ Failure ]
-crbug.com/591099 fast/forms/text/input-placeholder-text-indent.html [ Crash Failure Pass ]
 crbug.com/591099 fast/forms/text/input-placeholder-visibility-1.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-placeholder-visibility-3.html [ Failure ]
 crbug.com/591099 fast/forms/text/input-readonly-autoscroll.html [ Crash Failure ]
@@ -11346,6 +11304,11 @@
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-1.html [ Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-visibility-2.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-placeholder-wrapping.html [ Crash Failure ]
+crbug.com/591099 fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size-zoomed.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/textarea-resize-below-min-size.html [ Crash ]
+crbug.com/591099 fast/forms/textarea/textarea-resize-orthogonal-containing-block.html [ Crash ]
 crbug.com/591099 fast/forms/textarea/textarea-rows-cols.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-scroll-height.html [ Crash Failure ]
 crbug.com/591099 fast/forms/textarea/textarea-scrollbar-height.html [ Crash Failure ]
@@ -11656,14 +11619,11 @@
 crbug.com/591099 fast/harness/should-be-now.html [ Failure ]
 crbug.com/591099 fast/harness/user-preferred-language.html [ Crash Failure ]
 crbug.com/591099 fast/hidpi/broken-image-icon-hidpi.html [ Crash Failure ]
-crbug.com/591099 fast/hidpi/gradient-with-scaled-ancestor.html [ Failure Pass ]
 crbug.com/591099 fast/hidpi/image-set-list-style-image.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-set-shape-outside.html [ Failure ]
 crbug.com/591099 fast/hidpi/image-srcset-intrinsic-size.html [ Failure Pass ]
 crbug.com/591099 fast/hidpi/image-srcset-png-1.html [ Failure Pass ]
 crbug.com/591099 fast/hidpi/image-srcset-svg.html [ Failure Pass ]
-crbug.com/591099 fast/hidpi/scrollbar-appearance-decrease-device-scale-factor.html [ Failure Pass ]
-crbug.com/591099 fast/hidpi/scrollbar-appearance-increase-device-scale-factor.html [ Failure Pass ]
 crbug.com/591099 fast/history/form-submit-in-frame-via-onclick.html [ Timeout ]
 crbug.com/591099 fast/history/form-submit-in-frame.html [ Timeout ]
 crbug.com/591099 fast/history/gesture-before-onload-form-submit.html [ Failure ]
@@ -11786,7 +11746,6 @@
 crbug.com/591099 fast/inline/justify-emphasis-inline-box.html [ Failure ]
 crbug.com/591099 fast/inline/leading-space-after-nested-empty-inlines.html [ Failure ]
 crbug.com/591099 fast/inline/left-right-center-inline-alignment-in-ltr-and-rtl-blocks.html [ Crash Failure ]
-crbug.com/591099 fast/inline/long-wrapped-line.html [ Failure Pass ]
 crbug.com/591099 fast/inline/nested-text-descendants.html [ Failure Pass ]
 crbug.com/591099 fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline.html [ Crash Failure ]
 crbug.com/591099 fast/inline/outline-continuations.html [ Failure ]
@@ -11844,7 +11803,6 @@
 crbug.com/591099 fast/invalid/table-residual-style-crash.html [ Failure ]
 crbug.com/591099 fast/invalid/td-inside-object.html [ Failure ]
 crbug.com/591099 fast/invalid/test-case-tr-th-td-should-not-close-dl-list.html [ Failure ]
-crbug.com/591099 fast/js/JSON-parse.html [ Pass Timeout ]
 crbug.com/591099 fast/js/Promise-bindings-check-exception.html [ Failure ]
 crbug.com/591099 fast/js/Promise-native-create.html [ Failure ]
 crbug.com/591099 fast/js/Promise-native-reject.html [ Failure ]
@@ -12420,7 +12378,6 @@
 crbug.com/591099 fast/multicol/event-offset-in-nested.html [ Failure ]
 crbug.com/591099 fast/multicol/event-offset.html [ Failure ]
 crbug.com/591099 fast/multicol/explicit-columns-auto.html [ Failure ]
-crbug.com/591099 fast/multicol/fieldset-as-multicol.html [ Crash Failure Pass ]
 crbug.com/591099 fast/multicol/first-line-in-block-below-next-column-top.html [ Failure ]
 crbug.com/591099 fast/multicol/first-line-in-block-with-padding-exact-fit.html [ Failure ]
 crbug.com/591099 fast/multicol/first-line-in-block-with-padding.html [ Failure ]
@@ -12518,7 +12475,6 @@
 crbug.com/591099 fast/multicol/newmulticol/clipping-overflow-hidden.html [ Crash Failure ]
 crbug.com/591099 fast/multicol/newmulticol/clipping.html [ Failure ]
 crbug.com/591099 fast/multicol/newmulticol/fixed-height-fill-auto.html [ Failure ]
-crbug.com/591099 fast/multicol/newmulticol/fixed-height-fill-balance-2.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/newmulticol/fixed-height-fill-balance.html [ Failure ]
 crbug.com/591099 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/newmulticol/hide-box-vertical-rl.html [ Failure Pass ]
@@ -12591,7 +12547,6 @@
 crbug.com/591099 fast/multicol/span/outer-column-break-after-inner-spanner.html [ Failure ]
 crbug.com/591099 fast/multicol/span/outline.html [ Failure ]
 crbug.com/591099 fast/multicol/span/outside-multicol.html [ Failure ]
-crbug.com/591099 fast/multicol/span/overflow-on-multicol.html [ Failure Pass ]
 crbug.com/591099 fast/multicol/span/padding-before-unbreakable-content-crash.html [ Crash Failure ]
 crbug.com/591099 fast/multicol/span/percent-margins.html [ Failure ]
 crbug.com/591099 fast/multicol/span/preferred-widths-with-column-content.html [ Failure ]
@@ -12696,7 +12651,6 @@
 crbug.com/591099 fast/overflow/add-visual-overflow-and-change-container-position.html [ Failure ]
 crbug.com/591099 fast/overflow/border-radius-clipping.html [ Crash Failure ]
 crbug.com/591099 fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto.html [ Failure ]
-crbug.com/591099 fast/overflow/childFocusRingClip.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/clip-rects-fixed-ancestor.html [ Failure ]
 crbug.com/591099 fast/overflow/float-in-relpositioned.html [ Failure ]
 crbug.com/591099 fast/overflow/generated-content-crash.html [ Failure ]
@@ -12704,8 +12658,6 @@
 crbug.com/591099 fast/overflow/hidden-html-auto-body.html [ Failure ]
 crbug.com/591099 fast/overflow/hidden-html-hidden-body.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/hidden-html-paged-body.html [ Crash Failure ]
-crbug.com/591099 fast/overflow/hidden-viewport-x.html [ Failure Pass ]
-crbug.com/591099 fast/overflow/hidden-viewport-y.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/hit-test-overflow-controls.html [ Failure ]
 crbug.com/591099 fast/overflow/hit-test-overflow-hidden-with-box-shadow.html [ Failure ]
 crbug.com/591099 fast/overflow/image-selection-highlight.html [ Failure ]
@@ -12717,14 +12669,14 @@
 crbug.com/591099 fast/overflow/overflow-auto-position-absolute.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-auto-table.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-clamp-after-visible-rect-resize.html [ Failure ]
-crbug.com/591099 fast/overflow/overflow-focus-ring.html [ Failure ]
+crbug.com/591099 fast/overflow/overflow-float-stacking.html [ Failure ]
+crbug.com/591099 fast/overflow/overflow-focus-ring.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/overflow-height-float-not-removed-crash.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/overflow-rtl-inline-scrollbar.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-rtl-vertical-origin.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-rtl-vertical.html [ Crash Failure ]
 crbug.com/591099 fast/overflow/overflow-rtl.html [ Crash Failure ]
 crbug.com/591099 fast/overflow/overflow-stacking.html [ Failure ]
-crbug.com/591099 fast/overflow/overflow-text-hit-testing.html [ Failure Pass ]
 crbug.com/591099 fast/overflow/overflow-update-transform.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-visible-should-ignore-scroll.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-with-local-background-attachment.html [ Crash Failure ]
@@ -12747,7 +12699,6 @@
 crbug.com/591099 fast/overflow/unreachable-overflow-rtl-bug.html [ Failure ]
 crbug.com/591099 fast/pagination/auto-height-with-break.html [ Crash Failure ]
 crbug.com/591099 fast/pagination/auto-height.html [ Crash Failure ]
-crbug.com/591099 fast/pagination/body-make-unpaginated.html [ Failure Pass ]
 crbug.com/591099 fast/pagination/break-in-paged-overflow.html [ Crash Failure ]
 crbug.com/591099 fast/pagination/caret-range-outside-paged-x-rtl-vertical-rl.html [ Crash Failure ]
 crbug.com/591099 fast/pagination/caret-range-outside-paged-x-rtl.html [ Crash Failure ]
@@ -12771,8 +12722,6 @@
 crbug.com/591099 fast/pagination/first-letter-inherit-all-crash.html [ Crash Failure ]
 crbug.com/591099 fast/pagination/modal-dialog-crash.html [ Crash Failure ]
 crbug.com/591099 fast/pagination/multicol.html [ Crash Failure ]
-crbug.com/591099 fast/pagination/paged-x-to-paged-y.html [ Failure Pass ]
-crbug.com/591099 fast/pagination/paged-y-to-paged-x.html [ Failure Pass ]
 crbug.com/591099 fast/pagination/short-pages-tall-content.html [ Crash Failure ]
 crbug.com/591099 fast/pagination/very-tall-auto-height-crash.html [ Crash Failure ]
 crbug.com/591099 fast/parser/001.html [ Failure ]
@@ -12917,9 +12866,8 @@
 crbug.com/591099 fast/reflections/transparent-reflected-sublayers.html [ Failure ]
 crbug.com/591099 fast/regex/non-pattern-characters.html [ Failure ]
 crbug.com/591099 fast/regex/syntax-errors.html [ Failure ]
-crbug.com/591099 fast/replaced/002.html [ Failure ]
-crbug.com/591099 fast/replaced/003.html [ Failure ]
-crbug.com/591099 fast/replaced/005.html [ Failure Pass ]
+crbug.com/591099 fast/replaced/002.html [ Failure Pass ]
+crbug.com/591099 fast/replaced/003.html [ Failure Pass ]
 crbug.com/591099 fast/replaced/008.html [ Crash Failure ]
 crbug.com/591099 fast/replaced/absolute-image-sizing.html [ Failure ]
 crbug.com/591099 fast/replaced/absolute-position-auto-width-and-left-and-right-and-intrinsic-width-quirks.html [ Crash Failure ]
@@ -13075,6 +13023,7 @@
 crbug.com/591099 fast/scrolling/hover-during-scroll.html [ Failure Timeout ]
 crbug.com/591099 fast/scrolling/html-element-client-rect-excludes-scrollbars.html [ Failure ]
 crbug.com/591099 fast/scrolling/keyboard-scroll-page-scale.html [ Failure Timeout ]
+crbug.com/591099 fast/scrolling/listbox-wheel-event.html [ Failure ]
 crbug.com/591099 fast/scrolling/overflow-auto-ltr.html [ Failure ]
 crbug.com/591099 fast/scrolling/overflow-scrollability.html [ Failure ]
 crbug.com/591099 fast/scrolling/scroll-clears-fragment-anchor.html [ Failure ]
@@ -13236,6 +13185,7 @@
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-top-left.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-top-right.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-inset.html [ Failure ]
+crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-linetop-adjustment.html [ Failure Pass ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-margin-crash.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-not-a-layer.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-outermost.html [ Failure ]
@@ -13243,6 +13193,8 @@
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-polygon-001.html [ Failure Pass ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-polygon-002.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-shape-margin-percent.html [ Failure ]
+crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-stacked-000.html [ Failure Pass ]
+crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-stacked-001.html [ Failure Pass ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-floats-stacked-002.html [ Crash Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-image-fit-001.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-image-fit-002.html [ Failure ]
@@ -13256,12 +13208,15 @@
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-line-height-crash2.html [ Crash Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-linear-gradient.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-negative-height-crash.html [ Crash Failure ]
+crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-polygon-012.html [ Failure Pass ]
+crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-polygon-013.html [ Failure Pass ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-polygon-014.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-polygon-015.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-polygon-zero-vertex.html [ Failure Pass ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-relative-size-svg.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-rounded-boxes-001.html [ Failure ]
 crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-rounded-boxes-002.html [ Failure ]
+crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-rounded-inset.html [ Failure Pass ]
 crbug.com/591099 fast/spatial-navigation/snav-aligned-not-aligned.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-clipped-overflowed-content.html [ Failure ]
 crbug.com/591099 fast/spatial-navigation/snav-container-white-space.html [ Failure ]
@@ -13318,6 +13273,7 @@
 crbug.com/591099 fast/sub-pixel/float-percentage-widths.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/float-with-margin-in-container.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/float-with-right-margin-zoom.html [ Failure ]
+crbug.com/591099 fast/sub-pixel/float-wrap-zoom.html [ Failure Pass ]
 crbug.com/591099 fast/sub-pixel/inline-block-with-padding.html [ Failure ]
 crbug.com/591099 fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer.html [ Failure Pass ]
 crbug.com/591099 fast/sub-pixel/selection/selection-rect-in-sub-pixel-table.html [ Failure ]
@@ -13338,14 +13294,13 @@
 crbug.com/591099 fast/table/035-vertical.html [ Failure ]
 crbug.com/591099 fast/table/035.html [ Failure ]
 crbug.com/591099 fast/table/036.html [ Failure ]
-crbug.com/591099 fast/table/038-vertical.html [ Failure Pass ]
 crbug.com/591099 fast/table/040-vertical.html [ Failure ]
 crbug.com/591099 fast/table/040.html [ Failure ]
 crbug.com/591099 fast/table/100-percent-cell-width.html [ Failure ]
 crbug.com/591099 fast/table/absolute-table-percent-lengths.html [ Failure ]
 crbug.com/591099 fast/table/add-before-anonymous-child.html [ Failure ]
 crbug.com/591099 fast/table/add-cell-with-large-border.html [ Failure ]
-crbug.com/591099 fast/table/align-right-within-left-aligned-div.html [ Failure ]
+crbug.com/591099 fast/table/align-right-within-left-aligned-div.html [ Failure Pass ]
 crbug.com/591099 fast/table/append-cells.html [ Failure ]
 crbug.com/591099 fast/table/append-cells2.html [ Failure ]
 crbug.com/591099 fast/table/assert-autotablelayout-maxlogicalwidth.html [ Failure ]
@@ -13370,7 +13325,6 @@
 crbug.com/591099 fast/table/border-collapsing/border-collapsing-head-foot-vertical.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/border-collapsing-head-foot.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/dynamic-border-width-change.html [ Failure ]
-crbug.com/591099 fast/table/border-collapsing/equal-precedence-resolution-vertical.html [ Crash Failure Pass ]
 crbug.com/591099 fast/table/border-collapsing/rtl-border-collapsing-vertical.html [ Failure ]
 crbug.com/591099 fast/table/border-collapsing/rtl-border-collapsing.html [ Failure ]
 crbug.com/591099 fast/table/border-recalc.html [ Failure ]
@@ -13502,7 +13456,6 @@
 crbug.com/591099 fast/table/table-different-overflow-values-2.html [ Failure ]
 crbug.com/591099 fast/table/table-different-overflow-values.html [ Failure ]
 crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ]
-crbug.com/591099 fast/table/table-display-types.html [ Failure Pass ]
 crbug.com/591099 fast/table/table-parts-in-inline.html [ Failure ]
 crbug.com/591099 fast/table/table-row-compositing-repaint-crash.html [ Failure ]
 crbug.com/591099 fast/table/table-row-style-not-updated-with-before-content.html [ Failure Pass ]
@@ -13528,8 +13481,6 @@
 crbug.com/591099 fast/table/unused-percent-heights.html [ Failure ]
 crbug.com/591099 fast/table/whitespace-in-table-cells-when-div-appended-2.html [ Failure ]
 crbug.com/591099 fast/table/whitespace-in-table-cells-when-div-appended.html [ Failure ]
-crbug.com/591099 fast/table/wide-colspan.html [ Failure Pass ]
-crbug.com/591099 fast/table/wide-column.html [ Failure Pass ]
 crbug.com/591099 fast/text-autosizing/basecomputedstyle-assert.html [ Failure ]
 crbug.com/591099 fast/text-autosizing/cluster-inline-block-or-table.html [ Failure ]
 crbug.com/591099 fast/text-autosizing/cluster-inline-grid-flex-box.html [ Failure Pass ]
@@ -13891,6 +13842,7 @@
 crbug.com/591099 fast/text/wide-preformatted.html [ Failure ]
 crbug.com/591099 fast/text/word-break-run-rounding.html [ Failure ]
 crbug.com/591099 fast/text/word-break-soft-hyphen.html [ Failure ]
+crbug.com/591099 fast/text/word-break.html [ Failure Pass ]
 crbug.com/591099 fast/text/word-space-between-inlines.html [ Failure ]
 crbug.com/591099 fast/text/word-space.html [ Failure ]
 crbug.com/591099 fast/text/word-wrap-whitespace-pre.html [ Failure Pass ]
@@ -14180,7 +14132,6 @@
 crbug.com/591099 fragmentation/break-inside-avoid-with-forced-break.html [ Failure ]
 crbug.com/591099 fragmentation/break-properties.html [ Failure ]
 crbug.com/591099 fragmentation/cell-taller-than-col-straddles-columns.html [ Failure ]
-crbug.com/591099 fragmentation/cells-dont-fit-on-page-paginated.html [ Failure Pass ]
 crbug.com/591099 fragmentation/change-fragmentainer-height-block-float-2.html [ Failure ]
 crbug.com/591099 fragmentation/change-fragmentainer-height-block-float.html [ Failure ]
 crbug.com/591099 fragmentation/change-fragmentainer-height-inline-float.html [ Failure ]
@@ -14192,11 +14143,9 @@
 crbug.com/591099 fragmentation/forced-break-clearance-unsplittable-content.html [ Failure ]
 crbug.com/591099 fragmentation/forced-break-inside-float.html [ Crash Failure ]
 crbug.com/591099 fragmentation/fragmented-rowspan-alignment.html [ Failure ]
-crbug.com/591099 fragmentation/fragmented-rowspan.html [ Failure Pass ]
 crbug.com/591099 fragmentation/fragmented-table-cell.html [ Failure ]
 crbug.com/591099 fragmentation/fragmented-table-with-fixed-height.html [ Failure ]
 crbug.com/591099 fragmentation/image-block-as-first-child.html [ Failure ]
-crbug.com/591099 fragmentation/multi-line-cells-paginated.html [ Failure Pass ]
 crbug.com/591099 fragmentation/multi-line-cells.html [ Failure ]
 crbug.com/591099 fragmentation/overflow-crossing-boundary.html [ Failure ]
 crbug.com/591099 fragmentation/overhanging-float-change-fragmentainer-height.html [ Crash Failure ]
@@ -14213,7 +14162,6 @@
 crbug.com/591099 fragmentation/single-cells-multiple-tables-no-repeating-thead.html [ Failure ]
 crbug.com/591099 fragmentation/single-line-cells-in-multiple-table-sections.html [ Failure ]
 crbug.com/591099 fragmentation/single-line-cells-nested-repeating-thead-3.html [ Failure ]
-crbug.com/591099 fragmentation/single-line-cells-paginated.html [ Failure Pass ]
 crbug.com/591099 fragmentation/single-line-cells-repeating-thead-starts-middle-of-page-break-after-avoid-2.html [ Failure Pass ]
 crbug.com/591099 fragmentation/single-line-cells-repeating-thead-with-border-spacing-at-top-of-row.html [ Failure ]
 crbug.com/591099 fragmentation/single-line-cells.html [ Failure ]
@@ -14492,7 +14440,7 @@
 crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising-timer.html [ Crash ]
 crbug.com/591099 http/tests/appcache/deferred-events-delete-while-raising.html [ Crash ]
 crbug.com/591099 http/tests/appcache/destroyed-frame.html [ Crash ]
-crbug.com/591099 http/tests/appcache/detached-iframe.html [ Failure ]
+crbug.com/591099 http/tests/appcache/detached-iframe.html [ Crash Failure ]
 crbug.com/591099 http/tests/appcache/different-https-origin-resource-main.html [ Failure ]
 crbug.com/591099 http/tests/appcache/different-origin-manifest.html [ Failure ]
 crbug.com/591099 http/tests/appcache/different-scheme.html [ Failure Timeout ]
@@ -14696,7 +14644,7 @@
 crbug.com/591099 http/tests/incremental/frame-focus-before-load.html [ Failure Timeout ]
 crbug.com/591099 http/tests/incremental/slow-utf8-css.html [ Failure ]
 crbug.com/591099 http/tests/incremental/slow-utf8-html.pl [ Failure ]
-crbug.com/591099 http/tests/incremental/slow-utf8-text.pl [ Timeout ]
+crbug.com/591099 http/tests/incremental/slow-utf8-text.pl [ Pass Timeout ]
 crbug.com/591099 http/tests/incremental/split-hex-entities.pl [ Failure ]
 crbug.com/591099 http/tests/inspector-enabled/console-clear-arguments-on-frame-navigation.html [ Failure ]
 crbug.com/591099 http/tests/inspector-enabled/console-clear-arguments-on-frame-remove.html [ Crash Failure ]
@@ -14741,7 +14689,6 @@
 crbug.com/591099 http/tests/inspector-protocol/request-referrer-policy.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector-protocol/runtime-get-properties-doesnt-crash-on-window-frame.html [ Failure Pass Timeout ]
 crbug.com/591099 http/tests/inspector-protocol/websocket/websocket-user-agent-override.html [ Failure ]
-crbug.com/591099 http/tests/inspector-unit/list-control-non-viewport.js [ Failure Pass ]
 crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-attached-to-dom.js [ Failure ]
 crbug.com/591099 http/tests/inspector-unit/viewport-datagrid-items-expandable-attached-to-dom.js [ Failure ]
 crbug.com/591099 http/tests/inspector/appcache/appcache-iframe-manifests.html [ Crash Timeout ]
@@ -14801,7 +14748,7 @@
 crbug.com/591099 http/tests/inspector/elements/styles/selector-line.html [ Crash ]
 crbug.com/591099 http/tests/inspector/elements/styles/styles-do-not-add-inline-stylesheets-in-navigator.html [ Failure ]
 crbug.com/591099 http/tests/inspector/elements/styles/styles-redirected-css.html [ Crash ]
-crbug.com/591099 http/tests/inspector/elements/styles/stylesheet-tracking.html [ Crash Timeout ]
+crbug.com/591099 http/tests/inspector/elements/styles/stylesheet-tracking.html [ Crash Failure Timeout ]
 crbug.com/591099 http/tests/inspector/elements/styles/xsl-transformed.xml [ Crash ]
 crbug.com/591099 http/tests/inspector/extensions-headers.html [ Crash Failure ]
 crbug.com/591099 http/tests/inspector/extensions-iframe-eval.html [ Crash Failure ]
@@ -15743,7 +15690,6 @@
 crbug.com/591099 http/tests/security/xssAuditor/block-does-not-leak-location.html [ Failure ]
 crbug.com/591099 http/tests/security/xssAuditor/cached-frame.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/xssAuditor/chunked-big-script.html [ Failure ]
-crbug.com/591099 http/tests/security/xssAuditor/dom-write-innerHTML.html [ Crash Pass ]
 crbug.com/591099 http/tests/security/xssAuditor/embed-tag-in-path-unterminated.html [ Failure ]
 crbug.com/591099 http/tests/security/xssAuditor/form-action-token-fragment.html [ Failure ]
 crbug.com/591099 http/tests/security/xssAuditor/full-block-base-href.html [ Failure ]
@@ -16321,13 +16267,11 @@
 crbug.com/591099 images/color-profile-background-image-space.html [ Failure ]
 crbug.com/591099 images/color-profile-border-image-source.html [ Failure ]
 crbug.com/591099 images/color-profile-border-radius.html [ Failure ]
-crbug.com/591099 images/color-profile-clip.html [ Failure Pass ]
 crbug.com/591099 images/color-profile-drag-image.html [ Failure ]
 crbug.com/591099 images/color-profile-filter.html [ Failure ]
 crbug.com/591099 images/color-profile-group.html [ Failure ]
 crbug.com/591099 images/color-profile-iframe.html [ Failure ]
 crbug.com/591099 images/color-profile-image-canvas-pattern.html [ Failure ]
-crbug.com/591099 images/color-profile-image-canvas-svg.html [ Crash Failure Pass ]
 crbug.com/591099 images/color-profile-image-canvas.html [ Failure ]
 crbug.com/591099 images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/591099 images/color-profile-image-object-fit.html [ Failure ]
@@ -16338,8 +16282,6 @@
 crbug.com/591099 images/color-profile-layer-filter.html [ Crash Failure ]
 crbug.com/591099 images/color-profile-layer.html [ Failure ]
 crbug.com/591099 images/color-profile-mask-image-svg.html [ Crash Failure ]
-crbug.com/591099 images/color-profile-munsell-adobe-to-srgb.html [ Failure Pass ]
-crbug.com/591099 images/color-profile-munsell-srgb-to-srgb.html [ Failure Pass ]
 crbug.com/591099 images/color-profile-svg-foreign-object.html [ Failure ]
 crbug.com/591099 images/content-url-broken-image-with-alt-text.html [ Crash Pass ]
 crbug.com/591099 images/content-url-image-with-alt-text-dynamic-2.html [ Crash Pass ]
@@ -16451,7 +16393,7 @@
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-input-buttons.js [ Crash Timeout ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-input.js [ Crash Failure Timeout ]
 crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-labelledby.js [ Crash Failure Timeout ]
-crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-visiblity.js [ Crash Timeout ]
+crbug.com/591099 inspector-protocol/accessibility/accessibility-nameSources-visiblity.js [ Crash Failure Timeout ]
 crbug.com/591099 inspector-protocol/css/css-add-rule.html [ Timeout ]
 crbug.com/591099 inspector-protocol/css/css-coverage-poll.html [ Failure ]
 crbug.com/591099 inspector-protocol/css/css-fonts-updated-event.html [ Failure ]
@@ -16470,8 +16412,8 @@
 crbug.com/591099 inspector-protocol/debugger/debugger-step-into-dedicated-worker.html [ Failure ]
 crbug.com/591099 inspector-protocol/debugger/suspend-setTimeout-on-pause-in-dedicated-worker.html [ Failure ]
 crbug.com/591099 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot.html [ Crash Failure Timeout ]
-crbug.com/591099 inspector-protocol/dom/dom-getBoxModel.html [ Failure Pass ]
-crbug.com/591099 inspector-protocol/dom/dom-ns-attr-modified.html [ Failure ]
+crbug.com/591099 inspector-protocol/dom/dom-getBoxModel.js [ Failure Pass ]
+crbug.com/591099 inspector-protocol/dom/dom-ns-attr-modified.js [ Failure ]
 crbug.com/591099 inspector-protocol/emulation/device-emulation-320-2x.html [ Failure ]
 crbug.com/591099 inspector-protocol/emulation/device-emulation-320-only-viewport.html [ Failure ]
 crbug.com/591099 inspector-protocol/emulation/device-emulation-320.html [ Failure ]
@@ -16504,8 +16446,6 @@
 crbug.com/591099 inspector-protocol/network/resource-type.html [ Crash Failure ]
 crbug.com/591099 inspector-protocol/network/websocket-initiator.html [ Failure ]
 crbug.com/591099 inspector-protocol/page/get-layout-metrics.html [ Failure ]
-crbug.com/591099 inspector-protocol/runtime/runtime-console-log-handle-navigate.js [ Failure Pass ]
-crbug.com/591099 inspector-protocol/runtime/runtime-shouldnt-crash-after-inspected-context-destroyed.js [ Crash ]
 crbug.com/591099 inspector/agents-enable-disable.html [ Failure ]
 crbug.com/591099 inspector/animation/animation-KeyframeEffectReadOnly-crash.html [ Crash ]
 crbug.com/591099 inspector/animation/animation-empty-web-animations.html [ Crash Failure ]
@@ -16535,7 +16475,7 @@
 crbug.com/591099 inspector/components/parsed-url.html [ Failure ]
 crbug.com/591099 inspector/components/progress-bar.html [ Failure ]
 crbug.com/591099 inspector/components/segmented-range.html [ Failure ]
-crbug.com/591099 inspector/components/split-string-by-regexes.html [ Failure ]
+crbug.com/591099 inspector/components/split-string-by-regexes.html [ Crash Failure ]
 crbug.com/591099 inspector/components/split-widget.html [ Failure ]
 crbug.com/591099 inspector/components/throttler.html [ Failure ]
 crbug.com/591099 inspector/components/utilities-highlight-results.html [ Failure ]
@@ -16937,7 +16877,7 @@
 crbug.com/591099 inspector/network/network-domain-filter.html [ Failure ]
 crbug.com/591099 inspector/network/network-filmstrip-overview-showing.html [ Failure ]
 crbug.com/591099 inspector/network/network-filter-http-requests.html [ Failure ]
-crbug.com/591099 inspector/network/network-filter-parser.html [ Failure ]
+crbug.com/591099 inspector/network/network-filter-parser.html [ Crash Failure ]
 crbug.com/591099 inspector/network/network-filter-updated-requests.html [ Failure ]
 crbug.com/591099 inspector/network/network-json-parser.html [ Crash Failure ]
 crbug.com/591099 inspector/network/network-request-parse-query-params.html [ Crash Failure ]
@@ -16955,7 +16895,7 @@
 crbug.com/591099 inspector/profiler/cpu-profiler-profiling.html [ Crash Failure ]
 crbug.com/591099 inspector/profiler/cpu-profiler-save-load.html [ Crash Failure ]
 crbug.com/591099 inspector/profiler/cpu-profiler-stopped-removed-race.html [ Crash Failure ]
-crbug.com/591099 inspector/profiler/heap-profiler-profiling.html [ Failure ]
+crbug.com/591099 inspector/profiler/heap-profiler-profiling.html [ Crash Failure ]
 crbug.com/591099 inspector/profiler/heap-snapshot-comparison-dom-groups-change.html [ Crash ]
 crbug.com/591099 inspector/profiler/heap-snapshot-comparison-expansion-preserved-when-sorting.html [ Crash ]
 crbug.com/591099 inspector/profiler/heap-snapshot-comparison-show-all.html [ Crash ]
@@ -16993,7 +16933,7 @@
 crbug.com/591099 inspector/runtime.html [ Failure ]
 crbug.com/591099 inspector/runtime/runtime-callFunctionOn.html [ Failure ]
 crbug.com/591099 inspector/runtime/runtime-es6-setSymbolPropertyValue.html [ Failure ]
-crbug.com/591099 inspector/runtime/runtime-getProperties-isOwnProperty.html [ Failure ]
+crbug.com/591099 inspector/runtime/runtime-getProperties-isOwnProperty.html [ Crash Failure ]
 crbug.com/591099 inspector/runtime/runtime-getProperties.html [ Failure ]
 crbug.com/591099 inspector/runtime/runtime-localStorage-getProperties.html [ Failure ]
 crbug.com/591099 inspector/runtime/runtime-setPropertyValue.html [ Crash Failure ]
@@ -17016,7 +16956,7 @@
 crbug.com/591099 inspector/sass/test-edit-set-property-text.html [ Failure ]
 crbug.com/591099 inspector/sass/test-edit-toggle-property.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-find-node-for-position.html [ Crash ]
-crbug.com/591099 inspector/sass/test-mapping-bad.html [ Failure ]
+crbug.com/591099 inspector/sass/test-mapping-bad.html [ Crash Failure ]
 crbug.com/591099 inspector/sass/test-mapping-good.html [ Failure ]
 crbug.com/591099 inspector/sass/test-mapping-many-scss.html [ Failure ]
 crbug.com/591099 inspector/sass/test-mapping-with-cache-busting-url.html [ Failure ]
@@ -17046,7 +16986,7 @@
 crbug.com/591099 inspector/sources/debugger-async/async-callstack-post-message.html [ Crash Failure ]
 crbug.com/591099 inspector/sources/debugger-async/async-callstack-promises.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/sources/debugger-async/async-callstack-reload-no-crash.html [ Failure ]
-crbug.com/591099 inspector/sources/debugger-async/async-callstack-scripted-scroll.html [ Failure Timeout ]
+crbug.com/591099 inspector/sources/debugger-async/async-callstack-scripted-scroll.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/sources/debugger-async/async-callstack-set-interval.html [ Failure ]
 crbug.com/591099 inspector/sources/debugger-async/async-callstack-web-sql.html [ Crash Failure ]
 crbug.com/591099 inspector/sources/debugger-async/async-callstack-xhrs.html [ Failure ]
@@ -17057,7 +16997,7 @@
 crbug.com/591099 inspector/sources/debugger-breakpoints/debugger-breakpoints-not-activated-on-reload.html [ Crash Failure ]
 crbug.com/591099 inspector/sources/debugger-breakpoints/debugger-disable-add-breakpoint.html [ Failure ]
 crbug.com/591099 inspector/sources/debugger-breakpoints/debugger-reload-breakpoints-with-source-maps.html [ Crash Failure ]
-crbug.com/591099 inspector/sources/debugger-breakpoints/debugger-set-breakpoint-regex.html [ Failure ]
+crbug.com/591099 inspector/sources/debugger-breakpoints/debugger-set-breakpoint-regex.html [ Crash Failure ]
 crbug.com/591099 inspector/sources/debugger-breakpoints/disable-breakpoints.html [ Failure ]
 crbug.com/591099 inspector/sources/debugger-breakpoints/dom-breakpoints-editing-dom-from-inspector.html [ Crash Failure ]
 crbug.com/591099 inspector/sources/debugger-breakpoints/dom-breakpoints.html [ Crash Failure Timeout ]
@@ -17166,7 +17106,7 @@
 crbug.com/591099 inspector/sources/debugger-ui/watch-expressions-panel-switch.html [ Crash Failure Timeout ]
 crbug.com/591099 inspector/sources/debugger-ui/watch-expressions-preserve-expansion.html [ Crash Failure ]
 crbug.com/591099 inspector/sources/debugger/debug-inlined-scripts-fragment-id.html [ Failure ]
-crbug.com/591099 inspector/sources/debugger/debugger-autocontinue-on-syntax-error.html [ Failure ]
+crbug.com/591099 inspector/sources/debugger/debugger-autocontinue-on-syntax-error.html [ Crash Failure ]
 crbug.com/591099 inspector/sources/debugger/debugger-compile-and-run.html [ Failure ]
 crbug.com/591099 inspector/sources/debugger/debugger-completions-on-call-frame.html [ Failure ]
 crbug.com/591099 inspector/sources/debugger/debugger-cyclic-reference.html [ Failure ]
@@ -17488,8 +17428,6 @@
 crbug.com/591099 media/autoplay/document-user-activation.html [ Failure ]
 crbug.com/591099 media/before-load-member-access.html [ Crash ]
 crbug.com/591099 media/broken-video.html [ Crash ]
-crbug.com/591099 media/color-profile-munsell-bt601-smpte-to-srgb.html [ Failure Pass ]
-crbug.com/591099 media/color-profile-munsell-bt709-to-srgb.html [ Failure Pass ]
 crbug.com/591099 media/color-profile-video-poster-image.html [ Failure ]
 crbug.com/591099 media/color-profile-video-seek-filter.html [ Failure ]
 crbug.com/591099 media/color-profile-video-seek-object-fit.html [ Failure ]
@@ -17943,7 +17881,6 @@
 crbug.com/591099 paint/invalidation/compositing/layer-repaint-rects.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/layer-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/new-stacking-context.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/newly-composited-on-scroll.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/opacity-between-absolute.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/opacity-between-absolute2.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/overflow-into-content.html [ Failure ]
@@ -17953,7 +17890,6 @@
 crbug.com/591099 paint/invalidation/compositing/repaint-overflow-scrolled-squashed-content.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/repaint-squashed-layer-in-rect.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/repaint-via-layout-offset.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/compositing/requires-backing-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/resize-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/resize-squashing-layer-that-needs-full-repaint.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/scroll-fixed-layer-no-content.html [ Failure Pass ]
@@ -17976,7 +17912,6 @@
 crbug.com/591099 paint/invalidation/compositing/stacked-float-under-composited-inline.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/subpixel-offset-scaled-transform-composited.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/text-color-change.html [ Failure ]
-crbug.com/591099 paint/invalidation/compositing/text-match-highlight.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/tricky-element-removal-crash.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/compositing/updating-scrolling-container-and-content.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/updating-scrolling-container.html [ Failure ]
@@ -18080,8 +18015,6 @@
 crbug.com/591099 paint/invalidation/forms/range-focus-by-mouse-then-keydown.html [ Failure ]
 crbug.com/591099 paint/invalidation/forms/submit-focus-by-mouse-then-keydown.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/gradients-em-stops-repaint.html [ Failure ]
-crbug.com/591099 paint/invalidation/hover-create-scrollbar-part.html [ Failure Pass ]
-crbug.com/591099 paint/invalidation/hover-destroy-scrollbar-part.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/hover-pseudo-borders-whitespace.html [ Failure ]
 crbug.com/591099 paint/invalidation/hover-pseudo-borders.html [ Failure ]
 crbug.com/591099 paint/invalidation/iframe-display-block-to-display-none.html [ Failure ]
@@ -18397,7 +18330,7 @@
 crbug.com/591099 paint/invalidation/text-selection-rect-in-overflow.html [ Failure Pass ]
 crbug.com/591099 paint/invalidation/text-shadow-horizontal.html [ Failure ]
 crbug.com/591099 paint/invalidation/text-shadow.html [ Failure ]
-crbug.com/591099 paint/invalidation/textarea-caret.html [ Crash Failure ]
+crbug.com/591099 paint/invalidation/textarea-caret.html [ Crash Failure Pass ]
 crbug.com/591099 paint/invalidation/trailing-floats-root-line-box-overflow.html [ Failure ]
 crbug.com/591099 paint/invalidation/transform-absolute-child.html [ Failure ]
 crbug.com/591099 paint/invalidation/transform-absolute-in-positioned-container.html [ Failure ]
@@ -18464,8 +18397,6 @@
 crbug.com/591099 paint/spellmarkers/inline_spelling_markers.html [ Failure ]
 crbug.com/591099 paint/tables/collapsed-border-corner-conflict.html [ Failure ]
 crbug.com/591099 paint/tables/composited-collapsed-table-borders.html [ Failure Pass ]
-crbug.com/591099 paint/tables/self-painting-row-background-vertical-clipped.html [ Failure Pass ]
-crbug.com/591099 paint/tables/stacking-context-row-background-clipped-with-offset.html [ Failure Pass ]
 crbug.com/591099 paint/text/selection-no-clip-text.html [ Failure ]
 crbug.com/591099 paint/text/text-match-highlights-big-line-height.html [ Failure ]
 crbug.com/591099 paint/theme/adjust-progress-bar-size.html [ Failure Pass ]
@@ -18623,8 +18554,6 @@
 crbug.com/591099 scrollbars/hidden-scrollbar-prevents-layout.html [ Failure ]
 crbug.com/591099 scrollbars/iframe-scrollbar-becomes-custom.html [ Crash ]
 crbug.com/591099 scrollbars/listbox-scrollbar-combinations.html [ Failure ]
-crbug.com/591099 scrollbars/resize-scales-with-dpi-150.html [ Failure Pass ]
-crbug.com/591099 scrollbars/rtl/overflow-scroll-rtl.html [ Crash Failure Pass ]
 crbug.com/591099 scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ]
 crbug.com/591099 scrollbars/scrollable-iframe-remove-crash.html [ Crash ]
 crbug.com/591099 scrollbars/scrollbar-added-during-drag.html [ Timeout ]
@@ -18640,7 +18569,6 @@
 crbug.com/591099 scrollbars/scrollbar-pointer-events.html [ Failure ]
 crbug.com/591099 scrollbars/scrollbar-visibility-hidden.html [ Failure ]
 crbug.com/591099 scrollbars/scrollbars-on-positioned-content.html [ Failure ]
-crbug.com/591099 scrollbars/short-scrollbar.html [ Failure Pass ]
 crbug.com/591099 scrollbars/viewport-scrollbar-corner-with-percent-padding-crash.html [ Failure ]
 crbug.com/591099 scrollingcoordinator/donot-compute-non-fast-scrollable-region-for-hidden-frames.html [ Crash Timeout ]
 crbug.com/591099 scrollingcoordinator/non-fast-scrollable-region-nested.html [ Failure ]
@@ -20009,7 +19937,6 @@
 crbug.com/591099 tables/mozilla/bugs/bug2886-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2886.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug28928.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug29314.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug29326.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2947.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug2962.html [ Crash Failure ]
@@ -20032,7 +19959,6 @@
 crbug.com/591099 tables/mozilla/bugs/bug4093.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug42187.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug4284.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug43039.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug43204.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug43854-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug43854-2.html [ Failure ]
@@ -20041,7 +19967,6 @@
 crbug.com/591099 tables/mozilla/bugs/bug4527.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug4576.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug46480-1.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug46480-2.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug46924.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug4849-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug48827.html [ Failure ]
@@ -20054,13 +19979,11 @@
 crbug.com/591099 tables/mozilla/bugs/bug56563.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug57828-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug57828.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug5797.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug5798.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug5835.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug58402-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug59354.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug60992.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug625.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug6304.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug641-2.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug647.html [ Failure ]
@@ -20088,22 +20011,16 @@
 crbug.com/591099 tables/mozilla/bugs/bug8950.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug9123-1.html [ Failure ]
 crbug.com/591099 tables/mozilla/bugs/bug9123-2.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug92143.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug93363.html [ Failure ]
-crbug.com/591099 tables/mozilla/bugs/bug96334.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug97383.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/bugs/bug98196.html [ Failure ]
 crbug.com/591099 tables/mozilla/collapsing_borders/bug41262-3.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla/collapsing_borders/bug41262-4.html [ Failure ]
 crbug.com/591099 tables/mozilla/core/bloomberg.html [ Failure ]
-crbug.com/591099 tables/mozilla/core/borders.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/core/captions.html [ Failure ]
 crbug.com/591099 tables/mozilla/core/cell_heights.html [ Failure ]
 crbug.com/591099 tables/mozilla/core/col_span.html [ Failure ]
-crbug.com/591099 tables/mozilla/core/col_widths_auto_fix.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/core/margins.html [ Failure ]
-crbug.com/591099 tables/mozilla/core/nested1.html [ Failure Pass ]
-crbug.com/591099 tables/mozilla/core/one_row.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla/core/table_heights.html [ Failure ]
 crbug.com/591099 tables/mozilla/marvin/col_span.html [ Failure ]
 crbug.com/591099 tables/mozilla/marvin/colgroup_align_center.html [ Failure ]
@@ -20204,8 +20121,6 @@
 crbug.com/591099 tables/mozilla/marvin/tr_bgcolor_yellow_rgb.html [ Failure ]
 crbug.com/591099 tables/mozilla/marvin/x_table.xml [ Failure ]
 crbug.com/591099 tables/mozilla/marvin/x_table_align_center.xml [ Failure ]
-crbug.com/591099 tables/mozilla/marvin/x_td_nowrap.xml [ Failure Pass ]
-crbug.com/591099 tables/mozilla/marvin/x_th_nowrap.xml [ Crash Failure Pass ]
 crbug.com/591099 tables/mozilla/other/test3.html [ Failure ]
 crbug.com/591099 tables/mozilla/other/test6.html [ Failure ]
 crbug.com/591099 tables/mozilla/other/wa_table_thtd_rowspan.html [ Crash Failure ]
@@ -20218,7 +20133,6 @@
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug14007-2.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug14489.html [ Crash Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug19526.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/bugs/bug220653.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug2479-5.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug25707.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug3166-10.html [ Failure ]
@@ -20234,10 +20148,8 @@
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug51000.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug61042-1.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug61042-2.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/bugs/bug67915-2.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug7113.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug72393.html [ Failure ]
-crbug.com/591099 tables/mozilla_expected_failures/bugs/bug7243.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug73629.html [ Failure Pass ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug8499.html [ Failure ]
 crbug.com/591099 tables/mozilla_expected_failures/bugs/bug85016.html [ Failure ]
@@ -20447,7 +20359,6 @@
 crbug.com/591099 virtual/android/fullscreen/video-fail-to-enter-full-screen.html [ Failure ]
 crbug.com/591099 virtual/android/fullscreen/video-fixed-at-top-left.html [ Failure Pass ]
 crbug.com/591099 virtual/android/media/mediadocument/media-document-with-download-button.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/compositing/3d-corners.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/absolute-inside-out-of-view-fixed.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/animation/busy-indicator.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/animation/hidden-composited.html [ Failure ]
@@ -20483,7 +20394,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/compositing/filters/sw-shadow-overlaps-hw-layer.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/filters/sw-shadow-overlaps-hw-shadow.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/fixed-position-changed-to-absolute.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/compositing/fixed-position-scroll-offset-history-restore.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/framesets/composited-frame-alignment.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/generated-content.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/geometry/abs-position-inside-opacity.html [ Failure ]
@@ -20545,7 +20455,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/compositing/gestures/gesture-tapHighlight-overflowing-text-crash.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/gestures/gesture-tapHighlight-pixel-rotated-link.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/gestures/gesture-tapHighlight-shadow-tree.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/compositing/gestures/gesture-tapHighlight-skew-matrix.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/gestures/gesture-tapHighlight-with-box-shadow.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/iframes/become-composited-nested-iframes.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/iframes/become-overlapped-iframe.html [ Failure ]
@@ -20590,7 +20499,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-no-content.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-nonscrollable-body-mismatch-containers.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-nonscrollable-body-overlap.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-nonscrollable-body.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-nonscrollable-iframes-in-scrollable-page.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-out-of-view-positioning.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-out-of-view-scaled-scroll.html [ Failure ]
@@ -20598,7 +20506,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-out-of-view-with-backdrop-filter.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-out-of-view.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/fixed-position-under-transform.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/main-thread-scrolling-for-non-composited-fixed-position-if-overflow-hidden.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/no-compositing-for-fixed-position-under-transform.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/no-compositing-for-preserve-3d.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/layer-creation/overflow-scroll-overlap.html [ Failure ]
@@ -20668,14 +20575,11 @@
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-clip-with-accelerated-scrolling-ancestor.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-compositing-descendant.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-positioning.html [ Failure Pass ]
-crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-scroll-background-fractional-offset.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-scroll-background-opaque-to-transparent.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-scroll-background-transparent-to-opaque.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-scroll-content-fractional-offset.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-scroll-with-pointer-events-toggle.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-scroll.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/overflow-scrollbar-layers.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/paint-neg-z-order-descendants-into-scrolling-contents-layer.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/parent-overflow.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/remove-overflow-crash2.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/compositing/overflow/reparented-scrollbars-non-sc-anc.html [ Failure ]
@@ -20942,7 +20846,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/layer-repaint-rects.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/layer-repaint.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/new-stacking-context.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/newly-composited-on-scroll.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/opacity-between-absolute.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/opacity-between-absolute2.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/overflow-into-content.html [ Failure ]
@@ -20952,7 +20855,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/repaint-overflow-scrolled-squashed-content.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/repaint-squashed-layer-in-rect.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/repaint-via-layout-offset.html [ Failure Pass ]
-crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/requires-backing-repaint.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/resize-repaint.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/resize-squashing-layer-that-needs-full-repaint.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/scroll-fixed-layer-no-content.html [ Failure Pass ]
@@ -20975,7 +20877,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/stacked-float-under-composited-inline.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/subpixel-offset-scaled-transform-composited.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/text-color-change.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/text-match-highlight.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/tricky-element-removal-crash.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/updating-scrolling-container-and-content.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/compositing/updating-scrolling-container.html [ Failure ]
@@ -21079,8 +20980,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/forms/range-focus-by-mouse-then-keydown.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/forms/submit-focus-by-mouse-then-keydown.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/gradients-em-stops-repaint.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/hover-create-scrollbar-part.html [ Failure Pass ]
-crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/hover-destroy-scrollbar-part.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/hover-pseudo-borders-whitespace.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/hover-pseudo-borders.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/iframe-display-block-to-display-none.html [ Failure ]
@@ -21396,7 +21295,7 @@
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/text-selection-rect-in-overflow.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/text-shadow-horizontal.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/text-shadow.html [ Failure ]
-crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/textarea-caret.html [ Crash Failure ]
+crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/textarea-caret.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/trailing-floats-root-line-box-overflow.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/transform-absolute-child.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/invalidation/transform-absolute-in-positioned-container.html [ Failure ]
@@ -21463,8 +21362,6 @@
 crbug.com/591099 virtual/disable-spinvalidation/paint/spellmarkers/inline_spelling_markers.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/tables/collapsed-border-corner-conflict.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/tables/composited-collapsed-table-borders.html [ Failure Pass ]
-crbug.com/591099 virtual/disable-spinvalidation/paint/tables/self-painting-row-background-vertical-clipped.html [ Failure Pass ]
-crbug.com/591099 virtual/disable-spinvalidation/paint/tables/stacking-context-row-background-clipped-with-offset.html [ Failure Pass ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/text/selection-no-clip-text.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/text/text-match-highlights-big-line-height.html [ Failure ]
 crbug.com/591099 virtual/disable-spinvalidation/paint/theme/adjust-progress-bar-size.html [ Failure Pass ]
@@ -21571,7 +21468,6 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-hit-regions-transform-test.html [ Crash ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-imageSmoothingQuality.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-incremental-repaint.html [ Failure Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-fillstyle.html [ Crash ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-strokestyle.html [ Crash ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-invalid-video.html [ Failure ]
@@ -21612,7 +21508,6 @@
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokePath-shadow.html [ Crash ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ]
-crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-text-alignment.html [ Failure Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-text-space-characters.html [ Crash ]
 crbug.com/591099 virtual/display_list_2d_canvas/fast/canvas/canvas-textMetrics-width.html [ Failure ]
@@ -21671,7 +21566,6 @@
 crbug.com/591099 virtual/exotic-color-space/images/55.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/alt-text-wrapping.html [ Crash Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/animated-background-image-crash.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/bad-png.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-jpeg-with-color-profile.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-clip-text.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-image-cover.html [ Failure ]
@@ -21681,13 +21575,11 @@
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-background-image-space.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-border-image-source.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-border-radius.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/color-profile-clip.html [ Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-drag-image.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-filter.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-group.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-iframe.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-canvas-pattern.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-canvas-svg.html [ Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-canvas.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-image-object-fit.html [ Failure ]
@@ -21698,10 +21590,7 @@
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-layer-filter.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-layer.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-mask-image-svg.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb.html [ Failure Pass ]
-crbug.com/591099 virtual/exotic-color-space/images/color-profile-munsell-srgb-to-srgb.html [ Failure Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/color-profile-svg-foreign-object.html [ Failure ]
-crbug.com/591099 virtual/exotic-color-space/images/content-url-broken-image-with-alt-text.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/content-url-image-with-alt-text-dynamic-2.html [ Crash Pass ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-background-size.html [ Failure ]
 crbug.com/591099 virtual/exotic-color-space/images/cross-fade-blending.html [ Failure ]
@@ -21806,7 +21695,6 @@
 crbug.com/591099 virtual/gpu-rasterization/images/55.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/alt-text-wrapping.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/animated-background-image-crash.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/bad-png.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-jpeg-with-color-profile.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-cover.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-cross-fade-png.html [ Failure ]
@@ -21815,13 +21703,11 @@
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-background-image-space.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-border-image-source.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-border-radius.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-clip.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-drag-image.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-filter.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-group.html [ Crash Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-iframe.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-canvas-pattern.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-canvas-svg.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-canvas.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-object-fit.html [ Failure ]
@@ -21832,8 +21718,6 @@
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-layer-filter.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-layer.html [ Failure Timeout ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-mask-image-svg.html [ Failure ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb.html [ Failure Pass ]
-crbug.com/591099 virtual/gpu-rasterization/images/color-profile-munsell-srgb-to-srgb.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/color-profile-svg-foreign-object.html [ Failure ]
 crbug.com/591099 virtual/gpu-rasterization/images/content-url-image-with-alt-text-dynamic-2.html [ Crash Pass ]
 crbug.com/591099 virtual/gpu-rasterization/images/cross-fade-background-size.html [ Failure ]
@@ -22030,7 +21914,6 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-hit-regions-transform-test.html [ Crash ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingEnabled-repaint.html [ Crash ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-imageSmoothingQuality.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-incremental-repaint.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-fillstyle.html [ Crash ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-strokestyle.html [ Crash ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-invalid-video.html [ Failure ]
@@ -22071,7 +21954,6 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokePath-shadow.html [ Crash ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-alpha-shadow.html [ Crash ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-strokeRect-gradient-shadow.html [ Crash ]
-crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-alignment.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-baseline-tiny-fonts.html [ Failure Pass ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-text-space-characters.html [ Crash ]
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-textMetrics-width.html [ Failure ]
@@ -22148,8 +22030,8 @@
 crbug.com/591099 virtual/layout_ng/fast/block/float/017.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/clear-intruding-floats-when-moving-to-inline-parent-3.html [ Crash Failure Pass ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/formatting-context-changes.html [ Failure ]
-crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block.html [ Failure ]
-crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block2.html [ Failure ]
+crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block.html [ Failure Pass ]
+crbug.com/591099 virtual/layout_ng/fast/block/float/overhanging-float-add-in-static-position-block2.html [ Failure Pass ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-made-inline-crash.html [ Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/float/rubybase-children-moved-crash-2.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng/fast/block/margin-collapse/line-beside-float-complex-margin-collapsing.html [ Failure ]
@@ -22161,8 +22043,6 @@
 crbug.com/591099 virtual/mojo-loading/http/tests/inspector/network/network-filters.html [ Failure Pass ]
 crbug.com/591099 virtual/mojo-loading/http/tests/inspector/network/waterfall-images.html [ Failure Pass ]
 crbug.com/591099 virtual/mojo-loading/http/tests/inspector/persistence/automapping-sourcemap.html [ Failure Pass Timeout ]
-crbug.com/591099 virtual/mojo-loading/http/tests/security/contentSecurityPolicy/directive-parsing-03.html [ Failure Pass ]
-crbug.com/591099 virtual/mojo-loading/http/tests/security/contentSecurityPolicy/source-list-parsing-04.html [ Failure Pass ]
 crbug.com/591099 virtual/mojo-loading/http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.html [ Failure Pass Timeout ]
 crbug.com/591099 virtual/mojo-loading/http/tests/serviceworker/ServiceWorkerGlobalScope/registration-attribute.html [ Failure Pass ]
 crbug.com/591099 virtual/mojo-localstorage/external/wpt/webstorage/event_no_duplicates.html [ Crash ]
@@ -22223,7 +22103,6 @@
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting-cache.https.html [ Crash ]
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-canvas-tainting.https.html [ Crash ]
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-cors-xhr.https.html [ Crash ]
-crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-event-redirect.https.html [ Pass Timeout ]
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-event.https.html [ Crash ]
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-frame-resource.https.html [ Crash ]
 crbug.com/591099 virtual/off-main-thread-fetch/external/wpt/service-workers/service-worker/fetch-mixed-content-to-inscope.https.html [ Crash ]
@@ -22445,12 +22324,9 @@
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-compositing-descendant.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-overlay-with-touch.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-positioning.html [ Failure Pass ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scroll-background-fractional-offset.html [ Failure Pass ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scroll-content-fractional-offset.html [ Failure Pass ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scroll-with-pointer-events-toggle.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scroll.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scrollbar-layers.html [ Failure ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/paint-neg-z-order-descendants-into-scrolling-contents-layer.html [ Failure Pass ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/parent-overflow.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/remove-overflow-crash2.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/compositing/overflow/reparented-scrollbars-non-sc-anc.html [ Failure ]
@@ -22511,7 +22387,6 @@
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-pointer-events.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-visibility-hidden.html [ Failure ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbars-on-positioned-content.html [ Failure ]
-crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/short-scrollbar.html [ Failure Pass ]
 crbug.com/591099 virtual/prefer_compositing_to_lcd_text/scrollbars/viewport-scrollbar-corner-with-percent-padding-crash.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-fragment-navigation-crossdoc.html [ Crash ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/history/scroll-restoration/scroll-restoration-navigation.html [ Crash ]
@@ -22525,7 +22400,8 @@
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/fractional-scroll-offset-document.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/hover-during-scroll.html [ Failure Timeout ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/html-element-client-rect-excludes-scrollbars.html [ Failure ]
-crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/keyboard-scroll-page-scale.html [ Failure ]
+crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/keyboard-scroll-page-scale.html [ Failure Timeout ]
+crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/listbox-wheel-event.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/overflow-auto-ltr.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/overflow-scrollability.html [ Failure ]
 crbug.com/591099 virtual/rootlayerscrolls/fast/scrolling/scroll-clears-fragment-anchor.html [ Failure ]
@@ -23001,7 +22877,7 @@
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/main-frame-scroll-in-quirks-mode.html [ Failure ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/main-frame-scroll-in-standards-mode.html [ Failure ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/no-erroneous-auto-scroll-pinch-zoom.html [ Failure ]
-crbug.com/591099 virtual/threaded/fast/scroll-behavior/overflow-scroll-animates.html [ Failure ]
+crbug.com/591099 virtual/threaded/fast/scroll-behavior/overflow-scroll-animates.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/overflow-scroll-loses-composited-scrolling.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/overflow-scroll-precise-deltas-dont-animate.html [ Failure Timeout ]
 crbug.com/591099 virtual/threaded/fast/scroll-behavior/overflow-scroll-root-frame-animates.html [ Failure Timeout ]
@@ -23215,7 +23091,7 @@
 crbug.com/591099 vr/requestPresent_resolve.html [ Crash ]
 crbug.com/591099 vr/requestPresent_resolve_repeatwithgesture.html [ Crash ]
 crbug.com/591099 vr/requestPresent_resolve_repeatwithoutgesture.html [ Crash ]
-crbug.com/591099 vr/requestPresent_resolve_then_reject.html [ Crash ]
+crbug.com/591099 vr/requestPresent_resolve_then_reject.html [ Crash Timeout ]
 crbug.com/591099 vr/requestPresent_resolve_webgl2.html [ Crash ]
 crbug.com/591099 vr/stageParameters_match.html [ Crash ]
 crbug.com/591099 webaudio/BiquadFilter/tail-time-lowpass.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/animations/animations-parsing-expected.txt b/third_party/WebKit/LayoutTests/animations/animations-parsing-expected.txt
index fb43a84..3341b66 100644
--- a/third_party/WebKit/LayoutTests/animations/animations-parsing-expected.txt
+++ b/third_party/WebKit/LayoutTests/animations/animations-parsing-expected.txt
@@ -746,10 +746,10 @@
 PASS computedStyle.animation is 'none 0s ease 0s 1 normal none running'
 PASS style.webkitAnimation is ''
 PASS computedStyle.webkitAnimation is 'none 0s ease 0s 1 normal none running'
-PASS style.animation is ''
-PASS computedStyle.animation is 'none 0s ease 0s 1 normal none running'
-PASS style.webkitAnimation is ''
-PASS computedStyle.webkitAnimation is 'none 0s ease 0s 1 normal none running'
+PASS style.animation is 'default 2'
+PASS computedStyle.animation is 'default 0s ease 0s 2 normal none running'
+PASS style.webkitAnimation is 'default 2'
+PASS computedStyle.webkitAnimation is 'default 0s ease 0s 2 normal none running'
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/animations/animations-parsing.html b/third_party/WebKit/LayoutTests/animations/animations-parsing.html
index ef3b6c6..07d9673 100644
--- a/third_party/WebKit/LayoutTests/animations/animations-parsing.html
+++ b/third_party/WebKit/LayoutTests/animations/animations-parsing.html
@@ -1152,10 +1152,10 @@
 shouldBe("computedStyle.webkitAnimation", "'none 0s ease 0s 1 normal none running'");
 
 style.animation = "2 default";
-shouldBe("style.animation", "''");
-shouldBe("computedStyle.animation", "'none 0s ease 0s 1 normal none running'");
-shouldBe("style.webkitAnimation", "''");
-shouldBe("computedStyle.webkitAnimation", "'none 0s ease 0s 1 normal none running'");
+shouldBe("style.animation", "'default 2'");
+shouldBe("computedStyle.animation", "'default 0s ease 0s 2 normal none running'");
+shouldBe("style.webkitAnimation", "'default 2'");
+shouldBe("computedStyle.webkitAnimation", "'default 0s ease 0s 2 normal none running'");
 
 // FIXME : https://code.google.com/p/chromium/issues/detail?id=273092
 /*style.animation = "ease-in ease-otu 5s";
diff --git a/third_party/WebKit/LayoutTests/animations/custom-properties/custom-ident-type-interpolation.html b/third_party/WebKit/LayoutTests/animations/custom-properties/custom-ident-type-interpolation.html
new file mode 100644
index 0000000..e496a9d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/animations/custom-properties/custom-ident-type-interpolation.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<style>
+.parent {
+  --ident: parent;
+}
+.target {
+  --ident: underlying;
+}
+</style>
+<body>
+<script src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+CSS.registerProperty({
+  name: '--ident',
+  syntax: '<custom-ident>',
+  initialValue: 'initial-value',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: neutralKeyframe,
+  to: 'hello',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'initial',
+  to: 'hello',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'inherit',
+  to: 'hello',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'unset',
+  to: 'hello',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'apple',
+  to: 'banana',
+});
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/animations/custom-properties/ident-type-interpolation.html b/third_party/WebKit/LayoutTests/animations/custom-properties/ident-type-interpolation.html
new file mode 100644
index 0000000..a2301d53
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/animations/custom-properties/ident-type-interpolation.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<style>
+.parent {
+  --ident: parent;
+}
+.target {
+  --ident: underlying;
+}
+</style>
+<body>
+<script src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+CSS.registerProperty({
+  name: '--ident',
+  syntax: 'parent | underlying | initial-value | hello | apple | banana',
+  initialValue: 'initial-value',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: neutralKeyframe,
+  to: 'hello',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'initial',
+  to: 'hello',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'inherit',
+  to: 'hello',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'unset',
+  to: 'hello',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'apple',
+  to: 'banana',
+});
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/animations/custom-properties/integer-type-interpolation.html b/third_party/WebKit/LayoutTests/animations/custom-properties/integer-type-interpolation.html
new file mode 100644
index 0000000..d8ea3101
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/animations/custom-properties/integer-type-interpolation.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<style>
+.parent {
+  --integer: 30;
+}
+.target {
+  --integer: 10;
+}
+</style>
+<body>
+<script src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+CSS.registerProperty({
+  name: '--integer',
+  syntax: '<integer>',
+  initialValue: '40',
+});
+
+assertInterpolation({
+  property: '--integer',
+  from: neutralKeyframe,
+  to: '20',
+}, [
+  {at: -0.3, is: '7'},
+  {at: 0, is: '10'},
+  {at: 0.5, is: '15'},
+  {at: 1, is: '20'},
+  {at: 1.5, is: '25'},
+]);
+
+assertInterpolation({
+  property: '--integer',
+  from: 'initial',
+  to: '20',
+}, [
+  {at: -0.3, is: '46'},
+  {at: 0, is: '40'},
+  {at: 0.5, is: '30'},
+  {at: 1, is: '20'},
+  {at: 1.5, is: '10'},
+]);
+
+assertInterpolation({
+  property: '--integer',
+  from: 'inherit',
+  to: '20',
+}, [
+  {at: -0.3, is: '33'},
+  {at: 0, is: '30'},
+  {at: 0.5, is: '25'},
+  {at: 1, is: '20'},
+  {at: 1.5, is: '15'},
+]);
+
+assertInterpolation({
+  property: '--integer',
+  from: 'unset',
+  to: '20',
+}, [
+  {at: -0.3, is: '46'},
+  {at: 0, is: '40'},
+  {at: 0.5, is: '30'},
+  {at: 1, is: '20'},
+  {at: 1.5, is: '10'},
+]);
+
+assertInterpolation({
+  property: '--integer',
+  from: '-10',
+  to: '10',
+}, [
+  {at: -0.3, is: '-16'},
+  {at: 0, is: '-10'},
+  {at: 0.5, is: '0'},
+  {at: 1, is: '10'},
+  {at: 1.5, is: '20'}
+]);
+
+assertInterpolation({
+  property: '--integer',
+  from: '10',
+  to: '15',
+}, [
+  {at: -0.3, is: '9'},
+  {at: 0, is: '10'},
+  {at: 0.25, is: '11'},
+  {at: 0.5, is: '13'},
+  {at: 0.75, is: '14'},
+  {at: 1, is: '15'},
+  {at: 1.5, is: '18'}
+]);
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/animations/custom-properties/number-type-interpolation.html b/third_party/WebKit/LayoutTests/animations/custom-properties/number-type-interpolation.html
index 051ae16..82cb976e 100644
--- a/third_party/WebKit/LayoutTests/animations/custom-properties/number-type-interpolation.html
+++ b/third_party/WebKit/LayoutTests/animations/custom-properties/number-type-interpolation.html
@@ -76,5 +76,19 @@
   {at: 1, is: '10'},
   {at: 1.5, is: '20'}
 ]);
+
+assertInterpolation({
+  property: '--number',
+  from: '10',
+  to: '15',
+}, [
+  {at: -0.3, is: '8.5'},
+  {at: 0, is: '10'},
+  {at: 0.25, is: '11.25'},
+  {at: 0.5, is: '12.5'},
+  {at: 0.75, is: '13.75'},
+  {at: 1, is: '15'},
+  {at: 1.5, is: '17.5'}
+]);
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/animations/custom-properties/token-stream-type-interpolation.html b/third_party/WebKit/LayoutTests/animations/custom-properties/token-stream-type-interpolation.html
new file mode 100644
index 0000000..b9f43a21
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/animations/custom-properties/token-stream-type-interpolation.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<style>
+.parent {
+  --token-stream: parent tokens;
+}
+.target {
+  --token-stream: underlying tokens;
+}
+</style>
+<body>
+<script src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+CSS.registerProperty({
+  name: '--token-stream',
+  syntax: '*',
+  initialValue: 'initial tokens',
+});
+
+assertNoInterpolation({
+  property: '--token-stream',
+  from: neutralKeyframe,
+  to: 'value tokens',
+});
+
+assertNoInterpolation({
+  property: '--token-stream',
+  from: 'initial',
+  to: 'value tokens',
+});
+
+assertNoInterpolation({
+  property: '--token-stream',
+  from: 'inherit',
+  to: 'value tokens',
+});
+
+assertNoInterpolation({
+  property: '--ident',
+  from: 'unset',
+  to: 'value tokens',
+});
+
+assertNoInterpolation({
+  property: '--token-stream',
+  from: 'a b c d',
+  to: 'e f g h',
+});
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/animations/custom-properties/url-type-interpolation.html b/third_party/WebKit/LayoutTests/animations/custom-properties/url-type-interpolation.html
new file mode 100644
index 0000000..5650a0b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/animations/custom-properties/url-type-interpolation.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<style>
+.parent {
+  --url: url('http://parent.txt');
+}
+.target {
+  --url: url('http://underlying.txt');
+}
+</style>
+<body>
+<script src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+CSS.registerProperty({
+  name: '--url',
+  syntax: '<url>',
+  initialValue: "url('http://initial.txt')",
+});
+
+assertNoInterpolation({
+  property: '--url',
+  from: neutralKeyframe,
+  to: "url('http://value.txt')",
+});
+
+assertNoInterpolation({
+  property: '--url',
+  from: 'initial',
+  to: "url('http://value.txt')",
+});
+
+assertNoInterpolation({
+  property: '--url',
+  from: 'inherit',
+  to: "url('http://value.txt')",
+});
+
+assertNoInterpolation({
+  property: '--url',
+  from: 'unset',
+  to: "url('http://value.txt')",
+});
+
+assertNoInterpolation({
+  property: '--url',
+  from: "url('http://a.txt')",
+  to: "url('http://b.txt')",
+});
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/resources/interpolation-test.js b/third_party/WebKit/LayoutTests/animations/interpolation/resources/interpolation-test.js
index 3f98f56..06c752a 100644
--- a/third_party/WebKit/LayoutTests/animations/interpolation/resources/interpolation-test.js
+++ b/third_party/WebKit/LayoutTests/animations/interpolation/resources/interpolation-test.js
@@ -86,8 +86,8 @@
       }
       cssAnimationsData.sharedStyle.textContent += '' +
         '@keyframes animation' + id + ' {' +
-          (isNeutralKeyframe(from) ? '' : `from {${property}: ${from};}`) +
-          (isNeutralKeyframe(to) ? '' : `to {${property}: ${to};}`) +
+          (isNeutralKeyframe(from) ? '' : `from {${property}:${from};}`) +
+          (isNeutralKeyframe(to) ? '' : `to {${property}:${to};}`) +
         '}';
       target.style.animationName = 'animation' + id;
       target.style.animationDuration = '2e10s';
@@ -323,7 +323,9 @@
     return expectations.map(function(expectation) {
       var actualTargetContainer = createTargetContainer(testContainer, 'actual');
       var expectedTargetContainer = createTargetContainer(testContainer, 'expected');
-      expectedTargetContainer.target.style.setProperty(property, expectation.is);
+      if (!isNeutralKeyframe(expectation.is)) {
+        expectedTargetContainer.target.style.setProperty(property, expectation.is);
+      }
       var target = actualTargetContainer.target;
       interpolationMethod.setup(property, from, target);
       target.interpolate = function() {
diff --git a/third_party/WebKit/LayoutTests/custom-properties/register-property-syntax-parsing-expected.txt b/third_party/WebKit/LayoutTests/custom-properties/register-property-syntax-parsing-expected.txt
index 82b34541..604e4dab 100644
--- a/third_party/WebKit/LayoutTests/custom-properties/register-property-syntax-parsing-expected.txt
+++ b/third_party/WebKit/LayoutTests/custom-properties/register-property-syntax-parsing-expected.txt
@@ -51,6 +51,7 @@
 PASS syntax:'<custom-ident>', initialValue:'banan\61' is valid 
 PASS syntax:'big | bigger | BIGGER', initialValue:'bigger' is valid 
 PASS syntax:'foo+|bar', initialValue:'foo foo foo' is valid 
+PASS syntax:'default', initialValue:'default' is valid 
 PASS syntax:'banana	', initialValue:'banana' is valid 
 PASS syntax:'
 banana\r
@@ -75,9 +76,11 @@
 PASS syntax:'*|banana', initialValue:'banana' is invalid 
 PASS syntax:'*+', initialValue:'banana' is invalid 
 PASS syntax:'initial', initialValue:'initial' is invalid 
+PASS syntax:'inherit', initialValue:'inherit' is invalid 
+PASS syntax:'unset', initialValue:'unset' is invalid 
 PASS syntax:'<length>|initial', initialValue:'10px' is invalid 
 PASS syntax:'<length>|INHERIT', initialValue:'10px' is invalid 
-PASS syntax:'<percentage>|defAult', initialValue:'2%' is invalid 
+PASS syntax:'<percentage>|unsEt', initialValue:'2%' is invalid 
 PASS syntax:'*', initialValue:'initial' is invalid 
 PASS syntax:'*', initialValue:'inherit' is invalid 
 PASS syntax:'*', initialValue:'unset' is invalid 
diff --git a/third_party/WebKit/LayoutTests/custom-properties/register-property-syntax-parsing.html b/third_party/WebKit/LayoutTests/custom-properties/register-property-syntax-parsing.html
index 66be587c..127bef3 100644
--- a/third_party/WebKit/LayoutTests/custom-properties/register-property-syntax-parsing.html
+++ b/third_party/WebKit/LayoutTests/custom-properties/register-property-syntax-parsing.html
@@ -78,6 +78,7 @@
 assert_valid("<custom-ident>", "banan\\61");
 assert_valid("big | bigger | BIGGER", "bigger");
 assert_valid("foo+|bar", "foo foo foo");
+assert_valid("default", "default");
 
 assert_valid("banana\t", "banana");
 assert_valid("\nbanana\r\n", "banana");
@@ -105,9 +106,11 @@
 assert_invalid("*+", "banana");
 
 assert_invalid("initial", "initial");
+assert_invalid("inherit", "inherit");
+assert_invalid("unset", "unset");
 assert_invalid("<length>|initial", "10px");
 assert_invalid("<length>|INHERIT", "10px");
-assert_invalid("<percentage>|defAult", "2%");
+assert_invalid("<percentage>|unsEt", "2%");
 
 // Invalid initialValue
 assert_invalid("*", "initial");
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount-expected.txt
index 8fa5a834..bc68f00 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount-expected.txt
@@ -1,3 +1,4 @@
+
 Node arrived with childNodeCount: 2
 childCountUpdated: 3
 childCountUpdated: 2
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount.html
deleted file mode 100644
index 1318d1a..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function addNode()
-{
-    var container = document.getElementById("container");
-    container.appendChild(document.createElement("div"));
-}
-
-function removeNode()
-{
-    var container = document.getElementById("container");
-    container.firstChild.remove();
-}
-
-function test()
-{
-    var nodeInfo = {};
-    var containerNodeId;
-    InspectorTest.eventHandler["DOM.setChildNodes"] = setChildNodes;
-    InspectorTest.eventHandler["DOM.childNodeCountUpdated"] = childNodeCountUpdated;
-
-    InspectorTest.sendCommand("DOM.getDocument", {}, onGotDocument);
-
-    function onGotDocument(msg)
-    {
-        if (InspectorTest.completeTestIfError(msg))
-            return;
-        InspectorTest.sendCommand("DOM.querySelector", { nodeId: msg.result.root.nodeId, selector: "#container" }, onQuerySelector);
-    }
-
-    function onQuerySelector(msg)
-    {
-        if (InspectorTest.completeTestIfError(msg))
-            return;
-        containerNodeId = msg.result.nodeId;
-        InspectorTest.log("Node arrived with childNodeCount: " + nodeInfo[containerNodeId].childNodeCount);
-
-        InspectorTest.sendCommand("Runtime.evaluate", { expression: "addNode()"});
-        InspectorTest.sendCommand("Runtime.evaluate", { expression: "removeNode()"});
-        InspectorTest.sendCommand("Runtime.evaluate", { expression: "removeNode()"});
-        InspectorTest.sendCommand("Runtime.evaluate", { expression: "removeNode()"},
-            InspectorTest.completeTest.bind(InspectorTest));
-    }
-
-    function setChildNodes(message)
-    {
-        var nodes = message.params.nodes;
-        for (var i = 0; i < nodes.length; ++i) {
-            nodeInfo[nodes[i].nodeId] = nodes[i];
-            delete nodes[i].nodeId;
-        }
-    }
-
-    function childNodeCountUpdated(message)
-    {
-        if (message.params.nodeId === containerNodeId)
-            InspectorTest.log("childCountUpdated: " + message.params.childNodeCount);
-    }
-}
-
-</script>
-</head>
-<body onload="runTest()">
-<div id="container" style="display:none"><div>child1</div><div>child2</div></div>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount.js
new file mode 100644
index 0000000..87a82d9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-childNodeCount.js
@@ -0,0 +1,35 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+        <div id='container' style='display:none'><div>child1</div><div>child2</div></div>
+  `, '');
+  var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
+  var nodeTracker = new NodeTracker(dp);
+  var containerNodeId;
+  dp.DOM.onChildNodeCountUpdated(message => {
+    if (message.params.nodeId === containerNodeId)
+      testRunner.log('childCountUpdated: ' + message.params.childNodeCount);
+  });
+  var response = await dp.DOM.getDocument();
+  var message = await dp.DOM.querySelector({nodeId: response.result.root.nodeId, selector: '#container' });
+
+  containerNodeId = message.result.nodeId;
+  testRunner.log('Node arrived with childNodeCount: ' + nodeTracker.nodeForId(containerNodeId).childNodeCount);
+
+  await Promise.all([
+    session.evaluate(addNode),
+    session.evaluate(removeNode),
+    session.evaluate(removeNode),
+    session.evaluate(removeNode),
+  ]);
+  testRunner.completeTest();
+
+  function addNode() {
+    var container = document.getElementById('container');
+    container.appendChild(document.createElement('div'));
+  }
+
+  function removeNode() {
+    var container = document.getElementById('container');
+    container.firstChild.remove();
+  }
+})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names-expected.txt
index 36f5099b..7eb410f 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names-expected.txt
@@ -1,3 +1,4 @@
+
 All class names: 
 body-class
 class1
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names.html
deleted file mode 100644
index 6faae1b1..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    var rootNode;
-    var classNames= [];
-
-    InspectorTest.sendCommand("DOM.getDocument", {}, onGotDocument);
-    InspectorTest.sendCommand("DOM.enable", {});
-    InspectorTest.eventHandler["DOM.setChildNodes"] = setChildNodes;
-
-    function onGotDocument(msg)
-    {
-        rootNode = msg.result.root;
-        InspectorTest.sendCommandOrDie("DOM.collectClassNamesFromSubtree", { nodeId: rootNode.nodeId }, onClassNamesCollected);
-    }
-
-    function collectClassNamesFromSubtree()
-    {
-        InspectorTest.sendCommand("DOM.requestChildNodes", { nodeId: rootNode.children[0].children[1].nodeId }, null);
-    }
-
-    function setChildNodes(response)
-    {
-        var nodes = response.params.nodes;
-        InspectorTest.sendCommandOrDie("DOM.collectClassNamesFromSubtree", { nodeId: nodes[1].nodeId }, onSubtreeClassNamesCollected);
-    }
-
-    function onSubtreeClassNamesCollected(response)
-    {
-        var subtreeClassNames = response.classNames.sort();
-        InspectorTest.log("All class names: ");
-        for (var i = 0; i < classNames.length; i++)
-            InspectorTest.log(classNames[i]);
-        InspectorTest.log("Subtree class names: ");
-        for (var i = 0; i < subtreeClassNames.length; i++)
-            InspectorTest.log(subtreeClassNames[i]);
-
-        InspectorTest.completeTest();
-    }
-
-    function onClassNamesCollected(response)
-    {
-        classNames = response.classNames.sort();
-        collectClassNamesFromSubtree();
-    }
-}
-
-</script>
-</head>
-<body class="body-class">
-<div class="class1"></div>
-<div class="class2">
-    <ul class="class3">
-        <li class="class4"></li>
-    </ul>
-</div>
-<div class="class5 class6"></div>
-<div id="shadow-host"></div>
-<script type="text/javascript">
-    var host = document.querySelector("#shadow-host");
-    var root = host.createShadowRoot();
-    root.innerHTML = "<div class=\"shadow-class\"></div>";
-    runTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names.js
new file mode 100644
index 0000000..7ae0e31
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-collect-class-names.js
@@ -0,0 +1,43 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <body class='body-class'>
+    <div class='class1'></div>
+    <div class='class2'>
+      <ul class='class3'>
+        <li class='class4'></li>
+      </ul>
+    </div>
+    <div class='class5 class6'></div>
+    <div id='shadow-host'></div>
+    </body>
+  `, '');
+
+  await session.evaluate(() => {
+    var host = document.querySelector('#shadow-host');
+    var root = host.createShadowRoot();
+    root.innerHTML = '<div class="shadow-class"></div>';
+  });
+
+  dp.DOM.enable();
+  var response = await dp.DOM.getDocument();
+  var rootNode = response.result.root;
+  dp.DOM.collectClassNamesFromSubtree({nodeId: rootNode.nodeId});
+
+  var response = await dp.DOM.collectClassNamesFromSubtree({nodeId: rootNode.nodeId});
+  var allClassNames = response.result.classNames;
+  allClassNames.sort();
+  dp.DOM.requestChildNodes({nodeId: rootNode.children[0].children[1].nodeId});
+
+  var message = await dp.DOM.onceSetChildNodes();
+  var nodes = message.params.nodes;
+  var response = await dp.DOM.collectClassNamesFromSubtree({nodeId: nodes[1].nodeId});
+  var subtreeClassNames = response.result.classNames.sort();
+  testRunner.log('All class names: ');
+  for (var i = 0; i < allClassNames.length; i++)
+    testRunner.log(allClassNames[i]);
+  testRunner.log('Subtree class names: ');
+  for (var i = 0; i < subtreeClassNames.length; i++)
+    testRunner.log(subtreeClassNames[i]);
+  testRunner.completeTest();
+})
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus-expected.txt
index 3c1a44e6..7eb2762 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus-expected.txt
@@ -1,4 +1,4 @@
- 
+
 BODY
 second
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus.html
deleted file mode 100644
index f2b7831..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function logActiveElement() {
-    var el = document.activeElement;
-    log(el ? (el.id || el.tagName) : "(none)");
-}
-
-function test()
-{
-    InspectorTest.sendCommand("Runtime.evaluate", { "expression": "logActiveElement()" });
-
-    InspectorTest.sendCommand("DOM.getDocument", {}, onGotDocument);
-
-    function onGotDocument(msg) {
-        if (msg.error) {
-            InspectorTest.log(msg.error.message);
-            InspectorTest.completeTest();
-            return;
-        }
-        var node = msg.result.root;
-        InspectorTest.sendCommand("DOM.querySelector", { "nodeId": node.nodeId, "selector": "#second" }, onQuerySelector);
-    }
-
-    function onQuerySelector(msg) {
-        if (msg.error) {
-            InspectorTest.log(msg.error.message);
-            InspectorTest.completeTest();
-            return;
-        }
-        var node = msg.result;
-        InspectorTest.sendCommand("DOM.focus", { "nodeId": node.nodeId }, onFocus);
-    }
-
-    function onFocus(msg) {
-        if (msg.error)
-            InspectorTest.log(msg.error);
-
-        InspectorTest.sendCommand("Runtime.evaluate", { expression: 'logActiveElement()' });
-        InspectorTest.completeTest();
-    }
-}
-
-</script>
-</head>
-<body onload="runTest()">
-<input></input>
-<input id="second"></input>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus.js
new file mode 100644
index 0000000..b37f2104
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-focus.js
@@ -0,0 +1,19 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <input></input>
+    <input id='second'></input>
+  `, '');
+
+  testRunner.log(await session.evaluate(getActiveElement));
+  var document = (await dp.DOM.getDocument()).result.root;
+  var node = (await dp.DOM.querySelector({nodeId: document.nodeId, selector: '#second'})).result;
+  await dp.DOM.focus({nodeId: node.nodeId});
+  testRunner.log(await session.evaluate(getActiveElement));
+  testRunner.completeTest();
+
+  function getActiveElement() {
+    var el = document.activeElement;
+    return el ? (el.id || el.tagName) : '(none)';
+  }
+})
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel-expected.txt
index d8b52ab..ee0c60e 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel-expected.txt
@@ -1,8 +1,5 @@
-Several
-Lines
-Of
-Text
- #text: Could not compute box model.
+
+#text: Could not compute box model.
 BR: Could not compute box model.
 #text: Could not compute box model.
 BR: Could not compute box model.
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel.html
deleted file mode 100644
index 585822b..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    var nodeInfo = {};
-    InspectorTest.eventHandler["DOM.setChildNodes"] = setChildNodes;
-    InspectorTest.sendCommand("DOM.enable", {});
-    InspectorTest.sendCommand("DOM.getNodeForLocation", { "x": 100, "y": 200 }, onGetNodeForLocation);
-
-    function onGetNodeForLocation(message)
-    {
-        if (message.error) {
-            InspectorTest.log(message.error.message);
-            InspectorTest.completeTest();
-            return;
-        }
-        var ids = Object.keys(nodeInfo);
-        for (var i = 0; i < ids.length; ++i)
-            ids[i] = parseInt(ids[i]);
-        ids.sort(function(a, b) { return a < b ? -1 : (a === b ? 0 : 1); });
-        // Skip first - it does not have round values.
-        for (var i = 1; i < ids.length; ++i)
-            InspectorTest.sendCommand("DOM.getBoxModel", { "nodeId": ids[i] }, printBoxModel.bind(null, nodeInfo[ids[i]], i == ids.length - 1));
-    }
-
-    function printBoxModel(nodeInfo, lastNode, message)
-    {
-        if (message.error) {
-            InspectorTest.log(nodeInfo.nodeName + ": " + message.error.message);
-            if (lastNode)
-                InspectorTest.completeTest();
-            return;
-        }
-        InspectorTest.logObject(message.result.model.content, nodeInfo.nodeName + " " + nodeInfo.attributes + " ");
-        if (lastNode)
-            InspectorTest.completeTest();
-    }
-
-    function setChildNodes(message)
-    {
-        var nodes = message.params.nodes;
-        for (var i = 0; i < nodes.length; ++i) {
-            nodeInfo[nodes[i].nodeId] = nodes[i];
-            delete nodes[i].nodeId;
-        }
-    }
-}
-
-</script>
-</head>
-<body onload="runTest()">
-<div>
-Several<br>
-Lines<br>
-Of<br>
-Text<br>
-<div style="position:absolute;top:100;left:0;width:100;height:100;background:red"></div>
-<div style="position:absolute;top:200;left:100;width:100;height:100;background:green"></div>
-<div style="position:absolute;top:150;left:50;width:100;height:100;background:blue;transform:rotate(45deg);"></div>
-</div>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel.js
new file mode 100644
index 0000000..355a27f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getBoxModel.js
@@ -0,0 +1,26 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    Several<br>
+    Lines<br>
+    Of<br>
+    Text<br>
+    <div style='position:absolute;top:100;left:0;width:100;height:100;background:red'></div>
+    <div style='position:absolute;top:200;left:100;width:100;height:100;background:green'></div>
+    <div style='position:absolute;top:150;left:50;width:100;height:100;background:blue;transform:rotate(45deg);'></div>
+  `, '');
+  var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
+  var nodeTracker = new NodeTracker(dp);
+  dp.DOM.enable();
+  await dp.DOM.getNodeForLocation({x: 100, y: 200});
+
+  for (var nodeId of nodeTracker.nodeIds()) {
+    var message = await dp.DOM.getBoxModel({nodeId});
+    var node = nodeTracker.nodeForId(nodeId);
+    if (message.error)
+      testRunner.log(node.nodeName + ': ' + message.error.message);
+    else
+      testRunner.logObject(message.result.model.content, node.nodeName + ' ' + node.attributes + ' ');
+  }
+  testRunner.completeTest();
+})
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners-expected.txt
index f9c92dc..d64df28 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners-expected.txt
@@ -1,147 +1,144 @@
-A
-B
-C
 
 Fetching listeners for depth = undefined and pierce = undefined
 {
-  "listeners": [
-    {
-      "type": "documentListener",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    }
-  ]
+    listeners : [
+        [0] : {
+            columnNumber : 50
+            lineNumber : 8
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : documentListener
+            useCapture : false
+        }
+    ]
 }
 Fetching listeners for depth = 1 and pierce = undefined
 {
-  "listeners": [
-    {
-      "type": "documentListener",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    }
-  ]
+    listeners : [
+        [0] : {
+            columnNumber : 50
+            lineNumber : 8
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : documentListener
+            useCapture : false
+        }
+    ]
 }
 Fetching listeners for depth = 4 and pierce = undefined
 {
-  "listeners": [
-    {
-      "type": "documentListener",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    },
-    {
-      "type": "listenerA",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    }
-  ]
+    listeners : [
+        [0] : {
+            columnNumber : 50
+            lineNumber : 8
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : documentListener
+            useCapture : false
+        }
+        [1] : {
+            columnNumber : 63
+            lineNumber : 5
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : listenerA
+            useCapture : false
+        }
+    ]
 }
 Fetching listeners for depth = -1 and pierce = undefined
 {
-  "listeners": [
-    {
-      "type": "documentListener",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    },
-    {
-      "type": "listenerA",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    },
-    {
-      "type": "listenerB",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    },
-    {
-      "type": "listenerC",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    }
-  ]
+    listeners : [
+        [0] : {
+            columnNumber : 50
+            lineNumber : 8
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : documentListener
+            useCapture : false
+        }
+        [1] : {
+            columnNumber : 63
+            lineNumber : 5
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : listenerA
+            useCapture : false
+        }
+        [2] : {
+            columnNumber : 63
+            lineNumber : 6
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : listenerB
+            useCapture : false
+        }
+        [3] : {
+            columnNumber : 63
+            lineNumber : 7
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : listenerC
+            useCapture : false
+        }
+    ]
 }
 Fetching listeners for depth = -1 and pierce = true
 {
-  "listeners": [
-    {
-      "type": "documentListener",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    },
-    {
-      "type": "listenerA",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    },
-    {
-      "type": "listenerB",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    },
-    {
-      "type": "listenerC",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    },
-    {
-      "type": "iframeListener",
-      "useCapture": false,
-      "passive": false,
-      "once": false,
-      "scriptId": "<string>",
-      "lineNumber": "<number>",
-      "columnNumber": "<number>"
-    }
-  ]
+    listeners : [
+        [0] : {
+            columnNumber : 50
+            lineNumber : 8
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : documentListener
+            useCapture : false
+        }
+        [1] : {
+            columnNumber : 63
+            lineNumber : 5
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : listenerA
+            useCapture : false
+        }
+        [2] : {
+            columnNumber : 63
+            lineNumber : 6
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : listenerB
+            useCapture : false
+        }
+        [3] : {
+            columnNumber : 63
+            lineNumber : 7
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : listenerC
+            useCapture : false
+        }
+        [4] : {
+            columnNumber : 73
+            lineNumber : 6
+            once : false
+            passive : false
+            scriptId : <scriptId>
+            type : iframeListener
+            useCapture : false
+        }
+    ]
 }
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners.html
deleted file mode 100644
index 93df54a..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    var objectId;
-    InspectorTest.sendCommand("DOM.enable", {});
-    InspectorTest.sendCommand("Runtime.enable", {});
-    InspectorTest.sendCommand("DOMDebugger.enable", {});
-    InspectorTest.sendCommandPromise("Runtime.evaluate", { expression: "document" })
-        .then((result) => { objectId = result.result.result.objectId })
-        .then(() => dumpListeners(objectId))
-        .then(() => dumpListeners(objectId, 1))
-        .then(() => dumpListeners(objectId, 4))
-        .then(() => dumpListeners(objectId, -1))
-        .then(() => dumpListeners(objectId, -1, true))
-        .then(() => InspectorTest.completeTest());
-
-    function dumpListeners(objectId, depth, pierce) {
-        var params = {objectId : objectId};
-        if (depth)
-          params.depth = depth;
-        if (pierce !== undefined)
-          params.pierce = pierce;
-        InspectorTest.log(`Fetching listeners for depth = ${depth} and pierce = ${pierce}`);
-        return InspectorTest.sendCommandPromise("DOMDebugger.getEventListeners", params).then((result) => logResponse(result.result));
-    }
-
-    function stabilize(key, value) {
-        var unstableKeys = ["scriptId", "lineNumber", "columnNumber"];
-        if (unstableKeys.indexOf(key) !== -1)
-            return "<" + typeof(value) + ">";
-        return value;
-    }
-
-    function logResponse(response) {
-        InspectorTest.log(JSON.stringify(response, stabilize, 2));
-    }
-}
-
-</script>
-<template id="shadow-template" onclick="clickTemplate">
-<style>
-:host {
-    color: red;
-}
-</style>
-<div></div><h1>Hi from a template!</h1></div>
-</template>
-</head>
-<body class="body-class" onload="runTest()">
-    <div id="A"> A
-      <div id="B"> B
-        <div id="C"> C
-        </div>
-      </div>
-    </div>
-  
-    <iframe src="../dom/resources/iframe-with-listener.html" width="400" height="200"></iframe>
-    <div id="shadow-host"></div>
-    <script type="text/javascript">
-        var host = document.querySelector("#shadow-host").createShadowRoot();
-        var template = document.querySelector("#shadow-template");
-        host.appendChild(template.content);
-        template.remove();
-        document.getElementById("A").addEventListener("listenerA", () => {});
-        document.getElementById("B").addEventListener("listenerB", () => {});
-        document.getElementById("C").addEventListener("listenerC", () => {});
-        document.addEventListener("documentListener", () => {});
-    </script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners.js
new file mode 100644
index 0000000..77d57ef
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getEventListeners.js
@@ -0,0 +1,53 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <template id='shadow-template' onclick='clickTemplate'>
+    <style>
+    :host {
+        color: red;
+    }
+    </style>
+    <div></div><h1>Hi from a template!</h1></div>
+    </template>
+    </head>
+    <body class='body-class' onload='runTest()'>
+        <div id='A'> A
+          <div id='B'> B
+            <div id='C'> C
+            </div>
+          </div>
+        </div>
+
+        <iframe src='../dom/resources/iframe-with-listener.html' width='400' height='200'></iframe>
+        <div id='shadow-host'></div>
+    </body>
+  `, '');
+
+  await session.evaluate(() => {
+    var host = document.querySelector('#shadow-host').createShadowRoot();
+    var template = document.querySelector('#shadow-template');
+    host.appendChild(template.content);
+    template.remove();
+    document.getElementById('A').addEventListener('listenerA', () => {});
+    document.getElementById('B').addEventListener('listenerB', () => {});
+    document.getElementById('C').addEventListener('listenerC', () => {});
+    document.addEventListener('documentListener', () => {});
+  });
+
+  dp.DOM.enable();
+  dp.Runtime.enable();
+  var result = await dp.Runtime.evaluate({expression: 'document'});
+  var objectId = result.result.result.objectId;
+
+  await dumpListeners(objectId);
+  await dumpListeners(objectId, 1);
+  await dumpListeners(objectId, 4);
+  await dumpListeners(objectId, -1);
+  await dumpListeners(objectId, -1, true);
+  testRunner.completeTest();
+
+  async function dumpListeners(objectId, depth, pierce) {
+    testRunner.log(`Fetching listeners for depth = ${depth} and pierce = ${pierce}`);
+    var {result} = await dp.DOMDebugger.getEventListeners({objectId, depth, pierce});
+    testRunner.logMessage(result);
+  }
+})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument-expected.txt
index 410ea23..f3872528 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument-expected.txt
@@ -1,443 +1,406 @@
-A
-B
-C
-D
-E
 
 {
-  "nodes": [
-    {
-      "nodeId": 4,
-      "parentId": 3,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "SCRIPT",
-      "localName": "script",
-      "nodeValue": "",
-      "childNodeCount": 0,
-      "children": [],
-      "attributes": [
-        "type",
-        "text/javascript",
-        "src",
-        "../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"
-      ]
-    },
-    {
-      "nodeId": 6,
-      "parentId": 5,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": "\n\nfunction test()\n{\n    InspectorTest.sendCommand(\"DOM.enable\", {});\n    InspectorTest.sendCommandOrDie(\"DOM.getFlattenedDocument\", {\"depth\": -1, \"pierce\": true}, onDocument);\n\n    function onDocument(response) {\n        function stabilize(key, value) {\n            var unstableKeys = [\"backendNodeId\", \"documentURL\", \"baseURL\", \"frameId\"];\n            if (unstableKeys.indexOf(key) !== -1)\n                return \"<\" + typeof(value) + \">\";\n            return value;\n        }\n        InspectorTest.log(JSON.stringify(response, stabilize, 2));\n        InspectorTest.completeTest();\n    }\n}\n\n"
-    },
-    {
-      "nodeId": 5,
-      "parentId": 3,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "SCRIPT",
-      "localName": "script",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": []
-    },
-    {
-      "nodeId": 3,
-      "parentId": 2,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "HEAD",
-      "localName": "head",
-      "nodeValue": "",
-      "childNodeCount": 2,
-      "children": [],
-      "attributes": []
-    },
-    {
-      "nodeId": 9,
-      "parentId": 8,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": " A\n      "
-    },
-    {
-      "nodeId": 11,
-      "parentId": 10,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": " B\n        "
-    },
-    {
-      "nodeId": 13,
-      "parentId": 12,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": " C\n          "
-    },
-    {
-      "nodeId": 15,
-      "parentId": 14,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": " D\n            "
-    },
-    {
-      "nodeId": 17,
-      "parentId": 16,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": " E\n            "
-    },
-    {
-      "nodeId": 16,
-      "parentId": 14,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "DIV",
-      "localName": "div",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": [
-        "id",
-        "E"
-      ]
-    },
-    {
-      "nodeId": 14,
-      "parentId": 12,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "DIV",
-      "localName": "div",
-      "nodeValue": "",
-      "childNodeCount": 2,
-      "children": [],
-      "attributes": [
-        "id",
-        "D"
-      ]
-    },
-    {
-      "nodeId": 12,
-      "parentId": 10,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "DIV",
-      "localName": "div",
-      "nodeValue": "",
-      "childNodeCount": 2,
-      "children": [],
-      "attributes": [
-        "id",
-        "C"
-      ]
-    },
-    {
-      "nodeId": 10,
-      "parentId": 8,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "DIV",
-      "localName": "div",
-      "nodeValue": "",
-      "childNodeCount": 2,
-      "children": [],
-      "attributes": [
-        "id",
-        "B"
-      ]
-    },
-    {
-      "nodeId": 8,
-      "parentId": 7,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "DIV",
-      "localName": "div",
-      "nodeValue": "",
-      "childNodeCount": 2,
-      "children": [],
-      "attributes": [
-        "id",
-        "A"
-      ]
-    },
-    {
-      "nodeId": 23,
-      "parentId": 22,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": "\n@font-face {\n  font-family: 'ahem';\n  src: url(../../../resources/Ahem.ttf);\n}\n"
-    },
-    {
-      "nodeId": 22,
-      "parentId": 21,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "STYLE",
-      "localName": "style",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": []
-    },
-    {
-      "nodeId": 21,
-      "parentId": 20,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "HEAD",
-      "localName": "head",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": []
-    },
-    {
-      "nodeId": 26,
-      "parentId": 25,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": "\nHello from the iframe.\n"
-    },
-    {
-      "nodeId": 25,
-      "parentId": 24,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "DIV",
-      "localName": "div",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": [
-        "style",
-        "font-family: ahem;"
-      ]
-    },
-    {
-      "nodeId": 24,
-      "parentId": 20,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "BODY",
-      "localName": "body",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": []
-    },
-    {
-      "nodeId": 20,
-      "parentId": 19,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "HTML",
-      "localName": "html",
-      "nodeValue": "",
-      "childNodeCount": 2,
-      "children": [],
-      "attributes": [],
-      "frameId": "<string>"
-    },
-    {
-      "nodeId": 18,
-      "parentId": 7,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "IFRAME",
-      "localName": "iframe",
-      "nodeValue": "",
-      "childNodeCount": 0,
-      "children": [],
-      "attributes": [
-        "src",
-        "../dom/resources/simple-iframe.html",
-        "width",
-        "400",
-        "height",
-        "200"
-      ],
-      "frameId": "<string>",
-      "contentDocument": {
-        "nodeId": 19,
-        "backendNodeId": "<number>",
-        "nodeType": 9,
-        "nodeName": "#document",
-        "localName": "",
-        "nodeValue": "",
-        "childNodeCount": 1,
-        "children": [],
-        "documentURL": "<string>",
-        "baseURL": "<string>",
-        "xmlVersion": ""
-      }
-    },
-    {
-      "nodeId": 30,
-      "parentId": 29,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": "\n:host {\n    color: red;\n}\n"
-    },
-    {
-      "nodeId": 29,
-      "parentId": 28,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "STYLE",
-      "localName": "style",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": []
-    },
-    {
-      "nodeId": 31,
-      "parentId": 28,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "DIV",
-      "localName": "div",
-      "nodeValue": "",
-      "childNodeCount": 0,
-      "children": [],
-      "attributes": []
-    },
-    {
-      "nodeId": 33,
-      "parentId": 32,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": "Hi from a template!"
-    },
-    {
-      "nodeId": 32,
-      "parentId": 28,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "H1",
-      "localName": "h1",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": []
-    },
-    {
-      "nodeId": 27,
-      "parentId": 7,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "DIV",
-      "localName": "div",
-      "nodeValue": "",
-      "childNodeCount": 0,
-      "children": [],
-      "attributes": [
-        "id",
-        "shadow-host"
-      ],
-      "shadowRoots": [
-        {
-          "nodeId": 28,
-          "backendNodeId": "<number>",
-          "nodeType": 11,
-          "nodeName": "#document-fragment",
-          "localName": "",
-          "nodeValue": "",
-          "childNodeCount": 3,
-          "children": [],
-          "shadowRootType": "open"
+    nodes : [
+        [0] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 0
+            children : [
+            ]
+            localName : head
+            nodeId : <nodeId>
+            nodeName : HEAD
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
         }
-      ]
-    },
-    {
-      "nodeId": 35,
-      "parentId": 34,
-      "backendNodeId": "<number>",
-      "nodeType": 3,
-      "nodeName": "#text",
-      "localName": "",
-      "nodeValue": "\n        var host = document.querySelector(\"#shadow-host\").createShadowRoot();\n        var template = document.querySelector(\"#shadow-template\");\n        host.appendChild(template.content);\n        template.remove();\n        window.onload = runTest;\n    "
-    },
-    {
-      "nodeId": 34,
-      "parentId": 7,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "SCRIPT",
-      "localName": "script",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "attributes": [
-        "type",
-        "text/javascript"
-      ]
-    },
-    {
-      "nodeId": 7,
-      "parentId": 2,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "BODY",
-      "localName": "body",
-      "nodeValue": "",
-      "childNodeCount": 4,
-      "children": [],
-      "attributes": [
-        "class",
-        "body-class"
-      ]
-    },
-    {
-      "nodeId": 2,
-      "parentId": 1,
-      "backendNodeId": "<number>",
-      "nodeType": 1,
-      "nodeName": "HTML",
-      "localName": "html",
-      "nodeValue": "",
-      "childNodeCount": 2,
-      "children": [],
-      "attributes": [],
-      "frameId": "<string>"
-    },
-    {
-      "nodeId": 1,
-      "backendNodeId": "<number>",
-      "nodeType": 9,
-      "nodeName": "#document",
-      "localName": "",
-      "nodeValue": "",
-      "childNodeCount": 1,
-      "children": [],
-      "documentURL": "<string>",
-      "baseURL": "<string>",
-      "xmlVersion": ""
-    }
-  ]
+        [1] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue :  A     
+            parentId : <parentId>
+        }
+        [2] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue :  B       
+            parentId : <parentId>
+        }
+        [3] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue :  C         
+            parentId : <parentId>
+        }
+        [4] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue :  D           
+            parentId : <parentId>
+        }
+        [5] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue :  E           
+            parentId : <parentId>
+        }
+        [6] : {
+            attributes : [
+                [0] : id
+                [1] : E
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 1
+            children : [
+            ]
+            localName : div
+            nodeId : <nodeId>
+            nodeName : DIV
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [7] : {
+            attributes : [
+                [0] : id
+                [1] : D
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 2
+            children : [
+            ]
+            localName : div
+            nodeId : <nodeId>
+            nodeName : DIV
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [8] : {
+            attributes : [
+                [0] : id
+                [1] : C
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 2
+            children : [
+            ]
+            localName : div
+            nodeId : <nodeId>
+            nodeName : DIV
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [9] : {
+            attributes : [
+                [0] : id
+                [1] : B
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 2
+            children : [
+            ]
+            localName : div
+            nodeId : <nodeId>
+            nodeName : DIV
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [10] : {
+            attributes : [
+                [0] : id
+                [1] : A
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 2
+            children : [
+            ]
+            localName : div
+            nodeId : <nodeId>
+            nodeName : DIV
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [11] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue :  @font-face {   font-family: 'ahem';   src: url(../../../resources/Ahem.ttf); } 
+            parentId : <parentId>
+        }
+        [12] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 1
+            children : [
+            ]
+            localName : style
+            nodeId : <nodeId>
+            nodeName : STYLE
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [13] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 1
+            children : [
+            ]
+            localName : head
+            nodeId : <nodeId>
+            nodeName : HEAD
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [14] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue :  Hello from the iframe. 
+            parentId : <parentId>
+        }
+        [15] : {
+            attributes : [
+                [0] : style
+                [1] : font-family: ahem;
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 1
+            children : [
+            ]
+            localName : div
+            nodeId : <nodeId>
+            nodeName : DIV
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [16] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 1
+            children : [
+            ]
+            localName : body
+            nodeId : <nodeId>
+            nodeName : BODY
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [17] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 2
+            children : [
+            ]
+            frameId : <frameId>
+            localName : html
+            nodeId : <nodeId>
+            nodeName : HTML
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [18] : {
+            attributes : [
+                [0] : src
+                [1] : ./simple-iframe.html
+                [2] : width
+                [3] : 400
+                [4] : height
+                [5] : 200
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 0
+            children : [
+            ]
+            contentDocument : {
+                backendNodeId : <backendNodeId>
+                baseURL : <baseURL>
+                childNodeCount : 1
+                children : [
+                ]
+                documentURL : <documentURL>
+                localName : 
+                nodeId : <nodeId>
+                nodeName : #document
+                nodeType : 9
+                nodeValue : 
+                xmlVersion : 
+            }
+            frameId : <frameId>
+            localName : iframe
+            nodeId : <nodeId>
+            nodeName : IFRAME
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [19] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue :  :host {     color: red; } 
+            parentId : <parentId>
+        }
+        [20] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 1
+            children : [
+            ]
+            localName : style
+            nodeId : <nodeId>
+            nodeName : STYLE
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [21] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 0
+            children : [
+            ]
+            localName : div
+            nodeId : <nodeId>
+            nodeName : DIV
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [22] : {
+            backendNodeId : <backendNodeId>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #text
+            nodeType : 3
+            nodeValue : Hi from a template!
+            parentId : <parentId>
+        }
+        [23] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 1
+            children : [
+            ]
+            localName : h1
+            nodeId : <nodeId>
+            nodeName : H1
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [24] : {
+            attributes : [
+                [0] : id
+                [1] : shadow-host
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 0
+            children : [
+            ]
+            localName : div
+            nodeId : <nodeId>
+            nodeName : DIV
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+            shadowRoots : [
+                [0] : {
+                    backendNodeId : <backendNodeId>
+                    childNodeCount : 3
+                    children : [
+                    ]
+                    localName : 
+                    nodeId : <nodeId>
+                    nodeName : #document-fragment
+                    nodeType : 11
+                    nodeValue : 
+                    shadowRootType : open
+                }
+            ]
+        }
+        [25] : {
+            attributes : [
+                [0] : class
+                [1] : body-class
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 3
+            children : [
+            ]
+            localName : body
+            nodeId : <nodeId>
+            nodeName : BODY
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [26] : {
+            attributes : [
+            ]
+            backendNodeId : <backendNodeId>
+            childNodeCount : 2
+            children : [
+            ]
+            frameId : <frameId>
+            localName : html
+            nodeId : <nodeId>
+            nodeName : HTML
+            nodeType : 1
+            nodeValue : 
+            parentId : <parentId>
+        }
+        [27] : {
+            backendNodeId : <backendNodeId>
+            baseURL : <baseURL>
+            childNodeCount : 1
+            children : [
+            ]
+            documentURL : <documentURL>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #document
+            nodeType : 9
+            nodeValue : 
+            xmlVersion : 
+        }
+    ]
 }
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument.html
deleted file mode 100644
index 4172ace..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    InspectorTest.sendCommand("DOM.enable", {});
-    InspectorTest.sendCommandOrDie("DOM.getFlattenedDocument", {"depth": -1, "pierce": true}, onDocument);
-
-    function onDocument(response) {
-        function stabilize(key, value) {
-            var unstableKeys = ["backendNodeId", "documentURL", "baseURL", "frameId"];
-            if (unstableKeys.indexOf(key) !== -1)
-                return "<" + typeof(value) + ">";
-            return value;
-        }
-        InspectorTest.log(JSON.stringify(response, stabilize, 2));
-        InspectorTest.completeTest();
-    }
-}
-
-</script>
-<template id="shadow-template">
-<style>
-:host {
-    color: red;
-}
-</style>
-<div></div><h1>Hi from a template!</h1></div>
-</template>
-</head>
-<body class="body-class">
-    <div id="A"> A
-      <div id="B"> B
-        <div id="C"> C
-          <div id="D"> D
-            <div id="E"> E
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-  
-    <iframe src="../dom/resources/simple-iframe.html" width="400" height="200"></iframe>
-    <div id="shadow-host"></div>
-    <script type="text/javascript">
-        var host = document.querySelector("#shadow-host").createShadowRoot();
-        var template = document.querySelector("#shadow-template");
-        host.appendChild(template.content);
-        template.remove();
-        window.onload = runTest;
-    </script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument.js
new file mode 100644
index 0000000..0226158d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getFlattenedDocument.js
@@ -0,0 +1,15 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startURL('resources/dom-getFlattenedDocument.html', '');
+
+  await session.evaluate(() => {
+    var host = document.querySelector('#shadow-host').createShadowRoot();
+    var template = document.querySelector('#shadow-template');
+    host.appendChild(template.content);
+    template.remove();
+  });
+  dp.DOM.enable();
+  var response = await dp.DOM.getFlattenedDocument({depth: -1, pierce: true});
+  testRunner.logMessage(response.result);
+  testRunner.completeTest();
+})
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-expected.txt
index b081415..fb08317 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-expected.txt
@@ -1,14 +1,16 @@
+
 Node: {
     attributes : [
         [0] : style
         [1] : position:absolute;top:0;left:0;width:100;height:100
     ]
-    backendNodeId : <number>
+    backendNodeId : <backendNodeId>
     childNodeCount : 0
     localName : div
+    nodeId : <nodeId>
     nodeName : DIV
     nodeType : 1
     nodeValue : 
-    parentId : 4
+    parentId : <parentId>
 }
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow-expected.txt
index 55d64d6..6de23ac 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow-expected.txt
@@ -6,21 +6,22 @@
         [2] : style
         [3] : position:absolute;top:0;left:0;width:100;height:100
     ]
-    backendNodeId : <number>
+    backendNodeId : <backendNodeId>
     childNodeCount : 0
     children : [
     ]
     localName : input
+    nodeId : <nodeId>
     nodeName : INPUT
     nodeType : 1
     nodeValue : 
-    parentId : <number>
+    parentId : <parentId>
     shadowRoots : [
         [0] : {
-            backendNodeId : <number>
+            backendNodeId : <backendNodeId>
             childNodeCount : 1
             localName : 
-            nodeId : <number>
+            nodeId : <nodeId>
             nodeName : #document-fragment
             nodeType : 11
             nodeValue : 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.html
deleted file mode 100644
index 90adf48..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    var nodeInfo = {};
-    InspectorTest.eventHandler["DOM.setChildNodes"] = setChildNodes;
-    InspectorTest.sendCommand("DOM.enable", {});
-    InspectorTest.sendCommand("DOM.getNodeForLocation", { "x": 10, "y": 10, "includeUserAgentShadowDOM": false }, onGetNodeForLocation);
-
-    function onGetNodeForLocation(message)
-    {
-        if (message.error) {
-            InspectorTest.log(message.error.message);
-            InspectorTest.completeTest();
-            return;
-        }
-        var nodeId = message.result.nodeId;
-        InspectorTest.logObject(nodeInfo[nodeId], "Node: ", ["backendNodeId", "parentId", "nodeId"]);
-        InspectorTest.completeTest();
-    }
-
-    function setChildNodes(message)
-    {
-        var nodes = message.params.nodes;
-        for (var i = 0; i < nodes.length; ++i) {
-            nodeInfo[nodes[i].nodeId] = nodes[i];
-            delete nodes[i].nodeId;
-        }
-    }
-}
-
-</script>
-</head>
-<body onload="runTest()">
-<form action="#">
-    <input type="text" style="position:absolute;top:0;left:0;width:100;height:100" />
-</form>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.js
new file mode 100644
index 0000000..8d1fa44
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation-skip-shadow.js
@@ -0,0 +1,16 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <form action='#'>
+        <input type='text' style='position:absolute;top:0;left:0;width:100;height:100' />
+    </form>
+  `, '');
+
+  var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
+  var nodeTracker = new NodeTracker(dp);
+
+  dp.DOM.enable();
+  var message = await dp.DOM.getNodeForLocation({x: 10, y: 10, includeUserAgentShadowDOM: false});
+  var nodeId = message.result.nodeId;
+  testRunner.logMessage(nodeTracker.nodeForId(nodeId), 'Node: ');
+  testRunner.completeTest();
+})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation.html
deleted file mode 100644
index 228f7c2..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    var nodeInfo = {};
-    InspectorTest.eventHandler["DOM.setChildNodes"] = setChildNodes;
-    InspectorTest.sendCommand("DOM.enable", {});
-    InspectorTest.sendCommand("DOM.getNodeForLocation", { "x": 10, "y": 10 }, onGetNodeForLocation);
-
-    function onGetNodeForLocation(message)
-    {
-        if (message.error) {
-            InspectorTest.log(message.error.message);
-            InspectorTest.completeTest();
-            return;
-        }
-        var nodeId = message.result.nodeId;
-        InspectorTest.logObject(nodeInfo[nodeId], "Node: ", ["backendNodeId"]);
-        InspectorTest.completeTest();
-    }
-
-    function setChildNodes(message)
-    {
-        var nodes = message.params.nodes;
-        for (var i = 0; i < nodes.length; ++i) {
-            nodeInfo[nodes[i].nodeId] = nodes[i];
-            delete nodes[i].nodeId;
-        }
-    }
-}
-
-</script>
-</head>
-<body onload="runTest()">
-<div style="position:absolute;top:0;left:0;width:100;height:100"></div>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation.js
new file mode 100644
index 0000000..0efa2331
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-getNodeForLocation.js
@@ -0,0 +1,14 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <div style='position:absolute;top:0;left:0;width:100;height:100'></div>
+  `, '');
+  var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
+  var nodeTracker = new NodeTracker(dp);
+
+  dp.DOM.enable();
+  var response = await dp.DOM.getNodeForLocation({x: 10, y: 10});
+  var nodeId = response.result.nodeId;
+  testRunner.logMessage(nodeTracker.nodeForId(nodeId), 'Node: ');
+  testRunner.completeTest();
+})
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified-expected.txt
index 7eaa259..aa5f32d88 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified-expected.txt
@@ -1,6 +1,5 @@
 Test that DOM events have correct parameters for attribute with namespace in XML document.
 
-
 Changing attribute...
 Modified attribute: 'xlink:href'='changed-url'
 Removing attribute...
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified.html
deleted file mode 100644
index a416efa..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-function test()
-{
-    var rootNodeId;
-
-    InspectorTest.sendCommand("DOM.getDocument", {}, onGotDocument);
-
-    function onGotDocument(msg)
-    {
-        rootNodeId = msg.result.root.nodeId;
-        getMainNodeId();
-    }
-
-    function getMainNodeId(next)
-    {
-        InspectorTest.sendCommand("DOM.querySelector", { "nodeId": rootNodeId, "selector": "#main" }, onMainNodeLoaded);
-    }
-
-    function onMainNodeLoaded()
-    {
-        InspectorTest.log("");
-        InspectorTest.log("Changing attribute...");
-        InspectorTest.eventHandler["DOM.attributeModified"] = onAttributeModified;
-        var expression = "";
-        expression += "var element = document.getElementById('main');\n";
-        expression += "element.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', 'changed-url');\n";
-        InspectorTest.sendCommand("Runtime.evaluate", { expression: expression });
-    }
-
-    function onAttributeModified(msg)
-    {
-        var result = msg.params;
-        InspectorTest.log("Modified attribute: '" + result.name + "'='" + result.value + "'");
-
-        InspectorTest.log("Removing attribute...");
-        InspectorTest.eventHandler["DOM.attributeRemoved"] = onAttributeRemoved;
-        var expression = "";
-        expression += "var element = document.getElementById('main');\n";
-        expression += "element.removeAttribute('xlink:href', 'changed-url');\n";
-        InspectorTest.sendCommand("Runtime.evaluate", { expression: expression });
-    }
-
-    function onAttributeRemoved(msg)
-    {
-        var result = msg.params;
-        InspectorTest.log("Removed attribute: '" + result.name + "'");
-        InspectorTest.completeTest();
-    }
-}
-</script>
-</head>
-<body onload="runTest()">
-<p>Test that DOM events have correct parameters for attribute with namespace in XML document.</p>
-<svg>
-    <a id="main" xlink:href="http://localhost">link</a>
-</svg>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified.js
new file mode 100644
index 0000000..db45839
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-ns-attr-modified.js
@@ -0,0 +1,30 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <svg>
+        <a id='main' xlink:href='http://localhost'>link</a>
+    </svg>
+  `, 'Test that DOM events have correct parameters for attribute with namespace in XML document.');
+
+  var response = await dp.DOM.getDocument();
+  await dp.DOM.querySelector({nodeId: response.result.root.nodeId, selector: '#main'});
+
+  testRunner.log('\nChanging attribute...');
+  session.evaluate(() => {
+    var element = document.getElementById('main');
+    element.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', 'changed-url');
+  });
+  var msg = await dp.DOM.onceAttributeModified();
+  var result = msg.params;
+  testRunner.log(`Modified attribute: '${result.name}'='${result.value}'`);
+
+  testRunner.log('Removing attribute...');
+  session.evaluate(() => {
+    var element = document.getElementById('main');
+    element.removeAttribute('xlink:href', 'changed-url');
+  });
+  msg = await dp.DOM.onceAttributeRemoved();
+  var result = msg.params;
+  testRunner.log(`Removed attribute: '${result.name}'`);
+  testRunner.completeTest();
+});
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary-expected.txt
index b06e3d4f..3134f64 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary-expected.txt
@@ -1,3 +1,4 @@
+
 Relayout boundary for div#outer is: html
 Relayout boundary for div#boundary is: div#boundary
 Relayout boundary for div#inner is: div#boundary
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary.html
deleted file mode 100644
index acfdc7c..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary.html
+++ /dev/null
@@ -1,137 +0,0 @@
-<html>
-<head>
-<style>
-.relayout-boundary {
-    width: 200px;
-    height: 40px;
-    overflow: hidden;
-}
-
-</style>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script type="text/javascript">
-
-function test()
-{
-    var nodeByIdAttribute = {};
-    var nodeById = {};
-
-    getDocument();
-
-    function getAttribute(node, attribute)
-    {
-        if (!node.attributes)
-            return;
-        for (var i = 0; i < node.attributes.length; i += 2) {
-            if (node.attributes[i] === attribute)
-                return node.attributes[i + 1];
-        }
-    }
-
-    function nodeLabel(node)
-    {
-        var result = node.localName;
-        var id = getAttribute(node, "id");
-        if (id)
-            result += "#" + id;
-        return result;
-    }
-
-    function addNode(node)
-    {
-        nodeById[node.nodeId] = node;
-        var idAttribute = getAttribute(node, "id");
-        if (idAttribute)
-            nodeByIdAttribute[idAttribute] = node;
-        if (node.children)
-            addNodes(node.children);
-    }
-
-    function addNodes(nodes)
-    {
-        nodes.forEach(addNode);
-    }
-
-    InspectorTest.eventHandler["DOM.setChildNodes"] = function setChildNodes(messageObject)
-    {
-        addNodes(messageObject.params.nodes);
-    };
-
-    function getDocument()
-    {
-        // We must first get the document so that later on we may get sensible nodeIds.
-        step({
-            command: "DOM.getDocument",
-            parameters: {},
-            callback: getAllNodes
-        });
-    };
-
-    function getAllNodes(error, result)
-    {
-        addNode(result.root);
-        step({
-            command: "DOM.requestChildNodes",
-            parameters: {"nodeId": result.root.nodeId, "depth": -1},
-            callback: dumpRelayoutBoundary.bind(this, 0)
-        });
-    };
-
-    var nodeIdsToTest = [
-        "outer",
-        "boundary",
-        "inner",
-        "hidden"
-    ];
-
-    function dumpRelayoutBoundary(nextId)
-    {
-        if (nextId >= nodeIdsToTest.length) {
-            InspectorTest.completeTest();
-            return;
-        }
-        var node = nodeByIdAttribute[nodeIdsToTest[nextId]];
-        function dumpResultsAndContinue(error, result)
-        {
-            var text;
-            if (error) {
-                text = error;
-            } else {
-                var boundaryNode = nodeById[result.nodeId];
-                text = boundaryNode ? nodeLabel(boundaryNode) : "null";
-            }
-            InspectorTest.log("Relayout boundary for " + nodeLabel(node) + " is: " + text);
-            dumpRelayoutBoundary(nextId + 1);
-        }
-        step({
-            command: "DOM.getRelayoutBoundary",
-            parameters: {"nodeId": node.nodeId},
-            callback: dumpResultsAndContinue
-        });
-    }
-
-    function step(test)
-    {
-        InspectorTest.sendCommand(test.command, test.parameters, function(messageObject) {
-            if (test.callback)
-                test.callback(messageObject.error && messageObject.error.message, messageObject.result);
-        });
-    };
-    setTimeout(InspectorTest.completeTest.bind(InspectorTest), 3400);
-};
-
-window.addEventListener("DOMContentLoaded", function () {
-    runTest();
-}, false);
-</script>
-</head>
-<body>
-<div id="outer"></div>
-<div class="relayout-boundary" id="boundary">
-    <div id="inner"></div>
-    <div style="display: none">
-        <div id="hidden"></div>
-    </div>
-</div>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary.js
new file mode 100644
index 0000000..147ffa9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-relayout-boundary.js
@@ -0,0 +1,57 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <head>
+      <style>
+      .relayout-boundary {
+          width: 200px;
+          height: 40px;
+          overflow: hidden;
+      }
+      </style>
+    </head>
+    <body>
+    <div id='outer'></div>
+    <div class='relayout-boundary' id='boundary'>
+        <div id='inner'></div>
+        <div style='display: none'>
+            <div id='hidden'></div>
+        </div>
+    </div>
+    </body>
+  `, '');
+
+  var DOMHelper = await testRunner.loadScript('../resources/dom-helper.js');
+  var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
+  var nodeTracker = new NodeTracker(dp);
+  var response = await dp.DOM.getDocument();
+  nodeTracker.addDocumentNode(response.result.root);
+  await dp.DOM.requestChildNodes({nodeId: response.result.root.nodeId, depth: -1});
+
+  var nodeByIdAttribute = {};
+  for (var node of nodeTracker.nodes())
+    nodeByIdAttribute[DOMHelper.attributes(node).get('id')] = node;
+
+  await dumpRelayoutBoundary(nodeByIdAttribute['outer']);
+  await dumpRelayoutBoundary(nodeByIdAttribute['boundary']);
+  await dumpRelayoutBoundary(nodeByIdAttribute['inner']);
+  await dumpRelayoutBoundary(nodeByIdAttribute['hidden']);
+  testRunner.completeTest();
+
+  function nodeLabel(node) {
+    var result = node.localName;
+    var id = DOMHelper.attributes(node).get('id');
+    return result + (id ? '#' + id : '');
+  }
+
+  async function dumpRelayoutBoundary(node) {
+    var response = await dp.DOM.getRelayoutBoundary({nodeId: node.nodeId});
+    var text;
+    if (response.error) {
+      text = response.error.message;
+    } else {
+      var boundaryNode = nodeTracker.nodeForId(response.result.nodeId);
+      text = boundaryNode ? nodeLabel(boundaryNode) : 'null';
+    }
+    testRunner.log('Relayout boundary for ' + nodeLabel(node) + ' is: ' + text);
+  }
+});
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth-expected.txt
index 7944630..bd4942a1 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth-expected.txt
@@ -1,4 +1,5 @@
 
+
 === Get the Document ===
 
 
@@ -21,5 +22,4 @@
 
 Backend error: Please provide a positive integer as a depth or -1 for entire subtree (-32000)
 
-PASS: Expected number of setChildNodes events
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth.html
deleted file mode 100644
index 4d5bed2..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth.html
+++ /dev/null
@@ -1,165 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script type="text/javascript">
-
-function test()
-{
-    var firstDiv;
-    var eventsCount = 0;
-
-    getDocument();
-
-    InspectorTest.eventHandler["DOM.setChildNodes"] = function setChildNodes(messageObject)
-    {
-        eventsCount++;
-
-        if (eventsCount === 1)
-            gotImmediateChildren(messageObject);
-        else if (eventsCount === 2)
-            gotAdditionalChildren(messageObject);
-        else if (eventsCount === 3)
-            gotAllChildren(messageObject);
-        else
-            InspectorTest.log(JSON.stringify(messageObject, null, "    "));
-    };
-    
-    function getDocument()
-    {
-        // We must first get the document so that later on we may get sensible nodeIds.
-        step({
-            name: "Get the Document",
-            command: "DOM.getDocument",
-            parameters: {},
-            callback: getImmediateChildren
-        });
-    };
-
-    function getImmediateChildren(result)
-    {
-        var bodyId = result.root.children[0].children[1].nodeId;
-        step({
-            name: "Get immediate children of the body",
-            command: "DOM.requestChildNodes",
-            parameters: {"nodeId": bodyId}
-        });
-    };
-
-    function gotImmediateChildren(messageObject)
-    {
-        firstDiv = messageObject.params.nodes[0];
-        assert("First child is a div", firstDiv.localName, "div");
-        assert("First child is div#depth-1", firstDiv.attributes[1], "depth-1");
-        assert("First child has one child", firstDiv.childNodeCount, 1);
-        assert("First child has no .children property", firstDiv.children, undefined);
-
-        step({
-            name: "Get children of div#depth-1 three levels deep",
-            command: "DOM.requestChildNodes",
-            parameters: {"nodeId": firstDiv.nodeId, "depth": 3}
-        });
-    };
-
-    function gotAdditionalChildren(messageObject)
-    {
-        var depth = 1;
-        var firstChild = messageObject.params.nodes[0];
-        var node = firstChild;
-        while (node && node.children) {
-            depth++;
-            node = node.children[0];
-        }
-
-        assert("div#depth-1 has nodes 3 levels deep", depth, 3);
-
-        step({
-            name: "Get all children of body",
-            command: "DOM.requestChildNodes",
-            parameters: {"nodeId": firstDiv.nodeId, "depth": -1}
-        });
-    };
-
-    function gotAllChildren(messageObject)
-    {
-        var depth = 0;
-        var firstChild = messageObject.params.nodes[0];
-        var node = firstChild;
-        while (node && node.children) {
-            depth++;
-            node = node.children[0];
-        }
-
-        // We have requested nodes 3-level deep so far, so
-        // we should have gotten an additional 6 levels of depth.
-        assert("div#depth-1 has nodes 9 levels deep", depth, 6);
-
-        step({
-            name: "Pass an invalid depth",
-            command: "DOM.requestChildNodes",
-            parameters: {"nodeId": firstDiv.nodeId, "depth": 0},
-            callback: finishTest
-        });
-    };
-    
-    function finishTest()
-    {
-        assert("Expected number of setChildNodes events", eventsCount, 3);
-        
-        InspectorTest.completeTest();
-    };
-
-    function step(test)
-    {
-        InspectorTest.log("\n=== " + test.name + " ===\n");
-        InspectorTest.sendCommand(test.command, test.parameters, function(messageObject) {
-            if (messageObject.hasOwnProperty("error"))
-                InspectorTest.log("Backend error: " + messageObject.error.message + " (" + messageObject.error.code + ")\n");
-
-            if (test.callback)
-                test.callback(messageObject.result);
-        });
-    };
-
-    function assert(message, actual, expected)
-    {
-        if (actual === expected)
-            InspectorTest.log("PASS: " + message);
-        else {
-            InspectorTest.log("FAIL: " + message + ", expected \"" + expected + "\" but got \"" + actual + "\"");
-            InspectorTest.completeTest();
-        }
-    };
-
-};
-
-window.addEventListener("DOMContentLoaded", function () {
-    runTest();
-}, false);
-
-</script>
-</head>
-<body>
-
-<div id="depth-1">
-    <div id="depth-2">
-        <div id="depth-3">
-            <div id="depth-4">
-                <div id="depth-5">
-                    <div id="depth-6">
-                        <div id="depth-7">
-                            <div id="depth-8">
-                                <div id="depth-9">
-                                    <div id="depth-10">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth.js
new file mode 100644
index 0000000..4d43543d3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-depth.js
@@ -0,0 +1,78 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <div id="depth-1">
+        <div id="depth-2">
+            <div id="depth-3">
+                <div id="depth-4">
+                    <div id="depth-5">
+                        <div id="depth-6">
+                            <div id="depth-7">
+                                <div id="depth-8">
+                                    <div id="depth-9">
+                                        <div id="depth-10">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+  `, '');
+  testRunner.log("\n=== Get the Document ===\n");
+  var response = await dp.DOM.getDocument();
+  var bodyId = response.result.root.children[0].children[1].nodeId;
+
+  testRunner.log("\n=== Get immediate children of the body ===\n");
+  dp.DOM.requestChildNodes({nodeId: bodyId});
+  var message = await dp.DOM.onceSetChildNodes();
+  var firstDiv = message.params.nodes[0];
+  assert("First child is a div", firstDiv.localName, "div");
+  assert("First child is div#depth-1", firstDiv.attributes[1], "depth-1");
+  assert("First child has one child", firstDiv.childNodeCount, 1);
+  assert("First child has no .children property", firstDiv.children, undefined);
+
+  testRunner.log("\n=== Get children of div#depth-1 three levels deep ===\n");
+  dp.DOM.requestChildNodes({nodeId: firstDiv.nodeId, depth: 3});
+  var message = await dp.DOM.onceSetChildNodes();
+  var depth = 1;
+  var firstChild = message.params.nodes[0];
+  var node = firstChild;
+  while (node && node.children) {
+    depth++;
+    node = node.children[0];
+  }
+  assert("div#depth-1 has nodes 3 levels deep", depth, 3);
+
+  testRunner.log("\n=== Get all children of body ===\n");
+  dp.DOM.requestChildNodes({nodeId: firstDiv.nodeId, depth: -1});
+  var message = await dp.DOM.onceSetChildNodes();
+  var depth = 0;
+  var firstChild = message.params.nodes[0];
+  var node = firstChild;
+  while (node && node.children) {
+    depth++;
+    node = node.children[0];
+  }
+  // We have requested nodes 3-level deep so far, so
+  // we should have gotten an additional 6 levels of depth.
+  assert("div#depth-1 has nodes 9 levels deep", depth, 6);
+
+  testRunner.log("\n=== Pass an invalid depth ===\n");
+  var response = await dp.DOM.requestChildNodes({nodeId: firstDiv.nodeId, depth: 0});
+  if (response.error)
+    testRunner.log("Backend error: " + response.error.message + " (" + response.error.code + ")\n");
+  testRunner.completeTest();
+
+  function assert(message, actual, expected) {
+    if (actual === expected) {
+      testRunner.log("PASS: " + message);
+    } else {
+      testRunner.log("FAIL: " + message + ", expected \"" + expected + "\" but got \"" + actual + "\"");
+      testRunner.completeTest();
+    }
+  };
+});
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames-expected.txt
index 5202c3a..ab12676 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames-expected.txt
@@ -1,142 +1,148 @@
 
 {
-    "method": "DOM.setChildNodes",
-    "params": {
-        "parentId": 13,
-        "nodes": [
-            {
-                "nodeId": 14,
-                "parentId": 13,
-                "backendNodeId": "<number>",
-                "nodeType": 1,
-                "nodeName": "DIV",
-                "localName": "div",
-                "nodeValue": "",
-                "childNodeCount": 1,
-                "children": [
-                    {
-                        "nodeId": 15,
-                        "parentId": 14,
-                        "backendNodeId": "<number>",
-                        "nodeType": 1,
-                        "nodeName": "DIV",
-                        "localName": "div",
-                        "nodeValue": "",
-                        "childNodeCount": 1,
-                        "children": [
-                            {
-                                "nodeId": 16,
-                                "parentId": 15,
-                                "backendNodeId": "<number>",
-                                "nodeType": 1,
-                                "nodeName": "DIV",
-                                "localName": "div",
-                                "nodeValue": "",
-                                "childNodeCount": 1,
-                                "children": [
-                                    {
-                                        "nodeId": 17,
-                                        "parentId": 16,
-                                        "backendNodeId": "<number>",
-                                        "nodeType": 1,
-                                        "nodeName": "IFRAME",
-                                        "localName": "iframe",
-                                        "nodeValue": "",
-                                        "childNodeCount": 0,
-                                        "children": [],
-                                        "attributes": [
-                                            "src",
-                                            "resources/iframe.html"
-                                        ],
-                                        "frameId": "???",
-                                        "contentDocument": {
-                                            "nodeId": 18,
-                                            "backendNodeId": "<number>",
-                                            "nodeType": 9,
-                                            "nodeName": "#document",
-                                            "localName": "",
-                                            "nodeValue": "",
-                                            "childNodeCount": 1,
-                                            "children": [
-                                                {
-                                                    "nodeId": 19,
-                                                    "parentId": 18,
-                                                    "backendNodeId": "<number>",
-                                                    "nodeType": 1,
-                                                    "nodeName": "HTML",
-                                                    "localName": "html",
-                                                    "nodeValue": "",
-                                                    "childNodeCount": 2,
-                                                    "children": [
-                                                        {
-                                                            "nodeId": 20,
-                                                            "parentId": 19,
-                                                            "backendNodeId": "<number>",
-                                                            "nodeType": 1,
-                                                            "nodeName": "HEAD",
-                                                            "localName": "head",
-                                                            "nodeValue": "",
-                                                            "childNodeCount": 0,
-                                                            "children": [],
-                                                            "attributes": []
-                                                        },
-                                                        {
-                                                            "nodeId": 21,
-                                                            "parentId": 19,
-                                                            "backendNodeId": "<number>",
-                                                            "nodeType": 1,
-                                                            "nodeName": "BODY",
-                                                            "localName": "body",
-                                                            "nodeValue": "",
-                                                            "childNodeCount": 1,
-                                                            "children": [
-                                                                {
-                                                                    "nodeId": 22,
-                                                                    "parentId": 21,
-                                                                    "backendNodeId": "<number>",
-                                                                    "nodeType": 1,
-                                                                    "nodeName": "DIV",
-                                                                    "localName": "div",
-                                                                    "nodeValue": "",
-                                                                    "childNodeCount": 0,
-                                                                    "children": [],
-                                                                    "attributes": [
-                                                                        "id",
-                                                                        "element_in_an_iframe"
-                                                                    ]
-                                                                }
-                                                            ],
-                                                            "attributes": []
-                                                        }
-                                                    ],
-                                                    "attributes": [],
-                                                    "frameId": "???"
-                                                }
-                                            ],
-                                            "documentURL": "???",
-                                            "baseURL": "???",
-                                            "xmlVersion": ""
-                                        }
-                                    }
-                                ],
-                                "attributes": [
-                                    "id",
-                                    "depth-3"
-                                ]
-                            }
-                        ],
-                        "attributes": [
-                            "id",
-                            "depth-2"
-                        ]
-                    }
-                ],
-                "attributes": [
-                    "id",
-                    "depth-1"
+    method : DOM.setChildNodes
+    params : {
+        nodes : [
+            [0] : {
+                attributes : [
+                    [0] : id
+                    [1] : depth-1
                 ]
+                backendNodeId : <backendNodeId>
+                childNodeCount : 1
+                children : [
+                    [0] : {
+                        attributes : [
+                            [0] : id
+                            [1] : depth-2
+                        ]
+                        backendNodeId : <backendNodeId>
+                        childNodeCount : 1
+                        children : [
+                            [0] : {
+                                attributes : [
+                                    [0] : id
+                                    [1] : depth-3
+                                ]
+                                backendNodeId : <backendNodeId>
+                                childNodeCount : 1
+                                children : [
+                                    [0] : {
+                                        attributes : [
+                                            [0] : src
+                                            [1] : iframe.html
+                                        ]
+                                        backendNodeId : <backendNodeId>
+                                        childNodeCount : 0
+                                        children : [
+                                        ]
+                                        contentDocument : {
+                                            backendNodeId : <backendNodeId>
+                                            baseURL : <baseURL>
+                                            childNodeCount : 1
+                                            children : [
+                                                [0] : {
+                                                    attributes : [
+                                                    ]
+                                                    backendNodeId : <backendNodeId>
+                                                    childNodeCount : 2
+                                                    children : [
+                                                        [0] : {
+                                                            attributes : [
+                                                            ]
+                                                            backendNodeId : <backendNodeId>
+                                                            childNodeCount : 0
+                                                            children : [
+                                                            ]
+                                                            localName : head
+                                                            nodeId : <nodeId>
+                                                            nodeName : HEAD
+                                                            nodeType : 1
+                                                            nodeValue : 
+                                                            parentId : <parentId>
+                                                        }
+                                                        [1] : {
+                                                            attributes : [
+                                                            ]
+                                                            backendNodeId : <backendNodeId>
+                                                            childNodeCount : 1
+                                                            children : [
+                                                                [0] : {
+                                                                    attributes : [
+                                                                        [0] : id
+                                                                        [1] : element_in_an_iframe
+                                                                    ]
+                                                                    backendNodeId : <backendNodeId>
+                                                                    childNodeCount : 0
+                                                                    children : [
+                                                                    ]
+                                                                    localName : div
+                                                                    nodeId : <nodeId>
+                                                                    nodeName : DIV
+                                                                    nodeType : 1
+                                                                    nodeValue : 
+                                                                    parentId : <parentId>
+                                                                }
+                                                            ]
+                                                            localName : body
+                                                            nodeId : <nodeId>
+                                                            nodeName : BODY
+                                                            nodeType : 1
+                                                            nodeValue : 
+                                                            parentId : <parentId>
+                                                        }
+                                                    ]
+                                                    frameId : <frameId>
+                                                    localName : html
+                                                    nodeId : <nodeId>
+                                                    nodeName : HTML
+                                                    nodeType : 1
+                                                    nodeValue : 
+                                                    parentId : <parentId>
+                                                }
+                                            ]
+                                            documentURL : <documentURL>
+                                            localName : 
+                                            nodeId : <nodeId>
+                                            nodeName : #document
+                                            nodeType : 9
+                                            nodeValue : 
+                                            xmlVersion : 
+                                        }
+                                        frameId : <frameId>
+                                        localName : iframe
+                                        nodeId : <nodeId>
+                                        nodeName : IFRAME
+                                        nodeType : 1
+                                        nodeValue : 
+                                        parentId : <parentId>
+                                    }
+                                ]
+                                localName : div
+                                nodeId : <nodeId>
+                                nodeName : DIV
+                                nodeType : 1
+                                nodeValue : 
+                                parentId : <parentId>
+                            }
+                        ]
+                        localName : div
+                        nodeId : <nodeId>
+                        nodeName : DIV
+                        nodeType : 1
+                        nodeValue : 
+                        parentId : <parentId>
+                    }
+                ]
+                localName : div
+                nodeId : <nodeId>
+                nodeName : DIV
+                nodeType : 1
+                nodeValue : 
+                parentId : <parentId>
             }
         ]
+        parentId : <parentId>
     }
 }
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames.html
deleted file mode 100644
index 60dd438..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames.html
+++ /dev/null
@@ -1,106 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script type="text/javascript">
-
-function test()
-{
-    getDocument();
-
-    function getDocument()
-    {
-        InspectorTest.sendCommand("DOM.getDocument", {}, function(messageObject) {
-            if (messageObject.hasOwnProperty("error"))
-                InspectorTest.log("Backend error: " + messageObject.error.message + " (" + messageObject.error.code + ")\n");
-
-            var bodyId = messageObject.result.root.children[0].children[1].nodeId;
-            requestChildNodes(bodyId);
-        });
-    };
-
-    function requestChildNodes(bodyId)
-    {
-        InspectorTest.sendCommand("DOM.requestChildNodes", {"nodeId": bodyId, "depth": -1}, function(messageObject) {
-            if (messageObject.hasOwnProperty("error"))
-                InspectorTest.log("Backend error: " + messageObject.error.message + " (" + messageObject.error.code + ")\n");
-        });
-
-        InspectorTest.eventHandler["DOM.setChildNodes"] = function(messageObject)
-        {
-            var iframeContentDocument = messageObject.params.nodes[0].children[0].children[0].children[0].contentDocument;
-            if (iframeContentDocument.children) {
-                InspectorTest.log("Error IFrame node should not include children: " + JSON.stringify(iframeContentDocument, null, "    "));
-                InspectorTest.completeTest();
-            } else {
-                getDocumentIncludingIframe();
-            }
-        };
-    };
-
-    function getDocumentIncludingIframe()
-    {
-        InspectorTest.sendCommand("DOM.getDocument", {"pierce": true}, function(messageObject) {
-            if (messageObject.hasOwnProperty("error"))
-                InspectorTest.log("Backend error: " + messageObject.error.message + " (" + messageObject.error.code + ")\n");
-
-            var bodyId = messageObject.result.root.children[0].children[1].nodeId;
-            requestAllChildNodesIncludingIframe(bodyId);
-        });
-    };
-
-    function replacePropertyRecursive(object, propertyNameToReplace)
-    {
-        for (var propertyName in object) {
-            if (!object.hasOwnProperty(propertyName))
-                continue;
-            if (propertyName === propertyNameToReplace) {
-                object[propertyName] = "???";
-            } else if (typeof object[propertyName] === "object") {
-                replacePropertyRecursive(object[propertyName], propertyNameToReplace);
-            }
-        }
-    }
-
-    function requestAllChildNodesIncludingIframe(bodyId)
-    {
-        InspectorTest.sendCommand("DOM.requestChildNodes", {"nodeId": bodyId, "depth": -1, "pierce": true}, function(messageObject) {
-            if (messageObject.hasOwnProperty("error"))
-                InspectorTest.log("Backend error: " + messageObject.error.message + " (" + messageObject.error.code + ")\n");
-        });
-
-        InspectorTest.eventHandler["DOM.setChildNodes"] = function(messageObject)
-        {
-            // Replace properties that tend to change every run.
-            replacePropertyRecursive(messageObject, "frameId");
-            replacePropertyRecursive(messageObject, "documentURL");
-            replacePropertyRecursive(messageObject, "baseURL");
-            function stabilize(key, value) {
-                var unstableKeys = ["backendNodeId"];
-                if (unstableKeys.indexOf(key) !== -1)
-                    return "<" + typeof(value) + ">";
-                return value;
-            }
-            InspectorTest.log(JSON.stringify(messageObject, stabilize, "    "));
-            InspectorTest.completeTest();
-        };
-    };
-};
-
-window.addEventListener("DOMContentLoaded", function () {
-    runTest();
-}, false);
-
-</script>
-</head>
-<body>
-
-<div id="depth-1">
-    <div id="depth-2">
-        <div id="depth-3">
-            <iframe src="resources/iframe.html"></iframe>
-        </div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames.js
new file mode 100644
index 0000000..01db208
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-child-nodes-traverse-frames.js
@@ -0,0 +1,20 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startURL('resources/dom-request-child-nodes-traverse-frames.html', '');
+
+  var response = await dp.DOM.getDocument();
+  var rootId = response.result.root.children[0].children[1].nodeId;
+  dp.DOM.requestChildNodes({nodeId: rootId, depth: -1});
+  var message = await dp.DOM.onceSetChildNodes();
+  var iframeContentDocument = message.params.nodes[0].children[0].children[0].children[0].contentDocument;
+  if (iframeContentDocument.children) {
+    testRunner.die("Error IFrame node should not include children: " + JSON.stringify(iframeContentDocument, null, "    "));
+    return;
+  }
+  var message = await dp.DOM.getDocument({pierce: true});
+  var bodyId = message.result.root.children[0].children[1].nodeId;
+  dp.DOM.requestChildNodes({nodeId: bodyId, depth: -1, pierce: true});
+  var message = await dp.DOM.onceSetChildNodes();
+
+  testRunner.logMessage(message);
+  testRunner.completeTest();
+});
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes-expected.txt
index 218da00..ff1d5575 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes-expected.txt
@@ -1,239 +1,296 @@
 
 {
-    "nodeId": 20,
-    "parentId": 15,
-    "backendNodeId": "<number>",
-    "nodeType": 1,
-    "nodeName": "BODY",
-    "localName": "body",
-    "nodeValue": "",
-    "childNodeCount": 1,
-    "children": [
-        {
-            "nodeId": 21,
-            "parentId": 20,
-            "backendNodeId": "<number>",
-            "nodeType": 1,
-            "nodeName": "DIV",
-            "localName": "div",
-            "nodeValue": "",
-            "childNodeCount": 2,
-            "children": [
-                {
-                    "nodeId": 22,
-                    "parentId": 21,
-                    "backendNodeId": "<number>",
-                    "nodeType": 1,
-                    "nodeName": "DIV",
-                    "localName": "div",
-                    "nodeValue": "",
-                    "childNodeCount": 1,
-                    "children": [
-                        {
-                            "nodeId": 23,
-                            "parentId": 22,
-                            "backendNodeId": "<number>",
-                            "nodeType": 1,
-                            "nodeName": "DIV",
-                            "localName": "div",
-                            "nodeValue": "",
-                            "childNodeCount": 1,
-                            "children": [
-                                {
-                                    "nodeId": 24,
-                                    "parentId": 23,
-                                    "backendNodeId": "<number>",
-                                    "nodeType": 1,
-                                    "nodeName": "IFRAME",
-                                    "localName": "iframe",
-                                    "nodeValue": "",
-                                    "childNodeCount": 0,
-                                    "children": [],
-                                    "attributes": [
-                                        "src",
-                                        "resources/shadow-dom-iframe.html"
-                                    ],
-                                    "frameId": "???",
-                                    "contentDocument": {
-                                        "nodeId": 25,
-                                        "backendNodeId": "<number>",
-                                        "nodeType": 9,
-                                        "nodeName": "#document",
-                                        "localName": "",
-                                        "nodeValue": "",
-                                        "childNodeCount": 1,
-                                        "children": [
-                                            {
-                                                "nodeId": 26,
-                                                "parentId": 25,
-                                                "backendNodeId": "<number>",
-                                                "nodeType": 1,
-                                                "nodeName": "HTML",
-                                                "localName": "html",
-                                                "nodeValue": "",
-                                                "childNodeCount": 2,
-                                                "children": [
-                                                    {
-                                                        "nodeId": 27,
-                                                        "parentId": 26,
-                                                        "backendNodeId": "<number>",
-                                                        "nodeType": 1,
-                                                        "nodeName": "HEAD",
-                                                        "localName": "head",
-                                                        "nodeValue": "",
-                                                        "childNodeCount": 0,
-                                                        "children": [],
-                                                        "attributes": []
-                                                    },
-                                                    {
-                                                        "nodeId": 28,
-                                                        "parentId": 26,
-                                                        "backendNodeId": "<number>",
-                                                        "nodeType": 1,
-                                                        "nodeName": "BODY",
-                                                        "localName": "body",
-                                                        "nodeValue": "",
-                                                        "childNodeCount": 2,
-                                                        "children": [
-                                                            {
-                                                                "nodeId": 29,
-                                                                "parentId": 28,
-                                                                "backendNodeId": "<number>",
-                                                                "nodeType": 1,
-                                                                "nodeName": "DIV",
-                                                                "localName": "div",
-                                                                "nodeValue": "",
-                                                                "childNodeCount": 0,
-                                                                "children": [],
-                                                                "attributes": [
-                                                                    "id",
-                                                                    "element_in_an_iframe"
-                                                                ],
-                                                                "shadowRoots": [
-                                                                    {
-                                                                        "nodeId": 30,
-                                                                        "backendNodeId": "<number>",
-                                                                        "nodeType": 11,
-                                                                        "nodeName": "#document-fragment",
-                                                                        "localName": "",
-                                                                        "nodeValue": "",
-                                                                        "childNodeCount": 1,
-                                                                        "children": [
-                                                                            {
-                                                                                "nodeId": 31,
-                                                                                "parentId": 30,
-                                                                                "backendNodeId": "<number>",
-                                                                                "nodeType": 1,
-                                                                                "nodeName": "DIV",
-                                                                                "localName": "div",
-                                                                                "nodeValue": "",
-                                                                                "childNodeCount": 1,
-                                                                                "children": [
-                                                                                    {
-                                                                                        "nodeId": 32,
-                                                                                        "parentId": 31,
-                                                                                        "backendNodeId": "<number>",
-                                                                                        "nodeType": 1,
-                                                                                        "nodeName": "H1",
-                                                                                        "localName": "h1",
-                                                                                        "nodeValue": "",
-                                                                                        "childNodeCount": 1,
-                                                                                        "children": [
-                                                                                            {
-                                                                                                "nodeId": 33,
-                                                                                                "parentId": 32,
-                                                                                                "backendNodeId": "<number>",
-                                                                                                "nodeType": 3,
-                                                                                                "nodeName": "#text",
-                                                                                                "localName": "",
-                                                                                                "nodeValue": "Hello from the shadow dom!"
-                                                                                            }
-                                                                                        ],
-                                                                                        "attributes": []
-                                                                                    }
-                                                                                ],
-                                                                                "attributes": [
-                                                                                    "style",
-                                                                                    "color: red;"
+    id : <messageId>
+    result : {
+        root : {
+            backendNodeId : <backendNodeId>
+            baseURL : <baseURL>
+            childNodeCount : 1
+            children : [
+                [0] : {
+                    attributes : [
+                    ]
+                    backendNodeId : <backendNodeId>
+                    childNodeCount : 2
+                    children : [
+                        [0] : {
+                            attributes : [
+                            ]
+                            backendNodeId : <backendNodeId>
+                            childNodeCount : 0
+                            children : [
+                            ]
+                            localName : head
+                            nodeId : <nodeId>
+                            nodeName : HEAD
+                            nodeType : 1
+                            nodeValue : 
+                            parentId : <parentId>
+                        }
+                        [1] : {
+                            attributes : [
+                            ]
+                            backendNodeId : <backendNodeId>
+                            childNodeCount : 1
+                            children : [
+                                [0] : {
+                                    attributes : [
+                                        [0] : id
+                                        [1] : depth-1
+                                    ]
+                                    backendNodeId : <backendNodeId>
+                                    childNodeCount : 2
+                                    children : [
+                                        [0] : {
+                                            attributes : [
+                                                [0] : id
+                                                [1] : depth-2
+                                            ]
+                                            backendNodeId : <backendNodeId>
+                                            childNodeCount : 1
+                                            children : [
+                                                [0] : {
+                                                    attributes : [
+                                                        [0] : id
+                                                        [1] : depth-3
+                                                    ]
+                                                    backendNodeId : <backendNodeId>
+                                                    childNodeCount : 1
+                                                    children : [
+                                                        [0] : {
+                                                            attributes : [
+                                                                [0] : src
+                                                                [1] : ../dom/resources/shadow-dom-iframe.html
+                                                            ]
+                                                            backendNodeId : <backendNodeId>
+                                                            childNodeCount : 0
+                                                            children : [
+                                                            ]
+                                                            contentDocument : {
+                                                                backendNodeId : <backendNodeId>
+                                                                baseURL : <baseURL>
+                                                                childNodeCount : 1
+                                                                children : [
+                                                                    [0] : {
+                                                                        attributes : [
+                                                                        ]
+                                                                        backendNodeId : <backendNodeId>
+                                                                        childNodeCount : 2
+                                                                        children : [
+                                                                            [0] : {
+                                                                                attributes : [
                                                                                 ]
+                                                                                backendNodeId : <backendNodeId>
+                                                                                childNodeCount : 0
+                                                                                children : [
+                                                                                ]
+                                                                                localName : head
+                                                                                nodeId : <nodeId>
+                                                                                nodeName : HEAD
+                                                                                nodeType : 1
+                                                                                nodeValue : 
+                                                                                parentId : <parentId>
                                                                             }
-                                                                        ],
-                                                                        "shadowRootType": "open"
+                                                                            [1] : {
+                                                                                attributes : [
+                                                                                    [0] : onload
+                                                                                    [1] : addShadowDOM()
+                                                                                ]
+                                                                                backendNodeId : <backendNodeId>
+                                                                                childNodeCount : 2
+                                                                                children : [
+                                                                                    [0] : {
+                                                                                        attributes : [
+                                                                                            [0] : id
+                                                                                            [1] : element_in_an_iframe
+                                                                                        ]
+                                                                                        backendNodeId : <backendNodeId>
+                                                                                        childNodeCount : 0
+                                                                                        children : [
+                                                                                        ]
+                                                                                        localName : div
+                                                                                        nodeId : <nodeId>
+                                                                                        nodeName : DIV
+                                                                                        nodeType : 1
+                                                                                        nodeValue : 
+                                                                                        parentId : <parentId>
+                                                                                        shadowRoots : [
+                                                                                            [0] : {
+                                                                                                backendNodeId : <backendNodeId>
+                                                                                                childNodeCount : 1
+                                                                                                children : [
+                                                                                                    [0] : {
+                                                                                                        attributes : [
+                                                                                                            [0] : style
+                                                                                                            [1] : color: red;
+                                                                                                        ]
+                                                                                                        backendNodeId : <backendNodeId>
+                                                                                                        childNodeCount : 1
+                                                                                                        children : [
+                                                                                                            [0] : {
+                                                                                                                attributes : [
+                                                                                                                ]
+                                                                                                                backendNodeId : <backendNodeId>
+                                                                                                                childNodeCount : 1
+                                                                                                                children : [
+                                                                                                                    [0] : {
+                                                                                                                        backendNodeId : <backendNodeId>
+                                                                                                                        localName : 
+                                                                                                                        nodeId : <nodeId>
+                                                                                                                        nodeName : #text
+                                                                                                                        nodeType : 3
+                                                                                                                        nodeValue : Hello from the shadow dom!
+                                                                                                                        parentId : <parentId>
+                                                                                                                    }
+                                                                                                                ]
+                                                                                                                localName : h1
+                                                                                                                nodeId : <nodeId>
+                                                                                                                nodeName : H1
+                                                                                                                nodeType : 1
+                                                                                                                nodeValue : 
+                                                                                                                parentId : <parentId>
+                                                                                                            }
+                                                                                                        ]
+                                                                                                        localName : div
+                                                                                                        nodeId : <nodeId>
+                                                                                                        nodeName : DIV
+                                                                                                        nodeType : 1
+                                                                                                        nodeValue : 
+                                                                                                        parentId : <parentId>
+                                                                                                    }
+                                                                                                ]
+                                                                                                localName : 
+                                                                                                nodeId : <nodeId>
+                                                                                                nodeName : #document-fragment
+                                                                                                nodeType : 11
+                                                                                                nodeValue : 
+                                                                                                shadowRootType : open
+                                                                                            }
+                                                                                        ]
+                                                                                    }
+                                                                                    [1] : {
+                                                                                        attributes : [
+                                                                                        ]
+                                                                                        backendNodeId : <backendNodeId>
+                                                                                        childNodeCount : 1
+                                                                                        children : [
+                                                                                            [0] : {
+                                                                                                backendNodeId : <backendNodeId>
+                                                                                                localName : 
+                                                                                                nodeId : <nodeId>
+                                                                                                nodeName : #text
+                                                                                                nodeType : 3
+                                                                                                nodeValue :  function addShadowDOM() {     var host = document.getElementById("element_in_an_iframe").createShadowRoot();     var template = document.querySelector("#shadow-template");     host.appendChild(template.content);     template.remove(); } 
+                                                                                                parentId : <parentId>
+                                                                                            }
+                                                                                        ]
+                                                                                        localName : script
+                                                                                        nodeId : <nodeId>
+                                                                                        nodeName : SCRIPT
+                                                                                        nodeType : 1
+                                                                                        nodeValue : 
+                                                                                        parentId : <parentId>
+                                                                                    }
+                                                                                ]
+                                                                                localName : body
+                                                                                nodeId : <nodeId>
+                                                                                nodeName : BODY
+                                                                                nodeType : 1
+                                                                                nodeValue : 
+                                                                                parentId : <parentId>
+                                                                            }
+                                                                        ]
+                                                                        frameId : <frameId>
+                                                                        localName : html
+                                                                        nodeId : <nodeId>
+                                                                        nodeName : HTML
+                                                                        nodeType : 1
+                                                                        nodeValue : 
+                                                                        parentId : <parentId>
                                                                     }
                                                                 ]
-                                                            },
-                                                            {
-                                                                "nodeId": 34,
-                                                                "parentId": 28,
-                                                                "backendNodeId": "<number>",
-                                                                "nodeType": 1,
-                                                                "nodeName": "SCRIPT",
-                                                                "localName": "script",
-                                                                "nodeValue": "",
-                                                                "childNodeCount": 1,
-                                                                "children": [
-                                                                    {
-                                                                        "nodeId": 35,
-                                                                        "parentId": 34,
-                                                                        "backendNodeId": "<number>",
-                                                                        "nodeType": 3,
-                                                                        "nodeName": "#text",
-                                                                        "localName": "",
-                                                                        "nodeValue": "\nfunction addShadowDOM() {\n    var host = document.getElementById(\"element_in_an_iframe\").createShadowRoot();\n    var template = document.querySelector(\"#shadow-template\");\n    host.appendChild(template.content);\n    template.remove();\n}\n"
-                                                                    }
-                                                                ],
-                                                                "attributes": []
+                                                                documentURL : <documentURL>
+                                                                localName : 
+                                                                nodeId : <nodeId>
+                                                                nodeName : #document
+                                                                nodeType : 9
+                                                                nodeValue : 
+                                                                xmlVersion : 
                                                             }
-                                                        ],
-                                                        "attributes": [
-                                                            "onload",
-                                                            "addShadowDOM()"
-                                                        ]
-                                                    }
-                                                ],
-                                                "attributes": [],
-                                                "frameId": "???"
-                                            }
-                                        ],
-                                        "documentURL": "???",
-                                        "baseURL": "???",
-                                        "xmlVersion": ""
-                                    }
+                                                            frameId : <frameId>
+                                                            localName : iframe
+                                                            nodeId : <nodeId>
+                                                            nodeName : IFRAME
+                                                            nodeType : 1
+                                                            nodeValue : 
+                                                            parentId : <parentId>
+                                                        }
+                                                    ]
+                                                    localName : div
+                                                    nodeId : <nodeId>
+                                                    nodeName : DIV
+                                                    nodeType : 1
+                                                    nodeValue : 
+                                                    parentId : <parentId>
+                                                }
+                                            ]
+                                            localName : div
+                                            nodeId : <nodeId>
+                                            nodeName : DIV
+                                            nodeType : 1
+                                            nodeValue : 
+                                            parentId : <parentId>
+                                        }
+                                        [1] : {
+                                            attributes : [
+                                                [0] : id
+                                                [1] : targetDiv
+                                            ]
+                                            backendNodeId : <backendNodeId>
+                                            childNodeCount : 0
+                                            children : [
+                                            ]
+                                            localName : div
+                                            nodeId : <nodeId>
+                                            nodeName : DIV
+                                            nodeType : 1
+                                            nodeValue : 
+                                            parentId : <parentId>
+                                        }
+                                    ]
+                                    localName : div
+                                    nodeId : <nodeId>
+                                    nodeName : DIV
+                                    nodeType : 1
+                                    nodeValue : 
+                                    parentId : <parentId>
                                 }
-                            ],
-                            "attributes": [
-                                "id",
-                                "depth-3"
                             ]
+                            localName : body
+                            nodeId : <nodeId>
+                            nodeName : BODY
+                            nodeType : 1
+                            nodeValue : 
+                            parentId : <parentId>
                         }
-                    ],
-                    "attributes": [
-                        "id",
-                        "depth-2"
                     ]
-                },
-                {
-                    "nodeId": 36,
-                    "parentId": 21,
-                    "backendNodeId": "<number>",
-                    "nodeType": 1,
-                    "nodeName": "DIV",
-                    "localName": "div",
-                    "nodeValue": "",
-                    "childNodeCount": 0,
-                    "children": [],
-                    "attributes": [
-                        "id",
-                        "targetDiv"
-                    ]
+                    frameId : <frameId>
+                    localName : html
+                    nodeId : <nodeId>
+                    nodeName : HTML
+                    nodeType : 1
+                    nodeValue : 
+                    parentId : <parentId>
                 }
-            ],
-            "attributes": [
-                "id",
-                "depth-1"
             ]
+            documentURL : <documentURL>
+            localName : 
+            nodeId : <nodeId>
+            nodeName : #document
+            nodeType : 9
+            nodeValue : 
+            xmlVersion : 
         }
-    ],
-    "attributes": []
+    }
 }
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes.html
deleted file mode 100644
index d354dac..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script type="text/javascript">
-
-function test()
-{
-    getDocument();
-
-    function getDocument()
-    {
-        InspectorTest.sendCommand("DOM.getDocument", {"depth": -1}, function(messageObject) {
-            if (messageObject.hasOwnProperty("error"))
-                InspectorTest.log("Backend error: " + messageObject.error.message + " (" + messageObject.error.code + ")\n");
-
-            var iframeOwner = messageObject.result.root.children[0].children[1].children[0].children[0].children[0].children[0];
-            if (iframeOwner.contentDocument.children) {
-                InspectorTest.log("Error IFrame node should not include children: " + JSON.stringify(iframeOwner, null, "    "));
-                InspectorTest.completeTest();
-            } else {
-                getDocumentPlusIframe();
-            }
-        });
-    };
-
-    function replacePropertyRecursive(object, propertyNameToReplace)
-    {
-        for (var propertyName in object) {
-            if (!object.hasOwnProperty(propertyName))
-                continue;
-            if (propertyName === propertyNameToReplace) {
-                object[propertyName] = "???";
-            } else if (typeof object[propertyName] === "object") {
-                replacePropertyRecursive(object[propertyName], propertyNameToReplace);
-            }
-        }
-    }
-
-    function getDocumentPlusIframe()
-    {
-        InspectorTest.sendCommand("DOM.getDocument", {"depth": -1, "pierce": true}, function(messageObject) {
-            if (messageObject.hasOwnProperty("error"))
-                InspectorTest.log("Backend error: " + messageObject.error.message + " (" + messageObject.error.code + ")\n");
-
-            var iframeOwner = messageObject.result.root.children[0].children[1].children[0].children[0].children[0].children[0];
-
-            // Replace properties that tend to change every run.
-            replacePropertyRecursive(messageObject, "frameId");
-            replacePropertyRecursive(messageObject, "documentURL");
-            replacePropertyRecursive(messageObject, "baseURL");
-
-            var bodyId = messageObject.result.root.children[0].children[1];
-            function stabilize(key, value) {
-                var unstableKeys = ["backendNodeId"];
-                if (unstableKeys.indexOf(key) !== -1)
-                    return "<" + typeof(value) + ">";
-                return value;
-            }
-            InspectorTest.log(JSON.stringify(bodyId, stabilize, "    "));
-            InspectorTest.completeTest();
-        });
-    };
-};
-
-window.addEventListener("DOMContentLoaded", function () {
-    runTest();
-}, false);
-
-</script>
-</head>
-<body>
-
-<div id="depth-1">
-    <div id="depth-2">
-        <div id="depth-3">
-            <iframe src="resources/shadow-dom-iframe.html"></iframe>
-        </div>
-    </div>
-    <div id="targetDiv"></div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes.js
new file mode 100644
index 0000000..6c807ff
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-request-document-with-child-nodes.js
@@ -0,0 +1,23 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <div id='depth-1'>
+        <div id='depth-2'>
+            <div id='depth-3'>
+                <iframe src='../dom/resources/shadow-dom-iframe.html'></iframe>
+            </div>
+        </div>
+        <div id='targetDiv'></div>
+    </div>
+  `, '');
+  var response = await dp.DOM.getDocument({depth: -1});
+  var iframeOwner = response.result.root.children[0].children[1].children[0].children[0].children[0].children[0];
+  if (iframeOwner.contentDocument.children) {
+    testRunner.die('Error IFrame node should not include children: ' + JSON.stringify(iframeOwner, null, '    '));
+    return;
+  }
+
+  var response = await dp.DOM.getDocument({depth: -1, pierce: true});
+  testRunner.logMessage(response);
+  testRunner.completeTest();
+})
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled-expected.txt
index 97bff89..f2c9ae0 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled-expected.txt
@@ -1,2 +1,3 @@
+
 DOM.inspectNodeRequested: div
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled.html
deleted file mode 100644
index a4d7a88..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    var nodeInfo = {};
-    InspectorTest.eventHandler["DOM.setChildNodes"] = setChildNodes;
-    InspectorTest.eventHandler["Overlay.inspectNodeRequested"] = inspectNodeRequested;
-    InspectorTest.sendCommand("DOM.enable", {});
-    InspectorTest.sendCommand("Overlay.enable", {});
-    InspectorTest.sendCommand("Overlay.setInspectMode", { "mode": "searchForNode", highlightConfig: {} }, onSetModeEnabled);
-
-    function onSetModeEnabled(message)
-    {
-        if (message.error) {
-            InspectorTest.log(message.error.message);
-            InspectorTest.completeTest();
-            return;
-        }
-
-        InspectorTest.sendCommand("Input.dispatchMouseEvent", { "type": "mouseMoved", "button": "left", "clickCount": 1, "x": 150, "y": 150 });
-        InspectorTest.sendCommand("Input.dispatchMouseEvent", { "type": "mousePressed", "button": "left", "clickCount": 1, "x": 150, "y": 150 });
-        InspectorTest.sendCommand("Input.dispatchMouseEvent", { "type": "mouseReleased", "button": "left", "clickCount": 1, "x": 150, "y": 150 });
-    }
-
-    function setChildNodes(message)
-    {
-        var nodes = message.params.nodes;
-        for (var i = 0; i < nodes.length; ++i) {
-            nodeInfo[nodes[i].nodeId] = nodes[i];
-            delete nodes[i].nodeId;
-        }
-    }
-
-    function inspectNodeRequested(message)
-    {
-        InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", { "backendNodeIds": [ message.params.backendNodeId ] }, onNodeResolved);
-    }
-
-    function onNodeResolved(message)
-    {
-        InspectorTest.log("DOM.inspectNodeRequested: " + nodeInfo[message.result.nodeIds[0]].localName);
-        InspectorTest.completeTest();
-    }
-}
-
-</script>
-</head>
-<body onload="runTest()">
-<div style="position:absolute;top:100;left:100;width:100;height:100;background:black"></div>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled.js
new file mode 100644
index 0000000..041f2d4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setInspectModeEnabled.js
@@ -0,0 +1,23 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <div style="position:absolute;top:100;left:100;width:100;height:100;background:black"></div>
+  `, '');
+  var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
+  var nodeTracker = new NodeTracker(dp);
+  dp.DOM.enable();
+  dp.Overlay.enable();
+  var message = await dp.Overlay.setInspectMode({ mode: 'searchForNode', highlightConfig: {} });
+  if (message.error) {
+    testRunner.die(message.error.message);
+    return;
+  }
+  dp.Input.dispatchMouseEvent({type: 'mouseMoved', button: 'left', clickCount: 1, x: 150, y: 150 });
+  dp.Input.dispatchMouseEvent({type: 'mousePressed', button: 'left', clickCount: 1, x: 150, y: 150 });
+  dp.Input.dispatchMouseEvent({type: 'mouseReleased', button: 'left', clickCount: 1, x: 150, y: 150 });
+
+  var message = await dp.Overlay.onceInspectNodeRequested();
+  message = await dp.DOM.pushNodesByBackendIdsToFrontend({backendNodeIds: [message.params.backendNodeId]});
+  testRunner.log('DOM.inspectNodeRequested: ' + nodeTracker.nodeForId(message.result.nodeIds[0]).localName);
+  testRunner.completeTest();
+})
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML-expected.txt
index 58ff6b7..6686493 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML-expected.txt
@@ -1,2 +1,8 @@
-Привет мир 1
-Привет мир 2
+
+{
+    id : <messageId>
+    result : {
+        outerHTML : <body><div>Привет мир 1</div>     <div>Привет мир 2</div>   </body>
+    }
+}
+
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML.html
deleted file mode 100644
index 9242de38..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<html>
-<head>
-<meta charset="utf8">
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    InspectorTest.sendCommand("DOM.getDocument", {}, onGotDocument);
-
-    var bodyId;
-    function onGotDocument(msg)
-    {
-        if (InspectorTest.completeTestIfError(msg))
-            return;
-        InspectorTest.sendCommand("DOM.querySelector", { nodeId: msg.result.root.nodeId, selector: "body" }, onQuerySelector1);
-        InspectorTest.sendCommand("DOM.querySelector", { nodeId: msg.result.root.nodeId, selector: "#id" }, onQuerySelector2);
-    }
-
-    function onQuerySelector1(msg)
-    {
-        if (InspectorTest.completeTestIfError(msg))
-            return;
-        bodyId = msg.result.nodeId;
-    }
-
-    function onQuerySelector2(msg)
-    {
-        if (InspectorTest.completeTestIfError(msg))
-            return;
-        InspectorTest.sendCommand("DOM.setOuterHTML", { nodeId: msg.result.nodeId, outerHTML: "<div>Привет мир 1</div>" }, onSetOuterHTML);
-    }
-
-    function onSetOuterHTML(msg)
-    {
-        if (InspectorTest.completeTestIfError(msg))
-            return;
-        InspectorTest.sendCommand("DOM.getOuterHTML", { nodeId: bodyId }, onGetOuterHTML);
-    }
-
-    function onGetOuterHTML(msg)
-    {
-        InspectorTest.completeTest();
-    }
-}
-
-</script>
-</head>
-<body onload="runTest()">
-  <div id="id">Привет мир</div>
-  <div>Привет мир 2</div>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML.js
new file mode 100644
index 0000000..db1d9cf0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-setOuterHTML.js
@@ -0,0 +1,16 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <div id="id">Привет мир</div>
+    <div>Привет мир 2</div>
+  `, '');
+
+  var message = await dp.DOM.getDocument();
+  message = await dp.DOM.querySelector({ nodeId: message.result.root.nodeId, selector: "body" });
+  var bodyId = message.result.nodeId;
+
+  message = await dp.DOM.querySelector({ nodeId: bodyId, selector: "#id" });
+  await dp.DOM.setOuterHTML({nodeId: message.result.nodeId, outerHTML: "<div>Привет мир 1</div>"});
+  message = await dp.DOM.getOuterHTML({nodeId: bodyId});
+  testRunner.logMessage(message);
+  testRunner.completeTest();
+})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case-expected.txt
index 6e88928..0b378aa8 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case-expected.txt
@@ -1,4 +1,4 @@
-Test that DOM attribute case is preserved when modified in XML documents. 
+Test that DOM attribute case is preserved when modified in XML documents.
 Original attributes:
 id=main
 xmlns=http://www.w3.org/2000/svg
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case.html
deleted file mode 100644
index 9285fc15..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function test()
-{
-    var rootNodeId;
-    var nodeId;
-
-    InspectorTest.eventHandler["DOM.attributeModified"] = onAttributeModified;
-
-    InspectorTest.sendCommand("DOM.getDocument", {}, onGotDocument);
-
-    function onGotDocument(msg)
-    {
-        if (msg.error) {
-            InspectorTest.log(msg.error.message);
-            InspectorTest.completeTest();
-            return;
-        }
-        rootNodeId = msg.result.root.nodeId;
-        getMainNodeId();
-    }
-
-    function getMainNodeId(next)
-    {
-        InspectorTest.sendCommand("DOM.querySelector", { "nodeId": rootNodeId, "selector": "#main" }, onQuery);
-        function onQuery(msg)
-        {
-            if (!checkError(msg))
-                return;
-            nodeId = msg.result.nodeId;
-            onGotMainNodeId();
-        }
-    }
-
-    function onGotMainNodeId()
-    {
-        InspectorTest.log("Original attributes:");
-        dumpMainElementAttributes(onDumpedOriginal);
-    }
-
-    function onDumpedOriginal()
-    {
-        InspectorTest.sendCommand("DOM.setAttributesAsText", { "nodeId": nodeId, "name": "viewBox", "text": "viewBox=\"0 0 120 120\"" });
-    }
-
-    function onAttributeModified(msg) {
-        var result = msg.params;
-        InspectorTest.log("Modified attribute:");
-        InspectorTest.log(result.name + "=" + result.value);
-        InspectorTest.completeTest();
-    }
-
-    function dumpMainElementAttributes(next)
-    {
-        InspectorTest.sendCommand("DOM.getAttributes", { "nodeId": nodeId }, onAttributes);
-
-        function onAttributes(msg)
-        {
-            if (!checkError(msg))
-                return;
-            var array = msg.result.attributes;
-            for (var i = 0; i < array.length; i += 2)
-                InspectorTest.log(array[i] + "=" + array[i + 1]);
-            next();
-        }
-    }
-
-    function checkError(msg)
-    {
-        if (msg.error) {
-            InspectorTest.log(msg.error.message);
-            InspectorTest.completeTest();
-            return false;
-        }
-        return true;
-    }
-}
-</script>
-</head>
-<body onload="runTest()">
-Test that DOM attribute case is preserved when modified in XML documents.
-<svg id="main" xmlns="http://www.w3.org/2000/svg" width="600" height="500" viewBox="0 0 100 120" />
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case.js
new file mode 100644
index 0000000..0d5a292f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/dom-svg-attribute-case.js
@@ -0,0 +1,21 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <svg id='main' xmlns='http://www.w3.org/2000/svg' width='600' height='500' viewBox='0 0 100 120' />
+  `, 'Test that DOM attribute case is preserved when modified in XML documents.');
+
+  var response = await dp.DOM.getDocument();
+  var rootNodeId = response.result.root.nodeId;
+
+  response = await dp.DOM.querySelector({nodeId: rootNodeId, selector: '#main'})
+  var nodeId = response.result.nodeId;
+  testRunner.log('Original attributes:');
+  response = await dp.DOM.getAttributes({nodeId});
+  for (var i = 0; i < response.result.attributes.length; i += 2)
+    testRunner.log(response.result.attributes[i] + '=' + response.result.attributes[i + 1]);
+
+  dp.DOM.setAttributesAsText({nodeId, name: 'viewBox', text: 'viewBox="0 0 120 120"'});
+  response = await dp.DOM.onceAttributeModified();
+  testRunner.log('Modified attribute:');
+  testRunner.log(response.params.name + '=' + response.params.value);
+  testRunner.completeTest();
+})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition-expected.txt
index b1c0659..a134109 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition-expected.txt
@@ -1,4 +1,5 @@
 
+
 === Get the Document ===
 
 
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition.html
deleted file mode 100644
index 0b90be9..0000000
--- a/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition.html
+++ /dev/null
@@ -1,130 +0,0 @@
-<html>
-<head>
-<script type="text/javascript" src="../../http/tests/inspector-protocol/resources/inspector-protocol-test.js"></script>
-<script>
-
-function addBeforeElement()
-{
-    document.getElementById("style").textContent = "#for-pseudo:before { content: \"BEFORE\" }";
-}
-
-function test()
-{
-    var nodeInfo = {};
-    var childrenCallback;
-
-    InspectorTest.eventHandler["DOM.setChildNodes"] = setChildNodes;
-    InspectorTest.eventHandler["DOM.pseudoElementAdded"] = pseudoElementAdded;
-    getDocument();
-
-    function getDocument()
-    {
-        step({
-            name: "Get the Document",
-            command: "DOM.getDocument",
-            parameters: {},
-            callback: getImmediateChildren
-        });
-    };
-
-    function getImmediateChildren(result)
-    {
-        var bodyId = result.root.children[0].children[1].nodeId;
-        childrenCallback = onChildrenRequested;
-        step({
-            name: "Get immediate children of the body",
-            command: "DOM.requestChildNodes",
-            parameters: {"nodeId": bodyId}
-        });
-    };
-
-    function onChildrenRequested()
-    {
-        step({
-            name: "Add #for-pseudo:before element",
-            command: "Runtime.evaluate",
-            parameters: {expression: "addBeforeElement()"}
-        });
-    }
-
-    function pseudoElementAdded(message)
-    {
-        var nodeData = findNodeById("inner-span");
-        assertEquals(true, !!nodeData, "#inner-span has been received");
-        InspectorTest.completeTest();
-    }
-
-    function setChildNodes(message)
-    {
-        var nodes = message.params.nodes;
-        for (var i = 0; i < nodes.length; ++i)
-            addNode(nodes[i]);
-        var callback = childrenCallback;
-        childrenCallback = null;
-        if (callback)
-            callback();
-    }
-
-    function step(test)
-    {
-        InspectorTest.log("\n=== " + test.name + " ===\n");
-        InspectorTest.sendCommand(test.command, test.parameters, function(messageObject) {
-            if (messageObject.hasOwnProperty("error"))
-                InspectorTest.log("Backend error: " + messageObject.error.message + " (" + messageObject.error.code + ")\n");
-
-            if (test.callback)
-                test.callback(messageObject.result);
-        });
-    }
-
-    function findNodeById(id)
-    {
-        for (var nodeId in nodeInfo) {
-            var node = nodeInfo[nodeId];
-            var attrs = node.attributes;
-            if (!attrs)
-                continue;
-            for (var i = 0; i < attrs.length; i += 2) {
-                var name = attrs[i];
-                if (name !== "id")
-                    continue;
-                if (attrs[i + 1]  === id)
-                    return {nodeId: nodeId, node: node};
-            }
-        }
-        return null;
-    }
-
-    function addNodesRecursive(root)
-    {
-        addNode(root);
-        if (!root.children)
-            return;
-        for (var i = 0; i < root.children.length; ++i)
-            addNodesRecursive(root.children[i]);
-    }
-
-    function addNode(node)
-    {
-        nodeInfo[node.nodeId] = node;
-        delete node.nodeId;
-    }
-
-    function assertEquals(expected, actual, message)
-    {
-        if (expected === actual) {
-            InspectorTest.log("PASS: " + message);
-            return;
-        }
-        InspectorTest.log("FAIL: " + message + ": expected: <" + expected + "> but found <" + actual + ">");
-    }
-}
-
-</script>
-<style id="style">
-</style>
-</head>
-<body id="body" onload="runTest()">
-<div id="for-pseudo"><span id="inner-span"></span></div>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition.js b/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition.js
new file mode 100644
index 0000000..8fd19e2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/push-children-on-pseudo-addition.js
@@ -0,0 +1,34 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startHTML(`
+    <style id='style'>
+    </style>
+    <div id='for-pseudo'><span id='inner-span'></span></div>
+  `, '');
+
+  var DOMHelper = await testRunner.loadScript('../resources/dom-helper.js');
+  var NodeTracker = await testRunner.loadScript('../resources/node-tracker.js');
+  var nodeTracker = new NodeTracker(dp);
+
+  testRunner.log('\n=== Get the Document ===\n');
+  var response = await dp.DOM.getDocument();
+  var bodyId = response.result.root.children[0].children[1].nodeId;
+
+  testRunner.log('\n=== Get immediate children of the body ===\n');
+  dp.DOM.requestChildNodes({nodeId: bodyId});
+  await dp.DOM.onceSetChildNodes();
+
+  testRunner.log('\n=== Add #for-pseudo:before element ===\n');
+  session.evaluate(() => {
+    document.getElementById('style').textContent = '#for-pseudo:before { content: "BEFORE" }';
+  });
+  await dp.DOM.oncePseudoElementAdded();
+
+  for (var node of nodeTracker.nodes()) {
+    if (DOMHelper.attributes(node).get('id') === 'inner-span') {
+      testRunner.log('PASS: #inner-span has been received');
+      testRunner.completeTest();
+      return;
+    }
+  }
+  testRunner.die('FAIL: #inner-span was not received');
+})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/resources/dom-getFlattenedDocument.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/resources/dom-getFlattenedDocument.html
new file mode 100644
index 0000000..5e125cb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/resources/dom-getFlattenedDocument.html
@@ -0,0 +1,25 @@
+<head>
+<template id='shadow-template'>
+<style>
+:host {
+    color: red;
+}
+</style>
+<div></div><h1>Hi from a template!</h1></div>
+</template>
+</head>
+<body class='body-class'>
+  <div id='A'> A
+    <div id='B'> B
+      <div id='C'> C
+        <div id='D'> D
+          <div id='E'> E
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <iframe src='./simple-iframe.html' width='400' height='200'></iframe>
+  <div id='shadow-host'></div>
+</body>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/dom/resources/dom-request-child-nodes-traverse-frames.html b/third_party/WebKit/LayoutTests/inspector-protocol/dom/resources/dom-request-child-nodes-traverse-frames.html
new file mode 100644
index 0000000..9fe9dde
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/dom/resources/dom-request-child-nodes-traverse-frames.html
@@ -0,0 +1,7 @@
+<div id="depth-1">
+    <div id="depth-2">
+        <div id="depth-3">
+            <iframe src="iframe.html"></iframe>
+        </div>
+    </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-helper.js b/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-helper.js
new file mode 100644
index 0000000..196e703
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/resources/dom-helper.js
@@ -0,0 +1,10 @@
+(class DOMHelper {
+  static attributes(node) {
+    var attr = new Map();
+    if (!node.attributes)
+      return attr;
+    for (var i = 0; i < node.attributes.length; i += 2)
+      attr.set(node.attributes[i], node.attributes[i + 1]);
+    return attr;
+  }
+})
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/resources/inspector-protocol-test.js b/third_party/WebKit/LayoutTests/inspector-protocol/resources/inspector-protocol-test.js
index 2c1b471..5530d82 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/resources/inspector-protocol-test.js
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/resources/inspector-protocol-test.js
@@ -23,11 +23,11 @@
     this._log.call(null, text);
   }
 
-  logMessage(originalMessage) {
+  logMessage(originalMessage, title) {
     var message = JSON.parse(JSON.stringify(originalMessage));
     if (message.id)
       message.id = '<messageId>';
-    const nonStableFields = new Set(['nodeId', 'objectId', 'scriptId', 'timestamp']);
+    const nonStableFields = new Set(['nodeId', 'objectId', 'scriptId', 'timestamp', 'backendNodeId', 'parentId', 'frameId', 'baseURL', 'documentURL']);
     var objects = [message];
     while (objects.length) {
       var object = objects.shift();
@@ -40,7 +40,7 @@
           objects.push(object[key]);
       }
     }
-    this.logObject(message);
+    this.logObject(message, title);
     return originalMessage;
   }
 
@@ -208,7 +208,10 @@
       if (!message.params.frame.parentId)
         callback();
     });
-    await promise;
+    await Promise.all([
+      promise,
+      session.protocol.Page.onceLoadEventFired()
+    ]);
 
     await session.disconnect();
   }
@@ -219,7 +222,7 @@
 
     html = html.replace(/'/g, "\\'").replace(/\n/g, '\\n');
     var session = await this.createSession();
-    await session.protocol.Runtime.evaluate({expression: `document.body.innerHTML='${html}'`});
+    await session.protocol.Runtime.evaluate({expression: `document.write('${html}');document.close();`});
     await session.disconnect();
   }
 };
@@ -253,6 +256,8 @@
   }
 
   async evaluate(code) {
+    if (typeof code === 'function')
+      code = `(${code.toString()})()`;
     var response = await this.protocol.Runtime.evaluate({expression: code, returnByValue: true});
     if (response.error) {
       this._testRunner.log(`Error while evaluating '${code}': ${response.error}`);
@@ -263,6 +268,8 @@
   }
 
   async evaluateAsync(code) {
+    if (typeof code === 'function')
+      code = `(${code.toString()})()`;
     var response = await this.protocol.Runtime.evaluate({expression: code, returnByValue: true, awaitPromise: true});
     if (response.error) {
       this._testRunner.log(`Error while evaluating async '${code}': ${response.error}`);
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/resources/node-tracker.js b/third_party/WebKit/LayoutTests/inspector-protocol/resources/node-tracker.js
new file mode 100644
index 0000000..07a04fa
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/resources/node-tracker.js
@@ -0,0 +1,28 @@
+(class NodeTracker {
+  constructor(dp) {
+    this._nodes = new Map();
+    dp.DOM.onSetChildNodes(message => message.params.nodes.forEach(node => this._addNode(node)));
+  }
+
+  addDocumentNode(documentNode) {
+    this._addNode(documentNode);
+  }
+
+  _addNode(node) {
+    this._nodes.set(node.nodeId, node);
+    if (node.children)
+      node.children.forEach(node => this._addNode(node));
+  }
+
+  nodeForId(nodeId) {
+    return this._nodes.get(nodeId) || null;
+  }
+
+  nodes() {
+    return Array.from(this._nodes.values());
+  }
+
+  nodeIds() {
+    return Array.from(this._nodes.keys());
+  }
+})
diff --git a/third_party/WebKit/LayoutTests/transitions/transitions-parsing-expected.txt b/third_party/WebKit/LayoutTests/transitions/transitions-parsing-expected.txt
index 2bd1db5..211cd98 100644
--- a/third_party/WebKit/LayoutTests/transitions/transitions-parsing-expected.txt
+++ b/third_party/WebKit/LayoutTests/transitions/transitions-parsing-expected.txt
@@ -59,6 +59,10 @@
 PASS computedStyle.transitionProperty is 'solid'
 PASS style.webkitTransitionProperty is 'solid'
 PASS computedStyle.webkitTransitionProperty is 'solid'
+PASS style.transitionProperty is 'default, top'
+PASS computedStyle.transitionProperty is 'default, top'
+PASS style.webkitTransitionProperty is 'default, top'
+PASS computedStyle.webkitTransitionProperty is 'default, top'
 Invalid transition-property values.
 PASS style.transitionProperty is ''
 PASS computedStyle.transitionProperty is 'all'
@@ -103,7 +107,6 @@
 PASS style.transitionProperty is ''
 PASS style.transitionProperty is ''
 PASS style.transitionProperty is ''
-PASS style.transitionProperty is ''
 Valid transition-duration values.
 PASS computedStyle.transitionDuration is '0s'
 PASS computedStyle.webkitTransitionDuration is '0s'
diff --git a/third_party/WebKit/LayoutTests/transitions/transitions-parsing.html b/third_party/WebKit/LayoutTests/transitions/transitions-parsing.html
index 4e9c4c2..4ed6d2f 100644
--- a/third_party/WebKit/LayoutTests/transitions/transitions-parsing.html
+++ b/third_party/WebKit/LayoutTests/transitions/transitions-parsing.html
@@ -109,6 +109,12 @@
 shouldBe("style.webkitTransitionProperty", "'solid'");
 shouldBe("computedStyle.webkitTransitionProperty", "'solid'");
 
+style.transitionProperty = "default, top";
+shouldBe("style.transitionProperty", "'default, top'");
+shouldBe("computedStyle.transitionProperty", "'default, top'");
+shouldBe("style.webkitTransitionProperty", "'default, top'");
+shouldBe("computedStyle.webkitTransitionProperty", "'default, top'");
+
 debug("Invalid transition-property values.");
 style.transitionProperty = "";
 
@@ -178,8 +184,6 @@
 shouldBe("style.transitionProperty", "''");
 style.transitionProperty = "left, unset";
 shouldBe("style.transitionProperty", "''");
-style.transitionProperty = "default, top";
-shouldBe("style.transitionProperty", "''");
 
 style.transitionProperty = "";
 
diff --git a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
index d8c2cd1..b136e05 100644
--- a/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/LocalWindowProxy.cpp
@@ -76,8 +76,7 @@
   // The embedder could run arbitrary code in response to the
   // willReleaseScriptContext callback, so all disposing should happen after
   // it returns.
-  GetFrame()->Loader().Client()->WillReleaseScriptContext(context,
-                                                          world_->GetWorldId());
+  GetFrame()->Client()->WillReleaseScriptContext(context, world_->GetWorldId());
   MainThreadDebugger::Instance()->ContextWillBeDestroyed(script_state_.Get());
 
   if (next_status == Lifecycle::kGlobalObjectIsDetached) {
@@ -160,8 +159,7 @@
 
   MainThreadDebugger::Instance()->ContextCreated(script_state_.Get(),
                                                  GetFrame(), origin);
-  GetFrame()->Loader().Client()->DidCreateScriptContext(context,
-                                                        world_->GetWorldId());
+  GetFrame()->Client()->DidCreateScriptContext(context, world_->GetWorldId());
   // If conditional features for window have been queued before the V8 context
   // was ready, then inject them into the context now
   if (world_->IsMainWorld()) {
@@ -181,7 +179,7 @@
 
   Vector<const char*> extension_names;
   // Dynamically tell v8 about our extensions now.
-  if (GetFrame()->Loader().Client()->AllowScriptExtensions()) {
+  if (GetFrame()->Client()->AllowScriptExtensions()) {
     const V8Extensions& extensions = ScriptController::RegisteredExtensions();
     extension_names.ReserveInitialCapacity(extensions.size());
     for (const auto* extension : extensions)
diff --git a/third_party/WebKit/Source/core/animation/CSSInterpolationTypesMap.cpp b/third_party/WebKit/Source/core/animation/CSSInterpolationTypesMap.cpp
index 14c85b9..e534e72e 100644
--- a/third_party/WebKit/Source/core/animation/CSSInterpolationTypesMap.cpp
+++ b/third_party/WebKit/Source/core/animation/CSSInterpolationTypesMap.cpp
@@ -379,15 +379,18 @@
         result.push_back(WTF::MakeUnique<CSSImageInterpolationType>(
             property, &registration));
         break;
-      case CSSSyntaxType::kUrl:
       case CSSSyntaxType::kInteger:
+        result.push_back(WTF::MakeUnique<CSSNumberInterpolationType>(
+            property, &registration, true));
       case CSSSyntaxType::kTransformList:
         // TODO(alancutter): Support smooth interpolation of these types.
         break;
-      case CSSSyntaxType::kTokenStream:
-      case CSSSyntaxType::kIdent:
       case CSSSyntaxType::kCustomIdent:
-        // Uses the CSSValueInterpolationType added below.
+      case CSSSyntaxType::kIdent:
+      case CSSSyntaxType::kTokenStream:
+      case CSSSyntaxType::kUrl:
+        // No interpolation behaviour defined, uses the
+        // CSSValueInterpolationType added below.
         break;
       default:
         NOTREACHED();
diff --git a/third_party/WebKit/Source/core/animation/CSSNumberInterpolationType.cpp b/third_party/WebKit/Source/core/animation/CSSNumberInterpolationType.cpp
index 8bf5684..fe5ff9a 100644
--- a/third_party/WebKit/Source/core/animation/CSSNumberInterpolationType.cpp
+++ b/third_party/WebKit/Source/core/animation/CSSNumberInterpolationType.cpp
@@ -41,7 +41,8 @@
     const InterpolableValue& value,
     const NonInterpolableValue*,
     const StyleResolverState&) const {
-  return CSSPrimitiveValue::Create(ToInterpolableNumber(value).Value(),
+  double number = ToInterpolableNumber(value).Value();
+  return CSSPrimitiveValue::Create(round_to_integer_ ? round(number) : number,
                                    CSSPrimitiveValue::UnitType::kNumber);
 }
 
diff --git a/third_party/WebKit/Source/core/animation/CSSNumberInterpolationType.h b/third_party/WebKit/Source/core/animation/CSSNumberInterpolationType.h
index 99c40755a..05061766 100644
--- a/third_party/WebKit/Source/core/animation/CSSNumberInterpolationType.h
+++ b/third_party/WebKit/Source/core/animation/CSSNumberInterpolationType.h
@@ -12,8 +12,13 @@
 class CSSNumberInterpolationType : public CSSInterpolationType {
  public:
   CSSNumberInterpolationType(PropertyHandle property,
-                             const PropertyRegistration* registration = nullptr)
-      : CSSInterpolationType(property, registration) {}
+                             const PropertyRegistration* registration = nullptr,
+                             bool round_to_integer = false)
+      : CSSInterpolationType(property, registration),
+        round_to_integer_(round_to_integer) {
+    // This integer flag only applies to registered custom properties.
+    DCHECK(!round_to_integer_ || property.IsCSSCustomProperty());
+  }
 
   InterpolationValue MaybeConvertStandardPropertyUnderlyingValue(
       const ComputedStyle&) const final;
@@ -36,6 +41,8 @@
   InterpolationValue MaybeConvertValue(const CSSValue&,
                                        const StyleResolverState*,
                                        ConversionCheckers&) const final;
+
+  const bool round_to_integer_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5
index a21ef9d7..a79ce3f 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.json5
+++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -385,6 +385,11 @@
       inherited: true,
       interpolable: true,
       priority: "High",
+      field_template: "storage_only",
+      include_paths: ["platform/graphics/Color.h"],
+      type_name: "Color",
+      field_group: "inherited",
+      default_value: "Color::kBlack",
     },
     {
       name: "direction",
@@ -639,6 +644,12 @@
       converter: "ConvertFilterOperations",
       interpolable: true,
       runtime_flag: "CSSBackdropFilter",
+      field_template: "storage_only",
+      type_name: "StyleFilterData",
+      field_group: "rare-non-inherited",
+      default_value: "DataPersistent<StyleFilterData>()",
+      wrapper_pointer_name: "DataPersistent",
+      include_paths: ["core/style/StyleFilterData.h"],
     },
     {
       name: "backface-visibility",
@@ -665,6 +676,11 @@
       api_methods: ["parseSingleValue"],
       custom_all: true,
       interpolable: true,
+      field_template: "storage_only",
+      include_paths: ["core/css/StyleColor.h"],
+      type_name: "StyleColor",
+      default_value: "StyleColor(Color::kTransparent)",
+      field_group: "background",
     },
     {
       name: "background-image",
@@ -1206,6 +1222,12 @@
       api_class: "CSSPropertyAPIFilter",
       converter: "ConvertFilterOperations",
       interpolable: true,
+      field_template: "storage_only",
+      type_name: "StyleFilterData",
+      field_group: "rare-non-inherited",
+      default_value: "DataPersistent<StyleFilterData>()",
+      wrapper_pointer_name: "DataPersistent",
+      include_paths: ["core/style/StyleFilterData.h"],
     },
     {
       name: "flex-basis",
@@ -2529,6 +2551,10 @@
       name_for_methods: "TextDecoration",
       runtime_flag: "CSS3TextDecorations",
       type_name: "TextDecoration",
+      field_template: "storage_only",
+      field_size: 4,
+      default_value: "TextDecoration::kNone",
+      field_group: "visual",
     },
     {
       name: "text-decoration-skip",
@@ -2665,6 +2691,11 @@
       interpolable: true,
       keywords: ["none"],
       typedom_types: ["Transform"],
+      field_template: "storage_only",
+      type_name: "TransformOperations",
+      field_group: "rare-non-inherited->transform",
+      default_value: "EmptyTransformOperations()",
+      include_paths: ["platform/transforms/TransformOperations.h"]
     },
     {
       name: "transform-box",
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleDiffFunctions.json5 b/third_party/WebKit/Source/core/css/ComputedStyleDiffFunctions.json5
index 550baf0..3be5ad7 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleDiffFunctions.json5
+++ b/third_party/WebKit/Source/core/css/ComputedStyleDiffFunctions.json5
@@ -96,7 +96,7 @@
           },
           {
             method: "HasFilters()",
-            field_dependencies: ["Filter"]
+            field_dependencies: ["filter"]
           },
           {
             method: "FontInternal().LoadingCustomFonts()",
@@ -324,13 +324,13 @@
     },
     {
         name: "DiffTransformData",
-        fields_to_diff: ["TransformOperations", "translate", "rotate",
+        fields_to_diff: ["transform", "translate", "rotate",
                     "scale", "offset-path", "offset-rotate", "transform-origin",
                      "offset-position", "offset-anchor", "offset-distance"],
     },
     {
         name: "UpdatePropertySpecificDifferencesTransform",
-        fields_to_diff: ["TransformOperations", "translate", "rotate",
+        fields_to_diff: ["transform", "translate", "rotate",
                     "scale", "offset-path", "offset-rotate", "transform-origin",
                      "offset-position", "offset-anchor", "offset-distance", 
                      "perspective", "perspective-origin"],
@@ -340,7 +340,7 @@
             // while hasTransform() differs, as it checks a number of conditions aside
             // from just the matrix, including but not limited to animation state.
             method: "HasTransform()",
-            field_dependencies: ["TransformOperations", "offset-position", 
+            field_dependencies: ["transform", "offset-position", 
                     "HasCurrentTransformAnimation", "translate", "rotate", 
                     "scale"]
           },
@@ -352,7 +352,7 @@
     },
     {
         name: "UpdatePropertySpecificDifferencesFilter",
-        fields_to_diff: ["Filter"],
+        fields_to_diff: ["filter"],
         predicates_to_test: [
           {
             predicate: "a.ReflectionDataEquivalent(b)",
@@ -379,11 +379,11 @@
     },
     {
         name: "UpdatePropertySpecificDifferencesBackdropFilter",
-        fields_to_diff: ["BackdropFilter"],
+        fields_to_diff: ["backdrop-filter"],
     },
     {
         name: "UpdatePropertySpecificDifferencesTextDecorationOrColor",
-        fields_to_diff: ["color", "VisitedLinkColor", "TextDecoration",
+        fields_to_diff: ["color", "VisitedLinkColor", "text-decoration-line",
                 "text-decoration-style", "text-decoration-color",
                 "VisitedLinkTextDecorationColor", "TextEmphasisFill",
                 "text-underline-position", "text-decoration-skip", "AppliedTextDecorations"],
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5 b/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
index 27b246f13..3386f60 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
+++ b/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
@@ -221,22 +221,6 @@
       field_group: "background",
     },
     {
-      name: "BackgroundColor",
-      field_template: "storage_only",
-      include_paths: ["core/css/StyleColor.h"],
-      type_name: "StyleColor",
-      default_value: "StyleColor(Color::kTransparent)",
-      field_group: "background",
-    },
-    {
-      name: "TextDecoration",
-      field_template: "storage_only",
-      type_name: "TextDecoration",
-      field_size: 4,
-      default_value: "TextDecoration::kNone",
-      field_group: "visual",
-    },
-    {
       name: "HasAutoClip",
       field_template: "storage_only",
       type_name: "bool",
@@ -260,15 +244,6 @@
       default_value: "Font()",
     },
     {
-      name: "color",
-      inherited: true,
-      field_template: "storage_only",
-      include_paths: ["platform/graphics/Color.h"],
-      type_name: "Color",
-      field_group: "inherited",
-      default_value: "Color::kBlack",
-    },
-    {
       name: "VisitedLinkColor",
       inherited: true,
       field_template: "external",
@@ -544,24 +519,6 @@
       default_value: "FillLayer(kMaskFillLayer, true)",
     },
     {
-      name: "Filter",
-      field_template: "storage_only",
-      type_name: "StyleFilterData",
-      field_group: "rare-non-inherited",
-      default_value: "DataPersistent<StyleFilterData>()",
-      wrapper_pointer_name: "DataPersistent",
-      include_paths: ["core/style/StyleFilterData.h"],
-    },
-    {
-      name: "BackdropFilter",
-      field_template: "storage_only",
-      type_name: "StyleFilterData",
-      field_group: "rare-non-inherited",
-      default_value: "DataPersistent<StyleFilterData>()",
-      wrapper_pointer_name: "DataPersistent",
-      include_paths: ["core/style/StyleFilterData.h"],
-    },
-    {
       name: "CounterDirectives",
       field_template: "storage_only",
       type_name: "CounterDirectiveMap",
@@ -866,14 +823,6 @@
       default_value: "true",
     },
     {
-      name: "TransformOperations",
-      field_template: "storage_only",
-      type_name: "TransformOperations",
-      field_group: "rare-non-inherited->transform",
-      default_value: "EmptyTransformOperations()",
-      include_paths: ["platform/transforms/TransformOperations.h"]
-    },
-    {
       name: "NamedGridColumnLines",
       field_template: "external",
       type_name: "NamedGridLinesMap",
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
index 0997f56..cb38396 100644
--- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
+++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
@@ -28,7 +28,7 @@
 
 bool IsEffectiveConnectionTypeSlowFor(Document* document) {
   WebEffectiveConnectionType type =
-      document->GetFrame()->Loader().Client()->GetEffectiveConnectionType();
+      document->GetFrame()->Client()->GetEffectiveConnectionType();
 
   WebEffectiveConnectionType threshold_type =
       WebEffectiveConnectionType::kTypeUnknown;
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index 07710b2..0f34dd00 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -781,7 +781,8 @@
 
 static CSSCustomIdentValue* ConsumeCustomIdentForGridLine(
     CSSParserTokenRange& range) {
-  if (range.Peek().Id() == CSSValueAuto || range.Peek().Id() == CSSValueSpan)
+  if (range.Peek().Id() == CSSValueAuto || range.Peek().Id() == CSSValueSpan ||
+      range.Peek().Id() == CSSValueDefault)
     return nullptr;
   return ConsumeCustomIdent(range);
 }
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
index d42656d..24e8241 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParserHelpers.cpp
@@ -1446,11 +1446,11 @@
   return nullptr;
 }
 
+// https://drafts.csswg.org/css-values-4/#css-wide-keywords
 bool IsCSSWideKeyword(StringView keyword) {
   return EqualIgnoringASCIICase(keyword, "initial") ||
          EqualIgnoringASCIICase(keyword, "inherit") ||
-         EqualIgnoringASCIICase(keyword, "unset") ||
-         EqualIgnoringASCIICase(keyword, "default");
+         EqualIgnoringASCIICase(keyword, "unset");
 }
 
 // https://drafts.csswg.org/css-shapes-1/#typedef-shape-box
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyFontUtils.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyFontUtils.cpp
index 0b223e2..e9b9c59 100644
--- a/third_party/WebKit/Source/core/css/properties/CSSPropertyFontUtils.cpp
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyFontUtils.cpp
@@ -88,8 +88,10 @@
     builder.Append(range.ConsumeIncludingWhitespace().Value());
   }
   if (!added_space &&
-      CSSPropertyParserHelpers::IsCSSWideKeyword(first_token.Value()))
+      (CSSPropertyParserHelpers::IsCSSWideKeyword(first_token.Value()) ||
+       EqualIgnoringASCIICase(first_token.Value(), "default"))) {
     return String();
+  }
   return builder.ToString();
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index e2acdf3d..49fc092 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -1545,7 +1545,7 @@
 
   if (!frame_ || old_title == title_)
     return;
-  frame_->Loader().Client()->DispatchDidReceiveTitle(title_);
+  frame_->Client()->DispatchDidReceiveTitle(title_);
 }
 
 void Document::setTitle(const String& title) {
@@ -2591,11 +2591,8 @@
     GetPage()->DocumentDetached(this);
   probe::documentDetached(this);
 
-  if (frame_->Loader().Client()->GetSharedWorkerRepositoryClient())
-    frame_->Loader()
-        .Client()
-        ->GetSharedWorkerRepositoryClient()
-        ->DocumentDetached(this);
+  if (frame_->Client()->GetSharedWorkerRepositoryClient())
+    frame_->Client()->GetSharedWorkerRepositoryClient()->DocumentDetached(this);
 
   // FIXME: consider using SuspendableObject.
   if (scripted_animation_controller_)
@@ -2849,9 +2846,9 @@
       frame_->Loader().StopAllLoaders();
       // PlzNavigate: navigations handled by the client should also be
       // cancelled.
-      if (frame_->Loader().Client() &&
+      if (frame_->Client() &&
           frame_->GetSettings()->GetBrowserSideNavigationEnabled()) {
-        frame_->Loader().Client()->AbortClientNavigation();
+        frame_->Client()->AbortClientNavigation();
       }
     }
   }
@@ -2976,7 +2973,7 @@
 
 void Document::WillInsertBody() {
   if (GetFrame())
-    GetFrame()->Loader().Client()->DispatchWillInsertBody();
+    GetFrame()->Client()->DispatchWillInsertBody();
   // If we get to the <body> try to resume commits since we should have content
   // to paint now.
   // TODO(esprehn): Is this really optimal? We might start producing frames
@@ -3078,7 +3075,7 @@
     this->domWindow()->DocumentWasClosed();
 
   if (GetFrame()) {
-    GetFrame()->Loader().Client()->DispatchDidHandleOnloadEvents();
+    GetFrame()->Client()->DispatchDidHandleOnloadEvents();
     Loader()->GetApplicationCacheHost()->StopDeferringEvents();
   }
 
@@ -5991,7 +5988,7 @@
     GetSecurityOrigin()->SetUniqueOriginIsPotentiallyTrustworthy(
         stand_in_origin->IsPotentiallyTrustworthy());
     if (GetFrame())
-      GetFrame()->Loader().Client()->DidUpdateToUniqueOrigin();
+      GetFrame()->Client()->DidUpdateToUniqueOrigin();
   }
 }
 
@@ -6741,7 +6738,7 @@
   // blockage.
   SetInsecureRequestPolicy(GetInsecureRequestPolicy() | policy);
   if (GetFrame())
-    GetFrame()->Loader().Client()->DidEnforceInsecureRequestPolicy(
+    GetFrame()->Client()->DidEnforceInsecureRequestPolicy(
         GetInsecureRequestPolicy());
 }
 
diff --git a/third_party/WebKit/Source/core/exported/WebHelperPluginImpl.cpp b/third_party/WebKit/Source/core/exported/WebHelperPluginImpl.cpp
index 5b669f1..f5410f8 100644
--- a/third_party/WebKit/Source/core/exported/WebHelperPluginImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebHelperPluginImpl.cpp
@@ -34,7 +34,6 @@
 #include "core/frame/LocalFrameClient.h"
 #include "core/frame/WebLocalFrameBase.h"
 #include "core/html/HTMLObjectElement.h"
-#include "core/loader/FrameLoader.h"
 #include "public/web/WebPlugin.h"
 
 namespace blink {
@@ -56,7 +55,7 @@
 bool WebHelperPluginImpl::Initialize(const String& plugin_type,
                                      WebLocalFrameBase* frame) {
   DCHECK(!object_element_ && !plugin_container_);
-  if (!frame->GetFrame()->Loader().Client())
+  if (!frame->GetFrame()->Client())
     return false;
 
   object_element_ =
@@ -64,8 +63,8 @@
   Vector<String> attribute_names;
   Vector<String> attribute_values;
   DCHECK(frame->GetFrame()->GetDocument()->Url().IsValid());
-  plugin_container_ = ToWebPluginContainerBase(
-      frame->GetFrame()->Loader().Client()->CreatePlugin(
+  plugin_container_ =
+      ToWebPluginContainerBase(frame->GetFrame()->Client()->CreatePlugin(
           *object_element_, frame->GetFrame()->GetDocument()->Url(),
           attribute_names, attribute_values, plugin_type, false,
           LocalFrameClient::kAllowDetachedPlugin));
diff --git a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
index af4632e..3c3ab9f1 100644
--- a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
@@ -366,9 +366,8 @@
     request.SetRequestContext(WebURLRequest::kRequestContextDownload);
     request.SetRequestorOrigin(SecurityOrigin::Create(GetDocument().Url()));
 
-    frame->Loader().Client()->LoadURLExternally(
-        request, kNavigationPolicyDownload, FastGetAttribute(downloadAttr),
-        false);
+    frame->Client()->LoadURLExternally(request, kNavigationPolicyDownload,
+                                       FastGetAttribute(downloadAttr), false);
   } else {
     request.SetRequestContext(WebURLRequest::kRequestContextHyperlink);
     FrameLoadRequest frame_request(&GetDocument(), request,
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
index 7c9a37f..eb2b86b 100644
--- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
@@ -316,8 +316,7 @@
   // The LocalFrameClient might block creation of a new WebGL context despite
   // the page settings; in particular, if WebGL contexts were lost one or more
   // times via the GL_ARB_robustness extension.
-  if (!frame->Loader().Client()->AllowWebGL(settings &&
-                                            settings->GetWebGLEnabled()))
+  if (!frame->Client()->AllowWebGL(settings && settings->GetWebGLEnabled()))
     return false;
   return true;
 }
diff --git a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
index f198a7e..6b9eefe 100644
--- a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
@@ -54,7 +54,6 @@
 #include "core/inspector/ConsoleMessage.h"
 #include "core/layout/LayoutObject.h"
 #include "core/loader/FormSubmission.h"
-#include "core/loader/FrameLoader.h"
 #include "core/loader/MixedContentChecker.h"
 #include "core/loader/NavigationScheduler.h"
 #include "platform/wtf/AutoReset.h"
@@ -339,7 +338,7 @@
   bool should_submit;
   {
     AutoReset<bool> submit_event_handler_scope(&in_user_js_submit_event_, true);
-    frame->Loader().Client()->DispatchWillSendSubmitEvent(this);
+    frame->Client()->DispatchWillSendSubmitEvent(this);
     should_submit =
         DispatchEvent(Event::CreateCancelableBubble(EventTypeNames::submit)) ==
         DispatchEventResult::kNotCanceled;
diff --git a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp
index b638cda..f307a71 100644
--- a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp
@@ -594,9 +594,9 @@
     LocalFrameClient::DetachedPluginPolicy policy =
         require_layout_object ? LocalFrameClient::kFailOnDetachedPlugin
                               : LocalFrameClient::kAllowDetachedPlugin;
-    PluginView* plugin = frame->Loader().Client()->CreatePlugin(
-        *this, url, param_names, param_values, mime_type, load_manually,
-        policy);
+    PluginView* plugin =
+        frame->Client()->CreatePlugin(*this, url, param_names, param_values,
+                                      mime_type, load_manually, policy);
     if (!plugin) {
       if (!layout_item.IsNull() &&
           !layout_item.ShowsUnavailablePluginIndicator()) {
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h
index 5e37481..c553c43 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -694,11 +694,9 @@
   static EmptyTransformOperations InitialTransform() {
     return EmptyTransformOperations();
   }
-  const TransformOperations& Transform() const {
-    return TransformOperationsInternal();
-  }
+  const TransformOperations& Transform() const { return TransformInternal(); }
   void SetTransform(const TransformOperations& ops) {
-    SetTransformOperationsInternal(ops);
+    SetTransformInternal(ops);
   }
 
   // -webkit-transform-origin-x
@@ -2080,7 +2078,7 @@
 
   // Filter/transform utility functions.
   bool Has3DTransform() const {
-    return TransformOperationsInternal().Has3DOperation() ||
+    return TransformInternal().Has3DOperation() ||
            (Translate() && Translate()->Z() != 0) ||
            (Rotate() && (Rotate()->X() != 0 || Rotate()->Y() != 0)) ||
            (Scale() && Scale()->Z() != 1);
@@ -2090,7 +2088,7 @@
            HasCurrentTransformAnimation() || Translate() || Rotate() || Scale();
   }
   bool HasTransformOperations() const {
-    return !TransformOperationsInternal().Operations().IsEmpty();
+    return !TransformInternal().Operations().IsEmpty();
   }
   ETransformStyle3D UsedTransformStyle3D() const {
     return HasGroupingProperty() ? ETransformStyle3D::kFlat
diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn
index 9383f6e..33d895f1 100644
--- a/third_party/WebKit/Source/modules/BUILD.gn
+++ b/third_party/WebKit/Source/modules/BUILD.gn
@@ -302,6 +302,7 @@
     "remoteplayback/RemotePlaybackTest.cpp",
     "serviceworkers/ServiceWorkerContainerTest.cpp",
     "serviceworkers/WebEmbeddedWorkerImplTest.cpp",
+    "wake_lock/ScreenWakeLockTest.cpp",
     "webaudio/AudioBasicProcessorHandlerTest.cpp",
     "webaudio/AudioContextTest.cpp",
     "webaudio/AudioWorkletGlobalScopeTest.cpp",
diff --git a/third_party/WebKit/Source/modules/wake_lock/DEPS b/third_party/WebKit/Source/modules/wake_lock/DEPS
index a9aaab1..7a913447 100644
--- a/third_party/WebKit/Source/modules/wake_lock/DEPS
+++ b/third_party/WebKit/Source/modules/wake_lock/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
   "+device/wake_lock/public/interfaces",
+  "+mojo/public/cpp/bindings"
 ]
diff --git a/third_party/WebKit/Source/web/tests/ScreenWakeLockTest.cpp b/third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/tests/ScreenWakeLockTest.cpp
rename to third_party/WebKit/Source/modules/wake_lock/ScreenWakeLockTest.cpp
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index f96ef511..79fb154c 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -2519,9 +2519,10 @@
                       "invalid target");
     return;
   }
-  if (buffer && !buffer->Validate(ContextGroup(), this)) {
+  if (buffer && (!buffer->HasEverBeenBound() ||
+                 !buffer->Validate(ContextGroup(), this))) {
     SynthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer",
-                      "no buffer or buffer not from this context");
+                      "buffer never bound or buffer not from this context");
     return;
   }
   // Don't allow the default framebuffer to be mutated; all current
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index aab0c50..c806f30 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -2249,6 +2249,12 @@
     "graphics/test/FakeWebGraphicsContext3DProvider.h",
     "graphics/test/MockImageDecoder.h",
 
+    # Tests migrated from the web/tests directory.
+    "TimerPerfTest.cpp",
+    "exported/WebImageTest.cpp",
+    "exported/WebURLRequestTest.cpp",
+    "exported/WebURLResponseTest.cpp",
+
     # TODO(toyoshim): Remove Platform dependency and move to loader/BUILD.gn
     "loader/fetch/ResourceResponseTest.cpp",
 
diff --git a/third_party/WebKit/Source/web/tests/TimerPerfTest.cpp b/third_party/WebKit/Source/platform/TimerPerfTest.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/tests/TimerPerfTest.cpp
rename to third_party/WebKit/Source/platform/TimerPerfTest.cpp
diff --git a/third_party/WebKit/Source/web/tests/WebImageTest.cpp b/third_party/WebKit/Source/platform/exported/WebImageTest.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/tests/WebImageTest.cpp
rename to third_party/WebKit/Source/platform/exported/WebImageTest.cpp
diff --git a/third_party/WebKit/Source/web/tests/WebURLRequestTest.cpp b/third_party/WebKit/Source/platform/exported/WebURLRequestTest.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/tests/WebURLRequestTest.cpp
rename to third_party/WebKit/Source/platform/exported/WebURLRequestTest.cpp
diff --git a/third_party/WebKit/Source/web/tests/WebURLResponseTest.cpp b/third_party/WebKit/Source/platform/exported/WebURLResponseTest.cpp
similarity index 100%
rename from third_party/WebKit/Source/web/tests/WebURLResponseTest.cpp
rename to third_party/WebKit/Source/platform/exported/WebURLResponseTest.cpp
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn
index 909e5b0..4b88700a 100644
--- a/third_party/WebKit/Source/web/BUILD.gn
+++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -95,19 +95,14 @@
     "tests/PrerenderingTest.cpp",
     "tests/ProgrammaticScrollTest.cpp",
     "tests/RunAllTests.cpp",
-    "tests/ScreenWakeLockTest.cpp",
     "tests/ScrollMetricsTest.cpp",
     "tests/SmoothScrollTest.cpp",
     "tests/SpinLockTest.cpp",
-    "tests/TimerPerfTest.cpp",
     "tests/VirtualTimeTest.cpp",
     "tests/WebDocumentSubresourceFilterTest.cpp",
     "tests/WebFrameSerializerSanitizationTest.cpp",
     "tests/WebFrameTest.cpp",
-    "tests/WebImageTest.cpp",
     "tests/WebMeaningfulLayoutsTest.cpp",
-    "tests/WebURLRequestTest.cpp",
-    "tests/WebURLResponseTest.cpp",
     "tests/scheduler/ActiveConnectionThrottlingTest.cpp",
     "tests/scheduler/FrameThrottlingTest.cpp",
     "tests/scheduler/ThrottlingTest.cpp",
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
index 647b8651..856f66c 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1763,7 +1763,7 @@
 }
 
 WebLocalFrameImpl* WebLocalFrameImpl::FromFrame(LocalFrame& frame) {
-  LocalFrameClient* client = frame.Loader().Client();
+  LocalFrameClient* client = frame.Client();
   if (!client || !client->IsLocalFrameClientImpl())
     return nullptr;
   return ToWebLocalFrameImpl(ToLocalFrameClientImpl(client)->GetWebFrame());
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 8ed06d98..f47f58a 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -22022,7 +22022,7 @@
 from previous Chrome versions.
 -->
 
-  <summary>Chrome flags that lead to chrome restart on ChromeOS.</summary>
+  <summary>Chrome flags that lead to Chrome restart on Chrome OS.</summary>
   <int value="-2146613579" label="V8Future:disabled"/>
   <int value="-2143961262" label="D3DVsync:disabled"/>
   <int value="-2143328006"
@@ -22071,6 +22071,7 @@
   <int value="-2035126988" label="enabled-new-style-notification"/>
   <int value="-2033225430" label="NTPMostLikelyFaviconsFromServer:disabled"/>
   <int value="-2029912304" label="StaleWhileRevalidate2:enabled"/>
+  <int value="-2028232016" label="spurious-power-button-lid-angle-change"/>
   <int value="-2025367104" label="enable-material-design-ntp"/>
   <int value="-2020721975" label="smart-virtual-keyboard"/>
   <int value="-2020024440" label="scroll-end-effect"/>
@@ -22134,6 +22135,7 @@
   <int value="-1872867546" label="EnumerateAudioDevices:disabled"/>
   <int value="-1870961970" label="enable-filemanager-mtp"/>
   <int value="-1869845022" label="force-show-update-menu-item"/>
+  <int value="-1868978829" label="spurious-power-button-accel-count"/>
   <int value="-1867382602" label="WebRTC-H264WithOpenH264FFmpeg:enabled"/>
   <int value="-1867342522" label="MaterialDesignHistory:enabled"/>
   <int value="-1861814223" label="MidiManagerDynamicInstantiation:enabled"/>
@@ -22990,6 +22992,7 @@
   <int value="1211284676" label="V8NoTurbo:enabled"/>
   <int value="1214455758" label="VideoRotateToFullscreen:disabled"/>
   <int value="1215531732" label="OmniboxUIExperiments:disabled"/>
+  <int value="1217907443" label="spurious-power-button-keyboard-accel"/>
   <int value="1219628795" label="PrintScaling:disabled"/>
   <int value="1219826373" label="ServiceWorkerNavigationPreload:enabled"/>
   <int value="1220171692" label="SpeculativeLaunchServiceWorker:enabled"/>
@@ -23005,6 +23008,7 @@
   <int value="1250071868" label="disable-timezone-tracking-option"/>
   <int value="1253698118" label="ash-disable-stable-overview-order"/>
   <int value="1257980502" label="disable-accelerated-video-decode"/>
+  <int value="1260186484" label="spurious-power-button-screen-accel"/>
   <int value="1268470658" label="disable-android-password-link"/>
   <int value="1269940659" label="EnumerateAudioDevices:enabled"/>
   <int value="1269952439" label="AndroidAIAFetching:disabled"/>
@@ -23118,6 +23122,7 @@
   <int value="1658644418" label="disable-app-list-voice-search"/>
   <int value="1661925474" label="silent-debugger-extension-api"/>
   <int value="1664401033" label="ColorCorrectRendering:enabled"/>
+  <int value="1665349789" label="spurious-power-button-window"/>
   <int value="1668611601" label="enable-encrypted-media"/>
   <int value="1673427566" label="ChromeHomeExpandButton:disabled"/>
   <int value="1689123607" label="enable-app-link"/>
diff --git a/ui/views/animation/test/test_ink_drop_delegate.cc b/ui/views/animation/test/test_ink_drop_delegate.cc
deleted file mode 100644
index 1618d5f..0000000
--- a/ui/views/animation/test/test_ink_drop_delegate.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/animation/test/test_ink_drop_delegate.h"
-
-namespace views {
-namespace test {
-
-TestInkDropDelegate::TestInkDropDelegate() {}
-
-TestInkDropDelegate::~TestInkDropDelegate() {}
-
-void TestInkDropDelegate::OnAction(InkDropState state) {
-  ink_drop_.AnimateToState(state);
-}
-
-void TestInkDropDelegate::SnapToActivated() {
-  ink_drop_.SnapToActivated();
-}
-
-void TestInkDropDelegate::SetHovered(bool is_hovered) {
-  ink_drop_.SetHovered(is_hovered);
-}
-
-InkDropState TestInkDropDelegate::GetTargetInkDropState() const {
-  return ink_drop_.GetTargetInkDropState();
-}
-
-InkDrop* TestInkDropDelegate::GetInkDrop() {
-  return &ink_drop_;
-}
-
-}  // namespace test
-}  // namespace views
diff --git a/ui/views/animation/test/test_ink_drop_delegate.h b/ui/views/animation/test/test_ink_drop_delegate.h
deleted file mode 100644
index ce841560..0000000
--- a/ui/views/animation/test/test_ink_drop_delegate.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_DELEGATE_H_
-#define UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_DELEGATE_H_
-
-#include "base/macros.h"
-#include "ui/views/animation/ink_drop_delegate.h"
-#include "ui/views/animation/test/test_ink_drop.h"
-
-namespace views {
-namespace test {
-
-class TestInkDropDelegate : public InkDropDelegate {
- public:
-  TestInkDropDelegate();
-  ~TestInkDropDelegate() override;
-
-  bool is_hovered() const { return ink_drop_.is_hovered(); }
-
-  // InkDropDelegate:
-  void OnAction(InkDropState state) override;
-  void SnapToActivated() override;
-  void SetHovered(bool is_hovered) override;
-  InkDropState GetTargetInkDropState() const override;
-  InkDrop* GetInkDrop() override;
-
- private:
-  TestInkDrop ink_drop_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestInkDropDelegate);
-};
-
-}  // namespace test
-}  // namespace views
-
-#endif  // UI_VIEWS_ANIMATION_TEST_TEST_INK_DROP_DELEGATE_H_